diff --git a/.gitignore b/.gitignore index ed339d5..42991778 100644 --- a/.gitignore +++ b/.gitignore
@@ -205,6 +205,7 @@ /ios/third_party/ochamcrest/src /ios_internal /libassistant +/libinteraction /llvm /media/cast/logging/cast_logging_proto_lib.xml /media/cdm/api
diff --git a/AUTHORS b/AUTHORS index ced7ddd1..bf23440 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -269,6 +269,7 @@ Ganesh Borle <ganesh.borle@samsung.com> Gao Chun <chun.gao@intel.com> Gao Chun <gaochun.dev@gmail.com> +Gautham Banasandra <gautham.bangalore@gmail.com> George Adams <geoada@amazon.com> George Joseph <kottackal.george@gmail.com> George Liaskos <geo.liaskos@gmail.com>
diff --git a/DEPS b/DEPS index 157cc1c..ff0194a 100644 --- a/DEPS +++ b/DEPS
@@ -105,11 +105,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': 'f2030783094e502fb74221077a5ee7cb41287fe4', + 'skia_revision': '96aa535b782f31df0f063213c2958acba32a808d', # 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': '7edcaa70ff71125593e90bce1be8efe462c09a39', + 'v8_revision': 'c9229d20d0c0a245c0a429cc8207b75a0aca49cb', # 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. @@ -117,7 +117,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': '2dabb4a367c3967f0499e8711251077f44a8d186', + 'angle_revision': '7df52383cfdf1a0f69c30fc237d0dbebc2bac353', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. @@ -129,7 +129,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'ee3e3a4f3cbaa99ae3609f575ff9b2c329c5df2a', + 'pdfium_revision': 'c765d2ac867611935cff6b5c5a2ff8575fe85162', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -157,7 +157,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': '8f1ed54877ffab4fc2cf2be329446c748a885842', + 'freetype_revision': '7915fd51f123d0adbe6a0b9ad19eb941e1733c87', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. @@ -165,7 +165,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': 'c5ef6d834a158822a50c67dc117835b28b32be73', + 'catapult_revision': 'f704817cbbab2484d0510a0b622fc93b68980cc5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/WATCHLISTS b/WATCHLISTS index 7ba22c8..19bf9f5 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -1733,7 +1733,7 @@ 'piman+watch@chromium.org'], 'autofill': ['anthonyvd+autofillwatch@chromium.org', 'dlkumar+autofillwatch@google.com', - 'ftirelo+autofillwatch@chromium.org' + 'ftirelo+autofillwatch@chromium.org', 'mathp+autofillwatch@chromium.org', 'rogerm+autofillwatch@chromium.org', 'rouslan+autofill@chromium.org',
diff --git a/android_webview/browser/aw_field_trial_creator.cc b/android_webview/browser/aw_field_trial_creator.cc index 263e2cf..2f8cae9 100644 --- a/android_webview/browser/aw_field_trial_creator.cc +++ b/android_webview/browser/aw_field_trial_creator.cc
@@ -28,6 +28,7 @@ #include "components/variations/seed_response.h" #include "components/variations/service/safe_seed_manager.h" #include "components/variations/service/variations_service.h" +#include "components/variations/variations_switches.h" namespace android_webview { namespace { @@ -63,6 +64,14 @@ AwFieldTrialCreator::~AwFieldTrialCreator() {} void AwFieldTrialCreator::SetUpFieldTrials() { + // Workaround for https://crbug.com/853832: In testing, Chrome's experiments + // are applied to WebView. Some of these break WebView. So disable the testing + // config. TODO(paulmiller): Remove after 853832 is fixed. + auto* cmd = base::CommandLine::ForCurrentProcess(); + if (!cmd->HasSwitch(variations::switches::kDisableFieldTrialTestingConfig)) { + cmd->AppendSwitch(variations::switches::kDisableFieldTrialTestingConfig); + } + DoSetUpFieldTrials(); // If DoSetUpFieldTrials failed, it might have skipped creating
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java index dee5e1aec15..ac4bc946 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
@@ -1013,4 +1013,19 @@ Assert.assertEquals(callCount + 1, mShouldInterceptRequestHelper.getCallCount()); Assert.assertEquals(url, mShouldInterceptRequestHelper.getUrls().get(0)); } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testNotCalledForHttpRedirect() throws Throwable { + final String aboutPageUrl = addAboutPageToTestServer(mWebServer); + final String redirectUrl = mWebServer.setRedirect("/302.html", aboutPageUrl); + + int callCount = mShouldInterceptRequestHelper.getCallCount(); + mActivityTestRule.loadUrlSync( + mAwContents, mContentsClient.getOnPageFinishedHelper(), redirectUrl); + // This should only be called once, for the original URL, not the final URL. + Assert.assertEquals(callCount + 1, mShouldInterceptRequestHelper.getCallCount()); + Assert.assertEquals(redirectUrl, mShouldInterceptRequestHelper.getUrls().get(0)); + } }
diff --git a/android_webview/support_library/boundary_interfaces/AndroidManifest.xml b/android_webview/support_library/boundary_interfaces/AndroidManifest.xml new file mode 100644 index 0000000..abe20e7b --- /dev/null +++ b/android_webview/support_library/boundary_interfaces/AndroidManifest.xml
@@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example"> + <!-- This AndroidManifest file only exists to verify boundary interfaces + compile and lint correctly against API 14 (the minSdkVersion of the + support library code). As the minSdkVersion of the support library + increases, so should this value. See http://crbug.com/828184 for more + details. --> + <uses-sdk android:minSdkVersion="14" /> +</manifest>
diff --git a/android_webview/support_library/boundary_interfaces/BUILD.gn b/android_webview/support_library/boundary_interfaces/BUILD.gn index b5b70deb2..c191021 100644 --- a/android_webview/support_library/boundary_interfaces/BUILD.gn +++ b/android_webview/support_library/boundary_interfaces/BUILD.gn
@@ -33,4 +33,8 @@ # We can't use ANY deps here, the support library should be able to build # these interfaces without any other chromium dependencies. deps = [] + + # This is to verify the boundary interfaces compile and lint correctly against + # the minSdkVersion of the webkit support library module. + android_manifest_for_lint = "AndroidManifest.xml" }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 6ea9315..e41fdeaa 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1436,8 +1436,8 @@ component("ash_with_content") { sources = [ "content/ash_with_content_export.h", - "content/content_gpu_support.cc", - "content/content_gpu_support.h", + "content/content_gpu_interface_provider.cc", + "content/content_gpu_interface_provider.h", "content/keyboard_overlay/keyboard_overlay_delegate.cc", "content/keyboard_overlay/keyboard_overlay_delegate.h", "content/keyboard_overlay/keyboard_overlay_view.cc", @@ -1461,6 +1461,8 @@ "//content/public/browser", "//gpu/config", "//ipc", + "//mojo/public/cpp/bindings", + "//services/ui/public/interfaces", "//skia", "//ui/aura", "//ui/base",
diff --git a/ash/content/DEPS b/ash/content/DEPS index 3eea109..ee6cf24 100644 --- a/ash/content/DEPS +++ b/ash/content/DEPS
@@ -1,5 +1,6 @@ specific_include_rules = { - "content_gpu_support.*": [ + "content_gpu_interface_provider.*": [ + "+components/discardable_memory/public/interfaces", "+content/public/browser", ], "screen_orientation_delegate_chromeos.cc": [
diff --git a/ash/content/content_gpu_interface_provider.cc b/ash/content/content_gpu_interface_provider.cc new file mode 100644 index 0000000..9289274 --- /dev/null +++ b/ash/content/content_gpu_interface_provider.cc
@@ -0,0 +1,82 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/content/content_gpu_interface_provider.h" + +#include "base/containers/unique_ptr_adapters.h" +#include "base/memory/ref_counted.h" +#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/gpu_client.h" +#include "content/public/browser/gpu_service_registry.h" +#include "services/ui/public/interfaces/gpu.mojom.h" + +namespace ash { + +// InterfaceBinderImpl handles the actual binding. The binding (and destruction +// of this object) has to happen on the io-thread. +class ContentGpuInterfaceProvider::InterfaceBinderImpl + : public base::RefCountedThreadSafe< + InterfaceBinderImpl, + content::BrowserThread::DeleteOnIOThread> { + public: + InterfaceBinderImpl() = default; + + void BindGpuRequestOnGpuTaskRunner(ui::mojom::GpuRequest request) { + auto gpu_client = content::GpuClient::Create( + std::move(request), + base::BindOnce(&InterfaceBinderImpl::OnGpuClientConnectionError, this)); + gpu_clients_.push_back(std::move(gpu_client)); + } + + void BindDiscardableSharedMemoryManagerOnGpuTaskRunner( + discardable_memory::mojom::DiscardableSharedMemoryManagerRequest + request) { + content::BindInterfaceInGpuProcess(std::move(request)); + } + + private: + friend struct content::BrowserThread::DeleteOnThread< + content::BrowserThread::IO>; + friend class base::DeleteHelper<InterfaceBinderImpl>; + + ~InterfaceBinderImpl() = default; + + void OnGpuClientConnectionError(content::GpuClient* client) { + base::EraseIf( + gpu_clients_, + base::UniquePtrMatcher<content::GpuClient, + content::BrowserThread::DeleteOnIOThread>( + client)); + } + + std::vector<std::unique_ptr<content::GpuClient, + content::BrowserThread::DeleteOnIOThread>> + gpu_clients_; + + DISALLOW_COPY_AND_ASSIGN(InterfaceBinderImpl); +}; + +ContentGpuInterfaceProvider::ContentGpuInterfaceProvider() + : interface_binder_impl_(base::MakeRefCounted<InterfaceBinderImpl>()) {} + +ContentGpuInterfaceProvider::~ContentGpuInterfaceProvider() = default; + +void ContentGpuInterfaceProvider::RegisterGpuInterfaces( + service_manager::BinderRegistry* registry) { + scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner = + content::BrowserThread::GetTaskRunnerForThread( + content::BrowserThread::IO); + registry->AddInterface( + base::BindRepeating(&InterfaceBinderImpl:: + BindDiscardableSharedMemoryManagerOnGpuTaskRunner, + interface_binder_impl_), + gpu_task_runner); + registry->AddInterface( + base::BindRepeating(&InterfaceBinderImpl::BindGpuRequestOnGpuTaskRunner, + interface_binder_impl_), + gpu_task_runner); +} + +} // namespace ash
diff --git a/ash/content/content_gpu_interface_provider.h b/ash/content/content_gpu_interface_provider.h new file mode 100644 index 0000000..9585e5a --- /dev/null +++ b/ash/content/content_gpu_interface_provider.h
@@ -0,0 +1,40 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_CONTENT_CONTENT_GPU_INTERFACE_PROVIDER_H_ +#define ASH_CONTENT_CONTENT_GPU_INTERFACE_PROVIDER_H_ + +#include <memory> +#include <vector> + +#include "ash/content/ash_with_content_export.h" +#include "base/macros.h" +#include "base/memory/scoped_refptr.h" +#include "services/ui/ws2/gpu_interface_provider.h" + +namespace ash { + +// An implementation of GpuInterfaceProvider that forwards to the Gpu +// implementation in content. +class ASH_WITH_CONTENT_EXPORT ContentGpuInterfaceProvider + : public ui::ws2::GpuInterfaceProvider { + public: + ContentGpuInterfaceProvider(); + ~ContentGpuInterfaceProvider() override; + + // ui::ws2::GpuInterfaceProvider: + void RegisterGpuInterfaces( + service_manager::BinderRegistry* registry) override; + + private: + class InterfaceBinderImpl; + + scoped_refptr<InterfaceBinderImpl> interface_binder_impl_; + + DISALLOW_COPY_AND_ASSIGN(ContentGpuInterfaceProvider); +}; + +} // namespace ash + +#endif // ASH_CONTENT_CONTENT_GPU_INTERFACE_PROVIDER_H_
diff --git a/ash/content/content_gpu_support.cc b/ash/content/content_gpu_support.cc deleted file mode 100644 index 4fe2bd4..0000000 --- a/ash/content/content_gpu_support.cc +++ /dev/null
@@ -1,44 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/content/content_gpu_support.h" - -#include "base/containers/unique_ptr_adapters.h" -#include "content/public/browser/gpu_client.h" -#include "content/public/browser/gpu_service_registry.h" - -namespace ash { - -ContentGpuSupport::ContentGpuSupport() = default; - -ContentGpuSupport::~ContentGpuSupport() = default; - -scoped_refptr<base::SingleThreadTaskRunner> -ContentGpuSupport::GetGpuTaskRunner() { - return content::BrowserThread::GetTaskRunnerForThread( - content::BrowserThread::IO); -} - -void ContentGpuSupport::BindDiscardableSharedMemoryManagerOnGpuTaskRunner( - discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request) { - content::BindInterfaceInGpuProcess(std::move(request)); -} - -void ContentGpuSupport::BindGpuRequestOnGpuTaskRunner( - ui::mojom::GpuRequest request) { - auto gpu_client = content::GpuClient::Create( - std::move(request), - base::BindOnce(&ContentGpuSupport::OnGpuClientConnectionError, - base::Unretained(this))); - gpu_clients_.push_back(std::move(gpu_client)); -} - -void ContentGpuSupport::OnGpuClientConnectionError(content::GpuClient* client) { - base::EraseIf( - gpu_clients_, - base::UniquePtrMatcher<content::GpuClient, - content::BrowserThread::DeleteOnIOThread>(client)); -} - -} // namespace ash
diff --git a/ash/content/content_gpu_support.h b/ash/content/content_gpu_support.h deleted file mode 100644 index 6f68aee..0000000 --- a/ash/content/content_gpu_support.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_CONTENT_CONTENT_GPU_SUPPORT_H_ -#define ASH_CONTENT_CONTENT_GPU_SUPPORT_H_ - -#include <memory> -#include <vector> - -#include "ash/content/ash_with_content_export.h" -#include "base/macros.h" -#include "content/public/browser/browser_thread.h" -#include "services/ui/ws2/gpu_support.h" - -namespace content { -class GpuClient; -} - -namespace ash { - -// An implementation of GpuSupport that forwards to the Gpu implementation in -// content. -class ASH_WITH_CONTENT_EXPORT ContentGpuSupport : public ui::ws2::GpuSupport { - public: - ContentGpuSupport(); - ~ContentGpuSupport() override; - - // ui::ws2::GpuSupport: - scoped_refptr<base::SingleThreadTaskRunner> GetGpuTaskRunner() override; - void BindDiscardableSharedMemoryManagerOnGpuTaskRunner( - discardable_memory::mojom::DiscardableSharedMemoryManagerRequest request) - override; - void BindGpuRequestOnGpuTaskRunner(ui::mojom::GpuRequest request) override; - - private: - void OnGpuClientConnectionError(content::GpuClient* client); - - std::vector<std::unique_ptr<content::GpuClient, - content::BrowserThread::DeleteOnIOThread>> - gpu_clients_; - - DISALLOW_COPY_AND_ASSIGN(ContentGpuSupport); -}; - -} // namespace ash - -#endif // ASH_CONTENT_CONTENT_GPU_SUPPORT_H_
diff --git a/ash/frame/default_frame_header.cc b/ash/frame/default_frame_header.cc index e93bc22..ce37b32 100644 --- a/ash/frame/default_frame_header.cc +++ b/ash/frame/default_frame_header.cc
@@ -27,8 +27,10 @@ namespace { // Color for the window title text. -const SkColor kTitleTextColor = SkColorSetRGB(40, 40, 40); -const SkColor kLightTitleTextColor = SK_ColorWHITE; +constexpr SkColor kTitleTextColor = SkColorSetRGB(40, 40, 40); +constexpr SkColor kLightTitleTextColor = SK_ColorWHITE; +// This is 2x of the slide ainmation duration. +constexpr int kColorUpdateDurationMs = 240; // Tiles an image into an area, rounding the top corners. void TileRoundRect(gfx::Canvas* canvas, @@ -54,6 +56,35 @@ namespace ash { +DefaultFrameHeader::ColorAnimator::ColorAnimator( + gfx::AnimationDelegate* delegate) + : animation_(delegate) { + animation_.SetSlideDuration(kColorUpdateDurationMs); + animation_.SetTweenType(gfx::Tween::EASE_IN); + animation_.Reset(1); +} + +DefaultFrameHeader::ColorAnimator::ColorAnimator::~ColorAnimator() = default; + +void DefaultFrameHeader::ColorAnimator::SetTargetColor(SkColor target) { + target_color_ = target; + start_color_ = current_color_; + if (current_color_ == kDefaultFrameColor) { + // Changing from default should be set immediately. + current_color_ = target_color_; + animation_.Reset(1); + } else { + animation_.Reset(0); + } + animation_.Show(); +} + +SkColor DefaultFrameHeader::ColorAnimator::GetCurrentColor() { + current_color_ = color_utils::AlphaBlend( + target_color_, start_color_, animation_.CurrentValueBetween(0, 255)); + return current_color_; +} + /////////////////////////////////////////////////////////////////////////////// // DefaultFrameHeader, public: @@ -62,8 +93,8 @@ views::View* header_view, FrameCaptionButtonContainerView* caption_button_container) : FrameHeader(target_widget, header_view), - active_frame_color_(kDefaultFrameColor), - inactive_frame_color_(kDefaultFrameColor) { + active_frame_color_(this), + inactive_frame_color_(this) { DCHECK(caption_button_container); SetCaptionButtonContainer(caption_button_container); } @@ -93,8 +124,9 @@ cc::PaintFlags flags; int active_alpha = activation_animation().CurrentValueBetween(0, 255); - flags.setColor(color_utils::AlphaBlend(active_frame_color_, - inactive_frame_color_, active_alpha)); + flags.setColor(color_utils::AlphaBlend( + active_frame_color_.GetCurrentColor(), + inactive_frame_color_.GetCurrentColor(), active_alpha)); flags.setAntiAlias(true); if (width_in_pixels_ > 0) { canvas->Save(); @@ -131,12 +163,12 @@ void DefaultFrameHeader::SetFrameColorsImpl(SkColor active_frame_color, SkColor inactive_frame_color) { bool updated = false; - if (active_frame_color_ != active_frame_color) { - active_frame_color_ = active_frame_color; + if (active_frame_color_.target_color() != active_frame_color) { + active_frame_color_.SetTargetColor(active_frame_color); updated = true; } - if (inactive_frame_color_ != inactive_frame_color) { - inactive_frame_color_ = inactive_frame_color; + if (inactive_frame_color_.target_color() != inactive_frame_color) { + inactive_frame_color_.SetTargetColor(inactive_frame_color); updated = true; } @@ -147,7 +179,17 @@ } SkColor DefaultFrameHeader::GetCurrentFrameColor() const { - return mode() == MODE_ACTIVE ? active_frame_color_ : inactive_frame_color_; + return mode() == MODE_ACTIVE ? active_frame_color_.target_color() + : inactive_frame_color_.target_color(); +} + +gfx::SlideAnimation* +DefaultFrameHeader::GetAnimationForActiveFrameColorForTest() { + return active_frame_color_.animation(); +} + +SkColor DefaultFrameHeader::GetActiveFrameColorForPaintForTest() { + return active_frame_color_.GetCurrentColor(); } } // namespace ash
diff --git a/ash/frame/default_frame_header.h b/ash/frame/default_frame_header.h index 255fd1e..c8e1e90 100644 --- a/ash/frame/default_frame_header.h +++ b/ash/frame/default_frame_header.h
@@ -9,6 +9,7 @@ #include "ash/ash_export.h" #include "ash/frame/frame_header.h" +#include "ash/public/cpp/ash_constants.h" #include "base/compiler_specific.h" // override #include "base/gtest_prod_util.h" #include "base/macros.h" @@ -27,8 +28,12 @@ void SetThemeColor(SkColor theme_color); - SkColor active_frame_color_for_testing() { return active_frame_color_; } - SkColor inactive_frame_color_for_testing() { return inactive_frame_color_; } + SkColor active_frame_color_for_testing() { + return active_frame_color_.target_color(); + } + SkColor inactive_frame_color_for_testing() { + return inactive_frame_color_.target_color(); + } protected: // FrameHeader: @@ -47,8 +52,34 @@ void SetFrameColorsImpl(SkColor active_frame_color, SkColor inactive_frame_color); - SkColor active_frame_color_; - SkColor inactive_frame_color_; + gfx::SlideAnimation* GetAnimationForActiveFrameColorForTest(); + SkColor GetActiveFrameColorForPaintForTest(); + + // A utility class to animate color value. + class ColorAnimator { + public: + explicit ColorAnimator(gfx::AnimationDelegate* delegate); + ~ColorAnimator(); + + void SetTargetColor(SkColor target); + SkColor target_color() const { return target_color_; }; + SkColor GetCurrentColor(); + float get_value() const { return animation_.GetCurrentValue(); } + + gfx::SlideAnimation* animation() { return &animation_; } + + private: + gfx::SlideAnimation animation_; + SkColor start_color_ = kDefaultFrameColor; + SkColor target_color_ = kDefaultFrameColor; + ; + SkColor current_color_ = kDefaultFrameColor; + + DISALLOW_COPY_AND_ASSIGN(ColorAnimator); + }; + + ColorAnimator active_frame_color_; + ColorAnimator inactive_frame_color_; int width_in_pixels_ = -1;
diff --git a/ash/frame/default_frame_header_unittest.cc b/ash/frame/default_frame_header_unittest.cc index f762fdf..1935959a2 100644 --- a/ash/frame/default_frame_header_unittest.cc +++ b/ash/frame/default_frame_header_unittest.cc
@@ -10,6 +10,8 @@ #include "ash/frame/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/test/ash_test_base.h" +#include "ui/gfx/animation/animation_test_api.h" +#include "ui/gfx/color_utils.h" #include "ui/views/test/test_views.h" #include "ui/views/widget/widget.h" #include "ui/views/window/non_client_view.h" @@ -69,7 +71,6 @@ DefaultFrameHeader frame_header(w.get(), w->non_client_view()->frame_view(), &container); - // Check frame color is sensitive to mode. SkColor active = SkColorSetRGB(70, 70, 70); SkColor inactive = SkColorSetRGB(200, 200, 200); @@ -78,6 +79,48 @@ EXPECT_EQ(active, frame_header.GetCurrentFrameColor()); frame_header.mode_ = FrameHeader::MODE_INACTIVE; EXPECT_EQ(inactive, frame_header.GetCurrentFrameColor()); + EXPECT_EQ(active, frame_header.GetActiveFrameColorForPaintForTest()); + + // Update to the new value which has no blue, which should animate. + frame_header.mode_ = FrameHeader::MODE_ACTIVE; + SkColor new_active = SkColorSetRGB(70, 70, 0); + frame_header.SetFrameColors(new_active, SK_ColorBLACK); + + gfx::SlideAnimation* animation = + frame_header.GetAnimationForActiveFrameColorForTest(); + gfx::AnimationTestApi test_api(animation); + + // animate half way through. + base::TimeTicks now = base::TimeTicks::Now(); + test_api.SetStartTime(now); + test_api.Step(now + base::TimeDelta::FromMilliseconds(120)); + + // GetCurrentFrameColor should return the target color. + EXPECT_EQ(new_active, frame_header.GetCurrentFrameColor()); + + // The color used for paint should be somewhere between 0 and 70. + SkColor new_active_for_paint = + frame_header.GetActiveFrameColorForPaintForTest(); + EXPECT_NE(new_active, new_active_for_paint); + EXPECT_EQ(53u, SkColorGetB(new_active_for_paint)); + + // Now update to the new value which is full blue. + SkColor new_new_active = SkColorSetRGB(70, 70, 255); + frame_header.SetFrameColors(new_new_active, SK_ColorBLACK); + + now = base::TimeTicks::Now(); + test_api.SetStartTime(now); + test_api.Step(now + base::TimeDelta::FromMilliseconds(20)); + + // Again, GetCurrentFrameColor should return the target color. + EXPECT_EQ(new_new_active, frame_header.GetCurrentFrameColor()); + + // The start value should be the previous paint color, so it should be + // near 53. + SkColor new_new_active_for_paint = + frame_header.GetActiveFrameColorForPaintForTest(); + EXPECT_NE(new_active_for_paint, new_new_active_for_paint); + EXPECT_EQ(54u, SkColorGetB(new_new_active_for_paint)); } } // namespace ash
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc index 07b62462..46c6679 100644 --- a/ash/login/login_screen_controller.cc +++ b/ash/login/login_screen_controller.cc
@@ -5,10 +5,13 @@ #include "ash/login/login_screen_controller.h" #include "ash/login/ui/lock_screen.h" +#include "ash/login/ui/lock_window.h" #include "ash/login/ui/login_data_dispatcher.h" #include "ash/public/cpp/ash_pref_names.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller.h" +#include "ash/shelf/shelf.h" +#include "ash/shelf/shelf_widget.h" #include "ash/shell.h" #include "ash/system/status_area_widget.h" #include "base/debug/alias.h" @@ -391,6 +394,17 @@ DataDispatcher()->SetFingerprintUnlockState(account_id, state); } +void LoginScreenController::SetKioskApps( + std::vector<mojom::KioskAppInfoPtr> kiosk_apps) { + Shelf::ForWindow(Shell::Get()->GetPrimaryRootWindow()) + ->shelf_widget() + ->SetLoginKioskApps(std::move(kiosk_apps)); +} + +void LoginScreenController::LaunchKioskApp(const std::string& app_id) { + login_screen_client_->LaunchKioskApp(app_id); +} + void LoginScreenController::DoAuthenticateUser(const AccountId& account_id, const std::string& password, bool authenticated_by_pin,
diff --git a/ash/login/login_screen_controller.h b/ash/login/login_screen_controller.h index 400a4e3..c9c39b8e 100644 --- a/ash/login/login_screen_controller.h +++ b/ash/login/login_screen_controller.h
@@ -7,6 +7,7 @@ #include "ash/ash_export.h" #include "ash/login/login_screen_controller_observer.h" +#include "ash/public/interfaces/kiosk_app_info.mojom.h" #include "ash/public/interfaces/login_screen.mojom.h" #include "base/macros.h" #include "base/observer_list.h" @@ -78,6 +79,7 @@ void RequestPublicSessionKeyboardLayouts(const AccountId& account_id, const std::string& locale); void ShowFeedback(); + void LaunchKioskApp(const std::string& app_id); // Add or remove an observer. void AddObserver(LoginScreenControllerObserver* observer); @@ -131,7 +133,7 @@ std::vector<mojom::InputMethodItemPtr> keyboard_layouts) override; void SetFingerprintUnlockState(const AccountId& account_id, mojom::FingerprintUnlockState state) override; - + void SetKioskApps(std::vector<mojom::KioskAppInfoPtr> kiosk_apps) override; // Flushes the mojo pipes - to be used in tests. void FlushForTesting();
diff --git a/ash/login/mock_login_screen_client.h b/ash/login/mock_login_screen_client.h index 85905c6c..e9632fa 100644 --- a/ash/login/mock_login_screen_client.h +++ b/ash/login/mock_login_screen_client.h
@@ -5,6 +5,7 @@ #ifndef ASH_LOGIN_MOCK_LOGIN_SCREEN_CLIENT_H_ #define ASH_LOGIN_MOCK_LOGIN_SCREEN_CLIENT_H_ +#include "ash/public/interfaces/kiosk_app_info.mojom.h" #include "ash/public/interfaces/login_screen.mojom.h" #include "components/password_manager/core/browser/hash_password_manager.h" #include "mojo/public/cpp/bindings/binding_set.h" @@ -67,6 +68,7 @@ MOCK_METHOD2(RequestPublicSessionKeyboardLayouts, void(const AccountId& account_id, const std::string& locale)); MOCK_METHOD0(ShowFeedback, void()); + MOCK_METHOD1(LaunchKioskApp, void(const std::string& app_id)); private: bool authenticate_user_callback_result_ = true;
diff --git a/ash/login/ui/login_keyboard_test_base.cc b/ash/login/ui/login_keyboard_test_base.cc index 896cbb1..a751a10 100644 --- a/ash/login/ui/login_keyboard_test_base.cc +++ b/ash/login/ui/login_keyboard_test_base.cc
@@ -5,6 +5,7 @@ #include "ash/login/ui/login_keyboard_test_base.h" #include "ash/login/login_screen_controller.h" +#include "ash/login/mock_login_screen_client.h" #include "ash/login/ui/lock_screen.h" #include "ash/login/ui/login_test_utils.h" #include "ash/root_window_controller.h"
diff --git a/ash/public/interfaces/login_screen.mojom b/ash/public/interfaces/login_screen.mojom index 9eb8905..ff72751 100644 --- a/ash/public/interfaces/login_screen.mojom +++ b/ash/public/interfaces/login_screen.mojom
@@ -6,6 +6,7 @@ import "ash/public/interfaces/user_info.mojom"; import "ash/public/interfaces/login_user_info.mojom"; +import "ash/public/interfaces/kiosk_app_info.mojom"; import "chromeos/components/proximity_auth/public/interfaces/auth_type.mojom"; import "components/account_id/interfaces/account_id.mojom"; import "mojo/public/mojom/base/string16.mojom"; @@ -125,6 +126,9 @@ // Set the fingerprint unlock state for user with |account_id|. SetFingerprintUnlockState(signin.mojom.AccountId account_id, FingerprintUnlockState state); + + // Update the kiosk app data for the login screen. + SetKioskApps(array<KioskAppInfo> kiosk_apps); }; // Allows ash lock screen to control a client (e.g. Chrome browser). Requests @@ -216,4 +220,7 @@ // Request to show a feedback report dialog in chrome. ShowFeedback(); + + // Launch the specific kiosk app. + LaunchKioskApp(string app_id); };
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc index 15be120..27f3189a 100644 --- a/ash/shelf/login_shelf_view.cc +++ b/ash/shelf/login_shelf_view.cc
@@ -31,12 +31,14 @@ #include "ash/tray_action/tray_action.h" #include "ash/wm/lock_state_controller.h" #include "base/metrics/user_metrics.h" +#include "skia/ext/image_operations.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/models/menu_model.h" #include "ui/base/models/simple_menu_model.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" +#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/accessibility/ax_aura_obj_cache.h" #include "ui/views/animation/ink_drop_impl.h" @@ -83,6 +85,9 @@ // The color of the button image and label. constexpr SkColor kButtonColor = SK_ColorWHITE; +// The size of the icons in the apps menu. +constexpr gfx::Size kAppIconSize(16, 16); + class LoginShelfButton : public views::LabelButton { public: LoginShelfButton(views::ButtonListener* listener, @@ -166,16 +171,27 @@ void SetApps(std::vector<mojom::KioskAppInfoPtr> kiosk_apps) { kiosk_apps_ = std::move(kiosk_apps); Clear(); - for (size_t i = 0; i < kiosk_apps_.size(); ++i) - AddItem(i, kiosk_apps_[i]->name); + for (size_t i = 0; i < kiosk_apps_.size(); ++i) { + gfx::ImageSkia icon = gfx::ImageSkiaOperations::CreateResizedImage( + kiosk_apps_[i]->icon, skia::ImageOperations::RESIZE_GOOD, + kAppIconSize); + AddItemWithIcon(i, kiosk_apps_[i]->name, icon); + } } bool HasApps() const { return !kiosk_apps_.empty(); } + void ResetState() { + is_launch_enabled_ = true; + SetVisible(true); + } + // views::MenuButtonListener: void OnMenuButtonClicked(MenuButton* source, const gfx::Point& point, const ui::Event* event) override { + if (!is_launch_enabled_) + return; menu_runner_.reset( new views::MenuRunner(this, views::MenuRunner::HAS_MNEMONICS)); @@ -189,7 +205,14 @@ // ui::MenuModel: void ExecuteCommand(int command_id, int event_flags) override { - // TODO(qnnguyen): implement kiosk app launch. + DCHECK(command_id >= 0 && + base::checked_cast<size_t>(command_id) < kiosk_apps_.size()); + // Once an app is clicked on, don't allow any additional clicks until + // the state is reset (when login screen reappears). + is_launch_enabled_ = false; + + Shell::Get()->login_screen_controller()->LaunchKioskApp( + kiosk_apps_[command_id]->app_id); } bool IsCommandIdChecked(int command_id) const override { return false; } @@ -215,6 +238,7 @@ std::vector<mojom::KioskAppInfoPtr> kiosk_apps_; // Passed to set_menu_marker to remove menu marker gfx::ImageSkia empty_menu_marker_; + bool is_launch_enabled_ = true; DISALLOW_COPY_AND_ASSIGN(KioskAppsButton); }; @@ -411,12 +435,15 @@ is_lock_screen_note_in_foreground); GetViewByID(kCancel)->SetVisible(session_state == SessionState::LOGIN_SECONDARY); - kiosk_apps_button_->SetVisible(kiosk_apps_button_->HasApps()); // TODO(agawronska): Implement full list of conditions for buttons visibility, // when views based shelf if enabled during OOBE. https://crbug.com/798869 bool is_login_primary = (session_state == SessionState::LOGIN_PRIMARY); GetViewByID(kBrowseAsGuest)->SetVisible(is_login_primary); GetViewByID(kAddUser)->SetVisible(is_login_primary); + if (kiosk_apps_button_->HasApps() && is_login_primary) + kiosk_apps_button_->ResetState(); + else + kiosk_apps_button_->SetVisible(false); Layout(); }
diff --git a/ash/shelf/login_shelf_view_unittest.cc b/ash/shelf/login_shelf_view_unittest.cc index 343c583e..7140e06 100644 --- a/ash/shelf/login_shelf_view_unittest.cc +++ b/ash/shelf/login_shelf_view_unittest.cc
@@ -258,17 +258,23 @@ } TEST_F(LoginShelfViewTest, ShouldUpdateUiAfterKioskAppsLoaded) { - EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown})); + NotifySessionStateChanged(SessionState::LOGIN_PRIMARY); + EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown, + LoginShelfView::kBrowseAsGuest, + LoginShelfView::kAddUser})); std::vector<mojom::KioskAppInfoPtr> kiosk_apps; kiosk_apps.push_back(mojom::KioskAppInfo::New()); kiosk_apps.push_back(mojom::KioskAppInfo::New()); login_shelf_view_->SetKioskApps(std::move(kiosk_apps)); - EXPECT_TRUE( - ShowsShelfButtons({LoginShelfView::kShutdown, LoginShelfView::kApps})); + EXPECT_TRUE(ShowsShelfButtons( + {LoginShelfView::kShutdown, LoginShelfView::kBrowseAsGuest, + LoginShelfView::kAddUser, LoginShelfView::kApps})); login_shelf_view_->SetKioskApps(std::vector<mojom::KioskAppInfoPtr>()); - EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown})); + EXPECT_TRUE(ShowsShelfButtons({LoginShelfView::kShutdown, + LoginShelfView::kBrowseAsGuest, + LoginShelfView::kAddUser})); } TEST_F(LoginShelfViewTest, ClickShutdownButton) {
diff --git a/ash/shell.cc b/ash/shell.cc index 8a14570..6af87e28 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -177,7 +177,7 @@ #include "services/preferences/public/mojom/preferences.mojom.h" #include "services/service_manager/public/cpp/connector.h" #include "services/ui/public/interfaces/constants.mojom.h" -#include "services/ui/ws2/gpu_support.h" +#include "services/ui/ws2/gpu_interface_provider.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h" #include "ui/aura/layout_manager.h" @@ -280,7 +280,7 @@ instance_->Init(init_params.context_factory, init_params.context_factory_private, std::move(init_params.initial_display_prefs), - std::move(init_params.gpu_support)); + std::move(init_params.gpu_interface_provider)); return instance_; } @@ -955,10 +955,11 @@ instance_ = nullptr; } -void Shell::Init(ui::ContextFactory* context_factory, - ui::ContextFactoryPrivate* context_factory_private, - std::unique_ptr<base::Value> initial_display_prefs, - std::unique_ptr<ui::ws2::GpuSupport> gpu_support) { +void Shell::Init( + ui::ContextFactory* context_factory, + ui::ContextFactoryPrivate* context_factory_private, + std::unique_ptr<base::Value> initial_display_prefs, + std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider) { const Config config = shell_port_->GetAshConfig(); // This creates the MessageCenter object which is used by some other objects @@ -1298,7 +1299,7 @@ if (config != Config::MASH) { window_service_owner_ = - std::make_unique<WindowServiceOwner>(std::move(gpu_support)); + std::make_unique<WindowServiceOwner>(std::move(gpu_interface_provider)); ime_focus_handler_ = std::make_unique<ImeFocusHandler>( focus_controller(), window_tree_host_manager_->input_method()); }
diff --git a/ash/shell.h b/ash/shell.h index 6321237..b428662 100644 --- a/ash/shell.h +++ b/ash/shell.h
@@ -62,7 +62,7 @@ class UserActivityDetector; class UserActivityPowerManagerNotifier; namespace ws2 { -class GpuSupport; +class GpuInterfaceProvider; } } // namespace ui @@ -675,10 +675,11 @@ std::unique_ptr<ShellPort> shell_port); ~Shell() override; - void Init(ui::ContextFactory* context_factory, - ui::ContextFactoryPrivate* context_factory_private, - std::unique_ptr<base::Value> initial_display_prefs, - std::unique_ptr<ui::ws2::GpuSupport> gpu_support); + void Init( + ui::ContextFactory* context_factory, + ui::ContextFactoryPrivate* context_factory_private, + std::unique_ptr<base::Value> initial_display_prefs, + std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider); // Initializes the display manager and related components. void InitializeDisplayManager();
diff --git a/ash/shell/content/client/shell_browser_main_parts.cc b/ash/shell/content/client/shell_browser_main_parts.cc index 9cb12a1..519c996 100644 --- a/ash/shell/content/client/shell_browser_main_parts.cc +++ b/ash/shell/content/client/shell_browser_main_parts.cc
@@ -10,7 +10,7 @@ #include "ash/components/quick_launch/public/mojom/constants.mojom.h" #include "ash/components/shortcut_viewer/public/mojom/shortcut_viewer.mojom.h" #include "ash/components/tap_visualizer/public/mojom/constants.mojom.h" -#include "ash/content/content_gpu_support.h" +#include "ash/content/content_gpu_interface_provider.h" #include "ash/content/shell_content_state.h" #include "ash/login_status.h" #include "ash/public/cpp/ash_features.h" @@ -97,7 +97,8 @@ init_params.delegate = std::make_unique<ash::shell::ShellDelegateImpl>(); init_params.context_factory = content::GetContextFactory(); init_params.context_factory_private = content::GetContextFactoryPrivate(); - init_params.gpu_support = std::make_unique<ContentGpuSupport>(); + init_params.gpu_interface_provider = + std::make_unique<ContentGpuInterfaceProvider>(); ash::Shell::CreateInstance(std::move(init_params)); // Initialize session controller client and create fake user sessions. The
diff --git a/ash/shell_init_params.cc b/ash/shell_init_params.cc index 2d686b9..ec16ce4 100644 --- a/ash/shell_init_params.cc +++ b/ash/shell_init_params.cc
@@ -6,7 +6,7 @@ #include "ash/shell_delegate.h" #include "ash/shell_port.h" -#include "services/ui/ws2/gpu_support.h" +#include "services/ui/ws2/gpu_interface_provider.h" namespace ash {
diff --git a/ash/shell_init_params.h b/ash/shell_init_params.h index 753a6ae..ca43697 100644 --- a/ash/shell_init_params.h +++ b/ash/shell_init_params.h
@@ -17,7 +17,7 @@ class ContextFactory; class ContextFactoryPrivate; namespace ws2 { -class GpuSupport; +class GpuInterfaceProvider; } } @@ -39,9 +39,9 @@ // ShellObserver::OnLocalStatePrefServiceInitialized is called. std::unique_ptr<base::Value> initial_display_prefs; - // Allows gpu-support to be injected while avoiding direct content + // Allows gpu interfaces to be injected while avoiding direct content // dependencies. - std::unique_ptr<ui::ws2::GpuSupport> gpu_support; + std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider; }; } // namespace ash
diff --git a/ash/ws/window_service_owner.cc b/ash/ws/window_service_owner.cc index 96bf531..6a36bc9 100644 --- a/ash/ws/window_service_owner.cc +++ b/ash/ws/window_service_owner.cc
@@ -9,15 +9,15 @@ #include "ash/wm/non_client_frame_controller.h" #include "ash/ws/window_service_delegate_impl.h" #include "services/service_manager/public/cpp/service_context.h" -#include "services/ui/ws2/gpu_support.h" +#include "services/ui/ws2/gpu_interface_provider.h" #include "services/ui/ws2/window_service.h" #include "ui/wm/core/focus_controller.h" namespace ash { WindowServiceOwner::WindowServiceOwner( - std::unique_ptr<ui::ws2::GpuSupport> gpu_support) - : gpu_support_(std::move(gpu_support)) {} + std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider) + : gpu_interface_provider_(std::move(gpu_interface_provider)) {} WindowServiceOwner::~WindowServiceOwner() = default; @@ -31,7 +31,7 @@ window_service_delegate_ = std::make_unique<WindowServiceDelegateImpl>(); std::unique_ptr<ui::ws2::WindowService> window_service = std::make_unique<ui::ws2::WindowService>( - window_service_delegate_.get(), std::move(gpu_support_), + window_service_delegate_.get(), std::move(gpu_interface_provider_), Shell::Get()->focus_controller()); window_service_ = window_service.get(); window_service_->SetFrameDecorationValues(
diff --git a/ash/ws/window_service_owner.h b/ash/ws/window_service_owner.h index 0564e0c..ae7f9edc 100644 --- a/ash/ws/window_service_owner.h +++ b/ash/ws/window_service_owner.h
@@ -18,7 +18,7 @@ namespace ui { namespace ws2 { -class GpuSupport; +class GpuInterfaceProvider; class WindowService; } // namespace ws2 } // namespace ui @@ -32,7 +32,8 @@ // BindWindowService() is called the WindowService is created. class ASH_EXPORT WindowServiceOwner { public: - explicit WindowServiceOwner(std::unique_ptr<ui::ws2::GpuSupport> gpu_support); + explicit WindowServiceOwner( + std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider); ~WindowServiceOwner(); // Called from the ServiceManager when a request is made for the @@ -47,7 +48,7 @@ friend class AshTestHelper; // Non-null until |service_context_| is created. - std::unique_ptr<ui::ws2::GpuSupport> gpu_support_; + std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider_; // The following state is created once BindWindowService() is called.
diff --git a/base/android/java/src/org/chromium/base/LocaleUtils.java b/base/android/java/src/org/chromium/base/LocaleUtils.java index 85a62b98..05d39029a 100644 --- a/base/android/java/src/org/chromium/base/LocaleUtils.java +++ b/base/android/java/src/org/chromium/base/LocaleUtils.java
@@ -12,10 +12,7 @@ import org.chromium.base.annotations.CalledByNative; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; /** * This class provides the locale related methods. @@ -27,27 +24,6 @@ private LocaleUtils() { } - private static final Map<String, String> LANGUAGE_MAP_FOR_CHROMIUM; - private static final Map<String, String> LANGUAGE_MAP_FOR_ANDROID; - - static { - // A variation of this mapping also exists in: - // build/android/gyp/process_resources.py - HashMap<String, String> mapForChromium = new HashMap<>(); - mapForChromium.put("iw", "he"); // Hebrew - mapForChromium.put("ji", "yi"); // Yiddish - mapForChromium.put("in", "id"); // Indonesian - mapForChromium.put("tl", "fil"); // Filipino - LANGUAGE_MAP_FOR_CHROMIUM = Collections.unmodifiableMap(mapForChromium); - } - - static { - HashMap<String, String> mapForAndroid = new HashMap<>(); - mapForAndroid.put("und", ""); // Undefined - mapForAndroid.put("fil", "tl"); // Filipino - LANGUAGE_MAP_FOR_ANDROID = Collections.unmodifiableMap(mapForAndroid); - } - /** * Java keeps deprecated language codes for Hebrew, Yiddish and Indonesian but Chromium uses * updated ones. Similarly, Android uses "tl" while Chromium uses "fil" for Tagalog/Filipino. @@ -56,8 +32,20 @@ * @return a updated language code for Chromium with given language string. */ public static String getUpdatedLanguageForChromium(String language) { - String updatedLanguageCode = LANGUAGE_MAP_FOR_CHROMIUM.get(language); - return updatedLanguageCode == null ? language : updatedLanguageCode; + // IMPORTANT: Keep in sync with the mapping found in: + // build/android/gyp/util/resource_utils.py + switch (language) { + case "iw": + return "he"; // Hebrew + case "ji": + return "yi"; // Yiddish + case "in": + return "id"; // Indonesian + case "tl": + return "fil"; // Filipino + default: + return language; + } } /** @@ -67,8 +55,9 @@ @TargetApi(Build.VERSION_CODES.LOLLIPOP) @VisibleForTesting public static Locale getUpdatedLocaleForChromium(Locale locale) { - String languageForChrome = LANGUAGE_MAP_FOR_CHROMIUM.get(locale.getLanguage()); - if (languageForChrome == null) { + String language = locale.getLanguage(); + String languageForChrome = getUpdatedLanguageForChromium(language); + if (languageForChrome.equals(language)) { return locale; } return new Locale.Builder().setLocale(locale).setLanguage(languageForChrome).build(); @@ -81,8 +70,16 @@ * @return a updated language code for Android with given language string. */ public static String getUpdatedLanguageForAndroid(String language) { - String updatedLanguageCode = LANGUAGE_MAP_FOR_ANDROID.get(language); - return updatedLanguageCode == null ? language : updatedLanguageCode; + // IMPORTANT: Keep in sync with the mapping found in: + // build/android/gyp/util/resource_utils.py + switch (language) { + case "und": + return ""; // Undefined + case "fil": + return "tl"; // Filipino + default: + return language; + } } /** @@ -92,8 +89,9 @@ @TargetApi(Build.VERSION_CODES.LOLLIPOP) @VisibleForTesting public static Locale getUpdatedLocaleForAndroid(Locale locale) { - String languageForAndroid = LANGUAGE_MAP_FOR_ANDROID.get(locale.getLanguage()); - if (languageForAndroid == null) { + String language = locale.getLanguage(); + String languageForAndroid = getUpdatedLanguageForAndroid(language); + if (languageForAndroid.equals(language)) { return locale; } return new Locale.Builder().setLocale(locale).setLanguage(languageForAndroid).build(); @@ -110,7 +108,7 @@ return new Locale(""); } String language = getUpdatedLanguageForAndroid(tag[0]); - if ((language.length() != 2 && language.length() != 3) || language.equals("und")) { + if ((language.length() != 2 && language.length() != 3)) { return new Locale(""); } if (tag.length == 1) {
diff --git a/base/message_loop/message_loop_current.cc b/base/message_loop/message_loop_current.cc index 0beef5a..5554e9f 100644 --- a/base/message_loop/message_loop_current.cc +++ b/base/message_loop/message_loop_current.cc
@@ -201,11 +201,11 @@ #if !defined(OS_NACL_SFI) #if defined(OS_WIN) -void MessageLoopCurrentForIO::RegisterIOHandler( +HRESULT MessageLoopCurrentForIO::RegisterIOHandler( HANDLE file, MessagePumpForIO::IOHandler* handler) { DCHECK_CALLED_ON_VALID_THREAD(current_->bound_thread_checker_); - pump_->RegisterIOHandler(file, handler); + return pump_->RegisterIOHandler(file, handler); } bool MessageLoopCurrentForIO::RegisterJobObject(
diff --git a/base/message_loop/message_loop_current.h b/base/message_loop/message_loop_current.h index c5016dc..9e19a78 100644 --- a/base/message_loop/message_loop_current.h +++ b/base/message_loop/message_loop_current.h
@@ -265,7 +265,7 @@ #if defined(OS_WIN) // Please see MessagePumpWin for definitions of these methods. - void RegisterIOHandler(HANDLE file, MessagePumpForIO::IOHandler* handler); + HRESULT RegisterIOHandler(HANDLE file, MessagePumpForIO::IOHandler* handler); bool RegisterJobObject(HANDLE job, MessagePumpForIO::IOHandler* handler); bool WaitForIOCompletion(DWORD timeout, MessagePumpForIO::IOHandler* filter); #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc index 8e6f1f41..2860539a 100644 --- a/base/message_loop/message_pump_win.cc +++ b/base/message_loop/message_pump_win.cc
@@ -443,11 +443,11 @@ delayed_work_time_ = delayed_work_time; } -void MessagePumpForIO::RegisterIOHandler(HANDLE file_handle, - IOHandler* handler) { +HRESULT MessagePumpForIO::RegisterIOHandler(HANDLE file_handle, + IOHandler* handler) { HANDLE port = CreateIoCompletionPort(file_handle, port_.Get(), reinterpret_cast<ULONG_PTR>(handler), 1); - DPCHECK(port); + return (port != nullptr) ? S_OK : HRESULT_FROM_WIN32(GetLastError()); } bool MessagePumpForIO::RegisterJobObject(HANDLE job_handle,
diff --git a/base/message_loop/message_pump_win.h b/base/message_loop/message_pump_win.h index f8a8557..876415c 100644 --- a/base/message_loop/message_pump_win.h +++ b/base/message_loop/message_pump_win.h
@@ -209,7 +209,7 @@ // Register the handler to be used when asynchronous IO for the given file // completes. The registration persists as long as |file_handle| is valid, so // |handler| must be valid as long as there is pending IO for the given file. - void RegisterIOHandler(HANDLE file_handle, IOHandler* handler); + HRESULT RegisterIOHandler(HANDLE file_handle, IOHandler* handler); // Register the handler to be used to process job events. The registration // persists as long as the job object is live, so |handler| must be valid
diff --git a/base/profiler/native_stack_sampler_mac.cc b/base/profiler/native_stack_sampler_mac.cc index b30ea90c..bac233e 100644 --- a/base/profiler/native_stack_sampler_mac.cc +++ b/base/profiler/native_stack_sampler_mac.cc
@@ -34,6 +34,10 @@ namespace base { +using Frame = StackSamplingProfiler::Frame; +using Module = StackSamplingProfiler::Module; +using SamplingProfileBuilder = StackSamplingProfiler::SamplingProfileBuilder; + namespace { // Maps a module's address range (half-open) in memory to an index in a separate @@ -115,7 +119,7 @@ // StackSamplingProfiler::Frame::kUnknownModuleIndex if no Module can be // determined for |module|. size_t GetModuleIndex(const uintptr_t instruction_pointer, - std::vector<StackSamplingProfiler::Module>* modules, + std::vector<Module>* modules, std::vector<ModuleIndex>* profile_module_index) { // Check if |instruction_pointer| is in the address range of a module we've // already seen. @@ -130,11 +134,10 @@ Dl_info inf; if (!dladdr(reinterpret_cast<const void*>(instruction_pointer), &inf)) - return StackSamplingProfiler::Frame::kUnknownModuleIndex; + return Frame::kUnknownModuleIndex; - StackSamplingProfiler::Module module( - reinterpret_cast<uintptr_t>(inf.dli_fbase), GetUniqueId(inf.dli_fbase), - FilePath(inf.dli_fname)); + Module module(reinterpret_cast<uintptr_t>(inf.dli_fbase), + GetUniqueId(inf.dli_fbase), FilePath(inf.dli_fname)); modules->push_back(module); auto base_module_address = reinterpret_cast<uintptr_t>(inf.dli_fbase); @@ -298,13 +301,12 @@ // lambda for each frame. Returns false if an error occurred, otherwise returns // true. template <typename StackFrameCallback, typename ContinueUnwindPredicate> -bool WalkStackFromContext( - unw_context_t* unwind_context, - size_t* frame_count, - std::vector<StackSamplingProfiler::Module>* current_modules, - std::vector<ModuleIndex>* profile_module_index, - const StackFrameCallback& callback, - const ContinueUnwindPredicate& continue_unwind) { +bool WalkStackFromContext(unw_context_t* unwind_context, + size_t* frame_count, + std::vector<Module>* current_modules, + std::vector<ModuleIndex>* profile_module_index, + const StackFrameCallback& callback, + const ContinueUnwindPredicate& continue_unwind) { unw_cursor_t unwind_cursor; unw_init_local(&unwind_cursor, unwind_context); @@ -328,7 +330,7 @@ // frame. size_t module_index = GetModuleIndex(rip, current_modules, profile_module_index); - if (module_index == StackSamplingProfiler::Frame::kUnknownModuleIndex) + if (module_index == Frame::kUnknownModuleIndex) return false; callback(static_cast<uintptr_t>(rip), module_index); @@ -388,7 +390,7 @@ // lambda for each frame. template <typename StackFrameCallback, typename ContinueUnwindPredicate> void WalkStack(const x86_thread_state64_t& thread_state, - std::vector<StackSamplingProfiler::Module>* current_modules, + std::vector<Module>* current_modules, std::vector<ModuleIndex>* profile_module_index, const StackFrameCallback& callback, const ContinueUnwindPredicate& continue_unwind) { @@ -470,11 +472,10 @@ ~NativeStackSamplerMac() override; // StackSamplingProfiler::NativeStackSampler: - void ProfileRecordingStarting( - std::vector<StackSamplingProfiler::Module>* modules) override; - std::vector<StackSamplingProfiler::Frame> RecordStackFrames( + void ProfileRecordingStarting(std::vector<Module>* modules) override; + std::vector<Frame> RecordStackFrames( StackBuffer* stack_buffer, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder) override; + SamplingProfileBuilder* profile_builder) override; void ProfileRecordingStopped() override; private: @@ -482,9 +483,9 @@ // thread. // Returns a vector of frames which record the information of the stack frames // and associated modules. - std::vector<StackSamplingProfiler::Frame> SuspendThreadAndRecordStack( + std::vector<Frame> SuspendThreadAndRecordStack( StackBuffer* stack_buffer, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder); + SamplingProfileBuilder* profile_builder); // Weak reference: Mach port for thread being profiled. mach_port_t thread_port_; @@ -496,7 +497,7 @@ // Weak. Points to the modules associated with the profile being recorded // between ProfileRecordingStarting() and ProfileRecordingStopped(). - std::vector<StackSamplingProfiler::Module>* current_modules_ = nullptr; + std::vector<Module>* current_modules_ = nullptr; // Maps a module's address range to the corresponding Module's index within // current_modules_. @@ -528,15 +529,14 @@ NativeStackSamplerMac::~NativeStackSamplerMac() {} void NativeStackSamplerMac::ProfileRecordingStarting( - std::vector<StackSamplingProfiler::Module>* modules) { + std::vector<Module>* modules) { current_modules_ = modules; profile_module_index_.clear(); } -std::vector<StackSamplingProfiler::Frame> -NativeStackSamplerMac::RecordStackFrames( +std::vector<Frame> NativeStackSamplerMac::RecordStackFrames( StackBuffer* stack_buffer, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder) { + SamplingProfileBuilder* profile_builder) { DCHECK(current_modules_); return SuspendThreadAndRecordStack(stack_buffer, profile_builder); @@ -546,13 +546,12 @@ current_modules_ = nullptr; } -std::vector<StackSamplingProfiler::Frame> -NativeStackSamplerMac::SuspendThreadAndRecordStack( +std::vector<Frame> NativeStackSamplerMac::SuspendThreadAndRecordStack( StackBuffer* stack_buffer, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder) { + SamplingProfileBuilder* profile_builder) { x86_thread_state64_t thread_state; - std::vector<StackSamplingProfiler::Frame> frames; + std::vector<Frame> frames; // Copy the stack.
diff --git a/base/profiler/native_stack_sampler_win.cc b/base/profiler/native_stack_sampler_win.cc index 5c59c56..075a8006 100644 --- a/base/profiler/native_stack_sampler_win.cc +++ b/base/profiler/native_stack_sampler_win.cc
@@ -31,6 +31,10 @@ namespace base { +using Frame = StackSamplingProfiler::Frame; +using Module = StackSamplingProfiler::Module; +using SamplingProfileBuilder = StackSamplingProfiler::SamplingProfileBuilder; + // Stack recording functions -------------------------------------------------- namespace { @@ -334,7 +338,7 @@ void* stack_copy_buffer, size_t stack_copy_buffer_size, std::vector<RecordedFrame>* stack, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder, + SamplingProfileBuilder* profile_builder, NativeStackSamplerTestDelegate* test_delegate) { DCHECK(stack->empty()); @@ -392,31 +396,27 @@ ~NativeStackSamplerWin() override; // StackSamplingProfiler::NativeStackSampler: - void ProfileRecordingStarting( - std::vector<StackSamplingProfiler::Module>* modules) override; - std::vector<StackSamplingProfiler::Frame> RecordStackFrames( + void ProfileRecordingStarting(std::vector<Module>* modules) override; + std::vector<Frame> RecordStackFrames( StackBuffer* stack_buffer, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder) override; + SamplingProfileBuilder* profile_builder) override; void ProfileRecordingStopped() override; private: // Attempts to query the module filename, base address, and id for // |module_handle|, and store them in |module|. Returns true if it succeeded. - static bool GetModuleForHandle(HMODULE module_handle, - StackSamplingProfiler::Module* module); + static bool GetModuleForHandle(HMODULE module_handle, Module* module); // Gets the index for the Module corresponding to |module_handle| in // |modules|, adding it if it's not already present. Returns // StackSamplingProfiler::Frame::kUnknownModuleIndex if no Module can be // determined for |module|. - size_t GetModuleIndex(HMODULE module_handle, - std::vector<StackSamplingProfiler::Module>* modules); + size_t GetModuleIndex(HMODULE module_handle, std::vector<Module>* modules); // Creates a set of frames with the information represented by |stack| and // |modules|. - std::vector<StackSamplingProfiler::Frame> CreateFrames( - const std::vector<RecordedFrame>& stack, - std::vector<StackSamplingProfiler::Module>* modules); + std::vector<Frame> CreateFrames(const std::vector<RecordedFrame>& stack, + std::vector<Module>* modules); win::ScopedHandle thread_handle_; @@ -427,7 +427,7 @@ // Weak. Points to the modules associated with the profile being recorded // between ProfileRecordingStarting() and ProfileRecordingStopped(). - std::vector<StackSamplingProfiler::Module>* current_modules_; + std::vector<Module>* current_modules_; // Maps a module handle to the corresponding Module's index within // current_modules_. @@ -448,15 +448,14 @@ } void NativeStackSamplerWin::ProfileRecordingStarting( - std::vector<StackSamplingProfiler::Module>* modules) { + std::vector<Module>* modules) { current_modules_ = modules; profile_module_index_.clear(); } -std::vector<StackSamplingProfiler::Frame> -NativeStackSamplerWin::RecordStackFrames( +std::vector<Frame> NativeStackSamplerWin::RecordStackFrames( StackBuffer* stack_buffer, - StackSamplingProfiler::SamplingProfileBuilder* profile_builder) { + SamplingProfileBuilder* profile_builder) { DCHECK(stack_buffer); DCHECK(current_modules_); @@ -473,9 +472,8 @@ } // static -bool NativeStackSamplerWin::GetModuleForHandle( - HMODULE module_handle, - StackSamplingProfiler::Module* module) { +bool NativeStackSamplerWin::GetModuleForHandle(HMODULE module_handle, + Module* module) { wchar_t module_name[MAX_PATH]; DWORD result_length = ::GetModuleFileName(module_handle, module_name, size(module_name)); @@ -488,17 +486,16 @@ return !module->id.empty(); } -size_t NativeStackSamplerWin::GetModuleIndex( - HMODULE module_handle, - std::vector<StackSamplingProfiler::Module>* modules) { +size_t NativeStackSamplerWin::GetModuleIndex(HMODULE module_handle, + std::vector<Module>* modules) { if (!module_handle) - return StackSamplingProfiler::Frame::kUnknownModuleIndex; + return Frame::kUnknownModuleIndex; auto loc = profile_module_index_.find(module_handle); if (loc == profile_module_index_.end()) { - StackSamplingProfiler::Module module; + Module module; if (!GetModuleForHandle(module_handle, &module)) - return StackSamplingProfiler::Frame::kUnknownModuleIndex; + return Frame::kUnknownModuleIndex; modules->push_back(module); loc = profile_module_index_.insert(std::make_pair( module_handle, modules->size() - 1)).first; @@ -507,10 +504,10 @@ return loc->second; } -std::vector<StackSamplingProfiler::Frame> NativeStackSamplerWin::CreateFrames( +std::vector<Frame> NativeStackSamplerWin::CreateFrames( const std::vector<RecordedFrame>& stack, - std::vector<StackSamplingProfiler::Module>* modules) { - std::vector<StackSamplingProfiler::Frame> frames; + std::vector<Module>* modules) { + std::vector<Frame> frames; frames.reserve(stack.size()); for (const auto& frame : stack) {
diff --git a/base/threading/simple_thread.cc b/base/threading/simple_thread.cc index 04a5285..4b260627 100644 --- a/base/threading/simple_thread.cc +++ b/base/threading/simple_thread.cc
@@ -53,7 +53,7 @@ &thread_, options_.priority) : PlatformThread::CreateNonJoinableWithPriority( options_.stack_size, this, options_.priority); - DCHECK(success); + CHECK(success); } PlatformThreadId SimpleThread::tid() {
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 6a1631f..fd87d28 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -33,22 +33,6 @@ sys.path.insert(1, os.path.join(_SOURCE_ROOT, 'third_party')) from jinja2 import Template # pylint: disable=F0401 -# A variation of this lists also exists in: -# //base/android/java/src/org/chromium/base/LocaleUtils.java -_CHROME_TO_ANDROID_LOCALE_MAP = { - 'en-GB': 'en-rGB', - 'en-US': 'en-rUS', - 'es-419': 'es-rUS', - 'fil': 'tl', - 'he': 'iw', - 'id': 'in', - 'pt-PT': 'pt-rPT', - 'pt-BR': 'pt-rBR', - 'yi': 'ji', - 'zh-CN': 'zh-rCN', - 'zh-TW': 'zh-rTW', -} - # Pngs that we shouldn't convert to webp. Please add rationale when updating. _PNG_WEBP_BLACKLIST_PATTERN = re.compile('|'.join([ # Crashes on Galaxy S5 running L (https://crbug.com/807059). @@ -247,9 +231,9 @@ """Converts the list of Chrome locales to aapt config locales.""" ret = set() for locale in locale_whitelist: - locale = _CHROME_TO_ANDROID_LOCALE_MAP.get(locale, locale) + locale = resource_utils.CHROME_TO_ANDROID_LOCALE_MAP.get(locale, locale) if locale is None or ('-' in locale and '-r' not in locale): - raise Exception('_CHROME_TO_ANDROID_LOCALE_MAP needs updating.' + raise Exception('CHROME_TO_ANDROID_LOCALE_MAP needs updating.' ' Found: %s' % locale) ret.add(locale) # Always keep non-regional fall-backs.
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py index 0baef65..84e4dc23 100644 --- a/build/android/gyp/util/resource_utils.py +++ b/build/android/gyp/util/resource_utils.py
@@ -25,6 +25,22 @@ _SOURCE_ROOT, 'build', 'android', 'AndroidManifest.xml') +# A variation of this lists also exists in: +# //base/android/java/src/org/chromium/base/LocaleUtils.java +CHROME_TO_ANDROID_LOCALE_MAP = { + 'en-GB': 'en-rGB', + 'en-US': 'en-rUS', + 'es-419': 'es-rUS', + 'fil': 'tl', + 'he': 'iw', + 'id': 'in', + 'pt-PT': 'pt-rPT', + 'pt-BR': 'pt-rBR', + 'yi': 'ji', + 'zh-CN': 'zh-rCN', + 'zh-TW': 'zh-rTW', +} + # Represents a line from a R.txt file. _TextSymbolEntry = collections.namedtuple('RTextEntry', ('java_type', 'resource_type', 'name', 'value'))
diff --git a/build/android/play_services/LICENSE.sha1 b/build/android/play_services/LICENSE.sha1 index 35a19e9..c46edd84 100644 --- a/build/android/play_services/LICENSE.sha1 +++ b/build/android/play_services/LICENSE.sha1
@@ -1 +1 @@ -76a1dca20a2697eb9250eb08424503259b8b6aa7 \ No newline at end of file +4d3bbf27839164e89417facf4906ab33222fa382 \ No newline at end of file
diff --git a/build/android/play_services/config.json b/build/android/play_services/config.json index 656919d..85104a12 100644 --- a/build/android/play_services/config.json +++ b/build/android/play_services/config.json
@@ -1,10 +1,13 @@ { "clients": [ + "play-services-auth-api-phone", "play-services-auth-base", "play-services-auth", "play-services-base", "play-services-basement", "play-services-cast", + "play-services-cast-framework", + "play-services-fido", "play-services-gcm", "play-services-iid", "play-services-location", @@ -12,6 +15,6 @@ "play-services-vision", "play-services-vision-common" ], - "version_number": "11.2.0", + "version_number": "12.0.1", "version_xml_path": "res/values/version.xml" }
diff --git a/build/android/play_services/google_play_services_library.zip.sha1 b/build/android/play_services/google_play_services_library.zip.sha1 index 163bb9a..cdeaa09 100644 --- a/build/android/play_services/google_play_services_library.zip.sha1 +++ b/build/android/play_services/google_play_services_library.zip.sha1
@@ -1 +1 @@ -c812f827e8dd2cb28cb41003519f50d33fe64856 \ No newline at end of file +914b84f58cf521f911d97a524562d3117855df77 \ No newline at end of file
diff --git a/build/secondary/third_party/android_tools/BUILD.gn b/build/secondary/third_party/android_tools/BUILD.gn index 4a902b5..dfd2b69 100644 --- a/build/secondary/third_party/android_tools/BUILD.gn +++ b/build/secondary/third_party/android_tools/BUILD.gn
@@ -106,7 +106,7 @@ # TODO(dgn): Use the POM files instead of hardcoding the dependencies. gms_path = "$default_extras_android_sdk_root/extras/google/m2repository/com/google/android/gms" - gms_version = "11.2.0" + gms_version = "12.0.1" android_aar_prebuilt("google_play_services_basement_java") { deps = [ @@ -146,6 +146,7 @@ deps = [ ":google_play_services_base_java", ":google_play_services_basement_java", + ":google_play_services_tasks_java", ] _lib_name = "play-services-auth-base" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" @@ -154,11 +155,26 @@ [ "${target_gen_dir}/google_play_services_basement_java/proguard.txt" ] } + android_aar_prebuilt("google_play_services_auth_api_phone_java") { + deps = [ + ":google_play_services_base_java", + ":google_play_services_basement_java", + ":google_play_services_tasks_java", + ] + _lib_name = "play-services-auth-api-phone" + aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" + info_path = "//build/secondary/third_party/android_tools/$target_name.info" + proguard_configs = + [ "${target_gen_dir}/google_play_services_basement_java/proguard.txt" ] + } + android_aar_prebuilt("google_play_services_auth_java") { deps = [ + ":google_play_services_auth_api_phone_java", ":google_play_services_auth_base_java", ":google_play_services_base_java", ":google_play_services_basement_java", + ":google_play_services_tasks_java", ] _lib_name = "play-services-auth" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" @@ -172,6 +188,7 @@ ":android_support_v7_mediarouter_java", ":google_play_services_base_java", ":google_play_services_basement_java", + ":google_play_services_tasks_java", ] _lib_name = "play-services-cast" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" @@ -180,10 +197,24 @@ [ "${target_gen_dir}/google_play_services_basement_java/proguard.txt" ] } + android_aar_prebuilt("google_play_services_cast_framework_java") { + deps = [ + ":google_play_services_base_java", + ":google_play_services_basement_java", + ":google_play_services_cast_java", + ] + _lib_name = "play-services-cast-framework" + aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" + info_path = "//build/secondary/third_party/android_tools/$target_name.info" + proguard_configs = + [ "${target_gen_dir}/google_play_services_basement_java/proguard.txt" ] + } + android_aar_prebuilt("google_play_services_iid_java") { deps = [ ":google_play_services_base_java", ":google_play_services_basement_java", + ":google_play_services_tasks_java", ] _lib_name = "play-services-iid" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" @@ -209,6 +240,7 @@ deps = [ ":google_play_services_base_java", ":google_play_services_basement_java", + ":google_play_services_tasks_java", ] _lib_name = "play-services-location" aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" @@ -241,4 +273,17 @@ proguard_configs = [ "${target_gen_dir}/google_play_services_basement_java/proguard.txt" ] } + + android_aar_prebuilt("google_play_services_fido_java") { + deps = [ + ":google_play_services_base_java", + ":google_play_services_basement_java", + ":google_play_services_tasks_java", + ] + _lib_name = "play-services-fido" + aar_path = "$gms_path/$_lib_name/$gms_version/$_lib_name-$gms_version.aar" + info_path = "//build/secondary/third_party/android_tools/$target_name.info" + proguard_configs = + [ "${target_gen_dir}/google_play_services_basement_java/proguard.txt" ] + } }
diff --git a/build/secondary/third_party/android_tools/google_play_services_auth_api_phone_java.info b/build/secondary/third_party/android_tools/google_play_services_auth_api_phone_java.info new file mode 100644 index 0000000..a2ebd4a --- /dev/null +++ b/build/secondary/third_party/android_tools/google_play_services_auth_api_phone_java.info
@@ -0,0 +1,13 @@ +# Generated by //build/android/gyp/aar.py +# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". + +aidl = [ ] +assets = [ ] +has_classes_jar = true +has_native_libraries = false +has_proguard_flags = false +has_r_text_file = false +is_manifest_empty = true +resources = [ ] +subjar_tuples = [ ] +subjars = [ ]
diff --git a/build/secondary/third_party/android_tools/google_play_services_base_java.info b/build/secondary/third_party/android_tools/google_play_services_base_java.info index 01b94052..b85a72d 100644 --- a/build/secondary/third_party/android_tools/google_play_services_base_java.info +++ b/build/secondary/third_party/android_tools/google_play_services_base_java.info
@@ -5,7 +5,7 @@ assets = [ ] has_classes_jar = true has_native_libraries = false -has_proguard_flags = false +has_proguard_flags = true has_r_text_file = false is_manifest_empty = false resources = [ "res/color/common_google_signin_btn_text_dark.xml", "res/color/common_google_signin_btn_text_light.xml", "res/color/common_google_signin_btn_tint.xml", "res/drawable-hdpi-v4/common_full_open_on_phone.png", "res/drawable-hdpi-v4/common_google_signin_btn_icon_dark_normal_background.9.png", "res/drawable-hdpi-v4/common_google_signin_btn_icon_light_normal_background.9.png", "res/drawable-hdpi-v4/common_google_signin_btn_text_dark_normal_background.9.png", "res/drawable-hdpi-v4/common_google_signin_btn_text_light_normal_background.9.png", "res/drawable-hdpi-v4/googleg_disabled_color_18.png", "res/drawable-hdpi-v4/googleg_standard_color_18.png", "res/drawable-mdpi-v4/common_google_signin_btn_icon_dark_normal_background.9.png", "res/drawable-mdpi-v4/common_google_signin_btn_icon_light_normal_background.9.png", "res/drawable-mdpi-v4/common_google_signin_btn_text_dark_normal_background.9.png", "res/drawable-mdpi-v4/common_google_signin_btn_text_light_normal_background.9.png", "res/drawable-mdpi-v4/googleg_disabled_color_18.png", "res/drawable-mdpi-v4/googleg_standard_color_18.png", "res/drawable-xhdpi-v4/common_full_open_on_phone.png", "res/drawable-xhdpi-v4/common_google_signin_btn_icon_dark_normal_background.9.png", "res/drawable-xhdpi-v4/common_google_signin_btn_icon_light_normal_background.9.png", "res/drawable-xhdpi-v4/common_google_signin_btn_text_dark_normal_background.9.png", "res/drawable-xhdpi-v4/common_google_signin_btn_text_light_normal_background.9.png", "res/drawable-xhdpi-v4/googleg_disabled_color_18.png", "res/drawable-xhdpi-v4/googleg_standard_color_18.png", "res/drawable-xxhdpi-v4/common_google_signin_btn_icon_dark_normal_background.9.png", "res/drawable-xxhdpi-v4/common_google_signin_btn_icon_light_normal_background.9.png", "res/drawable-xxhdpi-v4/common_google_signin_btn_text_dark_normal_background.9.png", "res/drawable-xxhdpi-v4/common_google_signin_btn_text_light_normal_background.9.png", "res/drawable-xxhdpi-v4/googleg_disabled_color_18.png", "res/drawable-xxhdpi-v4/googleg_standard_color_18.png", "res/drawable/common_google_signin_btn_icon_dark.xml", "res/drawable/common_google_signin_btn_icon_dark_focused.xml", "res/drawable/common_google_signin_btn_icon_dark_normal.xml", "res/drawable/common_google_signin_btn_icon_disabled.xml", "res/drawable/common_google_signin_btn_icon_light.xml", "res/drawable/common_google_signin_btn_icon_light_focused.xml", "res/drawable/common_google_signin_btn_icon_light_normal.xml", "res/drawable/common_google_signin_btn_text_dark.xml", "res/drawable/common_google_signin_btn_text_dark_focused.xml", "res/drawable/common_google_signin_btn_text_dark_normal.xml", "res/drawable/common_google_signin_btn_text_disabled.xml", "res/drawable/common_google_signin_btn_text_light.xml", "res/drawable/common_google_signin_btn_text_light_focused.xml", "res/drawable/common_google_signin_btn_text_light_normal.xml", "res/values-af/values.xml", "res/values-am/values.xml", "res/values-ar/values.xml", "res/values-az/values.xml", "res/values-b+sr+Latn/values.xml", "res/values-be/values.xml", "res/values-bg/values.xml", "res/values-bn/values.xml", "res/values-bs/values.xml", "res/values-ca/values.xml", "res/values-cs/values.xml", "res/values-da/values.xml", "res/values-de/values.xml", "res/values-el/values.xml", "res/values-en-rGB/values.xml", "res/values-es-rUS/values.xml", "res/values-es/values.xml", "res/values-et/values.xml", "res/values-eu/values.xml", "res/values-fa/values.xml", "res/values-fi/values.xml", "res/values-fr-rCA/values.xml", "res/values-fr/values.xml", "res/values-gl/values.xml", "res/values-gu/values.xml", "res/values-hi/values.xml", "res/values-hr/values.xml", "res/values-hu/values.xml", "res/values-hy/values.xml", "res/values-in/values.xml", "res/values-is/values.xml", "res/values-it/values.xml", "res/values-iw/values.xml", "res/values-ja/values.xml", "res/values-ka/values.xml", "res/values-kk/values.xml", "res/values-km/values.xml", "res/values-kn/values.xml", "res/values-ko/values.xml", "res/values-ky/values.xml", "res/values-lo/values.xml", "res/values-lt/values.xml", "res/values-lv/values.xml", "res/values-mk/values.xml", "res/values-ml/values.xml", "res/values-mn/values.xml", "res/values-mr/values.xml", "res/values-ms/values.xml", "res/values-my/values.xml", "res/values-nb/values.xml", "res/values-ne/values.xml", "res/values-nl/values.xml", "res/values-pa/values.xml", "res/values-pl/values.xml", "res/values-pt-rBR/values.xml", "res/values-pt-rPT/values.xml", "res/values-ro/values.xml", "res/values-ru/values.xml", "res/values-si/values.xml", "res/values-sk/values.xml", "res/values-sl/values.xml", "res/values-sq/values.xml", "res/values-sr/values.xml", "res/values-sv/values.xml", "res/values-sw/values.xml", "res/values-ta/values.xml", "res/values-te/values.xml", "res/values-th/values.xml", "res/values-tl/values.xml", "res/values-tr/values.xml", "res/values-uk/values.xml", "res/values-ur/values.xml", "res/values-uz/values.xml", "res/values-vi/values.xml", "res/values-zh-rCN/values.xml", "res/values-zh-rHK/values.xml", "res/values-zh-rTW/values.xml", "res/values-zu/values.xml", "res/values/values.xml" ]
diff --git a/build/secondary/third_party/android_tools/google_play_services_cast_framework_java.info b/build/secondary/third_party/android_tools/google_play_services_cast_framework_java.info new file mode 100644 index 0000000..285379a --- /dev/null +++ b/build/secondary/third_party/android_tools/google_play_services_cast_framework_java.info
@@ -0,0 +1,13 @@ +# Generated by //build/android/gyp/aar.py +# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". + +aidl = [ ] +assets = [ ] +has_classes_jar = true +has_native_libraries = false +has_proguard_flags = false +has_r_text_file = false +is_manifest_empty = false +resources = [ "res/drawable-hdpi-v4/cast_abc_scrubber_control_off_mtrl_alpha.png", "res/drawable-hdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_000.png", "res/drawable-hdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_005.png", "res/drawable-hdpi-v4/cast_abc_scrubber_primary_mtrl_alpha.9.png", "res/drawable-hdpi-v4/cast_ic_stop_circle_filled_grey600.png", "res/drawable-hdpi-v4/cast_ic_stop_circle_filled_white.png", "res/drawable-hdpi-v4/quantum_ic_art_track_grey600_48.png", "res/drawable-hdpi-v4/quantum_ic_bigtop_updates_white_24.png", "res/drawable-hdpi-v4/quantum_ic_cast_connected_white_24.png", "res/drawable-hdpi-v4/quantum_ic_cast_white_36.png", "res/drawable-hdpi-v4/quantum_ic_clear_white_24.png", "res/drawable-hdpi-v4/quantum_ic_closed_caption_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_closed_caption_white_36.png", "res/drawable-hdpi-v4/quantum_ic_forward_10_white_24.png", "res/drawable-hdpi-v4/quantum_ic_forward_30_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_forward_30_white_24.png", "res/drawable-hdpi-v4/quantum_ic_forward_30_white_36.png", "res/drawable-hdpi-v4/quantum_ic_keyboard_arrow_down_white_36.png", "res/drawable-hdpi-v4/quantum_ic_pause_circle_filled_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_pause_circle_filled_white_36.png", "res/drawable-hdpi-v4/quantum_ic_pause_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_pause_grey600_48.png", "res/drawable-hdpi-v4/quantum_ic_pause_white_24.png", "res/drawable-hdpi-v4/quantum_ic_play_arrow_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_play_arrow_grey600_48.png", "res/drawable-hdpi-v4/quantum_ic_play_arrow_white_24.png", "res/drawable-hdpi-v4/quantum_ic_play_circle_filled_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_play_circle_filled_white_36.png", "res/drawable-hdpi-v4/quantum_ic_refresh_white_24.png", "res/drawable-hdpi-v4/quantum_ic_replay_10_white_24.png", "res/drawable-hdpi-v4/quantum_ic_replay_30_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_replay_30_white_24.png", "res/drawable-hdpi-v4/quantum_ic_replay_30_white_36.png", "res/drawable-hdpi-v4/quantum_ic_replay_white_24.png", "res/drawable-hdpi-v4/quantum_ic_skip_next_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_skip_next_white_24.png", "res/drawable-hdpi-v4/quantum_ic_skip_next_white_36.png", "res/drawable-hdpi-v4/quantum_ic_skip_previous_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_skip_previous_white_24.png", "res/drawable-hdpi-v4/quantum_ic_skip_previous_white_36.png", "res/drawable-hdpi-v4/quantum_ic_stop_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_stop_grey600_48.png", "res/drawable-hdpi-v4/quantum_ic_stop_white_24.png", "res/drawable-hdpi-v4/quantum_ic_volume_off_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_volume_off_white_36.png", "res/drawable-hdpi-v4/quantum_ic_volume_up_grey600_36.png", "res/drawable-hdpi-v4/quantum_ic_volume_up_white_36.png", "res/drawable-mdpi-v4/cast_abc_scrubber_control_off_mtrl_alpha.png", "res/drawable-mdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_000.png", "res/drawable-mdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_005.png", "res/drawable-mdpi-v4/cast_abc_scrubber_primary_mtrl_alpha.9.png", "res/drawable-mdpi-v4/cast_ic_stop_circle_filled_grey600.png", "res/drawable-mdpi-v4/cast_ic_stop_circle_filled_white.png", "res/drawable-mdpi-v4/quantum_ic_art_track_grey600_48.png", "res/drawable-mdpi-v4/quantum_ic_bigtop_updates_white_24.png", "res/drawable-mdpi-v4/quantum_ic_cast_connected_white_24.png", "res/drawable-mdpi-v4/quantum_ic_cast_white_36.png", "res/drawable-mdpi-v4/quantum_ic_clear_white_24.png", "res/drawable-mdpi-v4/quantum_ic_closed_caption_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_closed_caption_white_36.png", "res/drawable-mdpi-v4/quantum_ic_forward_10_white_24.png", "res/drawable-mdpi-v4/quantum_ic_forward_30_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_forward_30_white_24.png", "res/drawable-mdpi-v4/quantum_ic_forward_30_white_36.png", "res/drawable-mdpi-v4/quantum_ic_keyboard_arrow_down_white_36.png", "res/drawable-mdpi-v4/quantum_ic_pause_circle_filled_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_pause_circle_filled_white_36.png", "res/drawable-mdpi-v4/quantum_ic_pause_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_pause_grey600_48.png", "res/drawable-mdpi-v4/quantum_ic_pause_white_24.png", "res/drawable-mdpi-v4/quantum_ic_play_arrow_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_play_arrow_grey600_48.png", "res/drawable-mdpi-v4/quantum_ic_play_arrow_white_24.png", "res/drawable-mdpi-v4/quantum_ic_play_circle_filled_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_play_circle_filled_white_36.png", "res/drawable-mdpi-v4/quantum_ic_refresh_white_24.png", "res/drawable-mdpi-v4/quantum_ic_replay_10_white_24.png", "res/drawable-mdpi-v4/quantum_ic_replay_30_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_replay_30_white_24.png", "res/drawable-mdpi-v4/quantum_ic_replay_30_white_36.png", "res/drawable-mdpi-v4/quantum_ic_replay_white_24.png", "res/drawable-mdpi-v4/quantum_ic_skip_next_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_skip_next_white_24.png", "res/drawable-mdpi-v4/quantum_ic_skip_next_white_36.png", "res/drawable-mdpi-v4/quantum_ic_skip_previous_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_skip_previous_white_24.png", "res/drawable-mdpi-v4/quantum_ic_skip_previous_white_36.png", "res/drawable-mdpi-v4/quantum_ic_stop_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_stop_grey600_48.png", "res/drawable-mdpi-v4/quantum_ic_stop_white_24.png", "res/drawable-mdpi-v4/quantum_ic_volume_off_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_volume_off_white_36.png", "res/drawable-mdpi-v4/quantum_ic_volume_up_grey600_36.png", "res/drawable-mdpi-v4/quantum_ic_volume_up_white_36.png", "res/drawable-nodpi-v4/cast_album_art_placeholder.png", "res/drawable-nodpi-v4/cast_album_art_placeholder_large.png", "res/drawable-xhdpi-v4/cast_abc_scrubber_control_off_mtrl_alpha.png", "res/drawable-xhdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_000.png", "res/drawable-xhdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_005.png", "res/drawable-xhdpi-v4/cast_abc_scrubber_primary_mtrl_alpha.9.png", "res/drawable-xhdpi-v4/cast_ic_stop_circle_filled_grey600.png", "res/drawable-xhdpi-v4/cast_ic_stop_circle_filled_white.png", "res/drawable-xhdpi-v4/quantum_ic_art_track_grey600_48.png", "res/drawable-xhdpi-v4/quantum_ic_bigtop_updates_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_cast_connected_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_cast_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_clear_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_closed_caption_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_closed_caption_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_forward_10_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_forward_30_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_forward_30_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_forward_30_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_keyboard_arrow_down_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_pause_circle_filled_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_pause_circle_filled_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_pause_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_pause_grey600_48.png", "res/drawable-xhdpi-v4/quantum_ic_pause_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_play_arrow_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_play_arrow_grey600_48.png", "res/drawable-xhdpi-v4/quantum_ic_play_arrow_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_play_circle_filled_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_play_circle_filled_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_refresh_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_replay_10_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_replay_30_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_replay_30_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_replay_30_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_replay_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_skip_next_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_skip_next_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_skip_next_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_skip_previous_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_skip_previous_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_skip_previous_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_stop_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_stop_grey600_48.png", "res/drawable-xhdpi-v4/quantum_ic_stop_white_24.png", "res/drawable-xhdpi-v4/quantum_ic_volume_off_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_volume_off_white_36.png", "res/drawable-xhdpi-v4/quantum_ic_volume_up_grey600_36.png", "res/drawable-xhdpi-v4/quantum_ic_volume_up_white_36.png", "res/drawable-xxhdpi-v4/cast_abc_scrubber_control_off_mtrl_alpha.png", "res/drawable-xxhdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_000.png", "res/drawable-xxhdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_005.png", "res/drawable-xxhdpi-v4/cast_abc_scrubber_primary_mtrl_alpha.9.png", "res/drawable-xxhdpi-v4/cast_ic_stop_circle_filled_grey600.png", "res/drawable-xxhdpi-v4/cast_ic_stop_circle_filled_white.png", "res/drawable-xxhdpi-v4/quantum_ic_art_track_grey600_48.png", "res/drawable-xxhdpi-v4/quantum_ic_bigtop_updates_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_cast_connected_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_cast_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_clear_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_closed_caption_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_closed_caption_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_forward_10_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_forward_30_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_forward_30_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_forward_30_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_keyboard_arrow_down_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_pause_circle_filled_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_pause_circle_filled_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_pause_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_pause_grey600_48.png", "res/drawable-xxhdpi-v4/quantum_ic_pause_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_play_arrow_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_play_arrow_grey600_48.png", "res/drawable-xxhdpi-v4/quantum_ic_play_arrow_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_play_circle_filled_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_play_circle_filled_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_refresh_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_replay_10_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_replay_30_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_replay_30_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_replay_30_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_replay_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_skip_next_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_skip_next_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_skip_next_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_skip_previous_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_skip_previous_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_skip_previous_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_stop_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_stop_grey600_48.png", "res/drawable-xxhdpi-v4/quantum_ic_stop_white_24.png", "res/drawable-xxhdpi-v4/quantum_ic_volume_off_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_volume_off_white_36.png", "res/drawable-xxhdpi-v4/quantum_ic_volume_up_grey600_36.png", "res/drawable-xxhdpi-v4/quantum_ic_volume_up_white_36.png", "res/drawable-xxxhdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_000.png", "res/drawable-xxxhdpi-v4/cast_abc_scrubber_control_to_pressed_mtrl_005.png", "res/drawable-xxxhdpi-v4/cast_ic_stop_circle_filled_grey600.png", "res/drawable-xxxhdpi-v4/cast_ic_stop_circle_filled_white.png", "res/drawable-xxxhdpi-v4/quantum_ic_art_track_grey600_48.png", "res/drawable-xxxhdpi-v4/quantum_ic_bigtop_updates_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_cast_connected_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_cast_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_clear_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_closed_caption_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_closed_caption_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_forward_10_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_forward_30_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_forward_30_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_forward_30_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_keyboard_arrow_down_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_pause_circle_filled_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_pause_circle_filled_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_pause_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_pause_grey600_48.png", "res/drawable-xxxhdpi-v4/quantum_ic_pause_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_play_arrow_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_play_arrow_grey600_48.png", "res/drawable-xxxhdpi-v4/quantum_ic_play_arrow_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_play_circle_filled_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_play_circle_filled_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_refresh_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_replay_10_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_replay_30_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_replay_30_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_replay_30_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_replay_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_skip_next_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_skip_next_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_skip_next_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_skip_previous_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_skip_previous_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_skip_previous_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_stop_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_stop_grey600_48.png", "res/drawable-xxxhdpi-v4/quantum_ic_stop_white_24.png", "res/drawable-xxxhdpi-v4/quantum_ic_volume_off_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_volume_off_white_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_volume_up_grey600_36.png", "res/drawable-xxxhdpi-v4/quantum_ic_volume_up_white_36.png", "res/drawable/cast_expanded_controller_actionbar_bg_gradient_light.xml", "res/drawable/cast_expanded_controller_bg_gradient_light.xml", "res/drawable/cast_expanded_controller_seekbar_thumb.xml", "res/drawable/cast_expanded_controller_seekbar_track.xml", "res/drawable/cast_ic_expanded_controller_closed_caption.xml", "res/drawable/cast_ic_expanded_controller_forward30.xml", "res/drawable/cast_ic_expanded_controller_mute.xml", "res/drawable/cast_ic_expanded_controller_pause.xml", "res/drawable/cast_ic_expanded_controller_play.xml", "res/drawable/cast_ic_expanded_controller_rewind30.xml", "res/drawable/cast_ic_expanded_controller_skip_next.xml", "res/drawable/cast_ic_expanded_controller_skip_previous.xml", "res/drawable/cast_ic_expanded_controller_stop.xml", "res/drawable/cast_ic_mini_controller_closed_caption.xml", "res/drawable/cast_ic_mini_controller_forward30.xml", "res/drawable/cast_ic_mini_controller_mute.xml", "res/drawable/cast_ic_mini_controller_pause.xml", "res/drawable/cast_ic_mini_controller_pause_large.xml", "res/drawable/cast_ic_mini_controller_play.xml", "res/drawable/cast_ic_mini_controller_play_large.xml", "res/drawable/cast_ic_mini_controller_rewind30.xml", "res/drawable/cast_ic_mini_controller_skip_next.xml", "res/drawable/cast_ic_mini_controller_skip_prev.xml", "res/drawable/cast_ic_mini_controller_stop.xml", "res/drawable/cast_ic_mini_controller_stop_large.xml", "res/drawable/cast_ic_notification_disconnect.xml", "res/drawable/cast_ic_notification_forward.xml", "res/drawable/cast_ic_notification_forward10.xml", "res/drawable/cast_ic_notification_forward30.xml", "res/drawable/cast_ic_notification_pause.xml", "res/drawable/cast_ic_notification_play.xml", "res/drawable/cast_ic_notification_rewind.xml", "res/drawable/cast_ic_notification_rewind10.xml", "res/drawable/cast_ic_notification_rewind30.xml", "res/drawable/cast_ic_notification_skip_next.xml", "res/drawable/cast_ic_notification_skip_prev.xml", "res/drawable/cast_ic_notification_small_icon.xml", "res/drawable/cast_ic_notification_stop_live_stream.xml", "res/drawable/cast_mini_controller_gradient_light.xml", "res/drawable/cast_mini_controller_progress_drawable.xml", "res/drawable/cast_skip_ad_label_border.xml", "res/layout/cast_expanded_controller_activity.xml", "res/layout/cast_help_text.xml", "res/layout/cast_intro_overlay.xml", "res/layout/cast_mini_controller.xml", "res/layout/cast_tracks_chooser_dialog_layout.xml", "res/layout/cast_tracks_chooser_dialog_row_layout.xml", "res/values-af/values.xml", "res/values-am/values.xml", "res/values-ar/values.xml", "res/values-az/values.xml", "res/values-b+sr+Latn/values.xml", "res/values-be/values.xml", "res/values-bg/values.xml", "res/values-bn/values.xml", "res/values-bs/values.xml", "res/values-ca/values.xml", "res/values-cs/values.xml", "res/values-da/values.xml", "res/values-de/values.xml", "res/values-el/values.xml", "res/values-en-rGB/values.xml", "res/values-es-rUS/values.xml", "res/values-es/values.xml", "res/values-et/values.xml", "res/values-eu/values.xml", "res/values-fa/values.xml", "res/values-fi/values.xml", "res/values-fr-rCA/values.xml", "res/values-fr/values.xml", "res/values-gl/values.xml", "res/values-gu/values.xml", "res/values-hi/values.xml", "res/values-hr/values.xml", "res/values-hu/values.xml", "res/values-hy/values.xml", "res/values-in/values.xml", "res/values-is/values.xml", "res/values-it/values.xml", "res/values-iw/values.xml", "res/values-ja/values.xml", "res/values-ka/values.xml", "res/values-kk/values.xml", "res/values-km/values.xml", "res/values-kn/values.xml", "res/values-ko/values.xml", "res/values-ky/values.xml", "res/values-land/values.xml", "res/values-lo/values.xml", "res/values-lt/values.xml", "res/values-lv/values.xml", "res/values-mk/values.xml", "res/values-ml/values.xml", "res/values-mn/values.xml", "res/values-mr/values.xml", "res/values-ms/values.xml", "res/values-my/values.xml", "res/values-nb/values.xml", "res/values-ne/values.xml", "res/values-nl/values.xml", "res/values-pa/values.xml", "res/values-pl/values.xml", "res/values-pt-rBR/values.xml", "res/values-pt-rPT/values.xml", "res/values-ro/values.xml", "res/values-ru/values.xml", "res/values-si/values.xml", "res/values-sk/values.xml", "res/values-sl/values.xml", "res/values-sq/values.xml", "res/values-sr/values.xml", "res/values-sv/values.xml", "res/values-sw/values.xml", "res/values-ta/values.xml", "res/values-te/values.xml", "res/values-th/values.xml", "res/values-tl/values.xml", "res/values-tr/values.xml", "res/values-uk/values.xml", "res/values-ur/values.xml", "res/values-uz/values.xml", "res/values-vi/values.xml", "res/values-zh-rCN/values.xml", "res/values-zh-rHK/values.xml", "res/values-zh-rTW/values.xml", "res/values-zu/values.xml", "res/values/values.xml" ] +subjar_tuples = [ ] +subjars = [ ]
diff --git a/build/secondary/third_party/android_tools/google_play_services_fido_java.info b/build/secondary/third_party/android_tools/google_play_services_fido_java.info new file mode 100644 index 0000000..0dfcb237 --- /dev/null +++ b/build/secondary/third_party/android_tools/google_play_services_fido_java.info
@@ -0,0 +1,13 @@ +# Generated by //build/android/gyp/aar.py +# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". + +aidl = [ ] +assets = [ ] +has_classes_jar = true +has_native_libraries = false +has_proguard_flags = true +has_r_text_file = false +is_manifest_empty = true +resources = [ ] +subjar_tuples = [ ] +subjars = [ ]
diff --git a/cc/benchmarks/micro_benchmark.cc b/cc/benchmarks/micro_benchmark.cc index 448c62d..5f23e66 100644 --- a/cc/benchmarks/micro_benchmark.cc +++ b/cc/benchmarks/micro_benchmark.cc
@@ -34,8 +34,6 @@ is_done_ = true; } -void MicroBenchmark::RunOnLayer(Layer* layer) {} - void MicroBenchmark::RunOnLayer(PictureLayer* layer) {} bool MicroBenchmark::ProcessMessage(std::unique_ptr<base::Value> value) {
diff --git a/cc/benchmarks/micro_benchmark.h b/cc/benchmarks/micro_benchmark.h index 918e78d4..9139564 100644 --- a/cc/benchmarks/micro_benchmark.h +++ b/cc/benchmarks/micro_benchmark.h
@@ -16,11 +16,10 @@ } // namespace base namespace cc { - -class Layer; class LayerTreeHost; class PictureLayer; class MicroBenchmarkImpl; + class CC_EXPORT MicroBenchmark { public: using DoneCallback = base::OnceCallback<void(std::unique_ptr<base::Value>)>; @@ -33,7 +32,6 @@ int id() const { return id_; } void set_id(int id) { id_ = id; } - virtual void RunOnLayer(Layer* layer); virtual void RunOnLayer(PictureLayer* layer); virtual bool ProcessMessage(std::unique_ptr<base::Value> value);
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index dcc71214..b23f1083 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc
@@ -1230,8 +1230,6 @@ layer->SetHasWillChangeTransformHint(has_will_change_transform_hint()); layer->SetNeedsPushProperties(); - layer->SetTrilinearFiltering(trilinear_filtering()); - // Reset any state that should be cleared for the next update. needs_show_scrollbars_ = false; subtree_property_changed_ = false; @@ -1365,6 +1363,11 @@ if (inputs_.trilinear_filtering == trilinear_filtering) return; inputs_.trilinear_filtering = trilinear_filtering; + // When true, makes a RenderSurface which makes an effect node. + SetPropertyTreesNeedRebuild(); + // Adding a RenderSurface may change how things in the subtree appear, since + // it flattens transforms. + SetSubtreePropertyChanged(); SetNeedsCommit(); } @@ -1394,9 +1397,7 @@ parent()->AddDrawableDescendants(num); } -void Layer::RunMicroBenchmark(MicroBenchmark* benchmark) { - benchmark->RunOnLayer(this); -} +void Layer::RunMicroBenchmark(MicroBenchmark* benchmark) {} void Layer::SetElementId(ElementId id) { DCHECK(IsPropertyChangeAllowed());
diff --git a/cc/layers/layer.h b/cc/layers/layer.h index f5207ea9..ff1e60c 100644 --- a/cc/layers/layer.h +++ b/cc/layers/layer.h
@@ -82,8 +82,15 @@ SINGLE_TEXTURE_MASK, }; + // Factory to create a new Layer, with a unique id. static scoped_refptr<Layer> Create(); + // Sets an optional client on this layer, that will be called when relevant + // events happen. The client is a WeakPtr so it can be destroyed without + // unsetting itself as the client. + void SetLayerClient(base::WeakPtr<LayerClient> client); + LayerClient* GetLayerClientForTesting() const { return inputs_.client.get(); } + // A unique and stable id for the Layer. Ids are always positive. int id() const { return inputs_.layer_id; } @@ -538,15 +545,6 @@ void SetHideLayerAndSubtree(bool hide); bool hide_layer_and_subtree() const { return inputs_.hide_layer_and_subtree; } - void UpdateDebugInfo(); - - void SetLayerClient(base::WeakPtr<LayerClient> client); - LayerClient* GetLayerClientForTesting() const { return inputs_.client.get(); } - - virtual sk_sp<SkPicture> GetPicture() const; - - virtual void RunMicroBenchmark(MicroBenchmark* benchmark); - // The index of this layer's node in the various property trees. These are // only valid after a main frame, when Update() is called on the layer, and // remain valid and in in the same state until the next main frame, or until @@ -562,11 +560,11 @@ void SetHasTransformNode(bool val) { has_transform_node_ = val; } bool has_transform_node() { return has_transform_node_; } - void SetOffsetToTransformParent(gfx::Vector2dF offset); - gfx::Vector2dF offset_to_transform_parent() const { - return offset_to_transform_parent_; - } - + // Sets that the content shown in this layer may be a video. This may be used + // by the system compositor to distinguish between animations updating the + // screen and video, which the user would be watching. This allows + // optimizations like turning off the display when video is not playing, + // without interfering with video playback. void SetMayContainVideo(bool yes); // Stable identifier for clients. See comment in cc/trees/element_id.h. @@ -584,16 +582,35 @@ return inputs_.has_will_change_transform_hint; } + // Sets or gets if trilinear filtering should be used to scaling the contents + // of this layer and its subtree. When set the layer and its subtree will be + // composited together as a single unit, mip maps will be generated of the + // subtree together, and trilinear filtering applied when supported, if + // scaling during composite of the content from this layer and its subtree + // into the target. void SetTrilinearFiltering(bool trilinear_filtering); bool trilinear_filtering() const { return inputs_.trilinear_filtering; } - ElementListType GetElementTypeForAnimation() const; - - void SetScrollbarsHiddenFromImplSide(bool hidden); - // Called on the scroll layer to trigger showing the overlay scrollbars. void ShowScrollbars() { needs_show_scrollbars_ = true; } + // For tracing. Gets a recorded rasterization of this layer's contents that + // can be displayed inside representations of this layer. May return null, in + // which case the layer won't be shown with any content in the tracing + // display. + virtual sk_sp<SkPicture> GetPicture() const; + + // For tracing. Calls out to the LayerClient to get tracing data that will + // be attached to this layer's tracing outputs under the 'debug_info' key. + void UpdateDebugInfo(); + + // For telemetry testing. Runs a given test behaviour implemented in + // |benchmark| for this layer. The base class does nothing as benchmarks + // only exist for subclass layer types. For each subclass that the + // MicroBenchmark supports, the class should override this method and run the + // |benchmark| against this layer. + virtual void RunMicroBenchmark(MicroBenchmark* benchmark); + // Internal method to create the compositor thread type for this Layer. // Subclasses should override this method if they want to return their own // subclass of LayerImpl instead. @@ -656,6 +673,11 @@ // was called before it. void SetNeedsPushProperties(); + // Internal method to call the LayerClient, if there is one, to inform it when + // overlay scrollbars have been completely hidden (due to lack of scrolling by + // the user). + void SetScrollbarsHiddenFromImplSide(bool hidden); + // Internal to property tree construction. A generation number for the // property trees, to verify the layer's indices are pointers into the trees // currently held by the LayerTreeHost. The number is updated when property @@ -674,6 +696,15 @@ void SetEffectTreeIndex(int index); void SetScrollTreeIndex(int index); + // Internal to property tree construction. Set or get the position of this + // layer relative to the origin after transforming according to this layer's + // index into the transform tree. This translation is appended to the + // transform that comes from the transform tree for this layer. + void SetOffsetToTransformParent(gfx::Vector2dF offset); + gfx::Vector2dF offset_to_transform_parent() const { + return offset_to_transform_parent_; + } + // Internal to property tree construction. Indicates that a property changed // on this layer that may affect the position or content of all layers in this // layer's subtree, including itself. This causes the layer's subtree to be @@ -681,6 +712,11 @@ void SetSubtreePropertyChanged(); bool subtree_property_changed() const { return subtree_property_changed_; } + // Internal to property tree construction. Returns ElementListType::ACTIVE + // as main thread layers do not have a pending/active tree split, and + // animations should run normally on the main thread layer tree. + ElementListType GetElementTypeForAnimation() const; + // Internal to property tree construction. Whether this layer may animate its // opacity on the compositor thread. Layer subclasses may override this to // report true. If true, assumptions about opacity can not be made on the main @@ -718,8 +754,9 @@ protected: friend class LayerImpl; friend class TreeSynchronizer; - virtual ~Layer(); + Layer(); + virtual ~Layer(); // These SetNeeds functions are in order of severity of update: // @@ -741,11 +778,18 @@ // Will recalculate whether the layer draws content and set draws_content_ // appropriately. void UpdateDrawsContent(bool has_drawable_content); + // May be overridden by subclasses if they have optional content, to return + // false if there is no content to be displayed. If they do have content, then + // they should return the value from this base class method. virtual bool HasDrawableContent() const; // Called when the layer's number of drawable descendants changes. void AddDrawableDescendants(int num); + // For debugging. Returns false if the LayerTreeHost this layer is attached to + // is in the process of updating layers for a BeginMainFrame. Layer properties + // should be changed by the client before the BeginMainFrame, and should not + // be changed while the frame is being generated for commit. bool IsPropertyChangeAllowed() const; // When true, the layer is about to perform an update. Any commit requests
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index 6514c1e..1bb2bb14 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -74,7 +74,6 @@ current_draw_mode_(DRAW_MODE_NONE), debug_info_(nullptr), has_will_change_transform_hint_(false), - trilinear_filtering_(false), needs_push_properties_(false), scrollbars_hidden_(false), needs_show_scrollbars_(false), @@ -101,10 +100,6 @@ has_will_change_transform_hint_ = has_will_change; } -void LayerImpl::SetTrilinearFiltering(bool trilinear_filtering) { - trilinear_filtering_ = trilinear_filtering; -} - ElementListType LayerImpl::GetElementTypeForAnimation() const { return IsActive() ? ElementListType::ACTIVE : ElementListType::PENDING; } @@ -325,7 +320,6 @@ layer->clip_tree_index_ = clip_tree_index_; layer->scroll_tree_index_ = scroll_tree_index_; layer->has_will_change_transform_hint_ = has_will_change_transform_hint_; - layer->trilinear_filtering_ = trilinear_filtering_; layer->scrollbars_hidden_ = scrollbars_hidden_; if (needs_show_scrollbars_) layer->needs_show_scrollbars_ = needs_show_scrollbars_; @@ -761,8 +755,6 @@ state->SetBoolean("has_will_change_transform_hint", has_will_change_transform_hint()); - state->SetBoolean("trilinear_filtering", trilinear_filtering()); - MainThreadScrollingReason::AddToTracedValue(main_thread_scrolling_reasons_, *state);
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h index f5be788..6da1d68 100644 --- a/cc/layers/layer_impl.h +++ b/cc/layers/layer_impl.h
@@ -430,9 +430,6 @@ return has_will_change_transform_hint_; } - void SetTrilinearFiltering(bool trilinear_filtering); - bool trilinear_filtering() const { return trilinear_filtering_; } - ElementListType GetElementTypeForAnimation() const; void set_needs_show_scrollbars(bool yes) { needs_show_scrollbars_ = yes; } @@ -567,7 +564,6 @@ base::trace_event::TracedValue* debug_info_; bool has_will_change_transform_hint_ : 1; - bool trilinear_filtering_ : 1; bool needs_push_properties_ : 1; bool scrollbars_hidden_ : 1;
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc index 127d1d3..d8c5f96 100644 --- a/cc/layers/layer_unittest.cc +++ b/cc/layers/layer_unittest.cc
@@ -338,6 +338,22 @@ grand_child->PushPropertiesTo(grand_child_impl.get())); EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetTrilinearFiltering(true)); + EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( + root->PushPropertiesTo(root_impl.get()); + child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); + grand_child->PushPropertiesTo(grand_child_impl.get())); + + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); + EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetTrilinearFiltering(false)); + EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( + root->PushPropertiesTo(root_impl.get()); + child->PushPropertiesTo(child_impl.get()); + child2->PushPropertiesTo(child2_impl.get()); + grand_child->PushPropertiesTo(grand_child_impl.get())); + + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(1); EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->SetDoubleSided(false)); EXECUTE_AND_VERIFY_SUBTREE_CHANGES_RESET( root->PushPropertiesTo(root_impl.get());
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 5d327b9..c1e556b 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -212,6 +212,7 @@ "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_cast_java", + "$google_play_services_package:google_play_services_fido_java", "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_iid_java", "$google_play_services_package:google_play_services_tasks_java", @@ -457,6 +458,7 @@ "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_cast_java", + "$google_play_services_package:google_play_services_fido_java", "//base:base_java", "//base:base_java_test_support", "//base:base_junit_test_support", @@ -533,6 +535,7 @@ "$google_play_services_package:google_play_services_base_java", "$google_play_services_package:google_play_services_basement_java", "$google_play_services_package:google_play_services_cast_java", + "$google_play_services_package:google_play_services_fido_java", "$google_play_services_package:google_play_services_gcm_java", "$google_play_services_package:google_play_services_iid_java", "$google_play_services_package:google_play_services_tasks_java",
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java index 5334bc64..e734ad3 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/StreamLifecycleManager.java
@@ -11,6 +11,7 @@ import org.chromium.base.ActivityState; import org.chromium.base.ApplicationStatus; +import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabObserver; @@ -160,7 +161,7 @@ /** Calls {@link Stream#onHide()}. */ private void hide() { - if (mStreamState == HIDDEN || mStreamState == DESTROYED) return; + if (mStreamState == HIDDEN || mStreamState == CREATED || mStreamState == DESTROYED) return; deactivate(); mStreamState = HIDDEN; @@ -180,4 +181,9 @@ ApplicationStatus.unregisterActivityStateListener(this); mStream.onDestroy(); } + + @VisibleForTesting + TabObserver getTabObserverForTesting() { + return mTabObserver; + } }
diff --git a/chrome/android/java/res/drawable/infobar_download_complete_animation.xml b/chrome/android/java/res/drawable/infobar_download_complete_animation.xml index 647b9c7..bfd9f28d 100644 --- a/chrome/android/java/res/drawable/infobar_download_complete_animation.xml +++ b/chrome/android/java/res/drawable/infobar_download_complete_animation.xml
@@ -17,7 +17,7 @@ <path android:name="circle" - android:fillColor="@android:color/transparent" + android:fillColor="@color/google_blue_50" android:pathData="M 0,12 C 0,6 6,0 12,0 C 18,0 24,6 24,12 C 24,18 18,24 12,24 C 6,24 0,18 0,12"/> <path @@ -32,11 +32,18 @@ <aapt:attr name="android:animation"> <set android:ordering="sequentially"> <objectAnimator - android:duration="800" + android:duration="100" android:interpolator="@android:interpolator/linear" - android:propertyName="fillColor" - android:valueFrom="@color/google_blue_50" - android:valueTo="@android:color/transparent"/> + android:propertyName="fillAlpha" + android:valueFrom="0" + android:valueTo="1"/> + <objectAnimator + android:duration="500" + android:startOffset="300" + android:interpolator="@android:interpolator/linear" + android:propertyName="fillAlpha" + android:valueFrom="1" + android:valueTo="0"/> </set> </aapt:attr> </target>
diff --git a/chrome/android/java/res/drawable/infobar_downloading_fill_animation.xml b/chrome/android/java/res/drawable/infobar_downloading_fill_animation.xml index 6c4f9f9f..f1e96f4e 100644 --- a/chrome/android/java/res/drawable/infobar_downloading_fill_animation.xml +++ b/chrome/android/java/res/drawable/infobar_downloading_fill_animation.xml
@@ -64,6 +64,12 @@ <aapt:attr name="android:animation"> <set android:ordering="sequentially"> <objectAnimator + android:duration="0" + android:interpolator="@android:interpolator/linear" + android:propertyName="fillColor" + android:valueFrom="@color/google_blue_500" + android:valueTo="@color/google_blue_500"/> + <objectAnimator android:duration="@integer/download_infobar_fill_out_delay" android:startOffset="@integer/download_infobar_fill_in_delay" android:interpolator="@android:interpolator/linear"
diff --git a/chrome/android/java/res/layout/new_tab_page_incognito.xml b/chrome/android/java/res/layout/new_tab_page_incognito.xml index eefc796..7c31d89 100644 --- a/chrome/android/java/res/layout/new_tab_page_incognito.xml +++ b/chrome/android/java/res/layout/new_tab_page_incognito.xml
@@ -46,8 +46,7 @@ android:layout_height="wrap_content" android:fontFamily="sans-serif-light" android:text="@string/new_tab_incognito_header" - android:textColor="@color/incognito_ntp_header" - android:textSize="24sp" /> + android:textAppearance="@style/WhiteHeadlineIncognito" /> <TextView android:id="@+id/new_tab_incognito_message" @@ -56,16 +55,14 @@ android:layout_height="wrap_content" android:layout_marginTop="32dp" android:layout_marginBottom="10dp" - android:text="@null" - android:textColor="@color/google_grey_400" /> + android:text="@null" /> <TextView android:id="@+id/learn_more" style="@style/IncognitoNewTabLearnMoreLink" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/learn_more" - android:textColor="@color/incognito_ntp_learn_more_link" /> + android:text="@string/learn_more" /> </LinearLayout>
diff --git a/chrome/android/java/res/layout/new_tab_page_incognito_md.xml b/chrome/android/java/res/layout/new_tab_page_incognito_md.xml index 62465fec..fca75f99 100644 --- a/chrome/android/java/res/layout/new_tab_page_incognito_md.xml +++ b/chrome/android/java/res/layout/new_tab_page_incognito_md.xml
@@ -41,14 +41,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/new_tab_otr_title" - android:textColor="@color/incognito_header" /> + android:textAppearance="@style/WhiteHeadlineIncognito" /> <TextView android:id="@+id/new_tab_incognito_subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@string/new_tab_otr_subtitle" - android:textColor="@color/incognito_header" + android:textAppearance="@style/WhiteBodyIncognito" android:lineSpacingExtra="@dimen/md_incognito_ntp_line_spacing" /> <LinearLayout @@ -62,14 +61,14 @@ android:id="@+id/new_tab_incognito_features" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="@color/incognito_text" + android:textAppearance="@style/WhiteBodyIncognito" android:lineSpacingExtra="@dimen/md_incognito_ntp_line_spacing" /> <TextView android:id="@+id/new_tab_incognito_warning" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textColor="@color/incognito_text" + android:textAppearance="@style/WhiteBodyIncognito" android:lineSpacingExtra="@dimen/md_incognito_ntp_line_spacing" /> </LinearLayout> @@ -81,7 +80,7 @@ android:clickable="true" android:focusable="true" android:text="@string/learn_more" - android:textColor="@color/google_blue_300" + android:textAppearance="@style/BlueButtonText1" android:lineSpacingExtra="@dimen/md_incognito_ntp_line_spacing" /> </LinearLayout>
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml index a6f984db..a9af85a 100644 --- a/chrome/android/java/res/values-v17/styles.xml +++ b/chrome/android/java/res/values-v17/styles.xml
@@ -720,14 +720,14 @@ <!-- Incognito New Tab Page --> <style name="IncognitoNewTabMessage"> <item name="android:maxWidth">660dp</item> - <item name="android:textSize">14sp</item> + <item name="android:textAppearance">@style/WhiteBodyIncognito</item> <item name="android:lineSpacingMultiplier">1.2</item> </style> - <style name="IncognitoNewTabLearnMoreLink" parent="RobotoMediumStyle"> + <style name="IncognitoNewTabLearnMoreLink"> <item name="android:background">?attr/listChoiceBackgroundIndicator</item> <item name="android:clickable">true</item> <item name="android:focusable">true</item> - <item name="android:textSize">14sp</item> + <item name="android:textAppearance">@style/BlueButtonText1</item> <item name="android:textAllCaps">true</item> <item name="android:padding">16dp</item> </style>
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index 8ab8261..656d04f6 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml
@@ -79,7 +79,7 @@ <!-- Omnibox Suggestion colors --> <color name="suggestion_url_dark_modern">@color/google_blue_500</color> - <color name="suggestion_url_light_modern">@color/google_blue_300</color> + <color name="suggestion_url_light_modern">@color/modern_blue_300</color> <color name="suggestion_url_light">#5595FE</color> <color name="answers_description_text_negative">@color/google_red_700</color> <color name="answers_description_text_positive">@color/google_green_700</color> @@ -116,7 +116,7 @@ <!-- NTP and Home sheet colors. Also used on the bookmarks and recent tabs pages. --> <color name="ntp_bg">@color/default_primary_color</color> - <color name="ntp_bg_incognito">#222222</color> + <color name="ntp_bg_incognito">@color/incognito_modern_primary_color</color> <color name="snippets_publisher_name_color">#646464</color> <color name="snippets_text_color">#646464</color> <color name="snippets_list_header_text_color">#646464</color> @@ -125,11 +125,7 @@ <color name="suggestions_offline_badge_tint">@color/google_blue_500</color> <!-- Incognito NTP Colors. --> - <color name="incognito_text">#B3FFFFFF</color> <color name="incognito_emphasis">@android:color/white</color> - <color name="incognito_header">#CCFFFFFF</color> - <color name="incognito_ntp_learn_more_link">#03A9F4</color> - <color name="incognito_ntp_header">#D2D2D2</color> <!-- Contextual Search colors --> <color name="contextual_search_promo_background_color">@color/google_grey_200</color> @@ -149,7 +145,7 @@ <!-- LocationBar colors --> <color name="locationbar_dark_hint_text">@color/search_box_hint</color> - <color name="locationbar_light_hint_text">@color/white_alpha_70</color> + <color name="locationbar_light_hint_text">@color/modern_grey_400</color> <color name="locationbar_light_selection_color">#CC5595FE</color> <color name="locationbar_status_color">@color/black_alpha_54</color> <color name="locationbar_status_color_light">@android:color/white</color>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java index 48fb6202d..6981f5b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -14,7 +14,6 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.SystemClock; import android.provider.Browser; @@ -1072,28 +1071,30 @@ @VisibleForTesting static String maybeAddAdditionalExtraHeaders(Intent intent, String url, String extraHeaders) { - // On Oreo, ContentResolver.getType(contentUri) returns "application/octet-stream", instead - // of the registered MIME type when opening a document from Downloads. To work around this, - // we pass the intent type in extra headers such that content request job can get it. - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return extraHeaders; + // For some apps, ContentResolver.getType(contentUri) returns "application/octet-stream", + // instead of the registered MIME type when opening a document from Downloads. To work + // around this, we pass the intent type in extra headers such that content request job can + // get it. if (intent == null || url == null) return extraHeaders; String scheme = getSanitizedUrlScheme(url); if (!TextUtils.equals(scheme, UrlConstants.CONTENT_SCHEME)) return extraHeaders; - Uri uri = Uri.parse(url); - if (uri == null - || !"com.android.providers.downloads.documents".equals(uri.getAuthority())) { - return extraHeaders; - } - String type = intent.getType(); if (type == null || type.isEmpty()) return extraHeaders; + // Only override the type for MHTML related types, which some applications get wrong. + if (!isMhtmlMimeType(type)) return extraHeaders; + String typeHeader = "X-Chrome-intent-type: " + type; return (extraHeaders == null) ? typeHeader : (extraHeaders + "\n" + typeHeader); } + /** Return true if the type is one of the Mime types used for MHTML */ + static boolean isMhtmlMimeType(String type) { + return type.equals("multipart/related") || type.equals("message/rfc822"); + } + /** * @param intent An Intent to be checked. * @return Whether the intent has an file:// or content:// URL with MHTML MIME type. @@ -1107,7 +1108,7 @@ boolean isFileUriScheme = TextUtils.equals(scheme, UrlConstants.FILE_SCHEME); if (!isContentUriScheme && !isFileUriScheme) return false; String type = intent.getType(); - if (type != null && (type.equals("multipart/related") || type.equals("message/rfc822"))) { + if (type != null && isMhtmlMimeType(type)) { return true; } // Note that "application/octet-stream" type may be passed by some apps that do not know
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabState.java b/chrome/android/java/src/org/chromium/chrome/browser/TabState.java index 26982e3..feba65f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/TabState.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/TabState.java
@@ -16,7 +16,6 @@ import org.chromium.chrome.browser.crypto.CipherFactory; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.ColorUtils; -import org.chromium.components.sync.SyncConstants; import org.chromium.content_public.browser.WebContents; import java.io.BufferedOutputStream; @@ -136,7 +135,6 @@ /** Navigation history of the WebContents. */ public WebContentsState contentsState; public int parentId = Tab.INVALID_TAB_ID; - public long syncId; public long timestampMillis = TIMESTAMP_NOT_SET; public String openerAppId; @@ -268,11 +266,9 @@ + "version " + tabState.contentsState.version()); } try { - tabState.syncId = stream.readLong(); + // Skip obsolete sync ID. + stream.readLong(); } catch (EOFException eof) { - tabState.syncId = SyncConstants.INVALID_TAB_NODE_ID; - // Could happen if reading a version of TabState without syncId. - Log.w(TAG, "Failed to read syncId from tab state. Assuming syncId is: -1"); } try { tabState.shouldPreserve = stream.readBoolean(); @@ -355,7 +351,7 @@ dataOutputStream.writeInt(state.parentId); dataOutputStream.writeUTF(state.openerAppId != null ? state.openerAppId : ""); dataOutputStream.writeInt(state.contentsState.version()); - dataOutputStream.writeLong(state.syncId); + dataOutputStream.writeLong(-1); // Obsolete sync ID. dataOutputStream.writeBoolean(state.shouldPreserve); dataOutputStream.writeInt(state.themeColor); } catch (FileNotFoundException e) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionActivity.java index 5b03d731..bf5dbc22 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionActivity.java
@@ -21,6 +21,7 @@ import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.contextmenu.ContextMenuParams; +import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory; import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.browser.gsa.GSAState; import org.chromium.chrome.browser.init.AsyncInitializationActivity; @@ -169,6 +170,7 @@ @Override public void finishNativeInitialization() { super.finishNativeInitialization(); + OfflineContentAggregatorNotificationBridgeUiFactory.instance(); recordClientPackageName(); mHelper.onNativeInitialized(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java index 6db72eb..520a5db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -15,6 +15,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeVersionInfo; import org.chromium.chrome.browser.WebContentsFactory; +import org.chromium.chrome.browser.content.ContentUtils; import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager; import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler; import org.chromium.chrome.browser.tab.Tab; @@ -318,6 +319,7 @@ OverlayViewDelegate delegate = new OverlayViewDelegate(cv); mContentViewCore = ContentViewCore.create(mActivity, ChromeVersionInfo.getProductVersion(), mWebContents, delegate, cv, mActivity.getWindowAndroid()); + ContentUtils.setUserAgentOverride(mWebContents); // Transfers the ownership of the WebContents to the native OverlayPanelContent. nativeSetWebContents(mNativeOverlayPanelContentPtr, mWebContents, mWebContentsDelegate);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/content/ContentUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/content/ContentUtils.java index 3c016c3..4bec637 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/content/ContentUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/content/ContentUtils.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.content; +import org.chromium.content_public.browser.WebContents; + /** * A utility class to expose content functionality. */ @@ -15,5 +17,16 @@ return nativeGetBrowserUserAgent(); } + /** + * Set the user agent used for override. Currently, the only use case we have + * for overriding a user agent involves spoofing a desktop Linux user agent + * for "Request desktop site". Set it for WebContents so that it is available + * when a NavigationEntry requires the user agent to be overridden. + */ + public static void setUserAgentOverride(WebContents webContents) { + nativeSetUserAgentOverride(webContents); + } + private static native String nativeGetBrowserUserAgent(); + private static native void nativeSetUserAgentOverride(WebContents webContents); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java index fa18197..0888b0a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java
@@ -20,38 +20,22 @@ public class ExploreSitesBridge { private static final String TAG = "ExploreSitesBridge"; - private long mNativeExploreSitesBridge; - - /** - * Creates an explore sites bridge for a given profile. - */ - public ExploreSitesBridge(Profile profile) { - mNativeExploreSitesBridge = nativeInit(profile); - } - /** * Fetches a JSON string from URL, returning the parsed JSONobject in a callback. + * This will cancel any pending JSON fetches. */ - public void getNtpCategories(final Callback<List<ExploreSitesCategoryTile>> callback) { + public static void getNtpCategories( + Profile profile, final Callback<List<ExploreSitesCategoryTile>> callback) { List<ExploreSitesCategoryTile> result = new ArrayList<>(); - nativeGetNtpCategories(mNativeExploreSitesBridge, "", result, callback); + nativeGetNtpCategories(profile, result, callback); } /** * Fetches an icon from a url and returns in a Bitmap image. */ - public void getIcon(final String iconUrl, final Callback<Bitmap> callback) {} + public static void getIcon(final String iconUrl, final Callback<Bitmap> callback) {} - /** - * Destroys the native object. Call only when no longer needed. - */ - public void destroy() { - nativeDestroy(mNativeExploreSitesBridge); - } - - private native long nativeInit(Profile profile); - private native void nativeGetNtpCategories(long nativeExploreSitesBridge, String url, + private static native void nativeGetNtpCategories(Profile profile, List<ExploreSitesCategoryTile> result, Callback<List<ExploreSitesCategoryTile>> callback); - private native void nativeDestroy(long nativeExploreSitesBridge); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryTile.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryTile.java index c3c26c8..cfc6431 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryTile.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryTile.java
@@ -6,10 +6,16 @@ import android.graphics.drawable.Drawable; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; + +import java.util.List; + /** * Class encapsulating data needed to render a category tile for explore sites section * on the NTP. */ +@JNINamespace("explore_sites") public class ExploreSitesCategoryTile { private String mNavigationUrl; private String mIconUrl; @@ -47,4 +53,10 @@ public Drawable getIconDrawable() { return mIconDrawable; } + + @CalledByNative + private static void createInList(List<ExploreSitesCategoryTile> resultList, + String navigationUrl, String iconUrl, String categoryName) { + resultList.add(new ExploreSitesCategoryTile(categoryName, iconUrl, navigationUrl)); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java index d4b3875..8bf7b70 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesSection.java
@@ -25,28 +25,27 @@ public class ExploreSitesSection { private static final int ICON_CORNER_RADIUS = 5; - private ExploreSitesBridge mBridge; + private Profile mProfile; private SuggestionsNavigationDelegate mNavigationDelegate; private View mExploreSection; private LinearLayout mCategorySection; private AtomicInteger mCategoryIconFetchesInFlight; - public ExploreSitesSection( View view, Profile profile, SuggestionsNavigationDelegate navigationDelegate) { - mBridge = new ExploreSitesBridge(profile); + mProfile = profile; mExploreSection = view; + mNavigationDelegate = navigationDelegate; initialize(); } private void initialize() { mCategorySection = mExploreSection.findViewById(R.id.explore_sites_tiles); - mBridge.getNtpCategories(this ::initializeTiles); + ExploreSitesBridge.getNtpCategories(mProfile, this::initializeTiles); } private void initializeTiles(List<ExploreSitesCategoryTile> tileList) { if (tileList.isEmpty()) { - mBridge.destroy(); return; } mCategoryIconFetchesInFlight = new AtomicInteger(tileList.size()); @@ -61,15 +60,13 @@ (View v) -> mNavigationDelegate.navigateToSuggestionUrl( WindowOpenDisposition.CURRENT_TAB, tile.getNavigationUrl())); - mBridge.getIcon(tile.getIconUrl(), (Bitmap icon) -> onIconRetrieved(tileView, icon)); + ExploreSitesBridge.getIcon( + tile.getIconUrl(), (Bitmap icon) -> onIconRetrieved(tileView, icon)); } } private void onIconRetrieved(ExploreSitesCategoryTileView tileView, Bitmap icon) { tileView.updateIcon(ViewUtils.createRoundedBitmapDrawable(icon, ICON_CORNER_RADIUS)); - int curValue = mCategoryIconFetchesInFlight.decrementAndGet(); - if (curValue == 0) { - mBridge.destroy(); - } + mCategoryIconFetchesInFlight.decrementAndGet(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotController.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotController.java index ec4049c..567b5ed2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotController.java
@@ -8,6 +8,7 @@ import android.view.WindowManager; import org.chromium.base.VisibleForTesting; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior.OverviewModeObserver; import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver; @@ -91,8 +92,13 @@ @VisibleForTesting boolean isShowingIncognito() { boolean isInIncognitoModel = mTabModelSelector.getCurrentModel().isIncognito(); - // Chrome Home is in overview mode when creating new tabs. - return isInIncognitoModel || (mInOverviewMode && getIncognitoTabCount() > 0); + + // If we're using the overlapping tab switcher, we show the edge of the open incognito tabs + // even if the tab switcher is showing the normal stack. But if the horizontal tab switcher + // is enabled, incognito tabs are not visible while we're showing the normal tabs. + return isInIncognitoModel + || (!ChromeFeatureList.isEnabled(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID) + && mInOverviewMode && getIncognitoTabCount() > 0); } // Set in overview mode for testing.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java index 416e69c..9355ad5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DownloadProgressInfoBar.java
@@ -12,6 +12,7 @@ import android.view.View; import android.widget.TextView; +import org.chromium.base.ThreadUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.chrome.R; import org.chromium.chrome.browser.download.DownloadInfoBarController; @@ -144,9 +145,10 @@ } private void restartIconAnimation() { - if (mAnimatedDrawable == null) return; - - mAnimatedDrawable.start(); + ThreadUtils.postOnUiThread(() -> { + if (mAnimatedDrawable == null) return; + mAnimatedDrawable.start(); + }); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageViewMD.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageViewMD.java index e5f004c..abd3de3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageViewMD.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageViewMD.java
@@ -50,7 +50,6 @@ private static final int BULLETPOINTS_HORIZONTAL_SPACING_DP = 40; private static final int CONTENT_WIDTH_DP = 600; private static final int WIDE_LAYOUT_THRESHOLD_DP = 720; - private static final int CHROME_HOME_LEARN_MORE_BOTTOM_PADDING_DP = 8; private static class IncognitoBulletSpan extends BulletSpan { public IncognitoBulletSpan() { @@ -303,7 +302,7 @@ SpannableString textWithLearnMoreLink = new SpannableString(concatenatedText.toString()); NoUnderlineClickableSpan span = new NoUnderlineClickableSpan( - R.color.google_blue_300, (view) -> getManager().loadIncognitoLearnMore()); + R.color.modern_blue_300, (view) -> getManager().loadIncognitoLearnMore()); textWithLearnMoreLink.setSpan( span, subtitleText.length() + 1, textWithLearnMoreLink.length(), 0 /* flags */); mSubtitle.setText(textWithLearnMoreLink);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 24d65850..8d1c956 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -58,6 +58,7 @@ import org.chromium.chrome.browser.WebContentsFactory; import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.content.ContentUtils; import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; import org.chromium.chrome.browser.contextualsearch.ContextualSearchTabHelper; import org.chromium.chrome.browser.crypto.CipherFactory; @@ -101,7 +102,6 @@ import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.security_state.ConnectionSecurityLevel; -import org.chromium.components.sync.SyncConstants; import org.chromium.content_public.browser.ChildProcessImportance; import org.chromium.content_public.browser.ContentViewCore; import org.chromium.content_public.browser.GestureListenerManager; @@ -193,9 +193,6 @@ /** Controls overscroll pull-to-refresh behavior for this tab. */ private SwipeRefreshHandler mSwipeRefreshHandler; - /** The sync id of the Tab if session sync is enabled. */ - private int mSyncId = SyncConstants.INVALID_TAB_NODE_ID; - /** {@link ContentViewCore} showing the current page, or {@code null} if the tab is frozen. */ private ContentViewCore mContentViewCore; @@ -668,7 +665,6 @@ assert state != null; mAppAssociatedWith = state.openerAppId; mFrozenContentsState = state.contentsState; - mSyncId = (int) state.syncId; mShouldPreserve = state.shouldPreserve; mTimestampMillis = state.timestampMillis; mUrl = state.getVirtualUrlFromState(); @@ -779,8 +775,7 @@ // from the native? params.getReferrer() != null ? params.getReferrer().getPolicy() : 0, params.getIsRendererInitiated(), params.getShouldReplaceCurrentEntry(), - params.getIntentReceivedTimestamp(), params.getHasUserGesture(), - params.getShouldClearHistoryList()); + params.getHasUserGesture(), params.getShouldClearHistoryList()); for (TabObserver observer : mObservers) { observer.onLoadUrl(this, params, loadType); @@ -928,7 +923,6 @@ tabState.openerAppId = mAppAssociatedWith; tabState.parentId = mParentId; tabState.shouldPreserve = mShouldPreserve; - tabState.syncId = mSyncId; tabState.timestampMillis = mTimestampMillis; tabState.themeColor = getThemeColor(); return tabState; @@ -1196,22 +1190,6 @@ } /** - * @return The sync id of the tab if session sync is enabled, {@code 0} otherwise. - */ - @CalledByNative - private int getSyncId() { - return mSyncId; - } - - /** - * @param syncId The sync id of the tab if session sync is enabled. - */ - @CalledByNative - private void setSyncId(int syncId) { - mSyncId = syncId; - } - - /** * @return An {@link ObserverList.RewindableIterator} instance that points to all of * the current {@link TabObserver}s on this class. Note that calling * {@link java.util.Iterator#remove()} will throw an @@ -1833,6 +1811,7 @@ } mWebContents = webContents; + ContentUtils.setUserAgentOverride(mWebContents); mContentViewCore = cvc; mContentView = webContents.getViewAndroidDelegate().getContainerView(); @@ -1847,15 +1826,15 @@ mDownloadDelegate = new ChromeDownloadDelegate(mThemedApplicationContext, this); - WebContents parentWebContents = null; - if (getParentId() != INVALID_TAB_ID) { - Tab parentTab = getTabModelSelector().getTabById(getParentId()); - if (parentTab != null && parentTab.isIncognito() == isIncognito()) { - parentWebContents = parentTab.getWebContents(); + int parentId = getParentId(); + if (parentId != INVALID_TAB_ID) { + Tab parentTab = getTabModelSelector().getTabById(parentId); + if (parentTab != null && parentTab.isIncognito() != isIncognito()) { + parentId = INVALID_TAB_ID; } } - initWebContents(mWebContents, parentWebContents); + initWebContents(mWebContents, parentId); // In the case where restoring a Tab or showing a prerendered one we already have a // valid infobar container, no need to recreate one. @@ -1907,10 +1886,10 @@ } } - private void initWebContents(WebContents webContents, WebContents parentWebContents) { + private void initWebContents(WebContents webContents, int parentTabId) { assert mNativeTabAndroid != 0; - nativeInitWebContents(mNativeTabAndroid, mIncognito, mIsDetached, webContents, - parentWebContents, mWebContentsDelegate, + nativeInitWebContents(mNativeTabAndroid, mIncognito, mIsDetached, webContents, parentTabId, + mWebContentsDelegate, new TabContextMenuPopulator( mDelegateFactory.createContextMenuPopulator(this), this)); @@ -3519,7 +3498,7 @@ private native void nativeInit(); private native void nativeDestroy(long nativeTabAndroid); private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito, - boolean isBackgroundTab, WebContents webContents, WebContents parentWebContents, + boolean isBackgroundTab, WebContents webContents, int parentTabId, TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator); private native void nativeUpdateDelegates(long nativeTabAndroid, TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator); @@ -3530,7 +3509,7 @@ private native int nativeLoadUrl(long nativeTabAndroid, String url, String extraHeaders, ResourceRequestBody postData, int transition, String referrerUrl, int referrerPolicy, boolean isRendererInitiated, boolean shoulReplaceCurrentEntry, - long intentReceivedTimestamp, boolean hasUserGesture, boolean shouldClearHistoryList); + boolean hasUserGesture, boolean shouldClearHistoryList); private native void nativeSetActiveNavigationEntryTitleForUrl(long nativeTabAndroid, String url, String title); private native boolean nativePrint(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java index 8d4f60f9..135d532 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java
@@ -142,8 +142,6 @@ private TextView mUrlBar; protected View mUrlActionContainer; protected ImageView mToolbarShadow; - // TODO(twellington): Make this final after modern is always enabled for Chrome Home. - protected boolean mToolbarShadowPermanentlyHidden; private final int mProgressBackBackgroundColorWhite; @@ -1205,8 +1203,7 @@ if (mHomeButton != null) mHomeButton.setTranslationY(0); } - if (!mToolbarShadowPermanentlyHidden - && !(mLocationBar.useModernDesign() && mUrlFocusChangeInProgress)) { + if (!(mLocationBar.useModernDesign() && mUrlFocusChangeInProgress)) { mToolbarShadow.setAlpha( mLocationBar.useModernDesign() && mUrlBar.hasFocus() ? 0.f : 1.f); } @@ -1236,7 +1233,7 @@ boolean isExpanded = mUrlExpansionPercent > 0f; boolean useModern = mLocationBar.useModernDesign(); setAncestorsShouldClipChildren(!isExpanded); - if (!mToolbarShadowPermanentlyHidden && !(useModern && mUrlFocusChangeInProgress)) { + if (!(useModern && mUrlFocusChangeInProgress)) { float alpha = 0.f; if (useModern && !mUrlBar.hasFocus() && mNtpSearchBoxScrollPercent == 1.f) { alpha = 1.f; @@ -1831,7 +1828,7 @@ assert mTextureCaptureMode != textureMode; mTextureCaptureMode = textureMode; if (mTextureCaptureMode) { - if (!mToolbarShadowPermanentlyHidden) mToolbarShadow.setVisibility(VISIBLE); + if (!hideShadowForIncognitoNtp()) mToolbarShadow.setVisibility(VISIBLE); mPreTextureCaptureAlpha = getAlpha(); setAlpha(1); } else { @@ -2449,8 +2446,6 @@ * See {@link TransitionDrawable#reverseTransition(int)}. */ private void transitionShadowDrawable(boolean startTransition) { - if (mToolbarShadowPermanentlyHidden) return; - // Modern does not use a transition drawable for the shadow. if (mLocationBar.useModernDesign()) return; @@ -2471,8 +2466,6 @@ * Update the visibility of the toolbar shadow. */ protected void updateShadowVisibility() { - if (mToolbarShadowPermanentlyHidden) return; - boolean shouldDrawShadow = shouldDrawShadow(); int shadowVisibility = shouldDrawShadow ? View.VISIBLE : View.INVISIBLE; @@ -2485,7 +2478,14 @@ * @return Whether the toolbar shadow should be drawn. */ protected boolean shouldDrawShadow() { - return mTabSwitcherState == STATIC_TAB; + // TODO(twellington): Move this shadow state information to ToolbarDataProvider and show + // shadow when incognito NTP is scrolled. + return mTabSwitcherState == STATIC_TAB && !hideShadowForIncognitoNtp(); + } + + private boolean hideShadowForIncognitoNtp() { + return mLocationBar.useModernDesign() && isIncognito() + && NewTabPage.isNTPUrl(getToolbarDataProvider().getCurrentUrl()); } private VisualState computeVisualState(boolean isInTabSwitcherMode) {
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index a9458da..25ad620 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -2201,8 +2201,10 @@ } if (enable_feed_in_chrome) { - chrome_junit_test_java_sources += - [ "junit/src/org/chromium/chrome/browser/feed/FeedImageLoaderTest.java" ] + chrome_junit_test_java_sources += [ + "junit/src/org/chromium/chrome/browser/feed/FeedImageLoaderTest.java", + "junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java", + ] chrome_test_java_sources += feed_conformance_test_sources }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/IntentHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/IntentHandlerTest.java index 63a7355..baade2a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/IntentHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/IntentHandlerTest.java
@@ -7,7 +7,6 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.SystemClock; import android.provider.Browser; @@ -398,43 +397,43 @@ @SmallTest @Feature({"Android-AppBase"}) public void testMaybeAddAdditionalExtraHeaders() { - String downloadContentUrl = - "content://com.android.providers.downloads.documents/document/1"; - String otherContentUrl = "content://com.example.org/document/1"; + String contentUrl = "content://com.example.org/document/1"; Intent intent = new Intent(); Assert.assertNull(IntentHandler.maybeAddAdditionalExtraHeaders(null, null, null)); // Null URL. Assert.assertNull(IntentHandler.maybeAddAdditionalExtraHeaders(intent, null, null)); // Null intent. - Assert.assertNull( - IntentHandler.maybeAddAdditionalExtraHeaders(null, downloadContentUrl, null)); - // Non-download authority. - Assert.assertNull( - IntentHandler.maybeAddAdditionalExtraHeaders(intent, otherContentUrl, null)); + Assert.assertNull(IntentHandler.maybeAddAdditionalExtraHeaders(null, contentUrl, null)); // Null type. - Assert.assertNull( - IntentHandler.maybeAddAdditionalExtraHeaders(intent, downloadContentUrl, null)); + Assert.assertNull(IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, null)); // Empty type. intent.setType(""); - Assert.assertNull( - IntentHandler.maybeAddAdditionalExtraHeaders(intent, downloadContentUrl, null)); + Assert.assertNull(IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, null)); + // Type not used by MHTML. intent.setType("text/plain"); + Assert.assertNull(IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, null)); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - Assert.assertNull( - IntentHandler.maybeAddAdditionalExtraHeaders(intent, downloadContentUrl, null)); - Assert.assertEquals("Foo: bar", - IntentHandler.maybeAddAdditionalExtraHeaders( - intent, downloadContentUrl, "Foo: bar")); - } else { - Assert.assertEquals("X-Chrome-intent-type: text/plain", - IntentHandler.maybeAddAdditionalExtraHeaders(intent, downloadContentUrl, null)); - Assert.assertEquals("Foo: bar\nX-Chrome-intent-type: text/plain", - IntentHandler.maybeAddAdditionalExtraHeaders( - intent, downloadContentUrl, "Foo: bar")); - } + // MHTML type with no extra headers. + intent.setType("multipart/related"); + Assert.assertEquals("X-Chrome-intent-type: multipart/related", + IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, null)); + + // MHTML type with extra headers. + intent.setType("multipart/related"); + Assert.assertEquals("Foo: bar\nX-Chrome-intent-type: multipart/related", + IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, "Foo: bar")); + + // Different MHTML type. + intent.setType("message/rfc822"); + Assert.assertEquals("X-Chrome-intent-type: message/rfc822", + IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, null)); + + // Different MHTML type with extra headers. + intent.setType("message/rfc822"); + Assert.assertEquals("Foo: bar\nX-Chrome-intent-type: message/rfc822", + IntentHandler.maybeAddAdditionalExtraHeaders(intent, contentUrl, "Foo: bar")); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java index 71fcef13..6efc1ef 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/ui/AutoplayMutedNotificationTest.java
@@ -44,6 +44,8 @@ private static final String TEST_PATH = "/content/test/data/media/session/autoplay-muted.html"; private static final String VIDEO_ID = "video"; + private static final String PLAY_BUTTON_ID = "play"; + private static final String UNMUTE_BUTTON_ID = "unmute"; private static final int AUDIO_FOCUS_CHANGE_TIMEOUT = 500; // ms private EmbeddedTestServer mTestServer; @@ -185,4 +187,66 @@ AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); Assert.assertFalse(isMediaNotificationVisible()); } + + @Test + @SmallTest + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) + public void testMutedPlaybackDoesNotTakeAudioFocus() throws Exception { + Tab tab = mActivityTestRule.getActivity().getActivityTab(); + + // Taking audio focus. + Assert.assertEquals( + AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); + mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); + Assert.assertEquals( + AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); + + // The page will autoplay the video. + DOMUtils.waitForMediaPlay(tab.getWebContents(), VIDEO_ID); + + // Audio focus notification is OS-driven. + Thread.sleep(AUDIO_FOCUS_CHANGE_TIMEOUT); + + DOMUtils.pauseMedia(tab.getWebContents(), VIDEO_ID); + + // Restart the video with a gesture: no longer "muted autoplay". + DOMUtils.clickNode(tab.getWebContents(), PLAY_BUTTON_ID); + DOMUtils.waitForMediaPlay(tab.getWebContents(), VIDEO_ID); + + // Audio focus was not taken and no notification is visible. + Assert.assertEquals( + AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); + Assert.assertFalse(isMediaNotificationVisible()); + } + + @Test + @SmallTest + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) + public void testUnmutedPlaybackTakesAudioFocus() throws Exception { + Tab tab = mActivityTestRule.getActivity().getActivityTab(); + + // Taking audio focus. + Assert.assertEquals( + AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.getAudioFocusState()); + mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN); + Assert.assertEquals( + AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); + + // The page will autoplay the video. + DOMUtils.waitForMediaPlay(tab.getWebContents(), VIDEO_ID); + + // Audio focus notification is OS-driven. + Thread.sleep(AUDIO_FOCUS_CHANGE_TIMEOUT); + + // Restart the video with a gesture: no longer "muted autoplay". + DOMUtils.clickNode(tab.getWebContents(), UNMUTE_BUTTON_ID); + Assert.assertFalse(DOMUtils.isMediaPaused(tab.getWebContents(), VIDEO_ID)); + + Thread.sleep(AUDIO_FOCUS_CHANGE_TIMEOUT); + + // Audio focus was taken and a notification is visible. + Assert.assertNotEquals( + AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.getAudioFocusState()); + Assert.assertTrue(isMediaNotificationVisible()); + } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/feed/OWNERS index ceb0ecd..6b8ae1f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/OWNERS +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/OWNERS
@@ -1,2 +1,5 @@ +# For tests that apply to parts of feature implemented in components with a thin Java layer (e.g. host APIs). file://components/feed/OWNERS +# For tests affecting Android specific parts (e.g. Stream). +file://chrome/android/feed/OWNERS
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java new file mode 100644 index 0000000..fc07a91 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/StreamLifecycleManagerTest.java
@@ -0,0 +1,383 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.feed; + +import static org.mockito.AdditionalMatchers.or; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.os.Bundle; +import android.support.test.filters.SmallTest; + +import com.google.android.libraries.feed.api.stream.Stream; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.base.ActivityState; +import org.chromium.base.ApplicationStatus; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.tab.Tab; + +/** + * Unit tests for {@link StreamLifecycleManager}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class StreamLifecycleManagerTest { + @Mock + private Activity mActivity; + @Mock + private Tab mTab; + @Mock + private Stream mStream; + + private StreamLifecycleManager mStreamLifecycleManager; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.CREATED); + mStreamLifecycleManager = new StreamLifecycleManager(mStream, mActivity, mTab); + verify(mStream, times(1)).onCreate(or(any(Bundle.class), isNull())); + } + + @Test + @SmallTest + public void testShow() { + // Verify that onShow is not called before activity started. + when(mTab.isHidden()).thenReturn(false); + when(mTab.isUserInteractable()).thenReturn(true); + mStreamLifecycleManager.getTabObserverForTesting().onShown(mTab); + verify(mStream, times(0)).onShow(); + + // Verify that onShow is not called when Tab is hidden. + when(mTab.isHidden()).thenReturn(true); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + verify(mStream, times(0)).onShow(); + + // Verify that onShow is called when Tab is shown and activity is started. + when(mTab.isHidden()).thenReturn(false); + mStreamLifecycleManager.getTabObserverForTesting().onShown(mTab); + verify(mStream, times(1)).onShow(); + + // When the Stream is shown, it won't call Stream#onShow() again. + mStreamLifecycleManager.getTabObserverForTesting().onShown(mTab); + verify(mStream, times(1)).onShow(); + } + + @Test + @SmallTest + public void testActivate() { + // Verify that stream is not active before activity resumed. + when(mTab.isHidden()).thenReturn(false); + when(mTab.isUserInteractable()).thenReturn(true); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + verify(mStream, times(1)).onShow(); + verify(mStream, times(0)).onActive(); + + // Verify that stream is not active before tab is user interactable. + when(mTab.isUserInteractable()).thenReturn(false); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + verify(mStream, times(1)).onShow(); + verify(mStream, times(0)).onActive(); + + // Verify that stream is active when tab is user interactable and activity is resumed. + when(mTab.isUserInteractable()).thenReturn(true); + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(true); + verify(mStream, times(1)).onShow(); + verify(mStream, times(1)).onActive(); + + // When the Stream is active, it won't call Stream#onShow() again. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + verify(mStream, times(1)).onShow(); + + // When the Stream is active, it won't call Stream#onActive() again. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + verify(mStream, times(1)).onActive(); + } + + @Test + @SmallTest + public void testActivateAfterCreateAndHideAfterActivate() { + // Activate the stream from created state. + InOrder inOrder = Mockito.inOrder(mStream); + when(mTab.isHidden()).thenReturn(false); + when(mTab.isUserInteractable()).thenReturn(true); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + inOrder.verify(mStream).onShow(); + inOrder.verify(mStream).onActive(); + verify(mStream, times(1)).onShow(); + verify(mStream, times(1)).onActive(); + + // Verify that the stream is deactivated before hidden. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED); + inOrder.verify(mStream).onInactive(); + inOrder.verify(mStream).onHide(); + verify(mStream, times(1)).onShow(); + verify(mStream, times(1)).onActive(); + verify(mStream, times(1)).onInactive(); + verify(mStream, times(1)).onHide(); + } + + @Test + @SmallTest + public void testDeactivate() { + // Verify that the Stream cannot be set inactive from created. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + verify(mStream, times(0)).onInactive(); + + // Show the stream. + when(mTab.isHidden()).thenReturn(false); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + verify(mStream, times(1)).onShow(); + + // Verify that the Stream cannot be set inactive from shown. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + verify(mStream, times(0)).onInactive(); + + // Activate the stream. + when(mTab.isUserInteractable()).thenReturn(true); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + verify(mStream, times(1)).onActive(); + + // Verify that the Stream can be set inactive from active on activity paused. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + verify(mStream, times(1)).onInactive(); + + // When the Stream is inactive, it won't call Stream#onInactive() again. + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(false); + verify(mStream, times(1)).onInactive(); + + // Verify that the Stream cannot be set shown from inactive. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + verify(mStream, times(1)).onShow(); + + // Verify that the Stream can be set active from inactive. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + verify(mStream, times(2)).onActive(); + + // Verify that the Stream can be set inactive from active on tab interactability changed. + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(false); + verify(mStream, times(2)).onInactive(); + } + + @Test + @SmallTest + public void testHideFromActivityStopped() { + // Activate the Stream. + when(mTab.isHidden()).thenReturn(false); + when(mTab.isUserInteractable()).thenReturn(true); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + verify(mStream, times(1)).onShow(); + verify(mStream, times(1)).onActive(); + + // Deactivate the Stream. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + verify(mStream, times(1)).onInactive(); + + // Verify that the Stream can be set hidden from inactive. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED); + verify(mStream, times(1)).onHide(); + + // Verify that the Stream cannot be set inactive from hidden. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + verify(mStream, times(1)).onInactive(); + + // When the Stream is hidden, it won't call Stream#onHide() again. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED); + verify(mStream, times(1)).onHide(); + } + + @Test + @SmallTest + public void testHideFromTabHiddenAfterShow() { + // Show the stream. + when(mTab.isHidden()).thenReturn(false); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + verify(mStream, times(1)).onShow(); + + // Verify that onActive and onInactive are skipped when Stream is set hidden from shown. + mStreamLifecycleManager.getTabObserverForTesting().onHidden(mTab); + verify(mStream, times(1)).onShow(); + verify(mStream, times(0)).onActive(); + verify(mStream, times(0)).onInactive(); + verify(mStream, times(1)).onHide(); + } + + @Test + @SmallTest + public void testDestroy() { + // Verify that Stream#onDestroy is called on activity destroyed. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.DESTROYED); + verify(mStream, times(1)).onDestroy(); + } + + @Test + @SmallTest + public void testDestroyAfterCreate() { + // After the Stream is destroyed, lifecycle methods should never be called. Directly calling + // destroy here to simulate destroy() being called on FeedNewTabPage destroyed. + mStreamLifecycleManager.destroy(); + verify(mStream, times(1)).onDestroy(); + + // Verify that lifecycle methods are not called after destroy. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.DESTROYED); + verify(mStream, times(0)).onShow(); + verify(mStream, times(0)).onActive(); + verify(mStream, times(0)).onInactive(); + verify(mStream, times(0)).onHide(); + verify(mStream, times(1)).onDestroy(); + } + + @Test + @SmallTest + public void testDestroyAfterActivate() { + InOrder inOrder = Mockito.inOrder(mStream); + when(mTab.isHidden()).thenReturn(false); + when(mTab.isUserInteractable()).thenReturn(true); + + // Activate the Stream. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + inOrder.verify(mStream).onShow(); + inOrder.verify(mStream).onActive(); + verify(mStream, times(1)).onShow(); + verify(mStream, times(1)).onActive(); + + // Verify that onInactive and onHide is called before onDestroy. + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.DESTROYED); + inOrder.verify(mStream).onInactive(); + inOrder.verify(mStream).onHide(); + inOrder.verify(mStream).onDestroy(); + verify(mStream, times(1)).onInactive(); + verify(mStream, times(1)).onHide(); + verify(mStream, times(1)).onDestroy(); + } + + @Test + @SmallTest + public void testFullActivityLifecycle() { + InOrder inOrder = Mockito.inOrder(mStream); + when(mTab.isHidden()).thenReturn(false); + when(mTab.isUserInteractable()).thenReturn(true); + + // On activity start and resume (simulates app become foreground). + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + inOrder.verify(mStream).onShow(); + inOrder.verify(mStream).onActive(); + verify(mStream, times(1)).onShow(); + verify(mStream, times(1)).onActive(); + + // On activity pause and then resume (simulates multi-window mode). + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + inOrder.verify(mStream).onInactive(); + inOrder.verify(mStream).onActive(); + verify(mStream, times(1)).onInactive(); + verify(mStream, times(2)).onActive(); + + // On activity stop (simulates app switched to background). + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED); + inOrder.verify(mStream).onInactive(); + inOrder.verify(mStream).onHide(); + verify(mStream, times(2)).onInactive(); + verify(mStream, times(1)).onHide(); + + // On activity start (simulates app switched back to foreground). + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + inOrder.verify(mStream).onShow(); + inOrder.verify(mStream).onActive(); + verify(mStream, times(2)).onShow(); + verify(mStream, times(3)).onActive(); + + // On activity pause, stop, and destroy (simulates app removed from Android recents). + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.DESTROYED); + inOrder.verify(mStream).onInactive(); + inOrder.verify(mStream).onHide(); + inOrder.verify(mStream).onDestroy(); + verify(mStream, times(3)).onInactive(); + verify(mStream, times(2)).onHide(); + verify(mStream, times(1)).onDestroy(); + } + + @Test + @SmallTest + public void testFullTabLifecycle() { + InOrder inOrder = Mockito.inOrder(mStream); + + // On new tab page created. + when(mTab.isHidden()).thenReturn(true); + when(mTab.isUserInteractable()).thenReturn(false); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED); + ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED); + verify(mStream, times(0)).onShow(); + + // On tab shown. + when(mTab.isHidden()).thenReturn(false); + mStreamLifecycleManager.getTabObserverForTesting().onShown(mTab); + inOrder.verify(mStream).onShow(); + verify(mStream, times(1)).onShow(); + + // On tab interactable. + when(mTab.isUserInteractable()).thenReturn(true); + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(true); + inOrder.verify(mStream).onActive(); + verify(mStream, times(1)).onActive(); + + // On tab un-interactable (simulates user enter the tab switcher). + when(mTab.isUserInteractable()).thenReturn(false); + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(false); + inOrder.verify(mStream).onInactive(); + verify(mStream, times(1)).onInactive(); + + // On tab interactable (simulates user exit the tab switcher). + when(mTab.isUserInteractable()).thenReturn(true); + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(true); + inOrder.verify(mStream).onActive(); + verify(mStream, times(2)).onActive(); + + // On tab un-interactable and hidden (simulates user switch to another tab). + when(mTab.isHidden()).thenReturn(true); + when(mTab.isUserInteractable()).thenReturn(false); + mStreamLifecycleManager.getTabObserverForTesting().onInteractabilityChanged(false); + mStreamLifecycleManager.getTabObserverForTesting().onHidden(mTab); + inOrder.verify(mStream).onInactive(); + inOrder.verify(mStream).onHide(); + verify(mStream, times(2)).onInactive(); + verify(mStream, times(1)).onHide(); + + // On tab shown (simulates user switch back to this tab). + when(mTab.isHidden()).thenReturn(false); + mStreamLifecycleManager.getTabObserverForTesting().onShown(mTab); + inOrder.verify(mStream).onShow(); + verify(mStream, times(2)).onShow(); + + // On tab destroy (simulates user close the tab or navigate to another URL). + mStreamLifecycleManager.destroy(); + inOrder.verify(mStream).onHide(); + inOrder.verify(mStream).onDestroy(); + verify(mStream, times(2)).onHide(); + verify(mStream, times(1)).onDestroy(); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotControllerTest.java index e1418c9..c8ec40b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotControllerTest.java
@@ -22,10 +22,13 @@ import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import java.util.HashMap; + /** * Unit tests for IncognitoTabSnapshotController.java. */ @@ -122,6 +125,10 @@ @Test public void testInOverviewModeWithIncognitoTab() { + HashMap<String, Boolean> features = new HashMap<String, Boolean>(); + features.put(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID, false); + ChromeFeatureList.setTestFeatures(features); + mController = new IncognitoTabSnapshotController(mWindow, mLayoutManager, mSelector); mController.setInOverViewMode(true); @@ -136,6 +143,10 @@ @Test public void testInOverviewModeWithNoIncognitoTab() { + HashMap<String, Boolean> features = new HashMap<String, Boolean>(); + features.put(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID, false); + ChromeFeatureList.setTestFeatures(features); + mController = new IncognitoTabSnapshotController(mWindow, mLayoutManager, mSelector); mController.setInOverViewMode(true); @@ -161,4 +172,4 @@ return mIsShowingIncognito; } } -} \ No newline at end of file +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java index 1bdc0bb0..39270faa 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java
@@ -31,7 +31,6 @@ public class TabStateUnitTest { private static final byte[] CONTENTS_STATE_BYTES = new byte[] {1, 2, 3}; private static final long TIMESTAMP = 10L; - private static final long SYNC_ID = 3; private static final int PARENT_ID = 1; private static final int VERSION = 2; private static final int THEME_COLOR = 4; @@ -62,7 +61,6 @@ state.contentsState.setVersion(VERSION); state.timestampMillis = TIMESTAMP; state.parentId = PARENT_ID; - state.syncId = SYNC_ID; state.themeColor = THEME_COLOR; state.shouldPreserve = SHOULD_PRESERVE; state.openerAppId = OPENER_APP_ID; @@ -77,7 +75,6 @@ assertEquals(PARENT_ID, state.parentId); assertEquals(OPENER_APP_ID, state.openerAppId); assertEquals(VERSION, state.contentsState.version()); - assertEquals(SYNC_ID, state.syncId); assertEquals(SHOULD_PRESERVE, state.shouldPreserve); assertEquals(THEME_COLOR, state.getThemeColor()); assertEquals(CONTENTS_STATE_BYTES.length, state.contentsState.buffer().remaining());
diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java index ffdc4662..abc89d1c9 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java
@@ -21,13 +21,10 @@ import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.FlakyTest; import org.chromium.chrome.browser.ChromeSwitches; -import org.chromium.chrome.browser.TabState; -import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; -import org.chromium.components.sync.SyncConstants; import org.chromium.components.sync.protocol.EntitySpecifics; import org.chromium.components.sync.protocol.SessionHeader; import org.chromium.components.sync.protocol.SessionSpecifics; @@ -206,31 +203,6 @@ waitForLocalTabsForClient(FAKE_CLIENT); } - // Test - @Test - @LargeTest - @Feature({"Sync"}) - public void testTabGetsValidSyncId() throws Exception { - final Tab tab = mSyncTestRule.loadUrlInNewTab(URL); - ThreadUtils.runOnUiThreadBlocking(() -> { - TabState state = tab.getState(); - Assert.assertFalse(state.syncId == SyncConstants.INVALID_TAB_NODE_ID); - }); - } - - // Test - @Test - @LargeTest - @Feature({"Sync"}) - public void testIncognitoTabGetsInvalidSyncId() throws Exception { - final Tab tab = mSyncTestRule.loadUrlInNewTab(URL, /*incognito=*/true); - - ThreadUtils.runOnUiThreadBlocking(() -> { - TabState state = tab.getState(); - Assert.assertEquals(state.syncId, SyncConstants.INVALID_TAB_NODE_ID); - }); - } - private String makeSessionTag() { return SESSION_TAG_PREFIX + (mSessionTagCounter++); }
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 3c4ed27..22d57b3 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc
@@ -82,6 +82,7 @@ #if defined(OS_MACOSX) #include "base/mac/foundation_util.h" #include "chrome/app/chrome_main_mac.h" +#include "chrome/browser/chrome_browser_application_mac.h" #include "chrome/browser/mac/relauncher.h" #include "chrome/browser/shell_integration.h" #include "chrome/common/mac/cfbundle_blocker.h" @@ -1141,6 +1142,15 @@ void ChromeMainDelegate::PreContentInitialization() { #if defined(OS_MACOSX) - RegisterBrowserCrApp(); + // Tell Cocoa to finish its initialization, which we want to do manually + // instead of calling NSApplicationMain(). The primary reason is that NSAM() + // never returns, which would leave all the objects currently on the stack + // in scoped_ptrs hanging and never cleaned up. We then load the main nib + // directly. The main event loop is run from common code using the + // MessageLoop API, which works out ok for us because it's a wrapper around + // CFRunLoop. + + // Initialize NSApplication using the custom subclass. + chrome_browser_application_mac::RegisterBrowserCrApp(); #endif }
diff --git a/chrome/app/chrome_main_mac.h b/chrome/app/chrome_main_mac.h index 8a2d22f7e..0de6cc8f 100644 --- a/chrome/app/chrome_main_mac.h +++ b/chrome/app/chrome_main_mac.h
@@ -20,7 +20,4 @@ // process. void SetUpBundleOverrides(); -// Initialize NSApplication. -void RegisterBrowserCrApp(); - #endif // CHROME_APP_CHROME_MAIN_MAC_H_
diff --git a/chrome/app/chrome_main_mac.mm b/chrome/app/chrome_main_mac.mm index e063b2d2..5a37a170 100644 --- a/chrome/app/chrome_main_mac.mm +++ b/chrome/app/chrome_main_mac.mm
@@ -14,7 +14,6 @@ #import "base/mac/foundation_util.h" #import "base/mac/scoped_nsautorelease_pool.h" #include "base/strings/sys_string_conversions.h" -#import "chrome/browser/chrome_browser_application_mac.h" #include "chrome/common/chrome_paths_internal.h" void SetUpBundleOverrides() { @@ -25,16 +24,3 @@ NSBundle* base_bundle = chrome::OuterAppBundle(); base::mac::SetBaseBundleID([[base_bundle bundleIdentifier] UTF8String]); } - -void RegisterBrowserCrApp() { - // Tell Cocoa to finish its initialization, which we want to do manually - // instead of calling NSApplicationMain(). The primary reason is that NSAM() - // never returns, which would leave all the objects currently on the stack - // in scoped_ptrs hanging and never cleaned up. We then load the main nib - // directly. The main event loop is run from common code using the - // MessageLoop API, which works out ok for us because it's a wrapper around - // CFRunLoop. - - // Initialize NSApplication using the custom subclass. - chrome_browser_application_mac::RegisterBrowserCrApp(); -}
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 1408830a..bb555d49 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -2598,6 +2598,12 @@ <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_CONTEXT_DESCRIPTION" desc="Sub label for context-enable toggle."> Enables the Assistant to show you related info, apps, and actions. </message> + <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD" desc="Title for a toggle that lets the assistant detect hotword."> + "OK Google" detection + </message> + <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION" desc="Sub label for hotword-enable toggle."> + Access your Assistant any time you say "OK Google" when your screen is on. + </message> <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_SETTINGS" desc="Title for a button that opens the Google Assistant app settings."> Google Assistant settings </message> @@ -4163,6 +4169,9 @@ <message name="IDS_SETTINGS_RESET_CLEANUP_DETAILS_EXPLANATION" desc="Text that appears below the list of files, programs, and registry entries to be removed by Chrome as part of a cleanup process. 'privacy white paper' is a guide to Chrome's privacy policy and practices. In 'unwanted software protection,' the word 'unwanted' modifies 'software,' i.e. 'protection from unwanted software'."> Items not listed here will also be removed, if needed. Learn more about <a href="<ph name="URL">$1<ex>https://www.google.com/chrome/browser/privacy/whitepaper.html#unwantedsoftware</ex></ph>">unwanted software protection</a> in the Chrome privacy white paper. </message> + <message name="IDS_SETTINGS_RESET_CLEANUP_DETAILS_EXTENSIONS" desc="Introduces a bullet list containing the names of extensions to be removed by Chrome."> + Extensions: + </message> <message name="IDS_SETTINGS_RESET_CLEANUP_DETAILS_FILES_AND_PROGRAMS" desc="Introduces a bullet list containing the names of files and programs to be removed by Chrome."> Files and programs: </message> @@ -4213,7 +4222,7 @@ Restart computer </message> <message name="IDS_SETTINGS_RESET_CLEANUP_TITLE_DONE" desc="Message confirming that Chrome has removed harmful software. Exclamation point is nice in EN-US but is optional in your language; please use or omit as appropriate. The UI will also display a checkmark icon to indicate the operation is done. "> - Done! Harmful software removed. + Done! Harmful software removed. To turn extensions back on, visit <a href="chrome://extensions">Extensions.</a> </message> <message name="IDS_SETTINGS_RESET_CLEANUP_TITLE_ERROR_CANT_REMOVE" desc="An error message, appearing on the Chrome Cleanup web page, that Chrome tried to clean up unwanted software, as requested by the user, but was unsuccessful. Omits subject, i.e. Chrome can't remove harmful software."> Cleanup failed
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 1340875..145d3da 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2065,8 +2065,12 @@ "android/download/service/download_background_task.cc", "android/download/service/download_task_scheduler.cc", "android/download/service/download_task_scheduler.h", + "android/explore_sites/catalog.cc", + "android/explore_sites/catalog.h", "android/explore_sites/explore_sites_bridge.cc", "android/explore_sites/explore_sites_bridge.h", + "android/explore_sites/ntp_json_fetcher.cc", + "android/explore_sites/ntp_json_fetcher.h", "android/favicon_helper.cc", "android/favicon_helper.h", "android/feature_engagement/tracker_factory_android.cc", @@ -4374,6 +4378,7 @@ "../android/java/src/org/chromium/chrome/browser/download/service/DownloadTaskScheduler.java", "../android/java/src/org/chromium/chrome/browser/engagement/SiteEngagementService.java", "../android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesBridge.java", + "../android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryTile.java", "../android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java", "../android/java/src/org/chromium/chrome/browser/favicon/LargeIconBridge.java", "../android/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java",
diff --git a/chrome/browser/android/content/content_utils.cc b/chrome/browser/android/content/content_utils.cc index 4a3267c..06a62d4b 100644 --- a/chrome/browser/android/content/content_utils.cc +++ b/chrome/browser/android/content/content_utils.cc
@@ -6,6 +6,8 @@ #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" #include "chrome/common/chrome_content_client.h" +#include "content/public/browser/web_contents.h" +#include "content/public/common/user_agent.h" #include "jni/ContentUtils_jni.h" static base::android::ScopedJavaLocalRef<jstring> @@ -14,3 +16,17 @@ const base::android::JavaParamRef<jclass>& clazz) { return base::android::ConvertUTF8ToJavaString(env, GetUserAgent()); } + +static void JNI_ContentUtils_SetUserAgentOverride( + JNIEnv* env, + const base::android::JavaParamRef<jclass>& clazz, + const base::android::JavaParamRef<jobject>& jweb_contents) { + const char kLinuxInfoStr[] = "X11; Linux x86_64"; + ChromeContentClient content_client; + std::string product = content_client.GetProduct(); + std::string spoofed_ua = + content::BuildUserAgentFromOSAndProduct(kLinuxInfoStr, product); + content::WebContents* web_contents = + content::WebContents::FromJavaWebContents(jweb_contents); + web_contents->SetUserAgentOverride(spoofed_ua, false); +}
diff --git a/chrome/browser/android/explore_sites/catalog.cc b/chrome/browser/android/explore_sites/catalog.cc new file mode 100644 index 0000000..27a7909 --- /dev/null +++ b/chrome/browser/android/explore_sites/catalog.cc
@@ -0,0 +1,83 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/explore_sites/catalog.h" + +#include <sstream> + +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/values.h" + +namespace explore_sites { + +// static +std::unique_ptr<NTPCatalog> NTPCatalog::create( + const base::DictionaryValue* json) { + if (!json || !json->is_dict()) + return nullptr; + + const base::ListValue* categories = static_cast<const base::ListValue*>( + json->FindKeyOfType("categories", base::Value::Type::LIST)); + + if (!categories) + return nullptr; + + std::vector<NTPCatalog::Category> catalog_categories; + for (const auto& category : categories->GetList()) { + if (!category.is_dict()) { + return nullptr; + } + const base::DictionaryValue* category_dict = + static_cast<const base::DictionaryValue*>(&category); + const base::Value* id = + category_dict->FindKeyOfType("id", base::Value::Type::STRING); + const base::Value* title = + category_dict->FindKeyOfType("title", base::Value::Type::STRING); + const base::Value* icon_url_str = + category_dict->FindKeyOfType("icon_url", base::Value::Type::STRING); + + if (!id || !title || !icon_url_str) + continue; + + GURL icon_url(icon_url_str->GetString()); + if (icon_url.is_empty()) + continue; + + catalog_categories.push_back( + {id->GetString(), title->GetString(), icon_url}); + } + + auto catalog = base::WrapUnique(new NTPCatalog(catalog_categories)); + DVLOG(1) << "Catalog parsed: " << catalog->ToString(); + + return catalog; +} + +NTPCatalog::~NTPCatalog() = default; +NTPCatalog::NTPCatalog(const std::vector<Category>& category_list) { + categories = category_list; +} + +std::string NTPCatalog::ToString() { + std::ostringstream ss; + ss << " NTPCatalog {\n"; + for (auto& category : categories) { + ss << " category " << category.id << " {\n" + << " title: " << category.title << "\n" + << " icon_url: " << category.icon_url.spec() << "\n"; + } + ss << "}\n"; + return ss.str(); +} + +bool operator==(const NTPCatalog::Category& a, const NTPCatalog::Category& b) { + return a.id == b.id && a.title == b.title && a.icon_url == b.icon_url; +} + +bool operator==(const NTPCatalog& a, const NTPCatalog& b) { + return a.categories == b.categories; +} + +} // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/catalog.h b/chrome/browser/android/explore_sites/catalog.h new file mode 100644 index 0000000..0f1ad10 --- /dev/null +++ b/chrome/browser/android/explore_sites/catalog.h
@@ -0,0 +1,54 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_EXPLORE_SITES_CATALOG_H_ +#define CHROME_BROWSER_ANDROID_EXPLORE_SITES_CATALOG_H_ + +#include <string> +#include <utility> +#include <vector> + +#include "url/gurl.h" + +namespace base { +class DictionaryValue; +} + +namespace explore_sites { + +// A representation of the Explore Sites catalog on the NTP. +class NTPCatalog { + public: + // Categories are mapped to individual tiles on the NTP. + struct Category { + // The category ID, used as a section identifier when opening the full + // explore sites catalog. + std::string id; + + // The textual name of the category. + std::string title; + + // The icon image URL. + GURL icon_url; + }; + + // The NTPCatalog does not take ownership of |json|. + static std::unique_ptr<NTPCatalog> create(const base::DictionaryValue* json); + + explicit NTPCatalog(const std::vector<Category>& category_list); + ~NTPCatalog(); + + std::vector<Category> categories; + + private: + std::string ToString(); + DISALLOW_COPY_AND_ASSIGN(NTPCatalog); +}; + +bool operator==(const NTPCatalog::Category& a, const NTPCatalog::Category& b); +bool operator==(const NTPCatalog& a, const NTPCatalog& b); + +} // namespace explore_sites + +#endif // CHROME_BROWSER_ANDROID_EXPLORE_SITES_CATALOG_H_
diff --git a/chrome/browser/android/explore_sites/explore_sites_bridge.cc b/chrome/browser/android/explore_sites/explore_sites_bridge.cc index 310cc73..98baaa9 100644 --- a/chrome/browser/android/explore_sites/explore_sites_bridge.cc +++ b/chrome/browser/android/explore_sites/explore_sites_bridge.cc
@@ -7,37 +7,58 @@ #include "base/android/callback_android.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" +#include "base/android/scoped_java_ref.h" #include "base/bind.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_android.h" #include "jni/ExploreSitesBridge_jni.h" +#include "jni/ExploreSitesCategoryTile_jni.h" #include "services/network/public/cpp/simple_url_loader.h" namespace explore_sites { -static jlong JNI_ExploreSitesBridge_Init( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jobject>& j_profile) { - ExploreSitesBridge* explore_sites_bridge = new ExploreSitesBridge(j_profile); - return reinterpret_cast<intptr_t>(explore_sites_bridge); +using base::android::JavaParamRef; +using base::android::JavaRef; +using base::android::ScopedJavaLocalRef; +using base::android::ScopedJavaGlobalRef; + +namespace { + +void GotNTPCategoriesFromJson( + const ScopedJavaGlobalRef<jobject>& j_callback_ref, + const ScopedJavaGlobalRef<jobject>& j_result_ref, + std::unique_ptr<NTPJsonFetcher> fetcher, + std::unique_ptr<NTPCatalog> catalog) { + JNIEnv* env = base::android::AttachCurrentThread(); + if (catalog) { + for (NTPCatalog::Category category : catalog->categories) { + Java_ExploreSitesCategoryTile_createInList( + env, j_result_ref, + base::android::ConvertUTF8ToJavaString(env, category.id), + base::android::ConvertUTF8ToJavaString(env, category.icon_url.spec()), + base::android::ConvertUTF8ToJavaString(env, category.title)); + } + } + + base::android::RunCallbackAndroid(j_callback_ref, j_result_ref); } -ExploreSitesBridge::ExploreSitesBridge( - const base::android::JavaRef<jobject>& j_profile) - : weak_ptr_factory_(this) {} +} // namespace -void ExploreSitesBridge::Destroy( +// static +void JNI_ExploreSitesBridge_GetNtpCategories( JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj) { - delete this; + const JavaParamRef<jclass>& j_caller, + const JavaParamRef<jobject>& j_profile, + const JavaParamRef<jobject>& j_result_obj, + const JavaParamRef<jobject>& j_callback_obj) { + NTPJsonFetcher* ntp_fetcher = + new NTPJsonFetcher(ProfileAndroid::FromProfileAndroid(j_profile)); + + ntp_fetcher->Start(base::BindOnce( + &GotNTPCategoriesFromJson, ScopedJavaGlobalRef<jobject>(j_callback_obj), + ScopedJavaGlobalRef<jobject>(j_result_obj), + base::WrapUnique(ntp_fetcher))); } -void ExploreSitesBridge::GetNtpCategories( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jstring>& url, - const base::android::JavaParamRef<jobject>& j_result_obj, - const base::android::JavaParamRef<jobject>& j_callback_obj) {} - -ExploreSitesBridge::~ExploreSitesBridge() {} - } // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/explore_sites_bridge.h b/chrome/browser/android/explore_sites/explore_sites_bridge.h index 1f2d05f..77dc0cf4 100644 --- a/chrome/browser/android/explore_sites/explore_sites_bridge.h +++ b/chrome/browser/android/explore_sites/explore_sites_bridge.h
@@ -10,30 +10,19 @@ #include "base/android/scoped_java_ref.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/android/explore_sites/ntp_json_fetcher.h" namespace explore_sites { /** * Bridge between C++ and Java for fetching and decoding URLs and images. */ -class ExploreSitesBridge { - public: - explicit ExploreSitesBridge(const base::android::JavaRef<jobject>& j_profile); - void Destroy(JNIEnv*, const base::android::JavaParamRef<jobject>& obj); - - void GetNtpCategories( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jstring>& url, - const base::android::JavaParamRef<jobject>& j_result_obj, - const base::android::JavaParamRef<jobject>& j_callback_obj); - - private: - virtual ~ExploreSitesBridge(); - - base::WeakPtrFactory<ExploreSitesBridge> weak_ptr_factory_; - DISALLOW_COPY_AND_ASSIGN(ExploreSitesBridge); -}; +static void JNI_ExploreSitesBridge_GetNtpCategories( + JNIEnv* env, + const base::android::JavaParamRef<jclass>& j_caller, + const base::android::JavaParamRef<jobject>& j_profile, + const base::android::JavaParamRef<jobject>& j_result_obj, + const base::android::JavaParamRef<jobject>& j_callback_obj); } // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/ntp_json_fetcher.cc b/chrome/browser/android/explore_sites/ntp_json_fetcher.cc new file mode 100644 index 0000000..2cd122d --- /dev/null +++ b/chrome/browser/android/explore_sites/ntp_json_fetcher.cc
@@ -0,0 +1,147 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/explore_sites/ntp_json_fetcher.h" + +#include <utility> + +#include "base/bind.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/metrics/field_trial_params.h" +#include "base/values.h" +#include "chrome/browser/android/chrome_feature_list.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/common/service_manager_connection.h" +#include "net/base/load_flags.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "net/url_request/url_fetcher.h" +#include "net/url_request/url_request_status.h" +#include "services/data_decoder/public/cpp/safe_json_parser.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/simple_url_loader.h" +#include "url/gurl.h" + +namespace explore_sites { + +namespace { + +std::string GetBaseURLFromFieldTrial() { + const char kBaseURLOption[] = "base_url"; + const char kDefaultBaseUrl[] = + "https://explore-sites-ux-research.appspot.com"; + std::string field_trial_param = base::GetFieldTrialParamValueByFeature( + chrome::android::kExploreSites, kBaseURLOption); + if (field_trial_param.empty()) + return kDefaultBaseUrl; + return field_trial_param; +} + +GURL GetExploreSitesNtpURL() { + const char kNtpJsonPath[] = "/ntp.json"; + std::string path(kNtpJsonPath); + + GURL base_url(GetBaseURLFromFieldTrial()); + GURL::Replacements replacements; + replacements.SetPathStr(path); + return base_url.ReplaceComponents(replacements); +} + +const int kMaxRetries = 3; +const int kMaxJsonSize = 1000000; // 1Mb + +} // namespace + +NTPJsonFetcher::NTPJsonFetcher(content::BrowserContext* browser_context) + : browser_context_(browser_context), weak_factory_(this) {} + +NTPJsonFetcher::~NTPJsonFetcher() {} + +void NTPJsonFetcher::Start(Callback callback) { + // Cancels ongoing requests. + Stop(); + + callback_ = std::move(callback); + + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("explore_sites_catalog_fetcher", R"( + semantics { + sender: "Explore Sites NTP Catalog fetcher" + description: + "Downloads sites and categories to be shown on the New Tab Page " + "for the purposes of exploring the Web." + trigger: + "When a mobile Android user views the New Tab Page." + data: + "JSON data comprising interesting site and category information. " + "No user information is sent." + destination: GOOGLE_OWNED_SERVICE + } + policy { + cookies_allowed: YES + cookies_store: "user" + policy_exception_justification: + "This feature is only enabled explicitly by flag." + })"); + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = GetExploreSitesNtpURL(); + simple_loader_ = network::SimpleURLLoader::Create(std::move(resource_request), + traffic_annotation); + network::mojom::URLLoaderFactory* loader_factory = + content::BrowserContext::GetDefaultStoragePartition(browser_context_) + ->GetURLLoaderFactoryForBrowserProcess() + .get(); + simple_loader_->SetRetryOptions( + kMaxRetries, network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE | + network::SimpleURLLoader::RETRY_ON_5XX); + simple_loader_->DownloadToString( + loader_factory, + base::BindOnce(&NTPJsonFetcher::OnSimpleLoaderComplete, + weak_factory_.GetWeakPtr()), + kMaxJsonSize); // 1Mb max +} + +void NTPJsonFetcher::Stop() { + weak_factory_.InvalidateWeakPtrs(); + simple_loader_.reset(); +} + +void NTPJsonFetcher::OnSimpleLoaderComplete( + std::unique_ptr<std::string> response_body) { + if (!response_body) { + const char kBadResponse[] = "Unable to parse response body."; + OnJsonParseError(kBadResponse); + return; + } + + // The parser will call us back via one of the callbacks. + data_decoder::SafeJsonParser::Parse( + content::ServiceManagerConnection::GetForProcess()->GetConnector(), + *response_body, + base::BindRepeating(&NTPJsonFetcher::OnJsonParseSuccess, + weak_factory_.GetWeakPtr()), + base::BindRepeating(&NTPJsonFetcher::OnJsonParseError, + weak_factory_.GetWeakPtr())); +} + +void NTPJsonFetcher::OnJsonParseSuccess( + std::unique_ptr<base::Value> parsed_json) { + if (!parsed_json || !parsed_json->is_dict()) { + OnJsonParseError("Parsed JSON is not a dictionary."); + return; + } + + auto catalog = NTPCatalog::create( + static_cast<base::DictionaryValue*>(parsed_json.get())); + std::move(callback_).Run(std::move(catalog)); +} + +void NTPJsonFetcher::OnJsonParseError(const std::string& error) { + DVLOG(1) << "Unable to parse NTP JSON from " << GetExploreSitesNtpURL() + << " error: " << error; + std::move(callback_).Run(nullptr); +} + +} // namespace explore_sites
diff --git a/chrome/browser/android/explore_sites/ntp_json_fetcher.h b/chrome/browser/android/explore_sites/ntp_json_fetcher.h new file mode 100644 index 0000000..d164550 --- /dev/null +++ b/chrome/browser/android/explore_sites/ntp_json_fetcher.h
@@ -0,0 +1,63 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_EXPLORE_SITES_NTP_JSON_FETCHER_H_ +#define CHROME_BROWSER_ANDROID_EXPLORE_SITES_NTP_JSON_FETCHER_H_ + +#include <memory> +#include <string> + +#include "base/callback.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/android/explore_sites/catalog.h" + +namespace base { +class DictionaryValue; +class Value; +} // namespace base + +namespace content { +class BrowserContext; +} + +namespace network { +class SimpleURLLoader; +} + +namespace explore_sites { + +// A class that fetches a JSON formatted response from a server and uses a +// sandboxed utility process to parse it to a DictionaryValue. +class NTPJsonFetcher { + public: + // Callback to pass back the parsed json dictionary returned from the server. + // Invoked with |nullptr| if there is an error. + typedef base::OnceCallback<void(std::unique_ptr<NTPCatalog>)> Callback; + + explicit NTPJsonFetcher(content::BrowserContext* browser_context); + ~NTPJsonFetcher(); + + // Starts to fetch results for the given |query_url|. + void Start(Callback callback); + void Stop(); + + private: + // Invoked from SimpleURLLoader after download is complete. + void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body); + // Callbacks for SafeJsonParser. + void OnJsonParseSuccess(std::unique_ptr<base::Value> parsed_json); + void OnJsonParseError(const std::string& error); + + Callback callback_; + content::BrowserContext* browser_context_; + std::unique_ptr<network::SimpleURLLoader> simple_loader_; + base::WeakPtrFactory<NTPJsonFetcher> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(NTPJsonFetcher); +}; + +} // namespace explore_sites + +#endif // CHROME_BROWSER_ANDROID_EXPLORE_SITES_NTP_JSON_FETCHER_H_
diff --git a/chrome/browser/android/explore_sites/ntp_json_fetcher_unittest.cc b/chrome/browser/android/explore_sites/ntp_json_fetcher_unittest.cc new file mode 100644 index 0000000..fa76d23 --- /dev/null +++ b/chrome/browser/android/explore_sites/ntp_json_fetcher_unittest.cc
@@ -0,0 +1,150 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/explore_sites/ntp_json_fetcher.h" + +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/android/chrome_feature_list.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "content/public/test/test_service_manager_context.h" +#include "content/public/test/test_utils.h" +#include "net/test/embedded_test_server/controllable_http_response.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace explore_sites { + +using testing::_; + +class NTPJsonFetcherTest : public testing::Test { + public: + NTPJsonFetcherTest() + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), + https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} + + void SetUp() { + controllable_http_response_ = + std::make_unique<net::test_server::ControllableHttpResponse>( + &https_server_, "/ntp.json"); + ASSERT_TRUE(https_server_.Start()); + + scoped_feature_list_.InitAndEnableFeatureWithParameters( + chrome::android::kExploreSites, + {std::make_pair("base_url", https_server_.base_url().spec())}); + } + + MOCK_METHOD0(OnGotCatalog, void()); + MOCK_METHOD0(OnError, void()); + + protected: + void SetValidResponse() { + std::string json = + R"({"categories":[{"icon_url":"https://www.google.com/favicon.ico",)" + R"("title":"Sports","id":"Sports"}]})"; + + controllable_http_response_->WaitForRequest(); + controllable_http_response_->Send( + "HTTP/1.1 200 OK\r\n" + "Content-Type: application/json\r\n" + "\r\n"); + controllable_http_response_->Send(json); + controllable_http_response_->Done(); + base::RunLoop().RunUntilIdle(); + } + + void SetUnparseableResponse() { + std::string json = R"({ + "esp_url": "https:\/\/example.com", + "categories": [ + "abc" + ]] + })"; + + controllable_http_response_->WaitForRequest(); + controllable_http_response_->Send( + "HTTP/1.1 200 OK\r\n" + "Content-Type: application/json\r\n" + "\r\n"); + controllable_http_response_->Send(json); + controllable_http_response_->Done(); + base::RunLoop().RunUntilIdle(); + } + + void SetFailedResponse() { + controllable_http_response_->WaitForRequest(); + controllable_http_response_->Send( + "HTTP/1.1 400 BAD REQUEST\r\n" + "Content-Type: application/json\r\n" + "\r\n"); + controllable_http_response_->Done(); + base::RunLoop().RunUntilIdle(); + } + + std::unique_ptr<NTPJsonFetcher> StartFetcher() { + auto fetcher = std::make_unique<NTPJsonFetcher>(browser_context()); + fetcher->Start(base::BindOnce(&NTPJsonFetcherTest::OnJsonFetched, + base::Unretained(this))); + return fetcher; + } + + NTPCatalog* catalog() { return catalog_.get(); } + content::BrowserContext* browser_context() { return &browser_context_; } + + private: + void OnJsonFetched(std::unique_ptr<NTPCatalog> catalog) { + if (catalog.get()) { + catalog_ = std::move(catalog); + OnGotCatalog(); + } else { + OnError(); + } + } + + std::unique_ptr<NTPCatalog> catalog_; + + content::TestBrowserThreadBundle thread_bundle_; + TestingProfile browser_context_; + net::EmbeddedTestServer https_server_; + + // This is how we configure the JSON responses. + std::unique_ptr<net::test_server::ControllableHttpResponse> + controllable_http_response_; + + // This allows us to override the URL via finch params. + base::test::ScopedFeatureList scoped_feature_list_; + + // This allows the NTPJsonFetcher to grab the JSON parsing service. + content::TestServiceManagerContext smc; +}; + +// TODO(https://crbug.com/854250): Fix the tests. They are disabled because +// they're failing on trybots. Probably they have to be browser tests instead. +TEST_F(NTPJsonFetcherTest, DISABLED_Success) { + EXPECT_CALL(*this, OnGotCatalog()); + auto fetcher = StartFetcher(); + SetValidResponse(); + testing::Mock::VerifyAndClearExpectations(this); + std::vector<NTPCatalog::Category> category_list = { + {"Sports", "Sports", GURL("https://www.google.com/favicon.ico")}}; + NTPCatalog expected(category_list); + ASSERT_NE(nullptr, catalog()); + EXPECT_EQ(*catalog(), expected); +} + +TEST_F(NTPJsonFetcherTest, DISABLED_Failure) { + EXPECT_CALL(*this, OnError()); + auto fetcher = StartFetcher(); + SetFailedResponse(); +} + +TEST_F(NTPJsonFetcherTest, DISABLED_ParseFailure) { + EXPECT_CALL(*this, OnError()); + auto fetcher = StartFetcher(); + SetUnparseableResponse(); +} + +} // namespace explore_sites
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc index 25c20b5..9ca6aab4 100644 --- a/chrome/browser/android/tab_android.cc +++ b/chrome/browser/android/tab_android.cc
@@ -199,7 +199,6 @@ TabAndroid::TabAndroid(JNIEnv* env, const JavaRef<jobject>& obj) : weak_java_tab_(env, obj), - session_tab_id_(SessionID::NewUnique()), session_window_id_(SessionID::InvalidValue()), content_layer_(cc::Layer::Create()), tab_content_manager_(NULL), @@ -233,11 +232,6 @@ return Java_Tab_getId(env, weak_java_tab_.get(env)); } -int TabAndroid::GetSyncId() const { - JNIEnv* env = base::android::AttachCurrentThread(); - return Java_Tab_getSyncId(env, weak_java_tab_.get(env)); -} - base::string16 TabAndroid::GetTitle() const { JNIEnv* env = base::android::AttachCurrentThread(); return base::android::ConvertJavaStringToUTF16( @@ -294,11 +288,6 @@ session_tab_helper->SetWindowID(session_window_id_); } -void TabAndroid::SetSyncId(int sync_id) { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_Tab_setSyncId(env, weak_java_tab_.get(env), sync_id); -} - void TabAndroid::HandlePopupNavigation(NavigateParams* params) { DCHECK(params->source_contents == web_contents()); DCHECK(!params->contents_to_insert); @@ -426,7 +415,7 @@ jboolean incognito, jboolean is_background_tab, const JavaParamRef<jobject>& jweb_contents, - const JavaParamRef<jobject>& jparent_web_contents, + jint jparent_tab_id, const JavaParamRef<jobject>& jweb_contents_delegate, const JavaParamRef<jobject>& jcontext_menu_populator) { web_contents_.reset(content::WebContents::FromJavaWebContents(jweb_contents)); @@ -437,8 +426,6 @@ SetWindowSessionID(session_window_id_); - session_tab_id_ = - SessionTabHelper::FromWebContents(web_contents())->session_id(); ContextMenuHelper::FromWebContents(web_contents())->SetPopulator( jcontext_menu_populator); ViewAndroidHelper::FromWebContents(web_contents())-> @@ -449,7 +436,6 @@ env, jweb_contents_delegate); web_contents_delegate_->LoadProgressChanged(web_contents(), 0); web_contents()->SetDelegate(web_contents_delegate_.get()); - notification_registrar_.Add( this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, @@ -461,9 +447,7 @@ if (favicon_driver) favicon_driver->AddObserver(this); - WebContents* parent_web_contents = - content::WebContents::FromJavaWebContents(jparent_web_contents); - synced_tab_delegate_->SetWebContents(web_contents(), parent_web_contents); + synced_tab_delegate_->SetWebContents(web_contents(), jparent_tab_id); // Verify that the WebContents this tab represents matches the expected // off the record state. @@ -574,7 +558,6 @@ jint referrer_policy, jboolean is_renderer_initiated, jboolean should_replace_current_entry, - jlong intent_received_timestamp, jboolean has_user_gesture, jboolean should_clear_history_list) { if (!web_contents()) @@ -637,7 +620,6 @@ } load_params.is_renderer_initiated = is_renderer_initiated; load_params.should_replace_current_entry = should_replace_current_entry; - load_params.intent_received_timestamp = intent_received_timestamp; load_params.has_user_gesture = has_user_gesture; load_params.should_clear_history_list = should_clear_history_list; web_contents()->GetController().LoadURLWithParams(load_params);
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h index 34b18add..1fb61a2d 100644 --- a/chrome/browser/android/tab_android.h +++ b/chrome/browser/android/tab_android.h
@@ -91,7 +91,6 @@ scoped_refptr<cc::Layer> GetContentLayer() const; // Return specific id information regarding this TabAndroid. - const SessionID& session_id() const { return session_tab_id_; } const SessionID& window_id() const { return session_window_id_; } int GetAndroidId() const; @@ -160,7 +159,7 @@ jboolean incognito, jboolean is_background_tab, const base::android::JavaParamRef<jobject>& jweb_contents, - const base::android::JavaParamRef<jobject>& jparent_web_contents, + jint jparent_tab_id, const base::android::JavaParamRef<jobject>& jweb_contents_delegate, const base::android::JavaParamRef<jobject>& jcontext_menu_populator); void UpdateDelegates( @@ -191,7 +190,6 @@ jint referrer_policy, jboolean is_renderer_initiated, jboolean should_replace_current_entry, - jlong intent_received_timestamp, jboolean has_user_gesture, jboolean should_clear_history_list); void SetActiveNavigationEntryTitleForUrl( @@ -323,9 +321,6 @@ JavaObjectWeakGlobalRef weak_java_tab_; - // The identifier used by session restore for this tab. - SessionID session_tab_id_; - // Identifier of the window the tab is in. SessionID session_window_id_;
diff --git a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc new file mode 100644 index 0000000..ad9a55335 --- /dev/null +++ b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
@@ -0,0 +1,556 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "base/command_line.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/guid.h" +#include "base/json/json_reader.h" +#include "base/json/json_string_value_serializer.h" +#include "base/macros.h" +#include "base/path_service.h" +#include "base/strings/string16.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" +#include "base/values.h" +#include "build/build_config.h" +#include "chrome/browser/autofill/autofill_uitest.h" +#include "chrome/browser/autofill/autofill_uitest_util.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/autofill/chrome_autofill_client.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/interactive_test_utils.h" +#include "chrome/test/base/test_switches.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/autofill/content/browser/content_autofill_driver_factory.h" +#include "components/autofill/core/browser/autofill_manager.h" +#include "components/autofill/core/browser/autofill_manager_test_delegate.h" +#include "components/autofill/core/browser/autofill_profile.h" +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/credit_card.h" +#include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/browser/state_names.h" +#include "components/autofill/core/common/autofill_features.h" +#include "components/autofill/core/common/autofill_switches.h" +#include "content/public/browser/browsing_data_remover.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/browsing_data_remover_test_util.h" +#include "content/public/test/test_renderer_host.h" +#include "content/public/test/test_utils.h" +#include "services/network/public/cpp/network_switches.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const base::TimeDelta default_action_timeout = base::TimeDelta::FromSeconds(30); + +std::string FilePathToUTF8(const base::FilePath::StringType& str) { +#if defined(OS_WIN) + return base::WideToUTF8(str); +#else + return str; +#endif +} + +base::FilePath GetReplayFilesDirectory() { + base::FilePath src_dir; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); + return src_dir.Append( + FILE_PATH_LITERAL("chrome/test/data/autofill/captured_sites")); +} + +// Iterate through Autofill's Web Page Replay capture file directory to look +// for captures sites and automation recipe files. Return a list of sites for +// which recipe-based testing is available. +std::vector<std::string> GetCapturedSites() { + std::vector<std::string> sites; + base::FileEnumerator capture_files(GetReplayFilesDirectory(), false, + base::FileEnumerator::FILES); + for (base::FilePath file = capture_files.Next(); !file.empty(); + file = capture_files.Next()) { + // If a site capture file is found, also look to see if the directory has + // a corresponding recorded action recipe log file. + // A site capture file has no extension. A recorded action recipe log file + // has the '.test' extension. + if (file.Extension().empty() && + base::PathExists(file.AddExtension(FILE_PATH_LITERAL(".test")))) { + std::string file_name(file.BaseName().value().begin(), + file.BaseName().value().end()); + sites.push_back(file_name); + } + } + std::sort(sites.begin(), sites.end()); + return sites; +} + +} // namespace + +namespace autofill { + +class AutofillCapturedSitesInteractiveTest + : public AutofillUiTest, + public ::testing::WithParamInterface<std::string> { + protected: + AutofillCapturedSitesInteractiveTest() + : profile_(test::GetFullProfile()), + card_(CreditCard(base::GenerateGUID(), "http://www.example.com")) {} + ~AutofillCapturedSitesInteractiveTest() override {} + + // InProcessBrowserTest: + void SetUpOnMainThread() override { + AutofillUiTest::SetUpOnMainThread(); + SetupTestProfile(); + ASSERT_TRUE(InstallWebPageReplayServerRootCert()) + << "Cannot install the root certificate " + << "for the local web page replay server."; + CleanupSiteData(); + } + + void TearDownOnMainThread() override { + // If there are still cookies at the time the browser test shuts down, + // Chrome's SQL lite persistent cookie store will crash. + CleanupSiteData(); + EXPECT_TRUE(StopWebPageReplayServer()) + << "Cannot stop the local Web Page Replay server."; + EXPECT_TRUE(RemoveWebPageReplayServerRootCert()) + << "Cannot remove the root certificate " + << "for the local Web Page Replay server."; + + AutofillUiTest::TearDownOnMainThread(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + // Enable the autofill show typed prediction feature. When active this + // feature forces input elements on a form to display their autofill type + // prediction. Test will check this attribute on all the relevant input + // elements in a form to determine if the form is ready for interaction. + feature_list_.InitAndEnableFeature(features::kAutofillShowTypePredictions); + command_line->AppendSwitch(switches::kShowAutofillTypePredictions); + + // Direct traffic to the Web Page Replay server. + command_line->AppendSwitchASCII( + network::switches::kHostResolverRules, + base::StringPrintf( + "MAP *:80 127.0.0.1:%d," + "MAP *:443 127.0.0.1:%d," + // Uncomment to use the live autofill prediction server. + // "EXCLUDE clients1.google.com," + "EXCLUDE localhost", + host_http_port_, host_https_port_)); + } + + bool StartWebPageReplayServer(const std::string& replay_file) { + std::vector<std::string> args; + base::FilePath src_dir; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); + args.push_back(base::StringPrintf("--http_port=%d", host_http_port_)); + args.push_back(base::StringPrintf("--https_port=%d", host_https_port_)); + args.push_back(base::StringPrintf( + "--inject_scripts=%s,%s", + FilePathToUTF8(src_dir + .Append(FILE_PATH_LITERAL( + "third_party/catapult/web_page_replay_go")) + .Append(FILE_PATH_LITERAL("deterministic.js")) + .value()) + .c_str(), + FilePathToUTF8( + src_dir + .Append(FILE_PATH_LITERAL( + "chrome/test/data/web_page_replay_go_helper_scripts")) + .Append(FILE_PATH_LITERAL("automation_helper.js")) + .value()) + .c_str())); + + // Specify the replay file. + args.push_back(base::StringPrintf( + "%s", FilePathToUTF8( + GetReplayFilesDirectory().AppendASCII(replay_file).value()) + .c_str())); + + web_page_replay_server_ = RunWebPageReplayCmd("replay", args); + + // Sleep 20 seconds to wait for the web page replay server to start. + // TODO(bug 847910): create a process std stream reader class to use the + // process output to determine when the server is ready. + base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); + + return web_page_replay_server_.IsValid(); + } + + bool StopWebPageReplayServer() { + if (web_page_replay_server_.IsValid()) + return web_page_replay_server_.Terminate(0, true); + // The test server hasn't started, no op. + return true; + } + + bool ReplayRecordedActions(const char* recipe_file_name) { + // Read the text of the recipe file. + base::FilePath src_dir; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); + base::FilePath recipe_file_path = GetReplayFilesDirectory().AppendASCII( + base::StringPrintf("%s.test", recipe_file_name)); + base::ThreadRestrictions::SetIOAllowed(true); + std::string json_text; + CHECK(base::ReadFileToString(recipe_file_path, &json_text)); + + // Convert the file text into a json object. + std::unique_ptr<base::DictionaryValue> recipe = + base::DictionaryValue::From(base::JSONReader().ReadToValue(json_text)); + if (!recipe) { + ADD_FAILURE() << "Failed to deserialize json text!"; + return false; + } + + // Navigate to the starting url. + std::string starting_url; + CHECK(recipe->GetString("startingURL", &starting_url)); + CHECK(content::ExecuteScript( + GetWebContents(), base::StringPrintf("window.location.href = '%s';", + starting_url.c_str()))); + // Iterate through and execute all the actions contained in the recipe. + base::ListValue* action_list; + CHECK(recipe->GetList("actions", &action_list)); + for (base::ListValue::iterator it_action = action_list->begin(); + it_action != action_list->end(); ++it_action) { + base::DictionaryValue* action; + CHECK(it_action->GetAsDictionary(&action)); + std::string type; + CHECK(action->GetString("type", &type)); + + if (base::CompareCaseInsensitiveASCII(type, "waitFor") == 0) { + std::vector<std::string> state_assertions; + base::ListValue* assertions_list; + CHECK(action->GetList("assertions", &assertions_list)); + for (base::ListValue::iterator it_assertion = assertions_list->begin(); + it_assertion != assertions_list->end(); ++it_assertion) { + std::string assertion; + CHECK(it_assertion->GetAsString(&assertion)); + state_assertions.push_back(assertion); + } + CHECK(WaitForStateChange(state_assertions, default_action_timeout)); + } else { + std::string xpath; + CHECK(action->GetString("selector", &xpath)); + LOG(INFO) << "Executing recipe action"; + LOG(INFO) << "type: " << type; + LOG(INFO) << "xpath: " << xpath; + + // Wait for the target element to be visible and enabled on the page. + std::vector<std::string> state_assertions; + state_assertions.push_back(base::StringPrintf( + "return automation_helper.isElementWithXpathReady(`%s`);", + xpath.c_str())); + CHECK(WaitForStateChange(state_assertions, default_action_timeout)); + + if (base::CompareCaseInsensitiveASCII(type, "click") == 0) { + CHECK(ExecuteJavaScriptOnElementByXpath(xpath, "target.click();")); + } else if (base::CompareCaseInsensitiveASCII(type, "type") == 0) { + std::string value; + CHECK(action->GetString("value", &value)); + CHECK(ExecuteJavaScriptOnElementByXpath( + xpath, base::StringPrintf( + "automation_helper.setInputElementValue(target, `%s`)", + value.c_str()))); + } else if (base::CompareCaseInsensitiveASCII(type, "select") == 0) { + int selected_index; + CHECK(action->GetInteger("index", &selected_index)); + CHECK(ExecuteJavaScriptOnElementByXpath( + xpath, base::StringPrintf( + "automation_helper" + ".selectOptionFromDropDownElementByIndex(target, %d)", + selected_index))); + } else if (base::CompareCaseInsensitiveASCII(type, "autofill") == 0) { + std::vector<std::string> additional_state_assertions; + base::ListValue* fields_list; + CHECK(action->GetList("fields", &fields_list)); + + // Wait for all the autofilled elements to become visible on the + // page, and also wait for the `autofill-prediction` attribute on + // each element to be appended. Without the `autofill-prediction` + // attribute, Chrome will not be able to autofill the field. + for (base::ListValue::iterator it_field = fields_list->begin(); + it_field != fields_list->end(); ++it_field) { + base::DictionaryValue* field; + CHECK(it_field->GetAsDictionary(&field)); + std::string field_xpath; + CHECK(field->GetString("selector", &field_xpath)); + additional_state_assertions.push_back(base::StringPrintf( + "return automation_helper.isElementWithXpathReady(`%s`);", + field_xpath.c_str())); + additional_state_assertions.push_back(base::StringPrintf( + "var attr = automation_helper.getElementByXpath(`%s`)" + ".getAttribute('autofill-prediction');" + "return (attr !== undefined && attr !== null);", + field_xpath.c_str())); + } + CHECK(WaitForStateChange(additional_state_assertions, + default_action_timeout)); + CHECK(TryFillForm(xpath, 5)); + // Go through each autofilled fields and verify that + // 1. The element has the expected autofill-prediction attribute. + // This attribute is set either by chrome's local heuristic or + // by Chrome Autofill team's prediction server. + // 2. The element has the expected value. + for (base::ListValue::iterator it_field = fields_list->begin(); + it_field != fields_list->end(); ++it_field) { + base::DictionaryValue* field; + CHECK(it_field->GetAsDictionary(&field)); + std::string field_xpath; + std::string autofill_prediction; + std::string expected_value; + CHECK(field->GetString("selector", &field_xpath)); + CHECK( + field->GetString("expectedAutofillType", &autofill_prediction)); + CHECK(field->GetString("expectedValue", &expected_value)); + ExpectElementPropertyEquals( + field_xpath.c_str(), + "return target.getAttribute('autofill-prediction');", + autofill_prediction, true); + ExpectElementPropertyEquals(field_xpath.c_str(), + "return target.value;", expected_value); + } + } else { + ADD_FAILURE() << "Unrecognized action type: " << type; + } + } // end if type != "waitFor" + } // end foreach action + return true; + } + + const CreditCard credit_card() { return card_; } + + const AutofillProfile profile() { return profile_; } + + private: + void SetupTestProfile() { + test::SetCreditCardInfo(&card_, "Milton Waddams", "9621327911759602", "5", + "2027", "1"); + test::SetProfileInfo(&profile_, "Milton", "C.", "Waddams", + "red.swingline@initech.com", "Initech", + "4120 Freidrich Lane", "Apt 8", "Austin", "Texas", + "78744", "US", "5125551234"); + AddTestAutofillData(browser(), profile_, card_); + } + + bool InstallWebPageReplayServerRootCert() { + return RunWebPageReplayCmdAndWaitForExit("installroot", + std::vector<std::string>()); + } + + bool RemoveWebPageReplayServerRootCert() { + return RunWebPageReplayCmdAndWaitForExit("removeroot", + std::vector<std::string>()); + } + + bool RunWebPageReplayCmdAndWaitForExit( + const std::string& cmd, + const std::vector<std::string>& args, + const base::TimeDelta& timeout = base::TimeDelta::FromSeconds(5)) { + base::Process process = RunWebPageReplayCmd(cmd, args); + if (process.IsValid()) { + int exit_code; + if (process.WaitForExitWithTimeout(timeout, &exit_code)) + return (exit_code == 0); + } + return false; + } + + base::Process RunWebPageReplayCmd(const std::string& cmd, + const std::vector<std::string>& args) { + base::LaunchOptions options = base::LaunchOptionsForTest(); + base::FilePath exe_dir; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &exe_dir)); + base::FilePath web_page_replay_binary_dir = + exe_dir.Append(FILE_PATH_LITERAL( + "third_party/catapult/telemetry/telemetry/internal/bin")); + options.current_directory = web_page_replay_binary_dir; + +#if defined(OS_WIN) + std::string wpr_executable_binary = "win/x86_64/wpr"; +#elif defined(OS_MACOSX) + std::string wpr_executable_binary = "mac/x86_64/wpr"; +#elif defined(OS_POSIX) + std::string wpr_executable_binary = "linux/x86_64/wpr"; +#else +#error Plaform is not supported. +#endif + base::CommandLine full_command( + web_page_replay_binary_dir.AppendASCII(wpr_executable_binary)); + full_command.AppendArg(cmd); + + // Ask web page replay to use the custom certifcate and key files used to + // make the web page captures. + // The capture files used in these browser tests are also used on iOS to + // test autofill. + // The custom cert and key files are different from those of the offical + // WPR releases. The custom files are made to work on iOS. + base::FilePath src_dir; + CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)); + base::FilePath web_page_replay_support_file_dir = + src_dir.Append(FILE_PATH_LITERAL( + "components/test/data/autofill/web_page_replay_support_files")); + full_command.AppendArg(base::StringPrintf( + "--https_cert_file=%s", + FilePathToUTF8(web_page_replay_support_file_dir + .Append(FILE_PATH_LITERAL("wpr_cert.pem")) + .value()) + .c_str())); + full_command.AppendArg(base::StringPrintf( + "--https_key_file=%s", + FilePathToUTF8(web_page_replay_support_file_dir + .Append(FILE_PATH_LITERAL("wpr_key.pem")) + .value()) + .c_str())); + + for (auto const& arg : args) + full_command.AppendArg(arg); + + return base::LaunchProcess(full_command, options); + } + + bool WaitForStateChange( + const std::vector<std::string>& state_assertions, + const base::TimeDelta& timeout = default_action_timeout) { + const base::TimeTicks start_time = base::TimeTicks::Now(); + while (!AllAssertionsPassed(state_assertions)) { + if (base::TimeTicks::Now() - start_time > timeout) { + ADD_FAILURE() << "State change hasn't completed within timeout."; + return false; + } + base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1)); + } + return true; + } + + bool AllAssertionsPassed(const std::vector<std::string>& assertions) + WARN_UNUSED_RESULT { + for (std::string const& assertion : assertions) { + bool assertion_passed = false; + EXPECT_TRUE(content::ExecuteScriptAndExtractBool( + GetWebContents(), + base::StringPrintf("window.domAutomationController.send(" + " (function() {" + " try {" + " %s" + " } catch (ex) {}" + " return false;" + " })());", + assertion.c_str()), + &assertion_passed)); + if (!assertion_passed) { + LOG(ERROR) << "'" << assertion << "' failed!"; + return false; + } + } + return true; + } + + void CleanupSiteData() { + // Navigate to about:blank, then clear the browser cache. + // Navigating to about:blank before clearing the cache ensures that + // the cleanup is thorough and nothing is held. + ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL)); + content::BrowsingDataRemover* remover = + content::BrowserContext::GetBrowsingDataRemover(browser()->profile()); + content::BrowsingDataRemoverCompletionObserver completion_observer(remover); + remover->RemoveAndReply( + base::Time(), base::Time::Max(), + content::BrowsingDataRemover::DATA_TYPE_COOKIES, + content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB, + &completion_observer); + completion_observer.BlockUntilCompletion(); + } + + bool ExecuteJavaScriptOnElementByXpath( + const std::string& element_xpath, + const std::string& execute_function_body, + const base::TimeDelta& time_to_wait_for_element = + default_action_timeout) { + std::string js(base::StringPrintf( + "try {" + " var element = automation_helper.getElementByXpath(`%s`);" + " (function(target) { %s })(element);" + "} catch(ex) {}", + element_xpath.c_str(), execute_function_body.c_str())); + return content::ExecuteScript(GetWebContents(), js); + } + + bool ExpectElementPropertyEquals( + const std::string& element_xpath, + const std::string& get_property_function_body, + const std::string& expected_value, + bool ignoreCase = false) { + std::string value; + if (content::ExecuteScriptAndExtractString( + GetWebContents(), + base::StringPrintf( + "window.domAutomationController.send(" + " (function() {" + " try {" + " var element = function() {" + " return automation_helper.getElementByXpath(`%s`);" + " }();" + " return function(target){%s}(element);" + " } catch (ex) {}" + " return 'Exception encountered';" + " })());", + element_xpath.c_str(), get_property_function_body.c_str()), + &value)) { + if (ignoreCase) { + EXPECT_TRUE(base::EqualsCaseInsensitiveASCII(expected_value, value)) + << "Field xpath: `" << element_xpath << "`, " + << "Expected: " << expected_value << ", actual: " << value; + } else { + EXPECT_EQ(expected_value, value) + << "Field xpath: `" << element_xpath << "`, "; + } + return true; + } + LOG(ERROR) << element_xpath << ", " << get_property_function_body; + return false; + } + + // The Web Page Replay server that will be serving the captured sites + base::Process web_page_replay_server_; + const int host_http_port_ = 8080; + const int host_https_port_ = 8081; + + AutofillProfile profile_; + CreditCard card_; + + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_P(AutofillCapturedSitesInteractiveTest, Recipe) { + // Prints the path of the test to be executed. + LOG(INFO) << GetParam(); + ASSERT_TRUE(StartWebPageReplayServer(GetParam())); + ASSERT_TRUE(ReplayRecordedActions(GetParam().c_str())); +} + +struct GetParamAsString { + template <class ParamType> + std::string operator()(const testing::TestParamInfo<ParamType>& info) const { + return info.param; + } +}; + +INSTANTIATE_TEST_CASE_P(, + AutofillCapturedSitesInteractiveTest, + testing::ValuesIn(GetCapturedSites()), + GetParamAsString()); +} // namespace autofill
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 7b9f7b3..f386e6d 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -24,6 +24,7 @@ #include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "build/build_config.h" +#include "chrome/browser/autofill/autofill_uitest.h" #include "chrome/browser/autofill/autofill_uitest_util.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/metrics/subprocess_metrics_provider.h" @@ -202,63 +203,6 @@ " <input type=\"text\" id=\"phone\"><br>" "</form>"; -// AutofillManagerTestDelegateImpl -------------------------------------------- - -class AutofillManagerTestDelegateImpl - : public autofill::AutofillManagerTestDelegate { - public: - AutofillManagerTestDelegateImpl() {} - ~AutofillManagerTestDelegateImpl() override {} - - // autofill::AutofillManagerTestDelegate: - void DidPreviewFormData() override { - ASSERT_TRUE(loop_runner_); - loop_runner_->Quit(); - } - - void DidFillFormData() override { - ASSERT_TRUE(loop_runner_); - if (!is_expecting_dynamic_refill_) - ASSERT_TRUE(loop_runner_->running()); - loop_runner_->Quit(); - } - - void DidShowSuggestions() override { - ASSERT_TRUE(loop_runner_); - loop_runner_->Quit(); - } - - void OnTextFieldChanged() override { - if (!waiting_for_text_change_) - return; - waiting_for_text_change_ = false; - ASSERT_TRUE(loop_runner_); - loop_runner_->Quit(); - } - - void Reset() { loop_runner_ = std::make_unique<base::RunLoop>(); } - - void Wait() { - loop_runner_->Run(); - } - - void WaitForTextChange() { - waiting_for_text_change_ = true; - loop_runner_->Run(); - } - - void SetIsExpectingDynamicRefill(bool expect_refill) { - is_expecting_dynamic_refill_ = expect_refill; - } - - private: - std::unique_ptr<base::RunLoop> loop_runner_; - bool waiting_for_text_change_ = false; - bool is_expecting_dynamic_refill_ = false; - - DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl); -}; - // Searches all frames of |web_contents| and returns one called |name|. If // there are none, returns null, if there are more, returns an arbitrary one. content::RenderFrameHost* RenderFrameHostForName( @@ -279,13 +223,10 @@ // TODO(crbug.com/832707): Parametrize this class to ensure that all tests in // this run with all possible valid combinations of // features and field trials. -class AutofillInteractiveTestBase : public InProcessBrowserTest { +class AutofillInteractiveTestBase : public AutofillUiTest { protected: explicit AutofillInteractiveTestBase(bool popup_views_enabled) : https_server_(net::EmbeddedTestServer::TYPE_HTTPS), - key_press_event_sink_(base::BindRepeating( - &AutofillInteractiveTestBase::HandleKeyPressEvent, - base::Unretained(this))), popup_views_enabled_(popup_views_enabled) { scoped_feature_list_.InitWithFeatureState(kAutofillExpandedPopupViews, popup_views_enabled_); @@ -300,25 +241,13 @@ } void SetUpOnMainThread() override { + AutofillUiTest::SetUpOnMainThread(); + https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); https_server_.ServeFilesFromSourceDirectory("chrome/test/data"); ASSERT_TRUE(https_server_.InitializeAndListen()); https_server_.StartAcceptingConnections(); - InProcessBrowserTest::SetUpOnMainThread(); - // Don't want Keychain coming up on Mac. - test::DisableSystemServices(browser()->profile()->GetPrefs()); - - // Inject the test delegate into the AutofillManager. - GetAutofillManager()->SetTestDelegate(&test_delegate_); - - // If the mouse happened to be over where the suggestions are shown, then - // the preview will show up and will fail the tests. We need to give it a - // point that's within the browser frame, or else the method hangs. - gfx::Point reset_mouse(GetWebContents()->GetContainerBounds().origin()); - reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5); - ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(reset_mouse)); - controllable_http_response_ = std::make_unique<net::test_server::ControllableHttpResponse>( embedded_test_server(), "/mock_translate_script.js", @@ -330,9 +259,7 @@ } void TearDownOnMainThread() override { - // Make sure to close any showing popups prior to tearing down the UI. - GetAutofillManager()->client()->HideAutofillPopup(); - test::ReenableSystemServices(); + AutofillUiTest::TearDownOnMainThread(); } content::WebContents* GetWebContents() { @@ -343,13 +270,6 @@ return GetWebContents()->GetRenderViewHost(); } - AutofillManager* GetAutofillManager() { - content::WebContents* web_contents = GetWebContents(); - return ContentAutofillDriverFactory::FromWebContents(web_contents) - ->DriverForFrame(web_contents->GetMainFrame()) - ->autofill_manager(); - } - void CreateTestProfile() { AutofillProfile profile; test::SetProfileInfo(&profile, "Milton", "C.", "Waddams", @@ -568,79 +488,6 @@ AssertFieldValue(element_name, ""); } - void SendKeyToPageAndWait(ui::DomKey key) { - ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); - ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); - SendKeyToPageAndWait(key, code, key_code); - } - - void SendKeyToPageAndWait(ui::DomKey key, - ui::DomCode code, - ui::KeyboardCode key_code) { - test_delegate_.Reset(); - content::SimulateKeyPress(GetWebContents(), key, code, key_code, false, - false, false, false); - test_delegate_.Wait(); - } - - bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event) { - return true; - } - - void SendKeyToPopupAndWait(ui::DomKey key) { - ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); - ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); - SendKeyToPopupAndWait(key, code, key_code, - GetRenderViewHost()->GetWidget()); - } - - void SendKeyToPopupAndWait(ui::DomKey key, - ui::DomCode code, - ui::KeyboardCode key_code, - content::RenderWidgetHost* widget) { - // Route popup-targeted key presses via the render view host. - content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::kRawKeyDown, - blink::WebInputEvent::kNoModifiers, - ui::EventTimeForNow()); - event.windows_key_code = key_code; - event.dom_code = static_cast<int>(code); - event.dom_key = key; - test_delegate_.Reset(); - // Install the key press event sink to ensure that any events that are not - // handled by the installed callbacks do not end up crashing the test. - widget->AddKeyPressEventCallback(key_press_event_sink_); - widget->ForwardKeyboardEvent(event); - test_delegate_.Wait(); - widget->RemoveKeyPressEventCallback(key_press_event_sink_); - } - - void SendKeyToDataListPopup(ui::DomKey key) { - ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); - ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); - SendKeyToDataListPopup(key, code, key_code); - } - - // Datalist does not support autofill preview. There is no need to start - // message loop for Datalist. - void SendKeyToDataListPopup(ui::DomKey key, - ui::DomCode code, - ui::KeyboardCode key_code) { - // Route popup-targeted key presses via the render view host. - content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::kRawKeyDown, - blink::WebInputEvent::kNoModifiers, - ui::EventTimeForNow()); - event.windows_key_code = key_code; - event.dom_code = static_cast<int>(code); - event.dom_key = key; - // Install the key press event sink to ensure that any events that are not - // handled by the installed callbacks do not end up crashing the test. - GetRenderViewHost()->GetWidget()->AddKeyPressEventCallback( - key_press_event_sink_); - GetRenderViewHost()->GetWidget()->ForwardKeyboardEvent(event); - GetRenderViewHost()->GetWidget()->RemoveKeyPressEventCallback( - key_press_event_sink_); - } - void TryBasicFormFill() { FocusFirstNameField(); @@ -698,12 +545,11 @@ SendKeyToPopupAndWait(ui::DomKey::ENTER); } - AutofillManagerTestDelegateImpl* test_delegate() { return &test_delegate_; } net::EmbeddedTestServer* https_server() { return &https_server_; } private: net::EmbeddedTestServer https_server_; - AutofillManagerTestDelegateImpl test_delegate_; + net::TestURLFetcherFactory url_fetcher_factory_; // KeyPressEventCallback that serves as a sink to ensure that every key press
diff --git a/chrome/browser/autofill/autofill_uitest.cc b/chrome/browser/autofill/autofill_uitest.cc new file mode 100644 index 0000000..1639716b --- /dev/null +++ b/chrome/browser/autofill/autofill_uitest.cc
@@ -0,0 +1,352 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "base/macros.h" +#include "base/message_loop/message_loop.h" +#include "base/run_loop.h" +#include "chrome/browser/autofill/autofill_uitest.h" +#include "chrome/browser/autofill/personal_data_manager_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/test/base/interactive_test_utils.h" +#include "components/autofill/content/browser/content_autofill_driver.h" +#include "components/autofill/content/browser/content_autofill_driver_factory.h" +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/personal_data_manager.h" +#include "components/autofill/core/browser/personal_data_manager_observer.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/test_utils.h" +#include "ui/events/base_event_utils.h" + +namespace autofill { + +// AutofillManagerTestDelegateImpl -------------------------------------------- +AutofillManagerTestDelegateImpl::AutofillManagerTestDelegateImpl() + : run_loop_(nullptr), + is_expecting_dynamic_refill_(false), + waiting_for_preview_form_data_(false), + waiting_for_fill_form_data_(false), + waiting_for_show_suggestion_(false), + waiting_for_text_change_(false) {} + +AutofillManagerTestDelegateImpl::~AutofillManagerTestDelegateImpl() {} + +void AutofillManagerTestDelegateImpl::DidPreviewFormData() { + if (!waiting_for_preview_form_data_) + return; + waiting_for_preview_form_data_ = false; + run_loop_->Quit(); +} + +void AutofillManagerTestDelegateImpl::DidFillFormData() { + if (!is_expecting_dynamic_refill_) + ASSERT_TRUE(run_loop_->running()); + if (!waiting_for_fill_form_data_) + return; + waiting_for_fill_form_data_ = false; + run_loop_->Quit(); +} + +void AutofillManagerTestDelegateImpl::DidShowSuggestions() { + if (!waiting_for_show_suggestion_) + return; + waiting_for_show_suggestion_ = false; + run_loop_->Quit(); +} + +void AutofillManagerTestDelegateImpl::OnTextFieldChanged() { + if (!waiting_for_text_change_) + return; + waiting_for_text_change_ = false; + run_loop_->Quit(); +} + +void AutofillManagerTestDelegateImpl::Reset() { + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, nullptr); + waiting_for_preview_form_data_ = false; + waiting_for_fill_form_data_ = false; + waiting_for_show_suggestion_ = false; + waiting_for_text_change_ = false; +} + +void AutofillManagerTestDelegateImpl::Wait() { + waiting_for_preview_form_data_ = true; + waiting_for_fill_form_data_ = true; + waiting_for_show_suggestion_ = true; + base::RunLoop run_loop; + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop); + run_loop_->Run(); +} + +void AutofillManagerTestDelegateImpl::WaitForTextChange() { + waiting_for_text_change_ = true; + base::RunLoop run_loop; + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop); + run_loop_->Run(); +} + +bool AutofillManagerTestDelegateImpl::WaitForPreviewFormData( + base::TimeDelta timeout = base::TimeDelta::FromSeconds(0)) { + waiting_for_preview_form_data_ = true; + base::RunLoop run_loop; + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop); + if (!timeout.is_zero()) { + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop_->QuitClosure(), timeout); + } + run_loop_->Run(); + return !waiting_for_preview_form_data_; +} + +bool AutofillManagerTestDelegateImpl::WaitForFormDataFilled( + base::TimeDelta timeout = base::TimeDelta::FromSeconds(0)) { + waiting_for_fill_form_data_ = true; + base::RunLoop run_loop; + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop); + if (!timeout.is_zero()) { + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop_->QuitClosure(), timeout); + } + run_loop_->Run(); + return !waiting_for_fill_form_data_; +} + +bool AutofillManagerTestDelegateImpl::WaitForSuggestionShown( + base::TimeDelta timeout = base::TimeDelta::FromSeconds(0)) { + waiting_for_show_suggestion_ = true; + base::RunLoop run_loop; + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop); + if (!timeout.is_zero()) { + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop_->QuitClosure(), timeout); + } + run_loop_->Run(); + return !waiting_for_show_suggestion_; +} + +bool AutofillManagerTestDelegateImpl::WaitForTextChange( + base::TimeDelta timeout = base::TimeDelta::FromSeconds(0)) { + waiting_for_text_change_ = true; + base::RunLoop run_loop; + base::AutoReset<base::RunLoop*> auto_reset(&run_loop_, &run_loop); + if (!timeout.is_zero()) { + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop_->QuitClosure(), timeout); + } + run_loop_->Run(); + return !waiting_for_text_change_; +} + +// AutofillUiTest ---------------------------------------------------- +AutofillUiTest::AutofillUiTest() + : key_press_event_sink_( + base::BindRepeating(&AutofillUiTest::HandleKeyPressEvent, + base::Unretained(this))) {} + +AutofillUiTest::~AutofillUiTest() {} + +void AutofillUiTest::SetUpOnMainThread() { + // Don't want Keychain coming up on Mac. + test::DisableSystemServices(browser()->profile()->GetPrefs()); + + // Inject the test delegate into the AutofillManager. + GetAutofillManager()->SetTestDelegate(test_delegate()); + + // If the mouse happened to be over where the suggestions are shown, then + // the preview will show up and will fail the tests. We need to give it a + // point that's within the browser frame, or else the method hangs. + gfx::Point reset_mouse(GetWebContents()->GetContainerBounds().origin()); + reset_mouse = gfx::Point(reset_mouse.x() + 5, reset_mouse.y() + 5); + ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(reset_mouse)); +} + +void AutofillUiTest::TearDownOnMainThread() { + // Make sure to close any showing popups prior to tearing down the UI. + GetAutofillManager()->client()->HideAutofillPopup(); + test::ReenableSystemServices(); +} + +bool AutofillUiTest::TryFillForm(const std::string& focus_element_xpath, + const int attempts) { + content::WebContents* web_contents = GetWebContents(); + AutofillManager* autofill_manager = + ContentAutofillDriverFactory::FromWebContents(web_contents) + ->DriverForFrame(web_contents->GetMainFrame()) + ->autofill_manager(); + + int tries = 0; + while (tries < attempts) { + tries++; + autofill_manager->client()->HideAutofillPopup(); + + if (!ShowAutofillSuggestion(focus_element_xpath)) { + LOG(WARNING) << "Failed to bring up the autofill suggestion drop down."; + continue; + } + + // Press the down key again to highlight the first choice in the autofill + // suggestion drop down. + test_delegate()->Reset(); + SendKeyToPopup(ui::DomKey::ARROW_DOWN); + if (!test_delegate()->WaitForPreviewFormData( + base::TimeDelta::FromSeconds(5))) { + LOG(WARNING) << "Failed to select an option from the" + << " autofill suggestion drop down."; + continue; + } + + // Press the enter key to invoke autofill using the first suggestion. + test_delegate()->Reset(); + SendKeyToPopup(ui::DomKey::ENTER); + if (!test_delegate()->WaitForFormDataFilled( + base::TimeDelta::FromSeconds(5))) { + LOG(WARNING) << "Failed to fill the form."; + continue; + } + + return true; + } + + autofill_manager->client()->HideAutofillPopup(); + return false; +} + +bool AutofillUiTest::ShowAutofillSuggestion( + const std::string& focus_element_xpath) { + const std::string js(base::StringPrintf( + "try {" + " var element = automation_helper.getElementByXpath(`%s`);" + " while (document.activeElement !== element) {" + " element.focus();" + " }" + "} catch(ex) {}", + focus_element_xpath.c_str())); + if (content::ExecuteScript(GetWebContents(), js)) { + test_delegate()->Reset(); + SendKeyToPage(ui::DomKey::ARROW_DOWN); + return test_delegate()->WaitForSuggestionShown( + base::TimeDelta::FromSeconds(5)); + } + return false; +} + +void AutofillUiTest::SendKeyToPage(ui::DomKey key) { + ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); + ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); + content::SimulateKeyPress(GetWebContents(), key, code, key_code, false, false, + false, false); +} + +void AutofillUiTest::SendKeyToPageAndWait(ui::DomKey key) { + ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); + ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); + SendKeyToPageAndWait(key, code, key_code); +} + +void AutofillUiTest::SendKeyToPageAndWait(ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code) { + test_delegate()->Reset(); + content::SimulateKeyPress(GetWebContents(), key, code, key_code, false, false, + false, false); + test_delegate()->Wait(); +} + +void AutofillUiTest::SendKeyToPopup(ui::DomKey key) { + ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); + ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); + content::RenderWidgetHost* widget = GetRenderViewHost()->GetWidget(); + + // Route popup-targeted key presses via the render view host. + content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::kRawKeyDown, + blink::WebInputEvent::kNoModifiers, + ui::EventTimeForNow()); + event.windows_key_code = key_code; + event.dom_code = static_cast<int>(code); + event.dom_key = key; + // Install the key press event sink to ensure that any events that are not + // handled by the installed callbacks do not end up crashing the test. + widget->AddKeyPressEventCallback(key_press_event_sink_); + widget->ForwardKeyboardEvent(event); + widget->RemoveKeyPressEventCallback(key_press_event_sink_); +} + +void AutofillUiTest::SendKeyToPopupAndWait(ui::DomKey key) { + ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); + ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); + SendKeyToPopupAndWait(key, code, key_code, GetRenderViewHost()->GetWidget()); +} + +void AutofillUiTest::SendKeyToPopupAndWait(ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code, + content::RenderWidgetHost* widget) { + // Route popup-targeted key presses via the render view host. + content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::kRawKeyDown, + blink::WebInputEvent::kNoModifiers, + ui::EventTimeForNow()); + event.windows_key_code = key_code; + event.dom_code = static_cast<int>(code); + event.dom_key = key; + test_delegate()->Reset(); + // Install the key press event sink to ensure that any events that are not + // handled by the installed callbacks do not end up crashing the test. + widget->AddKeyPressEventCallback(key_press_event_sink_); + widget->ForwardKeyboardEvent(event); + test_delegate()->Wait(); + widget->RemoveKeyPressEventCallback(key_press_event_sink_); +} + +void AutofillUiTest::SendKeyToDataListPopup(ui::DomKey key) { + ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); + ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); + SendKeyToDataListPopup(key, code, key_code); +} + +// Datalist does not support autofill preview. There is no need to start +// message loop for Datalist. +void AutofillUiTest::SendKeyToDataListPopup(ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code) { + // Route popup-targeted key presses via the render view host. + content::NativeWebKeyboardEvent event(blink::WebKeyboardEvent::kRawKeyDown, + blink::WebInputEvent::kNoModifiers, + ui::EventTimeForNow()); + event.windows_key_code = key_code; + event.dom_code = static_cast<int>(code); + event.dom_key = key; + // Install the key press event sink to ensure that any events that are not + // handled by the installed callbacks do not end up crashing the test. + GetRenderViewHost()->GetWidget()->AddKeyPressEventCallback( + key_press_event_sink_); + GetRenderViewHost()->GetWidget()->ForwardKeyboardEvent(event); + GetRenderViewHost()->GetWidget()->RemoveKeyPressEventCallback( + key_press_event_sink_); +} + +bool AutofillUiTest::HandleKeyPressEvent( + const content::NativeWebKeyboardEvent& event) { + return true; +} + +content::WebContents* AutofillUiTest::GetWebContents() { + return browser()->tab_strip_model()->GetActiveWebContents(); +} + +content::RenderViewHost* AutofillUiTest::GetRenderViewHost() { + return GetWebContents()->GetRenderViewHost(); +} + +AutofillManager* AutofillUiTest::GetAutofillManager() { + content::WebContents* web_contents = GetWebContents(); + return ContentAutofillDriverFactory::FromWebContents(web_contents) + ->DriverForFrame(web_contents->GetMainFrame()) + ->autofill_manager(); +} + +} // namespace autofill
diff --git a/chrome/browser/autofill/autofill_uitest.h b/chrome/browser/autofill/autofill_uitest.h new file mode 100644 index 0000000..66de854 --- /dev/null +++ b/chrome/browser/autofill/autofill_uitest.h
@@ -0,0 +1,111 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_AUTOFILL_AUTOFILL_UITEST_H_ +#define CHROME_BROWSER_AUTOFILL_AUTOFILL_UITEST_H_ + +#include <string> + +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/interactive_test_utils.h" +#include "components/autofill/core/browser/autofill_manager.h" +#include "components/autofill/core/browser/autofill_manager_test_delegate.h" +#include "content/public/browser/render_widget_host.h" +#include "content/public/test/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/events/keycodes/dom/dom_key.h" +#include "ui/events/keycodes/keyboard_code_conversion.h" +#include "ui/events/keycodes/keyboard_codes.h" + +namespace autofill { + +class AutofillManagerTestDelegateImpl + : public autofill::AutofillManagerTestDelegate { + public: + AutofillManagerTestDelegateImpl(); + ~AutofillManagerTestDelegateImpl() override; + + // autofill::AutofillManagerTestDelegate: + void DidPreviewFormData() override; + void DidFillFormData() override; + void DidShowSuggestions() override; + void OnTextFieldChanged() override; + + void Reset(); + void Wait(); + void WaitForTextChange(); + bool WaitForPreviewFormData(base::TimeDelta timeout); + bool WaitForFormDataFilled(base::TimeDelta timeout); + bool WaitForSuggestionShown(base::TimeDelta timeout); + bool WaitForTextChange(base::TimeDelta timeout); + void SetIsExpectingDynamicRefill(bool expect_refill) { + is_expecting_dynamic_refill_ = expect_refill; + } + + private: + base::RunLoop* run_loop_; + bool is_expecting_dynamic_refill_; + bool waiting_for_preview_form_data_; + bool waiting_for_fill_form_data_; + bool waiting_for_show_suggestion_; + bool waiting_for_text_change_; + + DISALLOW_COPY_AND_ASSIGN(AutofillManagerTestDelegateImpl); +}; + +class AutofillUiTest : public InProcessBrowserTest { + protected: + AutofillUiTest(); + ~AutofillUiTest() override; + + // InProcessBrowserTest: + void SetUpOnMainThread() override; + void TearDownOnMainThread() override; + + bool TryFillForm(const std::string& focus_element_xpath, + const int attempts = 1); + bool ShowAutofillSuggestion(const std::string& focus_element_xpath); + + void SendKeyToPageAndWait(ui::DomKey key); + void SendKeyToPageAndWait(ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code); + void SendKeyToPopupAndWait(ui::DomKey key); + void SendKeyToPopupAndWait(ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code, + content::RenderWidgetHost* widget); + void SendKeyToDataListPopup(ui::DomKey key); + void SendKeyToDataListPopup(ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code); + bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event); + + content::WebContents* GetWebContents(); + content::RenderViewHost* GetRenderViewHost(); + AutofillManager* GetAutofillManager(); + + AutofillManagerTestDelegateImpl* test_delegate() { return &test_delegate_; } + content::RenderWidgetHost::KeyPressEventCallback key_press_event_sink(); + + private: + void SendKeyToPage(ui::DomKey key); + void SendKeyToPopup(ui::DomKey key); + + AutofillManagerTestDelegateImpl test_delegate_; + + // KeyPressEventCallback that serves as a sink to ensure that every key press + // event the tests create and have the WebContents forward is handled by some + // key press event callback. It is necessary to have this sink because if no + // key press event callback handles the event (at least on Mac), a DCHECK + // ends up going off that the |event| doesn't have an |os_event| associated + // with it. + content::RenderWidgetHost::KeyPressEventCallback key_press_event_sink_; + + DISALLOW_COPY_AND_ASSIGN(AutofillUiTest); +}; + +} // namespace autofill + +#endif // CHROME_BROWSER_AUTOFILL_AUTOFILL_UITEST_H_
diff --git a/chrome/browser/autofill/autofill_uitest_util.cc b/chrome/browser/autofill/autofill_uitest_util.cc index edd2e3d..b4dd07b 100644 --- a/chrome/browser/autofill/autofill_uitest_util.cc +++ b/chrome/browser/autofill/autofill_uitest_util.cc
@@ -90,4 +90,13 @@ observer.Wait(); } +void AddTestAutofillData(Browser* browser, + const AutofillProfile& profile, + const CreditCard& card) { + AddTestProfile(browser, profile); + PdmChangeWaiter observer(browser); + GetPersonalDataManager(browser->profile())->AddCreditCard(card); + observer.Wait(); +} + } // namespace autofill
diff --git a/chrome/browser/autofill/autofill_uitest_util.h b/chrome/browser/autofill/autofill_uitest_util.h index 0cbcfa3d..6140db1c 100644 --- a/chrome/browser/autofill/autofill_uitest_util.h +++ b/chrome/browser/autofill/autofill_uitest_util.h
@@ -17,9 +17,10 @@ void AddTestProfile(Browser* browser, const AutofillProfile& profile); void SetTestProfile(Browser* browser, const AutofillProfile& profile); void SetTestProfiles(Browser* browser, std::vector<AutofillProfile>* profiles); - void AddTestCreditCard(Browser* browser, const CreditCard& card); - +void AddTestAutofillData(Browser* browser, + const AutofillProfile& profile, + const CreditCard& card); } // namespace autofill #endif // CHROME_BROWSER_AUTOFILL_AUTOFILL_UITEST_UTIL_H_
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 5748001..d2fb3a3 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc
@@ -840,7 +840,7 @@ network_time_tracker_ = std::make_unique<network_time::NetworkTimeTracker>( base::WrapUnique(new base::DefaultClock()), base::WrapUnique(new base::DefaultTickClock()), local_state(), - system_request_context()); + system_network_context_manager()->GetSharedURLLoaderFactory()); } return network_time_tracker_.get(); } @@ -1169,7 +1169,7 @@ network_time_tracker_ = std::make_unique<network_time::NetworkTimeTracker>( base::WrapUnique(new base::DefaultClock()), base::WrapUnique(new base::DefaultTickClock()), local_state(), - system_request_context()); + system_network_context_manager()->GetSharedURLLoaderFactory()); } }
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 6feb907..80a2c9d 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1159,6 +1159,8 @@ "login/ui/captive_portal_window_proxy.h", "login/ui/input_events_blocker.cc", "login/ui/input_events_blocker.h", + "login/ui/kiosk_app_menu_updater.cc", + "login/ui/kiosk_app_menu_updater.h", "login/ui/login_display.cc", "login/ui/login_display.h", "login/ui/login_display_host.cc",
diff --git a/chrome/browser/chromeos/accessibility/select_to_speak_event_handler.cc b/chrome/browser/chromeos/accessibility/select_to_speak_event_handler.cc index 4dbdf08..72d45ac 100644 --- a/chrome/browser/chromeos/accessibility/select_to_speak_event_handler.cc +++ b/chrome/browser/chromeos/accessibility/select_to_speak_event_handler.cc
@@ -49,9 +49,6 @@ const ui::KeyboardCode kSpeakSelectionKey = ui::VKEY_S; SelectToSpeakEventHandler::SelectToSpeakEventHandler() { - // Add this to the root level EventTarget so that it is called first. - // TODO(katie): instead of using the root level EventTarget, just add this - // handler to ash::Shell::Get()->GetPrimaryRootWindow(). if (aura::Env::GetInstanceDontCreate()) aura::Env::GetInstanceDontCreate()->AddPreTargetHandler( this, ui::EventTarget::Priority::kAccessibility);
diff --git a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc index 0a92cc9..9042f9ef 100644 --- a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc +++ b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc
@@ -69,6 +69,8 @@ namespace { +constexpr int32_t DEFAULT_RSSI = -127; + // https://android.googlesource.com/platform/system/bt/+/master/stack/include/gatt_api.h constexpr int32_t GATT_CHAR_PROP_BIT_BROADCAST = (1 << 0); constexpr int32_t GATT_CHAR_PROP_BIT_READ = (1 << 1); @@ -514,7 +516,8 @@ is_bluetooth_instance_up_ = false; } -void ArcBluetoothBridge::SendDevice(const BluetoothDevice* device) const { +void ArcBluetoothBridge::SendDevice(const BluetoothDevice* device, + bool include_cached_device) const { auto* bluetooth_instance = ARC_GET_INSTANCE_FOR_METHOD( arc_bridge_service_->bluetooth(), OnDeviceFound); if (!bluetooth_instance) @@ -531,21 +534,23 @@ base::Optional<int8_t> rssi = device->GetInquiryRSSI(); mojom::BluetoothAddressPtr addr; - // We only want to send updated advertise data to Android only when we are - // scanning which is checked by the validity of rssi. Here are the 2 cases - // that we don't want to send updated advertise data to Android. - // 1) Cached found device and 2) rssi became invalid when we stop scanning. - if (rssi.has_value()) { - auto* btle_instance = ARC_GET_INSTANCE_FOR_METHOD( - arc_bridge_service_->bluetooth(), OnLEDeviceFound); - if (!btle_instance) - return; - std::vector<mojom::BluetoothAdvertisingDataPtr> adv_data = - GetAdvertisingData(device); - addr = mojom::BluetoothAddress::From(device->GetAddress()); - btle_instance->OnLEDeviceFound(std::move(addr), rssi.value(), - std::move(adv_data)); - } + // There are two cases where we send advertise data to Android: + // 1) Cached found devices are sent when applications start scanning. + // In this case, |include_cached_device| is true. + // 2) Updated devices are sent during scanning. In this case, rssi is valid. + if (!rssi.has_value() && !include_cached_device) + return; + + auto* btle_instance = ARC_GET_INSTANCE_FOR_METHOD( + arc_bridge_service_->bluetooth(), OnLEDeviceFound); + if (!btle_instance) + return; + + std::vector<mojom::BluetoothAdvertisingDataPtr> adv_data = + GetAdvertisingData(device); + addr = mojom::BluetoothAddress::From(device->GetAddress()); + btle_instance->OnLEDeviceFound(std::move(addr), rssi.value_or(DEFAULT_RSSI), + std::move(adv_data)); } device::BluetoothDevice::PairingDelegate* ArcBluetoothBridge::ShowPairingDialog( @@ -584,7 +589,7 @@ if (!IsInstanceUp()) return; - SendDevice(device); + SendDevice(device, /* include_cached_device = */ false); if (!(device->GetType() & device::BLUETOOTH_TRANSPORT_LE)) return; @@ -1857,7 +1862,7 @@ mojo::ScopedHandle handle = mojo::WrapPlatformHandle(mojo::PlatformHandle(std::move(sock))); - if (handle.is_valid() != MOJO_RESULT_OK) { + if (!handle.is_valid()) { LOG(ERROR) << "Failed to wrap socket handle. Closing"; std::move(callback).Run(mojo::ScopedHandle()); return; @@ -2820,15 +2825,8 @@ void ArcBluetoothBridge::SendCachedDevicesFound() const { DCHECK(bluetooth_adapter_); - - // Send devices that have already been discovered, but aren't connected. - BluetoothAdapter::DeviceList devices = bluetooth_adapter_->GetDevices(); - for (auto* device : devices) { - if (device->IsPaired()) - continue; - - SendDevice(device); - } + for (auto* device : bluetooth_adapter_->GetDevices()) + SendDevice(device, /* include_cached_device = */ true); } void ArcBluetoothBridge::SendCachedPairedDevices() const { @@ -2839,7 +2837,7 @@ if (!device->IsPaired()) continue; - SendDevice(device); + SendDevice(device, /* include_cached_device = */ true); // OnBondStateChanged must be called with mojom::BluetoothBondState::BONDING // to make sure the bond state machine on Android is ready to take the
diff --git a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h index 7085cb8..fc9f141 100644 --- a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h +++ b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h
@@ -530,7 +530,8 @@ // or return false if the advertisement map is full. bool GetAdvertisementHandle(int32_t* adv_handle); - void SendDevice(const device::BluetoothDevice* device) const; + void SendDevice(const device::BluetoothDevice* device, + bool include_cached_device) const; // Shows a pairing dialog to handle incoming pairing requests. // Returns the pairing delegate of the dialog UI.
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc index c97b214..c0fa61c 100644 --- a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc +++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
@@ -30,8 +30,7 @@ weak_factory_(this) { } -DeviceEventRouter::~DeviceEventRouter() { -} +DeviceEventRouter::~DeviceEventRouter() = default; void DeviceEventRouter::Startup() { is_starting_up_ = true;
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc index d098b1ef..c34fefad 100644 --- a/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc +++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/chromeos/extensions/file_manager/device_event_router.h" +#include <memory> #include <string> #include <vector> @@ -32,7 +33,7 @@ DeviceEventRouterImpl() : DeviceEventRouter(base::TimeDelta::FromSeconds(0)), external_storage_disabled(false) {} - ~DeviceEventRouterImpl() override {} + ~DeviceEventRouterImpl() override = default; // DeviceEventRouter overrides. void OnDeviceEvent(file_manager_private::DeviceEventType type, @@ -63,7 +64,7 @@ class DeviceEventRouterTest : public testing::Test { protected: void SetUp() override { - device_event_router.reset(new DeviceEventRouterImpl()); + device_event_router = std::make_unique<DeviceEventRouterImpl>(); } // Creates a disk instance with |device_path| and |mount_path| for testing.
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc index da839e6..717ec65 100644 --- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc +++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
@@ -6,6 +6,7 @@ #include <stddef.h> +#include <memory> #include <set> #include <utility> @@ -478,7 +479,7 @@ chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); power_manager_client->RemoveObserver(device_event_router_.get()); - profile_ = NULL; + profile_ = nullptr; } void EventRouter::ObserveEvents() { @@ -575,7 +576,7 @@ watch_path, base::Bind(&EventRouter::HandleFileWatchNotification, weak_factory_.GetWeakPtr(), - static_cast<drive::FileChange*>(NULL)), + static_cast<drive::FileChange*>(nullptr)), callback); } @@ -617,12 +618,13 @@ if (error == base::File::FILE_OK) { // Send success event. status.type = file_manager_private::COPY_PROGRESS_STATUS_TYPE_SUCCESS; - status.source_url.reset(new std::string(source_url.spec())); - status.destination_url.reset(new std::string(destination_url.spec())); + status.source_url = std::make_unique<std::string>(source_url.spec()); + status.destination_url = + std::make_unique<std::string>(destination_url.spec()); } else { // Send error event. status.type = file_manager_private::COPY_PROGRESS_STATUS_TYPE_ERROR; - status.error.reset(new std::string(FileErrorToErrorName(error))); + status.error = std::make_unique<std::string>(FileErrorToErrorName(error)); } BroadcastEvent(profile_, @@ -641,15 +643,16 @@ file_manager_private::CopyProgressStatus status; status.type = CopyProgressTypeToCopyProgressStatusType(type); - status.source_url.reset(new std::string(source_url.spec())); + status.source_url = std::make_unique<std::string>(source_url.spec()); if (type == storage::FileSystemOperation::END_COPY_ENTRY || type == storage::FileSystemOperation::ERROR_COPY_ENTRY) - status.destination_url.reset(new std::string(destination_url.spec())); + status.destination_url = + std::make_unique<std::string>(destination_url.spec()); if (type == storage::FileSystemOperation::ERROR_COPY_ENTRY) - status.error.reset( - new std::string(FileErrorToErrorName(base::File::FILE_ERROR_FAILED))); + status.error = std::make_unique<std::string>( + FileErrorToErrorName(base::File::FILE_ERROR_FAILED)); if (type == storage::FileSystemOperation::PROGRESS) - status.size.reset(new double(size)); + status.size = std::make_unique<double>(size); // Discard error progress since current JS code cannot handle this properly. // TODO(yawano): Remove this after JS side is implemented correctly. @@ -675,7 +678,7 @@ std::vector<std::string> extension_ids; extension_ids.push_back(extension_id); - DispatchDirectoryChangeEvent(file_system_url.virtual_path(), NULL, + DispatchDirectoryChangeEvent(file_system_url.virtual_path(), nullptr, false /* error */, extension_ids); } @@ -709,7 +712,7 @@ } void EventRouter::OnDirectoryChanged(const base::FilePath& drive_path) { - HandleFileWatchNotification(NULL, drive_path, false); + HandleFileWatchNotification(nullptr, drive_path, false); } void EventRouter::OnFileChanged(const drive::FileChange& changed_files) { @@ -837,7 +840,7 @@ // kDirectoryChangeEventMaxDetailInfoSize, since passing large list // and processing it may cause more itme. // This will be invoked full-refresh in the Files app. - list = NULL; + list = nullptr; } DispatchDirectoryChangeEvent(iter->second->virtual_path(), @@ -910,8 +913,8 @@ // Detailed information is available. if (list.get()) { - event.changed_files.reset( - new std::vector<file_manager_private::FileChange>()); + event.changed_files = + std::make_unique<std::vector<file_manager_private::FileChange>>(); if (list->map().empty()) return;
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router_factory.cc b/chrome/browser/chromeos/extensions/file_manager/event_router_factory.cc index c5bfc04..1f59246c 100644 --- a/chrome/browser/chromeos/extensions/file_manager/event_router_factory.cc +++ b/chrome/browser/chromeos/extensions/file_manager/event_router_factory.cc
@@ -38,8 +38,7 @@ DependsOn(arc::ArcIntentHelperBridge::GetFactory()); } -EventRouterFactory::~EventRouterFactory() { -} +EventRouterFactory::~EventRouterFactory() = default; KeyedService* EventRouterFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc index e9b1fde..bd53249 100644 --- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc +++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.cc
@@ -161,7 +161,7 @@ DISALLOW_COPY_AND_ASSIGN(FileSelectorImpl); }; -FileSelectorImpl::FileSelectorImpl() {} +FileSelectorImpl::FileSelectorImpl() = default; FileSelectorImpl::~FileSelectorImpl() { if (dialog_.get()) @@ -186,7 +186,7 @@ base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&FileSelectorImpl::FileSelectionCanceled, - base::Unretained(this), static_cast<void*>(NULL))); + base::Unretained(this), static_cast<void*>(nullptr))); } } @@ -215,13 +215,11 @@ allowed_file_info.allowed_paths = ui::SelectFileDialog::FileTypeInfo::ANY_PATH; - dialog_->SelectFile(ui::SelectFileDialog::SELECT_SAVEAS_FILE, - base::string16() /* dialog title*/, - suggested_name, - &allowed_file_info, - 0 /* file type index */, - std::string() /* default file extension */, - browser->window()->GetNativeWindow(), NULL /* params */); + dialog_->SelectFile( + ui::SelectFileDialog::SELECT_SAVEAS_FILE, + base::string16() /* dialog title*/, suggested_name, &allowed_file_info, + 0 /* file type index */, std::string() /* default file extension */, + browser->window()->GetNativeWindow(), nullptr /* params */); return dialog_->IsRunning(browser->window()->GetNativeWindow()); } @@ -252,14 +250,14 @@ // We don't want to send multiple responses. if (function_.get()) function_->OnFilePathSelected(success, selected_path); - function_ = NULL; + function_ = nullptr; } // FileSelectorFactory implementation. class FileSelectorFactoryImpl : public FileSelectorFactory { public: - FileSelectorFactoryImpl() {} - ~FileSelectorFactoryImpl() override {} + FileSelectorFactoryImpl() = default; + ~FileSelectorFactoryImpl() override = default; // FileSelectorFactory implementation. // Creates new FileSelectorImplementation for the function. @@ -289,7 +287,7 @@ } FileBrowserHandlerInternalSelectFileFunction:: - ~FileBrowserHandlerInternalSelectFileFunction() {} + ~FileBrowserHandlerInternalSelectFileFunction() = default; bool FileBrowserHandlerInternalSelectFileFunction::RunAsync() { std::unique_ptr<SelectFile::Params> params( @@ -367,7 +365,7 @@ // If the file was selected, add 'entry' object which will be later used to // create a FileEntry instance for the selected file. if (success && entry_definition.error == base::File::FILE_OK) { - result->entry.reset(new FileEntryInfo()); + result->entry = std::make_unique<FileEntryInfo>(); // TODO(mtomasz): Make the response fields consistent with other files. result->entry->file_system_name = entry_definition.file_system_name; result->entry->file_system_root = entry_definition.file_system_root_url;
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.h b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.h index 15f140b..e3239d1 100644 --- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.h +++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api.h
@@ -33,7 +33,7 @@ // it should delete itself once it's done. class FileSelector { public: - virtual ~FileSelector() {} + virtual ~FileSelector() = default; // Starts the file selection. It should prompt user to select a file path. // Once the selection is made it should asynchronously call @@ -63,7 +63,7 @@ // create a FileSelector it can use to select a file path. class FileSelectorFactory { public: - virtual ~FileSelectorFactory() {} + virtual ~FileSelectorFactory() = default; // Creates a FileSelector instance for the // FileBrowserHandlerInternalSelectFileFunction.
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc index 9aac25a1..eaf2ad69 100644 --- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc +++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
@@ -49,7 +49,7 @@ success(success), selected_path(selected_path) { } - ~TestCase() {} + ~TestCase() = default; // Path that we expect to be suggested to the file selector. base::FilePath suggested_name; @@ -84,7 +84,7 @@ success_(success), selected_path_(selected_path) { } - ~MockFileSelector() override {} + ~MockFileSelector() override = default; // file_manager::FileSelector implementation. // |browser| is not used. @@ -139,7 +139,7 @@ success_(test_case.success), selected_path_(test_case.selected_path) { } - ~MockFileSelectorFactory() override {} + ~MockFileSelectorFactory() override = default; // file_manager::FileSelectorFactory implementation. file_manager::FileSelector* CreateFileSelector() const override { @@ -232,7 +232,7 @@ }; const std::vector<TestCase>* FileBrowserHandlerExtensionTest::test_cases_ = - NULL; + nullptr; size_t FileBrowserHandlerExtensionTest::current_test_case_ = 0; // End to end test that verifies that fileBrowserHandler.selectFile works as @@ -249,20 +249,14 @@ GetFullPathOnTmpMountPoint(base::FilePath("test_file.txt")); std::vector<std::string> allowed_extensions; - allowed_extensions.push_back("txt"); - allowed_extensions.push_back("html"); + allowed_extensions.emplace_back("txt"); + allowed_extensions.emplace_back("html"); std::vector<TestCase> test_cases; - test_cases.push_back( - TestCase(base::FilePath("some_file_name.txt"), - allowed_extensions, - true, - selected_path)); - test_cases.push_back( - TestCase(base::FilePath("fail"), - std::vector<std::string>(), - false, - base::FilePath())); + test_cases.emplace_back(base::FilePath("some_file_name.txt"), + allowed_extensions, true, selected_path); + test_cases.emplace_back(base::FilePath("fail"), std::vector<std::string>(), + false, base::FilePath()); SetTestCases(&test_cases); @@ -303,7 +297,7 @@ run_loop.Run(); EXPECT_EQ(kExpectedContents, contents); - SetTestCases(NULL); + SetTestCases(nullptr); } // Tests that verifies the fileBrowserHandlerInternal.selectFile function fails
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc index b0f069ff..4b88039 100644 --- a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
@@ -5,6 +5,8 @@ #include <stddef.h> #include <stdint.h> +#include <memory> + #include "base/base64.h" #include "base/macros.h" #include "base/run_loop.h" @@ -187,8 +189,9 @@ void SetUpOnMainThread() override { extensions::ExtensionApiTest::SetUpOnMainThread(); - testing_profile_.reset(new TestingProfile()); - event_router_.reset(new file_manager::EventRouter(testing_profile_.get())); + testing_profile_ = std::make_unique<TestingProfile>(); + event_router_ = + std::make_unique<file_manager::EventRouter>(testing_profile_.get()); } void TearDownOnMainThread() override {
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_stream_md5_digester.cc b/chrome/browser/chromeos/extensions/file_manager/file_stream_md5_digester.cc index 163dc76..beb02e4 100644 --- a/chrome/browser/chromeos/extensions/file_manager/file_stream_md5_digester.cc +++ b/chrome/browser/chromeos/extensions/file_manager/file_stream_md5_digester.cc
@@ -22,7 +22,7 @@ FileStreamMd5Digester::FileStreamMd5Digester() : buffer_(new net::IOBuffer(kMd5DigestBufferSize)) {} -FileStreamMd5Digester::~FileStreamMd5Digester() {} +FileStreamMd5Digester::~FileStreamMd5Digester() = default; void FileStreamMd5Digester::GetMd5Digest( std::unique_ptr<storage::FileStreamReader> stream_reader,
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc index a947a2b..772f1bd 100644 --- a/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc +++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/extensions/file_manager/job_event_router.h" #include <cmath> +#include <memory> #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/chromeos/file_manager/app_id.h" @@ -24,8 +25,7 @@ weak_factory_(this) { } -JobEventRouter::~JobEventRouter() { -} +JobEventRouter::~JobEventRouter() = default; void JobEventRouter::OnJobAdded(const drive::JobInfo& job_info) { OnJobUpdated(job_info); @@ -87,7 +87,7 @@ bool immediate) { const bool no_pending_task = !pending_job_info_; - pending_job_info_.reset(new drive::JobInfo(job_info)); + pending_job_info_ = std::make_unique<drive::JobInfo>(job_info); pending_state_ = state; if (immediate) {
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc index 13f220e..f70f1380 100644 --- a/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc +++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc
@@ -7,6 +7,8 @@ #include <stddef.h> #include <stdint.h> +#include <memory> + #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/message_loop/message_loop.h" @@ -61,7 +63,9 @@ class JobEventRouterTest : public testing::Test { protected: - void SetUp() override { job_event_router.reset(new JobEventRouterImpl()); } + void SetUp() override { + job_event_router = std::make_unique<JobEventRouterImpl>(); + } drive::JobInfo CreateJobInfo(drive::JobID id, int64_t num_completed_bytes,
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_base.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_base.cc index 2dd89947..c356da5 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_base.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_base.cc
@@ -22,8 +22,7 @@ start_time_ = base::Time::Now(); } -LoggedAsyncExtensionFunction::~LoggedAsyncExtensionFunction() { -} +LoggedAsyncExtensionFunction::~LoggedAsyncExtensionFunction() = default; void LoggedAsyncExtensionFunction::OnResponded() { drive::EventLogger* logger = file_manager::util::GetLogger(GetProfile());
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.cc index a9b2c8d..4a5cb1d 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.cc
@@ -61,7 +61,7 @@ EXTENSION_FUNCTION_VALIDATE(params); std::vector<GURL> file_paths; - file_paths.push_back(GURL(params->selected_path)); + file_paths.emplace_back(params->selected_path); file_manager::util::GetSelectedFileInfoLocalPathOption option = file_manager::util::NO_LOCAL_PATH_RESOLUTION; @@ -103,7 +103,7 @@ std::vector<GURL> file_urls; for (size_t i = 0; i < params->selected_paths.size(); ++i) - file_urls.push_back(GURL(params->selected_paths[i])); + file_urls.emplace_back(params->selected_paths[i]); file_manager::util::GetSelectedFileInfo( render_frame_host(),
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.h b/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.h index b4a7253..d8dc8204 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_dialog.h
@@ -26,7 +26,7 @@ FILEMANAGERPRIVATE_CANCELDIALOG) protected: - ~FileManagerPrivateCancelDialogFunction() override {} + ~FileManagerPrivateCancelDialogFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -39,7 +39,7 @@ FILEMANAGERPRIVATE_SELECTFILE) protected: - ~FileManagerPrivateSelectFileFunction() override {} + ~FileManagerPrivateSelectFileFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -59,7 +59,7 @@ FILEMANAGERPRIVATE_SELECTFILES) protected: - ~FileManagerPrivateSelectFilesFunction() override {} + ~FileManagerPrivateSelectFilesFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc index ed5d3b8d..6d9fe79 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -102,21 +102,21 @@ void FillEntryPropertiesValueForDrive(const drive::ResourceEntry& entry_proto, bool shared_with_me, EntryProperties* properties) { - properties->shared_with_me.reset(new bool(shared_with_me)); - properties->shared.reset(new bool(entry_proto.shared())); - properties->starred.reset(new bool(entry_proto.starred())); + properties->shared_with_me = std::make_unique<bool>(shared_with_me); + properties->shared = std::make_unique<bool>(entry_proto.shared()); + properties->starred = std::make_unique<bool>(entry_proto.starred()); const drive::PlatformFileInfoProto& file_info = entry_proto.file_info(); - properties->size.reset(new double(file_info.size())); - properties->modification_time.reset(new double( - base::Time::FromInternalValue(file_info.last_modified()).ToJsTime())); - properties->modification_by_me_time.reset(new double( + properties->size = std::make_unique<double>(file_info.size()); + properties->modification_time = std::make_unique<double>( + base::Time::FromInternalValue(file_info.last_modified()).ToJsTime()); + properties->modification_by_me_time = std::make_unique<double>( base::Time::FromInternalValue(entry_proto.last_modified_by_me()) - .ToJsTime())); + .ToJsTime()); if (entry_proto.has_alternate_url()) { - properties->alternate_url.reset( - new std::string(entry_proto.alternate_url())); + properties->alternate_url = + std::make_unique<std::string>(entry_proto.alternate_url()); properties->share_url = GetShareUrlFromAlternateUrl(GURL(entry_proto.alternate_url())); } @@ -131,59 +131,61 @@ (GURL(google_apis::DriveApiUrlGenerator:: kBaseThumbnailUrlForProduction)), google_apis::GetTeamDrivesIntegrationSwitch()); - properties->thumbnail_url.reset(new std::string( + properties->thumbnail_url = std::make_unique<std::string>( url_generator .GetThumbnailUrl(entry_proto.resource_id(), 500 /* width */, 500 /* height */, false /* not cropped */) - .spec())); - properties->cropped_thumbnail_url.reset(new std::string( + .spec()); + properties->cropped_thumbnail_url = std::make_unique<std::string>( url_generator .GetThumbnailUrl( entry_proto.resource_id(), kFileManagerMaximumThumbnailDimension /* width */, kFileManagerMaximumThumbnailDimension /* height */, true /* cropped */) - .spec())); + .spec()); } if (file_specific_info.has_image_width()) { - properties->image_width.reset(new int(file_specific_info.image_width())); + properties->image_width = + std::make_unique<int>(file_specific_info.image_width()); } if (file_specific_info.has_image_height()) { - properties->image_height.reset( - new int(file_specific_info.image_height())); + properties->image_height = + std::make_unique<int>(file_specific_info.image_height()); } if (file_specific_info.has_image_rotation()) { - properties->image_rotation.reset( - new int(file_specific_info.image_rotation())); + properties->image_rotation = + std::make_unique<int>(file_specific_info.image_rotation()); } - properties->hosted.reset(new bool(file_specific_info.is_hosted_document())); - properties->content_mime_type.reset( - new std::string(file_specific_info.content_mime_type())); - properties->pinned.reset( - new bool(file_specific_info.cache_state().is_pinned())); - properties->dirty.reset( - new bool(file_specific_info.cache_state().is_dirty())); - properties->present.reset( - new bool(file_specific_info.cache_state().is_present())); + properties->hosted = + std::make_unique<bool>(file_specific_info.is_hosted_document()); + properties->content_mime_type = + std::make_unique<std::string>(file_specific_info.content_mime_type()); + properties->pinned = + std::make_unique<bool>(file_specific_info.cache_state().is_pinned()); + properties->dirty = + std::make_unique<bool>(file_specific_info.cache_state().is_dirty()); + properties->present = + std::make_unique<bool>(file_specific_info.cache_state().is_present()); if (file_specific_info.cache_state().is_present()) { - properties->available_offline.reset(new bool(true)); + properties->available_offline = std::make_unique<bool>(true); } else if (file_specific_info.is_hosted_document() && file_specific_info.has_document_extension()) { const std::string file_extension = file_specific_info.document_extension(); // What's available offline? See the 'Web' column at: // https://support.google.com/drive/answer/1628467 - properties->available_offline.reset(new bool( + properties->available_offline = std::make_unique<bool>( file_extension == ".gdoc" || file_extension == ".gdraw" || - file_extension == ".gsheet" || file_extension == ".gslides")); + file_extension == ".gsheet" || file_extension == ".gslides"); } else { - properties->available_offline.reset(new bool(false)); + properties->available_offline = std::make_unique<bool>(false); } - properties->available_when_metered.reset( - new bool(file_specific_info.cache_state().is_present() || - file_specific_info.is_hosted_document())); + properties->available_when_metered = + std::make_unique<bool>(file_specific_info.cache_state().is_present() || + file_specific_info.is_hosted_document()); } if (entry_proto.has_capabilities_info()) { @@ -198,24 +200,24 @@ capabilities_info.has_can_copy()) { can_copy = capabilities_info.can_copy(); } - properties->can_copy.reset(new bool(can_copy)); + properties->can_copy = std::make_unique<bool>(can_copy); - properties->can_delete.reset(new bool(capabilities_info.has_can_delete() - ? capabilities_info.can_delete() - : true)); - properties->can_rename.reset(new bool(capabilities_info.has_can_rename() - ? capabilities_info.can_rename() - : true)); + properties->can_delete = std::make_unique<bool>( + capabilities_info.has_can_delete() ? capabilities_info.can_delete() + : true); + properties->can_rename = std::make_unique<bool>( + capabilities_info.has_can_rename() ? capabilities_info.can_rename() + : true); // |can_add_children| defaults to true for directories, and false for files. - properties->can_add_children.reset( - new bool(capabilities_info.has_can_add_children() - ? capabilities_info.can_add_children() - : file_info.is_directory())); + properties->can_add_children = + std::make_unique<bool>(capabilities_info.has_can_add_children() + ? capabilities_info.can_add_children() + : file_info.is_directory()); - properties->can_share.reset(new bool(capabilities_info.has_can_share() - ? capabilities_info.can_share() - : true)); + properties->can_share = std::make_unique<bool>( + capabilities_info.has_can_share() ? capabilities_info.can_share() + : true); } } @@ -265,7 +267,7 @@ // The instance will be destroyed by itself. } - virtual ~SingleEntryPropertiesGetterForDrive() {} + virtual ~SingleEntryPropertiesGetterForDrive() = default; private: SingleEntryPropertiesGetterForDrive( @@ -277,7 +279,7 @@ local_path_(local_path), running_profile_(profile), properties_(new EntryProperties), - file_owner_profile_(NULL), + file_owner_profile_(nullptr), weak_ptr_factory_(this) { DCHECK(!callback_.is_null()); DCHECK(profile); @@ -427,7 +429,8 @@ // icon. const GURL doc_icon = drive::util::FindPreferredIcon( app_info.document_icons, drive::util::kPreferredIconSize); - properties_->custom_icon_url.reset(new std::string(doc_icon.spec())); + properties_->custom_icon_url = + std::make_unique<std::string>(doc_icon.spec()); } } } @@ -478,7 +481,7 @@ // The instance will be destroyed by itself. } - virtual ~SingleEntryPropertiesGetterForFileSystemProvider() {} + virtual ~SingleEntryPropertiesGetterForFileSystemProvider() = default; private: SingleEntryPropertiesGetterForFileSystemProvider( @@ -543,29 +546,30 @@ if (names_.find(api::file_manager_private::ENTRY_PROPERTY_NAME_SIZE) != names_.end()) { - properties_->size.reset(new double(*metadata->size.get())); + properties_->size = std::make_unique<double>(*metadata->size.get()); } if (names_.find( api::file_manager_private::ENTRY_PROPERTY_NAME_MODIFICATIONTIME) != names_.end()) { - properties_->modification_time.reset( - new double(metadata->modification_time->ToJsTime())); + properties_->modification_time = + std::make_unique<double>(metadata->modification_time->ToJsTime()); } if (names_.find( api::file_manager_private::ENTRY_PROPERTY_NAME_CONTENTMIMETYPE) != names_.end() && metadata->mime_type.get()) { - properties_->content_mime_type.reset( - new std::string(*metadata->mime_type)); + properties_->content_mime_type = + std::make_unique<std::string>(*metadata->mime_type); } if (names_.find( api::file_manager_private::ENTRY_PROPERTY_NAME_THUMBNAILURL) != names_.end() && metadata->thumbnail.get()) { - properties_->thumbnail_url.reset(new std::string(*metadata->thumbnail)); + properties_->thumbnail_url = + std::make_unique<std::string>(*metadata->thumbnail); } CompleteGetEntryProperties(base::File::FILE_OK); @@ -690,8 +694,8 @@ metadata->modification_by_me_time.ToJsTime()); } if (!metadata->content_mime_type.empty()) { - properties_->content_mime_type.reset( - new std::string(metadata->content_mime_type)); + properties_->content_mime_type = + std::make_unique<std::string>(metadata->content_mime_type); } if (!metadata->custom_icon_url.empty()) { properties_->custom_icon_url = @@ -780,8 +784,7 @@ } FileManagerPrivateInternalGetEntryPropertiesFunction:: - ~FileManagerPrivateInternalGetEntryPropertiesFunction() { -} + ~FileManagerPrivateInternalGetEntryPropertiesFunction() = default; bool FileManagerPrivateInternalGetEntryPropertiesFunction::RunAsync() { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -849,8 +852,8 @@ DCHECK(0 <= processed_count_ && processed_count_ < properties_list_.size()); if (error == base::File::FILE_OK) { - properties->external_file_url.reset( - new std::string(chromeos::FileSystemURLToExternalFileURL(url).spec())); + properties->external_file_url = std::make_unique<std::string>( + chromeos::FileSystemURLToExternalFileURL(url).spec()); } properties_list_[index] = std::move(*properties); @@ -1245,15 +1248,18 @@ Profile::FromBrowserContext(browser_context()))) { case drive::util::DRIVE_DISCONNECTED_NOSERVICE: result.type = kDriveConnectionTypeOffline; - result.reason.reset(new std::string(kDriveConnectionReasonNoService)); + result.reason = + std::make_unique<std::string>(kDriveConnectionReasonNoService); break; case drive::util::DRIVE_DISCONNECTED_NONETWORK: result.type = kDriveConnectionTypeOffline; - result.reason.reset(new std::string(kDriveConnectionReasonNoNetwork)); + result.reason = + std::make_unique<std::string>(kDriveConnectionReasonNoNetwork); break; case drive::util::DRIVE_DISCONNECTED_NOTREADY: result.type = kDriveConnectionTypeOffline; - result.reason.reset(new std::string(kDriveConnectionReasonNotReady)); + result.reason = + std::make_unique<std::string>(kDriveConnectionReasonNotReady); break; case drive::util::DRIVE_CONNECTED_METERED: result.type = kDriveConnectionTypeMetered; @@ -1407,10 +1413,10 @@ } FileManagerPrivateInternalGetDownloadUrlFunction:: - FileManagerPrivateInternalGetDownloadUrlFunction() {} + FileManagerPrivateInternalGetDownloadUrlFunction() = default; FileManagerPrivateInternalGetDownloadUrlFunction:: - ~FileManagerPrivateInternalGetDownloadUrlFunction() {} + ~FileManagerPrivateInternalGetDownloadUrlFunction() = default; bool FileManagerPrivateInternalGetDownloadUrlFunction::RunAsync() { using extensions::api::file_manager_private_internal::GetShareUrl::Params; @@ -1498,13 +1504,11 @@ SigninManagerFactory::GetForProfile(GetProfile()); const std::string& account_id = signin_manager->GetAuthenticatedAccountId(); std::vector<std::string> scopes; - scopes.push_back("https://www.googleapis.com/auth/drive.readonly"); + scopes.emplace_back("https://www.googleapis.com/auth/drive.readonly"); - auth_service_.reset( - new google_apis::AuthService(oauth2_token_service, - account_id, - GetProfile()->GetRequestContext(), - scopes)); + auth_service_ = std::make_unique<google_apis::AuthService>( + oauth2_token_service, account_id, GetProfile()->GetRequestContext(), + scopes); auth_service_->StartAuthentication(base::Bind( &FileManagerPrivateInternalGetDownloadUrlFunction::OnTokenFetched, this)); }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h index c488ce2..ef9a59a 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
@@ -45,7 +45,7 @@ FILEMANAGERPRIVATE_ENSUREFILEDOWNLOADED) protected: - ~FileManagerPrivateInternalEnsureFileDownloadedFunction() override {} + ~FileManagerPrivateInternalEnsureFileDownloadedFunction() override = default; // AsyncExtensionFunction overrides. bool RunAsync() override; @@ -93,7 +93,7 @@ FILEMANAGERPRIVATEINTERNAL_PINDRIVEFILE) protected: - ~FileManagerPrivateInternalPinDriveFileFunction() override {} + ~FileManagerPrivateInternalPinDriveFileFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -115,7 +115,7 @@ FILEMANAGERPRIVATEINTERNAL_CANCELFILETRANSFERS) protected: - ~FileManagerPrivateInternalCancelFileTransfersFunction() override {} + ~FileManagerPrivateInternalCancelFileTransfersFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -129,7 +129,7 @@ FILEMANAGERPRIVATE_CANCELALLFILETRANSFERS) protected: - ~FileManagerPrivateCancelAllFileTransfersFunction() override {} + ~FileManagerPrivateCancelAllFileTransfersFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -144,7 +144,7 @@ FILEMANAGERPRIVATE_SEARCHDRIVE) protected: - ~FileManagerPrivateSearchDriveFunction() override {} + ~FileManagerPrivateSearchDriveFunction() override = default; bool RunAsync() override; @@ -173,7 +173,7 @@ FILEMANAGERPRIVATE_SEARCHDRIVEMETADATA) protected: - ~FileManagerPrivateSearchDriveMetadataFunction() override {} + ~FileManagerPrivateSearchDriveMetadataFunction() override = default; bool RunAsync() override; @@ -201,7 +201,7 @@ FILEMANAGERPRIVATE_GETDRIVECONNECTIONSTATE); protected: - ~FileManagerPrivateGetDriveConnectionStateFunction() override {} + ~FileManagerPrivateGetDriveConnectionStateFunction() override = default; ResponseAction Run() override; }; @@ -214,7 +214,7 @@ FILEMANAGERPRIVATE_REQUESTACCESSTOKEN) protected: - ~FileManagerPrivateRequestAccessTokenFunction() override {} + ~FileManagerPrivateRequestAccessTokenFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -232,7 +232,7 @@ FILEMANAGERPRIVATEINTERNAL_GETSHAREURL) protected: - ~FileManagerPrivateInternalGetShareUrlFunction() override {} + ~FileManagerPrivateInternalGetShareUrlFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -250,7 +250,7 @@ FILEMANAGERPRIVATEINTERNAL_REQUESTDRIVESHARE); protected: - ~FileManagerPrivateInternalRequestDriveShareFunction() override {} + ~FileManagerPrivateInternalRequestDriveShareFunction() override = default; bool RunAsync() override; private:
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc index cb32446..745896b 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -100,7 +100,7 @@ // |profile_id| needs to be checked with ProfileManager::IsValidProfile // before using it. if (!g_browser_process->profile_manager()->IsValidProfile(profile_id)) - return NULL; + return nullptr; Profile* profile = reinterpret_cast<Profile*>(profile_id); return file_manager::EventRouterFactory::GetForProfile(profile); @@ -860,8 +860,7 @@ } FileManagerPrivateInternalComputeChecksumFunction:: - ~FileManagerPrivateInternalComputeChecksumFunction() { -} + ~FileManagerPrivateInternalComputeChecksumFunction() = default; bool FileManagerPrivateInternalComputeChecksumFunction::RunAsync() { using extensions::api::file_manager_private_internal::ComputeChecksum::Params;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h index 44321461..63d309fa 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
@@ -58,7 +58,7 @@ FILEMANAGERPRIVATE_ENABLEEXTERNALFILESCHEME); protected: - ~FileManagerPrivateEnableExternalFileSchemeFunction() override {} + ~FileManagerPrivateEnableExternalFileSchemeFunction() override = default; private: ExtensionFunction::ResponseAction Run() override; @@ -74,7 +74,7 @@ FILEMANAGERPRIVATE_GRANTACCESS) protected: - ~FileManagerPrivateGrantAccessFunction() override {} + ~FileManagerPrivateGrantAccessFunction() override = default; private: ExtensionFunction::ResponseAction Run() override; @@ -95,7 +95,7 @@ void Respond(bool success); protected: - ~FileWatchFunctionBase() override {} + ~FileWatchFunctionBase() override = default; // Performs a file watch operation (ex. adds or removes a file watch) on // the IO thread with storage::WatcherManager. @@ -131,7 +131,7 @@ FILEMANAGERPRIVATEINTERNAL_ADDFILEWATCH) protected: - ~FileManagerPrivateInternalAddFileWatchFunction() override {} + ~FileManagerPrivateInternalAddFileWatchFunction() override = default; // FileWatchFunctionBase override. void PerformFileWatchOperationOnIOThread( @@ -154,7 +154,7 @@ FILEMANAGERPRIVATEINTERNAL_REMOVEFILEWATCH) protected: - ~FileManagerPrivateInternalRemoveFileWatchFunction() override {} + ~FileManagerPrivateInternalRemoveFileWatchFunction() override = default; // FileWatchFunctionBase override. void PerformFileWatchOperationOnIOThread( @@ -175,7 +175,7 @@ FILEMANAGERPRIVATE_GETSIZESTATS) protected: - ~FileManagerPrivateGetSizeStatsFunction() override {} + ~FileManagerPrivateGetSizeStatsFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -201,7 +201,8 @@ FILEMANAGERPRIVATEINTERNAL_VALIDATEPATHNAMELENGTH) protected: - ~FileManagerPrivateInternalValidatePathNameLengthFunction() override {} + ~FileManagerPrivateInternalValidatePathNameLengthFunction() override = + default; void OnFilePathLimitRetrieved(size_t current_length, size_t max_length); @@ -218,7 +219,7 @@ FILEMANAGERPRIVATE_FORMATVOLUME) protected: - ~FileManagerPrivateFormatVolumeFunction() override {} + ~FileManagerPrivateFormatVolumeFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -233,7 +234,7 @@ FILEMANAGERPRIVATE_RENAMEVOLUME) protected: - ~FileManagerPrivateRenameVolumeFunction() override {} + ~FileManagerPrivateRenameVolumeFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -247,7 +248,7 @@ FILEMANAGERPRIVATEINTERNAL_STARTCOPY) protected: - ~FileManagerPrivateInternalStartCopyFunction() override {} + ~FileManagerPrivateInternalStartCopyFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -275,7 +276,7 @@ FILEMANAGERPRIVATE_CANCELCOPY) protected: - ~FileManagerPrivateCancelCopyFunction() override {} + ~FileManagerPrivateCancelCopyFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -291,7 +292,8 @@ FILEMANAGERPRIVATE_RESOLVEISOLATEDENTRIES) protected: - ~FileManagerPrivateInternalResolveIsolatedEntriesFunction() override {} + ~FileManagerPrivateInternalResolveIsolatedEntriesFunction() override = + default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -330,7 +332,7 @@ FILEMANAGERPRIVATE_SEARCHFILESBYHASHES) protected: - ~FileManagerPrivateSearchFilesByHashesFunction() override {} + ~FileManagerPrivateSearchFilesByHashesFunction() override = default; private: // ChromeAsyncExtensionFunction overrides. @@ -346,11 +348,11 @@ class FileManagerPrivateIsUMAEnabledFunction : public UIThreadExtensionFunction { public: - FileManagerPrivateIsUMAEnabledFunction() {} + FileManagerPrivateIsUMAEnabledFunction() = default; DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.isUMAEnabled", FILEMANAGERPRIVATE_ISUMAENABLED) protected: - ~FileManagerPrivateIsUMAEnabledFunction() override {} + ~FileManagerPrivateIsUMAEnabledFunction() override = default; private: ExtensionFunction::ResponseAction Run() override; @@ -365,7 +367,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.setEntryTag", FILEMANAGERPRIVATEINTERNAL_SETENTRYTAG) protected: - ~FileManagerPrivateInternalSetEntryTagFunction() override {} + ~FileManagerPrivateInternalSetEntryTagFunction() override = default; private: const ChromeExtensionFunctionDetails chrome_details_; @@ -385,7 +387,7 @@ FILEMANAGERPRIVATEINTERNAL_GETDIRECTORYSIZE) protected: - ~FileManagerPrivateInternalGetDirectorySizeFunction() override {} + ~FileManagerPrivateInternalGetDirectorySizeFunction() override = default; void OnDirectorySizeRetrieved(int64_t size);
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index 8637ea7..743c1ed2 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include <algorithm> +#include <memory> #include <set> #include <utility> #include <vector> @@ -252,10 +253,10 @@ } FileManagerPrivateInternalZipSelectionFunction:: - FileManagerPrivateInternalZipSelectionFunction() {} + FileManagerPrivateInternalZipSelectionFunction() = default; FileManagerPrivateInternalZipSelectionFunction:: - ~FileManagerPrivateInternalZipSelectionFunction() {} + ~FileManagerPrivateInternalZipSelectionFunction() = default; bool FileManagerPrivateInternalZipSelectionFunction::RunAsync() { using extensions::api::file_manager_private_internal::ZipSelection::Params; @@ -344,16 +345,14 @@ } FileManagerPrivateRequestWebStoreAccessTokenFunction:: - FileManagerPrivateRequestWebStoreAccessTokenFunction() { -} + FileManagerPrivateRequestWebStoreAccessTokenFunction() = default; FileManagerPrivateRequestWebStoreAccessTokenFunction:: - ~FileManagerPrivateRequestWebStoreAccessTokenFunction() { -} + ~FileManagerPrivateRequestWebStoreAccessTokenFunction() = default; bool FileManagerPrivateRequestWebStoreAccessTokenFunction::RunAsync() { std::vector<std::string> scopes; - scopes.push_back(kCWSScope); + scopes.emplace_back(kCWSScope); ProfileOAuth2TokenService* oauth_service = ProfileOAuth2TokenServiceFactory::GetForProfile(GetProfile()); @@ -373,11 +372,9 @@ SigninManagerBase* signin_manager = SigninManagerFactory::GetForProfile(GetProfile()); - auth_service_.reset(new google_apis::AuthService( - oauth_service, - signin_manager->GetAuthenticatedAccountId(), - url_request_context_getter, - scopes)); + auth_service_ = std::make_unique<google_apis::AuthService>( + oauth_service, signin_manager->GetAuthenticatedAccountId(), + url_request_context_getter, scopes); auth_service_->StartAuthentication(base::Bind( &FileManagerPrivateRequestWebStoreAccessTokenFunction:: OnAccessTokenFetched, @@ -478,12 +475,10 @@ } FileManagerPrivateInternalGetMimeTypeFunction:: - FileManagerPrivateInternalGetMimeTypeFunction() { -} + FileManagerPrivateInternalGetMimeTypeFunction() = default; FileManagerPrivateInternalGetMimeTypeFunction:: - ~FileManagerPrivateInternalGetMimeTypeFunction() { -} + ~FileManagerPrivateInternalGetMimeTypeFunction() = default; bool FileManagerPrivateInternalGetMimeTypeFunction::RunAsync() { using extensions::api::file_manager_private_internal::GetMimeType::Params; @@ -816,7 +811,7 @@ for (const auto& action : actions) { Action item; item.id = action.id; - item.title.reset(new std::string(action.title)); + item.title = std::make_unique<std::string>(action.title); items.push_back(std::move(item)); }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h index e030012..78772cfe5b 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
@@ -53,7 +53,7 @@ FILEMANAGERPRIVATE_LOGOUTUSERFORREAUTHENTICATION) protected: - ~FileManagerPrivateLogoutUserForReauthenticationFunction() override {} + ~FileManagerPrivateLogoutUserForReauthenticationFunction() override = default; // ExtensionFunction: ResponseAction Run() override; @@ -68,7 +68,7 @@ FILEMANAGERPRIVATE_GETPREFERENCES) protected: - ~FileManagerPrivateGetPreferencesFunction() override {} + ~FileManagerPrivateGetPreferencesFunction() override = default; ResponseAction Run() override; }; @@ -82,7 +82,7 @@ FILEMANAGERPRIVATE_SETPREFERENCES) protected: - ~FileManagerPrivateSetPreferencesFunction() override {} + ~FileManagerPrivateSetPreferencesFunction() override = default; ResponseAction Run() override; }; @@ -118,7 +118,7 @@ FILEMANAGERPRIVATE_ZOOM); protected: - ~FileManagerPrivateZoomFunction() override {} + ~FileManagerPrivateZoomFunction() override = default; // ExtensionFunction: ResponseAction Run() override; @@ -151,7 +151,7 @@ FILEMANAGERPRIVATE_GETPROFILES); protected: - ~FileManagerPrivateGetProfilesFunction() override {} + ~FileManagerPrivateGetProfilesFunction() override = default; // ExtensionFunction: ResponseAction Run() override; @@ -165,7 +165,7 @@ FILEMANAGERPRIVATE_OPENINSPECTOR); protected: - ~FileManagerPrivateOpenInspectorFunction() override {} + ~FileManagerPrivateOpenInspectorFunction() override = default; ResponseAction Run() override; }; @@ -178,7 +178,7 @@ FILEMANAGERPRIVATE_OPENSETTINGSSUBPAGE); protected: - ~FileManagerPrivateOpenSettingsSubpageFunction() override {} + ~FileManagerPrivateOpenSettingsSubpageFunction() override = default; ResponseAction Run() override; }; @@ -205,11 +205,11 @@ class FileManagerPrivateIsPiexLoaderEnabledFunction : public UIThreadExtensionFunction { public: - FileManagerPrivateIsPiexLoaderEnabledFunction() {} + FileManagerPrivateIsPiexLoaderEnabledFunction() = default; DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.isPiexLoaderEnabled", FILEMANAGERPRIVATE_ISPIEXLOADERENABLED) protected: - ~FileManagerPrivateIsPiexLoaderEnabledFunction() override {} + ~FileManagerPrivateIsPiexLoaderEnabledFunction() override = default; private: ResponseAction Run() override; @@ -224,7 +224,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.getProviders", FILEMANAGERPRIVATE_GETPROVIDERS) protected: - ~FileManagerPrivateGetProvidersFunction() override {} + ~FileManagerPrivateGetProvidersFunction() override = default; private: ResponseAction Run() override; @@ -240,7 +240,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.addProvidedFileSystem", FILEMANAGERPRIVATE_ADDPROVIDEDFILESYSTEM) protected: - ~FileManagerPrivateAddProvidedFileSystemFunction() override {} + ~FileManagerPrivateAddProvidedFileSystemFunction() override = default; private: ResponseAction Run() override; @@ -256,7 +256,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.configureVolume", FILEMANAGERPRIVATE_CONFIGUREVOLUME) protected: - ~FileManagerPrivateConfigureVolumeFunction() override {} + ~FileManagerPrivateConfigureVolumeFunction() override = default; private: ResponseAction Run() override; @@ -275,7 +275,7 @@ FILEMANAGERPRIVATE_ISCROSTINIENABLED) protected: - ~FileManagerPrivateIsCrostiniEnabledFunction() override {} + ~FileManagerPrivateIsCrostiniEnabledFunction() override = default; ResponseAction Run() override; }; @@ -320,7 +320,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.getCustomActions", FILEMANAGERPRIVATEINTERNAL_GETCUSTOMACTIONS) protected: - ~FileManagerPrivateInternalGetCustomActionsFunction() override {} + ~FileManagerPrivateInternalGetCustomActionsFunction() override = default; private: ResponseAction Run() override; @@ -339,7 +339,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.executeCustomAction", FILEMANAGERPRIVATEINTERNAL_EXECUTECUSTOMACTION) protected: - ~FileManagerPrivateInternalExecuteCustomActionFunction() override {} + ~FileManagerPrivateInternalExecuteCustomActionFunction() override = default; private: ResponseAction Run() override; @@ -358,7 +358,7 @@ DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.getRecentFiles", FILEMANAGERPRIVATE_GETRECENTFILES) protected: - ~FileManagerPrivateInternalGetRecentFilesFunction() override {} + ~FileManagerPrivateInternalGetRecentFilesFunction() override = default; private: ResponseAction Run() override;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.h b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.h index 67579c2a..94bfe8ba 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.h
@@ -24,7 +24,7 @@ FILEMANAGERPRIVATE_ADDMOUNT) protected: - ~FileManagerPrivateAddMountFunction() override {} + ~FileManagerPrivateAddMountFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -59,7 +59,7 @@ FILEMANAGERPRIVATE_REMOVEMOUNT) protected: - ~FileManagerPrivateRemoveMountFunction() override {} + ~FileManagerPrivateRemoveMountFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -74,7 +74,7 @@ FILEMANAGERPRIVATE_MARKCACHEASMOUNTED) protected: - ~FileManagerPrivateMarkCacheAsMountedFunction() override {} + ~FileManagerPrivateMarkCacheAsMountedFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -103,7 +103,7 @@ FILEMANAGERPRIVATE_GETVOLUMEMETADATALIST) protected: - ~FileManagerPrivateGetVolumeMetadataListFunction() override {} + ~FileManagerPrivateGetVolumeMetadataListFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc index af406d7..e78c40d9 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc
@@ -408,11 +408,11 @@ namespace extensions { -FileManagerPrivateGetStringsFunction::FileManagerPrivateGetStringsFunction() { -} +FileManagerPrivateGetStringsFunction::FileManagerPrivateGetStringsFunction() = + default; -FileManagerPrivateGetStringsFunction::~FileManagerPrivateGetStringsFunction() { -} +FileManagerPrivateGetStringsFunction::~FileManagerPrivateGetStringsFunction() = + default; ExtensionFunction::ResponseAction FileManagerPrivateGetStringsFunction::Run() { std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc index bdb33bb..3d701c8 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
@@ -6,6 +6,7 @@ #include <stddef.h> +#include <memory> #include <set> #include <string> #include <vector> @@ -123,10 +124,10 @@ } FileManagerPrivateInternalGetFileTasksFunction:: - FileManagerPrivateInternalGetFileTasksFunction() {} + FileManagerPrivateInternalGetFileTasksFunction() = default; FileManagerPrivateInternalGetFileTasksFunction:: - ~FileManagerPrivateInternalGetFileTasksFunction() {} + ~FileManagerPrivateInternalGetFileTasksFunction() = default; bool FileManagerPrivateInternalGetFileTasksFunction::RunAsync() { using extensions::api::file_manager_private_internal::GetFileTasks::Params; @@ -151,8 +152,8 @@ local_paths_.push_back(file_system_url.path()); } - mime_type_collector_.reset( - new app_file_handler_util::MimeTypeCollector(GetProfile())); + mime_type_collector_ = + std::make_unique<app_file_handler_util::MimeTypeCollector>(GetProfile()); mime_type_collector_->CollectForLocalPaths( local_paths_, base::Bind( @@ -164,8 +165,9 @@ void FileManagerPrivateInternalGetFileTasksFunction::OnMimeTypesCollected( std::unique_ptr<std::vector<std::string>> mime_types) { - is_directory_collector_.reset( - new app_file_handler_util::IsDirectoryCollector(GetProfile())); + is_directory_collector_ = + std::make_unique<app_file_handler_util::IsDirectoryCollector>( + GetProfile()); is_directory_collector_->CollectForEntriesPaths( local_paths_, base::Bind(&FileManagerPrivateInternalGetFileTasksFunction:: OnAreDirectoriesAndMimeTypesCollected, @@ -178,9 +180,9 @@ std::unique_ptr<std::set<base::FilePath>> directory_paths) { std::vector<EntryInfo> entries; for (size_t i = 0; i < local_paths_.size(); ++i) { - entries.push_back(EntryInfo( + entries.emplace_back( local_paths_[i], (*mime_types)[i], - directory_paths->find(local_paths_[i]) != directory_paths->end())); + directory_paths->find(local_paths_[i]) != directory_paths->end()); } file_manager::file_tasks::FindAllTypesOfTasks(
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.h b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.h index 96be1399..e8a5f33 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.h
@@ -34,7 +34,7 @@ FILEMANAGERPRIVATEINTERNAL_EXECUTETASK) protected: - ~FileManagerPrivateInternalExecuteTaskFunction() override {} + ~FileManagerPrivateInternalExecuteTaskFunction() override = default; // ChromeAsyncExtensionFunction overrides. bool RunAsync() override; @@ -87,7 +87,7 @@ FILEMANAGERPRIVATEINTERNAL_SETDEFAULTTASK) protected: - ~FileManagerPrivateInternalSetDefaultTaskFunction() override {} + ~FileManagerPrivateInternalSetDefaultTaskFunction() override = default; // ExtensionFunction: ResponseAction Run() override;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc index a52a651..0cdb244e5 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h" #include <stddef.h> +#include <memory> #include <string> #include <utility> @@ -127,8 +128,7 @@ switch (params->local_path_option) { case NO_LOCAL_PATH_RESOLUTION: // Pass empty local path. - params->selected_files.push_back( - ui::SelectedFileInfo(file_path, base::FilePath())); + params->selected_files.emplace_back(file_path, base::FilePath()); break; case NEED_LOCAL_PATH_FOR_OPENING: GetFileNativeLocalPathForOpening( @@ -148,8 +148,7 @@ return; // Remaining work is done in ContinueGetSelectedFileInfo. } } else { - params->selected_files.push_back( - ui::SelectedFileInfo(file_path, file_path)); + params->selected_files.emplace_back(file_path, file_path); } } params->callback.Run(params->selected_files); @@ -166,7 +165,7 @@ } const int index = params->selected_files.size(); const base::FilePath& file_path = params->file_paths[index]; - params->selected_files.push_back(ui::SelectedFileInfo(file_path, local_path)); + params->selected_files.emplace_back(file_path, local_path); GetSelectedFileInfoInternal(profile, std::move(params)); } @@ -177,12 +176,12 @@ DCHECK(output); using chromeos::file_system_provider::IconSet; if (input.HasIcon(IconSet::IconSize::SIZE_16x16)) { - output->icon16x16_url.reset( - new std::string(input.GetIcon(IconSet::IconSize::SIZE_16x16).spec())); + output->icon16x16_url = std::make_unique<std::string>( + input.GetIcon(IconSet::IconSize::SIZE_16x16).spec()); } if (input.HasIcon(IconSet::IconSize::SIZE_32x32)) { - output->icon32x32_url.reset( - new std::string(input.GetIcon(IconSet::IconSize::SIZE_32x32).spec())); + output->icon32x32_url = std::make_unique<std::string>( + input.GetIcon(IconSet::IconSize::SIZE_32x32).spec()); } } @@ -200,8 +199,8 @@ volume_metadata->profile.is_current_profile = true; if (!volume.source_path().empty()) { - volume_metadata->source_path.reset( - new std::string(volume.source_path().AsUTF8Unsafe())); + volume_metadata->source_path = + std::make_unique<std::string>(volume.source_path().AsUTF8Unsafe()); } switch (volume.source()) { @@ -227,17 +226,18 @@ volume_metadata->watchable = volume.watchable(); if (volume.type() == VOLUME_TYPE_PROVIDED) { - volume_metadata->provider_id.reset( - new std::string(volume.provider_id().ToString())); - volume_metadata->file_system_id.reset( - new std::string(volume.file_system_id())); + volume_metadata->provider_id = + std::make_unique<std::string>(volume.provider_id().ToString()); + volume_metadata->file_system_id = + std::make_unique<std::string>(volume.file_system_id()); } FillIconSet(&volume_metadata->icon_set, volume.icon_set()); - volume_metadata->volume_label.reset(new std::string(volume.volume_label())); - volume_metadata->disk_file_system_type.reset( - new std::string(volume.file_system_type())); + volume_metadata->volume_label = + std::make_unique<std::string>(volume.volume_label()); + volume_metadata->disk_file_system_type = + std::make_unique<std::string>(volume.file_system_type()); switch (volume.type()) { case VOLUME_TYPE_GOOGLE_DRIVE: @@ -303,9 +303,10 @@ volume_metadata->device_type = file_manager_private::DEVICE_TYPE_MOBILE; break; } - volume_metadata->device_path.reset( - new std::string(volume.system_path_prefix().AsUTF8Unsafe())); - volume_metadata->is_parent_device.reset(new bool(volume.is_parent())); + volume_metadata->device_path = std::make_unique<std::string>( + volume.system_path_prefix().AsUTF8Unsafe()); + volume_metadata->is_parent_device = + std::make_unique<bool>(volume.is_parent()); } else { volume_metadata->device_type = file_manager_private::DEVICE_TYPE_NONE; @@ -402,7 +403,7 @@ drive::EventLogger* GetLogger(Profile* profile) { drive::DriveIntegrationService* service = drive::DriveIntegrationServiceFactory::FindForProfile(profile); - return service ? service->event_logger() : NULL; + return service ? service->event_logger() : nullptr; } } // namespace util
diff --git a/chrome/browser/chromeos/login/app_launch_controller.cc b/chrome/browser/chromeos/login/app_launch_controller.cc index beae669..306878ba 100644 --- a/chrome/browser/chromeos/login/app_launch_controller.cc +++ b/chrome/browser/chromeos/login/app_launch_controller.cc
@@ -166,12 +166,17 @@ RecordKioskLaunchUMA(is_auto_launch); // Ensure WebUILoginView is enabled so that bailout shortcut key works. - host_->GetWebUILoginView()->SetUIEnabled(true); + WebUILoginView* webui = host_->GetWebUILoginView(); + if (webui) { + webui->SetUIEnabled(true); - webui_visible_ = host_->GetWebUILoginView()->webui_visible(); - if (!webui_visible_) { - registrar_.Add(this, chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, - content::NotificationService::AllSources()); + login_screen_visible_ = webui->webui_visible(); + if (!login_screen_visible_) { + registrar_.Add(this, chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, + content::NotificationService::AllSources()); + } + } else { + login_screen_visible_ = true; } launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); @@ -268,8 +273,8 @@ const content::NotificationSource& source, const content::NotificationDetails& details) { DCHECK_EQ(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE, type); - DCHECK(!webui_visible_); - webui_visible_ = true; + DCHECK(!login_screen_visible_); + login_screen_visible_ = true; launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue(); if (launcher_ready_) OnReadyToLaunch(); @@ -482,7 +487,7 @@ if (network_config_requested_) return; - if (!webui_visible_) + if (!login_screen_visible_) return; if (splash_wait_timer_.IsRunning())
diff --git a/chrome/browser/chromeos/login/app_launch_controller.h b/chrome/browser/chromeos/login/app_launch_controller.h index 0ef0340..9bf13c4 100644 --- a/chrome/browser/chromeos/login/app_launch_controller.h +++ b/chrome/browser/chromeos/login/app_launch_controller.h
@@ -129,7 +129,7 @@ std::unique_ptr<AppWindowWatcher> app_window_watcher_; content::NotificationRegistrar registrar_; - bool webui_visible_ = false; + bool login_screen_visible_ = false; bool launcher_ready_ = false; // A timer to ensure the app splash is shown for a minimum amount of time.
diff --git a/chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.cc b/chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.cc new file mode 100644 index 0000000..5bcaa1b --- /dev/null +++ b/chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.cc
@@ -0,0 +1,63 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.h" + +#include "ash/public/interfaces/kiosk_app_info.mojom.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" +#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h" +#include "chrome/browser/ui/ash/login_screen_client.h" +#include "extensions/grit/extensions_browser_resources.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image_skia.h" + +namespace chromeos { + +KioskAppMenuUpdater::KioskAppMenuUpdater() { + KioskAppManager::Get()->AddObserver(this); +} + +KioskAppMenuUpdater::~KioskAppMenuUpdater() { + KioskAppManager::Get()->RemoveObserver(this); +} + +void KioskAppMenuUpdater::OnKioskAppDataChanged(const std::string& app_id) { + SendKioskApps(); +} + +void KioskAppMenuUpdater::OnKioskAppDataLoadFailure(const std::string& app_id) { + SendKioskApps(); +} + +void KioskAppMenuUpdater::OnKioskAppsSettingsChanged() { + SendKioskApps(); +} + +void KioskAppMenuUpdater::SendKioskApps() { + if (!LoginScreenClient::HasInstance()) + return; + + std::vector<ash::mojom::KioskAppInfoPtr> output; + std::vector<chromeos::KioskAppManager::App> apps; + + chromeos::KioskAppManager::Get()->GetApps(&apps); + for (const auto& app : apps) { + auto mojo_app = ash::mojom::KioskAppInfo::New(); + mojo_app->app_id = app.app_id; + mojo_app->name = base::UTF8ToUTF16(app.name); + if (app.icon.isNull()) { + mojo_app->icon = *ui::ResourceBundle::GetSharedInstance() + .GetImageNamed(IDR_APP_DEFAULT_ICON) + .ToImageSkia(); + } else { + mojo_app->icon = gfx::ImageSkia(app.icon); + } + output.push_back(std::move(mojo_app)); + } + + LoginScreenClient::Get()->login_screen()->SetKioskApps(std::move(output)); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.h b/chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.h new file mode 100644 index 0000000..799d4532 --- /dev/null +++ b/chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.h
@@ -0,0 +1,33 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_UI_KIOSK_APP_MENU_UPDATER_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_UI_KIOSK_APP_MENU_UPDATER_H_ + +#include "base/macros.h" +#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h" + +namespace chromeos { + +// Observer class to update the Kiosk app menu when Kiosk app data is changed. +class KioskAppMenuUpdater : public KioskAppManagerObserver { + public: + KioskAppMenuUpdater(); + ~KioskAppMenuUpdater() override; + + // Manually dispatch kiosk app data to Ash. + void SendKioskApps(); + + // KioskAppManagerObserver: + void OnKioskAppDataChanged(const std::string& app_id) override; + void OnKioskAppDataLoadFailure(const std::string& app_id) override; + void OnKioskAppsSettingsChanged() override; + + private: + DISALLOW_COPY_AND_ASSIGN(KioskAppMenuUpdater); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_UI_KIOSK_APP_MENU_UPDATER_H_
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc index 9506bc7..01144f71 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h" #include "chrome/browser/chromeos/login/user_board_view_mojo.h" #include "chrome/browser/chromeos/login/wizard_controller.h" +#include "chrome/browser/ui/ash/login_screen_client.h" #include "chrome/browser/ui/ash/wallpaper_controller_client.h" #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chromeos/login/auth/user_context.h" @@ -181,6 +182,8 @@ existing_user_controller_->Init(user_manager::UserManager::Get()->GetUsers()); user_selection_screen_->InitEasyUnlock(); + + kiosk_updater_.SendKioskApps(); } void LoginDisplayHostMojo::OnPreferencesChanged() { @@ -188,7 +191,7 @@ } void LoginDisplayHostMojo::OnStartAppLaunch() { - NOTIMPLEMENTED(); + dialog_->ShowFullScreen(); } void LoginDisplayHostMojo::OnStartArcKiosk() {
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h index 4f74d7dc..cdf5e81 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/chromeos/login/ui/kiosk_app_menu_updater.h" #include "chrome/browser/chromeos/login/ui/login_display_host_common.h" #include "chrome/browser/ui/ash/login_screen_client.h" #include "chromeos/login/auth/auth_status_consumer.h" @@ -134,6 +135,8 @@ // The account id of the user pod that's being focused. AccountId focused_pod_account_id_; + KioskAppMenuUpdater kiosk_updater_; + base::WeakPtrFactory<LoginDisplayHostMojo> weak_factory_; DISALLOW_COPY_AND_ASSIGN(LoginDisplayHostMojo);
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc index 42c1aa8..2bcfac741 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc
@@ -64,6 +64,13 @@ dialog_widget_->Show(); } +void OobeUIDialogDelegate::ShowFullScreen() { + const gfx::Size& size = + display::Screen::GetScreen()->GetPrimaryDisplay().size(); + SetSize(size.width(), size.height()); + Show(false /*closable_by_esc*/); +} + void OobeUIDialogDelegate::Hide() { if (dialog_widget_) dialog_widget_->Hide();
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h index 855d085..34f72a92 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h
@@ -43,6 +43,9 @@ // key. void Show(bool closable_by_esc); + // Show the dialog widget stretched to full screen. + void ShowFullScreen(); + // Close the widget, and it will delete this object. void Close();
diff --git a/chrome/browser/chromeos/printing/doc/cups_printer_management.md b/chrome/browser/chromeos/printing/doc/cups_printer_management.md index 7344609..ab9cfe6 100644 --- a/chrome/browser/chromeos/printing/doc/cups_printer_management.md +++ b/chrome/browser/chromeos/printing/doc/cups_printer_management.md
@@ -7,10 +7,6 @@ different ways we might discover printers, and how they integrate into the printing flows. -Note that this doc is, at present, a design for the future instead of a -description of the status quo. For up-to-date information on the implementation -refer to http://crbug.com/742487. - ## Categorizing printers The fact that CUPS supports many printing modalities means that we have a mishmash of ways we could print. Within ChromeOS, we divide CUPS printers into
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.cc b/chrome/browser/chromeos/smb_client/smb_file_system.cc index 9dd4d70a..839f321 100644 --- a/chrome/browser/chromeos/smb_client/smb_file_system.cc +++ b/chrome/browser/chromeos/smb_client/smb_file_system.cc
@@ -71,6 +71,10 @@ UMA_HISTOGRAM_COUNTS_100000("NativeSmbFileShare.ReadDirectoryCount", count); } +void RecordReadDirectoryDuration(const base::TimeDelta& delta) { + UMA_HISTOGRAM_TIMES("NativeSmbFileShare.ReadDirectoryDuration", delta); +} + } // namespace namespace smb_client { @@ -195,9 +199,11 @@ AbortCallback SmbFileSystem::ReadDirectory( const base::FilePath& directory_path, storage::AsyncFileUtil::ReadDirectoryCallback callback) { + base::ElapsedTimer metrics_timer; + auto reply = base::BindOnce(&SmbFileSystem::HandleRequestReadDirectoryCallback, - AsWeakPtr(), callback); + AsWeakPtr(), callback, std::move(metrics_timer)); SmbTask task = base::BindOnce(&SmbProviderClient::ReadDirectory, GetWeakSmbProviderClient(), GetMountId(), directory_path, std::move(reply)); @@ -464,6 +470,7 @@ void SmbFileSystem::HandleRequestReadDirectoryCallback( storage::AsyncFileUtil::ReadDirectoryCallback callback, + const base::ElapsedTimer& metrics_timer, smbprovider::ErrorType error, const smbprovider::DirectoryEntryListProto& entries) const { task_queue_.TaskFinished(); @@ -471,6 +478,7 @@ storage::AsyncFileUtil::EntryList entry_list; RecordReadDirectoryCount(entries.entries_size()); + RecordReadDirectoryDuration(metrics_timer.Elapsed()); // Loop through the entries and send when the desired batch size is hit. for (const smbprovider::DirectoryEntryProto& entry : entries.entries()) {
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.h b/chrome/browser/chromeos/smb_client/smb_file_system.h index 2e4e3b4..26390d0c 100644 --- a/chrome/browser/chromeos/smb_client/smb_file_system.h +++ b/chrome/browser/chromeos/smb_client/smb_file_system.h
@@ -17,6 +17,7 @@ #include "base/memory/linked_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" +#include "base/timer/elapsed_timer.h" #include "chrome/browser/chromeos/file_system_provider/abort_callback.h" #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h" #include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" @@ -198,6 +199,7 @@ void HandleRequestReadDirectoryCallback( storage::AsyncFileUtil::ReadDirectoryCallback callback, + const base::ElapsedTimer& metrics_timer, smbprovider::ErrorType error, const smbprovider::DirectoryEntryListProto& entries) const;
diff --git a/chrome/browser/extensions/active_tab_unittest.cc b/chrome/browser/extensions/active_tab_unittest.cc index 29b62a9..0734948 100644 --- a/chrome/browser/extensions/active_tab_unittest.cc +++ b/chrome/browser/extensions/active_tab_unittest.cc
@@ -331,6 +331,35 @@ EXPECT_TRUE(IsBlocked(extension_without_active_tab, chromium)); } +TEST_F(ActiveTabTest, CapturingPagesWithActiveTab) { + std::vector<GURL> test_urls = { + GURL("https://example.com"), GURL("chrome://version"), + GURL("chrome://newtab"), + // IPv6 addresses don't work with activeTab: https://crbug.com/853064. + // {"http://[2607:f8b0:4005:805::200e]"}, + extension->GetResourceURL("test.html"), + another_extension->GetResourceURL("test.html"), + }; + + const GURL kAboutBlank("about:blank"); + + for (const GURL& url : test_urls) { + SCOPED_TRACE(url); + NavigateAndCommit(url); + // By default, there should be no access. + EXPECT_FALSE(extension->permissions_data()->CanCaptureVisiblePage( + url, tab_id(), nullptr /*error*/)); + // Granting permission should allow page capture. + active_tab_permission_granter()->GrantIfRequested(extension.get()); + EXPECT_TRUE(extension->permissions_data()->CanCaptureVisiblePage( + url, tab_id(), nullptr /*error*/)); + // Navigating away should revoke access. + NavigateAndCommit(kAboutBlank); + EXPECT_FALSE(extension->permissions_data()->CanCaptureVisiblePage( + url, tab_id(), nullptr /*error*/)); + } +} + TEST_F(ActiveTabTest, Uninstalling) { // Some semi-arbitrary setup. GURL google("http://www.google.com");
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc index ab33e6b9..1470c87 100644 --- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc +++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc
@@ -33,8 +33,8 @@ public: RemovableStorageWriterClientImpl( ImageWriterUtilityClient* owner, - chrome::mojom::RemovableStorageWriterClientPtr* interface) - : binding_(this, mojo::MakeRequest(interface)), + chrome::mojom::RemovableStorageWriterClientPtr* interface_ptr) + : binding_(this, mojo::MakeRequest(interface_ptr)), image_writer_utility_client_(owner) { base::AssertBlockingAllowed();
diff --git a/chrome/browser/extensions/api/media_galleries/blob_data_source_factory.cc b/chrome/browser/extensions/api/media_galleries/blob_data_source_factory.cc index 98271a7..34b2d95 100644 --- a/chrome/browser/extensions/api/media_galleries/blob_data_source_factory.cc +++ b/chrome/browser/extensions/api/media_galleries/blob_data_source_factory.cc
@@ -13,11 +13,11 @@ // Media data source that reads data from a blob in browser process. class BlobMediaDataSource : public chrome::mojom::MediaDataSource { public: - BlobMediaDataSource(chrome::mojom::MediaDataSourcePtr* interface, + BlobMediaDataSource(chrome::mojom::MediaDataSourcePtr* interface_ptr, content::BrowserContext* browser_context, const std::string& blob_uuid, BlobDataSourceFactory::MediaDataCallback callback) - : binding_(this, mojo::MakeRequest(interface)), + : binding_(this, mojo::MakeRequest(interface_ptr)), browser_context_(browser_context), blob_uuid_(blob_uuid), callback_(callback),
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h index 6f52823263..9e7f98ca 100644 --- a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h +++ b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h
@@ -37,7 +37,7 @@ const std::string& name() const { return name_; } const std::string& description() const { return description_; } - HostInterface interface() const { return interface_; } + HostInterface host_interface() const { return interface_; } const base::FilePath& path() const { return path_; } const URLPatternSet& allowed_origins() const { return allowed_origins_; }
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc index d8c9e69..b12e3d7b 100644 --- a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc +++ b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest_unittest.cc
@@ -82,7 +82,7 @@ EXPECT_EQ(manifest->name(), "com.chrome.test.native_host"); EXPECT_EQ(manifest->description(), "Native Messaging Test"); - EXPECT_EQ(manifest->interface(), + EXPECT_EQ(manifest->host_interface(), NativeMessagingHostManifest::HOST_INTERFACE_STDIO); EXPECT_EQ(manifest->path(), base::FilePath::FromUTF8Unsafe(kTestHostPath)); EXPECT_TRUE(manifest->allowed_origins().MatchesSecurityOrigin(
diff --git a/chrome/browser/extensions/api/sessions/sessions_api.cc b/chrome/browser/extensions/api/sessions/sessions_api.cc index deefdd8..cd25ac6b 100644 --- a/chrome/browser/extensions/api/sessions/sessions_api.cc +++ b/chrome/browser/extensions/api/sessions/sessions_api.cc
@@ -44,13 +44,14 @@ namespace extensions { +namespace tabs = api::tabs; +namespace windows = api::windows; + namespace { namespace GetRecentlyClosed = api::sessions::GetRecentlyClosed; namespace GetDevices = api::sessions::GetDevices; namespace Restore = api::sessions::Restore; -namespace tabs = api::tabs; -namespace windows = api::windows; const char kNoRecentlyClosedSessionsError[] = "There are no recently closed sessions.";
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index e77c6f5..0c2cf26 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -347,6 +347,8 @@ settings_api::PrefType::PREF_TYPE_BOOLEAN; (*s_whitelist)[arc::prefs::kVoiceInteractionContextEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[arc::prefs::kVoiceInteractionHotwordEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; // Misc. (*s_whitelist)[::prefs::kUse24HourClock] =
diff --git a/chrome/browser/extensions/api/tabs/tabs_event_router.cc b/chrome/browser/extensions/api/tabs/tabs_event_router.cc index 141ed3a..dbd8462 100644 --- a/chrome/browser/extensions/api/tabs/tabs_event_router.cc +++ b/chrome/browser/extensions/api/tabs/tabs_event_router.cc
@@ -35,10 +35,10 @@ namespace extensions { -namespace { - namespace tabs = api::tabs; +namespace { + bool WillDispatchTabUpdatedEvent( WebContents* contents, const std::set<std::string> changed_property_names,
diff --git a/chrome/browser/net/reporting_browsertest.cc b/chrome/browser/net/reporting_browsertest.cc new file mode 100644 index 0000000..5a5ecb8 --- /dev/null +++ b/chrome/browser/net/reporting_browsertest.cc
@@ -0,0 +1,162 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <memory> +#include <string> + +#include "base/strings/stringprintf.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/values_test_util.h" +#include "base/time/time.h" +#include "base/values.h" +#include "chrome/browser/ssl/cert_verifier_browser_test.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_navigator.h" +#include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/test/base/ui_test_utils.h" +#include "net/dns/mock_host_resolver.h" +#include "net/reporting/reporting_policy.h" +#include "net/test/embedded_test_server/controllable_http_response.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_request.h" +#include "services/network/public/cpp/features.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace { + +class ReportingBrowserTest : public CertVerifierBrowserTest { + public: + ReportingBrowserTest() + : https_server_(net::test_server::EmbeddedTestServer::TYPE_HTTPS) {} + ~ReportingBrowserTest() override = default; + + void SetUp() override; + void SetUpOnMainThread() override; + + net::EmbeddedTestServer* server() { return &https_server_; } + int port() const { return https_server_.port(); } + + net::test_server::ControllableHttpResponse* original_response() { + return original_response_.get(); + } + + net::test_server::ControllableHttpResponse* upload_response() { + return upload_response_.get(); + } + + GURL GetReportingEnabledURL() const { + return GURL(base::StringPrintf("https://example.com:%d/original", port())); + } + + GURL GetCollectorURL() const { + return GURL(base::StringPrintf("https://example.com:%d/upload", port())); + } + + std::string GetReportToHeader() const { + return "Report-To: {\"endpoints\":[{\"url\":\"" + GetCollectorURL().spec() + + "\"}],\"max_age\":86400}\r\n"; + } + + std::string GetNELHeader() const { + return "NEL: " + "{\"report_to\":\"default\",\"max_age\":86400,\"success_fraction\":" + "1.0}\r\n"; + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; + net::EmbeddedTestServer https_server_; + std::unique_ptr<net::test_server::ControllableHttpResponse> + original_response_; + std::unique_ptr<net::test_server::ControllableHttpResponse> upload_response_; + + DISALLOW_COPY_AND_ASSIGN(ReportingBrowserTest); +}; + +void ReportingBrowserTest::SetUp() { + scoped_feature_list_.InitWithFeatures( + {network::features::kReporting, network::features::kNetworkErrorLogging}, + {}); + CertVerifierBrowserTest::SetUp(); + + // Make report delivery happen instantly. + net::ReportingPolicy policy; + policy.delivery_interval = base::TimeDelta::FromSeconds(0); + net::ReportingPolicy::UsePolicyForTesting(policy); +} + +void ReportingBrowserTest::SetUpOnMainThread() { + CertVerifierBrowserTest::SetUpOnMainThread(); + + host_resolver()->AddRule("*", "127.0.0.1"); + + original_response_ = + std::make_unique<net::test_server::ControllableHttpResponse>(server(), + "/original"); + upload_response_ = + std::make_unique<net::test_server::ControllableHttpResponse>(server(), + "/upload"); + + // Reporting and NEL will ignore configurations headers if the response + // doesn't come from an HTTPS origin, or if the origin's certificate is + // invalud. Our test certs are valid, so we need a mock certificate verifier + // to trick the Reporting stack into paying attention to our test headers. + mock_cert_verifier()->set_default_result(net::OK); + ASSERT_TRUE(server()->Start()); +} + +std::unique_ptr<base::Value> ParseReportUpload(const std::string& payload) { + auto parsed_payload = base::test::ParseJson(payload); + // Clear out any non-reproducible fields. + for (auto& report : parsed_payload->GetList()) { + report.RemoveKey("age"); + report.RemovePath({"report", "elapsed_time"}); + } + return parsed_payload; +} + +} // namespace + +IN_PROC_BROWSER_TEST_F(ReportingBrowserTest, TestReportingHeadersProcessed) { + NavigateParams params(browser(), GetReportingEnabledURL(), + ui::PAGE_TRANSITION_LINK); + Navigate(¶ms); + + original_response()->WaitForRequest(); + original_response()->Send("HTTP/1.1 204 OK\r\n"); + original_response()->Send(GetReportToHeader()); + original_response()->Send(GetNELHeader()); + original_response()->Send("\r\n"); + original_response()->Done(); + + upload_response()->WaitForRequest(); + auto actual = ParseReportUpload(upload_response()->http_request()->content); + upload_response()->Send("HTTP/1.1 204 OK\r\n"); + upload_response()->Send("\r\n"); + upload_response()->Done(); + + // Verify the contents of the report that we received. + EXPECT_TRUE(actual != nullptr); + auto expected = base::test::ParseJson(base::StringPrintf( + R"json( + [ + { + "report": { + "protocol": "http/1.1", + "referrer": "", + "sampling_fraction": 1.0, + "server_ip": "127.0.0.1", + "status_code": 204, + "type": "ok", + "uri": "https://example.com:%d/original", + }, + "type": "network-error", + "url": "https://example.com:%d/original", + }, + ] + )json", + port(), port())); + EXPECT_EQ(*expected, *actual); +}
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index d73090ad..3a0c2f9 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc
@@ -290,6 +290,22 @@ return std::string(); } +// Syncs content settings to the network service for a profile. +void SyncCookieSettingsToNetworkService(Profile* profile) { + ContentSettingsForOneType settings; + HostContentSettingsMapFactory::GetForProfile(profile)->GetSettingsForOneType( + CONTENT_SETTINGS_TYPE_COOKIES, std::string(), &settings); + content::BrowserContext::ForEachStoragePartition( + profile, + base::BindRepeating( + [](const ContentSettingsForOneType& settings, + content::StoragePartition* partition) { + partition->GetCookieManagerForBrowserProcess()->SetContentSettings( + settings); + }, + std::move(settings))); +} + } // namespace // static @@ -804,6 +820,9 @@ std::unique_ptr<Profile> p(CreateOffTheRecordProfile()); off_the_record_profile_.swap(p); + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) + SyncCookieSettingsToNetworkService(off_the_record_profile_.get()); + content::NotificationService::current()->Notify( chrome::NOTIFICATION_PROFILE_CREATED, content::Source<Profile>(off_the_record_profile_.get()), @@ -1444,18 +1463,9 @@ return; } - ContentSettingsForOneType settings; - HostContentSettingsMapFactory::GetForProfile(this)->GetSettingsForOneType( - CONTENT_SETTINGS_TYPE_COOKIES, std::string(), &settings); - content::BrowserContext::ForEachStoragePartition( - this, - base::BindRepeating( - [](const ContentSettingsForOneType& settings, - content::StoragePartition* partition) { - partition->GetCookieManagerForBrowserProcess()->SetContentSettings( - settings); - }, - std::move(settings))); + SyncCookieSettingsToNetworkService(this); + if (off_the_record_profile_) + SyncCookieSettingsToNetworkService(off_the_record_profile_.get()); } // Gets the media cache parameters from the command line. |cache_path| will be
diff --git a/chrome/browser/resource_coordinator/lifecycle_unit.h b/chrome/browser/resource_coordinator/lifecycle_unit.h index e3e7285..6daec32 100644 --- a/chrome/browser/resource_coordinator/lifecycle_unit.h +++ b/chrome/browser/resource_coordinator/lifecycle_unit.h
@@ -120,10 +120,6 @@ // successful. virtual bool Load() = 0; - // Request that the LifecycleUnit be frozen, return true if the request is - // successfully sent. - virtual bool Freeze() = 0; - // Returns the estimated number of kilobytes that would be freed if this // LifecycleUnit was discarded. // @@ -154,6 +150,13 @@ virtual bool CanDiscard(DiscardReason reason, DecisionDetails* decision_details) const = 0; + // Request that the LifecycleUnit be frozen, return true if the request is + // successfully sent. + virtual bool Freeze() = 0; + + // Unfreezes this LifecycleUnit. Returns true on success. + virtual bool Unfreeze() = 0; + // Discards this LifecycleUnit. // // TODO(fdoray): Consider handling urgent discard with groups of
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h index a56683b2..5a81685d 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h
@@ -101,6 +101,8 @@ return site_characteristics_; } + size_t loaded_tabs_count_for_testing() const { return loaded_tabs_count_; } + size_t loaded_tabs_in_background_count_for_testing() const { return loaded_tabs_in_background_count_; }
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc index ae6c95d..7f7808e 100644 --- a/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc +++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_writer.cc
@@ -66,6 +66,8 @@ void LocalSiteCharacteristicsDataWriter::NotifyUsesAudioInBackground() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_EQ(TabVisibility::kBackground, tab_visibility_); + // TODO(sebmarchand): Do not advance the background audio observation time + // when the WebContents has never played audio. impl_->NotifyUsesAudioInBackground(); }
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc b/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc new file mode 100644 index 0000000..455863a2 --- /dev/null +++ b/chrome/browser/resource_coordinator/local_site_characteristics_database_browsertest.cc
@@ -0,0 +1,555 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <algorithm> + +#include "base/bind_helpers.h" +#include "base/callback.h" +#include "base/path_service.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/simple_test_tick_clock.h" +#include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" +#include "chrome/browser/history/history_service_factory.h" +#include "chrome/browser/notifications/desktop_notification_profile_util.h" +#include "chrome/browser/permissions/permission_request_manager.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/resource_coordinator/local_site_characteristics_data_impl.h" +#include "chrome/browser/resource_coordinator/local_site_characteristics_data_reader.h" +#include "chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.h" +#include "chrome/browser/resource_coordinator/site_characteristics_data_reader.h" +#include "chrome/browser/resource_coordinator/tab_load_tracker.h" +#include "chrome/browser/resource_coordinator/tab_manager_features.h" +#include "chrome/browser/resource_coordinator/time.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/network_session_configurator/common/network_switches.h" +#include "content/public/browser/notification_service.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/test_utils.h" +#include "content/public/test/web_contents_tester.h" +#include "media/base/media_switches.h" +#include "net/dns/mock_host_resolver.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/origin.h" + +#if defined(OS_CHROMEOS) +#include "chromeos/chromeos_switches.h" +#endif + +namespace resource_coordinator { + +namespace { + +using WebContents = content::WebContents; +using WebContentsTester = content::WebContentsTester; + +constexpr char kTestPage[] = + "/resource_coordinator/site_characteristics_test_page.html"; + +// Returns the longest feature observation window. +base::TimeDelta GetLongestObservationWindow() { + const SiteCharacteristicsDatabaseParams& params = + GetStaticSiteCharacteristicsDatabaseParams(); + return std::max({params.favicon_update_observation_window, + params.title_update_observation_window, + params.audio_usage_observation_window, + params.notifications_usage_observation_window}); +} + +} // namespace + +class LocalSiteCharacteristicsDatabaseTest : public InProcessBrowserTest { + public: + LocalSiteCharacteristicsDatabaseTest() + : scoped_set_tick_clock_for_testing_(&test_clock_), + test_server_(net::test_server::EmbeddedTestServer::TYPE_HTTPS) {} + ~LocalSiteCharacteristicsDatabaseTest() override = default; + + void SetUp() override { + test_clock_.Advance(base::TimeDelta::FromSeconds(1)); + scoped_feature_list_.InitAndEnableFeature( + features::kSiteCharacteristicsDatabase); + InProcessBrowserTest::SetUp(); + } + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + + // Setup the test server. + base::FilePath test_data_dir; + ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); + test_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); + test_server_.ServeFilesFromDirectory( + test_data_dir.AppendASCII("chrome/test/data/")); + ASSERT_TRUE(test_server_.InitializeAndListen()); + test_server_.StartAcceptingConnections(); + const std::string real_host = test_server_.host_port_pair().host(); + host_resolver()->AddRule("*", real_host); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + command_line->AppendSwitchASCII( + switches::kAutoplayPolicy, + switches::autoplay::kNoUserGestureRequiredPolicy); + + // HTTPS server only serves a valid cert for localhost, so this is needed + // to load pages from other origins without an interstitial. + command_line->AppendSwitch(switches::kIgnoreCertificateErrors); + +#if defined(OS_CHROMEOS) + command_line->AppendSwitch( + chromeos::switches::kIgnoreUserProfileMappingForTests); +#endif + InProcessBrowserTest::SetUpCommandLine(command_line); + } + + WebContents* GetActiveWebContents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + std::unique_ptr<SiteCharacteristicsDataReader> GetReaderForOrigin( + Profile* profile, + const url::Origin& origin) { + SiteCharacteristicsDataStore* data_store = + LocalSiteCharacteristicsDataStoreFactory::GetForProfile(profile); + EXPECT_TRUE(data_store); + std::unique_ptr<SiteCharacteristicsDataReader> reader = + data_store->GetReaderForOrigin(origin); + + internal::LocalSiteCharacteristicsDataImpl* impl = + static_cast<LocalSiteCharacteristicsDataReader*>(reader.get()) + ->impl_for_testing() + .get(); + while (!impl->site_characteristics_for_testing().IsInitialized()) + base::RunLoop().RunUntilIdle(); + return reader; + } + + // Test that feature usage is tracked correctly: + // - kSiteFeatureUsageUnknown if never observed and observation window + // hasn't expired. + // - kSiteFeatureNotInUse if never observed and observation window has + // expired. + // - kSiteFeatureInUse if observed. + // |feature_detection_method| is the SiteCharacteristicsDataReader method that + // will be called to query the status of this feature. |triggering_closure| is + // the closure to run to cause this feature to be used (this will get called + // while the tab is in background) and |allowing_closure| is an optional + // closure that should run before testing the feature usage (to allow it to + // be used). + void TestFeatureUsageDetection( + SiteFeatureUsage ( + SiteCharacteristicsDataReader::*feature_detection_method)() const, + base::RepeatingClosure triggering_closure, + base::RepeatingClosure allowing_closure = base::DoNothing::Repeatedly()) { + // Test that feature usage is tracked correctly before the expiration of its + // observation window. + TestFeatureUsageDetectionImpl(feature_detection_method, allowing_closure, + triggering_closure, false); + // Test that feature usage is tracked correctly after the expiration of its + // observation window. + TestFeatureUsageDetectionImpl(feature_detection_method, + std::move(allowing_closure), + std::move(triggering_closure), true); + } + + void ExecuteScriptInMainFrame(const char* script) { + content::RenderFrameHost* main_frame = + GetActiveWebContents()->GetMainFrame(); + EXPECT_TRUE(content::ExecuteScript(main_frame, script)); + } + + void PlayAudioInActiveWebContents() { + ExecuteScriptInMainFrame("PlayAudio();"); + } + + void ChangeTitleOfActiveWebContents() { + ExecuteScriptInMainFrame("ChangeTitle('new_title')"); + } + + void ChangeFaviconOfActiveWebContents() { + ExecuteScriptInMainFrame("ChangeFavicon()"); + } + + void TriggerNonPersistentNotificationInActiveWebContents() { + ExecuteScriptInMainFrame( + "DisplayAndCloseNonPersistentNotification('foo');"); + } + + // By default a tab has to play audio while being visible if it wants to be + // able to play audio in background (see + // ChromeContentRendererClient::DeferMediaLoad). This makes the current active + // WebContents visible, play some audio and background it. After calling + // this the background tab is allowed play audio. + void AllowBackgroundAudioInActiveTab() { + content::WebContents* active_webcontents = GetActiveWebContents(); + active_webcontents->WasShown(); + PlayAudioInActiveWebContents(); + + // Wait for the audio to start playing. + while (!active_webcontents->WasEverAudible()) + base::RunLoop().RunUntilIdle(); + + active_webcontents->GetController().Reload(content::ReloadType::NORMAL, + false); + content::WaitForLoadStop(GetActiveWebContents()); + // Background the tab and reload it so the audio will stop playing if it's + // still playing. + GetActiveWebContents()->WasHidden(); + } + + // Ensure that the current tab is allowed to display non-persistent + // notifications. + void AllowBackgroundNotificationInActiveTab() { + HostContentSettingsMapFactory::GetForProfile(browser()->profile()) + ->ClearSettingsForOneType(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); + HostContentSettingsMapFactory::GetForProfile(browser()->profile()) + ->SetDefaultContentSetting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, + CONTENT_SETTING_ALLOW); + content::WebContents* web_contents = GetActiveWebContents(); + DesktopNotificationProfileUtil::GrantPermission( + browser()->profile(), web_contents->GetLastCommittedURL()); + PermissionRequestManager::FromWebContents(web_contents) + ->set_auto_response_for_test(PermissionRequestManager::ACCEPT_ALL); + ExecuteScriptInMainFrame("RequestNotificationsPermission();"); + } + + base::SimpleTestTickClock& test_clock() { return test_clock_; } + net::test_server::EmbeddedTestServer& test_server() { return test_server_; } + + private: + void TestFeatureUsageDetectionImpl( + SiteFeatureUsage ( + SiteCharacteristicsDataReader::*feature_detection_method)() const, + base::OnceClosure allowing_closure, + base::RepeatingClosure triggering_closure, + bool wait_for_observation_window_to_expire); + + base::SimpleTestTickClock test_clock_; + ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing_; + base::test::ScopedFeatureList scoped_feature_list_; + net::test_server::EmbeddedTestServer test_server_; + + DISALLOW_COPY_AND_ASSIGN(LocalSiteCharacteristicsDatabaseTest); +}; + +void LocalSiteCharacteristicsDatabaseTest::TestFeatureUsageDetectionImpl( + SiteFeatureUsage ( + SiteCharacteristicsDataReader::*feature_detection_method)() const, + base::OnceClosure allowing_closure, + base::RepeatingClosure triggering_closure, + bool wait_for_observation_window_to_expire) { + // Use a different origin depending on the type of test to make sure that + // previous observations don't get re-used. + const char* kOrigin = + wait_for_observation_window_to_expire ? "foo.com" : "bar.com"; + GURL test_url(test_server_.GetURL(kOrigin, kTestPage)); + + // Get the reader for this origin. + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + (reader.get()->*feature_detection_method)()); + + // Navigate to the test url and background it. + ui_test_utils::NavigateToURLWithDisposition( + browser(), test_url, WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + GetActiveWebContents()->WasHidden(); + + // If needed, wait for all feature observation windows to expire. + if (wait_for_observation_window_to_expire) { + test_clock_.Advance(GetLongestObservationWindow()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse, + (reader.get()->*feature_detection_method)()); + } + + // Call the allowing closure. + std::move(allowing_closure).Run(); + + // Ensure that the closure hasn't caused the feature usage status to + // change. + if (wait_for_observation_window_to_expire) { + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse, + (reader.get()->*feature_detection_method)()); + } else { + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + (reader.get()->*feature_detection_method)()); + } + + // Cause the feature to be used. + triggering_closure.Run(); + + while ((reader.get()->*feature_detection_method)() != + SiteFeatureUsage::kSiteFeatureInUse) { + base::RunLoop().RunUntilIdle(); + } + + // Advance the clock, make sure that the feature usage status doesn't + // change. + test_clock_.Advance(GetLongestObservationWindow()); + + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse, + (reader.get()->*feature_detection_method)()); +} + +// Test that doesn't use any feature. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, NoFeatureUsed) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + + ui_test_utils::NavigateToURLWithDisposition( + browser(), test_url, WindowOpenDisposition::NEW_BACKGROUND_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesFaviconInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UsesAudioInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UsesNotificationsInBackground()); + + test_clock().Advance(GetLongestObservationWindow()); + + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse, + reader->UpdatesFaviconInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse, + reader->UpdatesTitleInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse, + reader->UsesAudioInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureNotInUse, + reader->UsesNotificationsInBackground()); +} + +// Test that use features while in foreground, this shouldn't be recorded. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + FeatureUsedInForegroundOnly) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + + ui_test_utils::NavigateToURLWithDisposition( + browser(), test_url, WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + + GetActiveWebContents()->WasShown(); + + ChangeTitleOfActiveWebContents(); + ChangeFaviconOfActiveWebContents(); + PlayAudioInActiveWebContents(); + // TODO(sebmarchand): Also trigger a background notification once. + + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesFaviconInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); + + // Advance the clock while the tab is still in foreground and make sure that + // the state hasn't changed. + test_clock().Advance(GetLongestObservationWindow()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesFaviconInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UsesAudioInBackground()); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UsesNotificationsInBackground()); +} + +// Test that the audio feature usage in background gets detected properly. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + AudioFeatureUsage) { + TestFeatureUsageDetection( + &SiteCharacteristicsDataReader::UsesAudioInBackground, + base::BindRepeating( + &LocalSiteCharacteristicsDatabaseTest::PlayAudioInActiveWebContents, + base::Unretained(this)), + base::BindRepeating(&LocalSiteCharacteristicsDatabaseTest:: + AllowBackgroundAudioInActiveTab, + base::Unretained(this))); +} + +// Test that the notification feature usage in background gets detected +// properly. +// TODO(sebmarchand): Figure out how to trigger a non-persistent notification in +// this test. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + DISABLED_NotificationFeatureUsage) { + TestFeatureUsageDetection( + &SiteCharacteristicsDataReader::UsesNotificationsInBackground, + base::BindRepeating( + &LocalSiteCharacteristicsDatabaseTest:: + TriggerNonPersistentNotificationInActiveWebContents, + base::Unretained(this)), + base::BindRepeating(&LocalSiteCharacteristicsDatabaseTest:: + AllowBackgroundNotificationInActiveTab, + base::Unretained(this))); +} + +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + TitleUpdateFeatureUsage) { + TestFeatureUsageDetection( + &SiteCharacteristicsDataReader::UpdatesTitleInBackground, + base::BindRepeating( + &LocalSiteCharacteristicsDatabaseTest::ChangeTitleOfActiveWebContents, + base::Unretained(this))); +} + +// Test that the favicon update feature usage in background gets detected +// properly. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + FaviconUpdateFeatureUsage) { + TestFeatureUsageDetection( + &SiteCharacteristicsDataReader::UpdatesFaviconInBackground, + base::BindRepeating(&LocalSiteCharacteristicsDatabaseTest:: + ChangeFaviconOfActiveWebContents, + base::Unretained(this))); +} + +// Test that loads the same origin into multiple tabs and ensure that they get +// tracked properly. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + LoadedStateGetsTrackedProperly) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + auto test_reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + + const size_t kTabCount = 3; + + // Load all the tabs and background them. + for (size_t i = 0; i < kTabCount; ++i) { + ui_test_utils::NavigateToURLWithDisposition( + browser(), test_url, + i == 0 ? WindowOpenDisposition::CURRENT_TAB + : WindowOpenDisposition::NEW_FOREGROUND_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + EXPECT_EQ(TabLoadTracker::LoadingState::LOADED, + TabLoadTracker::Get()->GetLoadingState( + browser()->tab_strip_model()->GetWebContentsAt(i))); + browser()->tab_strip_model()->GetWebContentsAt(i)->WasHidden(); + } + + internal::LocalSiteCharacteristicsDataImpl* impl = + static_cast<LocalSiteCharacteristicsDataReader*>(test_reader.get()) + ->impl_for_testing() + .get(); + EXPECT_TRUE(impl); + EXPECT_EQ(3U, impl->loaded_tabs_count_for_testing()); + EXPECT_EQ(3U, impl->loaded_tabs_in_background_count_for_testing()); + + // Change the visibility of the tabs. + for (size_t i = 0; i < kTabCount; ++i) { + browser()->tab_strip_model()->GetWebContentsAt(i)->WasShown(); + + EXPECT_EQ(kTabCount, impl->loaded_tabs_count_for_testing()); + EXPECT_EQ(kTabCount - (i + 1), + impl->loaded_tabs_in_background_count_for_testing()); + } + + for (size_t i = 0; i < kTabCount; ++i) + browser()->tab_strip_model()->GetWebContentsAt(i)->WasHidden(); + + EXPECT_EQ(3U, impl->loaded_tabs_in_background_count_for_testing()); + + // Close the tabs. + for (size_t i = 0; i < kTabCount; ++i) { + EXPECT_TRUE(browser()->tab_strip_model()->CloseWebContentsAt(0, 0)); + EXPECT_EQ(kTabCount - (i + 1), impl->loaded_tabs_count_for_testing()); + EXPECT_EQ(kTabCount - (i + 1), + impl->loaded_tabs_in_background_count_for_testing()); + } +} + +// Ensure that the observations gets persisted on disk. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + PRE_DatabaseGetsPersisted) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + + // Get the reader for this origin. + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); + + // Navigate to the test url and background it. + ui_test_utils::NavigateToURLWithDisposition( + browser(), test_url, WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + GetActiveWebContents()->WasHidden(); + + // Cause the "title update in background" feature to be used. + ChangeTitleOfActiveWebContents(); + + while (reader->UpdatesTitleInBackground() != + SiteFeatureUsage::kSiteFeatureInUse) { + base::RunLoop().RunUntilIdle(); + } +} + +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, + DatabaseGetsPersisted) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + + // Get the reader for this origin. + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + + // We should remember the observation made previously. + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureInUse, + reader->UpdatesTitleInBackground()); +} + +// Ensure that clearing the history removes the observations from disk. +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, PRE_ClearHistory) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + + // Get the reader for this origin. + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); + + // Navigate to the test url and background it. + ui_test_utils::NavigateToURLWithDisposition( + browser(), test_url, WindowOpenDisposition::CURRENT_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + GetActiveWebContents()->WasHidden(); + + // Cause the "title update in background" feature to be used. + ChangeTitleOfActiveWebContents(); + + while (reader->UpdatesTitleInBackground() != + SiteFeatureUsage::kSiteFeatureInUse) { + base::RunLoop().RunUntilIdle(); + } + + HistoryServiceFactory::GetForProfile(browser()->profile(), + ServiceAccessType::IMPLICIT_ACCESS) + ->DeleteURL(test_url); + // The history gets cleared asynchronously. + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); +} + +IN_PROC_BROWSER_TEST_F(LocalSiteCharacteristicsDatabaseTest, ClearHistory) { + GURL test_url(test_server().GetURL("foo.com", kTestPage)); + + // Get the reader for this origin. + auto reader = + GetReaderForOrigin(browser()->profile(), url::Origin::Create(test_url)); + + // The history has been cleared, we shouldn't know if this feature is used. + EXPECT_EQ(SiteFeatureUsage::kSiteFeatureUsageUnknown, + reader->UpdatesTitleInBackground()); +} + +} // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_helper.cc b/chrome/browser/resource_coordinator/tab_helper.cc index 2775ffdb..cf3b091 100644 --- a/chrome/browser/resource_coordinator/tab_helper.cc +++ b/chrome/browser/resource_coordinator/tab_helper.cc
@@ -27,6 +27,10 @@ #include "services/resource_coordinator/public/mojom/service_constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" +#if !defined(OS_ANDROID) +#include "chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.h" +#endif + DEFINE_WEB_CONTENTS_USER_DATA_KEY( resource_coordinator::ResourceCoordinatorTabHelper); @@ -62,6 +66,14 @@ TabMemoryMetricsReporter::Get()->StartReporting(TabLoadTracker::Get()); } + +#if !defined(OS_ANDROID) + if (base::FeatureList::IsEnabled(features::kSiteCharacteristicsDatabase)) { + local_site_characteristics_wc_observer_ = + std::make_unique<LocalSiteCharacteristicsWebContentsObserver>( + web_contents); + } +#endif } ResourceCoordinatorTabHelper::~ResourceCoordinatorTabHelper() = default;
diff --git a/chrome/browser/resource_coordinator/tab_helper.h b/chrome/browser/resource_coordinator/tab_helper.h index 16bebcd6..6bcdb20 100644 --- a/chrome/browser/resource_coordinator/tab_helper.h +++ b/chrome/browser/resource_coordinator/tab_helper.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/time/time.h" +#include "build/build_config.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -17,6 +18,7 @@ namespace resource_coordinator { class PageResourceCoordinator; +class LocalSiteCharacteristicsWebContentsObserver; class ResourceCoordinatorTabHelper : public content::WebContentsObserver, @@ -63,6 +65,11 @@ page_resource_coordinator_; ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId; +#if !defined(OS_ANDROID) + std::unique_ptr<LocalSiteCharacteristicsWebContentsObserver> + local_site_characteristics_wc_observer_; +#endif + // Favicon and title are set when a page is loaded, we only want to send // signals to GRC about title and favicon update from the previous title and // favicon, thus we want to ignore the very first update since it is always
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc index 4c11648..50abada 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
@@ -67,6 +67,9 @@ } case LifecycleUnitState::PENDING_FREEZE: { switch (to) { + // Unfreeze() is called. + case LifecycleUnitState::ACTIVE: + return reason == StateChangeReason::BROWSER_INITIATED; // Discard(kProactive) is called. case LifecycleUnitState::PENDING_DISCARD: return reason == StateChangeReason::BROWSER_INITIATED; @@ -83,9 +86,12 @@ } case LifecycleUnitState::FROZEN: { switch (to) { - // The renderer re-activates the page because it became visible. - case LifecycleUnitState::ACTIVE: - return reason == StateChangeReason::RENDERER_INITIATED; + // Unfreeze() is called or the renderer re-activates the page because it + // became visible. + case LifecycleUnitState::ACTIVE: { + return reason == StateChangeReason::BROWSER_INITIATED || + reason == StateChangeReason::RENDERER_INITIATED; + } // Discard(kProactive|kUrgent|kExternal) is called. case LifecycleUnitState::DISCARDED: { return reason == StateChangeReason::BROWSER_INITIATED || @@ -328,19 +334,6 @@ return true; } -bool TabLifecycleUnitSource::TabLifecycleUnit::Freeze() { - if (!IsValidStateChange(GetState(), LifecycleUnitState::PENDING_FREEZE, - StateChangeReason::BROWSER_INITIATED)) { - return false; - } - - SetState(LifecycleUnitState::PENDING_FREEZE, - StateChangeReason::BROWSER_INITIATED); - GetWebContents()->SetPageFrozen(true); - - return true; -} - int TabLifecycleUnitSource::TabLifecycleUnit:: GetEstimatedMemoryFreedOnDiscardKB() const { #if defined(OS_CHROMEOS) @@ -502,6 +495,37 @@ return decision_details->IsPositive(); } +bool TabLifecycleUnitSource::TabLifecycleUnit::Freeze() { + if (!IsValidStateChange(GetState(), LifecycleUnitState::PENDING_FREEZE, + StateChangeReason::BROWSER_INITIATED)) { + return false; + } + + // WebContents::SetPageFrozen() DCHECKs if the page is visible. + if (GetWebContents()->GetVisibility() == content::Visibility::VISIBLE) + return false; + + SetState(LifecycleUnitState::PENDING_FREEZE, + StateChangeReason::BROWSER_INITIATED); + GetWebContents()->SetPageFrozen(true); + return true; +} + +bool TabLifecycleUnitSource::TabLifecycleUnit::Unfreeze() { + if (!IsValidStateChange(GetState(), LifecycleUnitState::ACTIVE, + StateChangeReason::BROWSER_INITIATED)) { + return false; + } + + // WebContents::SetPageFrozen() DCHECKs if the page is visible. + if (GetWebContents()->GetVisibility() == content::Visibility::VISIBLE) + return false; + + SetState(LifecycleUnitState::ACTIVE, StateChangeReason::BROWSER_INITIATED); + GetWebContents()->SetPageFrozen(false); + return true; +} + bool TabLifecycleUnitSource::TabLifecycleUnit::Discard(DiscardReason reason) { // Can't discard a tab when it isn't in a tabstrip. if (!tab_strip_model_)
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.h b/chrome/browser/resource_coordinator/tab_lifecycle_unit.h index d7b39da..3639fe1 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.h +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.h
@@ -91,12 +91,13 @@ content::Visibility GetVisibility() const override; LifecycleUnitLoadingState GetLoadingState() const override; bool Load() override; - bool Freeze() override; int GetEstimatedMemoryFreedOnDiscardKB() const override; bool CanPurge() const override; bool CanFreeze(DecisionDetails* decision_details) const override; bool CanDiscard(DiscardReason reason, DecisionDetails* decision_details) const override; + bool Freeze() override; + bool Unfreeze() override; bool Discard(DiscardReason discard_reason) override; ukm::SourceId GetUkmSourceId() const override;
diff --git a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc index 741d8d8..f5c527f 100644 --- a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
@@ -55,6 +55,11 @@ constexpr char kBlinkPageLifecycleFeature[] = "PageLifecycle"; constexpr base::TimeDelta kShortDelay = base::TimeDelta::FromSeconds(1); +constexpr char kMainFrameFrozenStateJS[] = + "window.domAutomationController.send(mainFrameFreezeCount);"; +constexpr char kChildFrameFrozenStateJS[] = + "window.domAutomationController.send(childFrameFreezeCount);"; + bool ObserveNavEntryCommitted(const GURL& expected_url, const content::NotificationSource& source, const content::NotificationDetails& details) { @@ -154,6 +159,104 @@ ASSERT_EQ(2, tsm()->count()); } + // Opens 2 tabs. Calls Freeze() on the background tab. Verifies that it + // transitions to the PENDING_FREEZE, and that onfreeze callbacks runs on the + // page. The background tab is PENDING_FREEZE when this returns. + void TestTransitionFromActiveToPendingFreeze() { + // Setup the embedded_test_server to serve a cross-site frame. + content::SetupCrossSiteRedirector(embedded_test_server()); + ASSERT_TRUE(embedded_test_server()->Start()); + + // Opening two tabs, where the second tab is backgrounded. + GURL main_url( + embedded_test_server()->GetURL("a.com", "/iframe_cross_site.html")); + OpenTwoTabs(GURL(chrome::kChromeUIAboutURL), main_url); + constexpr int kFreezingIndex = 1; + LifecycleUnit* const lifecycle_unit = GetLifecycleUnitAt(kFreezingIndex); + content::WebContents* const content = GetWebContentsAt(kFreezingIndex); + + // Grab the frames. + content::RenderFrameHost* main_frame = content->GetMainFrame(); + ASSERT_EQ(3u, content->GetAllFrames().size()); + // The page has 2 iframes, we will use the first one. + content::RenderFrameHost* child_frame = content->GetAllFrames()[1]; + // Verify that the main frame and subframe are cross-site. + EXPECT_FALSE(content::SiteInstance::IsSameWebSite( + browser()->profile(), main_frame->GetLastCommittedURL(), + child_frame->GetLastCommittedURL())); + if (content::AreAllSitesIsolatedForTesting()) { + EXPECT_NE(main_frame->GetProcess()->GetID(), + child_frame->GetProcess()->GetID()); + } + + // Ensure that the tab is hidden or backgrounded. + bool hidden_state_result; + EXPECT_TRUE(content::ExecuteScriptAndExtractBool( + main_frame, + "window.domAutomationController.send(" + "window.document.hidden);", + &hidden_state_result)); + EXPECT_TRUE(hidden_state_result); + + EXPECT_TRUE(content::ExecuteScript( + main_frame, + "if (window.location.pathname != '/iframe_cross_site.html')" + " throw 'Incorrect frame';" + "mainFrameFreezeCount = 0;" + "window.document.onfreeze = function(){ mainFrameFreezeCount++; };")); + + EXPECT_TRUE(content::ExecuteScript( + child_frame, + "if (window.location.pathname != '/title1.html') throw 'Incorrect " + "frame';" + "childFrameFreezeCount = 0;" + "window.document.onfreeze = function(){ childFrameFreezeCount++; };")); + + // freeze_count_result should be 0 for both frames, if it is undefined then + // we are in the wrong frame/tab. + int freeze_count_result; + EXPECT_TRUE(content::ExecuteScriptAndExtractInt( + main_frame, kMainFrameFrozenStateJS, &freeze_count_result)); + EXPECT_EQ(0, freeze_count_result); + EXPECT_TRUE(content::ExecuteScriptAndExtractInt( + child_frame, kChildFrameFrozenStateJS, &freeze_count_result)); + EXPECT_EQ(0, freeze_count_result); + + // Freeze the tab. If it fails then we might be freezing a visible tab. + EXPECT_EQ(LifecycleUnitState::ACTIVE, lifecycle_unit->GetState()); + EXPECT_TRUE(lifecycle_unit->Freeze()); + EXPECT_EQ(LifecycleUnitState::PENDING_FREEZE, lifecycle_unit->GetState()); + } + + // Opens 2 tabs. Calls Freeze() on the background tab. Verifies that it + // transitions to the PENDING_FREEZE and FROZEN states, and that onfreeze + // callbacks runs on the page. The background tabs is FROZEN when this + // returns. + void TestTransitionFromActiveToFrozen() { + TestTransitionFromActiveToPendingFreeze(); + + { + ExpectStateTransitionObserver expect_state_transition( + GetLifecycleUnitAt(1), LifecycleUnitState::FROZEN); + expect_state_transition.Wait(); + } + + content::WebContents* const content = GetWebContentsAt(1); + content::RenderFrameHost* main_frame = content->GetMainFrame(); + content::RenderFrameHost* child_frame = content->GetAllFrames()[1]; + + // freeze_count_result should be exactly 1 for both frames. The value is + // incremented in the onfreeze callback. If it is >1, then the callback was + // called more than once. + int freeze_count_result = 0; + EXPECT_TRUE(content::ExecuteScriptAndExtractInt( + main_frame, kMainFrameFrozenStateJS, &freeze_count_result)); + EXPECT_EQ(1, freeze_count_result); + EXPECT_TRUE(content::ExecuteScriptAndExtractInt( + child_frame, kChildFrameFrozenStateJS, &freeze_count_result)); + EXPECT_EQ(1, freeze_count_result); + } + // Gets the TabLifecycleUnit from |contents| and sends the signal that // indicates that the page is frozen. In production, this is sent by the // renderer process. This is done to finish a proactive tab discard. @@ -822,96 +925,14 @@ // - Freeze(): ACTIVE->PENDING_FREEZE // - Freeze happens in renderer: PENDING_FREEZE->FROZEN // - Tab is made visible: FROZEN->ACTIVE -IN_PROC_BROWSER_TEST_F(TabManagerTest, TabFreeze) { - const char kMainFrameFrozenStateJS[] = - "window.domAutomationController.send(mainFrameFreezeCount);"; - const char kChildFrameFrozenStateJS[] = - "window.domAutomationController.send(childFrameFreezeCount);"; - const char kHiddenStateJS[] = - "window.domAutomationController.send(" - "window.document.hidden);"; +IN_PROC_BROWSER_TEST_F(TabManagerTest, TabFreezeAndMakeVisible) { + TestTransitionFromActiveToFrozen(); - // Setup the embedded_test_server to serve a cross-site frame. - content::SetupCrossSiteRedirector(embedded_test_server()); - ASSERT_TRUE(embedded_test_server()->Start()); - - // Opening two tabs, where the second tab is backgrounded. - GURL main_url( - embedded_test_server()->GetURL("a.com", "/iframe_cross_site.html")); - OpenTwoTabs(GURL(chrome::kChromeUIAboutURL), main_url); - constexpr int kFreezingIndex = 1; - LifecycleUnit* const lifecycle_unit = GetLifecycleUnitAt(kFreezingIndex); - content::WebContents* const content = GetWebContentsAt(kFreezingIndex); - - // Grab the frames. - content::RenderFrameHost* main_frame = content->GetMainFrame(); - ASSERT_EQ(3u, content->GetAllFrames().size()); - // The page has 2 iframes, we will use the first one. - content::RenderFrameHost* child_frame = content->GetAllFrames()[1]; - // Verify that the main frame and subframe are cross-site. - EXPECT_FALSE(content::SiteInstance::IsSameWebSite( - browser()->profile(), main_frame->GetLastCommittedURL(), - child_frame->GetLastCommittedURL())); - if (content::AreAllSitesIsolatedForTesting()) { - EXPECT_NE(main_frame->GetProcess()->GetID(), - child_frame->GetProcess()->GetID()); - } - - // Ensure that the tab is hidden or backgrounded. - bool hidden_state_result; - EXPECT_TRUE(content::ExecuteScriptAndExtractBool(main_frame, kHiddenStateJS, - &hidden_state_result)); - EXPECT_TRUE(hidden_state_result); - - EXPECT_TRUE(content::ExecuteScript( - main_frame, - "if (window.location.pathname != '/iframe_cross_site.html')" - " throw 'Incorrect frame';" - "mainFrameFreezeCount = 0;" - "window.document.onfreeze = function(){ mainFrameFreezeCount++; };")); - - EXPECT_TRUE(content::ExecuteScript( - child_frame, - "if (window.location.pathname != '/title1.html') throw 'Incorrect frame';" - "childFrameFreezeCount = 0;" - "window.document.onfreeze = function(){ childFrameFreezeCount++; };")); - - // freeze_count_result should be 0 for both frames, if it is undefined then we - // are in the wrong frame/tab. - int freeze_count_result; - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - main_frame, kMainFrameFrozenStateJS, &freeze_count_result)); - EXPECT_EQ(0, freeze_count_result); - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - child_frame, kChildFrameFrozenStateJS, &freeze_count_result)); - EXPECT_EQ(0, freeze_count_result); - - // Freeze the tab. If it fails then we might be freezing a visible tab. - EXPECT_EQ(LifecycleUnitState::ACTIVE, lifecycle_unit->GetState()); - EXPECT_TRUE(lifecycle_unit->Freeze()); - EXPECT_EQ(LifecycleUnitState::PENDING_FREEZE, lifecycle_unit->GetState()); - + // Make the tab visible. It should transition to the ACTIVE state. + GetWebContentsAt(1)->WasShown(); { ExpectStateTransitionObserver expect_state_transition( - lifecycle_unit, LifecycleUnitState::FROZEN); - expect_state_transition.Wait(); - } - - // freeze_count_result should be exactly 1 for both frames. The value is - // incremented in the onfreeze callback. If it is >1, then the callback was - // called more than once. - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - main_frame, kMainFrameFrozenStateJS, &freeze_count_result)); - EXPECT_EQ(1, freeze_count_result); - EXPECT_TRUE(content::ExecuteScriptAndExtractInt( - child_frame, kChildFrameFrozenStateJS, &freeze_count_result)); - EXPECT_EQ(1, freeze_count_result); - - // Make the tab visible. It should be unfrozen. - content->WasShown(); - { - ExpectStateTransitionObserver expect_state_transition( - lifecycle_unit, LifecycleUnitState::ACTIVE); + GetLifecycleUnitAt(1), LifecycleUnitState::ACTIVE); expect_state_transition.Wait(); } } @@ -919,15 +940,36 @@ // Verifies the following state transitions for a tab: // - Initial state: ACTIVE // - Freeze(): ACTIVE->PENDING_FREEZE +// - Freeze happens in renderer: PENDING_FREEZE->FROZEN +// - Unfreeze(): FROZEN->ACTIVE +IN_PROC_BROWSER_TEST_F(TabManagerTest, TabFreezeAndUnfreeze) { + TestTransitionFromActiveToFrozen(); + + // Unfreeze the tab. It should transition to the ACTIVE state. + EXPECT_TRUE(GetLifecycleUnitAt(1)->Unfreeze()); + EXPECT_EQ(LifecycleUnitState::ACTIVE, GetLifecycleUnitAt(1)->GetState()); +} + +// Verifies the following state transitions for a tab: +// - Initial state: ACTIVE +// - Freeze(): ACTIVE->PENDING_FREEZE +// - Unfreeze(): PENDING_FREEZE->ACTIVE +IN_PROC_BROWSER_TEST_F(TabManagerTest, TabPendingFreezeAndUnfreeze) { + TestTransitionFromActiveToPendingFreeze(); + + // Unfreeze the tab. It should transition to the ACTIVE state. + EXPECT_TRUE(GetLifecycleUnitAt(1)->Unfreeze()); + EXPECT_EQ(LifecycleUnitState::ACTIVE, GetLifecycleUnitAt(1)->GetState()); +} + +// Verifies the following state transitions for a tab: +// - Initial state: ACTIVE +// - Freeze(): ACTIVE->PENDING_FREEZE // - Discard(kProactive): PENDING_FREEZE->PENDING_DISCARD // - Freeze happens in renderer: PENDING_DISCARD->DISCARDED -IN_PROC_BROWSER_TEST_F(TabManagerTestWithTwoTabs, +IN_PROC_BROWSER_TEST_F(TabManagerTest, TabFreezeAndProactiveDiscardBeforeFreezeCompletes) { - // Freeze the background tab. - EXPECT_EQ(LifecycleUnitState::ACTIVE, GetLifecycleUnitAt(1)->GetState()); - GetLifecycleUnitAt(1)->Freeze(); - EXPECT_EQ(LifecycleUnitState::PENDING_FREEZE, - GetLifecycleUnitAt(1)->GetState()); + TestTransitionFromActiveToPendingFreeze(); // Proactively discard the background tab. EXPECT_TRUE(GetLifecycleUnitAt(1)->Discard(DiscardReason::kProactive)); @@ -962,19 +1004,8 @@ // - Freeze(): ACTIVE->PENDING_FREEZE // - Freeze happens in renderer: PENDING_FREEZE->FROZEN // - Discard(kUrgent): FROZEN->DISCARDED -IN_PROC_BROWSER_TEST_F(TabManagerTestWithTwoTabs, TabFreezeAndUrgentDiscard) { - // Freeze the background tab. - EXPECT_EQ(LifecycleUnitState::ACTIVE, GetLifecycleUnitAt(1)->GetState()); - EXPECT_TRUE(GetLifecycleUnitAt(1)->Freeze()); - EXPECT_EQ(LifecycleUnitState::PENDING_FREEZE, - GetLifecycleUnitAt(1)->GetState()); - - // Expect a transition to FROZEN when the page is frozen by the renderer. - { - ExpectStateTransitionObserver expect_state_transition( - GetLifecycleUnitAt(1), LifecycleUnitState::FROZEN); - expect_state_transition.Wait(); - } +IN_PROC_BROWSER_TEST_F(TabManagerTest, TabFreezeAndUrgentDiscard) { + TestTransitionFromActiveToFrozen(); // Urgently discard the background tab. EXPECT_TRUE(GetLifecycleUnitAt(1)->Discard(DiscardReason::kUrgent));
diff --git a/chrome/browser/resource_coordinator/test_lifecycle_unit.cc b/chrome/browser/resource_coordinator/test_lifecycle_unit.cc index 0057745b..9ddc7ee 100644 --- a/chrome/browser/resource_coordinator/test_lifecycle_unit.cc +++ b/chrome/browser/resource_coordinator/test_lifecycle_unit.cc
@@ -52,10 +52,6 @@ return false; } -bool TestLifecycleUnit::Freeze() { - return false; -} - int TestLifecycleUnit::GetEstimatedMemoryFreedOnDiscardKB() const { return 0; } @@ -73,6 +69,14 @@ return can_discard_; } +bool TestLifecycleUnit::Freeze() { + return false; +} + +bool TestLifecycleUnit::Unfreeze() { + return false; +} + bool TestLifecycleUnit::Discard(DiscardReason discard_reason) { return false; }
diff --git a/chrome/browser/resource_coordinator/test_lifecycle_unit.h b/chrome/browser/resource_coordinator/test_lifecycle_unit.h index 1843777..8cc7d4a7 100644 --- a/chrome/browser/resource_coordinator/test_lifecycle_unit.h +++ b/chrome/browser/resource_coordinator/test_lifecycle_unit.h
@@ -33,12 +33,13 @@ content::Visibility GetVisibility() const override; LifecycleUnitLoadingState GetLoadingState() const override; bool Load() override; - bool Freeze() override; int GetEstimatedMemoryFreedOnDiscardKB() const override; bool CanPurge() const override; bool CanFreeze(DecisionDetails* decision_details) const override; bool CanDiscard(DiscardReason reason, DecisionDetails* decision_details) const override; + bool Freeze() override; + bool Unfreeze() override; bool Discard(DiscardReason discard_reason) override; private:
diff --git a/chrome/browser/resources/md_history/history.js b/chrome/browser/resources/md_history/history.js index 961ec8f..c42f9283 100644 --- a/chrome/browser/resources/md_history/history.js +++ b/chrome/browser/resources/md_history/history.js
@@ -22,6 +22,7 @@ function waitForAppUpgrade() { if (!upgradePromise) { upgradePromise = new Promise(function(resolve, reject) { + // TODO(dpapad): Need to update this to work with Polymer 2. if (window.Polymer && Polymer.isInstance && Polymer.isInstance($('history-app'))) { resolve();
diff --git a/chrome/browser/resources/md_history/synced_device_card.js b/chrome/browser/resources/md_history/synced_device_card.js index bbd109a..6c2ec3db 100644 --- a/chrome/browser/resources/md_history/synced_device_card.js +++ b/chrome/browser/resources/md_history/synced_device_card.js
@@ -56,13 +56,11 @@ titleRow.addItem('collapse', '#collapse-button'); const rows = [titleRow]; if (this.opened) { - Polymer.dom(this.root) - .querySelectorAll('.item-container') - .forEach(function(el) { - const row = new cr.ui.FocusRow(el, null); - row.addItem('title', '.website-title'); - rows.push(row); - }); + this.shadowRoot.querySelectorAll('.item-container').forEach(function(el) { + const row = new cr.ui.FocusRow(el, null); + row.addItem('title', '.website-title'); + rows.push(row); + }); } return rows; },
diff --git a/chrome/browser/resources/md_history/synced_device_manager.js b/chrome/browser/resources/md_history/synced_device_manager.js index ef84de1f..62ec34e 100644 --- a/chrome/browser/resources/md_history/synced_device_manager.js +++ b/chrome/browser/resources/md_history/synced_device_manager.js
@@ -179,14 +179,9 @@ this.focusGrid_.destroy(); - this.debounce('updateFocusGrid', function() { - Polymer.dom(this.root) - .querySelectorAll('history-synced-device-card') - .reduce( - function(prev, cur) { - return prev.concat(cur.createFocusRows()); - }, - []) + this.debounce('updateFocusGrid', () => { + Array.from(this.shadowRoot.querySelectorAll('history-synced-device-card')) + .reduce((prev, cur) => prev.concat(cur.createFocusRows()), []) .forEach((row) => { this.focusGrid_.addRow(row); });
diff --git a/chrome/browser/resources/print_preview/new/app.js b/chrome/browser/resources/print_preview/new/app.js index 83ccdad..4cdc588 100644 --- a/chrome/browser/resources/print_preview/new/app.js +++ b/chrome/browser/resources/print_preview/new/app.js
@@ -285,6 +285,9 @@ this.recentDestinations_); this.isInAppKioskMode_ = settings.isInAppKioskMode; this.isInKioskAutoPrintMode_ = settings.isInKioskAutoPrintMode; + + // This is only visible in the task manager. + document.head.querySelector('title').textContent = settings.documentTitle; }, /**
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html index ca74a49..b10af44a 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.html +++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -21,7 +21,7 @@ <link rel="import" href="../crostini_page/crostini_page.html"> <link rel="import" href="../device_page/device_page.html"> <link rel="import" href="../internet_page/internet_page.html"> -<link rel="import" href="../multidevice_page/multidevice_page.html"> +<link rel="import" href="../multidevice_page/multidevice_section_container.html"> </if> <if expr="not chromeos"> @@ -113,11 +113,8 @@ <template is="dom-if" if="[[shouldShowMultidevice_(showMultidevice, pageVisibility)]]" restamp> - <settings-section page-title="$i18n{multidevicePageTitle}" - section="multidevice"> - <settings-multidevice-page prefs="{{prefs}}"> - </settings-multidevice-page> - </settings-section> + <settings-multidevice-section-container prefs="{{prefs}}"> + </settings-multidevice-section-container> </template> <template is="dom-if" if="[[showPage_(pageVisibility.bluetooth)]]" restamp>
diff --git a/chrome/browser/resources/settings/google_assistant_page/google_assistant_browser_proxy.js b/chrome/browser/resources/settings/google_assistant_page/google_assistant_browser_proxy.js index 27aa284..5772dd6 100644 --- a/chrome/browser/resources/settings/google_assistant_page/google_assistant_browser_proxy.js +++ b/chrome/browser/resources/settings/google_assistant_page/google_assistant_browser_proxy.js
@@ -22,6 +22,12 @@ */ setGoogleAssistantContextEnabled(enabled) {} + /** + * Enables or disables hotword detection for the Google Assistant. + * @param {boolean} enabled + */ + setGoogleAssistantHotwordEnabled(enabled) {} + /** Launches into the Google Assistant app settings. */ launchGoogleAssistantSettings() {} } @@ -39,6 +45,11 @@ } /** @override */ + setGoogleAssistantHotwordEnabled(enabled) { + chrome.send('setGoogleAssistantHotwordEnabled', [enabled]); + } + + /** @override */ showGoogleAssistantSettings() { chrome.send('showGoogleAssistantSettings'); }
diff --git a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html index d89f2bc..1c2a581 100644 --- a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html +++ b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html
@@ -29,6 +29,15 @@ sub-label="$i18n{googleAssistantEnableContextDescription}" on-change="onGoogleAssistantContextEnableChange_"> </settings-toggle-button> + <template is="dom-if" if="[[assistantFeatureEnabled_]]"> + <settings-toggle-button id="googleAssistantHotwordEnable" + class="continuation indented" + pref="{{prefs.settings.voice_interaction.hotword.enabled}}" + label="$i18n{googleAssistantEnableHotword}" + sub-label="$i18n{googleAssistantEnableHotwordDescription}" + on-change="onGoogleAssistantHotwordEnableChange_"> + </settings-toggle-button> + </template> <div id="googleAssistantSettings" class="settings-box" on-click="onGoogleAssistantSettingsTapped_" actionable> <div class="start">
diff --git a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js index 8db740b..8c28bf0 100644 --- a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js +++ b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js
@@ -11,6 +11,16 @@ behaviors: [I18nBehavior, PrefsBehavior], + properties: { + /** @private */ + assistantFeatureEnabled_: { + type: Boolean, + value: function() { + return loadTimeData.getBoolean('enableAssistant'); + }, + }, + }, + /** @private {?settings.GoogleAssistantBrowserProxy} */ browserProxy_: null, @@ -41,6 +51,12 @@ }, /** @private */ + onGoogleAssistantHotwordEnableChange_: function() { + this.browserProxy_.setGoogleAssistantHotwordEnabled( + !!this.getPref('settings.voice_interaction.hotword.enabled.value')); + }, + + /** @private */ onGoogleAssistantSettingsTapped_: function() { this.browserProxy_.showGoogleAssistantSettings(); },
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_section_container.html b/chrome/browser/resources/settings/multidevice_page/multidevice_section_container.html new file mode 100644 index 0000000..32a0afd5 --- /dev/null +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_section_container.html
@@ -0,0 +1,17 @@ +<link rel="import" href="chrome://resources/html/polymer.html"> + +<link rel="import" href="../settings_page/settings_section.html"> +<link rel="import" href="multidevice_page.html"> + +<dom-module id="settings-multidevice-section-container"> + <template> + <template is="dom-if" if="[[hostFound_(mode_)]]" restamp> + <settings-section page-title="$i18n{multidevicePageTitle}" + section="multidevice"> + <settings-multidevice-page prefs="[[prefs]]" mode="[[mode_]]"> + </settings-multidevice-page> + </settings-section> + </template> + </template> + <script src="multidevice_section_container.js"></script> +</dom-module>
diff --git a/chrome/browser/resources/settings/multidevice_page/multidevice_section_container.js b/chrome/browser/resources/settings/multidevice_page/multidevice_section_container.js new file mode 100644 index 0000000..87b65d00 --- /dev/null +++ b/chrome/browser/resources/settings/multidevice_page/multidevice_section_container.js
@@ -0,0 +1,37 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * Container element that interfaces with a Mojo API to ensure that the entire + * multidevice settings-section is not attached to the DOM if there is not a + * host device or potential host device. It also provides the page with the + * data it needs to provide the user with the correct infomation and call(s) to + * action based on the data retrieved from the Mojo service (i.e. the mode_ + * property). + */ + +Polymer({ + is: 'settings-multidevice-section-container', + + properties: { + /** SettingsPrefsElement 'prefs' Object reference. See prefs.js. */ + prefs: { + type: Object, + notify: true, + }, + + // TODO(jordynass): Set this property based on the results of the Mojo call. + /** @type {settings.MultiDeviceSettingsMode} */ + mode_: { + type: Number, + value: settings.MultiDeviceSettingsMode.NO_HOST_SET, + }, + }, + + /** @return {boolean} */ + hostFound_: function() { + return this.mode_ != settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS; + }, +});
diff --git a/chrome/browser/resources/settings/search_page/search_page.js b/chrome/browser/resources/settings/search_page/search_page.js index e040eec..4c45606 100644 --- a/chrome/browser/resources/settings/search_page/search_page.js +++ b/chrome/browser/resources/settings/search_page/search_page.js
@@ -47,10 +47,18 @@ }, /** @private */ + assistantFeatureEnabled_: { + type: Boolean, + value: function() { + return loadTimeData.getBoolean('enableAssistant'); + }, + }, + + /** @private */ assistantOn_: { type: Boolean, - computed: - 'isAssistantTurnedOn_(arcEnabled, voiceInteractionValuePropAccepted)', + computed: 'isAssistantTurnedOn_(arcEnabled, ' + + 'voiceInteractionValuePropAccepted, assistantFeatureEnabled_)', } // </if> }, @@ -137,10 +145,12 @@ /** @private * @param {boolean} arcEnabled * @param {boolean} valuePropAccepted + * @param {boolean} assistantFeatureEnabled * @return {boolean} */ - isAssistantTurnedOn_: function(arcEnabled, valuePropAccepted) { - return arcEnabled && valuePropAccepted; + isAssistantTurnedOn_: function( + arcEnabled, valuePropAccepted, assistantFeatureEnabled) { + return (arcEnabled || assistantFeatureEnabled) && valuePropAccepted; }, // </if>
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index 589841ac..8c66f49 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -1299,6 +1299,12 @@ <structure name="IDR_SETTINGS_MULTIDEVICE_PAGE_JS" file="multidevice_page/multidevice_page.js" type="chrome_html" /> + <structure name="IDR_SETTINGS_MULTIDEVICE_SECTION_CONTAINER_HTML" + file="multidevice_page/multidevice_section_container.html" + type="chrome_html" /> + <structure name="IDR_SETTINGS_MULTIDEVICE_SECTION_CONTAINER_JS" + file="multidevice_page/multidevice_section_container.js" + type="chrome_html" /> <structure name="IDR_SETTINGS_NETWORK_PROXY_SECTION_HTML" file="internet_page/network_proxy_section.html" type="chrome_html" />
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc index 775919e1..eb522b51 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -42,6 +42,7 @@ #include "components/safe_browsing/password_protection/password_protection_navigation_throttle.h" #include "components/safe_browsing/password_protection/password_protection_request.h" #include "components/safe_browsing/triggers/trigger_throttler.h" +#include "components/safe_browsing/web_ui/safe_browsing_ui.h" #include "components/signin/core/browser/account_info.h" #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/signin_manager.h" @@ -510,9 +511,6 @@ content::WebContents* web_contents) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!IsEventLoggingEnabled()) - return; - syncer::UserEventService* user_event_service = browser_sync::UserEventServiceFactory::GetForProfile(profile_); if (!user_event_service) @@ -541,7 +539,11 @@ status->set_safe_browsing_reporting_population(SafeBrowsingStatus::SCOUT); break; } - user_event_service->RecordUserEvent(std::move(specifics)); + + WebUIInfoSingleton::GetInstance()->AddToPGEvents(*specifics); + + if (IsEventLoggingEnabled()) + user_event_service->RecordUserEvent(std::move(specifics)); } void ChromePasswordProtectionService::LogPasswordReuseDialogInteraction(
diff --git a/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc index 501c0ee..ac56ab9 100644 --- a/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc
@@ -19,9 +19,7 @@ #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_test_util.h" -#include "services/network/network_context.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace safe_browsing { @@ -92,43 +90,6 @@ return base::WrapUnique(uploader_); } -class SharedURLLoaderFactory : public network::SharedURLLoaderFactory { - public: - explicit SharedURLLoaderFactory( - network::mojom::URLLoaderFactory* url_loader_factory) - : url_loader_factory_(url_loader_factory) {} - - // network::URLLoaderFactory implementation: - void CreateLoaderAndStart(network::mojom::URLLoaderRequest loader, - int32_t routing_id, - int32_t request_id, - uint32_t options, - const network::ResourceRequest& request, - network::mojom::URLLoaderClientPtr client, - const net::MutableNetworkTrafficAnnotationTag& - traffic_annotation) override { - url_loader_factory_->CreateLoaderAndStart( - std::move(loader), routing_id, request_id, options, std::move(request), - std::move(client), traffic_annotation); - } - - void Clone(network::mojom::URLLoaderFactoryRequest request) override { - NOTREACHED(); - } - - // network::SharedURLLoaderFactoryInfo implementation - std::unique_ptr<network::SharedURLLoaderFactoryInfo> Clone() override { - NOTREACHED(); - return nullptr; - } - - private: - friend class base::RefCounted<SharedURLLoaderFactory>; - ~SharedURLLoaderFactory() override = default; - - network::mojom::URLLoaderFactory* url_loader_factory_; -}; - } // namespace class DownloadFeedbackTest : public testing::Test { @@ -138,21 +99,10 @@ {base::MayBlock(), base::TaskPriority::BACKGROUND})), io_task_runner_(content::BrowserThread::GetTaskRunnerForThread( content::BrowserThread::IO)), - url_request_context_(std::make_unique<net::TestURLRequestContext>()), feedback_finish_called_(false) { EXPECT_NE(io_task_runner_, file_task_runner_); - network::mojom::NetworkContextPtr network_context; - network_context_ = std::make_unique<network::NetworkContext>( - nullptr, mojo::MakeRequest(&network_context), - url_request_context_.get()); - network::mojom::URLLoaderFactoryParamsPtr params = - network::mojom::URLLoaderFactoryParams::New(); - params->process_id = network::mojom::kBrowserProcessId; - params->is_corb_enabled = false; - network_context_->CreateURLLoaderFactory( - mojo::MakeRequest(&url_loader_factory_), std::move(params)); shared_url_loader_factory_ = - base::MakeRefCounted<SharedURLLoaderFactory>(url_loader_factory_.get()); + base::MakeRefCounted<network::TestSharedURLLoaderFactory>(); } void SetUp() override { @@ -184,10 +134,7 @@ scoped_refptr<base::SequencedTaskRunner> file_task_runner_; scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; FakeUploaderFactory two_phase_uploader_factory_; - std::unique_ptr<net::TestURLRequestContext> url_request_context_; - std::unique_ptr<network::NetworkContext> network_context_; - network::mojom::URLLoaderFactoryPtr url_loader_factory_; - scoped_refptr<SharedURLLoaderFactory> shared_url_loader_factory_; + scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory_; bool feedback_finish_called_; };
diff --git a/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc b/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc index a6579d6..0f5e7754 100644 --- a/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc +++ b/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc
@@ -10,6 +10,7 @@ #include <utility> #include "base/files/file_path.h" +#include "base/path_service.h" #include "base/sequenced_task_runner.h" #include "base/task_scheduler/post_task.h" #include "base/task_scheduler/task_traits.h" @@ -18,9 +19,7 @@ #include "content/public/test/test_utils.h" #include "net/base/net_errors.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_test_util.h" -#include "services/network/network_context.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" using content::BrowserThread; @@ -62,74 +61,22 @@ return file_path; } -class SharedURLLoaderFactory : public network::SharedURLLoaderFactory { - public: - explicit SharedURLLoaderFactory( - network::mojom::URLLoaderFactory* url_loader_factory) - : url_loader_factory_(url_loader_factory) {} - - // network::URLLoaderFactory implementation: - void CreateLoaderAndStart(network::mojom::URLLoaderRequest loader, - int32_t routing_id, - int32_t request_id, - uint32_t options, - const network::ResourceRequest& request, - network::mojom::URLLoaderClientPtr client, - const net::MutableNetworkTrafficAnnotationTag& - traffic_annotation) override { - url_loader_factory_->CreateLoaderAndStart( - std::move(loader), routing_id, request_id, options, std::move(request), - std::move(client), traffic_annotation); - } - - void Clone(network::mojom::URLLoaderFactoryRequest request) override { - NOTREACHED(); - } - - // network::SharedURLLoaderFactoryInfo implementation - std::unique_ptr<network::SharedURLLoaderFactoryInfo> Clone() override { - NOTREACHED(); - return nullptr; - } - - private: - friend class base::RefCounted<SharedURLLoaderFactory>; - ~SharedURLLoaderFactory() override = default; - - network::mojom::URLLoaderFactory* url_loader_factory_; -}; - } // namespace class TwoPhaseUploaderTest : public testing::Test { public: TwoPhaseUploaderTest() - : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), - url_request_context_(std::make_unique<net::TestURLRequestContext>()) { - network::mojom::NetworkContextPtr network_context; - network_context_ = std::make_unique<network::NetworkContext>( - nullptr, mojo::MakeRequest(&network_context), - url_request_context_.get()); - network::mojom::URLLoaderFactoryParamsPtr params = - network::mojom::URLLoaderFactoryParams::New(); - params->process_id = network::mojom::kBrowserProcessId; - params->is_corb_enabled = false; - network_context_->CreateURLLoaderFactory( - mojo::MakeRequest(&url_loader_factory_), std::move(params)); + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { shared_url_loader_factory_ = - base::MakeRefCounted<SharedURLLoaderFactory>(url_loader_factory_.get()); + base::MakeRefCounted<network::TestSharedURLLoaderFactory>(); } protected: content::TestBrowserThreadBundle thread_bundle_; - - std::unique_ptr<net::TestURLRequestContext> url_request_context_; const scoped_refptr<base::SequencedTaskRunner> task_runner_ = base::CreateSequencedTaskRunnerWithTraits( {base::MayBlock(), base::TaskPriority::BACKGROUND}); - std::unique_ptr<network::NetworkContext> network_context_; - network::mojom::URLLoaderFactoryPtr url_loader_factory_; - scoped_refptr<SharedURLLoaderFactory> shared_url_loader_factory_; + scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory_; }; TEST_F(TwoPhaseUploaderTest, UploadFile) {
diff --git a/chrome/browser/ssl/cert_logger.proto b/chrome/browser/ssl/cert_logger.proto index 7f99dc6..ece0663c 100644 --- a/chrome/browser/ssl/cert_logger.proto +++ b/chrome/browser/ssl/cert_logger.proto
@@ -186,7 +186,7 @@ // Contains the results of verification by the trial verifier. All fields // have the same meaning as those of the same name in CertLoggerRequest. message TrialVerificationInfo { - required string cert_chain = 1; + optional string cert_chain = 1; repeated string public_key_hash = 2;
diff --git a/chrome/browser/ssl/certificate_error_report_unittest.cc b/chrome/browser/ssl/certificate_error_report_unittest.cc index 3e79efa..8e7bd5ba 100644 --- a/chrome/browser/ssl/certificate_error_report_unittest.cc +++ b/chrome/browser/ssl/certificate_error_report_unittest.cc
@@ -13,6 +13,7 @@ #include "base/files/file_util.h" #include "base/message_loop/message_loop.h" #include "base/path_service.h" +#include "base/test/scoped_task_environment.h" #include "base/threading/thread.h" #include "base/time/default_clock.h" #include "base/time/default_tick_clock.h" @@ -25,7 +26,7 @@ #include "net/ssl/ssl_info.h" #include "net/test/cert_test_util.h" #include "net/test/test_data_directory.h" -#include "net/url_request/url_request_test_util.h" +#include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -207,22 +208,23 @@ // Tests that information about network time querying is included in the // report. TEST(ErrorReportTest, NetworkTimeQueryingFeatureInfo) { - base::Thread io_thread("IO thread"); - base::Thread::Options thread_options; - thread_options.message_loop_type = base::MessageLoop::TYPE_IO; - EXPECT_TRUE(io_thread.StartWithOptions(thread_options)); + base::test::ScopedTaskEnvironment task_environment( + base::test::ScopedTaskEnvironment::MainThreadType::IO); std::unique_ptr<network_time::FieldTrialTest> field_trial_test( new network_time::FieldTrialTest()); field_trial_test->SetNetworkQueriesWithVariationsService( true, 0.0, network_time::NetworkTimeTracker::FETCHES_ON_DEMAND_ONLY); + scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory = + base::MakeRefCounted<network::TestSharedURLLoaderFactory>(); + TestingPrefServiceSimple pref_service; network_time::NetworkTimeTracker::RegisterPrefs(pref_service.registry()); network_time::NetworkTimeTracker network_time_tracker( std::make_unique<base::DefaultClock>(), std::make_unique<base::DefaultTickClock>(), &pref_service, - new net::TestURLRequestContextGetter(io_thread.task_runner())); + shared_url_loader_factory); // Serialize a report containing information about the network time querying // feature.
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc index e8abccb..a6e4909c 100644 --- a/chrome/browser/ssl/ssl_browsertest.cc +++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -147,6 +147,7 @@ #include "net/ssl/client_cert_store.h" #include "net/ssl/ssl_info.h" #include "net/test/cert_test_util.h" +#include "net/test/embedded_test_server/controllable_http_response.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" @@ -4710,160 +4711,6 @@ clock_interstitial_ssl_status, after_interstitial_ssl_status)); } -// A URLRequestJob that serves valid time server responses, but delays -// them until Resume() is called. If Resume() is called before a request -// is made, then the request will not be delayed. -class DelayableNetworkTimeURLRequestJob : public net::URLRequestJob { - public: - DelayableNetworkTimeURLRequestJob(net::URLRequest* request, - net::NetworkDelegate* network_delegate, - bool delayed) - : net::URLRequestJob(request, network_delegate), - delayed_(delayed), - weak_factory_(this) {} - - ~DelayableNetworkTimeURLRequestJob() override {} - - base::WeakPtr<DelayableNetworkTimeURLRequestJob> GetWeakPtr() { - return weak_factory_.GetWeakPtr(); - } - - // URLRequestJob: - void Start() override { - started_ = true; - if (delayed_) { - // Do nothing until Resume() is called. - return; - } - Resume(); - } - - int ReadRawData(net::IOBuffer* buf, int buf_size) override { - int bytes_read = - std::min(static_cast<size_t>(buf_size), - strlen(network_time::kGoodTimeResponseBody[0]) - data_offset_); - memcpy(buf->data(), network_time::kGoodTimeResponseBody[0] + data_offset_, - bytes_read); - data_offset_ += bytes_read; - return bytes_read; - } - - void GetResponseInfo(net::HttpResponseInfo* info) override { - std::string headers; - headers.append( - "HTTP/1.1 200 OK\n" - "Content-type: text/plain\n"); - headers.append(base::StringPrintf( - "Content-Length: %1d\n", - static_cast<int>(strlen(network_time::kGoodTimeResponseBody[0])))); - info->headers = - new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( - headers.c_str(), static_cast<int>(headers.length()))); - info->headers->AddHeader( - "x-cup-server-proof: " + - std::string(network_time::kGoodTimeResponseServerProofHeader[0])); - } - - // Resumes a previously started request that was delayed. If no - // request has been started yet, then when Start() is called it will - // not delay. - void Resume() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - DCHECK(delayed_); - if (!started_) { - // If Start() hasn't been called yet, then unset |delayed_| so - // that when Start() is called, the request will begin - // immediately. - delayed_ = false; - return; - } - - // Start reading asynchronously as would a normal network request. - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce( - &DelayableNetworkTimeURLRequestJob::NotifyHeadersComplete, - weak_factory_.GetWeakPtr())); - } - - private: - bool delayed_; - bool started_ = false; - int data_offset_ = 0; - base::WeakPtrFactory<DelayableNetworkTimeURLRequestJob> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(DelayableNetworkTimeURLRequestJob); -}; - -// A URLRequestInterceptor that intercepts requests to use -// DelayableNetworkTimeURLRequestJobs. Expects to intercept only a -// single request in its lifetime. -class DelayedNetworkTimeInterceptor : public net::URLRequestInterceptor { - public: - DelayedNetworkTimeInterceptor() {} - ~DelayedNetworkTimeInterceptor() override {} - - // Intercepts |request| to use a DelayableNetworkTimeURLRequestJob. If - // Resume() has been called before MaybeInterceptRequest(), then the - // request will not be delayed. - net::URLRequestJob* MaybeInterceptRequest( - net::URLRequest* request, - net::NetworkDelegate* network_delegate) const override { - // Only support one intercepted request. - EXPECT_FALSE(intercepted_request_); - intercepted_request_ = true; - // If the request has been resumed before this request is created, - // then |should_delay_requests_| will be false and the request will - // not delay. - DelayableNetworkTimeURLRequestJob* job = - new DelayableNetworkTimeURLRequestJob(request, network_delegate, - should_delay_requests_); - if (should_delay_requests_) - delayed_request_ = job->GetWeakPtr(); - return job; - } - - void Resume() { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - if (!should_delay_requests_) - return; - should_delay_requests_ = false; - if (delayed_request_) - delayed_request_->Resume(); - } - - private: - // True if a request has been intercepted. Used to enforce that only - // one request is intercepted in this object's lifetime. - mutable bool intercepted_request_ = false; - // True until Resume() is called. If Resume() is called before a - // request is intercepted, then a request that is intercepted later - // will continue without a delay. - bool should_delay_requests_ = true; - // Use a WeakPtr in case the request is cancelled before Resume() is called. - mutable base::WeakPtr<DelayableNetworkTimeURLRequestJob> delayed_request_ = - nullptr; - - DISALLOW_COPY_AND_ASSIGN(DelayedNetworkTimeInterceptor); -}; - -// IO-thread helper methods for SSLNetworkTimeBrowserTest. - -void ResumeDelayedNetworkTimeRequest( - DelayedNetworkTimeInterceptor* interceptor) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - interceptor->Resume(); -} - -void SetUpNetworkTimeInterceptorOnIOThread( - DelayedNetworkTimeInterceptor* interceptor, - const GURL& time_server_url) { - DCHECK_CURRENTLY_ON(content::BrowserThread::IO); - net::URLRequestFilter::GetInstance()->AddHostnameInterceptor( - time_server_url.scheme(), time_server_url.host(), - std::unique_ptr<DelayedNetworkTimeInterceptor>(interceptor)); -} - void CleanUpOnIOThread() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); net::URLRequestFilter::GetInstance()->ClearHandlers(); @@ -4876,7 +4723,7 @@ // request to be issued during the test. class SSLNetworkTimeBrowserTest : public SSLUITest { public: - SSLNetworkTimeBrowserTest() : SSLUITest(), interceptor_(nullptr) {} + SSLNetworkTimeBrowserTest() : SSLUITest() {} ~SSLNetworkTimeBrowserTest() override {} void SetUpCommandLine(base::CommandLine* command_line) override { @@ -4896,31 +4743,27 @@ parameters["FetchBehavior"] = "on-demand-only"; scoped_feature_list_.InitAndEnableFeatureWithParameters( network_time::kNetworkTimeServiceQuerying, parameters); - SetUpNetworkTimeServer(); - } - - void TearDownOnMainThread() override { - content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, - base::BindOnce(&CleanUpOnIOThread)); + controllable_response_ = + std::make_unique<net::test_server::ControllableHttpResponse>( + embedded_test_server(), "/", true); + ASSERT_TRUE(embedded_test_server()->Start()); + g_browser_process->network_time_tracker()->SetTimeServerURLForTesting( + embedded_test_server()->GetURL("/")); } protected: - void SetUpNetworkTimeServer() { - // Install the URL interceptor that serves delayed network time responses. - interceptor_ = new DelayedNetworkTimeInterceptor(); - content::BrowserThread::PostTask( - content::BrowserThread::IO, FROM_HERE, - base::BindOnce(&SetUpNetworkTimeInterceptorOnIOThread, - base::Unretained(interceptor_), - g_browser_process->network_time_tracker() - ->GetTimeServerURLForTesting())); - } - void TriggerTimeResponse() { - content::BrowserThread::PostTask( - content::BrowserThread::IO, FROM_HERE, - base::BindOnce(&ResumeDelayedNetworkTimeRequest, - base::Unretained(interceptor_))); + std::string response = "HTTP/1.1 200 OK\nContent-type: text/plain\n"; + response += base::StringPrintf( + "Content-Length: %1d\n", + static_cast<int>(strlen(network_time::kGoodTimeResponseBody[0]))); + response += + "x-cup-server-proof: " + + std::string(network_time::kGoodTimeResponseServerProofHeader[0]); + response += "\n\n"; + response += std::string(network_time::kGoodTimeResponseBody[0]); + controllable_response_->WaitForRequest(); + controllable_response_->Send(response); } // Asserts that the first time request to the server is currently pending. @@ -4934,7 +4777,8 @@ private: base::test::ScopedFeatureList scoped_feature_list_; - DelayedNetworkTimeInterceptor* interceptor_; + std::unique_ptr<net::test_server::ControllableHttpResponse> + controllable_response_; DISALLOW_COPY_AND_ASSIGN(SSLNetworkTimeBrowserTest); };
diff --git a/chrome/browser/ssl/ssl_error_handler_unittest.cc b/chrome/browser/ssl/ssl_error_handler_unittest.cc index e2671f5..0f73efa4 100644 --- a/chrome/browser/ssl/ssl_error_handler_unittest.cc +++ b/chrome/browser/ssl/ssl_error_handler_unittest.cc
@@ -41,6 +41,7 @@ #include "net/test/test_certificate_data.h" #include "net/test/test_data_directory.h" #include "net/url_request/url_request_test_util.h" +#include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -610,13 +611,23 @@ field_trial_test()->SetNetworkQueriesWithVariationsService( false, 0.0, network_time::NetworkTimeTracker::FETCHES_IN_BACKGROUND_ONLY); + + base::RunLoop run_loop; + std::unique_ptr<network::SharedURLLoaderFactoryInfo> + url_loader_factory_info; + content::BrowserThread::PostTaskAndReply( + content::BrowserThread::IO, FROM_HERE, + base::BindOnce(CreateURLLoaderFactory, &url_loader_factory_info), + run_loop.QuitClosure()); + run_loop.Run(); + + shared_url_loader_factory_ = network::SharedURLLoaderFactory::Create( + std::move(url_loader_factory_info)); + tracker_.reset(new network_time::NetworkTimeTracker( std::unique_ptr<base::Clock>(clock_), std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, - new net::TestURLRequestContextGetter( - content::BrowserThread::GetTaskRunnerForThread( - content::BrowserThread::IO)))); - + shared_url_loader_factory_)); // Do this to be sure that |is_null| returns false. clock_->Advance(base::TimeDelta::FromDays(111)); tick_clock_->Advance(base::TimeDelta::FromDays(222)); @@ -642,6 +653,10 @@ } void TearDown() override { + // Release the reference on TestSharedURLLoaderFactory before the test + // thread bundle flushes the IO thread so that it's destructed. + shared_url_loader_factory_ = nullptr; + if (error_handler()) { EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); error_handler_.reset(nullptr); @@ -671,6 +686,15 @@ void ClearErrorHandler() { error_handler_.reset(nullptr); } private: + static void CreateURLLoaderFactory( + std::unique_ptr<network::SharedURLLoaderFactoryInfo>* + url_loader_factory_info) { + scoped_refptr<network::TestSharedURLLoaderFactory> factory = + base::MakeRefCounted<network::TestSharedURLLoaderFactory>(); + // Holds a reference to |factory|. + *url_loader_factory_info = factory->Clone(); + } + net::SSLInfo ssl_info_; std::unique_ptr<TestSSLErrorHandler> error_handler_; TestSSLErrorHandlerDelegate* delegate_; @@ -679,6 +703,7 @@ base::SimpleTestClock* clock_; base::SimpleTestTickClock* tick_clock_; TestingPrefServiceSimple pref_service_; + scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_; std::unique_ptr<network_time::NetworkTimeTracker> tracker_; std::unique_ptr<net::EmbeddedTestServer> test_server_;
diff --git a/chrome/browser/sync/glue/synced_tab_delegate_android.cc b/chrome/browser/sync/glue/synced_tab_delegate_android.cc index e509c80..aab6d56b 100644 --- a/chrome/browser/sync/glue/synced_tab_delegate_android.cc +++ b/chrome/browser/sync/glue/synced_tab_delegate_android.cc
@@ -8,7 +8,6 @@ #include "chrome/browser/android/tab_android.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/glue/synced_window_delegates_getter_android.h" -#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" #include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" #include "components/sync_sessions/synced_window_delegate.h" #include "content/public/browser/navigation_entry.h" @@ -17,8 +16,24 @@ using content::NavigationEntry; namespace browser_sync { +namespace { + +SessionID SessionIdFromAndroidId(int android_tab_id) { + // Increment with 1 since SessionID considers zero as invalid value, whereas + // Android IDs start at 0. + // TODO(crbug.com/853731): Returning SessionID instances that haven't been + // generated with SessionID::NewUnique() is problematic or at least hard to + // reason about, due to possible conflicts in case they were put together or + // compared with regular SessionID instances. We should either migrate this + // whole class hierarchy away from type SessionID, or alternative unify the ID + // generation between Android and SessionIDs. + return SessionID::FromSerializedValue(1 + android_tab_id); +} + +} // namespace + SyncedTabDelegateAndroid::SyncedTabDelegateAndroid(TabAndroid* tab_android) - : tab_android_(tab_android) {} + : tab_android_(tab_android), source_tab_id_(SessionID::InvalidValue()) {} SyncedTabDelegateAndroid::~SyncedTabDelegateAndroid() {} @@ -27,31 +42,23 @@ } SessionID SyncedTabDelegateAndroid::GetSessionId() const { - return tab_android_->session_id(); + return SessionIdFromAndroidId(tab_android_->GetAndroidId()); +} + +SessionID SyncedTabDelegateAndroid::GetSourceTabID() const { + return source_tab_id_; } bool SyncedTabDelegateAndroid::IsPlaceholderTab() const { return web_contents() == nullptr; } -int SyncedTabDelegateAndroid::GetSyncId() const { - return tab_android_->GetSyncId(); -} - -void SyncedTabDelegateAndroid::SetSyncId(int sync_id) { - tab_android_->SetSyncId(sync_id); -} - void SyncedTabDelegateAndroid::SetWebContents( content::WebContents* web_contents, - content::WebContents* source_web_contents) { + int source_tab_android_id) { TabContentsSyncedTabDelegate::SetWebContents(web_contents); - if (source_web_contents) { - sync_sessions::SyncSessionsRouterTabHelper::FromWebContents( - source_web_contents) - ->SetSourceTabIdForChild(web_contents); - } + source_tab_id_ = SessionIdFromAndroidId(source_tab_android_id); } void SyncedTabDelegateAndroid::ResetWebContents() {
diff --git a/chrome/browser/sync/glue/synced_tab_delegate_android.h b/chrome/browser/sync/glue/synced_tab_delegate_android.h index 87ae98d..c4608ab 100644 --- a/chrome/browser/sync/glue/synced_tab_delegate_android.h +++ b/chrome/browser/sync/glue/synced_tab_delegate_android.h
@@ -32,18 +32,18 @@ // SyncedTabDelegate: SessionID GetWindowId() const override; SessionID GetSessionId() const override; + SessionID GetSourceTabID() const override; bool IsPlaceholderTab() const override; - int GetSyncId() const override; - void SetSyncId(int sync_id) override; // Set the web contents for this tab and handles source tab ID initialization. - void SetWebContents(content::WebContents* web_contents, - content::WebContents* source_web_contents); + void SetWebContents(content::WebContents* web_contents, int source_tab_id); + // Set web contents to null. void ResetWebContents(); private: TabAndroid* tab_android_; + SessionID source_tab_id_; DISALLOW_COPY_AND_ASSIGN(SyncedTabDelegateAndroid); };
diff --git a/chrome/browser/ui/ash/ash_shell_init.cc b/chrome/browser/ui/ash/ash_shell_init.cc index a46df9f..629ce36 100644 --- a/chrome/browser/ui/ash/ash_shell_init.cc +++ b/chrome/browser/ui/ash/ash_shell_init.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "ash/content/content_gpu_support.h" +#include "ash/content/content_gpu_interface_provider.h" #include "ash/display/display_prefs.h" #include "ash/shell.h" #include "ash/shell_init_params.h" @@ -26,7 +26,8 @@ shell_init_params.context_factory = content::GetContextFactory(); shell_init_params.context_factory_private = content::GetContextFactoryPrivate(); - shell_init_params.gpu_support = std::make_unique<ash::ContentGpuSupport>(); + shell_init_params.gpu_interface_provider = + std::make_unique<ash::ContentGpuInterfaceProvider>(); // Pass the initial display prefs to ash::Shell as a Value dictionary. // This is done this way to avoid complexities with registering the display // prefs in multiple places (i.e. in g_browser_process->local_state() and
diff --git a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc index 49414cd..a54d2df 100644 --- a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc +++ b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
@@ -22,6 +22,7 @@ #include "base/metrics/user_metrics.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/syslog_logging.h" #include "base/task_scheduler/post_task.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" @@ -539,6 +540,10 @@ return; } +#if defined(OS_CHROMEOS) + SYSLOG(INFO) << "Screenshot taken"; +#endif + if (drive::util::IsUnderDriveMountPoint(screenshot_path)) { drive::FileSystemInterface* file_system = drive::util::GetFileSystemByProfile(GetProfile());
diff --git a/chrome/browser/ui/ash/login_screen_client.cc b/chrome/browser/ui/ash/login_screen_client.cc index 158cfc3..2e5f225 100644 --- a/chrome/browser/ui/ash/login_screen_client.cc +++ b/chrome/browser/ui/ash/login_screen_client.cc
@@ -151,6 +151,11 @@ chromeos::LoginDisplayHost::default_host()->ShowFeedback(); } +void LoginScreenClient::LaunchKioskApp(const std::string& app_id) { + chromeos::LoginDisplayHost::default_host()->StartAppLaunch(app_id, false, + false); +} + void LoginScreenClient::LoadWallpaper(const AccountId& account_id) { WallpaperControllerClient::Get()->ShowUserWallpaper(account_id); }
diff --git a/chrome/browser/ui/ash/login_screen_client.h b/chrome/browser/ui/ash/login_screen_client.h index d2905c3..8460724c 100644 --- a/chrome/browser/ui/ash/login_screen_client.h +++ b/chrome/browser/ui/ash/login_screen_client.h
@@ -83,6 +83,7 @@ void RequestPublicSessionKeyboardLayouts(const AccountId& account_id, const std::string& locale) override; void ShowFeedback() override; + void LaunchKioskApp(const std::string& app_id) override; private: void SetPublicSessionKeyboardLayout(
diff --git a/chrome/browser/ui/sync/browser_synced_tab_delegate.cc b/chrome/browser/ui/sync/browser_synced_tab_delegate.cc index d255510..4398eba 100644 --- a/chrome/browser/ui/sync/browser_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/browser_synced_tab_delegate.cc
@@ -5,13 +5,12 @@ #include "chrome/browser/ui/sync/browser_synced_tab_delegate.h" #include "chrome/browser/sessions/session_tab_helper.h" -#include "components/sync_sessions/tab_node_pool.h" +#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" DEFINE_WEB_CONTENTS_USER_DATA_KEY(BrowserSyncedTabDelegate); BrowserSyncedTabDelegate::BrowserSyncedTabDelegate( - content::WebContents* web_contents) - : sync_id_(sync_sessions::TabNodePool::kInvalidTabNodeID) { + content::WebContents* web_contents) { SetWebContents(web_contents); } @@ -25,14 +24,13 @@ return SessionTabHelper::FromWebContents(web_contents())->session_id(); } +SessionID BrowserSyncedTabDelegate::GetSourceTabID() const { + const sync_sessions::SyncSessionsRouterTabHelper* helper = + sync_sessions::SyncSessionsRouterTabHelper::FromWebContents( + web_contents()); + return helper->source_tab_id(); +} + bool BrowserSyncedTabDelegate::IsPlaceholderTab() const { return false; } - -int BrowserSyncedTabDelegate::GetSyncId() const { - return sync_id_; -} - -void BrowserSyncedTabDelegate::SetSyncId(int sync_id) { - sync_id_ = sync_id; -}
diff --git a/chrome/browser/ui/sync/browser_synced_tab_delegate.h b/chrome/browser/ui/sync/browser_synced_tab_delegate.h index de405ab..68b9557 100644 --- a/chrome/browser/ui/sync/browser_synced_tab_delegate.h +++ b/chrome/browser/ui/sync/browser_synced_tab_delegate.h
@@ -14,8 +14,8 @@ class WebContents; } -// A BrowserSyncedTabDelegate is the Browser-based implementation of -// SyncedTabDelegate. +// A BrowserSyncedTabDelegate is the desktop implementation for +// SyncedTabDelegate, which essentially reads session IDs from SessionTabHelper. class BrowserSyncedTabDelegate : public TabContentsSyncedTabDelegate, public content::WebContentsUserData<BrowserSyncedTabDelegate> { @@ -25,16 +25,13 @@ // SyncedTabDelegate: SessionID GetWindowId() const override; SessionID GetSessionId() const override; + SessionID GetSourceTabID() const override; bool IsPlaceholderTab() const override; - int GetSyncId() const override; - void SetSyncId(int sync_id) override; private: explicit BrowserSyncedTabDelegate(content::WebContents* web_contents); friend class content::WebContentsUserData<BrowserSyncedTabDelegate>; - int sync_id_; - DISALLOW_COPY_AND_ASSIGN(BrowserSyncedTabDelegate); };
diff --git a/chrome/browser/ui/sync/browser_synced_window_delegate.h b/chrome/browser/ui/sync/browser_synced_window_delegate.h index ad68a11..6079af2 100644 --- a/chrome/browser/ui/sync/browser_synced_window_delegate.h +++ b/chrome/browser/ui/sync/browser_synced_window_delegate.h
@@ -16,8 +16,9 @@ class SyncedTabDelegate; } -// A BrowserSyncedWindowDelegate is the Browser-based implementation of -// SyncedWindowDelegate. +// A BrowserSyncedWindowDelegate is the desktop implementation for +// SyncedWindowDelegate, representing the window corresponding to |browser|, +// and listing all its tabs. class BrowserSyncedWindowDelegate : public sync_sessions::SyncedWindowDelegate { public: explicit BrowserSyncedWindowDelegate(Browser* browser);
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc index fa85ae1..db465d9d 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -6,7 +6,6 @@ #include "base/memory/ref_counted.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" #include "chrome/common/buildflags.h" #include "components/sessions/content/content_serialized_navigation_builder.h" #include "components/sync_sessions/sync_sessions_client.h" @@ -153,13 +152,6 @@ return false; } -SessionID TabContentsSyncedTabDelegate::GetSourceTabID() const { - sync_sessions::SyncSessionsRouterTabHelper* helper = - sync_sessions::SyncSessionsRouterTabHelper::FromWebContents( - web_contents_); - return helper->source_tab_id(); -} - const content::WebContents* TabContentsSyncedTabDelegate::web_contents() const { return web_contents_; }
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h index cca955d..a04482c 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h
@@ -40,7 +40,6 @@ const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>* GetBlockedNavigations() const override; bool ShouldSync(sync_sessions::SyncSessionsClient* sessions_client) override; - SessionID GetSourceTabID() const override; protected: const content::WebContents* web_contents() const;
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc index 31a6f39..1d9f20a 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc
@@ -20,9 +20,10 @@ SessionID GetWindowId() const override { return SessionID::InvalidValue(); } SessionID GetSessionId() const override { return SessionID::InvalidValue(); } + SessionID GetSourceTabID() const override { + return SessionID::InvalidValue(); + } bool IsPlaceholderTab() const override { return false; } - int GetSyncId() const override { return -1; } - void SetSyncId(int sync_id) override {} }; class TabContentsSyncedTabDelegateTest
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index 11450ead..7a33391a 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -173,7 +173,7 @@ params.context = parent_widget->GetNativeWindow(); if (LocationBarView::IsRounded()) - RoundedOmniboxResultsFrame::OnBeforeWidgetInit(¶ms); + RoundedOmniboxResultsFrame::OnBeforeWidgetInit(¶ms, this); else animator_ = std::make_unique<WidgetShrinkAnimation>(this, bounds); @@ -519,10 +519,12 @@ if (LocationBarView::IsRounded()) { // The rounded popup is always offset the same amount from the omnibox. gfx::Rect content_rect = location_bar_view_->GetBoundsInScreen(); - gfx::Insets popup_insets = - -RoundedOmniboxResultsFrame::GetLocationBarAlignmentInsets(); - content_rect.Inset(popup_insets); + content_rect.Inset( + -RoundedOmniboxResultsFrame::GetLocationBarAlignmentInsets()); content_rect.set_height(CalculatePopupHeight()); + + // Finally, expand the widget to accomodate the custom-drawn shadows. + content_rect.Inset(-RoundedOmniboxResultsFrame::GetShadowInsets()); return content_rect; }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc index 53b1f938..96bab85 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
@@ -176,6 +176,7 @@ gfx::Rect alignment_rect = location_bar()->GetBoundsInScreen(); alignment_rect.Inset( -RoundedOmniboxResultsFrame::GetLocationBarAlignmentInsets()); + alignment_rect.Inset(-RoundedOmniboxResultsFrame::GetShadowInsets()); // Top, left and right should align. Bottom depends on the results. gfx::Rect popup_rect = popup->GetRestoredBounds(); EXPECT_EQ(popup_rect.y(), alignment_rect.y());
diff --git a/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.cc b/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.cc index 6a9ad072..7eec1cf9 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.cc
@@ -17,6 +17,7 @@ #include "ui/gfx/color_palette.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/paint_vector_icon.h" +#include "ui/views/animation/ink_drop_mask.h" bool OmniboxTabSwitchButton::calculated_widths_ = false; size_t OmniboxTabSwitchButton::icon_only_width_; @@ -75,6 +76,12 @@ focus_ring()->SetPath(GetFocusRingPath()); } +std::unique_ptr<views::InkDropMask> OmniboxTabSwitchButton::CreateInkDropMask() + const { + return std::make_unique<views::RoundRectInkDropMask>( + size(), gfx::Insets(), CalculatePreferredSize().height() / 2.f); +} + void OmniboxTabSwitchButton::AnimationProgressed( const gfx::Animation* animation) { if (animation != animation_.get()) { @@ -159,9 +166,10 @@ } void OmniboxTabSwitchButton::SetPressed() { - SetBgColorOverride(GetOmniboxColor(OmniboxPart::RESULTS_BACKGROUND, - result_view_->GetTint(), - OmniboxPartState::NORMAL)); + SetBgColorOverride(color_utils::AlphaBlend( + GetOmniboxColor(OmniboxPart::RESULTS_BACKGROUND, result_view_->GetTint(), + OmniboxPartState::SELECTED), + SK_ColorBLACK, 0.8 * 255)); } size_t OmniboxTabSwitchButton::CalculateGoalWidth(size_t parent_width,
diff --git a/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.h b/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.h index 6b6517fb..35214de6 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.h +++ b/chrome/browser/ui/views/omnibox/omnibox_tab_switch_button.h
@@ -25,6 +25,9 @@ gfx::Size CalculatePreferredSize() const override; void OnBoundsChanged(const gfx::Rect& previous_bounds) override; + // views::InkDropHostView + std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override; + // views::Button void AnimationProgressed(const gfx::Animation* animation) override; void StateChanged(ButtonState old_state) override;
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc index 25c4725..8aa68f6 100644 --- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc +++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.cc
@@ -11,6 +11,8 @@ #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "ui/base/material_design/material_design_controller.h" #include "ui/compositor/layer.h" +#include "ui/gfx/color_palette.h" +#include "ui/views/bubble/bubble_border.h" #include "ui/views/painter.h" #if defined(USE_AURA) @@ -18,6 +20,10 @@ #include "ui/aura/window_targeter.h" #endif +#if defined(OS_WIN) +#include "ui/views/widget/native_widget_aura.h" +#endif + namespace { // Value from the spec controlling appearance of the shadow. @@ -61,9 +67,10 @@ // selection highlights. // TODO(tapted): Remove this and have the contents paint a half-rounded rect // for the background, and when selecting the bottom row. + int corner_radius = GetLayoutConstant(LOCATION_BAR_BUBBLE_CORNER_RADIUS); contents_mask_ = views::Painter::CreatePaintedLayer( - views::Painter::CreateSolidRoundRectPainter( - SK_ColorBLACK, GetLayoutConstant(LOCATION_BAR_BUBBLE_CORNER_RADIUS))); + views::Painter::CreateSolidRoundRectPainter(SK_ColorBLACK, + corner_radius)); contents_mask_->layer()->SetFillsBoundsOpaquely(false); contents_host_->layer()->SetMaskLayer(contents_mask_->layer()); @@ -71,6 +78,14 @@ contents_host_->AddChildView(top_background_); contents_host_->AddChildView(contents_); + // Initialize the shadow. + auto border = std::make_unique<views::BubbleBorder>( + views::BubbleBorder::Arrow::NONE, views::BubbleBorder::Shadow::BIG_SHADOW, + gfx::kPlaceholderColor); + border->SetCornerRadius(corner_radius); + border->set_md_shadow_elevation(kElevation); + SetBorder(std::move(border)); + AddChildView(contents_host_); } @@ -78,11 +93,23 @@ // static void RoundedOmniboxResultsFrame::OnBeforeWidgetInit( - views::Widget::InitParams* params) { - params->shadow_type = views::Widget::InitParams::SHADOW_TYPE_DROP; - params->corner_radius = GetLayoutConstant(LOCATION_BAR_BUBBLE_CORNER_RADIUS); - params->shadow_elevation = kElevation; + views::Widget::InitParams* params, + views::Widget* widget) { +#if defined(OS_WIN) + // On Windows, use an Aura window instead of a native window, because the + // native window does not support clicking through translucent shadows to the + // underyling content. Linux and ChromeOS do not need this because they + // already use Aura for the suggestions dropdown. + // + // TODO(sdy): Mac does not support Aura at the moment, and needs a different + // platform-specific solution. + params->native_widget = new views::NativeWidgetAura(widget); +#endif params->name = "RoundedOmniboxResultsFrameWindow"; + + // Since we are drawing the shadow in Views via the BubbleBorder, we never + // want our widget to have its own window-manager drawn shadow. + params->shadow_type = views::Widget::InitParams::ShadowType::SHADOW_TYPE_NONE; } // static @@ -97,6 +124,11 @@ : gfx::Insets(4); } +// static +gfx::Insets RoundedOmniboxResultsFrame::GetShadowInsets() { + return views::BubbleBorder::GetBorderAndShadowInsets(kElevation); +} + const char* RoundedOmniboxResultsFrame::GetClassName() const { return "RoundedOmniboxResultsFrame"; } @@ -106,16 +138,16 @@ // the Widget is fast on ChromeOS, but slow on other platforms, and can't be // animated smoothly. // TODO(tapted): Investigate using a static Widget size. - const gfx::Rect bounds = GetLocalBounds(); + const gfx::Rect bounds = GetContentsBounds(); contents_host_->SetBoundsRect(bounds); contents_mask_->layer()->SetBounds(bounds); - gfx::Rect top_bounds(bounds); + gfx::Rect top_bounds(contents_host_->GetContentsBounds()); top_bounds.set_height(GetNonResultSectionHeight()); top_bounds.Inset(GetLocationBarAlignmentInsets()); top_background_->SetBoundsRect(top_bounds); - gfx::Rect results_bounds(bounds); + gfx::Rect results_bounds(contents_host_->GetContentsBounds()); results_bounds.Inset(GetContentInsets()); contents_->SetBoundsRect(results_bounds); } @@ -125,7 +157,7 @@ // Use a ui::EventTargeter that allows mouse and touch events in the top // portion of the Widget to pass through to the omnibox beneath it. auto results_targeter = std::make_unique<aura::WindowTargeter>(); - results_targeter->SetInsets(GetContentInsets()); + results_targeter->SetInsets(GetInsets() + GetContentInsets()); GetWidget()->GetNativeWindow()->SetEventTargeter(std::move(results_targeter)); #endif }
diff --git a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h index e5c2ffe0..f8e9fc4 100644 --- a/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h +++ b/chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h
@@ -20,7 +20,8 @@ ~RoundedOmniboxResultsFrame() override; // Hook to customize Widget initialization. - static void OnBeforeWidgetInit(views::Widget::InitParams* params); + static void OnBeforeWidgetInit(views::Widget::InitParams* params, + views::Widget* widget); // The height of the location bar view part of the omnibox popup. static int GetNonResultSectionHeight(); @@ -28,6 +29,9 @@ // How the Widget is aligned relative to the location bar. static gfx::Insets GetLocationBarAlignmentInsets(); + // Returns the blur region taken up by the Omnibox popup shadows. + static gfx::Insets GetShadowInsets(); + // views::View: const char* GetClassName() const override; void Layout() override;
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.cc b/chrome/browser/ui/views/tabs/new_tab_button.cc index 9b2631a..1bc6bad 100644 --- a/chrome/browser/ui/views/tabs/new_tab_button.cc +++ b/chrome/browser/ui/views/tabs/new_tab_button.cc
@@ -212,11 +212,18 @@ std::unique_ptr<views::InkDropRipple> NewTabButton::CreateInkDropRipple() const { return std::make_unique<views::FloodFillInkDropRipple>( - GetVisibleBounds().size(), gfx::Insets(), + GetContentsBounds().size(), gfx::Insets(), GetInkDropCenterBasedOnLastEvent(), GetInkDropBaseColor(), ink_drop_visible_opacity()); } +std::unique_ptr<views::InkDropHighlight> NewTabButton::CreateInkDropHighlight() + const { + const gfx::Rect bounds = GetContentsBounds(); + return CreateDefaultInkDropHighlight( + gfx::RectF(GetMirroredRect(bounds)).CenterPoint(), bounds.size()); +} + void NewTabButton::NotifyClick(const ui::Event& event) { ImageButton::NotifyClick(event); GetInkDrop()->AnimateToState(views::InkDropState::ACTION_TRIGGERED);
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.h b/chrome/browser/ui/views/tabs/new_tab_button.h index 1fd9bc5..835ae77 100644 --- a/chrome/browser/ui/views/tabs/new_tab_button.h +++ b/chrome/browser/ui/views/tabs/new_tab_button.h
@@ -71,6 +71,8 @@ void AddInkDropLayer(ui::Layer* ink_drop_layer) override; void RemoveInkDropLayer(ui::Layer* ink_drop_layer) override; std::unique_ptr<views::InkDropRipple> CreateInkDropRipple() const override; + std::unique_ptr<views::InkDropHighlight> CreateInkDropHighlight() + const override; void NotifyClick(const ui::Event& event) override; std::unique_ptr<views::InkDrop> CreateInkDrop() override; std::unique_ptr<views::InkDropMask> CreateInkDropMask() const override;
diff --git a/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc b/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc index f926306..b543b61 100644 --- a/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
@@ -10,6 +10,8 @@ #include "base/values.h" #include "chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h" +#include "chromeos/chromeos_switches.h" #include "components/arc/arc_service_manager.h" #include "ui/gfx/geometry/rect.h" @@ -35,6 +37,13 @@ base::BindRepeating( &GoogleAssistantHandler::HandleSetGoogleAssistantContextEnabled, base::Unretained(this))); + if (chromeos::switches::IsAssistantEnabled()) { + web_ui()->RegisterMessageCallback( + "setGoogleAssistantHotwordEnabled", + base::BindRepeating( + &GoogleAssistantHandler::HandleSetGoogleAssistantHotwordEnabled, + base::Unretained(this))); + } web_ui()->RegisterMessageCallback( "showGoogleAssistantSettings", base::BindRepeating( @@ -70,6 +79,17 @@ service->SetVoiceInteractionContextEnabled(enabled); } +void GoogleAssistantHandler::HandleSetGoogleAssistantHotwordEnabled( + const base::ListValue* args) { + CHECK(chromeos::switches::IsAssistantEnabled()); + + CHECK_EQ(1U, args->GetSize()); + bool enabled; + CHECK(args->GetBoolean(0, &enabled)); + + // TODO(b/110219351) Handle toggle hotword. +} + void GoogleAssistantHandler::HandleShowGoogleAssistantSettings( const base::ListValue* args) { auto* service = @@ -80,6 +100,12 @@ void GoogleAssistantHandler::HandleTurnOnGoogleAssistant( const base::ListValue* args) { + if (chromeos::switches::IsAssistantEnabled()) { + if (!chromeos::AssistantOptInDialog::IsActive()) + chromeos::AssistantOptInDialog::Show(); + return; + } + auto* service = arc::ArcVoiceInteractionFrameworkService::GetForBrowserContext(profile_); if (service)
diff --git a/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h b/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h index 8ae9aab..75bc27f4 100644 --- a/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h
@@ -27,6 +27,8 @@ void HandleSetGoogleAssistantEnabled(const base::ListValue* args); // WebUI call to enable context for the Google Assistant. void HandleSetGoogleAssistantContextEnabled(const base::ListValue* args); + // WebUI call to enable hotword detection for the Google Assistant. + void HandleSetGoogleAssistantHotwordEnabled(const base::ListValue* args); // WebUI call to launch into the Google Assistant app settings. void HandleShowGoogleAssistantSettings(const base::ListValue* args); // WebUI call to launch assistant runtime flow.
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index 322bd8d0..b54f502 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -2012,6 +2012,8 @@ html_source->AddString("searchExplanation", search_explanation_text); #if defined(OS_CHROMEOS) html_source->AddBoolean("enableVoiceInteraction", is_assistant_allowed); + html_source->AddBoolean("enableAssistant", + chromeos::switches::IsAssistantEnabled()); #endif } @@ -2052,6 +2054,10 @@ IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_CONTEXT}, {"googleAssistantEnableContextDescription", IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_CONTEXT_DESCRIPTION}, + {"googleAssistantEnableHotword", + IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD}, + {"googleAssistantEnableHotwordDescription", + IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION}, {"googleAssistantSettings", IDS_SETTINGS_GOOGLE_ASSISTANT_SETTINGS}, }; AddLocalizedStringsBulk(html_source, localized_strings,
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc index feb0e060..ff3197ef 100644 --- a/chrome/browser/ui/webui/settings/md_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -201,7 +201,8 @@ std::make_unique<chromeos::settings::CupsPrintersHandler>(web_ui)); AddSettingsPageUIHandler( std::make_unique<chromeos::settings::FingerprintHandler>(profile)); - if (chromeos::switches::IsVoiceInteractionEnabled()) { + if (chromeos::switches::IsVoiceInteractionEnabled() || + chromeos::switches::IsAssistantEnabled()) { AddSettingsPageUIHandler( std::make_unique<chromeos::settings::GoogleAssistantHandler>(profile)); }
diff --git a/chrome/browser/vr/testapp/vr_testapp.cc b/chrome/browser/vr/testapp/vr_testapp.cc index fc1d3e8..853e3d52 100644 --- a/chrome/browser/vr/testapp/vr_testapp.cc +++ b/chrome/browser/vr/testapp/vr_testapp.cc
@@ -105,7 +105,7 @@ ui::PlatformWindowInitProperties properties; properties.bounds = gfx::Rect(1024, 768); platform_window_ = ui::OzonePlatform::GetInstance()->CreatePlatformWindow( - this, properties); + this, std::move(properties)); platform_window_->Show(); // Supply an empty cursor to override and hide the default system pointer.
diff --git a/chrome/common/extensions/permissions/permissions_data_unittest.cc b/chrome/common/extensions/permissions/permissions_data_unittest.cc index 2bda228..c51fb487 100644 --- a/chrome/common/extensions/permissions/permissions_data_unittest.cc +++ b/chrome/common/extensions/permissions/permissions_data_unittest.cc
@@ -32,6 +32,7 @@ #include "extensions/common/value_builder.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +#include "url/origin.h" using base::UTF16ToUTF8; using content::SocketPermissionRequest; @@ -1059,4 +1060,195 @@ EXPECT_EQ(DISALLOWED, GetExtensionAccess(extension.get(), settings_url)); } +class CaptureVisiblePageTest : public testing::Test { + public: + CaptureVisiblePageTest() = default; + ~CaptureVisiblePageTest() override = default; + + bool CanCapture(const Extension& extension, const GURL& url) { + return extension.permissions_data()->CanCaptureVisiblePage( + url, kTabId, nullptr /*error*/); + } + + void GrantActiveTab(const GURL& url) { + APIPermissionSet tab_api_permissions; + tab_api_permissions.insert(APIPermission::kTab); + URLPatternSet tab_hosts; + tab_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), + url::Origin::Create(url).GetURL()); + PermissionSet tab_permissions(tab_api_permissions, ManifestPermissionSet(), + tab_hosts, tab_hosts); + active_tab_->permissions_data()->UpdateTabSpecificPermissions( + kTabId, tab_permissions); + } + + void ClearActiveTab() { + active_tab_->permissions_data()->ClearTabSpecificPermissions(kTabId); + } + + const Extension& all_urls() { return *all_urls_; } + + const Extension& active_tab() { return *active_tab_; } + + static constexpr int kTabId = 42; + + private: + void SetUp() override { + all_urls_ = ExtensionBuilder("all urls") + .AddPermission("<all_urls>") + .SetID(std::string(32, 'a')) + .Build(); + active_tab_ = ExtensionBuilder("active tab") + .AddPermission("activeTab") + .SetID(std::string(32, 'b')) + .Build(); + } + + void TearDown() override { + all_urls_ = nullptr; + active_tab_ = nullptr; + } + + scoped_refptr<const Extension> all_urls_; + scoped_refptr<const Extension> active_tab_; + + DISALLOW_COPY_AND_ASSIGN(CaptureVisiblePageTest); +}; + +TEST_F(CaptureVisiblePageTest, URLsCapturableWithEitherActiveTabOrAllURLs) { + const GURL test_urls[] = { + // Normal web page. + GURL("https://example.com"), + + // TODO(https://crbug.com/853064): IPv6 pages should behave like normal + // web pages. + // GURL("http://[2607:f8b0:4005:805::200e]"), + + // filesystem: urls with web origins should behave like normal web pages. + // TODO(https://crbug.com/853392): filesystem: URLs don't work with + // activeTab. + // GURL("filesystem:http://example.com/foo"), + + // blob: urls with web origins should behave like normal web pages. + // TODO(https://crbug.com/853392): blob: URLs don't work with activeTab. + // GURL("blob:http://example.com/bar"), + }; + + for (const GURL& url : test_urls) { + SCOPED_TRACE(url.spec()); + EXPECT_TRUE(CanCapture(all_urls(), url)); + + EXPECT_FALSE(CanCapture(active_tab(), url)); + GrantActiveTab(url); + EXPECT_TRUE(CanCapture(active_tab(), url)); + ClearActiveTab(); + EXPECT_FALSE(CanCapture(active_tab(), url)); + } +} + +TEST_F(CaptureVisiblePageTest, URLsCapturableOnlyWithActiveTab) { + // The following URLs are origins that extensions are able to capture only if + // they have activeTab granted. We require explicit user action for a higher + // bar, since normally these pages are completely restricted to extensions at + // all. + const GURL test_urls[] = { + // Another extension's URL. + GURL("chrome-extension://cccccccccccccccccccccccccccccccc/foo.html"), + + // filesystem: urls behave like the underlying origin. + // https://crbug.com/853392: filesystem: URLs don't work with activeTab. + // GURL("filesystem:chrome-extension://cccccccccccccccccccccccccccccccc/foo"), + + // blob: urls behave like the underlying origin. + // https://crbug.com/853392: blob: URLs don't work with activeTab. + // GURL("blob:chrome-extension://cccccccccccccccccccccccccccccccc/bar"), + + // data: urls have no associated origin, so are more restricted. + GURL("data:text/html;charset=utf-8,<html>Hello!</html>"), + + // A chrome:-scheme page. + GURL("chrome://settings"), + + // The NTP. + GURL("chrome://newtab"), + }; + + for (const GURL& url : test_urls) { + SCOPED_TRACE(url.spec()); + EXPECT_FALSE(CanCapture(all_urls(), url)); + + EXPECT_FALSE(CanCapture(active_tab(), url)); + GrantActiveTab(url); + EXPECT_TRUE(CanCapture(active_tab(), url)); + ClearActiveTab(); + EXPECT_FALSE(CanCapture(active_tab(), url)); + } +} + +TEST_F(CaptureVisiblePageTest, SelfExtensionURLs) { + auto get_filesystem_url_for_extension = [](const Extension& extension) { + return GURL(base::StringPrintf("filesystem:chrome-extension://%s/foo", + extension.id().c_str())); + }; + auto get_blob_url_for_extension = [](const Extension& extension) { + return GURL(base::StringPrintf("blob:chrome-extension://%s/foo", + extension.id().c_str())); + }; + + // Extensions should be allowed to capture their own pages with either + // activeTab or <all_urls>. We still require one of the two because there may + // be other web content within the extension page, so we can't auto-grant + // access. + + { + EXPECT_TRUE(CanCapture(all_urls(), all_urls().GetResourceURL("foo.html"))); + EXPECT_TRUE( + CanCapture(all_urls(), get_filesystem_url_for_extension(all_urls()))); + EXPECT_TRUE(CanCapture(all_urls(), get_blob_url_for_extension(all_urls()))); + } + + const GURL active_tab_extension_urls[] = { + active_tab().GetResourceURL("foo.html"), + // https://crbug.com/853392: filesystem: URLs don't work with activeTab. + // get_filesystem_url_for_extension(active_tab()), + // https://crbug.com/853392: blob: URLs don't work with activeTab. + // get_blob_url_for_extension(active_tab()), + }; + + for (const GURL& url : active_tab_extension_urls) { + SCOPED_TRACE(url); + + EXPECT_FALSE(CanCapture(active_tab(), url)); + GrantActiveTab(url); + EXPECT_TRUE(CanCapture(active_tab(), url)); + ClearActiveTab(); + EXPECT_FALSE(CanCapture(active_tab(), url)); + } +} + +TEST_F(CaptureVisiblePageTest, PolicyBlockedURLs) { + { + URLPattern example_com(URLPattern::SCHEME_ALL, "https://example.com/*"); + URLPattern chrome_settings(URLPattern::SCHEME_ALL, "chrome://settings/*"); + URLPatternSet blocked_patterns({example_com, chrome_settings}); + PermissionsData::SetDefaultPolicyHostRestrictions(blocked_patterns, + URLPatternSet()); + } + + const GURL test_urls[] = { + GURL("https://example.com"), GURL("chrome://settings/"), + }; + + for (const GURL& url : test_urls) { + SCOPED_TRACE(url); + EXPECT_FALSE(CanCapture(all_urls(), url)); + + EXPECT_FALSE(CanCapture(active_tab(), url)); + GrantActiveTab(url); + EXPECT_FALSE(CanCapture(active_tab(), url)); + ClearActiveTab(); + EXPECT_FALSE(CanCapture(active_tab(), url)); + } +} + } // namespace extensions
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc index 220ee41..833178e9 100644 --- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc +++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -365,7 +365,7 @@ void SetManualFallbacksStandalone() { scoped_feature_list_.InitAndEnableFeature( - password_manager::features::kEnableManualFallbacksFillingStandalone); + password_manager::features::kManualFallbacksFillingStandalone); } void EnableShowAutofillSignatures() {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index f2a22f3..8faf066 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -629,6 +629,7 @@ "../browser/net/predictor_browsertest.cc", "../browser/net/profile_network_context_service_browsertest.cc", "../browser/net/proxy_browsertest.cc", + "../browser/net/reporting_browsertest.cc", "../browser/net/variations_http_headers_browsertest.cc", "../browser/net/websocket_browsertest.cc", "../browser/no_background_tasks_browsertest.cc", @@ -696,6 +697,7 @@ "../browser/renderer_host/render_process_host_chrome_browsertest.cc", "../browser/repost_form_warning_browsertest.cc", "../browser/resource_coordinator/local_site_characteristics_data_store_factory_browsertest.cc", + "../browser/resource_coordinator/local_site_characteristics_database_browsertest.cc", "../browser/resource_coordinator/render_process_probe_browsertest.cc", "../browser/resource_coordinator/tab_activity_watcher_browsertest.cc", "../browser/resource_coordinator/tab_manager_browsertest.cc", @@ -2254,6 +2256,7 @@ "../browser/android/data_usage/tab_data_use_entry_unittest.cc", "../browser/android/digital_asset_links/digital_asset_links_handler_unittest.cc", "../browser/android/download/download_manager_service_unittest.cc", + "../browser/android/explore_sites/ntp_json_fetcher_unittest.cc", "../browser/android/history_report/data_observer_unittest.cc", "../browser/android/history_report/delta_file_backend_leveldb_unittest.cc", "../browser/android/history_report/delta_file_commons_unittest.cc", @@ -2722,7 +2725,6 @@ configs += [ "//build/config:precompiled_headers" ] data_deps = [ - "//testing/buildbot/filters:unit_tests_filters", "//chrome/test/data/media/engagement/preload:generate_preload_list", "//chrome/test/data/media/engagement/preload:test_data", ] @@ -4635,6 +4637,8 @@ "../browser/apps/app_window_interactive_uitest.h", "../browser/apps/guest_view/web_view_interactive_browsertest.cc", "../browser/autofill/autofill_interactive_uitest.cc", + "../browser/autofill/autofill_uitest.cc", + "../browser/autofill/autofill_uitest.h", "../browser/autofill/autofill_uitest_util.cc", "../browser/autofill/autofill_uitest_util.h", "../browser/browser_keyevents_browsertest.cc", @@ -5585,6 +5589,94 @@ assert_no_deps = [ "//chrome" ] } + # Tests autofill on captured websites + test("autofill_captured_sites_interactive_tests") { + sources = [ + "../browser/autofill/autofill_captured_sites_interactive_uitest.cc", + "../browser/autofill/autofill_uitest.cc", + "../browser/autofill/autofill_uitest.h", + "../browser/autofill/autofill_uitest_util.cc", + "../browser/autofill/autofill_uitest_util.h", + "base/interactive_test_utils.cc", + "base/interactive_test_utils.h", + "base/interactive_test_utils_common_views.cc", + "base/interactive_test_utils_mac.mm", + "base/interactive_test_utils_win.cc", + "base/interactive_ui_tests_main.cc", + ] + + if (use_aura) { + sources += [ + "base/interactive_test_utils_aura.cc", + "base/interactive_test_utils_aura.h", + ] + } + + if (is_win) { + sources += [ + "base/always_on_top_window_killer_win.cc", + "base/always_on_top_window_killer_win.h", + "base/save_desktop_snapshot_win.cc", + "base/save_desktop_snapshot_win.h", + ] + } + + configs += [ "//build/config:precompiled_headers" ] + + data = [ + "//chrome/test/data/autofill/captured_sites/", + ] + + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + + ldflags = [] + + deps = [ + ":test_support", + ":test_support_ui", + "//chrome:packed_resources", + "//chrome:resources", + "//chrome:strings", + "//chrome/browser", + "//chrome/browser/devtools", + "//chrome/renderer", + "//components/resources", + "//components/sync", + "//components/sync:test_support_model", + "//content/app/resources", + "//content/test:test_support", + "//crypto:platform", + "//crypto:test_support", + "//google_apis:test_support", + "//net", + "//net:net_resources", + "//net:test_support", + "//skia", + "//testing/gmock", + "//testing/gtest", + "//third_party/hunspell", + "//third_party/icu", + "//third_party/libpng", + "//third_party/zlib", + "//ui/base:test_support", + "//ui/resources:ui_test_pak", + "//ui/web_dialogs:test_support", + ] + + if (is_win) { + deps += [ + "//chrome:other_version", + "//third_party/webrtc/modules/desktop_capture", + "//third_party/wtl", + "//ui/resources", + ] + + configs -= [ "//build/config/win:default_incremental_linking" ] + configs += + [ "//build/config/win:default_large_module_incremental_linking" ] + } + } + group("telemetry_unittests") { testonly = true deps = [
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc index 7d964a1..5e839a41 100644 --- a/chrome/test/base/testing_browser_process.cc +++ b/chrome/test/base/testing_browser_process.cc
@@ -408,7 +408,7 @@ network_time_tracker_.reset(new network_time::NetworkTimeTracker( std::unique_ptr<base::Clock>(new base::DefaultClock()), std::unique_ptr<base::TickClock>(new base::DefaultTickClock()), - local_state_, system_request_context())); + local_state_, nullptr)); } return network_time_tracker_.get(); }
diff --git a/chrome/test/base/view_event_test_platform_part_chromeos.cc b/chrome/test/base/view_event_test_platform_part_chromeos.cc index c69d04c..56c8344 100644 --- a/chrome/test/base/view_event_test_platform_part_chromeos.cc +++ b/chrome/test/base/view_event_test_platform_part_chromeos.cc
@@ -7,7 +7,7 @@ #include <memory> #include <utility> -#include "ash/content/content_gpu_support.h" +#include "ash/content/content_gpu_interface_provider.h" #include "ash/session/test_session_controller_client.h" #include "ash/shell.h" #include "ash/shell_init_params.h" @@ -69,7 +69,8 @@ init_params.delegate = std::make_unique<ash::TestShellDelegate>(); init_params.context_factory = context_factory; init_params.context_factory_private = context_factory_private; - init_params.gpu_support = std::make_unique<ash::ContentGpuSupport>(); + init_params.gpu_interface_provider = + std::make_unique<ash::ContentGpuInterfaceProvider>(); base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( switches::kHostWindowBounds, "0+0-1280x800"); ash::Shell::CreateInstance(std::move(init_params));
diff --git a/chrome/test/data/autofill/captured_sites/amazon.sha1 b/chrome/test/data/autofill/captured_sites/amazon.sha1 new file mode 100644 index 0000000..a4166972 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/amazon.sha1
@@ -0,0 +1 @@ +61e535c75e11548909b662d8cea3ea450121ea74 \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/amazon.test b/chrome/test/data/autofill/captured_sites/amazon.test new file mode 100644 index 0000000..73247bb --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/amazon.test
@@ -0,0 +1,119 @@ +{ + "name": "Amazon.com: The Path to Power (The Years of Lyndon Johnson, Volume 1) (9780679729457): Robert A. Caro: Books", + "startingURL": "https://www.amazon.com/Path-Power-Years-Lyndon-Johnson/dp/0679729453/ref=sr_1_1?_encoding=UTF8&ref_=nav_ya_signin&", + "actions": [ + { + "selectorType": "xpath", + "selector": "//*[@id=\"add-to-cart-button\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"hlb-ptc-btn-native\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"enterAddressFullName\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"enterAddressFullName\"]", + "context": [], + "expectedAutofillType": "NAME_FULL", + "expectedValue": "Milton C. Waddams" + }, + { + "selector": "//*[@id=\"enterAddressAddressLine1\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE1", + "expectedValue": "4120 Freidrich Lane" + }, + { + "selector": "//*[@id=\"enterAddressAddressLine2\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE2", + "expectedValue": "Apt 8" + }, + { + "selector": "//*[@id=\"enterAddressCity\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_CITY", + "expectedValue": "Austin" + }, + { + "selector": "//*[@id=\"enterAddressStateOrRegion\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_STATE", + "expectedValue": "Texas" + }, + { + "selector": "//*[@id=\"enterAddressPostalCode\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_ZIP", + "expectedValue": "78744" + }, + { + "selector": "//*[@id=\"enterAddressPhoneNumber\"]", + "context": [], + "expectedAutofillType": "PHONE_HOME_CITY_AND_NUMBER", + "expectedValue": "5125551234" + } + ] + }, + { + "selectorType": "xpath", + "selector": "//input[@type='submit' and @value='Deliver to this address']", + "context": [], + "type": "click" + }, + { + "context": [], + "type": "waitFor", + "assertions": [ + "return document.querySelector(`#spinner-anchor`).style.display === 'none';" + ] + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"shippingOptionFormId\"]/div[1]/div[2]/div/span[contains(., '')]/span[contains(., '')]/input[@type='submit' and @value='Continue']", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"ccName\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"addCreditCardNumber\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_NUMBER", + "expectedValue": "9621327911759602" + }, + { + "selector": "//*[@id=\"ccName\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_NAME_FULL", + "expectedValue": "Milton Waddams" + }, + { + "selector": "//*[@id=\"ccMonth\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_EXP_MONTH", + "expectedValue": "5" + }, + { + "selector": "//*[@id=\"ccYear\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_EXP_4_DIGIT_YEAR", + "expectedValue": "2027" + } + ] + } + ] +} \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/apple.sha1 b/chrome/test/data/autofill/captured_sites/apple.sha1 new file mode 100644 index 0000000..c652d1c --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/apple.sha1
@@ -0,0 +1 @@ +e55aa2211a7911d890efd16fd44de605c70f0022 \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/apple.test b/chrome/test/data/autofill/captured_sites/apple.test new file mode 100644 index 0000000..bc28ea1 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/apple.test
@@ -0,0 +1,205 @@ +{ + "name": "Bag - Apple", + "startingURL": "https://www.apple.com/shop/bag", + "actions": [ + { + "selectorType": "xpath", + "selector": "//*[@id=\"cart-actions-checkout\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"guest-checkout\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"cart-continue-button\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"shipping-user-lookup-options\"]", + "context": [], + "index": 1, + "type": "select" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"shipping-user-firstName\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"shipping-user-firstName\"]", + "context": [], + "expectedAutofillType": "NAME_FIRST", + "expectedValue": "Milton" + }, + { + "selector": "//*[@id=\"shipping-user-lastName\"]", + "context": [], + "expectedAutofillType": "NAME_LAST", + "expectedValue": "Waddams" + }, + { + "selector": "//*[@id=\"shipping-user-companyName\"]", + "context": [], + "expectedAutofillType": "COMPANY_NAME", + "expectedValue": "Initech" + }, + { + "selector": "//*[@id=\"shipping-user-street\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE1", + "expectedValue": "4120 Freidrich Lane" + }, + { + "selector": "//*[@id=\"shipping-user-street2\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE2", + "expectedValue": "Apt 8" + }, + { + "selector": "//*[@id=\"shipping-user-city\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_CITY", + "expectedValue": "Austin" + }, + { + "selector": "//*[@id=\"shipping-user-state\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_STATE", + "expectedValue": "TX" + }, + { + "selector": "//*[@id=\"shipping-user-emailAddress\"]", + "context": [], + "expectedAutofillType": "EMAIL_ADDRESS", + "expectedValue": "red.swingline@initech.com" + }, + { + "selector": "//*[@id=\"shipping-user-daytimePhoneAreaCode\"]", + "context": [], + "expectedAutofillType": "PHONE_HOME_CITY_CODE", + "expectedValue": "512" + }, + { + "selector": "//*[@id=\"shipping-user-daytimePhone\"]", + "context": [], + "expectedAutofillType": "PHONE_HOME_NUMBER", + "expectedValue": "5551234" + } + ] + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"shipping-continue-button\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"address-verification-select-matched\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"payment-credit-user-address-firstName\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"payment-credit-user-address-firstName\"]", + "context": [], + "expectedAutofillType": "NAME_FIRST", + "expectedValue": "Milton" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-lastName\"]", + "context": [], + "expectedAutofillType": "NAME_LAST", + "expectedValue": "Waddams" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-companyName\"]", + "context": [], + "expectedAutofillType": "COMPANY_NAME", + "expectedValue": "Initech" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-street\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE1", + "expectedValue": "4120 Freidrich Lane" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-street2\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE2", + "expectedValue": "Apt 8" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-postalCode\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_ZIP", + "expectedValue": "78744" + }, + { + "selector": "//*[@id=\"payment-credit-user-country-selector-countryCode\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_COUNTRY", + "expectedValue": "US" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-emailAddress\"]", + "context": [], + "expectedAutofillType": "EMAIL_ADDRESS", + "expectedValue": "red.swingline@initech.com" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-daytimePhoneAreaCode\"]", + "context": [], + "expectedAutofillType": "PHONE_HOME_CITY_CODE", + "expectedValue": "512" + }, + { + "selector": "//*[@id=\"payment-credit-user-address-daytimePhone\"]", + "context": [], + "expectedAutofillType": "PHONE_HOME_NUMBER", + "expectedValue": "5551234" + } + ] + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"payment-credit-method-cc0-cardNumber\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"payment-credit-method-cc0-cardNumber\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_NUMBER", + "expectedValue": "9621327911759602" + }, + { + "selector": "//*[@id=\"payment-credit-method-cc0-expirationMonth\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_EXP_MONTH", + "expectedValue": "05" + }, + { + "selector": "//*[@id=\"payment-credit-method-cc0-expirationYear\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_EXP_4_DIGIT_YEAR", + "expectedValue": "2027" + } + ] + } + ] +} \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/ebay.sha1 b/chrome/test/data/autofill/captured_sites/ebay.sha1 new file mode 100644 index 0000000..fdd231ec --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/ebay.sha1
@@ -0,0 +1 @@ +8c6a1c8e5e835a80dc6254e86f3f0d8df83c3a71 \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/ebay.test b/chrome/test/data/autofill/captured_sites/ebay.test new file mode 100644 index 0000000..0e1ad54 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/ebay.test
@@ -0,0 +1,125 @@ +{ + "name": "Means of Ascent: The Years of Lyndon Johnson II by Robert A. Caro 9780394528359 | eBay", + "startingURL": "https://www.ebay.com/itm/Means-of-Ascent-The-Years-of-Lyndon-Johnson-II-by-Robert-A-Caro/302335419820?epid=245345&hash=item46649865ac:g:XzcAAOSwuMZZL65R", + "actions": [ + { + "selectorType": "xpath", + "selector": "//*[@id=\"binBtn_btn\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"gtChk\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"af-first-name\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"af-first-name\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_GIVEN_NAME", + "expectedValue": "Milton" + }, + { + "selector": "//*[@id=\"af-last-name\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_FAMILY_NAME", + "expectedValue": "Waddams" + }, + { + "selector": "//*[@id=\"af-address1\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE1", + "expectedValue": "4120 Freidrich Lane" + }, + { + "selector": "//*[@id=\"af-address2\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_ADDRESS_LINE2", + "expectedValue": "Apt 8" + }, + { + "selector": "//*[@id=\"af-city\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_ADDRESS_LEVEL2", + "expectedValue": "Austin" + }, + { + "selector": "//*[@id=\"af-state\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_ADDRESS_LEVEL1", + "expectedValue": "TX" + }, + { + "selector": "//*[@id=\"af-zip\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_POSTAL_CODE", + "expectedValue": "78744" + }, + { + "selector": "//*[@id=\"af-email\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_EMAIL", + "expectedValue": "red.swingline@initech.com" + }, + { + "selector": "//*[@id=\"af-email-confirm\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_EMAIL", + "expectedValue": "red.swingline@initech.com" + }, + { + "selector": "//span[contains(., 'Phone number')]/input[@type='tel']", + "context": [], + "expectedAutofillType": "HTML_TYPE_TEL", + "expectedValue": "(512) 555-1234" + } + ] + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"address-fields-ctr\"]/div[2]/div/button[contains(., 'Done')]", + "context": [], + "type": "click" + }, + { + "context": [], + "type": "waitFor", + "assertions": [ + "return automation_helper.isElementWithXpathReady(`//*[@id=\"sa-change-link\"]`);" + ] + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"CC\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"cardNumber\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"cardNumber\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_CREDIT_CARD_NUMBER", + "expectedValue": "9621327911759602" + }, + { + "selector": "//*[@id=\"cardExp\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR", + "expectedValue": "05 / 27" + } + ] + } + ] +} \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/walmart.sha1 b/chrome/test/data/autofill/captured_sites/walmart.sha1 new file mode 100644 index 0000000..b22d535 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/walmart.sha1
@@ -0,0 +1 @@ +404748495d4285c869c78058b55bf73c2ed0221e \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/walmart.test b/chrome/test/data/autofill/captured_sites/walmart.test new file mode 100644 index 0000000..e0470e6 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/walmart.test
@@ -0,0 +1,147 @@ +{ + "name": "Sign In", + "startingURL": "https://www.walmart.com/checkout/#/sign-in", + "actions": [ + { + "selectorType": "xpath", + "selector": "//button[@data-automation-id='new-guest-continue-button']", + "context": [], + "type": "click" + }, + { + "context": [], + "type": "waitFor", + "assertions": [ + "return automation_helper.isElementWithXpathReady(`//div[@aria-label='Select your shipping option']`);", + "return automation_helper.isElementWithXpathReady(`//div[@aria-label='Select your pickup option']`);", + "return automation_helper.isElementWithXpathReady(`//label[@data-automation-id='shipMethod-EXPEDITED']`);", + "return automation_helper.isElementWithXpathReady(`//div[@class='persistent-order-summary']`);" + ] + }, + { + "selectorType": "xpath", + "selector": "//button[@aria-label='Continue to Shipping Address']", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='firstName']", + "context": [], + "type": "autofill", + "fields" : [ + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='firstName']", + "context": [], + "expectedAutofillType": "NAME_FIRST", + "expectedValue": "Milton" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='lastName']", + "context": [], + "expectedAutofillType": "NAME_LAST", + "expectedValue": "Waddams" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='phone']", + "context": [], + "expectedAutofillType": "PHONE_HOME_CITY_AND_NUMBER", + "expectedValue": "5125551234" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='email']", + "context": [], + "expectedAutofillType": "EMAIL_ADDRESS", + "expectedValue": "red.swingline@initech.com" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='addressLineOne']", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE1", + "expectedValue": "4120 Freidrich Lane" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='addressLineTwo']", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE2", + "expectedValue": "Apt 8" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='city']", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_CITY", + "expectedValue": "Austin" + }, + { + "selectorType": "xpath", + "selector": "//*[@name='state']", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_STATE", + "expectedValue": "TX" + }, + { + "selectorType": "xpath", + "selector": "//input[@type='text' and @name='postalCode']", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_ZIP", + "expectedValue": "78744" + } + ] + }, + { + "selectorType": "xpath", + "selector": "//button[contains(., 'Continue')]", + "context": [], + "type": "click" + }, + { + "context": [], + "type": "waitFor", + "assertions": [ + "return automation_helper.isElementWithXpathReady(`//div[@data-automation-id='address-validation-message-address']`);" + ] + }, + { + "selectorType": "xpath", + "selector": "//button[contains(., 'Use Address Provided')]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"creditCard\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selectorType": "xpath", + "selector": "//*[@id=\"creditCard\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_CREDIT_CARD_NUMBER", + "expectedValue": "9621327911759602" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"month-chooser\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_CREDIT_CARD_EXP_MONTH", + "expectedValue": "05" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"year-chooser\"]", + "context": [], + "expectedAutofillType": "HTML_TYPE_CREDIT_CARD_EXP_YEAR", + "expectedValue": "2027" + } + ] + } + ] +} \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/zappos.sha1 b/chrome/test/data/autofill/captured_sites/zappos.sha1 new file mode 100644 index 0000000..e586d78 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/zappos.sha1
@@ -0,0 +1 @@ +7ec3cde9ef88336c2e087c53d408f1308153a87b \ No newline at end of file
diff --git a/chrome/test/data/autofill/captured_sites/zappos.test b/chrome/test/data/autofill/captured_sites/zappos.test new file mode 100644 index 0000000..63b25191 --- /dev/null +++ b/chrome/test/data/autofill/captured_sites/zappos.test
@@ -0,0 +1,106 @@ +{ + "name": "Online Shoes, Clothing, Always Shipped FREE | Zappos.com", + "startingURL": "https://www.zappos.com/marty/cart", + "actions": [ + { + "selectorType": "xpath", + "selector": "//*[@id=\"root\"]/div/div/main/div/div/div[2]/div[2]/div/div[2]/form/button[contains(., 'Proceed to CheckoutCart')]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"address\"]/div[1]/div/div[2]/div[2]/div[2]/div/div/div/div/div/div[2]/div/span[contains(., 'Ship to a new address')]/div/div/div/img", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"AddressForm_NAME\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"AddressForm_NAME\"]", + "context": [], + "expectedAutofillType": "NAME_FULL", + "expectedValue": "Milton C. Waddams" + }, + { + "selector": "//*[@id=\"AddressForm_ADDRESS_LINE_1\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE1", + "expectedValue": "4120 Freidrich Lane" + }, + { + "selector": "//*[@id=\"AddressForm_ADDRESS_LINE_2\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_LINE2", + "expectedValue": "Apt 8" + }, + { + "selector": "//*[@id=\"AddressForm_CITY\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_CITY", + "expectedValue": "Austin" + }, + { + "selector": "//*[@id=\"AddressForm_STATE_OR_REGION\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_STATE", + "expectedValue": "Texas" + }, + { + "selector": "//*[@id=\"AddressForm_ZIP_CODE\"]", + "context": [], + "expectedAutofillType": "ADDRESS_HOME_ZIP", + "expectedValue": "78744" + }, + { + "selector": "//*[@id=\"AddressForm_PHONE_NUMBER\"]", + "context": [], + "expectedAutofillType": "PHONE_HOME_CITY_AND_NUMBER", + "expectedValue": "5125551234" + } + ] + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"saveAndShipToThisAddress\"]", + "context": [], + "type": "click" + }, + { + "selectorType": "xpath", + "selector": "//*[@id=\"ccNumber\"]", + "context": [], + "type": "autofill", + "fields" : [ + { + "selector": "//*[@id=\"ccNumber\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_NUMBER", + "expectedValue": "9621327911759602" + }, + { + "selector": "//*[@id=\"ccName\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_NAME_FULL", + "expectedValue": "Milton Waddams" + }, + { + "selector": "//*[@id=\"ccMonth\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_EXP_MONTH", + "expectedValue": "5" + }, + { + "selector": "//*[@id=\"ccYear\"]", + "context": [], + "expectedAutofillType": "CREDIT_CARD_EXP_4_DIGIT_YEAR", + "expectedValue": "2027" + } + ] + } + ] +}
diff --git a/chrome/test/data/resource_coordinator/default_favicon.png b/chrome/test/data/resource_coordinator/default_favicon.png new file mode 100644 index 0000000..c44e0f3 --- /dev/null +++ b/chrome/test/data/resource_coordinator/default_favicon.png Binary files differ
diff --git a/chrome/test/data/resource_coordinator/site_characteristics_test_page.html b/chrome/test/data/resource_coordinator/site_characteristics_test_page.html new file mode 100644 index 0000000..c4a70712 --- /dev/null +++ b/chrome/test/data/resource_coordinator/site_characteristics_test_page.html
@@ -0,0 +1,55 @@ +<!doctype html> +<html lang="en"> + +<head> + <meta charset="utf-8"> + <title>Site Characteristics Database Test Page</title> +</head> + +<body> + <script> + // Requests permission to display Web Notifications. + function RequestNotificationsPermission() { + Notification.requestPermission(function (level) { + domAutomationController.send(level); + }); + } + + // Instantiates a new non-persistent notification with the given |title| + // and |options| and then closes it. + function DisplayAndCloseNonPersistentNotification(title, options) { + const notification = new Notification(title, options || {}); + notification.addEventListener('show', e => { + notification.close(); + }); + notification.addEventListener('close', e => { + domAutomationController.send('ok'); + }); + } + + // Play |test_audio.ogg|. + function PlayAudio() { + var audio = new Audio('test_audio.ogg'); + audio.addEventListener('loadeddata', function () { + audio.play(); + }) + } + + // Change the page title to |new_title| + function ChangeTitle(new_title) { + document.title = new_title; + } + + // Change the favicon to |default_favicon.png|. + function ChangeFavicon() { + favicon = document.createElement('link'); + favicon.setAttribute('rel', 'shortcut icon'); + var head = document.querySelector('head'); + head.appendChild(favicon); + favicon.setAttribute('type', 'image/png'); + favicon.setAttribute('href', 'default_favicon.png'); + } + </script> +</body> + +</html> \ No newline at end of file
diff --git a/chrome/test/data/resource_coordinator/test_audio.ogg b/chrome/test/data/resource_coordinator/test_audio.ogg new file mode 100644 index 0000000..c6c4e2c --- /dev/null +++ b/chrome/test/data/resource_coordinator/test_audio.ogg Binary files differ
diff --git a/chrome/test/data/web_page_replay_go_helper_scripts/automation_helper.js b/chrome/test/data/web_page_replay_go_helper_scripts/automation_helper.js new file mode 100644 index 0000000..03104ba8 --- /dev/null +++ b/chrome/test/data/web_page_replay_go_helper_scripts/automation_helper.js
@@ -0,0 +1,126 @@ +// Copyright (c) 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +'use strict'; + +const automation_helper = (function() { + var automation_helper = { + // An enum specifying the state of an element on the page. + DomElementReadyState: + Object.freeze({ + "present": 0, + "visible": 1, + "enabled": 2, + "on_top": 4, + }), + }; + + // public: + // Checks if an element is present, visible or enabled on the page. + automation_helper.isElementReady = function( + getElementFunction, + state_flags = + this.DomElementReadyState.visible | + this.DomElementReadyState.enabled | + this.DomElementReadyState.on_top) { + const element = getElementFunction(); + if (element) { + var isReady = true; + + if (state_flags & this.DomElementReadyState.visible) { + var target = element; + // In some custom select drop downs, like the ones on Amazon.com and + // Zappos.com, the drop down options are hosted inside a span element + // that is the immediate sibling, rather than the descendant, of the + // select dropdown. + // In these cases, check if the span is visible instead. + if (element.offsetParent === null && + element instanceof HTMLSelectElement && + element.nextElementSibling instanceof HTMLSpanElement) + target = element.nextElementSibling; + + isReady = + (target.offsetParent !== null) && + (target.offsetWidth > 0) && + (target.offsetHeight > 0); + + if (isReady && state_flags & this.DomElementReadyState.on_top) { + var rect = target.getBoundingClientRect(); + isReady &= + // Check that the element is not concealed behind another element. + isSelfOrDescendant( + target, + document.elementFromPoint( + // As coordinates, use the center of the element, minus + // the window offset in case the element is outside the + // view. + rect.left + rect.width / 2 - window.pageXOffset, + rect.top + rect.height / 2 - window.pageYOffset)); + } + } + + if (isReady && state_flags & this.DomElementReadyState.enabled) { + isReady = !element.disabled; + } + + return isReady; + } + return false; + }; + + // Check if an element identified by a xpath is present, visible or + // enabled on the page. + automation_helper.isElementWithXpathReady = function( + xpath, + state_flags = this.DomElementReadyState.visible + | this.DomElementReadyState.enabled) { + return this.isElementReady( + function(){ + return automation_helper.getElementByXpath(xpath); + }, + state_flags); + }; + + // Simulates the user selecting a dropdown option by setting the dropdown + // option and then fire an onchange event on the dropdown element. + automation_helper.selectOptionFromDropDownElementByIndex = + function (dropdown, index) { + dropdown.options.selectedIndex = index; + triggerOnChangeEventOnElement(dropdown); + }; + + // Simulates the user interacting with an input element by setting the input + // value and then fire + // an onchange event on the input element. + automation_helper.setInputElementValue = function (element, value) { + element.value = value; + triggerOnChangeEventOnElement(element); + }; + + automation_helper.getElementByXpath = function (path) { + return document.evaluate(path, document, null, + XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; + }; + + // private: + // Triggers an onchange event on a dom element. + function triggerOnChangeEventOnElement(element) { + var event = document.createEvent('HTMLEvents'); + event.initEvent('change', false, true); + element.dispatchEvent(event); + } + + function isSelfOrDescendant(parent, child) { + var node = child; + while (node != null) { + if (node == parent) { + return true; + } + node = node.parentNode; + } + return false; + } + + return automation_helper; +})();
diff --git a/chrome/test/data/webui/md_history/history_list_test.js b/chrome/test/data/webui/md_history/history_list_test.js index 8d7f350..0f45fab 100644 --- a/chrome/test/data/webui/md_history/history_list_test.js +++ b/chrome/test/data/webui/md_history/history_list_test.js
@@ -447,7 +447,7 @@ // Deletion should deselect all. assertDeepEquals( [false, false, false], - items.slice(0, 3).map(i => i.selected)); + Array.from(items).slice(0, 3).map(i => i.selected)); done(); });
diff --git a/chrome/test/data/webui/md_history/test_util.js b/chrome/test/data/webui/md_history/test_util.js index 2032787a..3229758d 100644 --- a/chrome/test/data/webui/md_history/test_util.js +++ b/chrome/test/data/webui/md_history/test_util.js
@@ -27,10 +27,10 @@ */ function replaceApp() { const app = document.createElement('history-app'); + replaceBody(app); app.id = 'history-app'; // Disable querying for tests by default. app.queryState_.queryingDisabled = true; - replaceBody(app); Polymer.dom.flush(); return app; } @@ -93,10 +93,10 @@ /** * @param {Element} element * @param {string} selector - * @return {Element} + * @return {!NodeList<!Element>} */ function polymerSelectAll(element, selector) { - return Polymer.dom(element.root).querySelectorAll(selector); + return element.shadowRoot.querySelectorAll(selector); } /**
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 556d556..487055c 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1796,6 +1796,30 @@ }); /** + * Test fixture for the multidevice settings section container. + * @constructor + * @extends {CrSettingsBrowserTest} + */ +function CrSettingsMultideviceSectionContainerTest() {} + +CrSettingsMultideviceSectionContainerTest.prototype = { + __proto__: CrSettingsBrowserTest.prototype, + + /** @override */ + browsePreload: + 'chrome://settings/multidevice_page/multidevice_section_container.html', + + /** @override */ + extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ + 'multidevice_section_container_tests.js', + ]), +}; + +TEST_F('CrSettingsMultideviceSectionContainerTest', 'All', function() { + mocha.run(); +}); + +/** * Test fixture for the multidevice settings page. * @constructor * @extends {CrSettingsBrowserTest}
diff --git a/chrome/test/data/webui/settings/multidevice_section_container_tests.js b/chrome/test/data/webui/settings/multidevice_section_container_tests.js new file mode 100644 index 0000000..f4f34f3b --- /dev/null +++ b/chrome/test/data/webui/settings/multidevice_section_container_tests.js
@@ -0,0 +1,69 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +suite('Multidevice', function() { + let multideviceSectionContainer = null; + + let ALL_MODES; + + suiteSetup(function() {}); + + setup(function() { + PolymerTest.clearBody(); + multideviceSectionContainer = + document.createElement('settings-multidevice-section-container'); + assertTrue(!!multideviceSectionContainer); + + ALL_MODES = Object.values(settings.MultiDeviceSettingsMode); + + document.body.appendChild(multideviceSectionContainer); + Polymer.dom.flush(); + }); + + teardown(function() { + multideviceSectionContainer.remove(); + }); + + let isSettingsSectionVisible = function() { + Polymer.dom.flush(); + let settingsSection = multideviceSectionContainer.$$( + 'settings-section[section="multidevice"]'); + return !!settingsSection && !settingsSection.hidden; + }; + + test('mode_ property toggles multidevice section', function() { + // Check that the settings-section is visible iff the mode is not + // NO_ELIGIBLE_HOSTS. + for (let mode of ALL_MODES) { + multideviceSectionContainer.mode_ = mode; + assertEquals( + isSettingsSectionVisible(), + mode != settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS); + } + // One more loop to ensure we transition in and out of NO_ELIGIBLE_HOSTS + // mode. + for (let mode of ALL_MODES) { + multideviceSectionContainer.mode_ = mode; + assertEquals( + isSettingsSectionVisible(), + mode != settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS); + } + }); + + test( + 'mode_ property passes to settings-multidevice-page if present', + function() { + for (let mode of ALL_MODES) { + multideviceSectionContainer.mode_ = mode; + Polymer.dom.flush(); + let multidevicePage = + multideviceSectionContainer.$$('settings-multidevice-page'); + if (mode == settings.MultiDeviceSettingsMode.NO_ELIGIBLE_HOSTS) + assertEquals(multidevicePage, null); + else + assertEquals( + multideviceSectionContainer.mode_, multidevicePage.mode); + } + }); +});
diff --git a/chromecast/renderer/cast_extensions_dispatcher_delegate.cc b/chromecast/renderer/cast_extensions_dispatcher_delegate.cc index 456a2fd..412cd7b 100644 --- a/chromecast/renderer/cast_extensions_dispatcher_delegate.cc +++ b/chromecast/renderer/cast_extensions_dispatcher_delegate.cc
@@ -73,6 +73,7 @@ source_map->RegisterSource("automationEvent", IDR_AUTOMATION_EVENT_JS); source_map->RegisterSource("automationNode", IDR_AUTOMATION_NODE_JS); source_map->RegisterSource("tabs", IDR_TABS_CUSTOM_BINDINGS_JS); + source_map->RegisterSource("automationNode", IDR_SPEECH_SYNTHESIS_JS); } void CastExtensionsDispatcherDelegate::RequireAdditionalModules(
diff --git a/chromecast/renderer/resources/extensions/speech_synthesis.js b/chromecast/renderer/resources/extensions/speech_synthesis.js new file mode 100644 index 0000000..86d45b1e --- /dev/null +++ b/chromecast/renderer/resources/extensions/speech_synthesis.js
@@ -0,0 +1,7 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Imported from //chrome/browser/resources/chromeos/select_to_speak/externs.js + +window.speechSynthesis = {};
diff --git a/chromecast/renderer/resources/extensions_renderer_resources.grd b/chromecast/renderer/resources/extensions_renderer_resources.grd index deeed3a..497657c7 100644 --- a/chromecast/renderer/resources/extensions_renderer_resources.grd +++ b/chromecast/renderer/resources/extensions_renderer_resources.grd
@@ -14,6 +14,7 @@ <include name="IDR_AUTOMATION_NODE_JS" file="extensions\automation\automation_node.js" type="BINDATA" /> <include name="IDR_TABS_CUSTOM_BINDINGS_JS" file="extensions\tabs_custom_bindings.js" type="BINDATA" /> <include name="IDR_TTS_CUSTOM_BINDINGS_JS" file="extensions\tts_custom_bindings.js" type="BINDATA" /> + <include name="IDR_SPEECH_SYNTHESIS_JS" file="extensions\speech_synthesis.js" type="BINDATA" /> </includes> </release> </grit>
diff --git a/chromeos/DEPS b/chromeos/DEPS index e62d6750..2043a514 100644 --- a/chromeos/DEPS +++ b/chromeos/DEPS
@@ -11,7 +11,6 @@ "+crypto", "+google_apis/gaia", "+media/base/video_facing.h", - "+mojo/edk/embedder/embedder.h", "+net", "+third_party/cros_system_api", "+third_party/protobuf", @@ -19,3 +18,9 @@ # Some targets may not have any UI, so explictly exclude src/ui. "-ui", ] + +specific_include_rules = { + ".*run_all_unittests.cc": [ + "+mojo/edk/embedder", + ] +}
diff --git a/chromeos/components/drivefs/BUILD.gn b/chromeos/components/drivefs/BUILD.gn index da1b379..2892b24 100644 --- a/chromeos/components/drivefs/BUILD.gn +++ b/chromeos/components/drivefs/BUILD.gn
@@ -23,8 +23,8 @@ "//components/account_id", "//dbus", "//google_apis", - "//mojo/edk", "//mojo/public/cpp/bindings", + "//mojo/public/cpp/platform", "//net", "//services/identity/public/mojom", "//services/service_manager/public/cpp",
diff --git a/chromeos/components/drivefs/DEPS b/chromeos/components/drivefs/DEPS index 4e810ad..b9c28a0 100644 --- a/chromeos/components/drivefs/DEPS +++ b/chromeos/components/drivefs/DEPS
@@ -1,6 +1,5 @@ include_rules = [ "+components/drive/file_errors.h", - "+mojo/edk/embedder", "+mojo/public", "+services/identity/public", "+services/service_manager/public",
diff --git a/chromeos/components/drivefs/fake_drivefs_launcher_client.cc b/chromeos/components/drivefs/fake_drivefs_launcher_client.cc index d776a3af..d734bb8 100644 --- a/chromeos/components/drivefs/fake_drivefs_launcher_client.cc +++ b/chromeos/components/drivefs/fake_drivefs_launcher_client.cc
@@ -13,9 +13,7 @@ #include "chromeos/components/drivefs/pending_connection_manager.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_cros_disks_client.h" -#include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/embedder/named_platform_handle.h" -#include "mojo/edk/embedder/named_platform_handle_utils.h" +#include "mojo/public/cpp/platform/named_platform_channel.h" #include "mojo/public/cpp/platform/platform_channel.h" #include "mojo/public/cpp/platform/platform_channel_endpoint.h" #include "mojo/public/cpp/system/invitation.h" @@ -26,19 +24,17 @@ namespace { void ConnectAsync(mojom::FakeDriveFsLauncherRequest request, - mojo::edk::NamedPlatformHandle os_pipe) { - mojo::edk::ScopedInternalPlatformHandle os_pipe_handle = - mojo::edk::CreateClientHandle(os_pipe); - if (!os_pipe_handle.is_valid()) { + mojo::NamedPlatformChannel::ServerName server_name) { + mojo::PlatformChannelEndpoint endpoint = + mojo::NamedPlatformChannel::ConnectToServer(server_name); + if (!endpoint.is_valid()) return; - } + mojo::OutgoingInvitation invitation; mojo::FuseMessagePipes(invitation.AttachMessagePipe("drivefs-launcher"), request.PassMessagePipe()); - mojo::OutgoingInvitation::Send( - std::move(invitation), base::kNullProcessHandle, - mojo::PlatformChannelEndpoint(mojo::PlatformHandle( - base::ScopedFD(os_pipe_handle.release().handle)))); + mojo::OutgoingInvitation::Send(std::move(invitation), + base::kNullProcessHandle, std::move(endpoint)); } } // namespace @@ -59,11 +55,10 @@ const base::FilePath& socket_path) : chroot_path_(chroot_path), socket_path_(chroot_path_.Append(socket_path)) { - mojo::edk::NamedPlatformHandle os_pipe(socket_path_.value()); - base::PostTaskWithTraits( FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND}, - base::BindOnce(&ConnectAsync, mojo::MakeRequest(&launcher_), os_pipe)); + base::BindOnce(&ConnectAsync, mojo::MakeRequest(&launcher_), + socket_path_.value())); chromeos::DBusThreadManager* dbus_thread_manager = chromeos::DBusThreadManager::Get();
diff --git a/chromeos/components/tether/host_scan_scheduler_impl.cc b/chromeos/components/tether/host_scan_scheduler_impl.cc index 0d17098..3f34552 100644 --- a/chromeos/components/tether/host_scan_scheduler_impl.cc +++ b/chromeos/components/tether/host_scan_scheduler_impl.cc
@@ -10,6 +10,7 @@ #include "base/metrics/histogram_macros.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_clock.h" +#include "chromeos/chromeos_features.h" #include "chromeos/components/proximity_auth/logging/logging.h" #include "chromeos/network/network_handler.h" #include "chromeos/network/network_state.h" @@ -31,9 +32,11 @@ // seconds apart. const int64_t kMaxNumSecondsBetweenBatchScans = 60; -// Scanning immediately after the device is unlocked may cause unwanted -// interactions with EasyUnlock BLE channels. The scan is delayed slightly in -// order to circumvent this issue. +// If Tether and Smart Lock use their own BLE channel logic, instead of the +// shared SecureChannel API (i.e. |chromeos::features::kMultiDeviceApi| is +// disabled), scanning immediately after the device is unlocked may cause +// unwanted interactions with Smart Lock BLE channels. The scan is delayed +// slightly in order to circumvent this issue. const int64_t kNumSecondsToDelayScanAfterUnlock = 3; // Minimum value for the scan length metric. @@ -131,7 +134,8 @@ // Note: Once the SecureChannel API is in use, the scan will no longer have // to stop. host_scanner_->StopScan(); - delay_scan_after_unlock_timer_->Stop(); + if (!base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi)) + delay_scan_after_unlock_timer_->Stop(); return; } @@ -139,11 +143,15 @@ return; // If the device was just unlocked, start a scan. - delay_scan_after_unlock_timer_->Start( - FROM_HERE, - base::TimeDelta::FromSeconds(kNumSecondsToDelayScanAfterUnlock), - base::Bind(&HostScanSchedulerImpl::AttemptScan, - weak_ptr_factory_.GetWeakPtr())); + if (base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi)) { + AttemptScan(); + } else { + delay_scan_after_unlock_timer_->Start( + FROM_HERE, + base::TimeDelta::FromSeconds(kNumSecondsToDelayScanAfterUnlock), + base::BindRepeating(&HostScanSchedulerImpl::AttemptScan, + weak_ptr_factory_.GetWeakPtr())); + } } void HostScanSchedulerImpl::SetTestDoubles( @@ -163,12 +171,13 @@ if (host_scanner_->IsScanActive()) return; - // If the screen is locked, a host scan should not occur. A scan during the - // lock screen could cause bad interactions with EasyUnlock. See - // https://crbug.com/763604. - // Note: Once the SecureChannel API is available, this check can be removed. - if (session_manager_->IsScreenLocked()) + // If the SecureChannel API is not present, and the screen is locked, a host + // scan should not occur. A scan during the lock screen could cause bad + // interactions with EasyUnlock. See https://crbug.com/763604. + if (!base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi) && + session_manager_->IsScreenLocked()) { return; + } // If the timer is running, this new scan is part of the same batch as the // previous scan, so the timer should be stopped (it will be restarted after @@ -179,7 +188,9 @@ else last_scan_batch_start_timestamp_ = clock_->Now(); - delay_scan_after_unlock_timer_->Stop(); + if (!base::FeatureList::IsEnabled(chromeos::features::kMultiDeviceApi)) + delay_scan_after_unlock_timer_->Stop(); + host_scanner_->StartScan(); network_state_handler_->SetTetherScanState(true); }
diff --git a/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc b/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc index 7c998fb..b6b2dc7 100644 --- a/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc +++ b/chromeos/components/tether/host_scan_scheduler_impl_unittest.cc
@@ -9,10 +9,12 @@ #include "base/memory/ptr_util.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/scoped_task_environment.h" #include "base/test/simple_test_clock.h" #include "base/test/test_simple_task_runner.h" #include "base/timer/mock_timer.h" +#include "chromeos/chromeos_features.h" #include "chromeos/components/tether/fake_host_scanner.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power_manager_client.h" @@ -96,6 +98,10 @@ DBusThreadManager::Shutdown(); } + void SetMultiDeviceApiEnabled() { + scoped_feature_list_.InitAndEnableFeature(features::kMultiDeviceApi); + } + void RequestScan() { host_scan_scheduler_->ScanRequested(); } // Disconnects the Ethernet network and manually sets the default network to @@ -172,6 +178,8 @@ std::unique_ptr<base::HistogramTester> histogram_tester_; std::unique_ptr<HostScanSchedulerImpl> host_scan_scheduler_; + + base::test::ScopedFeatureList scoped_feature_list_; }; TEST_F(HostScanSchedulerImplTest, ScheduleScan) { @@ -214,6 +222,30 @@ EXPECT_EQ(1u, fake_host_scanner_->num_scans_started()); } +TEST_F(HostScanSchedulerImplTest, + TestDeviceLockAndUnlock_MultiDeviceApiEnabled) { + SetMultiDeviceApiEnabled(); + + // Lock the screen. This should not trigger a scan. + SetScreenLockedState(true /* is_locked */); + EXPECT_EQ(0u, fake_host_scanner_->num_scans_started()); + EXPECT_FALSE(mock_delay_scan_after_unlock_timer_->IsRunning()); + + // Try to start a scan. Even thought the screen is locked, this should cause a + // scan to be started. + host_scan_scheduler_->ScheduleScan(); + EXPECT_EQ(1u, fake_host_scanner_->num_scans_started()); + EXPECT_FALSE(mock_delay_scan_after_unlock_timer_->IsRunning()); + + fake_host_scanner_->StopScan(); + + // Unlock the screen. A new scan should have started, and the timer should be + // untouched. + SetScreenLockedState(false /* is_locked */); + EXPECT_EQ(2u, fake_host_scanner_->num_scans_started()); + EXPECT_FALSE(mock_delay_scan_after_unlock_timer_->IsRunning()); +} + TEST_F(HostScanSchedulerImplTest, ScanRequested) { // Begin scanning. RequestScan();
diff --git a/chromeos/services/DEPS b/chromeos/services/DEPS deleted file mode 100644 index a8e1150f..0000000 --- a/chromeos/services/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+mojo/edk/embedder/embedder.h" -]
diff --git a/chromeos/services/secure_channel/BUILD.gn b/chromeos/services/secure_channel/BUILD.gn index 1cb4a952..363644b 100644 --- a/chromeos/services/secure_channel/BUILD.gn +++ b/chromeos/services/secure_channel/BUILD.gn
@@ -95,6 +95,8 @@ "secure_channel_disconnector_impl.h", "secure_channel_impl.cc", "secure_channel_impl.h", + "secure_channel_initializer.cc", + "secure_channel_initializer.h", "secure_channel_service.cc", "secure_channel_service.h", "shared_resource_scheduler.cc",
diff --git a/chromeos/services/secure_channel/pending_connection_manager_impl.cc b/chromeos/services/secure_channel/pending_connection_manager_impl.cc index 9f34c89..a571597 100644 --- a/chromeos/services/secure_channel/pending_connection_manager_impl.cc +++ b/chromeos/services/secure_channel/pending_connection_manager_impl.cc
@@ -4,8 +4,15 @@ #include "chromeos/services/secure_channel/pending_connection_manager_impl.h" +#include "base/logging.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" +#include "base/stl_util.h" +#include "chromeos/services/secure_channel/ble_initiator_connection_attempt.h" +#include "chromeos/services/secure_channel/ble_listener_connection_attempt.h" +#include "chromeos/services/secure_channel/pending_ble_initiator_connection_request.h" +#include "chromeos/services/secure_channel/pending_ble_listener_connection_request.h" +#include "chromeos/services/secure_channel/public/cpp/shared/authenticated_channel.h" namespace chromeos { @@ -34,12 +41,18 @@ PendingConnectionManagerImpl::Factory::~Factory() = default; std::unique_ptr<PendingConnectionManager> -PendingConnectionManagerImpl::Factory::BuildInstance(Delegate* delegate) { - return base::WrapUnique(new PendingConnectionManagerImpl(delegate)); +PendingConnectionManagerImpl::Factory::BuildInstance( + Delegate* delegate, + BleConnectionManager* ble_connection_manager) { + return base::WrapUnique( + new PendingConnectionManagerImpl(delegate, ble_connection_manager)); } -PendingConnectionManagerImpl::PendingConnectionManagerImpl(Delegate* delegate) - : PendingConnectionManager(delegate) {} +PendingConnectionManagerImpl::PendingConnectionManagerImpl( + Delegate* delegate, + BleConnectionManager* ble_connection_manager) + : PendingConnectionManager(delegate), + ble_connection_manager_(ble_connection_manager) {} PendingConnectionManagerImpl::~PendingConnectionManagerImpl() = default; @@ -47,7 +60,220 @@ const ConnectionAttemptDetails& connection_attempt_details, std::unique_ptr<ClientConnectionParameters> client_connection_parameters, ConnectionPriority connection_priority) { - NOTIMPLEMENTED(); + DCHECK_EQ(ConnectionMedium::kBluetoothLowEnergy, + connection_attempt_details.connection_medium()); + + // If the client has canceled the request, it does not need to be processed. + if (!client_connection_parameters->IsClientWaitingForResponse()) { + PA_LOG(INFO) << "PendingConnectionManagerImpl::HandleConnectionRequest(): " + << "Request was canceled by the client before being passed to " + << "PendingConnectionManager; ignoring. Details: " + << connection_attempt_details + << ", Parameters: " << *client_connection_parameters + << ", Priority: " << connection_priority; + return; + } + + // Insert the entry into the ConnectionDetails to ConnectionAttemptDetails + // map. + ConnectionDetails connection_details = + connection_attempt_details.GetAssociatedConnectionDetails(); + details_to_attempt_details_map_[connection_details].insert( + connection_attempt_details); + + // Process the role-specific details. + switch (connection_attempt_details.connection_role()) { + case ConnectionRole::kInitiatorRole: + HandleBleInitiatorRequest(connection_attempt_details, + std::move(client_connection_parameters), + connection_priority); + break; + case ConnectionRole::kListenerRole: + HandleBleListenerRequest(connection_attempt_details, + std::move(client_connection_parameters), + connection_priority); + break; + } +} + +void PendingConnectionManagerImpl::OnConnectionAttemptSucceeded( + const ConnectionDetails& connection_details, + std::unique_ptr<AuthenticatedChannel> authenticated_channel) { + if (!base::ContainsKey(details_to_attempt_details_map_, connection_details)) { + PA_LOG(ERROR) << "PendingConnectionManagerImpl::" + << "OnConnectionAttemptSucceeded(): Attempt succeeded, but " + << "there was no corresponding map entry. " + << "Details: " << connection_details; + NOTREACHED(); + } + + std::vector<std::unique_ptr<ClientConnectionParameters>> all_clients; + + // Make a copy of the ConnectionAttemptDetails to process to prevent modifying + // the set during iteration. + base::flat_set<ConnectionAttemptDetails> to_process = + details_to_attempt_details_map_[connection_details]; + + // For each associated ConnectionAttemptDetails, extract clients from the + // connection attempt, add them to |all_clients|, and remove the associated + // map entries. + for (const auto& connection_attempt_details : to_process) { + std::vector<std::unique_ptr<ClientConnectionParameters>> clients_in_loop; + + switch (connection_attempt_details.connection_role()) { + case ConnectionRole::kInitiatorRole: + clients_in_loop = ConnectionAttempt<BleInitiatorFailureType>:: + ExtractClientConnectionParameters( + std::move(id_pair_to_ble_initiator_connection_attempts_ + [connection_attempt_details.device_id_pair()])); + break; + case ConnectionRole::kListenerRole: + clients_in_loop = ConnectionAttempt<BleListenerFailureType>:: + ExtractClientConnectionParameters( + std::move(id_pair_to_ble_listener_connection_attempts_ + [connection_attempt_details.device_id_pair()])); + break; + } + + // Move elements in |clients_in_list| to |all_clients|. + all_clients.insert(all_clients.end(), + std::make_move_iterator(clients_in_loop.begin()), + std::make_move_iterator(clients_in_loop.end())); + + RemoveMapEntriesForFinishedConnectionAttempt(connection_attempt_details); + } + + NotifyOnConnection(std::move(authenticated_channel), std::move(all_clients), + connection_details); +} + +void PendingConnectionManagerImpl::OnConnectionAttemptFinishedWithoutConnection( + const ConnectionAttemptDetails& connection_attempt_details) { + RemoveMapEntriesForFinishedConnectionAttempt(connection_attempt_details); +} + +void PendingConnectionManagerImpl::HandleBleInitiatorRequest( + const ConnectionAttemptDetails& connection_attempt_details, + std::unique_ptr<ClientConnectionParameters> client_connection_parameters, + ConnectionPriority connection_priority) { + // If no ConnectionAttempt exists to this device in the initiator role, create + // one. + if (!base::ContainsKey(id_pair_to_ble_initiator_connection_attempts_, + connection_attempt_details.device_id_pair())) { + id_pair_to_ble_initiator_connection_attempts_[connection_attempt_details + .device_id_pair()] = + BleInitiatorConnectionAttempt::Factory::Get()->BuildInstance( + ble_connection_manager_, this /* delegate */, + connection_attempt_details); + } + + auto& connection_attempt = + id_pair_to_ble_initiator_connection_attempts_[connection_attempt_details + .device_id_pair()]; + + bool success = connection_attempt->AddPendingConnectionRequest( + PendingBleInitiatorConnectionRequest::Factory::Get()->BuildInstance( + std::move(client_connection_parameters), connection_priority, + connection_attempt.get() /* delegate */)); + + if (!success) { + PA_LOG(ERROR) << "PendingConnectionManagerImpl::" + << "HandleBleInitiatorRequest(): Not able to handle request. " + << "Details: " << connection_attempt_details + << ", Client parameters: " << *client_connection_parameters; + NOTREACHED(); + } +} + +void PendingConnectionManagerImpl::HandleBleListenerRequest( + const ConnectionAttemptDetails& connection_attempt_details, + std::unique_ptr<ClientConnectionParameters> client_connection_parameters, + ConnectionPriority connection_priority) { + // If no ConnectionAttempt exists to this device in the listener role, create + // one. + if (!base::ContainsKey(id_pair_to_ble_listener_connection_attempts_, + connection_attempt_details.device_id_pair())) { + id_pair_to_ble_listener_connection_attempts_[connection_attempt_details + .device_id_pair()] = + BleListenerConnectionAttempt::Factory::Get()->BuildInstance( + ble_connection_manager_, this /* delegate */, + connection_attempt_details); + } + + auto& connection_attempt = + id_pair_to_ble_listener_connection_attempts_[connection_attempt_details + .device_id_pair()]; + + bool success = connection_attempt->AddPendingConnectionRequest( + PendingBleListenerConnectionRequest::Factory::Get()->BuildInstance( + std::move(client_connection_parameters), connection_priority, + connection_attempt.get() /* delegate */)); + + if (!success) { + PA_LOG(ERROR) << "PendingConnectionManagerImpl::" + << "HandleBleListenerRequest(): Not able to handle request. " + << "Details: " << connection_attempt_details + << ", Client parameters: " << *client_connection_parameters; + NOTREACHED(); + } +} + +void PendingConnectionManagerImpl::RemoveMapEntriesForFinishedConnectionAttempt( + const ConnectionAttemptDetails& connection_attempt_details) { + // Make a copy of |connection_attempt_details|, since it belongs to the + // ConnectionAttempt which is about to be deleted below. + ConnectionAttemptDetails connection_attempt_details_copy = + connection_attempt_details; + + switch (connection_attempt_details_copy.connection_role()) { + case ConnectionRole::kInitiatorRole: { + size_t num_deleted = id_pair_to_ble_initiator_connection_attempts_.erase( + connection_attempt_details_copy.device_id_pair()); + if (num_deleted != 1u) { + PA_LOG(ERROR) << "PendingConnectionManagerImpl::" + << "RemoveMapEntriesForFinishedConnectionAttempt(): " + << "Tried to remove failed initiator ConnectionAttempt, " + << "but it was not present in the map. Details: " + << connection_attempt_details_copy; + NOTREACHED(); + } + break; + } + + case ConnectionRole::kListenerRole: { + size_t num_deleted = id_pair_to_ble_listener_connection_attempts_.erase( + connection_attempt_details_copy.device_id_pair()); + if (num_deleted != 1u) { + PA_LOG(ERROR) << "PendingConnectionManagerImpl::" + << "RemoveMapEntriesForFinishedConnectionAttempt(): " + << "Tried to remove failed listener ConnectionAttempt, " + << "but it was not present in the map. Details: " + << connection_attempt_details_copy; + NOTREACHED(); + } + break; + } + } + + ConnectionDetails connection_details = + connection_attempt_details_copy.GetAssociatedConnectionDetails(); + + size_t num_deleted = + details_to_attempt_details_map_[connection_details].erase( + connection_attempt_details_copy); + if (num_deleted != 1u) { + PA_LOG(ERROR) << "PendingConnectionManagerImpl::" + << "RemoveMapEntriesForFinishedConnectionAttempt(): " + << "Tried to remove ConnectionAttemptDetails, but they were" + << "not present in the map. Details: " + << connection_attempt_details_copy; + NOTREACHED(); + } + + // If |connection_attempt_details_copy| was the last entry, remove the entire + // set. + if (details_to_attempt_details_map_[connection_details].empty()) + details_to_attempt_details_map_.erase(connection_details); } } // namespace secure_channel
diff --git a/chromeos/services/secure_channel/pending_connection_manager_impl.h b/chromeos/services/secure_channel/pending_connection_manager_impl.h index 910179e..8bc0984d 100644 --- a/chromeos/services/secure_channel/pending_connection_manager_impl.h +++ b/chromeos/services/secure_channel/pending_connection_manager_impl.h
@@ -8,8 +8,14 @@ #include <memory> #include <vector> +#include "base/containers/flat_map.h" +#include "base/containers/flat_set.h" #include "base/macros.h" +#include "chromeos/services/secure_channel/ble_initiator_failure_type.h" +#include "chromeos/services/secure_channel/ble_listener_failure_type.h" #include "chromeos/services/secure_channel/client_connection_parameters.h" +#include "chromeos/services/secure_channel/connection_attempt.h" +#include "chromeos/services/secure_channel/connection_attempt_delegate.h" #include "chromeos/services/secure_channel/connection_medium.h" #include "chromeos/services/secure_channel/connection_role.h" #include "chromeos/services/secure_channel/device_id_pair.h" @@ -20,9 +26,18 @@ namespace secure_channel { -// Concrete PendingConnectionManager implementation. -// TODO(khorimoto): Implement. -class PendingConnectionManagerImpl : public PendingConnectionManager { +class BleConnectionManager; + +// Concrete PendingConnectionManager implementation. This class creates one +// ConnectionAttempt per ConnectionAttemptDetails requested; if more than one +// request shares the same ConnectionAttemptDetails, a single ConnectionAttempt +// attempts a connection for all associated requests. +// +// If a ConnectionAttempt successfully creates a channel, this class extracts +// client data from all requests to the same remote device and alerts its +// delegate, deleting all associated ConnectionAttempts when it is finished. +class PendingConnectionManagerImpl : public PendingConnectionManager, + public ConnectionAttemptDelegate { public: class Factory { public: @@ -30,7 +45,8 @@ static void SetFactoryForTesting(Factory* test_factory); virtual ~Factory(); virtual std::unique_ptr<PendingConnectionManager> BuildInstance( - Delegate* delegate); + Delegate* delegate, + BleConnectionManager* ble_connection_manager); private: static Factory* test_factory_; @@ -39,13 +55,47 @@ ~PendingConnectionManagerImpl() override; private: - PendingConnectionManagerImpl(Delegate* delegate); + PendingConnectionManagerImpl(Delegate* delegate, + BleConnectionManager* ble_connection_manager); + // PendingConnectionManager: void HandleConnectionRequest( const ConnectionAttemptDetails& connection_attempt_details, std::unique_ptr<ClientConnectionParameters> client_connection_parameters, ConnectionPriority connection_priority) override; + // ConnectionAttemptDelegate: + void OnConnectionAttemptSucceeded( + const ConnectionDetails& connection_details, + std::unique_ptr<AuthenticatedChannel> authenticated_channel) override; + void OnConnectionAttemptFinishedWithoutConnection( + const ConnectionAttemptDetails& connection_attempt_details) override; + + void HandleBleInitiatorRequest( + const ConnectionAttemptDetails& connection_attempt_details, + std::unique_ptr<ClientConnectionParameters> client_connection_parameters, + ConnectionPriority connection_priority); + void HandleBleListenerRequest( + const ConnectionAttemptDetails& connection_attempt_details, + std::unique_ptr<ClientConnectionParameters> client_connection_parameters, + ConnectionPriority connection_priority); + + void RemoveMapEntriesForFinishedConnectionAttempt( + const ConnectionAttemptDetails& connection_attempt_details); + + base::flat_map<DeviceIdPair, + std::unique_ptr<ConnectionAttempt<BleInitiatorFailureType>>> + id_pair_to_ble_initiator_connection_attempts_; + + base::flat_map<DeviceIdPair, + std::unique_ptr<ConnectionAttempt<BleListenerFailureType>>> + id_pair_to_ble_listener_connection_attempts_; + + base::flat_map<ConnectionDetails, base::flat_set<ConnectionAttemptDetails>> + details_to_attempt_details_map_; + + BleConnectionManager* ble_connection_manager_; + DISALLOW_COPY_AND_ASSIGN(PendingConnectionManagerImpl); };
diff --git a/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc b/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc index 4743943..fc7d732 100644 --- a/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc +++ b/chromeos/services/secure_channel/pending_connection_manager_impl_unittest.cc
@@ -5,16 +5,306 @@ #include "chromeos/services/secure_channel/pending_connection_manager_impl.h" #include <memory> +#include <sstream> +#include "base/bind.h" +#include "base/containers/flat_map.h" #include "base/macros.h" +#include "base/optional.h" #include "base/test/scoped_task_environment.h" +#include "chromeos/services/secure_channel/ble_initiator_connection_attempt.h" +#include "chromeos/services/secure_channel/ble_listener_connection_attempt.h" +#include "chromeos/services/secure_channel/fake_ble_connection_manager.h" +#include "chromeos/services/secure_channel/fake_client_connection_parameters.h" +#include "chromeos/services/secure_channel/fake_connection_attempt.h" #include "chromeos/services/secure_channel/fake_pending_connection_manager.h" +#include "chromeos/services/secure_channel/fake_pending_connection_request.h" +#include "chromeos/services/secure_channel/pending_ble_initiator_connection_request.h" +#include "chromeos/services/secure_channel/pending_ble_listener_connection_request.h" +#include "chromeos/services/secure_channel/public/cpp/shared/fake_authenticated_channel.h" #include "testing/gtest/include/gtest/gtest.h" namespace chromeos { namespace secure_channel { +namespace { + +const char kTestFeature[] = "testFeature"; + +class FakeBleInitiatorConnectionAttemptFactory + : public BleInitiatorConnectionAttempt::Factory { + public: + FakeBleInitiatorConnectionAttemptFactory( + FakeBleConnectionManager* expected_ble_connection_manager) + : expected_ble_connection_manager_(expected_ble_connection_manager) {} + + ~FakeBleInitiatorConnectionAttemptFactory() override = default; + + void set_expected_connection_attempt_details( + const ConnectionAttemptDetails& expected_connection_attempt_details) { + expected_connection_attempt_details_ = expected_connection_attempt_details; + } + + base::flat_map<ConnectionAttemptDetails, + FakeConnectionAttempt<BleInitiatorFailureType>*>& + details_to_active_attempt_map() { + return details_to_active_attempt_map_; + } + + size_t num_instances_created() const { return num_instances_created_; } + size_t num_instances_deleted() const { return num_instances_deleted_; } + + FakeConnectionAttempt<BleInitiatorFailureType>* last_created_instance() { + return last_created_instance_; + } + + private: + // BleInitiatorConnectionAttempt::Factory: + std::unique_ptr<ConnectionAttempt<BleInitiatorFailureType>> BuildInstance( + BleConnectionManager* ble_connection_manager, + ConnectionAttemptDelegate* delegate, + const ConnectionAttemptDetails& connection_attempt_details) override { + EXPECT_EQ(ConnectionRole::kInitiatorRole, + connection_attempt_details.connection_role()); + EXPECT_EQ(expected_ble_connection_manager_, ble_connection_manager); + EXPECT_EQ(*expected_connection_attempt_details_, + connection_attempt_details); + + auto instance = + std::make_unique<FakeConnectionAttempt<BleInitiatorFailureType>>( + delegate, connection_attempt_details, + base::BindOnce( + &FakeBleInitiatorConnectionAttemptFactory::OnAttemptDeleted, + base::Unretained(this), connection_attempt_details)); + + ++num_instances_created_; + last_created_instance_ = instance.get(); + details_to_active_attempt_map_[connection_attempt_details] = + last_created_instance_; + + return instance; + } + + void OnAttemptDeleted( + const ConnectionAttemptDetails& connection_attempt_details) { + size_t num_erased = + details_to_active_attempt_map_.erase(connection_attempt_details); + EXPECT_EQ(1u, num_erased); + ++num_instances_deleted_; + } + + FakeBleConnectionManager* expected_ble_connection_manager_; + base::Optional<ConnectionAttemptDetails> expected_connection_attempt_details_; + + base::flat_map<ConnectionAttemptDetails, + FakeConnectionAttempt<BleInitiatorFailureType>*> + details_to_active_attempt_map_; + + size_t num_instances_created_ = 0u; + size_t num_instances_deleted_ = 0u; + FakeConnectionAttempt<BleInitiatorFailureType>* last_created_instance_ = + nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakeBleInitiatorConnectionAttemptFactory); +}; + +class FakeBleListenerConnectionAttemptFactory + : public BleListenerConnectionAttempt::Factory { + public: + FakeBleListenerConnectionAttemptFactory( + FakeBleConnectionManager* expected_ble_connection_manager) + : expected_ble_connection_manager_(expected_ble_connection_manager) {} + + ~FakeBleListenerConnectionAttemptFactory() override = default; + + void set_expected_connection_attempt_details( + const ConnectionAttemptDetails& expected_connection_attempt_details) { + expected_connection_attempt_details_ = expected_connection_attempt_details; + } + + base::flat_map<ConnectionAttemptDetails, + FakeConnectionAttempt<BleListenerFailureType>*>& + details_to_active_attempt_map() { + return details_to_active_attempt_map_; + } + + size_t num_instances_created() const { return num_instances_created_; } + size_t num_instances_deleted() const { return num_instances_deleted_; } + + FakeConnectionAttempt<BleListenerFailureType>* last_created_instance() { + return last_created_instance_; + } + + private: + // BleListenerConnectionAttempt::Factory: + std::unique_ptr<ConnectionAttempt<BleListenerFailureType>> BuildInstance( + BleConnectionManager* ble_connection_manager, + ConnectionAttemptDelegate* delegate, + const ConnectionAttemptDetails& connection_attempt_details) override { + EXPECT_EQ(ConnectionRole::kListenerRole, + connection_attempt_details.connection_role()); + EXPECT_EQ(expected_ble_connection_manager_, ble_connection_manager); + EXPECT_EQ(*expected_connection_attempt_details_, + connection_attempt_details); + + auto instance = + std::make_unique<FakeConnectionAttempt<BleListenerFailureType>>( + delegate, connection_attempt_details, + base::BindOnce( + &FakeBleListenerConnectionAttemptFactory::OnAttemptDeleted, + base::Unretained(this), connection_attempt_details)); + + ++num_instances_created_; + last_created_instance_ = instance.get(); + details_to_active_attempt_map_[connection_attempt_details] = + last_created_instance_; + + return instance; + } + + void OnAttemptDeleted( + const ConnectionAttemptDetails& connection_attempt_details) { + size_t num_erased = + details_to_active_attempt_map_.erase(connection_attempt_details); + EXPECT_EQ(1u, num_erased); + ++num_instances_deleted_; + } + + FakeBleConnectionManager* expected_ble_connection_manager_; + base::Optional<ConnectionAttemptDetails> expected_connection_attempt_details_; + + base::flat_map<ConnectionAttemptDetails, + FakeConnectionAttempt<BleListenerFailureType>*> + details_to_active_attempt_map_; + + size_t num_instances_created_ = 0u; + size_t num_instances_deleted_ = 0u; + FakeConnectionAttempt<BleListenerFailureType>* last_created_instance_ = + nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakeBleListenerConnectionAttemptFactory); +}; + +class FakePendingBleInitiatorConnectionRequestFactory + : public PendingBleInitiatorConnectionRequest::Factory { + public: + FakePendingBleInitiatorConnectionRequestFactory() = default; + ~FakePendingBleInitiatorConnectionRequestFactory() override = default; + + void SetExpectationsForNextCall( + ClientConnectionParameters* expected_client_connection_parameters, + ConnectionPriority expected_connection_priority) { + expected_client_connection_parameters_ = + expected_client_connection_parameters; + expected_connection_priority_ = expected_connection_priority; + } + + FakePendingConnectionRequest<BleInitiatorFailureType>* + last_created_instance() { + return last_created_instance_; + } + + private: + // PendingBleInitiatorConnectionRequest::Factory: + std::unique_ptr<PendingConnectionRequest<BleInitiatorFailureType>> + BuildInstance( + std::unique_ptr<ClientConnectionParameters> client_connection_parameters, + ConnectionPriority connection_priority, + PendingConnectionRequestDelegate* delegate) override { + EXPECT_EQ(expected_client_connection_parameters_, + client_connection_parameters.get()); + EXPECT_EQ(*expected_connection_priority_, connection_priority); + + auto instance = + std::make_unique<FakePendingConnectionRequest<BleInitiatorFailureType>>( + delegate, connection_priority); + last_created_instance_ = instance.get(); + return instance; + } + + ClientConnectionParameters* expected_client_connection_parameters_ = nullptr; + base::Optional<ConnectionPriority> expected_connection_priority_; + + FakePendingConnectionRequest<BleInitiatorFailureType>* + last_created_instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakePendingBleInitiatorConnectionRequestFactory); +}; + +class FakePendingBleListenerConnectionRequestFactory + : public PendingBleListenerConnectionRequest::Factory { + public: + FakePendingBleListenerConnectionRequestFactory() = default; + ~FakePendingBleListenerConnectionRequestFactory() override = default; + + void SetExpectationsForNextCall( + ClientConnectionParameters* expected_client_connection_parameters, + ConnectionPriority expected_connection_priority) { + expected_client_connection_parameters_ = + expected_client_connection_parameters; + expected_connection_priority_ = expected_connection_priority; + } + + FakePendingConnectionRequest<BleListenerFailureType>* + last_created_instance() { + return last_created_instance_; + } + + private: + // PendingBleListenerConnectionRequest::Factory: + std::unique_ptr<PendingConnectionRequest<BleListenerFailureType>> + BuildInstance( + std::unique_ptr<ClientConnectionParameters> client_connection_parameters, + ConnectionPriority connection_priority, + PendingConnectionRequestDelegate* delegate) override { + EXPECT_EQ(expected_client_connection_parameters_, + client_connection_parameters.get()); + EXPECT_EQ(*expected_connection_priority_, connection_priority); + + auto instance = + std::make_unique<FakePendingConnectionRequest<BleListenerFailureType>>( + delegate, connection_priority); + last_created_instance_ = instance.get(); + return instance; + } + + ClientConnectionParameters* expected_client_connection_parameters_ = nullptr; + base::Optional<ConnectionPriority> expected_connection_priority_; + + FakePendingConnectionRequest<BleListenerFailureType>* last_created_instance_ = + nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakePendingBleListenerConnectionRequestFactory); +}; + +std::vector<std::unique_ptr<ClientConnectionParameters>> +GenerateFakeClientParameters(size_t num_to_generate) { + std::vector<std::unique_ptr<ClientConnectionParameters>> client_parameters; + + for (size_t i = 0; i < num_to_generate; ++i) { + // Generate a unique feature name. + std::stringstream ss; + ss << kTestFeature << "_" << i; + client_parameters.push_back( + std::make_unique<FakeClientConnectionParameters>(ss.str())); + } + + return client_parameters; +} + +std::vector<ClientConnectionParameters*> ClientParamsListToRawPtrs( + const std::vector<std::unique_ptr<ClientConnectionParameters>>& + unique_ptr_list) { + std::vector<ClientConnectionParameters*> raw_ptr_list; + std::transform(unique_ptr_list.begin(), unique_ptr_list.end(), + std::back_inserter(raw_ptr_list), + [](const auto& unique_ptr) { return unique_ptr.get(); }); + return raw_ptr_list; +} + +} // namespace + class SecureChannelPendingConnectionManagerImplTest : public testing::Test { protected: SecureChannelPendingConnectionManagerImplTest() = default; @@ -23,23 +313,513 @@ // testing::Test: void SetUp() override { fake_delegate_ = std::make_unique<FakePendingConnectionManagerDelegate>(); + fake_ble_connection_manager_ = std::make_unique<FakeBleConnectionManager>(); + + fake_ble_initiator_connection_attempt_factory_ = + std::make_unique<FakeBleInitiatorConnectionAttemptFactory>( + fake_ble_connection_manager_.get()); + BleInitiatorConnectionAttempt::Factory::SetFactoryForTesting( + fake_ble_initiator_connection_attempt_factory_.get()); + + fake_ble_listener_connection_attempt_factory_ = + std::make_unique<FakeBleListenerConnectionAttemptFactory>( + fake_ble_connection_manager_.get()); + BleListenerConnectionAttempt::Factory::SetFactoryForTesting( + fake_ble_listener_connection_attempt_factory_.get()); + + fake_pending_ble_initiator_connection_request_factory_ = + std::make_unique<FakePendingBleInitiatorConnectionRequestFactory>(); + PendingBleInitiatorConnectionRequest::Factory::SetFactoryForTesting( + fake_pending_ble_initiator_connection_request_factory_.get()); + + fake_pending_ble_listener_connection_request_factory_ = + std::make_unique<FakePendingBleListenerConnectionRequestFactory>(); + PendingBleListenerConnectionRequest::Factory::SetFactoryForTesting( + fake_pending_ble_listener_connection_request_factory_.get()); manager_ = PendingConnectionManagerImpl::Factory::Get()->BuildInstance( - fake_delegate_.get()); + fake_delegate_.get(), fake_ble_connection_manager_.get()); + } + + void TearDown() override { + BleInitiatorConnectionAttempt::Factory::SetFactoryForTesting(nullptr); + BleListenerConnectionAttempt::Factory::SetFactoryForTesting(nullptr); + PendingBleInitiatorConnectionRequest::Factory::SetFactoryForTesting( + nullptr); + PendingBleListenerConnectionRequest::Factory::SetFactoryForTesting(nullptr); + } + + void HandleCanceledRequestAndVerifyNoInstancesCreated( + const ConnectionAttemptDetails& connection_attempt_details, + ConnectionPriority connection_priority) { + FakeConnectionAttempt< + BleInitiatorFailureType>* last_ble_initiator_attempt_before_call = + fake_ble_initiator_connection_attempt_factory_->last_created_instance(); + FakeConnectionAttempt< + BleListenerFailureType>* last_ble_listener_attempt_before_call = + fake_ble_listener_connection_attempt_factory_->last_created_instance(); + FakePendingConnectionRequest<BleInitiatorFailureType>* + last_ble_initiator_request_before_call = + fake_pending_ble_initiator_connection_request_factory_ + ->last_created_instance(); + FakePendingConnectionRequest<BleListenerFailureType>* + last_ble_listener_request_before_call = + fake_pending_ble_listener_connection_request_factory_ + ->last_created_instance(); + + HandleConnectionRequest(connection_attempt_details, connection_priority, + true /* cancel_request_before_adding */); + + // Since the request was canceled before it was added, no new attempts or + // operations should have been created. + EXPECT_EQ(last_ble_initiator_attempt_before_call, + fake_ble_initiator_connection_attempt_factory_ + ->last_created_instance()); + EXPECT_EQ( + last_ble_listener_attempt_before_call, + fake_ble_listener_connection_attempt_factory_->last_created_instance()); + EXPECT_EQ(last_ble_initiator_request_before_call, + fake_pending_ble_initiator_connection_request_factory_ + ->last_created_instance()); + EXPECT_EQ(last_ble_listener_request_before_call, + fake_pending_ble_listener_connection_request_factory_ + ->last_created_instance()); + } + + void HandleRequestAndVerifyHandledByConnectionAttempt( + const ConnectionAttemptDetails& connection_attempt_details, + ConnectionPriority connection_priority) { + HandleConnectionRequest(connection_attempt_details, connection_priority, + false /* cancel_request_before_adding */); + switch (connection_attempt_details.connection_role()) { + case ConnectionRole::kInitiatorRole: { + FakeConnectionAttempt<BleInitiatorFailureType>* active_attempt = + GetActiveInitiatorAttempt(connection_attempt_details); + base::UnguessableToken token_for_last_init_request = + fake_pending_ble_initiator_connection_request_factory_ + ->last_created_instance() + ->GetRequestId(); + EXPECT_TRUE(base::ContainsKey(active_attempt->id_to_request_map(), + token_for_last_init_request)); + break; + } + + case ConnectionRole::kListenerRole: { + FakeConnectionAttempt<BleListenerFailureType>* active_attempt = + GetActiveListenerAttempt(connection_attempt_details); + base::UnguessableToken token_for_last_listen_request = + fake_pending_ble_listener_connection_request_factory_ + ->last_created_instance() + ->GetRequestId(); + EXPECT_TRUE(base::ContainsKey(active_attempt->id_to_request_map(), + token_for_last_listen_request)); + break; + } + } + } + + void FinishInitiatorAttemptWithoutConnection( + FakeConnectionAttempt<BleInitiatorFailureType>* attempt) { + ConnectionAttemptDetails details_for_attempt = + attempt->connection_attempt_details(); + EXPECT_EQ(GetActiveInitiatorAttempt(details_for_attempt), attempt); + + attempt->OnConnectionAttemptFinishedWithoutConnection(); + EXPECT_FALSE(GetActiveInitiatorAttempt(details_for_attempt)); + } + + void FinishListenerAttemptWithoutConnection( + FakeConnectionAttempt<BleListenerFailureType>* attempt) { + ConnectionAttemptDetails details_for_attempt = + attempt->connection_attempt_details(); + EXPECT_EQ(GetActiveListenerAttempt(details_for_attempt), attempt); + + attempt->OnConnectionAttemptFinishedWithoutConnection(); + EXPECT_FALSE(GetActiveListenerAttempt(details_for_attempt)); + } + + void FinishInitiatorAttemptWithConnection( + FakeConnectionAttempt<BleInitiatorFailureType>* attempt, + size_t num_extracted_clients_to_generate) { + ConnectionAttemptDetails details_for_attempt = + attempt->connection_attempt_details(); + EXPECT_EQ(GetActiveInitiatorAttempt(details_for_attempt), attempt); + + FakePendingConnectionManagerDelegate::ReceivedConnectionsList& + received_connections = fake_delegate_->received_connections_list(); + size_t num_received_connections_before_call = received_connections.size(); + + auto fake_authenticated_channel = + std::make_unique<FakeAuthenticatedChannel>(); + FakeAuthenticatedChannel* fake_authenticated_channel_raw = + fake_authenticated_channel.get(); + + std::vector<std::unique_ptr<ClientConnectionParameters>> clients_to_send = + GenerateFakeClientParameters(num_extracted_clients_to_generate); + std::vector<ClientConnectionParameters*> raw_client_list = + ClientParamsListToRawPtrs(clients_to_send); + + attempt->set_client_data_for_extraction(std::move(clients_to_send)); + attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel)); + + EXPECT_FALSE(GetActiveInitiatorAttempt(details_for_attempt)); + EXPECT_EQ(num_received_connections_before_call + 1u, + received_connections.size()); + EXPECT_EQ(fake_authenticated_channel_raw, + std::get<0>(received_connections.back()).get()); + EXPECT_EQ(raw_client_list, ClientParamsListToRawPtrs( + std::get<1>(received_connections.back()))); + EXPECT_EQ(details_for_attempt.GetAssociatedConnectionDetails(), + std::get<2>(received_connections.back())); + } + + void FinishListenerAttemptWithConnection( + FakeConnectionAttempt<BleListenerFailureType>* attempt, + size_t num_extracted_clients_to_generate) { + ConnectionAttemptDetails details_for_attempt = + attempt->connection_attempt_details(); + EXPECT_EQ(GetActiveListenerAttempt(details_for_attempt), attempt); + + FakePendingConnectionManagerDelegate::ReceivedConnectionsList& + received_connections = fake_delegate_->received_connections_list(); + size_t num_received_connections_before_call = received_connections.size(); + + auto fake_authenticated_channel = + std::make_unique<FakeAuthenticatedChannel>(); + FakeAuthenticatedChannel* fake_authenticated_channel_raw = + fake_authenticated_channel.get(); + + std::vector<std::unique_ptr<ClientConnectionParameters>> clients_to_send = + GenerateFakeClientParameters(num_extracted_clients_to_generate); + std::vector<ClientConnectionParameters*> raw_client_list = + ClientParamsListToRawPtrs(clients_to_send); + + attempt->set_client_data_for_extraction(std::move(clients_to_send)); + attempt->OnConnectionAttemptSucceeded(move(fake_authenticated_channel)); + + EXPECT_FALSE(GetActiveListenerAttempt(details_for_attempt)); + EXPECT_EQ(num_received_connections_before_call + 1u, + received_connections.size()); + EXPECT_EQ(fake_authenticated_channel_raw, + std::get<0>(received_connections.back()).get()); + EXPECT_EQ(raw_client_list, ClientParamsListToRawPtrs( + std::get<1>(received_connections.back()))); + EXPECT_EQ(details_for_attempt.GetAssociatedConnectionDetails(), + std::get<2>(received_connections.back())); + } + + FakeConnectionAttempt<BleInitiatorFailureType>* GetActiveInitiatorAttempt( + const ConnectionAttemptDetails& connection_attempt_details) { + return fake_ble_initiator_connection_attempt_factory_ + ->details_to_active_attempt_map()[connection_attempt_details]; + } + + FakeConnectionAttempt<BleListenerFailureType>* GetActiveListenerAttempt( + const ConnectionAttemptDetails& connection_attempt_details) { + return fake_ble_listener_connection_attempt_factory_ + ->details_to_active_attempt_map()[connection_attempt_details]; + } + + size_t GetNumInitiatorAttemptsCreated() { + return fake_ble_initiator_connection_attempt_factory_ + ->num_instances_created(); + } + + size_t GetNumListenerAttemptsCreated() { + return fake_ble_listener_connection_attempt_factory_ + ->num_instances_created(); + } + + size_t GetNumInitiatorAttemptsDeleted() { + return fake_ble_initiator_connection_attempt_factory_ + ->num_instances_deleted(); + } + + size_t GetNumListenerAttemptsDeleted() { + return fake_ble_listener_connection_attempt_factory_ + ->num_instances_deleted(); } private: + void HandleConnectionRequest( + const ConnectionAttemptDetails& connection_attempt_details, + ConnectionPriority connection_priority, + bool cancel_request_before_adding) { + auto fake_client_connection_parameters = + std::make_unique<FakeClientConnectionParameters>(kTestFeature); + FakeClientConnectionParameters* fake_client_connection_parameters_raw = + fake_client_connection_parameters.get(); + + if (cancel_request_before_adding) { + fake_client_connection_parameters->CancelClientRequest(); + } else { + switch (connection_attempt_details.connection_role()) { + case ConnectionRole::kInitiatorRole: + fake_ble_initiator_connection_attempt_factory_ + ->set_expected_connection_attempt_details( + connection_attempt_details); + fake_pending_ble_initiator_connection_request_factory_ + ->SetExpectationsForNextCall( + fake_client_connection_parameters_raw, connection_priority); + break; + + case ConnectionRole::kListenerRole: + fake_ble_listener_connection_attempt_factory_ + ->set_expected_connection_attempt_details( + connection_attempt_details); + fake_pending_ble_listener_connection_request_factory_ + ->SetExpectationsForNextCall( + fake_client_connection_parameters_raw, connection_priority); + break; + } + } + + manager_->HandleConnectionRequest( + connection_attempt_details, + std::move(fake_client_connection_parameters), connection_priority); + } + const base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<FakePendingConnectionManagerDelegate> fake_delegate_; + std::unique_ptr<FakeBleConnectionManager> fake_ble_connection_manager_; + + std::unique_ptr<FakeBleInitiatorConnectionAttemptFactory> + fake_ble_initiator_connection_attempt_factory_; + std::unique_ptr<FakeBleListenerConnectionAttemptFactory> + fake_ble_listener_connection_attempt_factory_; + std::unique_ptr<FakePendingBleInitiatorConnectionRequestFactory> + fake_pending_ble_initiator_connection_request_factory_; + std::unique_ptr<FakePendingBleListenerConnectionRequestFactory> + fake_pending_ble_listener_connection_request_factory_; std::unique_ptr<PendingConnectionManager> manager_; DISALLOW_COPY_AND_ASSIGN(SecureChannelPendingConnectionManagerImplTest); }; -TEST_F(SecureChannelPendingConnectionManagerImplTest, Test) { - // TODO(khorimoto): Add tests once implementation is complete. +TEST_F(SecureChannelPendingConnectionManagerImplTest, + CanceledRequestNotProcessed) { + // Initiator. + HandleCanceledRequestAndVerifyNoInstancesCreated( + ConnectionAttemptDetails("remoteDeviceId", "localDeviceId", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole), + ConnectionPriority::kLow); + + // Listener. + HandleCanceledRequestAndVerifyNoInstancesCreated( + ConnectionAttemptDetails("remoteDeviceId", "localDeviceId", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole), + ConnectionPriority::kLow); +} + +TEST_F(SecureChannelPendingConnectionManagerImplTest, + AttemptFinishesWithoutConnection_Initiator) { + ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole); + + // One request by itself. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kLow); + FinishInitiatorAttemptWithoutConnection(GetActiveInitiatorAttempt(details)); + EXPECT_EQ(1u, GetNumInitiatorAttemptsCreated()); + + // Two requests at the same time. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kMedium); + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kHigh); + FinishInitiatorAttemptWithoutConnection(GetActiveInitiatorAttempt(details)); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); +} + +TEST_F(SecureChannelPendingConnectionManagerImplTest, + AttemptFinishesWithoutConnection_Listener) { + ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole); + + // One request by itself. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kLow); + FinishListenerAttemptWithoutConnection(GetActiveListenerAttempt(details)); + EXPECT_EQ(1u, GetNumListenerAttemptsCreated()); + + // Two requests at the same time. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kMedium); + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kHigh); + FinishListenerAttemptWithoutConnection(GetActiveListenerAttempt(details)); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); +} + +TEST_F(SecureChannelPendingConnectionManagerImplTest, + AttemptSucceeds_Initiator) { + ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole); + + // One request by itself. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kLow); + FinishInitiatorAttemptWithConnection( + GetActiveInitiatorAttempt(details), + 1u /* num_extracted_clients_to_generate */); + EXPECT_EQ(1u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(1u, GetNumInitiatorAttemptsDeleted()); + + // Two requests at the same time. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kMedium); + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kHigh); + FinishInitiatorAttemptWithConnection( + GetActiveInitiatorAttempt(details), + 2u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); +} + +TEST_F(SecureChannelPendingConnectionManagerImplTest, + AttemptSucceeds_Listener) { + ConnectionAttemptDetails details("remoteDeviceId", "localDeviceId", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole); + + // One request by itself. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kLow); + FinishListenerAttemptWithConnection( + GetActiveListenerAttempt(details), + 1u /* num_extracted_clients_to_generate */); + EXPECT_EQ(1u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(1u, GetNumListenerAttemptsDeleted()); + + // Two requests at the same time. + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kMedium); + HandleRequestAndVerifyHandledByConnectionAttempt(details, + ConnectionPriority::kHigh); + FinishListenerAttemptWithConnection( + GetActiveListenerAttempt(details), + 2u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumListenerAttemptsDeleted()); +} + +TEST_F(SecureChannelPendingConnectionManagerImplTest, + SimultaneousRequestsToSameRemoteDevice) { + // Four ConnectionDetails objects, which all share the same remote device. + ConnectionAttemptDetails local_device_1_initiator_details( + "remoteDeviceId", "localDeviceId1", ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole); + ConnectionAttemptDetails local_device_1_listener_details( + "remoteDeviceId", "localDeviceId1", ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole); + ConnectionAttemptDetails local_device_2_initiator_details( + "remoteDeviceId", "localDeviceId2", ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole); + ConnectionAttemptDetails local_device_2_listener_details( + "remoteDeviceId", "localDeviceId2", ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole); + + // Register all of them. + HandleRequestAndVerifyHandledByConnectionAttempt( + local_device_1_initiator_details, ConnectionPriority::kLow); + HandleRequestAndVerifyHandledByConnectionAttempt( + local_device_1_listener_details, ConnectionPriority::kMedium); + HandleRequestAndVerifyHandledByConnectionAttempt( + local_device_2_initiator_details, ConnectionPriority::kHigh); + HandleRequestAndVerifyHandledByConnectionAttempt( + local_device_2_listener_details, ConnectionPriority::kLow); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(0u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(0u, GetNumInitiatorAttemptsDeleted()); + + // Find a connection, arbitrarily choosing |local_device_1_initiator_details| + // as the request which produces the connection. Since all 4 of these requests + // were to the same remote device, all 4 of them should be deleted when the + // connection is established. + FinishInitiatorAttemptWithConnection( + GetActiveInitiatorAttempt(local_device_1_initiator_details), + 4u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(2u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); +} + +TEST_F(SecureChannelPendingConnectionManagerImplTest, + SimultaneousRequestsToDifferentDevices) { + // Four ConnectionDetails objects, which all have different remote devices. + ConnectionAttemptDetails details_1("remoteDeviceId1", "localDeviceId1", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole); + ConnectionAttemptDetails details_2("remoteDeviceId2", "localDeviceId2", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole); + ConnectionAttemptDetails details_3("remoteDeviceId3", "localDeviceId3", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kInitiatorRole); + ConnectionAttemptDetails details_4("remoteDeviceId4", "localDeviceId4", + ConnectionMedium::kBluetoothLowEnergy, + ConnectionRole::kListenerRole); + + // Register all of them. + HandleRequestAndVerifyHandledByConnectionAttempt(details_1, + ConnectionPriority::kLow); + HandleRequestAndVerifyHandledByConnectionAttempt(details_2, + ConnectionPriority::kMedium); + HandleRequestAndVerifyHandledByConnectionAttempt(details_3, + ConnectionPriority::kHigh); + HandleRequestAndVerifyHandledByConnectionAttempt(details_4, + ConnectionPriority::kLow); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(0u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(0u, GetNumInitiatorAttemptsDeleted()); + + // Find a connection for |details_1|; only one ConnectionAttempt should have + // been deleted. + FinishInitiatorAttemptWithConnection( + GetActiveInitiatorAttempt(details_1), + 1u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(0u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(1u, GetNumInitiatorAttemptsDeleted()); + + // Find a connection for |details_2|. + FinishListenerAttemptWithConnection( + GetActiveListenerAttempt(details_2), + 1u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(1u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(1u, GetNumInitiatorAttemptsDeleted()); + + // |details_3|. + FinishInitiatorAttemptWithConnection( + GetActiveInitiatorAttempt(details_3), + 1u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(1u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); + + // |details_4|. + FinishListenerAttemptWithConnection( + GetActiveListenerAttempt(details_4), + 1u /* num_extracted_clients_to_generate */); + EXPECT_EQ(2u, GetNumListenerAttemptsCreated()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsCreated()); + EXPECT_EQ(2u, GetNumListenerAttemptsDeleted()); + EXPECT_EQ(2u, GetNumInitiatorAttemptsDeleted()); } } // namespace secure_channel
diff --git a/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc b/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc index c569826..9542a20 100644 --- a/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc +++ b/chromeos/services/secure_channel/public/cpp/client/secure_channel_client_impl_unittest.cc
@@ -21,7 +21,7 @@ #include "chromeos/services/secure_channel/public/cpp/client/fake_connection_attempt.h" #include "chromeos/services/secure_channel/public/mojom/constants.mojom.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" -#include "chromeos/services/secure_channel/secure_channel_impl.h" +#include "chromeos/services/secure_channel/secure_channel_initializer.h" #include "chromeos/services/secure_channel/secure_channel_service.h" #include "components/cryptauth/remote_device_test_util.h" #include "services/service_manager/public/cpp/test/test_connector_factory.h" @@ -35,16 +35,18 @@ const size_t kNumTestDevices = 5u; -class FakeSecureChannelImplFactory : public SecureChannelImpl::Factory { +class FakeSecureChannelInitializerFactory + : public SecureChannelInitializer::Factory { public: - explicit FakeSecureChannelImplFactory( + explicit FakeSecureChannelInitializerFactory( std::unique_ptr<FakeSecureChannel> fake_secure_channel) : fake_secure_channel_(std::move(fake_secure_channel)) {} - ~FakeSecureChannelImplFactory() override = default; + ~FakeSecureChannelInitializerFactory() override = default; - // SecureChannelImpl::Factory: - std::unique_ptr<SecureChannelBase> BuildInstance() override { + // SecureChannelInitializer::Factory: + std::unique_ptr<SecureChannelBase> BuildInstance( + scoped_refptr<base::TaskRunner> task_runner) override { EXPECT_TRUE(fake_secure_channel_); return std::move(fake_secure_channel_); } @@ -126,11 +128,11 @@ void SetUp() override { auto fake_secure_channel = std::make_unique<FakeSecureChannel>(); fake_secure_channel_ = fake_secure_channel.get(); - fake_secure_channel_impl_factory_ = - std::make_unique<FakeSecureChannelImplFactory>( + fake_secure_channel_initializer_factory_ = + std::make_unique<FakeSecureChannelInitializerFactory>( std::move(fake_secure_channel)); - SecureChannelImpl::Factory::SetFactoryForTesting( - fake_secure_channel_impl_factory_.get()); + SecureChannelInitializer::Factory::SetFactoryForTesting( + fake_secure_channel_initializer_factory_.get()); fake_connection_attempt_factory_ = std::make_unique<FakeConnectionAttemptFactory>(); @@ -158,7 +160,7 @@ } void TearDown() override { - SecureChannelImpl::Factory::SetFactoryForTesting(nullptr); + SecureChannelInitializer::Factory::SetFactoryForTesting(nullptr); } std::unique_ptr<FakeConnectionAttempt> CallListenForConnectionFromDevice( @@ -206,8 +208,8 @@ const base::test::ScopedTaskEnvironment scoped_task_environment_; FakeSecureChannel* fake_secure_channel_; - std::unique_ptr<FakeSecureChannelImplFactory> - fake_secure_channel_impl_factory_; + std::unique_ptr<FakeSecureChannelInitializerFactory> + fake_secure_channel_initializer_factory_; std::unique_ptr<FakeConnectionAttemptFactory> fake_connection_attempt_factory_; std::unique_ptr<FakeClientChannelImplFactory>
diff --git a/chromeos/services/secure_channel/secure_channel_impl.cc b/chromeos/services/secure_channel/secure_channel_impl.cc index 2fb07d92..f2bbdef 100644 --- a/chromeos/services/secure_channel/secure_channel_impl.cc +++ b/chromeos/services/secure_channel/secure_channel_impl.cc
@@ -12,10 +12,14 @@ #include "base/stl_util.h" #include "chromeos/components/proximity_auth/logging/logging.h" #include "chromeos/services/secure_channel/active_connection_manager_impl.h" +#include "chromeos/services/secure_channel/ble_connection_manager_impl.h" +#include "chromeos/services/secure_channel/ble_service_data_helper_impl.h" #include "chromeos/services/secure_channel/client_connection_parameters_impl.h" #include "chromeos/services/secure_channel/device_id_pair.h" #include "chromeos/services/secure_channel/pending_connection_manager_impl.h" #include "chromeos/services/secure_channel/public/cpp/shared/authenticated_channel.h" +#include "chromeos/services/secure_channel/timer_factory_impl.h" +#include "device/bluetooth/bluetooth_adapter.h" namespace chromeos { @@ -40,8 +44,9 @@ SecureChannelImpl::Factory::~Factory() = default; -std::unique_ptr<SecureChannelBase> SecureChannelImpl::Factory::BuildInstance() { - return base::WrapUnique(new SecureChannelImpl()); +std::unique_ptr<mojom::SecureChannel> SecureChannelImpl::Factory::BuildInstance( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) { + return base::WrapUnique(new SecureChannelImpl(bluetooth_adapter)); } SecureChannelImpl::ConnectionRequestWaitingForDisconnection:: @@ -64,15 +69,26 @@ SecureChannelImpl::ConnectionRequestWaitingForDisconnection:: ~ConnectionRequestWaitingForDisconnection() = default; -SecureChannelImpl::SecureChannelImpl() - : active_connection_manager_( - ActiveConnectionManagerImpl::Factory::Get()->BuildInstance( - this /* delegate */)), +SecureChannelImpl::SecureChannelImpl( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) + : timer_factory_(TimerFactoryImpl::Factory::Get()->BuildInstance()), + remote_device_cache_( + cryptauth::RemoteDeviceCache::Factory::Get()->BuildInstance()), + ble_service_data_helper_( + BleServiceDataHelperImpl::Factory::Get()->BuildInstance( + remote_device_cache_.get())), + ble_connection_manager_( + BleConnectionManagerImpl::Factory::Get()->BuildInstance( + bluetooth_adapter, + ble_service_data_helper_.get(), + timer_factory_.get())), pending_connection_manager_( PendingConnectionManagerImpl::Factory::Get()->BuildInstance( - this /* delegate */)), - remote_device_cache_( - cryptauth::RemoteDeviceCache::Factory::Get()->BuildInstance()) {} + this /* delegate */, + ble_connection_manager_.get())), + active_connection_manager_( + ActiveConnectionManagerImpl::Factory::Get()->BuildInstance( + this /* delegate */)) {} SecureChannelImpl::~SecureChannelImpl() = default;
diff --git a/chromeos/services/secure_channel/secure_channel_impl.h b/chromeos/services/secure_channel/secure_channel_impl.h index 41f8d072..6bd6447 100644 --- a/chromeos/services/secure_channel/secure_channel_impl.h +++ b/chromeos/services/secure_channel/secure_channel_impl.h
@@ -17,20 +17,27 @@ #include "chromeos/services/secure_channel/pending_connection_manager.h" #include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" -#include "chromeos/services/secure_channel/secure_channel_base.h" #include "components/cryptauth/remote_device_cache.h" +namespace device { +class BluetoothAdapter; +} // namespace device + namespace chromeos { namespace secure_channel { +class BleConnectionManager; +class BleServiceDataHelper; +class TimerFactory; + // Concrete SecureChannelImpl implementation, which contains three pieces: // (1) PendingConnectionManager: Attempts to create connections to remote // devices. // (2) ActiveConnectionManager: Maintains connections to remote devices, sharing // a single connection with multiple clients when appropriate. // (3) RemoteDeviceCache: Caches devices within this service. -class SecureChannelImpl : public SecureChannelBase, +class SecureChannelImpl : public mojom::SecureChannel, public ActiveConnectionManager::Delegate, public PendingConnectionManager::Delegate { public: @@ -39,7 +46,8 @@ static Factory* Get(); static void SetFactoryForTesting(Factory* test_factory); virtual ~Factory(); - virtual std::unique_ptr<SecureChannelBase> BuildInstance(); + virtual std::unique_ptr<mojom::SecureChannel> BuildInstance( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); private: static Factory* test_factory_; @@ -48,7 +56,7 @@ ~SecureChannelImpl() override; private: - SecureChannelImpl(); + SecureChannelImpl(scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); enum class InvalidRemoteDeviceReason { kInvalidPublicKey, kInvalidPsk }; @@ -135,9 +143,12 @@ ApiFunctionName api_fn_name, const cryptauth::RemoteDevice& device); - std::unique_ptr<ActiveConnectionManager> active_connection_manager_; - std::unique_ptr<PendingConnectionManager> pending_connection_manager_; + std::unique_ptr<TimerFactory> timer_factory_; std::unique_ptr<cryptauth::RemoteDeviceCache> remote_device_cache_; + std::unique_ptr<BleServiceDataHelper> ble_service_data_helper_; + std::unique_ptr<BleConnectionManager> ble_connection_manager_; + std::unique_ptr<PendingConnectionManager> pending_connection_manager_; + std::unique_ptr<ActiveConnectionManager> active_connection_manager_; base::flat_map<ConnectionDetails, std::vector<ConnectionRequestWaitingForDisconnection>>
diff --git a/chromeos/services/secure_channel/secure_channel_initializer.cc b/chromeos/services/secure_channel/secure_channel_initializer.cc new file mode 100644 index 0000000..317d5eb --- /dev/null +++ b/chromeos/services/secure_channel/secure_channel_initializer.cc
@@ -0,0 +1,148 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/secure_channel/secure_channel_initializer.h" + +#include "base/memory/ptr_util.h" +#include "base/no_destructor.h" +#include "chromeos/components/proximity_auth/logging/logging.h" +#include "chromeos/services/secure_channel/secure_channel_impl.h" +#include "device/bluetooth/bluetooth_adapter_factory.h" + +namespace chromeos { + +namespace secure_channel { + +// static +SecureChannelInitializer::Factory* + SecureChannelInitializer::Factory::test_factory_ = nullptr; + +// static +SecureChannelInitializer::Factory* SecureChannelInitializer::Factory::Get() { + if (test_factory_) + return test_factory_; + + static base::NoDestructor<Factory> factory; + return factory.get(); +} + +// static +void SecureChannelInitializer::Factory::SetFactoryForTesting( + Factory* test_factory) { + test_factory_ = test_factory; +} + +SecureChannelInitializer::Factory::~Factory() = default; + +std::unique_ptr<SecureChannelBase> +SecureChannelInitializer::Factory::BuildInstance( + scoped_refptr<base::TaskRunner> task_runner) { + return base::WrapUnique(new SecureChannelInitializer(task_runner)); +} + +SecureChannelInitializer::ConnectionRequestArgs::ConnectionRequestArgs( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + mojom::ConnectionDelegatePtr delegate, + bool is_listen_request) + : device_to_connect(device_to_connect), + local_device(local_device), + feature(feature), + connection_priority(connection_priority), + delegate(std::move(delegate)), + is_listen_request(is_listen_request) {} + +SecureChannelInitializer::ConnectionRequestArgs::~ConnectionRequestArgs() = + default; + +SecureChannelInitializer::SecureChannelInitializer( + scoped_refptr<base::TaskRunner> task_runner) + : weak_ptr_factory_(this) { + PA_LOG(INFO) << "SecureChannelInitializer::SecureChannelInitializer(): " + << "Fetching Bluetooth adapter. All requests received before " + << "the adapter is fetched will be queued."; + + // device::BluetoothAdapterFactory::SetAdapterForTesting() causes the + // GetAdapter() callback to return synchronously. Thus, post the GetAdapter() + // call as a task to ensure that it is returned asynchronously, even in tests. + task_runner->PostTask( + FROM_HERE, + base::Bind( + device::BluetoothAdapterFactory::GetAdapter, + base::Bind(&SecureChannelInitializer::OnBluetoothAdapterReceived, + weak_ptr_factory_.GetWeakPtr()))); +} + +SecureChannelInitializer::~SecureChannelInitializer() = default; + +void SecureChannelInitializer::ListenForConnectionFromDevice( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + mojom::ConnectionDelegatePtr delegate) { + if (secure_channel_impl_) { + secure_channel_impl_->ListenForConnectionFromDevice( + device_to_connect, local_device, feature, connection_priority, + std::move(delegate)); + return; + } + + pending_args_.push(std::make_unique<ConnectionRequestArgs>( + device_to_connect, local_device, feature, connection_priority, + std::move(delegate), true /* is_listen_request */)); +} + +void SecureChannelInitializer::InitiateConnectionToDevice( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + mojom::ConnectionDelegatePtr delegate) { + if (secure_channel_impl_) { + secure_channel_impl_->InitiateConnectionToDevice( + device_to_connect, local_device, feature, connection_priority, + std::move(delegate)); + return; + } + + pending_args_.push(std::make_unique<ConnectionRequestArgs>( + device_to_connect, local_device, feature, connection_priority, + std::move(delegate), false /* is_listen_request */)); +} + +void SecureChannelInitializer::OnBluetoothAdapterReceived( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) { + PA_LOG(INFO) << "SecureChannelInitializer::OnBluetoothAdapterReceived(): " + << "Bluetooth adapter has been fetched. Passing all queued " + << "requests to the service."; + + secure_channel_impl_ = + SecureChannelImpl::Factory::Get()->BuildInstance(bluetooth_adapter); + + while (!pending_args_.empty()) { + std::unique_ptr<ConnectionRequestArgs> args_to_pass = + std::move(pending_args_.front()); + pending_args_.pop(); + + if (args_to_pass->is_listen_request) { + secure_channel_impl_->ListenForConnectionFromDevice( + args_to_pass->device_to_connect, args_to_pass->local_device, + args_to_pass->feature, args_to_pass->connection_priority, + std::move(args_to_pass->delegate)); + continue; + } + + secure_channel_impl_->InitiateConnectionToDevice( + args_to_pass->device_to_connect, args_to_pass->local_device, + args_to_pass->feature, args_to_pass->connection_priority, + std::move(args_to_pass->delegate)); + } +} + +} // namespace secure_channel + +} // namespace chromeos
diff --git a/chromeos/services/secure_channel/secure_channel_initializer.h b/chromeos/services/secure_channel/secure_channel_initializer.h new file mode 100644 index 0000000..ad64bc2 --- /dev/null +++ b/chromeos/services/secure_channel/secure_channel_initializer.h
@@ -0,0 +1,99 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_SECURE_CHANNEL_SECURE_CHANNEL_INITIALIZER_H_ +#define CHROMEOS_SERVICES_SECURE_CHANNEL_SECURE_CHANNEL_INITIALIZER_H_ + +#include <memory> +#include <queue> +#include <string> + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/threading/thread_task_runner_handle.h" +#include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" +#include "chromeos/services/secure_channel/secure_channel_base.h" + +namespace device { +class BluetoothAdapter; +} // namespace device + +namespace chromeos { + +namespace secure_channel { + +// SecureChannelBase implementation which fetches the Bluetooth adapter, then +// initializes the rest of the service. Initialization of the service is +// asynchronous due to the need to fetch the Bluetooth adapter asynchronously. +// This class allows clients to make requests of the service before it is fully +// initializes; queued requests are then passed on to the rest of the service +// once initialization completes. +class SecureChannelInitializer : public SecureChannelBase { + public: + class Factory { + public: + static Factory* Get(); + static void SetFactoryForTesting(Factory* test_factory); + virtual ~Factory(); + virtual std::unique_ptr<SecureChannelBase> BuildInstance( + scoped_refptr<base::TaskRunner> task_runner = + base::ThreadTaskRunnerHandle::Get()); + + private: + static Factory* test_factory_; + }; + + ~SecureChannelInitializer() override; + + private: + SecureChannelInitializer(scoped_refptr<base::TaskRunner> task_runner); + + struct ConnectionRequestArgs { + ConnectionRequestArgs(const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + mojom::ConnectionDelegatePtr delegate, + bool is_listen_request); + ~ConnectionRequestArgs(); + + cryptauth::RemoteDevice device_to_connect; + cryptauth::RemoteDevice local_device; + std::string feature; + ConnectionPriority connection_priority; + mojom::ConnectionDelegatePtr delegate; + bool is_listen_request; + }; + + // mojom::SecureChannel: + void ListenForConnectionFromDevice( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + mojom::ConnectionDelegatePtr delegate) override; + void InitiateConnectionToDevice( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + mojom::ConnectionDelegatePtr delegate) override; + + void OnBluetoothAdapterReceived( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); + + std::queue<std::unique_ptr<ConnectionRequestArgs>> pending_args_; + std::unique_ptr<mojom::SecureChannel> secure_channel_impl_; + + base::WeakPtrFactory<SecureChannelInitializer> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(SecureChannelInitializer); +}; + +} // namespace secure_channel + +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_SECURE_CHANNEL_SECURE_CHANNEL_INITIALIZER_H_
diff --git a/chromeos/services/secure_channel/secure_channel_service.cc b/chromeos/services/secure_channel/secure_channel_service.cc index 5a83da1..605a57d 100644 --- a/chromeos/services/secure_channel/secure_channel_service.cc +++ b/chromeos/services/secure_channel/secure_channel_service.cc
@@ -5,7 +5,7 @@ #include "chromeos/services/secure_channel/secure_channel_service.h" #include "chromeos/components/proximity_auth/logging/logging.h" -#include "chromeos/services/secure_channel/secure_channel_impl.h" +#include "chromeos/services/secure_channel/secure_channel_initializer.h" namespace chromeos { @@ -24,7 +24,7 @@ void SecureChannelService::OnStart() { PA_LOG(INFO) << "SecureChannelService::OnStart()"; - secure_channel_ = SecureChannelImpl::Factory::Get()->BuildInstance(); + secure_channel_ = SecureChannelInitializer::Factory::Get()->BuildInstance(); registry_.AddInterface( base::BindRepeating(&SecureChannelBase::BindRequest,
diff --git a/chromeos/services/secure_channel/secure_channel_service_unittest.cc b/chromeos/services/secure_channel/secure_channel_service_unittest.cc index c9f97d7..b939589f 100644 --- a/chromeos/services/secure_channel/secure_channel_service_unittest.cc +++ b/chromeos/services/secure_channel/secure_channel_service_unittest.cc
@@ -11,20 +11,30 @@ #include "base/optional.h" #include "base/run_loop.h" #include "base/test/scoped_task_environment.h" +#include "base/test/test_simple_task_runner.h" #include "chromeos/services/secure_channel/active_connection_manager_impl.h" +#include "chromeos/services/secure_channel/ble_connection_manager_impl.h" +#include "chromeos/services/secure_channel/ble_service_data_helper_impl.h" #include "chromeos/services/secure_channel/client_connection_parameters_impl.h" #include "chromeos/services/secure_channel/fake_active_connection_manager.h" +#include "chromeos/services/secure_channel/fake_ble_connection_manager.h" +#include "chromeos/services/secure_channel/fake_ble_service_data_helper.h" #include "chromeos/services/secure_channel/fake_client_connection_parameters.h" #include "chromeos/services/secure_channel/fake_connection_delegate.h" #include "chromeos/services/secure_channel/fake_pending_connection_manager.h" +#include "chromeos/services/secure_channel/fake_timer_factory.h" #include "chromeos/services/secure_channel/pending_connection_manager_impl.h" #include "chromeos/services/secure_channel/public/cpp/shared/connection_priority.h" #include "chromeos/services/secure_channel/public/cpp/shared/fake_authenticated_channel.h" #include "chromeos/services/secure_channel/public/mojom/constants.mojom.h" #include "chromeos/services/secure_channel/public/mojom/secure_channel.mojom.h" +#include "chromeos/services/secure_channel/secure_channel_initializer.h" #include "chromeos/services/secure_channel/secure_channel_service.h" +#include "chromeos/services/secure_channel/timer_factory_impl.h" #include "components/cryptauth/remote_device_cache.h" #include "components/cryptauth/remote_device_test_util.h" +#include "device/bluetooth/bluetooth_adapter_factory.h" +#include "device/bluetooth/test/mock_bluetooth_adapter.h" #include "services/service_manager/public/cpp/test/test_connector_factory.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,6 +46,155 @@ const size_t kNumTestDevices = 6; +class FakeTimerFactoryFactory : public TimerFactoryImpl::Factory { + public: + FakeTimerFactoryFactory() = default; + ~FakeTimerFactoryFactory() override = default; + + FakeTimerFactory* instance() { return instance_; } + + private: + // TimerFactoryImpl::Factory: + std::unique_ptr<TimerFactory> BuildInstance() override { + EXPECT_FALSE(instance_); + auto instance = std::make_unique<FakeTimerFactory>(); + instance_ = instance.get(); + return instance; + } + + FakeTimerFactory* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakeTimerFactoryFactory); +}; + +class TestRemoteDeviceCacheFactory + : public cryptauth::RemoteDeviceCache::Factory { + public: + TestRemoteDeviceCacheFactory() = default; + ~TestRemoteDeviceCacheFactory() override = default; + + cryptauth::RemoteDeviceCache* instance() { return instance_; } + + private: + // cryptauth::RemoteDeviceCache::Factory: + std::unique_ptr<cryptauth::RemoteDeviceCache> BuildInstance() override { + EXPECT_FALSE(instance_); + auto instance = cryptauth::RemoteDeviceCache::Factory::BuildInstance(); + instance_ = instance.get(); + return instance; + } + + cryptauth::RemoteDeviceCache* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(TestRemoteDeviceCacheFactory); +}; + +class FakeBleServiceDataHelperFactory + : public BleServiceDataHelperImpl::Factory { + public: + FakeBleServiceDataHelperFactory( + TestRemoteDeviceCacheFactory* test_remote_device_cache_factory) + : test_remote_device_cache_factory_(test_remote_device_cache_factory) {} + + ~FakeBleServiceDataHelperFactory() override = default; + + FakeBleServiceDataHelper* instance() { return instance_; } + + private: + // BleServiceDataHelperImpl::Factory: + std::unique_ptr<BleServiceDataHelper> BuildInstance( + cryptauth::RemoteDeviceCache* remote_device_cache) override { + EXPECT_FALSE(instance_); + EXPECT_EQ(test_remote_device_cache_factory_->instance(), + remote_device_cache); + + auto instance = std::make_unique<FakeBleServiceDataHelper>(); + instance_ = instance.get(); + return instance; + } + + TestRemoteDeviceCacheFactory* test_remote_device_cache_factory_; + + FakeBleServiceDataHelper* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakeBleServiceDataHelperFactory); +}; + +class FakeBleConnectionManagerFactory + : public BleConnectionManagerImpl::Factory { + public: + FakeBleConnectionManagerFactory( + device::BluetoothAdapter* expected_bluetooth_adapter, + FakeBleServiceDataHelperFactory* fake_ble_service_data_helper_factory, + FakeTimerFactoryFactory* fake_timer_factory_factory) + : expected_bluetooth_adapter_(expected_bluetooth_adapter), + fake_ble_service_data_helper_factory_( + fake_ble_service_data_helper_factory), + fake_timer_factory_factory_(fake_timer_factory_factory) {} + + ~FakeBleConnectionManagerFactory() override = default; + + FakeBleConnectionManager* instance() { return instance_; } + + private: + // BleConnectionManagerImpl::Factory: + std::unique_ptr<BleConnectionManager> BuildInstance( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter, + BleServiceDataHelper* ble_service_data_helper, + TimerFactory* timer_factory) override { + EXPECT_FALSE(instance_); + EXPECT_EQ(expected_bluetooth_adapter_, bluetooth_adapter.get()); + EXPECT_EQ(fake_ble_service_data_helper_factory_->instance(), + ble_service_data_helper); + EXPECT_EQ(fake_timer_factory_factory_->instance(), timer_factory); + + auto instance = std::make_unique<FakeBleConnectionManager>(); + instance_ = instance.get(); + return instance; + } + + device::BluetoothAdapter* expected_bluetooth_adapter_; + FakeBleServiceDataHelperFactory* fake_ble_service_data_helper_factory_; + FakeTimerFactoryFactory* fake_timer_factory_factory_; + + FakeBleConnectionManager* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakeBleConnectionManagerFactory); +}; + +class FakePendingConnectionManagerFactory + : public PendingConnectionManagerImpl::Factory { + public: + FakePendingConnectionManagerFactory( + FakeBleConnectionManagerFactory* fake_ble_connection_manager_factory) + : fake_ble_connection_manager_factory_( + fake_ble_connection_manager_factory) {} + + ~FakePendingConnectionManagerFactory() override = default; + + FakePendingConnectionManager* instance() { return instance_; } + + private: + // PendingConnectionManagerImpl::Factory: + std::unique_ptr<PendingConnectionManager> BuildInstance( + PendingConnectionManager::Delegate* delegate, + BleConnectionManager* ble_connection_manager) override { + EXPECT_FALSE(instance_); + EXPECT_EQ(fake_ble_connection_manager_factory_->instance(), + ble_connection_manager); + + auto instance = std::make_unique<FakePendingConnectionManager>(delegate); + instance_ = instance.get(); + return instance; + } + + FakeBleConnectionManagerFactory* fake_ble_connection_manager_factory_; + + FakePendingConnectionManager* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(FakePendingConnectionManagerFactory); +}; + class FakeActiveConnectionManagerFactory : public ActiveConnectionManagerImpl::Factory { public: @@ -45,6 +204,7 @@ FakeActiveConnectionManager* instance() { return instance_; } private: + // ActiveConnectionManagerImpl::Factory: std::unique_ptr<ActiveConnectionManager> BuildInstance( ActiveConnectionManager::Delegate* delegate) override { EXPECT_FALSE(instance_); @@ -58,26 +218,31 @@ DISALLOW_COPY_AND_ASSIGN(FakeActiveConnectionManagerFactory); }; -class FakePendingConnectionManagerFactory - : public PendingConnectionManagerImpl::Factory { +class TestSecureChannelInitializerFactory + : public SecureChannelInitializer::Factory { public: - FakePendingConnectionManagerFactory() = default; - ~FakePendingConnectionManagerFactory() override = default; + TestSecureChannelInitializerFactory( + scoped_refptr<base::TestSimpleTaskRunner> test_task_runner) + : test_task_runner_(test_task_runner) {} - FakePendingConnectionManager* instance() { return instance_; } + ~TestSecureChannelInitializerFactory() override = default; private: - std::unique_ptr<PendingConnectionManager> BuildInstance( - PendingConnectionManager::Delegate* delegate) override { + // SecureChannelInitializer::Factory: + std::unique_ptr<SecureChannelBase> BuildInstance( + scoped_refptr<base::TaskRunner> task_runner) override { EXPECT_FALSE(instance_); - auto instance = std::make_unique<FakePendingConnectionManager>(delegate); + auto instance = + SecureChannelInitializer::Factory::BuildInstance(test_task_runner_); instance_ = instance.get(); return instance; } - FakePendingConnectionManager* instance_ = nullptr; + scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; - DISALLOW_COPY_AND_ASSIGN(FakePendingConnectionManagerFactory); + SecureChannelBase* instance_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(TestSecureChannelInitializerFactory); }; class FakeClientConnectionParametersFactory @@ -106,6 +271,7 @@ } private: + // ClientConnectionParametersImpl::Factory: std::unique_ptr<ClientConnectionParameters> BuildInstance( const std::string& feature, mojom::ConnectionDelegatePtr connection_delegate_ptr) override { @@ -142,27 +308,6 @@ DISALLOW_COPY_AND_ASSIGN(FakeClientConnectionParametersFactory); }; -class TestRemoteDeviceCacheFactory - : public cryptauth::RemoteDeviceCache::Factory { - public: - TestRemoteDeviceCacheFactory() = default; - ~TestRemoteDeviceCacheFactory() override = default; - - cryptauth::RemoteDeviceCache* instance() { return instance_; } - - private: - std::unique_ptr<cryptauth::RemoteDeviceCache> BuildInstance() override { - EXPECT_FALSE(instance_); - auto instance = cryptauth::RemoteDeviceCache::Factory::BuildInstance(); - instance_ = instance.get(); - return instance; - } - - cryptauth::RemoteDeviceCache* instance_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(TestRemoteDeviceCacheFactory); -}; - } // namespace class SecureChannelServiceTest : public testing::Test { @@ -174,26 +319,56 @@ // testing::Test: void SetUp() override { - fake_active_connection_manager_factory_ = - std::make_unique<FakeActiveConnectionManagerFactory>(); - ActiveConnectionManagerImpl::Factory::SetFactoryForTesting( - fake_active_connection_manager_factory_.get()); + mock_adapter_ = + base::MakeRefCounted<testing::NiceMock<device::MockBluetoothAdapter>>(); + device::BluetoothAdapterFactory::SetAdapterForTesting(mock_adapter_); - fake_pending_connection_manager_factory_ = - std::make_unique<FakePendingConnectionManagerFactory>(); - PendingConnectionManagerImpl::Factory::SetFactoryForTesting( - fake_pending_connection_manager_factory_.get()); + test_task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>(); - fake_client_connection_parameters_factory_ = - std::make_unique<FakeClientConnectionParametersFactory>(); - ClientConnectionParametersImpl::Factory::SetFactoryForTesting( - fake_client_connection_parameters_factory_.get()); + fake_timer_factory_factory_ = std::make_unique<FakeTimerFactoryFactory>(); + TimerFactoryImpl::Factory::SetFactoryForTesting( + fake_timer_factory_factory_.get()); test_remote_device_cache_factory_ = std::make_unique<TestRemoteDeviceCacheFactory>(); cryptauth::RemoteDeviceCache::Factory::SetFactoryForTesting( test_remote_device_cache_factory_.get()); + fake_ble_service_data_helper_factory_ = + std::make_unique<FakeBleServiceDataHelperFactory>( + test_remote_device_cache_factory_.get()); + BleServiceDataHelperImpl::Factory::SetFactoryForTesting( + fake_ble_service_data_helper_factory_.get()); + + fake_ble_connection_manager_factory_ = + std::make_unique<FakeBleConnectionManagerFactory>( + mock_adapter_.get(), fake_ble_service_data_helper_factory_.get(), + fake_timer_factory_factory_.get()); + BleConnectionManagerImpl::Factory::SetFactoryForTesting( + fake_ble_connection_manager_factory_.get()); + + fake_pending_connection_manager_factory_ = + std::make_unique<FakePendingConnectionManagerFactory>( + fake_ble_connection_manager_factory_.get()); + PendingConnectionManagerImpl::Factory::SetFactoryForTesting( + fake_pending_connection_manager_factory_.get()); + + fake_active_connection_manager_factory_ = + std::make_unique<FakeActiveConnectionManagerFactory>(); + ActiveConnectionManagerImpl::Factory::SetFactoryForTesting( + fake_active_connection_manager_factory_.get()); + + test_secure_channel_initializer_factory_ = + std::make_unique<TestSecureChannelInitializerFactory>( + test_task_runner_); + SecureChannelInitializer::Factory::SetFactoryForTesting( + test_secure_channel_initializer_factory_.get()); + + fake_client_connection_parameters_factory_ = + std::make_unique<FakeClientConnectionParametersFactory>(); + ClientConnectionParametersImpl::Factory::SetFactoryForTesting( + fake_client_connection_parameters_factory_.get()); + connector_factory_ = service_manager::TestConnectorFactory::CreateForUniqueService( std::make_unique<SecureChannelService>()); @@ -203,10 +378,34 @@ } void TearDown() override { - ActiveConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); - PendingConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); - ClientConnectionParametersImpl::Factory::SetFactoryForTesting(nullptr); + TimerFactoryImpl::Factory::SetFactoryForTesting(nullptr); cryptauth::RemoteDeviceCache::Factory::SetFactoryForTesting(nullptr); + BleServiceDataHelperImpl::Factory::SetFactoryForTesting(nullptr); + BleConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); + PendingConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); + ActiveConnectionManagerImpl::Factory::SetFactoryForTesting(nullptr); + SecureChannelInitializer::Factory::SetFactoryForTesting(nullptr); + ClientConnectionParametersImpl::Factory::SetFactoryForTesting(nullptr); + } + + void CallListenForConnectionFromDeviceAndVerifyInitializationNotComplete( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority) { + AttemptConnectionPreInitialization(device_to_connect, local_device, feature, + connection_priority, + true /* is_listener */); + } + + void CallInitiateConnectionToDeviceAndVerifyInitializationNotComplete( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority) { + AttemptConnectionPreInitialization(device_to_connect, local_device, feature, + connection_priority, + false /* is_listener */); } void CallListenForConnectionFromDeviceAndVerifyRejection( @@ -220,7 +419,7 @@ expected_failure_reason, true /* is_listener */); } - void CallInitiateConnectionFromDeviceAndVerifyRejection( + void CallInitiateConnectionToDeviceAndVerifyRejection( const cryptauth::RemoteDevice& device_to_connect, const cryptauth::RemoteDevice& local_device, const std::string& feature, @@ -241,7 +440,7 @@ true /* is_listener */); } - void CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + void CallInitiateConnectionToDeviceAndVerifyPendingConnection( const cryptauth::RemoteDevice& device_to_connect, const cryptauth::RemoteDevice& local_device, const std::string& feature, @@ -261,7 +460,7 @@ true /* is_listener */); } - void CallInitiateConnectionFromDeviceAndVerifyActiveConnection( + void CallInitiateConnectionToDeviceAndVerifyActiveConnection( const cryptauth::RemoteDevice& device_to_connect, const cryptauth::RemoteDevice& local_device, const std::string& feature, @@ -283,7 +482,7 @@ } base::UnguessableToken - CallInitiateConnectionFromDeviceAndVerifyStillDisconnecting( + CallInitiateConnectionToDeviceAndVerifyStillDisconnecting( const cryptauth::RemoteDevice& device_to_connect, const cryptauth::RemoteDevice& local_device, const std::string& feature, @@ -347,13 +546,18 @@ if (pending_metadata_list.empty()) return; + size_t num_handled_requests_start_index = + fake_pending_connection_manager()->handled_requests().size() - + pending_metadata_list.size(); + for (size_t i = 0; i < pending_metadata_list.size(); ++i) { VerifyHandledRequest( DeviceIdPair(device_id, std::get<1>(pending_metadata_list[i])), std::get<0>(pending_metadata_list[i]), std::get<2>(pending_metadata_list[i]), std::get<3>(pending_metadata_list[i]), - connection_details.connection_medium(), i); + connection_details.connection_medium(), + num_handled_requests_start_index + i); } } @@ -364,6 +568,28 @@ ->CancelClientRequest(); } + void FinishInitialization() { + // The PendingConnectionManager should not have yet been created. + EXPECT_FALSE(fake_pending_connection_manager()); + + // The service is not expected to start up until at least one API call is + // made on its interface. + CallInitiateConnectionToDeviceAndVerifyInitializationNotComplete( + test_devices()[4], test_devices()[5], "feature", + ConnectionPriority::kLow); + CallListenForConnectionFromDeviceAndVerifyInitializationNotComplete( + test_devices()[4], test_devices()[5], "feature", + ConnectionPriority::kLow); + + EXPECT_TRUE(test_task_runner_->HasPendingTask()); + test_task_runner_->RunUntilIdle(); + + // The PendingConnectionManager should have been created, and all pending + // requests should have been passed to it. + EXPECT_EQ(num_queued_requests_before_initialization_, + fake_pending_connection_manager()->handled_requests().size()); + } + const cryptauth::RemoteDeviceList& test_devices() { return test_devices_; } private: @@ -484,8 +710,9 @@ ConnectionPriority connection_priority, mojom::ConnectionAttemptFailureReason expected_failure_reason, bool is_listener) { - auto id = AttemptConnection(device_to_connect, local_device, feature, - connection_priority, is_listener); + auto id = AttemptConnectionPostInitialization( + device_to_connect, local_device, feature, connection_priority, + is_listener); EXPECT_EQ(expected_failure_reason, GetFailureReasonForRequest(id)); } @@ -505,8 +732,9 @@ const std::string& feature, ConnectionPriority connection_priority, bool is_listener) { - auto id = AttemptConnection(device_to_connect, local_device, feature, - connection_priority, is_listener); + auto id = AttemptConnectionPostInitialization( + device_to_connect, local_device, feature, connection_priority, + is_listener); // |device_to_connect| should be in the cache. EXPECT_TRUE(cryptauth::IsSameDevice(device_to_connect, @@ -521,7 +749,7 @@ return id; } - base::UnguessableToken AttemptConnection( + base::UnguessableToken AttemptConnectionPostInitialization( const cryptauth::RemoteDevice& device_to_connect, const cryptauth::RemoteDevice& local_device, const std::string& feature, @@ -530,6 +758,46 @@ base::UnguessableToken last_id_before_call = fake_client_connection_parameters_factory_->last_created_instance_id(); + AttemptConnection(device_to_connect, local_device, feature, + connection_priority, is_listener); + + base::UnguessableToken id_generated_by_call = + fake_client_connection_parameters_factory_->last_created_instance_id(); + + // The request should have caused a FakeClientConnectionParameters to be + // created. + EXPECT_NE(last_id_before_call, id_generated_by_call); + + return id_generated_by_call; + } + + void AttemptConnectionPreInitialization( + const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + bool is_listener) { + // Should not have been any ClientConnectionParameters before the attempt. + EXPECT_TRUE( + fake_client_connection_parameters_factory_->last_created_instance_id() + .is_empty()); + + AttemptConnection(device_to_connect, local_device, feature, + connection_priority, is_listener); + + // Should still not have been any after the attempt. + EXPECT_TRUE( + fake_client_connection_parameters_factory_->last_created_instance_id() + .is_empty()); + + ++num_queued_requests_before_initialization_; + } + + void AttemptConnection(const cryptauth::RemoteDevice& device_to_connect, + const cryptauth::RemoteDevice& local_device, + const std::string& feature, + ConnectionPriority connection_priority, + bool is_listener) { FakeConnectionDelegate fake_connection_delegate; if (is_listener) { @@ -541,16 +809,8 @@ device_to_connect, local_device, feature, connection_priority, fake_connection_delegate.GenerateInterfacePtr()); } + secure_channel_ptr_.FlushForTesting(); - - base::UnguessableToken id_generated_by_call = - fake_client_connection_parameters_factory_->last_created_instance_id(); - - // The request should have caused a FakeClientConnectionParameters to be - // created. - EXPECT_NE(last_id_before_call, id_generated_by_call); - - return id_generated_by_call; } FakeActiveConnectionManager* fake_active_connection_manager() { @@ -568,14 +828,24 @@ const base::test::ScopedTaskEnvironment scoped_task_environment_; const cryptauth::RemoteDeviceList test_devices_; - std::unique_ptr<FakeActiveConnectionManagerFactory> - fake_active_connection_manager_factory_; - std::unique_ptr<FakePendingConnectionManagerFactory> - fake_pending_connection_manager_factory_; - std::unique_ptr<FakeClientConnectionParametersFactory> - fake_client_connection_parameters_factory_; + scoped_refptr<testing::NiceMock<device::MockBluetoothAdapter>> mock_adapter_; + scoped_refptr<base::TestSimpleTaskRunner> test_task_runner_; + + std::unique_ptr<FakeTimerFactoryFactory> fake_timer_factory_factory_; std::unique_ptr<TestRemoteDeviceCacheFactory> test_remote_device_cache_factory_; + std::unique_ptr<FakeBleServiceDataHelperFactory> + fake_ble_service_data_helper_factory_; + std::unique_ptr<FakeBleConnectionManagerFactory> + fake_ble_connection_manager_factory_; + std::unique_ptr<FakePendingConnectionManagerFactory> + fake_pending_connection_manager_factory_; + std::unique_ptr<FakeActiveConnectionManagerFactory> + fake_active_connection_manager_factory_; + std::unique_ptr<TestSecureChannelInitializerFactory> + test_secure_channel_initializer_factory_; + std::unique_ptr<FakeClientConnectionParametersFactory> + fake_client_connection_parameters_factory_; // Stores metadata which is expected to be pending when a connection attempt // is made while an ongoing connection is in the process of disconnecting. @@ -586,6 +856,8 @@ ConnectionPriority>>> disconnecting_details_to_requests_map_; + size_t num_queued_requests_before_initialization_ = 0u; + std::unique_ptr<service_manager::TestConnectorFactory> connector_factory_; std::unique_ptr<service_manager::Connector> connector_; @@ -595,6 +867,8 @@ }; TEST_F(SecureChannelServiceTest, ListenForConnection_MissingPublicKey) { + FinishInitialization(); + cryptauth::RemoteDevice device_to_connect = test_devices()[0]; device_to_connect.public_key.clear(); @@ -604,15 +878,19 @@ } TEST_F(SecureChannelServiceTest, InitiateConnection_MissingPublicKey) { + FinishInitialization(); + cryptauth::RemoteDevice device_to_connect = test_devices()[0]; device_to_connect.public_key.clear(); - CallInitiateConnectionFromDeviceAndVerifyRejection( + CallInitiateConnectionToDeviceAndVerifyRejection( device_to_connect, test_devices()[1], "feature", ConnectionPriority::kLow, mojom::ConnectionAttemptFailureReason::REMOTE_DEVICE_INVALID_PUBLIC_KEY); } TEST_F(SecureChannelServiceTest, ListenForConnection_MissingPsk) { + FinishInitialization(); + cryptauth::RemoteDevice device_to_connect = test_devices()[0]; device_to_connect.persistent_symmetric_key.clear(); @@ -622,16 +900,20 @@ } TEST_F(SecureChannelServiceTest, InitiateConnection_MissingPsk) { + FinishInitialization(); + cryptauth::RemoteDevice device_to_connect = test_devices()[0]; device_to_connect.persistent_symmetric_key.clear(); - CallInitiateConnectionFromDeviceAndVerifyRejection( + CallInitiateConnectionToDeviceAndVerifyRejection( device_to_connect, test_devices()[1], "feature", ConnectionPriority::kLow, mojom::ConnectionAttemptFailureReason::REMOTE_DEVICE_INVALID_PSK); } TEST_F(SecureChannelServiceTest, ListenForConnection_MissingLocalDevicePublicKey) { + FinishInitialization(); + cryptauth::RemoteDevice local_device = test_devices()[1]; local_device.public_key.clear(); @@ -642,15 +924,19 @@ TEST_F(SecureChannelServiceTest, InitiateConnection_MissingLocalDevicePublicKey) { + FinishInitialization(); + cryptauth::RemoteDevice local_device = test_devices()[1]; local_device.public_key.clear(); - CallInitiateConnectionFromDeviceAndVerifyRejection( + CallInitiateConnectionToDeviceAndVerifyRejection( test_devices()[0], local_device, "feature", ConnectionPriority::kLow, mojom::ConnectionAttemptFailureReason::LOCAL_DEVICE_INVALID_PUBLIC_KEY); } TEST_F(SecureChannelServiceTest, ListenForConnection_MissingLocalDevicePsk) { + FinishInitialization(); + cryptauth::RemoteDevice local_device = test_devices()[1]; local_device.persistent_symmetric_key.clear(); @@ -660,15 +946,19 @@ } TEST_F(SecureChannelServiceTest, InitiateConnection_MissingLocalDevicePsk) { + FinishInitialization(); + cryptauth::RemoteDevice local_device = test_devices()[1]; local_device.persistent_symmetric_key.clear(); - CallInitiateConnectionFromDeviceAndVerifyRejection( + CallInitiateConnectionToDeviceAndVerifyRejection( test_devices()[0], local_device, "feature", ConnectionPriority::kLow, mojom::ConnectionAttemptFailureReason::LOCAL_DEVICE_INVALID_PSK); } TEST_F(SecureChannelServiceTest, ListenForConnection_OneDevice) { + FinishInitialization(); + CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature", ConnectionPriority::kLow); @@ -678,7 +968,9 @@ } TEST_F(SecureChannelServiceTest, InitiateConnection_OneDevice) { - CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + FinishInitialization(); + + CallInitiateConnectionToDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature", ConnectionPriority::kLow); SimulateSuccessfulConnection(test_devices()[0].GetDeviceId()); @@ -688,6 +980,8 @@ TEST_F(SecureChannelServiceTest, ListenForConnection_OneDevice_RequestSpecificLocalDevice) { + FinishInitialization(); + CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature", ConnectionPriority::kLow); @@ -698,7 +992,9 @@ TEST_F(SecureChannelServiceTest, InitiateConnection_OneDevice_RequestSpecificLocalDevice) { - CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + FinishInitialization(); + + CallInitiateConnectionToDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature", ConnectionPriority::kLow); SimulateSuccessfulConnection(test_devices()[0].GetDeviceId()); @@ -707,11 +1003,13 @@ } TEST_F(SecureChannelServiceTest, OneDevice_TwoConnectionRequests) { + FinishInitialization(); + // Two pending connection requests for the same device. CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature1", ConnectionPriority::kLow); - CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + CallInitiateConnectionToDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature2", ConnectionPriority::kMedium); @@ -722,6 +1020,8 @@ TEST_F(SecureChannelServiceTest, OneDevice_TwoConnectionRequests_OneAfterConnection) { + FinishInitialization(); + // First request is successful. CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature1", @@ -729,7 +1029,7 @@ SimulateSuccessfulConnection(test_devices()[0].GetDeviceId()); // Second request is added to the existing channel. - CallInitiateConnectionFromDeviceAndVerifyActiveConnection( + CallInitiateConnectionToDeviceAndVerifyActiveConnection( test_devices()[0], test_devices()[1], "feature2", ConnectionPriority::kMedium); @@ -739,6 +1039,8 @@ TEST_F(SecureChannelServiceTest, OneDevice_TwoConnectionRequests_OneWhileDisconnecting) { + FinishInitialization(); + // First request is successful. CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature1", @@ -749,7 +1051,7 @@ SimulateConnectionStartingDisconnecting(test_devices()[0].GetDeviceId()); // Second request is added before disconnecting is complete. - CallInitiateConnectionFromDeviceAndVerifyStillDisconnecting( + CallInitiateConnectionToDeviceAndVerifyStillDisconnecting( test_devices()[0], test_devices()[1], "feature2", ConnectionPriority::kMedium); @@ -766,6 +1068,8 @@ TEST_F(SecureChannelServiceTest, OneDevice_TwoConnectionRequests_OneWhileDisconnecting_Canceled) { + FinishInitialization(); + // First request is successful. CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature1", @@ -777,7 +1081,7 @@ // Second request is added before disconnecting is complete, but the request // is canceled before the disconnection completes. - auto id = CallInitiateConnectionFromDeviceAndVerifyStillDisconnecting( + auto id = CallInitiateConnectionToDeviceAndVerifyStillDisconnecting( test_devices()[0], test_devices()[1], "feature2", ConnectionPriority::kMedium); CancelPendingRequest(id); @@ -788,23 +1092,25 @@ } TEST_F(SecureChannelServiceTest, ThreeDevices) { + FinishInitialization(); + // Two requests for each device. CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature1", ConnectionPriority::kLow); - CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + CallInitiateConnectionToDeviceAndVerifyPendingConnection( test_devices()[0], test_devices()[1], "feature2", ConnectionPriority::kMedium); CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[2], test_devices()[1], "feature3", ConnectionPriority::kHigh); - CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + CallInitiateConnectionToDeviceAndVerifyPendingConnection( test_devices()[2], test_devices()[1], "feature4", ConnectionPriority::kLow); CallListenForConnectionFromDeviceAndVerifyPendingConnection( test_devices()[3], test_devices()[1], "feature5", ConnectionPriority::kMedium); - CallInitiateConnectionFromDeviceAndVerifyPendingConnection( + CallInitiateConnectionToDeviceAndVerifyPendingConnection( test_devices()[3], test_devices()[1], "feature6", ConnectionPriority::kHigh);
diff --git a/components/arc/appfuse/arc_appfuse_bridge.cc b/components/arc/appfuse/arc_appfuse_bridge.cc index 1d29c01..a7b4b32 100644 --- a/components/arc/appfuse/arc_appfuse_bridge.cc +++ b/components/arc/appfuse/arc_appfuse_bridge.cc
@@ -12,8 +12,7 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_browser_context_keyed_service_factory_base.h" -#include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/embedder/scoped_platform_handle.h" +#include "mojo/public/cpp/system/platform_handle.h" #include <sys/epoll.h> @@ -47,17 +46,14 @@ std::move(callback).Run(mojo::ScopedHandle()); return; } - mojo::edk::ScopedInternalPlatformHandle platform_handle{ - mojo::edk::InternalPlatformHandle(fd.value().release())}; - MojoHandle wrapped_handle = MOJO_HANDLE_INVALID; - MojoResult result = mojo::edk::CreateInternalPlatformHandleWrapper( - std::move(platform_handle), &wrapped_handle); - if (result != MOJO_RESULT_OK) { - LOG(ERROR) << "Failed to wrap handle: " << result; + mojo::ScopedHandle wrapped_handle = + mojo::WrapPlatformHandle(mojo::PlatformHandle(std::move(fd.value()))); + if (!wrapped_handle.is_valid()) { + LOG(ERROR) << "Failed to wrap handle"; std::move(callback).Run(mojo::ScopedHandle()); return; } - std::move(callback).Run(mojo::ScopedHandle(mojo::Handle(wrapped_handle))); + std::move(callback).Run(std::move(wrapped_handle)); } } // namespace
diff --git a/components/arc/arc_prefs.cc b/components/arc/arc_prefs.cc index 7a4ce14d..6ff3744 100644 --- a/components/arc/arc_prefs.cc +++ b/components/arc/arc_prefs.cc
@@ -89,6 +89,10 @@ // screen). const char kVoiceInteractionContextEnabled[] = "settings.voice_interaction.context.enabled"; +// A preference that indicates the user has allowed voice interaction services +// to use hotword listening. +const char kVoiceInteractionHotwordEnabled[] = + "settings.voice_interaction.hotword.enabled"; void RegisterProfilePrefs(PrefRegistrySimple* registry) { // TODO(dspaid): Implement a mechanism to allow this to sync on first boot @@ -127,6 +131,7 @@ registry->RegisterBooleanPref(kSmsConnectEnabled, true); registry->RegisterBooleanPref(kVoiceInteractionContextEnabled, false); registry->RegisterBooleanPref(kVoiceInteractionEnabled, false); + registry->RegisterBooleanPref(kVoiceInteractionHotwordEnabled, false); } } // namespace prefs
diff --git a/components/arc/arc_prefs.h b/components/arc/arc_prefs.h index 500cf81..90f2e6e 100644 --- a/components/arc/arc_prefs.h +++ b/components/arc/arc_prefs.h
@@ -38,6 +38,7 @@ ARC_EXPORT extern const char kSmsConnectEnabled[]; ARC_EXPORT extern const char kVoiceInteractionEnabled[]; ARC_EXPORT extern const char kVoiceInteractionContextEnabled[]; +ARC_EXPORT extern const char kVoiceInteractionHotwordEnabled[]; void RegisterProfilePrefs(PrefRegistrySimple* registry);
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 676e5df..785f7ed 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -606,7 +606,7 @@ !base::StartsWith(url.scheme(), "chrome", base::CompareCase::SENSITIVE) && !url.SchemeIs(url::kAboutScheme) && base::FeatureList::IsEnabled( - password_manager::features::kEnableManualFallbacksFillingStandalone)); + password_manager::features::kManualFallbacksFillingStandalone)); } PasswordForm::SubmissionIndicatorEvent ToSubmissionIndicatorEvent(
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc index 8eafafa4..abc1b79c 100644 --- a/components/cronet/url_request_context_config.cc +++ b/components/cronet/url_request_context_config.cc
@@ -520,7 +520,7 @@ #if BUILDFLAG(ENABLE_REPORTING) if (nel_enable) { - auto policy = std::make_unique<net::ReportingPolicy>(); + auto policy = net::ReportingPolicy::Create(); // Apps (like Cronet embedders) are generally allowed to run in the // background, even across network changes, so use more relaxed privacy
diff --git a/components/drive/chromeos/file_system.cc b/components/drive/chromeos/file_system.cc index 9f341b5..6600250 100644 --- a/components/drive/chromeos/file_system.cc +++ b/components/drive/chromeos/file_system.cc
@@ -910,6 +910,33 @@ observer.OnFileChanged(changed_files); } +void FileSystem::OnTeamDrivesChanged(const FileChange& changed_team_drives) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + + for (const auto& entry : changed_team_drives.map()) { + for (const auto& change : entry.second.list()) { + DCHECK(!change.team_drive_id().empty()); + if (change.IsDelete()) { + const auto it = + team_drive_change_list_loaders_.find(change.team_drive_id()); + DCHECK(it != team_drive_change_list_loaders_.end()); + team_drive_change_list_loaders_.erase(it); + } else if (change.IsAddOrUpdate()) { + DCHECK(team_drive_change_list_loaders_.count(change.team_drive_id()) == + 0); + auto loader = std::make_unique<internal::TeamDriveChangeListLoader>( + change.team_drive_id(), entry.first, logger_, + blocking_task_runner_.get(), resource_metadata_, scheduler_, + loader_controller_.get()); + loader->AddChangeListLoaderObserver(this); + loader->LoadIfNeeded(base::DoNothing()); + team_drive_change_list_loaders_.emplace(change.team_drive_id(), + std::move(loader)); + } + } + } +} + void FileSystem::OnLoadFromServerComplete() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); sync_client_->StartCheckingExistingPinnedFiles();
diff --git a/components/drive/chromeos/file_system.h b/components/drive/chromeos/file_system.h index 5a3d3014..5cb69d6 100644 --- a/components/drive/chromeos/file_system.h +++ b/components/drive/chromeos/file_system.h
@@ -186,6 +186,7 @@ // Used to propagate events from ChangeListLoader. void OnDirectoryReloaded(const base::FilePath& directory_path) override; void OnFileChanged(const FileChange& changed_files) override; + void OnTeamDrivesChanged(const FileChange& changed_team_drives) override; void OnLoadFromServerComplete() override; void OnInitialLoadComplete() override;
diff --git a/components/drive/file_system_unittest.cc b/components/drive/file_system_unittest.cc index 91588c1d..5785ca3a9 100644 --- a/components/drive/file_system_unittest.cc +++ b/components/drive/file_system_unittest.cc
@@ -882,6 +882,61 @@ EXPECT_EQ(1U, found.count(base::FilePath::FromUTF8Unsafe("TestFile"))); } +TEST_F(FileSystemTest, AddTeamDriveInChangeList) { + ASSERT_TRUE(SetupTeamDrives()); + + // The first load trigger the loading of team drives. + ReadDirectorySync(base::FilePath::FromUTF8Unsafe(".")); + + // Add a new team drive to the fake file system. + { + fake_drive_service_->AddTeamDrive("td_id_3", "team_drive_3"); + base::RunLoop().RunUntilIdle(); + } + + // Notify the update to the file system, which will add the team drive + file_system_->CheckForUpdates(); + + std::unique_ptr<ResourceEntryVector> entries( + ReadDirectorySync(base::FilePath::FromUTF8Unsafe("drive/team_drives/"))); + // The root directory should be read correctly. + ASSERT_TRUE(entries); + std::set<base::FilePath> found; + for (size_t i = 0; i < entries->size(); ++i) { + found.insert(base::FilePath::FromUTF8Unsafe((*entries)[i].title())); + } + EXPECT_EQ(3U, found.size()); + EXPECT_EQ(1U, found.count(base::FilePath::FromUTF8Unsafe("team_drive_3"))); + + // Add a new entry to drive/team_drives/team_drive_3 + // Create a file in the test directory. + std::unique_ptr<google_apis::FileResource> entry; + { + google_apis::DriveApiErrorCode error = google_apis::DRIVE_OTHER_ERROR; + fake_drive_service_->AddNewFile( + "text/plain", "(dummy data)", "td_id_3", "TestFile", + false, // shared_with_me + google_apis::test_util::CreateCopyResultCallback(&error, &entry)); + base::RunLoop().RunUntilIdle(); + ASSERT_EQ(google_apis::HTTP_CREATED, error); + } + + // Notify the update to the file system. + file_system_->CheckForUpdates(); + + entries = ReadDirectorySync( + base::FilePath::FromUTF8Unsafe("drive/team_drives/team_drive_3")); + // The root directory should be read correctly. + ASSERT_TRUE(entries); + + found.clear(); + for (size_t i = 0; i < entries->size(); ++i) { + found.insert(base::FilePath::FromUTF8Unsafe((*entries)[i].title())); + } + EXPECT_EQ(1U, found.size()); + EXPECT_EQ(1U, found.count(base::FilePath::FromUTF8Unsafe("TestFile"))); +} + TEST_F(FileSystemTest, ReadDirectory_NonRootDirectory) { // ReadDirectory() should kick off the resource list loading. std::unique_ptr<ResourceEntryVector> entries(ReadDirectorySync(
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 4b667b3..4767111 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -2593,15 +2593,13 @@ db_diagnostics_ = db_->GetDiagnosticInfo(error, stmt); - // Notify SyncBridge about storage error. It will report failure to sync - // engine and stop accepting remote updates. - if (typed_url_sync_bridge_) - typed_url_sync_bridge_->OnDatabaseError(); - // Don't just do the close/delete here, as we are being called by |db| and // that seems dangerous. - // TODO(shess): Consider changing KillHistoryDatabase() to use - // RazeAndClose(). Then it can be cleared immediately. + // TODO(https://crbug.com/854258): It is also dangerous to kill the database + // by a posted task: tasks that run before KillHistoryDatabase still can try + // to use the broken database. Consider protecting against other tasks using + // the DB or consider changing KillHistoryDatabase() to use RazeAndClose() + // (then it can be cleared immediately). task_runner_->PostTask( FROM_HERE, base::Bind(&HistoryBackend::KillHistoryDatabase, this)); } @@ -2612,6 +2610,11 @@ if (!db_) return; + // Notify SyncBridge about storage error. It will report failure to sync + // engine and stop accepting remote updates. + if (typed_url_sync_bridge_) + typed_url_sync_bridge_->OnDatabaseError(); + // Rollback transaction because Raze() cannot be called from within a // transaction. db_->RollbackTransaction();
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 03e1347..4d58f7c 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -3849,6 +3849,28 @@ base::RunLoop().RunUntilIdle(); } +// Tests that calling DatabaseErrorCallback results in killing the database and +// notifying the TypedURLSyncBridge at the same time so that no further +// notification from the backend can lead to the bridge. (Regression test for +// https://crbug.com/853395) +TEST_F(HistoryBackendTest, DatabaseErrorSynchronouslyKillAndNotifyBridge) { + // Notify the backend that a database error occurred. + backend_->DatabaseErrorCallback(SQLITE_CORRUPT, nullptr); + // In-between (before the posted task finishes), we can again delete all + // history. + backend_->ExpireHistoryBetween(/*restrict_urls=*/std::set<GURL>(), + /*begin_time=*/base::Time(), + /*end_time=*/base::Time::Max()); + + // Run loop to let the posted task to kill the DB run. + base::RunLoop().RunUntilIdle(); + // After DB is destroyed, we can again try to delete all history (with no + // effect but it should not crash). + backend_->ExpireHistoryBetween(/*restrict_urls=*/std::set<GURL>(), + /*begin_time=*/base::Time(), + /*end_time=*/base::Time::Max()); +} + // Tests that a typed navigation which results in a redirect from HTTP to HTTPS // will cause the HTTPS URL to accrue the typed count, and the HTTP URL to not. TEST_F(HistoryBackendTest, RedirectScoring) {
diff --git a/components/nacl/browser/nacl_broker_host_win.cc b/components/nacl/browser/nacl_broker_host_win.cc index b5922b0..7b04f80 100644 --- a/components/nacl/browser/nacl_broker_host_win.cc +++ b/components/nacl/browser/nacl_broker_host_win.cc
@@ -4,6 +4,8 @@ #include "components/nacl/browser/nacl_broker_host_win.h" +#include <windows.h> + #include <memory> #include "base/base_switches.h"
diff --git a/components/network_time/BUILD.gn b/components/network_time/BUILD.gn index 8305b1a..88780a07 100644 --- a/components/network_time/BUILD.gn +++ b/components/network_time/BUILD.gn
@@ -18,6 +18,7 @@ "//components/prefs", "//components/variations", "//net", + "//services/network/public/cpp:cpp", ] } @@ -37,6 +38,7 @@ "//components/variations", "//net", "//net:test_support", + "//services/network:test_support", "//testing/gtest", ] }
diff --git a/components/network_time/DEPS b/components/network_time/DEPS index 7f54a2c..004d910d 100644 --- a/components/network_time/DEPS +++ b/components/network_time/DEPS
@@ -4,4 +4,6 @@ "+components/variations", "+components/prefs", "+net", + "+services/network/public/cpp", + "+services/network/test", ]
diff --git a/components/network_time/network_time_tracker.cc b/components/network_time/network_time_tracker.cc index b9581ce9..fe7cc5eb 100644 --- a/components/network_time/network_time_tracker.cc +++ b/components/network_time/network_time_tracker.cc
@@ -30,9 +30,8 @@ #include "net/base/net_errors.h" #include "net/http/http_response_headers.h" #include "net/traffic_annotation/network_traffic_annotation.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_fetcher_response_writer.h" -#include "net/url_request/url_request_context_getter.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" namespace network_time { @@ -136,12 +135,8 @@ 0x4e, 0xf6, 0x8f, 0x54, 0xb5, 0x0c, 0x49, 0xe9, 0xa5, 0xf1, 0x40, 0xfd, 0xd9, 0x1a, 0x92, 0x90, 0x8a, 0x67, 0x15}; -std::string GetServerProof(const net::URLFetcher* source) { - const net::HttpResponseHeaders* response_headers = - source->GetResponseHeaders(); - if (!response_headers) { - return std::string(); - } +std::string GetServerProof( + scoped_refptr<net::HttpResponseHeaders> response_headers) { std::string proof; return response_headers->EnumerateHeader(nullptr, "x-cup-server-proof", &proof) @@ -149,24 +144,6 @@ : std::string(); } -// Limits the amount of data that will be buffered from the server's response. -class SizeLimitingStringWriter : public net::URLFetcherStringWriter { - public: - explicit SizeLimitingStringWriter(size_t limit) : limit_(limit) {} - - int Write(net::IOBuffer* buffer, - int num_bytes, - const net::CompletionCallback& callback) override { - if (data().length() + num_bytes > limit_) { - return net::ERR_FILE_TOO_BIG; - } - return net::URLFetcherStringWriter::Write(buffer, num_bytes, callback); - } - - private: - size_t limit_; -}; - base::TimeDelta CheckTimeInterval() { int64_t seconds; const std::string param = variations::GetVariationParamValueByFeature( @@ -205,11 +182,11 @@ std::unique_ptr<base::Clock> clock, std::unique_ptr<const base::TickClock> tick_clock, PrefService* pref_service, - scoped_refptr<net::URLRequestContextGetter> getter) + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) : server_url_(kTimeServiceURL), max_response_size_(1024), backoff_(base::TimeDelta::FromMinutes(kBackoffMinutes)), - getter_(std::move(getter)), + url_loader_factory_(std::move(url_loader_factory)), clock_(std::move(clock)), tick_clock_(std::move(tick_clock)), pref_service_(pref_service), @@ -491,60 +468,54 @@ } } })"); - // This cancels any outstanding fetch. - time_fetcher_ = net::URLFetcher::Create(url, net::URLFetcher::GET, this, - traffic_annotation); - if (!time_fetcher_) { - DVLOG(1) << "tried to make fetch happen; failed"; - return; - } - data_use_measurement::DataUseUserData::AttachToFetcher( - time_fetcher_.get(), - data_use_measurement::DataUseUserData::NETWORK_TIME_TRACKER); - time_fetcher_->SaveResponseWithWriter( - std::unique_ptr<net::URLFetcherResponseWriter>( - new SizeLimitingStringWriter(max_response_size_))); - DCHECK(getter_); - time_fetcher_->SetRequestContext(getter_.get()); + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = url; // Not expecting any cookies, but just in case. - time_fetcher_->SetLoadFlags(net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE | - net::LOAD_DO_NOT_SAVE_COOKIES | - net::LOAD_DO_NOT_SEND_COOKIES | - net::LOAD_DO_NOT_SEND_AUTH_DATA); + resource_request->load_flags = + net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE | + net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DO_NOT_SEND_COOKIES | + net::LOAD_DO_NOT_SEND_AUTH_DATA; + // This cancels any outstanding fetch. + time_fetcher_ = network::SimpleURLLoader::Create(std::move(resource_request), + traffic_annotation); + time_fetcher_->SetAllowHttpErrorResults(true); + time_fetcher_->DownloadToString( + url_loader_factory_.get(), + base::BindOnce(&NetworkTimeTracker::OnURLLoaderComplete, + base::Unretained(this)), + max_response_size_); - time_fetcher_->Start(); fetch_started_ = tick_clock_->NowTicks(); - timer_.Stop(); // Restarted in OnURLFetchComplete(). + timer_.Stop(); // Restarted in OnURLLoaderComplete(). } -bool NetworkTimeTracker::UpdateTimeFromResponse() { - if (time_fetcher_->GetStatus().status() != net::URLRequestStatus::SUCCESS || - time_fetcher_->GetResponseCode() != 200) { +bool NetworkTimeTracker::UpdateTimeFromResponse( + std::unique_ptr<std::string> response_body) { + int response_code = 0; + if (time_fetcher_->ResponseInfo() && time_fetcher_->ResponseInfo()->headers) + response_code = time_fetcher_->ResponseInfo()->headers->response_code(); + if (response_code != 200 || !response_body) { time_query_completed_ = true; - DVLOG(1) << "fetch failed, status=" << time_fetcher_->GetStatus().status() - << ",code=" << time_fetcher_->GetResponseCode(); + DVLOG(1) << "fetch failed code=" << response_code; // The error code is negated because net errors are negative, but // the corresponding histogram enum is positive. base::UmaHistogramSparse("NetworkTimeTracker.UpdateTimeFetchFailed", - -time_fetcher_->GetStatus().error()); + -time_fetcher_->NetError()); return false; } - std::string response_body; - if (!time_fetcher_->GetResponseAsString(&response_body)) { - DVLOG(1) << "failed to get response"; - return false; - } + std::string data = *response_body.get(); + DCHECK(query_signer_); - if (!query_signer_->ValidateResponse(response_body, - GetServerProof(time_fetcher_.get()))) { + if (!query_signer_->ValidateResponse( + data, GetServerProof(time_fetcher_->ResponseInfo()->headers))) { DVLOG(1) << "invalid signature"; RecordFetchValidHistogram(false); return false; } - response_body = response_body.substr(5); // Skips leading )]}'\n - std::unique_ptr<base::Value> value = base::JSONReader::Read(response_body); + data = data.substr(5); // Skips leading )]}'\n + std::unique_ptr<base::Value> value = base::JSONReader::Read(data); if (!value) { DVLOG(1) << "bad JSON"; RecordFetchValidHistogram(false); @@ -588,16 +559,17 @@ return true; } -void NetworkTimeTracker::OnURLFetchComplete(const net::URLFetcher* source) { +void NetworkTimeTracker::OnURLLoaderComplete( + std::unique_ptr<std::string> response_body) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(time_fetcher_); - DCHECK_EQ(source, time_fetcher_.get()); time_query_completed_ = true; // After completion of a query, whether succeeded or failed, go to sleep for a // long time. - if (!UpdateTimeFromResponse()) { // On error, back off. + if (!UpdateTimeFromResponse( + std::move(response_body))) { // On error, back off. if (backoff_ < base::TimeDelta::FromDays(2)) { backoff_ *= 2; }
diff --git a/components/network_time/network_time_tracker.h b/components/network_time/network_time_tracker.h index edc2cd4..12e1ff8 100644 --- a/components/network_time/network_time_tracker.h +++ b/components/network_time/network_time_tracker.h
@@ -16,7 +16,6 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "net/url_request/url_fetcher_delegate.h" #include "url/gurl.h" class PrefRegistrySimple; @@ -30,10 +29,10 @@ class Ecdsa; } // namespace client_update_protocol -namespace net { -class URLFetcher; -class URLRequestContextGetter; -} // namespace net +namespace network { +class SimpleURLLoader; +class SharedURLLoaderFactory; +} // namespace network namespace network_time { @@ -49,7 +48,7 @@ // A class that receives network time updates and can provide the network time // for a corresponding local time. This class is not thread safe. -class NetworkTimeTracker : public net::URLFetcherDelegate { +class NetworkTimeTracker { public: // Describes the result of a GetNetworkTime() call, describing whether // network time was available and if not, why not. @@ -92,14 +91,15 @@ static void RegisterPrefs(PrefRegistrySimple* registry); - // Constructor. Arguments may be stubbed out for tests. |getter|, if not - // null, will cause automatic queries to a time server. Otherwise, time is - // available only if |UpdateNetworkTime| is called. - NetworkTimeTracker(std::unique_ptr<base::Clock> clock, - std::unique_ptr<const base::TickClock> tick_clock, - PrefService* pref_service, - scoped_refptr<net::URLRequestContextGetter> getter); - ~NetworkTimeTracker() override; + // Constructor. Arguments may be stubbed out for tests. |url_loader_factory| + // must be non-null unless the kNetworkTimeServiceQuerying is disabled. + // Otherwise, time is available only if |UpdateNetworkTime| is called. + NetworkTimeTracker( + std::unique_ptr<base::Clock> clock, + std::unique_ptr<const base::TickClock> tick_clock, + PrefService* pref_service, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); + ~NetworkTimeTracker(); // Sets |network_time| to an estimate of the true time. Returns // NETWORK_TIME_AVAILABLE if time is available. If |uncertainty| is @@ -163,11 +163,10 @@ // Updates network time from a time server response, returning true // if successful. - bool UpdateTimeFromResponse(); + bool UpdateTimeFromResponse(std::unique_ptr<std::string> response_body); - // net::URLFetcherDelegate: // Called to process responses from the secure time service. - void OnURLFetchComplete(const net::URLFetcher* source) override; + void OnURLLoaderComplete(std::unique_ptr<std::string> response_body); // Sets the next time query to be run at the specified time. void QueueCheckTime(base::TimeDelta delay); @@ -185,8 +184,8 @@ // changing the delay of this timer, with the result that CheckTime() may // assume that if it runs, it is eligible to issue a time query. base::RepeatingTimer timer_; - scoped_refptr<net::URLRequestContextGetter> getter_; - std::unique_ptr<net::URLFetcher> time_fetcher_; + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; + std::unique_ptr<network::SimpleURLLoader> time_fetcher_; base::TimeTicks fetch_started_; std::unique_ptr<client_update_protocol::Ecdsa> query_signer_;
diff --git a/components/network_time/network_time_tracker_unittest.cc b/components/network_time/network_time_tracker_unittest.cc index 2b70a1b..bc36dd09 100644 --- a/components/network_time/network_time_tracker_unittest.cc +++ b/components/network_time/network_time_tracker_unittest.cc
@@ -13,6 +13,7 @@ #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_task_environment.h" #include "base/test/simple_test_clock.h" #include "base/test/simple_test_tick_clock.h" #include "components/client_update_protocol/ecdsa.h" @@ -22,8 +23,7 @@ #include "net/http/http_response_headers.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/http_response.h" -#include "net/url_request/url_fetcher.h" -#include "net/url_request/url_request_test_util.h" +#include "services/network/test/test_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" namespace network_time { @@ -47,24 +47,25 @@ ~NetworkTimeTrackerTest() override {} NetworkTimeTrackerTest() - : io_thread_("IO thread"), + : task_environment_( + base::test::ScopedTaskEnvironment::MainThreadType::IO), field_trial_test_(new FieldTrialTest()), clock_(new base::SimpleTestClock), tick_clock_(new base::SimpleTestTickClock), test_server_(new net::EmbeddedTestServer) { - base::Thread::Options thread_options; - thread_options.message_loop_type = base::MessageLoop::TYPE_IO; - EXPECT_TRUE(io_thread_.StartWithOptions(thread_options)); NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); field_trial_test_->SetNetworkQueriesWithVariationsService( true, 0.0 /* query probability */, NetworkTimeTracker::FETCHES_IN_BACKGROUND_AND_ON_DEMAND); + shared_url_loader_factory_ = + base::MakeRefCounted<network::TestSharedURLLoaderFactory>(); + tracker_.reset(new NetworkTimeTracker( std::unique_ptr<base::Clock>(clock_), std::unique_ptr<const base::TickClock>(tick_clock_), &pref_service_, - new net::TestURLRequestContextGetter(io_thread_.task_runner()))); + shared_url_loader_factory_)); // Do this to be sure that |is_null| returns false. clock_->Advance(base::TimeDelta::FromDays(111)); @@ -76,8 +77,6 @@ adjustment_ = 7 * base::TimeDelta::FromMilliseconds(kTicksResolutionMs); } - void TearDown() override { io_thread_.Stop(); } - // Replaces |tracker_| with a new object, while preserving the // testing clocks. void Reset() { @@ -90,7 +89,7 @@ tracker_.reset(new NetworkTimeTracker( std::unique_ptr<base::Clock>(clock_), std::unique_ptr<const base::TickClock>(tick_clock_), &pref_service_, - new net::TestURLRequestContextGetter(io_thread_.task_runner()))); + shared_url_loader_factory_)); } // Good signature over invalid data, though made with a non-production key. @@ -156,9 +155,8 @@ } protected: - base::Thread io_thread_; + base::test::ScopedTaskEnvironment task_environment_; std::unique_ptr<FieldTrialTest> field_trial_test_; - base::MessageLoop message_loop_; base::TimeDelta resolution_; base::TimeDelta latency_; base::TimeDelta adjustment_; @@ -167,6 +165,7 @@ TestingPrefServiceSimple pref_service_; std::unique_ptr<NetworkTimeTracker> tracker_; std::unique_ptr<net::EmbeddedTestServer> test_server_; + scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory_; }; TEST_F(NetworkTimeTrackerTest, Uninitialized) {
diff --git a/components/password_manager/core/browser/password_autofill_manager_unittest.cc b/components/password_manager/core/browser/password_autofill_manager_unittest.cc index 26bead532..e67f5d4 100644 --- a/components/password_manager/core/browser/password_autofill_manager_unittest.cc +++ b/components/password_manager/core/browser/password_autofill_manager_unittest.cc
@@ -178,10 +178,10 @@ void SetManualFallbacksForFillingStandalone(bool enabled) { if (enabled) { scoped_feature_list_.InitAndEnableFeature( - password_manager::features::kEnableManualFallbacksFillingStandalone); + password_manager::features::kManualFallbacksFillingStandalone); } else { scoped_feature_list_.InitAndDisableFeature( - password_manager::features::kEnableManualFallbacksFillingStandalone); + password_manager::features::kManualFallbacksFillingStandalone); } } @@ -194,7 +194,7 @@ void SetManualFallbacks(bool enabled) { std::vector<std::string> features = { password_manager::features::kManualFallbacksFilling.name, - password_manager::features::kEnableManualFallbacksFillingStandalone + password_manager::features::kManualFallbacksFillingStandalone .name, password_manager::features::kEnableManualFallbacksGeneration.name}; if (enabled) {
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc index 7a97f23..e934adf 100644 --- a/components/password_manager/core/common/password_manager_features.cc +++ b/components/password_manager/core/common/password_manager_features.cc
@@ -30,9 +30,8 @@ // Enable a standalone popup UI, which will allow the user to view all saved // passwords. -const base::Feature kEnableManualFallbacksFillingStandalone = { - "EnableManualFallbacksFillingStandalone", - base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kManualFallbacksFillingStandalone = { + "ManualFallbacksFillingStandalone", base::FEATURE_DISABLED_BY_DEFAULT}; // Enable a context menu item in the password field that allows the user // to manually enforce saving of their password.
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h index 3b93e38..4a888f85 100644 --- a/components/password_manager/core/common/password_manager_features.h +++ b/components/password_manager/core/common/password_manager_features.h
@@ -20,7 +20,7 @@ extern const base::Feature kAffiliationBasedMatching; extern const base::Feature kHtmlBasedUsernameDetector; extern const base::Feature kManualFallbacksFilling; -extern const base::Feature kEnableManualFallbacksFillingStandalone; +extern const base::Feature kManualFallbacksFillingStandalone; extern const base::Feature kEnableManualFallbacksGeneration; extern const base::Feature kEnableManualPasswordGeneration; extern const base::Feature kPasswordGenerationRequirements;
diff --git a/components/safe_browsing/DEPS b/components/safe_browsing/DEPS index 8b4e3a6..c674163 100644 --- a/components/safe_browsing/DEPS +++ b/components/safe_browsing/DEPS
@@ -2,6 +2,7 @@ "+components/data_use_measurement/core", "+components/security_interstitials/content", "+components/security_interstitials/core", + "+components/sync/protocol", "+content/public/browser", "+content/public/common", "+google_apis",
diff --git a/components/safe_browsing/password_protection/BUILD.gn b/components/safe_browsing/password_protection/BUILD.gn index d219c28..f2f640f 100644 --- a/components/safe_browsing/password_protection/BUILD.gn +++ b/components/safe_browsing/password_protection/BUILD.gn
@@ -30,6 +30,7 @@ "//components/safe_browsing/db:database_manager", "//components/safe_browsing/db:v4_protocol_manager_util", "//components/safe_browsing/db:whitelist_checker_client", + "//components/safe_browsing/web_ui:web_ui", "//components/sessions", "//content/public/browser:browser", "//net:net",
diff --git a/components/safe_browsing/web_ui/BUILD.gn b/components/safe_browsing/web_ui/BUILD.gn index 3c17276e..52135bc 100644 --- a/components/safe_browsing/web_ui/BUILD.gn +++ b/components/safe_browsing/web_ui/BUILD.gn
@@ -21,6 +21,7 @@ "//components/safe_browsing/common:safe_browsing_prefs", "//components/safe_browsing/db:v4_local_database_manager", "//components/strings:components_strings_grit", + "//components/sync/protocol:protocol", "//components/user_prefs:user_prefs", "//content/public/browser", "//net",
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.html b/components/safe_browsing/web_ui/resources/safe_browsing.html index 0e2ccf7..5c6033ec8 100644 --- a/components/safe_browsing/web_ui/resources/safe_browsing.html +++ b/components/safe_browsing/web_ui/resources/safe_browsing.html
@@ -39,6 +39,10 @@ <div class="content"> <p id="sent-client-download-requests-list"></p> </div> + <h2>PhishGuard Events</h2> + <div class="content"> + <p id="pg-event-log"></p> + </div> <script src="chrome://resources/js/i18n_template.js"></script> </body> </html>
diff --git a/components/safe_browsing/web_ui/resources/safe_browsing.js b/components/safe_browsing/web_ui/resources/safe_browsing.js index 360fc79b..f1967b3 100644 --- a/components/safe_browsing/web_ui/resources/safe_browsing.js +++ b/components/safe_browsing/web_ui/resources/safe_browsing.js
@@ -39,6 +39,16 @@ cr.addWebUIListener('sent-csbrr-update', function(result) { addSentCSBRRsInfo(result); }); + + cr.sendWithPromise('getPGEvents', []) + .then( + (pgEvents) => { + pgEvents.forEach(function (pgEvent) { + addPGEvent(pgEvent); + })}); + cr.addWebUIListener('sent-pg-event', function(result) { + addPGEvent(result); + }); } function addExperiments(result) { @@ -88,6 +98,13 @@ appendChildWithInnerText(logDiv, result); } + function addPGEvent(result) { + var logDiv = $('pg-event-log'); + var eventFormatted = "[" + (new Date(result['time'])).toLocaleString() + + "] " + result['message']; + appendChildWithInnerText(logDiv, eventFormatted); + } + function appendChildWithInnerText(logDiv, text) { if (!logDiv) return; @@ -99,6 +116,7 @@ return { addSentCSBRRsInfo: addSentCSBRRsInfo, addSentClientDownloadRequestsInfo: addSentClientDownloadRequestsInfo, + addPGEvent: addPGEvent, initialize: initialize, }; });
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.cc b/components/safe_browsing/web_ui/safe_browsing_ui.cc index ff85eb7..3f6938f87 100644 --- a/components/safe_browsing/web_ui/safe_browsing_ui.cc +++ b/components/safe_browsing/web_ui/safe_browsing_ui.cc
@@ -76,6 +76,21 @@ csbrrs_sent_); } +void WebUIInfoSingleton::AddToPGEvents( + const sync_pb::UserEventSpecifics& event) { + if (webui_instances_.empty()) + return; + + for (auto* webui_listener : webui_instances_) + webui_listener->NotifyPGEventJsListener(event); + + pg_event_log_.push_back(event); +} + +void WebUIInfoSingleton::ClearPGEvents() { + std::vector<sync_pb::UserEventSpecifics>().swap(pg_event_log_); +} + void WebUIInfoSingleton::RegisterWebUIInstance(SafeBrowsingUIHandler* webui) { webui_instances_.push_back(webui); } @@ -87,6 +102,7 @@ if (webui_instances_.empty()) { ClearCSBRRsSent(); ClearClientDownloadRequestsSent(); + ClearPGEvents(); } } @@ -322,6 +338,35 @@ return report_request_serialized; } +base::DictionaryValue SerializePGEvent( + const sync_pb::UserEventSpecifics& event) { + base::DictionaryValue result; + + base::Time timestamp = base::Time::FromDeltaSinceWindowsEpoch( + base::TimeDelta::FromMicroseconds(event.event_time_usec())); + result.SetDouble("time", timestamp.ToJsTime()); + + base::DictionaryValue event_dict; + + sync_pb::UserEventSpecifics::GaiaPasswordReuse reuse = + event.gaia_password_reuse_event(); + if (reuse.has_reuse_detected()) { + event_dict.SetPath({"reuse_detected", "status", "enabled"}, + base::Value(reuse.reuse_detected().status().enabled())); + event_dict.SetPath({"reuse_detected", "status", "reporting_population"}, + base::Value(reuse.reuse_detected() + .status() + .safe_browsing_reporting_population())); + } + + std::string event_serialized; + JSONStringValueSerializer serializer(&event_serialized); + serializer.set_pretty_print(true); + serializer.Serialize(event_dict); + result.SetString("message", event_serialized); + return result; +} + } // namespace SafeBrowsingUI::SafeBrowsingUI(content::WebUI* web_ui) @@ -444,6 +489,21 @@ ResolveJavascriptCallback(base::Value(callback_id), sent_reports); } +void SafeBrowsingUIHandler::GetPGEvents(const base::ListValue* args) { + const std::vector<sync_pb::UserEventSpecifics>& events = + WebUIInfoSingleton::GetInstance()->pg_event_log(); + + base::ListValue events_sent; + + for (const sync_pb::UserEventSpecifics& event : events) + events_sent.GetList().push_back(SerializePGEvent(event)); + + AllowJavascript(); + std::string callback_id; + args->GetString(0, &callback_id); + ResolveJavascriptCallback(base::Value(callback_id), events_sent); +} + void SafeBrowsingUIHandler::NotifyClientDownloadRequestJsListener( ClientDownloadRequest* client_download_request) { AllowJavascript(); @@ -458,6 +518,12 @@ FireWebUIListener("sent-csbrr-update", base::Value(SerializeCSBRR(*csbrr))); } +void SafeBrowsingUIHandler::NotifyPGEventJsListener( + const sync_pb::UserEventSpecifics& event) { + AllowJavascript(); + FireWebUIListener("sent-pg-event", SerializePGEvent(event)); +} + void SafeBrowsingUIHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "getExperiments", @@ -478,6 +544,9 @@ "getSentCSBRRs", base::BindRepeating(&SafeBrowsingUIHandler::GetSentCSBRRs, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "getPGEvents", base::BindRepeating(&SafeBrowsingUIHandler::GetPGEvents, + base::Unretained(this))); } } // namespace safe_browsing
diff --git a/components/safe_browsing/web_ui/safe_browsing_ui.h b/components/safe_browsing/web_ui/safe_browsing_ui.h index 188ec21..0230ebd 100644 --- a/components/safe_browsing/web_ui/safe_browsing_ui.h +++ b/components/safe_browsing/web_ui/safe_browsing_ui.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing/proto/webui.pb.h" +#include "components/sync/protocol/user_event_specifics.pb.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_data_source.h" @@ -45,6 +46,10 @@ // open chrome://safe-browsing tab was opened. void GetSentCSBRRs(const base::ListValue* args); + // Get the PhishGuard events that have been collected since the oldest + // currently open chrome://safe-browsing tab was opened. + void GetPGEvents(const base::ListValue* args); + // Register callbacks for WebUI messages. void RegisterMessages() override; @@ -60,6 +65,10 @@ // sent, while one or more WebUI tabs are opened. void NotifyCSBRRJsListener(ClientSafeBrowsingReportRequest* csbrr); + // Called when any new PhishGuard events are sent while one or more WebUI tabs + // are open. + void NotifyPGEventJsListener(const sync_pb::UserEventSpecifics& event); + content::BrowserContext* browser_context_; // List that keeps all the WebUI listener objects. static std::vector<SafeBrowsingUIHandler*> webui_list_; @@ -95,6 +104,13 @@ // Clear the list of the sent ClientSafeBrowsingReportRequest messages. void ClearCSBRRsSent(); + // Add the new message in |pg_event_log_| and send it to all the open + // chrome://safe-browsing tabs. + void AddToPGEvents(const sync_pb::UserEventSpecifics& event); + + // Clear the list of sent PhishGuard events. + void ClearPGEvents(); + // Register the new WebUI listener object. void RegisterWebUIInstance(SafeBrowsingUIHandler* webui); @@ -121,6 +137,10 @@ return webui_instances_; } + const std::vector<sync_pb::UserEventSpecifics>& pg_event_log() const { + return pg_event_log_; + } + private: WebUIInfoSingleton(); ~WebUIInfoSingleton(); @@ -140,6 +160,10 @@ // functions that call AllowJavascript(), which is not marked const. std::vector<std::unique_ptr<ClientSafeBrowsingReportRequest>> csbrrs_sent_; + // List of PhishGuard events sent since the oldest currently open + // chrome://safe-browsing tab was opened. + std::vector<sync_pb::UserEventSpecifics> pg_event_log_; + // List of WebUI listener objects. "SafeBrowsingUIHandler*" cannot be const, // due to being used by functions that call AllowJavascript(), which is not // marked const.
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java index e5e086a..c513524 100644 --- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java +++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
@@ -11,6 +11,7 @@ import android.accounts.AuthenticatorDescription; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; @@ -193,6 +194,8 @@ RecordHistogram.recordTimesHistogram(histogramName, elapsedMs, TimeUnit.MILLISECONDS); } + // No permission is needed on 23+ and Chrome always has MANAGE_ACCOUNTS permission on lower APIs + @SuppressLint("MissingPermission") @Override public void createAddAccountIntent(Callback<Intent> callback) { AccountManagerCallback<Bundle> accountManagerCallback = accountManagerFuture -> { @@ -208,6 +211,8 @@ accountManagerCallback, null); } + // No permission is needed on 23+ and Chrome always has MANAGE_ACCOUNTS permission on lower APIs + @SuppressLint("MissingPermission") @Override public void updateCredentials( Account account, Activity activity, final Callback<Boolean> callback) {
diff --git a/components/ssl_errors/BUILD.gn b/components/ssl_errors/BUILD.gn index eda7b32f..4a635e2 100644 --- a/components/ssl_errors/BUILD.gn +++ b/components/ssl_errors/BUILD.gn
@@ -34,6 +34,8 @@ "//components/network_time:network_time_test_support", "//components/prefs:test_support", "//net:test_support", + "//services/network:test_support", + "//services/network/public/cpp:cpp", "//testing/gtest", ] }
diff --git a/components/ssl_errors/DEPS b/components/ssl_errors/DEPS index 9960302..9f17bba7 100644 --- a/components/ssl_errors/DEPS +++ b/components/ssl_errors/DEPS
@@ -5,5 +5,7 @@ "+components/strings/grit/components_strings.h", "+components/url_formatter", "+net", + "+services/network/public/cpp", + "+services/network/test", "+ui/base" ]
diff --git a/components/ssl_errors/error_classification_unittest.cc b/components/ssl_errors/error_classification_unittest.cc index c77081c..be7b8ad 100644 --- a/components/ssl_errors/error_classification_unittest.cc +++ b/components/ssl_errors/error_classification_unittest.cc
@@ -10,6 +10,7 @@ #include "base/message_loop/message_loop.h" #include "base/strings/string_split.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_task_environment.h" #include "base/test/simple_test_clock.h" #include "base/test/simple_test_tick_clock.h" #include "base/threading/thread_task_runner_handle.h" @@ -26,7 +27,9 @@ #include "net/test/embedded_test_server/http_response.h" #include "net/test/test_certificate_data.h" #include "net/test/test_data_directory.h" -#include "net/url_request/url_request_test_util.h" +#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" +#include "services/network/test/test_shared_url_loader_factory.h" +#include "services/network/test/test_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -53,6 +56,9 @@ return field_trial_test_.get(); } + protected: + network::TestURLLoaderFactory test_url_loader_factory_; + private: std::unique_ptr<network_time::FieldTrialTest> field_trial_test_; }; @@ -214,7 +220,7 @@ EXPECT_TRUE(ssl_errors::IsHostnameNonUniqueOrDotless("foo.blah")); } -TEST(ErrorClassification, LevenshteinDistance) { +TEST_F(SSLErrorClassificationTest, LevenshteinDistance) { EXPECT_EQ(0u, ssl_errors::GetLevenshteinDistance("banana", "banana")); EXPECT_EQ(2u, ssl_errors::GetLevenshteinDistance("ab", "ba")); @@ -252,8 +258,8 @@ network_time::NetworkTimeTracker network_time_tracker( std::make_unique<base::DefaultClock>(), std::make_unique<base::DefaultTickClock>(), &pref_service, - new net::TestURLRequestContextGetter( - base::ThreadTaskRunnerHandle::Get())); + base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( + &test_url_loader_factory_)); ssl_errors::SetBuildTimeForTesting(base::Time::Now()); EXPECT_EQ( @@ -359,10 +365,11 @@ // Tests that all possible NetworkClockState histogram values are recorded // appropriately. TEST_F(SSLErrorClassificationTest, NetworkClockStateHistogram) { - base::Thread io_thread("IO thread"); - base::Thread::Options thread_options; - thread_options.message_loop_type = base::MessageLoop::TYPE_IO; - EXPECT_TRUE(io_thread.StartWithOptions(thread_options)); + base::test::ScopedTaskEnvironment task_environment( + base::test::ScopedTaskEnvironment::MainThreadType::IO); + + scoped_refptr<network::TestSharedURLLoaderFactory> shared_url_loader_factory = + base::MakeRefCounted<network::TestSharedURLLoaderFactory>(); net::EmbeddedTestServer test_server; ASSERT_TRUE(test_server.InitializeAndListen()); @@ -377,12 +384,10 @@ clock->Advance(base::TimeDelta::FromDays(111)); tick_clock->Advance(base::TimeDelta::FromDays(222)); - base::MessageLoop loop; network_time::NetworkTimeTracker network_time_tracker( std::unique_ptr<base::Clock>(clock), std::unique_ptr<const base::TickClock>(tick_clock), &pref_service, - new net::TestURLRequestContextGetter(io_thread.task_runner())); - network_time_tracker.SetTimeServerURLForTesting(test_server.GetURL("/")); + shared_url_loader_factory); field_trial_test()->SetNetworkQueriesWithVariationsService( true, 0.0, network_time::NetworkTimeTracker::FETCHES_IN_BACKGROUND_AND_ON_DEMAND); @@ -475,6 +480,4 @@ histograms.ExpectBucketCount( kNetworkTimeHistogram, ssl_errors::NETWORK_CLOCK_STATE_UNKNOWN_SYNC_LOST, 1); - - io_thread.Stop(); }
diff --git a/components/sync_bookmarks/BUILD.gn b/components/sync_bookmarks/BUILD.gn index ff03f1d9..4d9d1a2 100644 --- a/components/sync_bookmarks/BUILD.gn +++ b/components/sync_bookmarks/BUILD.gn
@@ -12,6 +12,8 @@ "bookmark_data_type_controller.h", "bookmark_model_associator.cc", "bookmark_model_associator.h", + "bookmark_model_observer_impl.cc", + "bookmark_model_observer_impl.h", "bookmark_model_type_processor.cc", "bookmark_model_type_processor.h", "bookmark_sync_service.cc",
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc new file mode 100644 index 0000000..a0980d3 --- /dev/null +++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -0,0 +1,79 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sync_bookmarks/bookmark_model_observer_impl.h" + +namespace sync_bookmarks { + +BookmarkModelObserverImpl::BookmarkModelObserverImpl( + const base::RepeatingClosure& nudge_for_commit_closure, + SyncedBookmarkTracker* bookmark_tracker) + : bookmark_tracker_(bookmark_tracker), + nudge_for_commit_closure_(nudge_for_commit_closure) { + DCHECK(bookmark_tracker_); +} + +BookmarkModelObserverImpl::~BookmarkModelObserverImpl() = default; + +void BookmarkModelObserverImpl::BookmarkModelLoaded( + bookmarks::BookmarkModel* model, + bool ids_reassigned) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkModelBeingDeleted( + bookmarks::BookmarkModel* model) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkNodeMoved( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* old_parent, + int old_index, + const bookmarks::BookmarkNode* new_parent, + int new_index) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkNodeAdded( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* parent, + int index) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkNodeRemoved( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* parent, + int old_index, + const bookmarks::BookmarkNode* node, + const std::set<GURL>& removed_urls) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkAllUserNodesRemoved( + bookmarks::BookmarkModel* model, + const std::set<GURL>& removed_urls) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkNodeChanged( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* node) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkNodeFaviconChanged( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* node) { + NOTIMPLEMENTED(); +} + +void BookmarkModelObserverImpl::BookmarkNodeChildrenReordered( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* node) { + NOTIMPLEMENTED(); +} + +} // namespace sync_bookmarks
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.h b/components/sync_bookmarks/bookmark_model_observer_impl.h new file mode 100644 index 0000000..87777ad --- /dev/null +++ b/components/sync_bookmarks/bookmark_model_observer_impl.h
@@ -0,0 +1,70 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SYNC_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_IMPL_H_ +#define COMPONENTS_SYNC_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_IMPL_H_ + +#include <set> + +#include "base/callback.h" +#include "components/bookmarks/browser/bookmark_model_observer.h" +#include "url/gurl.h" + +namespace sync_bookmarks { + +class SyncedBookmarkTracker; + +// Class for listening to local changes in the bookmark model and updating +// metadata in SyncedBookmarkTracker, such that ultimately the processor exposes +// those local changes to the sync engine. +class BookmarkModelObserverImpl : public bookmarks::BookmarkModelObserver { + public: + // |bookmark_tracker_| must not be null and must outlive this object. + BookmarkModelObserverImpl( + const base::RepeatingClosure& nudge_for_commit_closure, + SyncedBookmarkTracker* bookmark_tracker); + ~BookmarkModelObserverImpl() override; + + // BookmarkModelObserver: + void BookmarkModelLoaded(bookmarks::BookmarkModel* model, + bool ids_reassigned) override; + void BookmarkModelBeingDeleted(bookmarks::BookmarkModel* model) override; + void BookmarkNodeMoved(bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* old_parent, + int old_index, + const bookmarks::BookmarkNode* new_parent, + int new_index) override; + void BookmarkNodeAdded(bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* parent, + int index) override; + void BookmarkNodeRemoved(bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* parent, + int old_index, + const bookmarks::BookmarkNode* node, + const std::set<GURL>& removed_urls) override; + void BookmarkAllUserNodesRemoved(bookmarks::BookmarkModel* model, + const std::set<GURL>& removed_urls) override; + void BookmarkNodeChanged(bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* node) override; + void BookmarkNodeFaviconChanged(bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* node) override; + void BookmarkNodeChildrenReordered( + bookmarks::BookmarkModel* model, + const bookmarks::BookmarkNode* node) override; + + private: + // Points to the tracker owned by the processor. It keeps the mapping between + // bookmark nodes and corresponding sync server entities. + SyncedBookmarkTracker* const bookmark_tracker_; + + // The callback used to inform the sync engine that there are local changes to + // be committed. + const base::RepeatingClosure nudge_for_commit_closure_; + + DISALLOW_COPY_AND_ASSIGN(BookmarkModelObserverImpl); +}; + +} // namespace sync_bookmarks + +#endif // COMPONENTS_SYNC_BOOKMARKS_BOOKMARK_MODEL_OBSERVER_IMPL_H_
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index 2162e5f..918ada7 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -15,6 +15,7 @@ #include "components/sync/engine/commit_queue.h" #include "components/sync/engine/model_type_processor_proxy.h" #include "components/sync/protocol/bookmark_model_metadata.pb.h" +#include "components/sync_bookmarks/bookmark_model_observer_impl.h" #include "components/undo/bookmark_undo_utils.h" namespace sync_bookmarks { @@ -157,9 +158,13 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!worker_); DCHECK(bookmark_model_); - DCHECK(bookmark_tracker_); worker_ = std::move(worker); + + // |bookmark_tracker_| is instantiated only after initial sync is done. + if (bookmark_tracker_) { + NudgeForCommitIfNeeded(); + } } void BookmarkModelTypeProcessor::DisconnectSync() { @@ -188,6 +193,16 @@ const syncer::UpdateResponseDataList& updates) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!bookmark_tracker_) { + // TODO(crbug.com/516866): Implement the merge logic. + auto model_type_state = std::make_unique<sync_pb::ModelTypeState>(); + model_type_state->set_initial_sync_done(true); + std::vector<NodeMetadataPair> nodes_metadata; + bookmark_tracker_ = std::make_unique<SyncedBookmarkTracker>( + std::move(nodes_metadata), std::move(model_type_state)); + } + // TODO(crbug.com/516866): Set the model type state. + ScopedRemoteUpdateBookmarks update_bookmarks(bookmark_model_, bookmark_undo_service_); @@ -449,6 +464,9 @@ bookmarks::BookmarkModel* model) { DCHECK(model); DCHECK(!bookmark_model_); + DCHECK(!bookmark_tracker_); + DCHECK(!bookmark_model_observer_); + bookmark_model_ = model; schedule_save_closure_ = schedule_save_closure; @@ -458,8 +476,8 @@ auto model_type_state = std::make_unique<sync_pb::ModelTypeState>(); model_type_state->Swap(model_metadata.mutable_model_type_state()); - std::vector<NodeMetadataPair> nodes_metadata; if (model_type_state->initial_sync_done()) { + std::vector<NodeMetadataPair> nodes_metadata; for (sync_pb::BookmarkMetadata& bookmark_metadata : *model_metadata.mutable_bookmarks_metadata()) { // TODO(crbug.com/516866): Replace with a more efficient way to retrieve @@ -489,14 +507,21 @@ metadata->Swap(bookmark_metadata.mutable_metadata()); nodes_metadata.emplace_back(node, std::move(metadata)); } + // TODO(crbug.com/516866): Handle local nodes that don't have a + // corresponding + // metadata. + bookmark_tracker_ = std::make_unique<SyncedBookmarkTracker>( + std::move(nodes_metadata), std::move(model_type_state)); + + bookmark_model_observer_ = std::make_unique<BookmarkModelObserverImpl>( + base::BindRepeating(&BookmarkModelTypeProcessor::NudgeForCommitIfNeeded, + base::Unretained(this)), + bookmark_tracker_.get()); + // TODO(crbug.com/516866): Register the observer with the bookmark model. } else if (!model_metadata.bookmarks_metadata().empty()) { DLOG(ERROR) << "Persisted Metadata not empty while initial sync is not done."; } - // TODO(crbug.com/516866): Handle local nodes that don't have a corresponding - // metadata. - bookmark_tracker_ = std::make_unique<SyncedBookmarkTracker>( - std::move(nodes_metadata), std::move(model_type_state)); ConnectIfReady(); } @@ -546,16 +571,32 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); NOTIMPLEMENTED(); } + +void BookmarkModelTypeProcessor::NudgeForCommitIfNeeded() { + DCHECK(bookmark_tracker_); + // Don't bother sending anything if there's no one to send to. + if (!worker_) { + return; + } + + // Nudge worker if there are any entities with local changes. + if (bookmark_tracker_->HasLocalChanges()) { + worker_->NudgeForCommit(); + } +} + void BookmarkModelTypeProcessor::GetAllNodesForDebugging( AllNodesCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); NOTIMPLEMENTED(); } + void BookmarkModelTypeProcessor::GetStatusCountersForDebugging( StatusCountersCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); NOTIMPLEMENTED(); } + void BookmarkModelTypeProcessor::RecordMemoryUsageHistogram() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); NOTIMPLEMENTED();
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.h b/components/sync_bookmarks/bookmark_model_type_processor.h index 81039d7..a3cf45b 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.h +++ b/components/sync_bookmarks/bookmark_model_type_processor.h
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/callback.h" #include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -26,6 +27,8 @@ namespace sync_bookmarks { +class BookmarkModelObserverImpl; + class BookmarkModelTypeProcessor : public syncer::ModelTypeProcessor, public syncer::ModelTypeControllerDelegate { public: @@ -127,6 +130,11 @@ // If preconditions are met, inform sync that we are ready to connect. void ConnectIfReady(); + // Nudges worker if there are any local entities to be committed. Should only + // be called after initial sync is done and processor is tracking sync + // entities. + void NudgeForCommitIfNeeded(); + // Stores the start callback in between OnSyncStarting() and // DecodeSyncMetadata(). StartCallback start_callback_; @@ -153,12 +161,13 @@ // useful in tests. std::unique_ptr<syncer::CommitQueue> worker_; - // Keeps the mapping between server ids and bookmarks nodes. It also caches - // the metadata upon a local change until the commit configration is received. - // It is constructed and set during DecodeSyncMetadata(), which is called - // during startup, as part of the bookmark-loading process. + // Keeps the mapping between server ids and bookmarks nodes together with sync + // metadata. It is constructed and set during DecodeSyncMetadata(), which is + // called during startup, as part of the bookmark-loading process. std::unique_ptr<SyncedBookmarkTracker> bookmark_tracker_; + std::unique_ptr<BookmarkModelObserverImpl> bookmark_model_observer_; + base::WeakPtrFactory<BookmarkModelTypeProcessor> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(BookmarkModelTypeProcessor);
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.cc b/components/sync_bookmarks/synced_bookmark_tracker.cc index 8e1bd28..e82787368 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker.cc +++ b/components/sync_bookmarks/synced_bookmark_tracker.cc
@@ -129,6 +129,11 @@ return model_metadata; } +bool SyncedBookmarkTracker::HasLocalChanges() const { + NOTIMPLEMENTED(); + return false; +} + std::size_t SyncedBookmarkTracker::TrackedEntitiesCountForTest() const { return sync_id_to_entities_map_.size(); }
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.h b/components/sync_bookmarks/synced_bookmark_tracker.h index bd5ce24..8bb34a1 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker.h +++ b/components/sync_bookmarks/synced_bookmark_tracker.h
@@ -98,6 +98,9 @@ sync_pb::BookmarkModelMetadata BuildBookmarkModelMetadata() const; + // Returns true if there are any local entities to be committed. + bool HasLocalChanges() const; + // Returns number of tracked entities. Used only in test. std::size_t TrackedEntitiesCountForTest() const;
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc index b3d0d88f..8d5eaa17 100644 --- a/components/sync_sessions/local_session_event_handler_impl.cc +++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -46,77 +46,6 @@ window_delegate.HasWindow(); } -// Each sync id should only ever be used once. Previously there existed a race -// condition which could cause them to be duplicated, see -// https://crbug.com/639009 for more information. This counts the number of -// times each id is used so that the second window/tab loop can act on every -// tab using duplicate ids. Lastly, it is important to note that this -// duplication scan is only checking the in-memory tab state. On Android, if -// we have no tabbed window, we may also have sync data with conflicting sync -// ids, but to keep this logic simple and less error prone, we do not attempt -// to do anything clever. -// -// Returns tabs grouped by sync id (tab_node_id). -std::map<int, std::vector<SyncedTabDelegate*>> GroupTabsBySyncId( - const SyncedWindowDelegatesGetter::SyncedWindowDelegateMap& windows) { - std::map<int, std::vector<SyncedTabDelegate*>> tabs_per_sync_id; - int duplicate_count = 0; - for (auto& window_iter_pair : windows) { - const SyncedWindowDelegate* window_delegate = window_iter_pair.second; - for (int j = 0; j < window_delegate->GetTabCount(); ++j) { - SyncedTabDelegate* synced_tab = window_delegate->GetTabAt(j); - if (!synced_tab || - synced_tab->GetSyncId() == TabNodePool::kInvalidTabNodeID) { - continue; - } - std::vector<SyncedTabDelegate*>* synced_tabs = - &tabs_per_sync_id[synced_tab->GetSyncId()]; - synced_tabs->push_back(synced_tab); - if (synced_tabs->size() > 1) { - // If an id is used more than twice, this count will be a bit odd, - // but for our purposes, it will be sufficient. - duplicate_count++; - } - } - } - - if (duplicate_count > 0) { - UMA_HISTOGRAM_COUNTS_100("Sync.SesssionsDuplicateSyncId", duplicate_count); - } - return tabs_per_sync_id; -} - -// Function to resolve a conflict when multiple tabs reported by the delegate -// contain a shared sync ID (tab_node_id). |initially_associated_tab_id| can be -// invalid if |tab_node_id| is currently not associated in the tracker. -const SyncedTabDelegate* ResolveConflictingSyncId( - int tab_node_id, - SessionID initially_associated_tab_id, - const std::vector<SyncedTabDelegate*>& synced_tabs) { - DCHECK_GT(synced_tabs.size(), 1U); - // If among the conflicting tabs, there's one which matches what sync knows - // about, we should prefer that. This should be rare but is possible for - // example if a Custom tab was being synced without a tabbed window, and - // suddenly the tabbed window shows up with conflicting sync IDs. - for (const SyncedTabDelegate* synced_tab : synced_tabs) { - if (synced_tab->GetSessionId() == initially_associated_tab_id) { - return synced_tab; - } - } - // In doubt, prefer placeholder tabs, because changing the sync ID for a - // placeholder tab (to amend the conflict) won't get persisted by Android - // session restore code (only non-placeholder tabs are saved). - for (const SyncedTabDelegate* synced_tab : synced_tabs) { - if (synced_tab->IsPlaceholderTab()) { - // If multiple placeholder tabs have the same sync ID, choose among them - // arbitrarily. - return synced_tab; - } - } - // We have multiple conflicting non-placeholder tabs, so choose arbitrarily. - return synced_tabs.front(); -} - } // namespace LocalSessionEventHandlerImpl::WriteBatch::WriteBatch() = default; @@ -148,7 +77,6 @@ void LocalSessionEventHandlerImpl::OnSessionRestoreComplete() { std::unique_ptr<WriteBatch> batch = delegate_->CreateLocalSessionWriteBatch(); - AssociateExistingSyncIds(); AssociateWindows(RELOAD_TABS, ScanForTabbedWindow(), batch.get()); batch->Commit(); } @@ -159,36 +87,6 @@ return GetTabSpecificsFromDelegate(tab_delegate); } -void LocalSessionEventHandlerImpl::AssociateExistingSyncIds() { - const SyncedWindowDelegatesGetter::SyncedWindowDelegateMap windows = - sessions_client_->GetSyncedWindowDelegatesGetter() - ->GetSyncedWindowDelegates(); - - const std::map<int, std::vector<SyncedTabDelegate*>> tabs_per_sync_id = - GroupTabsBySyncId(windows); - - for (const auto& sync_id_and_tabs : tabs_per_sync_id) { - const int tab_node_id = sync_id_and_tabs.first; - const std::vector<SyncedTabDelegate*>& tabs = sync_id_and_tabs.second; - - const SessionID initially_associated_tab_id = - session_tracker_->LookupTabIdFromTabNodeId(current_session_tag_, - tab_node_id); - const SyncedTabDelegate* selected_tab = - tabs.size() == 1 ? tabs.front() - : ResolveConflictingSyncId( - tab_node_id, initially_associated_tab_id, tabs); - // Execute the result of the conflict resolution. - session_tracker_->ReassociateLocalTab(tab_node_id, - selected_tab->GetSessionId()); - for (SyncedTabDelegate* synced_tab : tabs) { - if (synced_tab != selected_tab) { - synced_tab->SetSyncId(TabNodePool::kInvalidTabNodeID); - } - } - } -} - void LocalSessionEventHandlerImpl::AssociateWindows(ReloadTabsOption option, bool has_tabbed_window, WriteBatch* batch) { @@ -258,20 +156,13 @@ // Placeholder tabs are those without WebContents, either because they // were never loaded into memory or they were evicted from memory - // (typically only on Android devices). They only have a tab id, - // window id, and a saved synced id (corresponding to the tab node - // id). Note that only placeholders have this sync id, as it's - // necessary to properly reassociate the tab with the entity that was - // backing it. + // (typically only on Android devices). They only have a window ID and a + // tab ID, and we use the latter to properly reassociate the tab with the + // entity that was backing it. if (synced_tab->IsPlaceholderTab()) { - // For tabs without WebContents update the |tab_id| and |window_id|, - // as it could have changed after a session restore. - if (synced_tab->GetSyncId() > TabNodePool::kInvalidTabNodeID) { - AssociateRestoredPlaceholderTab(*synced_tab, tab_id, window_id, - batch); - } else { - DVLOG(1) << "Placeholder tab " << tab_id.id() << " has no sync id."; - } + // For tabs without WebContents update |window_id|, as it could have + // changed after a session restore. + AssociateRestoredPlaceholderTab(*synced_tab, tab_id, window_id, batch); } else if (RELOAD_TABS == option) { AssociateTab(synced_tab, has_tabbed_window, batch); } @@ -357,8 +248,7 @@ session_tracker_->LookupTabNodeFromTabId(current_session_tag_, tab_id); if (tab_node_id != TabNodePool::kInvalidTabNodeID) { - DCHECK(tab_delegate->GetSyncId() == TabNodePool::kInvalidTabNodeID || - tab_delegate->GetSyncId() == tab_node_id); + // Already associated, so do nothing. } else if (has_tabbed_window) { // Allocate a new (or reused) sync node for this tab. tab_node_id = session_tracker_->AssociateLocalTabWithFreeTabNode(tab_id); @@ -374,8 +264,6 @@ return; } - tab_delegate->SetSyncId(tab_node_id); - // Get the previously synced url. sessions::SessionTab* session_tab = session_tracker_->GetTab(current_session_tag_, tab_id); @@ -473,7 +361,6 @@ bool found_tabbed_window = ScanForTabbedWindow(); std::unique_ptr<WriteBatch> batch = delegate_->CreateLocalSessionWriteBatch(); - AssociateExistingSyncIds(); AssociateTab(modified_tab, found_tabbed_window, batch.get()); // Note, we always associate windows because it's possible a tab became // "interesting" by going to a valid URL, in which case it needs to be added @@ -495,17 +382,24 @@ void LocalSessionEventHandlerImpl::AssociateRestoredPlaceholderTab( const SyncedTabDelegate& tab_delegate, - SessionID new_tab_id, + SessionID tab_id, SessionID new_window_id, WriteBatch* batch) { - int tab_node_id = tab_delegate.GetSyncId(); - DCHECK_NE(tab_node_id, TabNodePool::kInvalidTabNodeID); - DCHECK_EQ(new_tab_id, session_tracker_->LookupTabIdFromTabNodeId( - current_session_tag_, tab_node_id)); + const int tab_node_id = + session_tracker_->LookupTabNodeFromTabId(current_session_tag_, tab_id); + + // If a placeholder tab is not present in the tracker, we must ignore it + // because the delegate doesn't expose sufficient information to start + // tracking the tab (e.g. navigations are missing). + if (tab_node_id == TabNodePool::kInvalidTabNodeID) { + DVLOG(1) << "Placeholder tab " << tab_id << " has no sync id."; + return; + } // Update the window id on the SessionTab itself. sessions::SessionTab* local_tab = - session_tracker_->GetTab(current_session_tag_, new_tab_id); + session_tracker_->GetTab(current_session_tag_, tab_id); + // TODO(mastiz): Return early if the window ID hasn't changed. local_tab->window_id = new_window_id; // Filter out placeholder tabs that have been associated but don't have known
diff --git a/components/sync_sessions/local_session_event_handler_impl.h b/components/sync_sessions/local_session_event_handler_impl.h index 40e549f..30f3a67b 100644 --- a/components/sync_sessions/local_session_event_handler_impl.h +++ b/components/sync_sessions/local_session_event_handler_impl.h
@@ -79,15 +79,6 @@ private: enum ReloadTabsOption { RELOAD_TABS, DONT_RELOAD_TABS }; - // Updates |session_tracker_| with tab_id<->tab_node_id association that the - // delegate already knows about, while resolving conflicts if the delegate - // reports conflicting sync IDs. This makes sure duplicate tab_node_id-s are - // not assigned. On return, the following conditions are met: - // 1. Delegate contains no duplicate sync IDs (tab_node_id). - // 2. Delegate contains no sync-ID <-> tab_id association that the tracker - // doesn't know about (but not the opposite). - void AssociateExistingSyncIds(); - void AssociateWindows(ReloadTabsOption option, bool has_tabbed_window, WriteBatch* batch); @@ -107,7 +98,7 @@ // compares new_tab_id and new_window_id against the previously persisted tab // ID and window ID (from our TabNodePool) and updates them if either differs. void AssociateRestoredPlaceholderTab(const SyncedTabDelegate& tab_delegate, - SessionID new_tab_id, + SessionID tab_id, SessionID new_window_id, WriteBatch* batch);
diff --git a/components/sync_sessions/local_session_event_handler_impl_unittest.cc b/components/sync_sessions/local_session_event_handler_impl_unittest.cc index a7b302a..862e908 100644 --- a/components/sync_sessions/local_session_event_handler_impl_unittest.cc +++ b/components/sync_sessions/local_session_event_handler_impl_unittest.cc
@@ -448,16 +448,16 @@ // In the current session, all we have is a custom tab. AddWindow(kWindowId3, sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB); - AddTab(kWindowId3, kFoo1, kTabId3)->SetSyncId(kCustomTabNodeId); + AddTab(kWindowId3, kFoo1, kTabId2); auto mock_batch = std::make_unique<StrictMock<MockWriteBatch>>(); EXPECT_CALL(*mock_batch, Put(Pointee(MatchesTab(kSessionTag, kWindowId3, - kTabId3, kCustomTabNodeId, + kTabId2, kCustomTabNodeId, /*urls=*/{kFoo1})))); EXPECT_CALL(*mock_batch, Put(Pointee(MatchesHeader(kSessionTag, {kWindowId1, kWindowId2, kWindowId3}, - {kTabId1, kTabId3})))); + {kTabId1, kTabId2})))); EXPECT_CALL(*mock_batch, Commit()); EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch()) @@ -469,32 +469,7 @@ MatchesSyncedSession(kSessionTag, {{kWindowId1, std::vector<int>{kTabId1}}, {kWindowId2, std::vector<int>()}, - {kWindowId3, std::vector<int>{kTabId3}}})); -} - -// Tests that calling initial association during construction handles the case -// where only a subset of tabs (and not the first) have a sync ID. -TEST_F(LocalSessionEventHandlerImplTest, AssociateTabsWhenOnlySomeHaveNodeIds) { - const int kTabNodeId = 0; - - AddWindow(kWindowId1); - AddTab(kWindowId1, kFoo1, kTabId1); - AddTab(kWindowId1, kBar1, kTabId2)->SetSyncId(kTabNodeId); - - auto mock_batch = std::make_unique<StrictMock<MockWriteBatch>>(); - EXPECT_CALL(*mock_batch, Put(Pointee(MatchesHeader(_, _, _)))); - EXPECT_CALL(*mock_batch, - Put(Pointee(MatchesTab(_, _, kTabId1, /*tab_node_id=*/1, - /*urls=*/_)))); - EXPECT_CALL(*mock_batch, - Put(Pointee(MatchesTab(_, _, kTabId2, - /*tab_node_id=*/kTabNodeId, /*urls=*/_)))); - EXPECT_CALL(*mock_batch, Commit()); - - EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch()) - .WillOnce(Return(ByMove(std::move(mock_batch)))); - - InitHandler(); + {kWindowId3, std::vector<int>{kTabId2}}})); } TEST_F(LocalSessionEventHandlerImplTest, PropagateNewNavigation) { @@ -627,10 +602,9 @@ AddWindow(kWindowId1, sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB); TestSyncedTabDelegate* tab1 = AddTab(kWindowId1, kFoo1, kTabId1); - tab1->SetSyncId(kTabNodeId1); AddWindow(kWindowId2, sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB); - AddTab(kWindowId2, kBar1, kTabId2)->SetSyncId(kTabNodeId2); + AddTab(kWindowId2, kBar1, kTabId2); InitHandler(); @@ -652,22 +626,5 @@ tab1->Navigate(kBaz1); } -TEST_F(LocalSessionEventHandlerImplTest, - PreferPlaceholderTabsWhenResolvingSyncIdConflict) { - const int kConflictingSyncId = 7; - // Set up a window with two tabs: one regular and one placeholder. - TestSyncedWindowDelegate* window = AddWindow(kWindowId1); - TestSyncedTabDelegate* regular_tab = AddTab(kWindowId1, kFoo1, kTabId1); - regular_tab->SetSyncId(kConflictingSyncId); - PlaceholderTabDelegate placeholder_tab( - SessionID::FromSerializedValue(kTabId2), kConflictingSyncId); - window->OverrideTabAt(1, &placeholder_tab); - - InitHandler(); - - EXPECT_EQ(kConflictingSyncId, placeholder_tab.GetSyncId()); - EXPECT_NE(kConflictingSyncId, regular_tab->GetSyncId()); -} - } // namespace } // namespace sync_sessions
diff --git a/components/sync_sessions/session_sync_bridge.cc b/components/sync_sessions/session_sync_bridge.cc index 88a4787..e748ccb 100644 --- a/components/sync_sessions/session_sync_bridge.cc +++ b/components/sync_sessions/session_sync_bridge.cc
@@ -261,9 +261,10 @@ ->TransferChangesTo(batch->GetMetadataChangeList()); SessionStore::WriteBatch::Commit(std::move(batch)); - // This might overtrigger because we don't check if the batch is empty, but - // observers should handle these events well so we don't bother detecting. - foreign_sessions_updated_callback_.Run(); + if (!entity_changes.empty()) { + foreign_sessions_updated_callback_.Run(); + } + return base::nullopt; }
diff --git a/components/sync_sessions/session_sync_bridge_unittest.cc b/components/sync_sessions/session_sync_bridge_unittest.cc index 337a0899..da54970 100644 --- a/components/sync_sessions/session_sync_bridge_unittest.cc +++ b/components/sync_sessions/session_sync_bridge_unittest.cc
@@ -519,19 +519,15 @@ TEST_F(SessionSyncBridgeTest, ShouldUpdateIdsDuringRestore) { const int kWindowId = 1000001; - const int kTabIdBeforeRestore1 = 1000002; - const int kTabIdBeforeRestore2 = 1000003; - const int kTabIdAfterRestore1 = 1000004; - const int kTabIdAfterRestore2 = 1000005; + const int kTabId1 = 1000002; + const int kTabId2 = 1000003; // Zero is the first assigned tab node ID. const int kTabNodeId1 = 0; const int kTabNodeId2 = 1; AddWindow(kWindowId); - TestSyncedTabDelegate* tab1 = - AddTab(kWindowId, "http://foo.com/", kTabIdBeforeRestore1); - TestSyncedTabDelegate* tab2 = - AddTab(kWindowId, "http://bar.com/", kTabIdBeforeRestore2); + AddTab(kWindowId, "http://foo.com/", kTabId1); + AddTab(kWindowId, "http://bar.com/", kTabId2); const std::string header_storage_key = SessionStore::GetHeaderStorageKey(kLocalSessionTag); @@ -543,29 +539,26 @@ InitializeBridge(); StartSyncing(); - ASSERT_THAT(tab1->GetSyncId(), Eq(kTabNodeId1)); - ASSERT_THAT(tab2->GetSyncId(), Eq(kTabNodeId2)); - ASSERT_THAT(GetData(header_storage_key), - EntityDataHasSpecifics( - MatchesHeader(kLocalSessionTag, {kWindowId}, - {kTabIdBeforeRestore1, kTabIdBeforeRestore2}))); - ASSERT_THAT(GetData(tab_storage_key1), - EntityDataHasSpecifics( - MatchesTab(kLocalSessionTag, kWindowId, kTabIdBeforeRestore1, - kTabNodeId1, {"http://foo.com/"}))); - ASSERT_THAT(GetData(tab_storage_key2), - EntityDataHasSpecifics( - MatchesTab(kLocalSessionTag, kWindowId, kTabIdBeforeRestore2, - kTabNodeId2, {"http://bar.com/"}))); + EntityDataHasSpecifics(MatchesHeader( + kLocalSessionTag, {kWindowId}, {kTabId1, kTabId2}))); + ASSERT_THAT( + GetData(tab_storage_key1), + EntityDataHasSpecifics(MatchesTab(kLocalSessionTag, kWindowId, kTabId1, + kTabNodeId1, {"http://foo.com/"}))); + ASSERT_THAT( + GetData(tab_storage_key2), + EntityDataHasSpecifics(MatchesTab(kLocalSessionTag, kWindowId, kTabId2, + kTabNodeId2, {"http://bar.com/"}))); ShutdownBridge(); - // Override tabs with placeholder tab delegates. + // Override tabs with placeholder tab delegates. Note that, on Android, tab + // IDs are persisted by session restore across browser restarts. PlaceholderTabDelegate placeholder_tab1( - SessionID::FromSerializedValue(kTabIdAfterRestore1), tab1->GetSyncId()); + SessionID::FromSerializedValue(kTabId1)); PlaceholderTabDelegate placeholder_tab2( - SessionID::FromSerializedValue(kTabIdAfterRestore2), tab2->GetSyncId()); + SessionID::FromSerializedValue(kTabId2)); ResetWindows(); TestSyncedWindowDelegate* window = AddWindow(kWindowId); window->OverrideTabAt(0, &placeholder_tab1); @@ -576,74 +569,61 @@ EXPECT_CALL(mock_processor(), Put(header_storage_key, EntityDataHasSpecifics(MatchesHeader( - kLocalSessionTag, {kWindowId}, - {kTabIdAfterRestore1, kTabIdAfterRestore2})), + kLocalSessionTag, {kWindowId}, {kTabId1, kTabId2})), _)); - EXPECT_CALL(mock_processor(), - Put(tab_storage_key1, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId, kTabIdAfterRestore1, - kTabNodeId1, {"http://foo.com/"})), - _)); - EXPECT_CALL(mock_processor(), - Put(tab_storage_key2, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId, kTabIdAfterRestore2, - kTabNodeId2, {"http://bar.com/"})), - _)); + EXPECT_CALL(mock_processor(), Put(tab_storage_key1, + EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId, kTabId1, + kTabNodeId1, {"http://foo.com/"})), + _)); + EXPECT_CALL(mock_processor(), Put(tab_storage_key2, + EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId, kTabId2, + kTabNodeId2, {"http://bar.com/"})), + _)); // Start the bridge again. InitializeBridge(); StartSyncing(); - EXPECT_THAT(placeholder_tab1.GetSyncId(), Eq(kTabNodeId1)); - EXPECT_THAT(placeholder_tab2.GetSyncId(), Eq(kTabNodeId2)); - EXPECT_THAT(GetData(header_storage_key), - EntityDataHasSpecifics( - MatchesHeader(kLocalSessionTag, {kWindowId}, - {kTabIdAfterRestore1, kTabIdAfterRestore2}))); - EXPECT_THAT(GetData(tab_storage_key1), - EntityDataHasSpecifics( - MatchesTab(kLocalSessionTag, kWindowId, kTabIdAfterRestore1, - kTabNodeId1, {"http://foo.com/"}))); - EXPECT_THAT(GetData(tab_storage_key2), - EntityDataHasSpecifics( - MatchesTab(kLocalSessionTag, kWindowId, kTabIdAfterRestore2, - kTabNodeId2, {"http://bar.com/"}))); + EntityDataHasSpecifics(MatchesHeader( + kLocalSessionTag, {kWindowId}, {kTabId1, kTabId2}))); + EXPECT_THAT( + GetData(tab_storage_key1), + EntityDataHasSpecifics(MatchesTab(kLocalSessionTag, kWindowId, kTabId1, + kTabNodeId1, {"http://foo.com/"}))); + EXPECT_THAT( + GetData(tab_storage_key2), + EntityDataHasSpecifics(MatchesTab(kLocalSessionTag, kWindowId, kTabId2, + kTabNodeId2, {"http://bar.com/"}))); - EXPECT_THAT(GetAllData(), - UnorderedElementsAre( - Pair(header_storage_key, - EntityDataHasSpecifics(MatchesHeader( - kLocalSessionTag, {kWindowId}, - {kTabIdAfterRestore1, kTabIdAfterRestore2}))), - Pair(tab_storage_key1, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId, kTabIdAfterRestore1, - kTabNodeId1, {"http://foo.com/"}))), - Pair(tab_storage_key2, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId, kTabIdAfterRestore2, - kTabNodeId2, {"http://bar.com/"}))))); + EXPECT_THAT( + GetAllData(), + UnorderedElementsAre( + Pair(header_storage_key, + EntityDataHasSpecifics(MatchesHeader( + kLocalSessionTag, {kWindowId}, {kTabId1, kTabId2}))), + Pair(tab_storage_key1, EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId, kTabId1, + kTabNodeId1, {"http://foo.com/"}))), + Pair(tab_storage_key2, EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId, kTabId2, + kTabNodeId2, {"http://bar.com/"}))))); } TEST_F(SessionSyncBridgeTest, ShouldIgnoreUnsyncablePlaceholderTabDuringRestore) { const int kWindowId = 1000001; - const int kTabIdBeforeRestore1 = 1000002; - const int kTabIdBeforeRestore2 = 1000003; - const int kTabIdAfterRestore1 = 1000004; - const int kTabIdAfterRestore2 = 1000005; + const int kTabId1 = 1000002; + const int kTabId2 = 1000003; // Zero is the first assigned tab node ID. const int kTabNodeId1 = 0; AddWindow(kWindowId); - TestSyncedTabDelegate* tab1 = - AddTab(kWindowId, "http://foo.com/", kTabIdBeforeRestore1); + AddTab(kWindowId, "http://foo.com/", kTabId1); // Tab 2 is unsyncable because of the URL scheme. - TestSyncedTabDelegate* tab2 = - AddTab(kWindowId, "about:blank", kTabIdBeforeRestore2); + AddTab(kWindowId, "about:blank", kTabId2); const std::string header_storage_key = SessionStore::GetHeaderStorageKey(kLocalSessionTag); @@ -653,26 +633,24 @@ InitializeBridge(); StartSyncing(); - ASSERT_THAT(tab1->GetSyncId(), Eq(kTabNodeId1)); - ASSERT_THAT(tab2->GetSyncId(), Eq(TabNodePool::kInvalidTabNodeID)); - - ASSERT_THAT(GetAllData(), - UnorderedElementsAre( - Pair(header_storage_key, EntityDataHasSpecifics(MatchesHeader( - kLocalSessionTag, {kWindowId}, - {kTabIdBeforeRestore1}))), - Pair(tab_storage_key1, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId, kTabIdBeforeRestore1, - kTabNodeId1, {"http://foo.com/"}))))); + ASSERT_THAT( + GetAllData(), + UnorderedElementsAre( + Pair(header_storage_key, + EntityDataHasSpecifics( + MatchesHeader(kLocalSessionTag, {kWindowId}, {kTabId1}))), + Pair(tab_storage_key1, EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId, kTabId1, + kTabNodeId1, {"http://foo.com/"}))))); ShutdownBridge(); - // Override tabs with placeholder tab delegates. + // Override tabs with placeholder tab delegates. Note that, on Android, tab + // IDs are persisted by session restore across browser restarts. PlaceholderTabDelegate placeholder_tab1( - SessionID::FromSerializedValue(kTabIdAfterRestore1), tab1->GetSyncId()); + SessionID::FromSerializedValue(kTabId1)); PlaceholderTabDelegate placeholder_tab2( - SessionID::FromSerializedValue(kTabIdAfterRestore2), tab2->GetSyncId()); + SessionID::FromSerializedValue(kTabId2)); ResetWindows(); TestSyncedWindowDelegate* window = AddWindow(kWindowId); window->OverrideTabAt(0, &placeholder_tab1); @@ -682,18 +660,15 @@ InitializeBridge(); StartSyncing(); - EXPECT_THAT(placeholder_tab1.GetSyncId(), Eq(kTabNodeId1)); - EXPECT_THAT(placeholder_tab2.GetSyncId(), Eq(TabNodePool::kInvalidTabNodeID)); - - EXPECT_THAT(GetAllData(), - UnorderedElementsAre( - Pair(header_storage_key, EntityDataHasSpecifics(MatchesHeader( - kLocalSessionTag, {kWindowId}, - {kTabIdAfterRestore1}))), - Pair(tab_storage_key1, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, kWindowId, kTabIdAfterRestore1, - kTabNodeId1, {"http://foo.com/"}))))); + EXPECT_THAT( + GetAllData(), + UnorderedElementsAre( + Pair(header_storage_key, + EntityDataHasSpecifics( + MatchesHeader(kLocalSessionTag, {kWindowId}, {kTabId1}))), + Pair(tab_storage_key1, EntityDataHasSpecifics(MatchesTab( + kLocalSessionTag, kWindowId, kTabId1, + kTabNodeId1, {"http://foo.com/"}))))); } // Ensure that tabbed windows from a previous session are preserved if no @@ -906,84 +881,6 @@ {"http://foo.com/", "http://baz.com/"}))))); } -// Ensure that newly assigned tab node IDs do not conflict with IDs provided -// by the delegate, for IDs the tracker might not know about. This is possible -// for example if an Android client gets killed after Android's tab restore -// has flushed the sync ID to disk, but before the sync database has been -// written. -TEST_F(SessionSyncBridgeTest, ShouldHonorUnknownSyncIdsFromDelegate) { - const int kWindowId = 1000001; - const int kTabNodeId = 0; - - // In a previous run of a browser, we associated sync ID 0 to the second tab - // below, which the Android tab restore database succeeded to flush to disk. - // The sync_sessions counterpart (SessionStore) however didn't, because writes - // are not atomic. - AddWindow(kWindowId); - AddTab(kWindowId, "http://foo.com/"); - AddTab(kWindowId, "http://bar.com/")->SetSyncId(kTabNodeId); - - InitializeBridge(); - StartSyncing(); - - EXPECT_THAT( - GetAllData(), - UnorderedElementsAre( - Pair(_, - EntityDataHasSpecifics(MatchesHeader(kLocalSessionTag, _, _))), - Pair(_, - EntityDataHasSpecifics(MatchesTab( - kLocalSessionTag, _, _, kTabNodeId, {"http://bar.com/"}))), - Pair(_, EntityDataHasSpecifics(MatchesTab(kLocalSessionTag, _, _, - /*tab_node_id=*/1, - {"http://foo.com/"}))))); -} - -// Ensure that unsyncable tabs are ignored even if the delegate reports a sync -// ID (because the tab used to be syncable). -TEST_F(SessionSyncBridgeTest, - ShouldHonorUnknownSyncIdsFromDelegateWithUnsyncableTab) { - const int kWindowId = 1000001; - const int kTabId = 1000002; - const int kTabNodeId = 0; - - AddWindow(kWindowId); - AddTab(kWindowId, "about:blank", kTabId)->SetSyncId(kTabNodeId); - - InitializeBridge(); - - EXPECT_CALL(mock_processor(), - Put(_, - EntityDataHasSpecifics( - MatchesHeader(kLocalSessionTag, {kWindowId}, {kTabId})), - _)); - - StartSyncing(); - - // As a regression test for crbug.com/846480, we verify that restarting the - // bridge without tabbed windows doesn't crash or issue more calls to Put(). - // This is only problematic because, in the current implementation and as - // reflected in the assertion below, the unsyncable tab is still stored in - // the local model. - ASSERT_THAT(GetAllData(), - UnorderedElementsAre( - Pair(_, EntityDataHasSpecifics(MatchesHeader( - kLocalSessionTag, {kWindowId}, {kTabId}))), - Pair(_, EntityDataHasSpecifics( - MatchesTab(kLocalSessionTag, kWindowId, kTabId, - kTabNodeId, /*urls=*/{}))))); - - ShutdownBridge(); - ResetWindows(); - InitializeBridge(); - StartSyncing(); - EXPECT_THAT( - GetAllData(), - ElementsAre(Pair(_, EntityDataHasSpecifics(MatchesHeader( - kLocalSessionTag, /*window_ids=*/SizeIs(1), - /*tab_ids=*/SizeIs(1)))))); -} - TEST_F(SessionSyncBridgeTest, ShouldDisableSyncAndReenable) { const int kWindowId = 1000001; const int kTabId = 1000002; @@ -1384,6 +1281,20 @@ NotNull()); } +// Verifies that receiving an empty update list does not broadcast a foreign +// session change via the corresponding callback. +TEST_F(SessionSyncBridgeTest, ShouldNotBroadcastUpdatesIfEmpty) { + InitializeBridge(); + StartSyncing(); + + EXPECT_CALL(mock_foreign_sessions_updated_callback(), Run()).Times(0); + + // Mimic receiving an empty list of remote updates. + sync_pb::ModelTypeState state; + state.set_initial_sync_done(true); + real_processor()->OnUpdateReceived(state, {}); +} + TEST_F(SessionSyncBridgeTest, ShouldDoGarbageCollection) { // We construct two identical sessions, one modified recently, one modified // more than |kStaleSessionThreshold| ago (14 days ago).
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc index 6752a690..fa9ec44 100644 --- a/components/sync_sessions/sessions_sync_manager_unittest.cc +++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -43,7 +43,6 @@ const char kBar1[] = "http://bar1/"; const char kBar2[] = "http://bar2/"; const char kBaz1[] = "http://baz1/"; -const char kBaz2[] = "http://baz2/"; const char kTag1[] = "tag1"; const char kTag2[] = "tag2"; @@ -519,91 +518,6 @@ VerifyLocalHeaderChange(out[1], 2, 2); } -// Create a placeholder and a non-placeholder that have the same sync ids. Only -// the non-placeholder should survive. This state should be impossible for up -// to date clients to enter. -TEST_F(SessionsSyncManagerTest, ConflictingSyncIdsWithPlaceholder) { - syncer::SyncDataList in; - syncer::SyncChangeList out; - - // First sync with one tab and one window. - TestSyncedWindowDelegate* window = AddWindow(); - AddTab(window->GetSessionId(), kFoo1); - InitWithSyncDataTakeOutput(in, &out); - - in = GetDataFromChanges(out); - int conflicting_sync_id = - out[1].sync_data().GetSpecifics().session().tab_node_id(); - out.clear(); - // There should be two entities, a header and a tab. - ASSERT_EQ(2U, in.size()); - - manager()->StopSyncing(syncer::SESSIONS); - - // The main window's tab is now a placeholder, and we have a conflicting id - // for the custom tab. The placeholder cannot be fixed, so the custom tab will - // be assigned a new ID. - PlaceholderTabDelegate tab2(SessionID::NewUnique(), conflicting_sync_id); - window->OverrideTabAt(0, &tab2); - - TestSyncedWindowDelegate* window2 = - AddWindow(sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB); - TestSyncedTabDelegate* tab3 = AddTab(window2->GetSessionId(), kBar1); - tab3->SetSyncId(conflicting_sync_id); - window2->OverrideTabAt(0, tab3); - - InitWithSyncDataTakeOutput(ConvertToRemote(in), &out); - - ASSERT_TRUE( - ChangeTypeMatches(out, {SyncChange::ACTION_UPDATE, SyncChange::ACTION_ADD, - SyncChange::ACTION_UPDATE})); - VerifyLocalTabChange(out[0], 1, kFoo1); - VerifyLocalTabChange(out[1], 1, kBar1); - VerifyLocalHeaderChange(out[2], 2, 2); - - EXPECT_EQ(conflicting_sync_id, - out[0].sync_data().GetSpecifics().session().tab_node_id()); - EXPECT_NE(conflicting_sync_id, - out[1].sync_data().GetSpecifics().session().tab_node_id()); -} - -// Create two tabs with the same sync id, which is an invalid state. The manager -// should strip both of the sync ids, and then new ones should be generated. -// This state should be impossible for up to date clients to enter. -TEST_F(SessionsSyncManagerTest, ConflictingSyncIdsBothReal) { - syncer::SyncDataList in; - syncer::SyncChangeList out; - - TestSyncedWindowDelegate* window = AddWindow(); - TestSyncedTabDelegate* tab1 = AddTab(window->GetSessionId(), kFoo1); - TestSyncedTabDelegate* tab2 = AddTab(window->GetSessionId(), kBar1); - - // The pool wants to start vending numbers 0, 1, 2, ... etc. So we're - // guaranteed that when the manager clears the sync ids, it will be replaced - // with smaller values. - int dupe_sync_id = 13; - tab1->SetSyncId(dupe_sync_id); - tab2->SetSyncId(dupe_sync_id); - - InitWithSyncDataTakeOutput(in, &out); - // Header creation, two tab creations, and header update. - ASSERT_TRUE(ChangeTypeMatches( - out, {SyncChange::ACTION_ADD, SyncChange::ACTION_ADD, - SyncChange::ACTION_ADD, SyncChange::ACTION_UPDATE})); - VerifyLocalHeaderChange(out[0], 0, 0); - VerifyLocalTabChange(out[1], 1, kFoo1); - VerifyLocalTabChange(out[2], 1, kBar1); - VerifyLocalHeaderChange(out[3], 1, 2); - - // The sync ids should have been fixed for exactly one of the two tabs. - EXPECT_EQ(dupe_sync_id, - out[1].sync_data().GetSpecifics().session().tab_node_id()); - EXPECT_NE(dupe_sync_id, - out[2].sync_data().GetSpecifics().session().tab_node_id()); - EXPECT_NE(out[1].sync_data().GetSpecifics().session().tab_node_id(), - out[2].sync_data().GetSpecifics().session().tab_node_id()); -} - // Tests MergeDataAndStartSyncing with sync data but no local data. TEST_F(SessionsSyncManagerTest, MergeWithInitialForeignSession) { std::vector<sync_pb::SessionSpecifics> tabs1; @@ -667,10 +581,6 @@ VerifyLocalTabChange(out[1], tab->GetEntryCount(), kBaz1); VerifyLocalTabChange(out[2], tab2->GetEntryCount(), kBar2); VerifyLocalHeaderChange(out[3], 1, 2); - - // Verify tab delegates have Sync ids. - EXPECT_EQ(0, window->GetTabAt(0)->GetSyncId()); - EXPECT_EQ(1, window->GetTabAt(1)->GetSyncId()); } // Ensure that the last known device name is reported. @@ -1237,12 +1147,13 @@ changes[1].sync_data().GetSpecifics().session().tab_node_id(); // Pass back the previous tab and header nodes at association, along with a - // second tab node (with a rewritten tab node id). + // second tab node (with rewritten tab IDs). SyncDataList in; in.push_back( CreateRemoteData(changes[2].sync_data().GetSpecifics())); // Header node. sync_pb::SessionSpecifics new_tab( changes[1].sync_data().GetSpecifics().session()); + new_tab.mutable_tab()->set_tab_id(new_tab.tab().tab_id() + 1); new_tab.set_tab_node_id(tab_node_id + 1); in.push_back(CreateRemoteData( changes[1].sync_data().GetSpecifics())); // Old tab node. @@ -1444,10 +1355,6 @@ VerifyLocalHeaderChange(out[index++], 1, i + 1); } } - - // Verify tab delegates have Sync ids. - EXPECT_EQ(0, window->GetTabAt(0)->GetSyncId()); - EXPECT_EQ(1, window->GetTabAt(1)->GetSyncId()); } TEST_F(SessionsSyncManagerTest, ForeignSessionModifiedTime) { @@ -1892,58 +1799,46 @@ // Ensure model association associates the pre-existing tabs. TEST_F(SessionsSyncManagerTest, SwappedOutOnRestore) { - const int kRestoredTabId = 1337; - const SessionID kNewTabId = SessionID::FromSerializedValue(2468); - // Start with three tabs in a window. TestSyncedWindowDelegate* window = AddWindow(); TestSyncedTabDelegate* tab1 = AddTab(window->GetSessionId(), kFoo1); tab1->Navigate(kFoo2); TestSyncedTabDelegate* tab2 = AddTab(window->GetSessionId(), kBar1); tab2->Navigate(kBar2); - TestSyncedTabDelegate* tab3 = AddTab(window->GetSessionId(), kBaz1); - tab3->Navigate(kBaz2); SyncDataList in; SyncChangeList out; InitWithSyncDataTakeOutput(in, &out); - // Should be one header add, 3 tab adds/updates, one header update. - ASSERT_EQ(5U, out.size()); + // Should be one header add, 2 tab adds/updates, one header update. + ASSERT_EQ(4U, out.size()); // Now update the sync data to be: // * one "normal" fully loaded tab - // * one placeholder tab with no WebContents and a tab_id change // * one placeholder tab with no WebContents and no tab_id change sync_pb::EntitySpecifics t0_entity = out[1].sync_data().GetSpecifics(); sync_pb::EntitySpecifics t1_entity = out[2].sync_data().GetSpecifics(); - t1_entity.mutable_session()->mutable_tab()->set_tab_id(kRestoredTabId); - sync_pb::EntitySpecifics t2_entity = out[3].sync_data().GetSpecifics(); in.push_back(CreateRemoteData(t0_entity)); in.push_back(CreateRemoteData(t1_entity)); - in.push_back(CreateRemoteData(t2_entity)); out.clear(); manager()->StopSyncing(syncer::SESSIONS); - PlaceholderTabDelegate t1_override(kNewTabId, 1); - PlaceholderTabDelegate t2_override( - SessionID::FromSerializedValue(t2_entity.session().tab().tab_id()), 2); + PlaceholderTabDelegate t1_override( + SessionID::FromSerializedValue(t1_entity.session().tab().tab_id())); window->OverrideTabAt(1, &t1_override); - window->OverrideTabAt(2, &t2_override); InitWithSyncDataTakeOutput(in, &out); // The last change should be the final header update, reflecting 1 window - // and 3 tabs. - VerifyLocalHeaderChange(out.back(), 1, 3); + // and 2 tabs. + VerifyLocalHeaderChange(out.back(), 1, 2); - // There should be three changes, one for the fully associated tab, and - // one each for the tab_id updates to t1 and t2. + // There should be two changes, one for the fully associated tab and one for + // the placeholder tab (window ID change). ASSERT_TRUE(AllOfChangesAreType(*FilterOutLocalHeaderChanges(&out), SyncChange::ACTION_UPDATE)); - ASSERT_EQ(3U, out.size()); + ASSERT_EQ(2U, out.size()); VerifyLocalTabChange(out[0], 2, kFoo2); VerifyLocalTabChange(out[1], 2, kBar2); - VerifyLocalTabChange(out[2], 2, kBaz2); } // Ensure model association updates the window ID for tabs whose window's ID has @@ -1969,8 +1864,7 @@ // Override the tab with a placeholder tab delegate. PlaceholderTabDelegate t0_override( - SessionID::FromSerializedValue(t0_entity.session().tab().tab_id()), - t0_entity.session().tab_node_id()); + SessionID::FromSerializedValue(t0_entity.session().tab().tab_id())); // Set up the window with the new window ID and placeholder tab. window = AddWindow(); @@ -2005,8 +1899,7 @@ // Override the tab with a placeholder tab delegate. PlaceholderTabDelegate t0_override( - SessionID::FromSerializedValue(t0_entity.session().tab().tab_id()), - t0_entity.session().tab_node_id()); + SessionID::FromSerializedValue(t0_entity.session().tab().tab_id())); // Override the tab with a placeholder whose sync entity won't exist. window->OverrideTabAt(0, &t0_override); @@ -2017,49 +1910,6 @@ ASSERT_EQ(0U, FilterOutLocalHeaderChanges(&out)->size()); } -// Check the behavior for a placeholder tab in one window being mapped to the -// same sync entity as a tab in another window. The order should not matter. -// One of the two tabs should have its sync ids reset. Assuming a well behaved -// client, this should never happen. -TEST_F(SessionsSyncManagerTest, PlaceholderConflictAcrossWindows) { - syncer::SyncDataList in; - syncer::SyncChangeList out; - - // First sync with one tab and one window. - TestSyncedWindowDelegate* window = AddWindow(); - TestSyncedTabDelegate* tab1 = AddTab(window->GetSessionId(), kFoo1); - InitWithSyncDataTakeOutput(in, &out); - ASSERT_TRUE(out[1].sync_data().GetSpecifics().session().has_tab()); - manager()->StopSyncing(syncer::SESSIONS); - - // Now create a second window with a placeholder that has the same sync id, - // but a different tab id. - TestSyncedWindowDelegate* window2 = AddWindow(); - int sync_id = out[1].sync_data().GetSpecifics().session().tab_node_id(); - PlaceholderTabDelegate tab2(SessionID::NewUnique(), sync_id); - window2->OverrideTabAt(0, &tab2); - - // Resync, reusing the old sync data. - in.push_back(CreateRemoteData(out[0].sync_data().GetSpecifics())); - in.push_back(CreateRemoteData(out[1].sync_data().GetSpecifics())); - out.clear(); - InitWithSyncDataTakeOutput(in, &out); - - // The two tabs have the same sync id, which is not allowed. One will have - // its id stripped, but being a placeholder tab it won't be vended a new sync - // ID so it won't get updated. - ASSERT_TRUE(ChangeTypeMatches( - out, {SyncChange::ACTION_UPDATE, SyncChange::ACTION_UPDATE})); - VerifyLocalTabChange(out[0], 1, kFoo1); - VerifyLocalHeaderChange(out[1], 1, 1); - - EXPECT_NE(tab1->GetSyncId(), tab2.GetSyncId()); - EXPECT_EQ(tab1->GetSessionId().id(), - out[0].sync_data().GetSpecifics().session().tab().tab_id()); - EXPECT_EQ(tab1->GetSyncId(), - out[0].sync_data().GetSpecifics().session().tab_node_id()); -} - // Tests that task ids are generated for navigations on local tabs. TEST_F(SessionsSyncManagerTest, TrackTasksOnLocalTabModified) { SyncChangeList changes;
diff --git a/components/sync_sessions/synced_tab_delegate.h b/components/sync_sessions/synced_tab_delegate.h index c5c5a15..d4043df 100644 --- a/components/sync_sessions/synced_tab_delegate.h +++ b/components/sync_sessions/synced_tab_delegate.h
@@ -28,11 +28,16 @@ // Methods from TabContents. virtual SessionID GetWindowId() const = 0; + // Tab identifier: two tabs with the same ID (even across browser restarts) + // will be considered identical. Tab/session restore may or may not be able + // to restore this value, which means the opposite is not true: having + // distinct IDs does not imply they are distinct tabs. virtual SessionID GetSessionId() const = 0; virtual bool IsBeingDestroyed() const = 0; // Get the tab id of the tab responsible for opening this tab, if applicable. // Returns an invalid ID if no such tab relationship is known. + // TODO(mastiz): Rename to GetSourceTabSessionId(). virtual SessionID GetSourceTabID() const = 0; // Method derived from extensions TabHelper. @@ -56,8 +61,6 @@ GetBlockedNavigations() const = 0; // Session sync related methods. - virtual int GetSyncId() const = 0; - virtual void SetSyncId(int sync_id) = 0; virtual bool ShouldSync(SyncSessionsClient* sessions_client) = 0; // Whether this tab is a placeholder tab. On some platforms, tabs can be
diff --git a/components/sync_sessions/test_synced_window_delegates_getter.cc b/components/sync_sessions/test_synced_window_delegates_getter.cc index ac5585d..4b121b5 100644 --- a/components/sync_sessions/test_synced_window_delegates_getter.cc +++ b/components/sync_sessions/test_synced_window_delegates_getter.cc
@@ -131,14 +131,6 @@ return false; } -int TestSyncedTabDelegate::GetSyncId() const { - return sync_id_; -} - -void TestSyncedTabDelegate::SetSyncId(int sync_id) { - sync_id_ = sync_id; -} - bool TestSyncedTabDelegate::ShouldSync(SyncSessionsClient* sessions_client) { // This is just a simple filter that isn't meant to fully reproduce // the TabContentsTabDelegate's ShouldSync logic. @@ -158,8 +150,8 @@ return SessionID::InvalidValue(); } -PlaceholderTabDelegate::PlaceholderTabDelegate(SessionID tab_id, int sync_id) - : tab_id_(tab_id), sync_id_(sync_id) {} +PlaceholderTabDelegate::PlaceholderTabDelegate(SessionID tab_id) + : tab_id_(tab_id) {} PlaceholderTabDelegate::~PlaceholderTabDelegate() = default; @@ -167,14 +159,6 @@ return tab_id_; } -int PlaceholderTabDelegate::GetSyncId() const { - return sync_id_; -} - -void PlaceholderTabDelegate::SetSyncId(int sync_id) { - sync_id_ = sync_id; -} - bool PlaceholderTabDelegate::IsPlaceholderTab() const { return true; }
diff --git a/components/sync_sessions/test_synced_window_delegates_getter.h b/components/sync_sessions/test_synced_window_delegates_getter.h index 4348fcb..eab3eac4 100644 --- a/components/sync_sessions/test_synced_window_delegates_getter.h +++ b/components/sync_sessions/test_synced_window_delegates_getter.h
@@ -58,8 +58,6 @@ const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>* GetBlockedNavigations() const override; bool IsPlaceholderTab() const override; - int GetSyncId() const override; - void SetSyncId(int sync_id) override; bool ShouldSync(SyncSessionsClient* sessions_client) override; SessionID GetSourceTabID() const override; @@ -70,7 +68,6 @@ int current_entry_index_ = -1; bool is_supervised_ = false; - int sync_id_ = -1; std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> blocked_navigations_; std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> @@ -85,13 +82,11 @@ // memory. See SyncedTabDelegate::IsPlaceHolderTab for more info. class PlaceholderTabDelegate : public SyncedTabDelegate { public: - PlaceholderTabDelegate(SessionID tab_id, int sync_id); + explicit PlaceholderTabDelegate(SessionID tab_id); ~PlaceholderTabDelegate() override; // SyncedTabDelegate overrides. SessionID GetSessionId() const override; - int GetSyncId() const override; - void SetSyncId(int sync_id) override; bool IsPlaceholderTab() const override; // Everything else is invalid to invoke as it depends on a valid WebContents. SessionID GetWindowId() const override; @@ -114,7 +109,6 @@ private: const SessionID tab_id_; - int sync_id_ = -1; DISALLOW_COPY_AND_ASSIGN(PlaceholderTabDelegate); };
diff --git a/components/test/data/autofill/web_page_replay_support_files/wpr_cert.pem b/components/test/data/autofill/web_page_replay_support_files/wpr_cert.pem new file mode 100644 index 0000000..b9d7f2b40 --- /dev/null +++ b/components/test/data/autofill/web_page_replay_support_files/wpr_cert.pem
@@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWDCCAkACCQCjJ6dB+xU8zTANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEjAQBgNVBAoMCVJpY2sg +TGFiczEUMBIGA1UECwwLTW9ydHkgR3JvdXAxFjAUBgNVBAMMDVJpY2sgTGFicyBJ +bmMwHhcNMTgwMTI5MTcwNTQyWhcNMjgwMTI3MTcwNTQyWjBuMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEjAQBgNVBAoMCVJpY2sg +TGFiczEUMBIGA1UECwwLTW9ydHkgR3JvdXAxFjAUBgNVBAMMDVJpY2sgTGFicyBJ +bmMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvan2SUSEOhQe2pVH2 +59NQEet3ekDqpojqPLQ5i7ZC9YQccZQqNpq5uNd6jesABMkoa4tgBCV7VwyiRJfz +1jM6d1Rv/pVSWBUaB1kbAAgwmdXQ+kyfij99xMJVgThFydXQ8d7lX53aPzitqr8M +nQL1FxcWQZQojBXEXfx1evtrz86SXh/USWI1SmXUPi3Dtb2XqkhKzR56/MM1DDNB +GFwxbvr5jDOt4lSF88YnbI8hyuaC7D38sMjeM+peNBDhnW2JRUQzbAJxz7b1pbxr +f6JAi2YYz7MFX3vsIRDqsV79oBlg5F0Q0XMioh710SwzQlb2Evhg85Lr2pAprStr +owe1AgMBAAEwDQYJKoZIhvcNAQELBQADggEBALDIsZwlKykoJbz9oOmlm6GHqiBA +FVD23ulvw+WDS18zDXmtYuKfXxecXKqFuI+Q90TinZBIqqBTRw7ncRm8apBxC2cr +mwQ+7H6pC1yiI5xL3wQvPSs7+HWMVApEo0wD7/HWxC42Wo7Sh3tWJ5Pp0zSiCeOC +7IKaN26mpsH+HCT3SDFIAkxP93ZZ+VLR+0BTeHplop8bj4ApMrcwFSn7PmMP7+mD +Z6TaZfMjzuoX0Uw56WemxnbEhTj0xP2bEK7LlC2vvykzfBvx5r8qTTr4QFN4NaOW +/JUrXf1RNvkF0R+C09ftRJqBRU15vPQF9bZ4jFqUAvMIw/6ABTY+2MgwOkk= +-----END CERTIFICATE----- \ No newline at end of file
diff --git a/components/test/data/autofill/web_page_replay_support_files/wpr_key.pem b/components/test/data/autofill/web_page_replay_support_files/wpr_key.pem new file mode 100644 index 0000000..b9d7f2b40 --- /dev/null +++ b/components/test/data/autofill/web_page_replay_support_files/wpr_key.pem
@@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWDCCAkACCQCjJ6dB+xU8zTANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEjAQBgNVBAoMCVJpY2sg +TGFiczEUMBIGA1UECwwLTW9ydHkgR3JvdXAxFjAUBgNVBAMMDVJpY2sgTGFicyBJ +bmMwHhcNMTgwMTI5MTcwNTQyWhcNMjgwMTI3MTcwNTQyWjBuMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEjAQBgNVBAoMCVJpY2sg +TGFiczEUMBIGA1UECwwLTW9ydHkgR3JvdXAxFjAUBgNVBAMMDVJpY2sgTGFicyBJ +bmMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvan2SUSEOhQe2pVH2 +59NQEet3ekDqpojqPLQ5i7ZC9YQccZQqNpq5uNd6jesABMkoa4tgBCV7VwyiRJfz +1jM6d1Rv/pVSWBUaB1kbAAgwmdXQ+kyfij99xMJVgThFydXQ8d7lX53aPzitqr8M +nQL1FxcWQZQojBXEXfx1evtrz86SXh/USWI1SmXUPi3Dtb2XqkhKzR56/MM1DDNB +GFwxbvr5jDOt4lSF88YnbI8hyuaC7D38sMjeM+peNBDhnW2JRUQzbAJxz7b1pbxr +f6JAi2YYz7MFX3vsIRDqsV79oBlg5F0Q0XMioh710SwzQlb2Evhg85Lr2pAprStr +owe1AgMBAAEwDQYJKoZIhvcNAQELBQADggEBALDIsZwlKykoJbz9oOmlm6GHqiBA +FVD23ulvw+WDS18zDXmtYuKfXxecXKqFuI+Q90TinZBIqqBTRw7ncRm8apBxC2cr +mwQ+7H6pC1yiI5xL3wQvPSs7+HWMVApEo0wD7/HWxC42Wo7Sh3tWJ5Pp0zSiCeOC +7IKaN26mpsH+HCT3SDFIAkxP93ZZ+VLR+0BTeHplop8bj4ApMrcwFSn7PmMP7+mD +Z6TaZfMjzuoX0Uw56WemxnbEhTj0xP2bEK7LlC2vvykzfBvx5r8qTTr4QFN4NaOW +/JUrXf1RNvkF0R+C09ftRJqBRU15vPQF9bZ4jFqUAvMIw/6ABTY+2MgwOkk= +-----END CERTIFICATE----- \ No newline at end of file
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc index a55a443..c272a95 100644 --- a/components/translate/core/browser/translate_manager.cc +++ b/components/translate/core/browser/translate_manager.cc
@@ -311,6 +311,13 @@ ->ReportAcceptedAfterForceTriggerOnEnglishPages(); } + // If the target language isn't in the chrome://settings/languages list, add + // it there. This way, it's obvious to the user that Chrome is remembering + // their choice, they can remove it from the list, and they'll send that + // language in the Accept-Language header, giving servers a chance to serve + // them pages in that language. + AddTargetLanguageToAcceptLanguages(target_lang); + // Translation can be kicked by context menu against unsupported languages. // Unsupported language strings should be replaced with // kUnknownLanguageCode in order to send a translation request with enabling @@ -597,4 +604,15 @@ return false; } +void TranslateManager::AddTargetLanguageToAcceptLanguages( + const std::string& target_language_code) { + auto prefs = translate_client_->GetTranslatePrefs(); + std::vector<std::string> languages; + prefs->GetLanguageList(&languages); + if (std::find(languages.begin(), languages.end(), target_language_code) == + languages.end()) { + prefs->AddToLanguageList(target_language_code, /*force_blocked=*/false); + } +} + } // namespace translate
diff --git a/components/translate/core/browser/translate_manager.h b/components/translate/core/browser/translate_manager.h index d6dc7b1..5a644af 100644 --- a/components/translate/core/browser/translate_manager.h +++ b/components/translate/core/browser/translate_manager.h
@@ -172,6 +172,9 @@ const std::string& dst_lang, const TranslatePrefs& translate_prefs); + void AddTargetLanguageToAcceptLanguages( + const std::string& target_language_code); + // Sequence number of the current page. int page_seq_no_;
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc index db47296..2b31765f 100644 --- a/components/translate/core/browser/translate_manager_unittest.cc +++ b/components/translate/core/browser/translate_manager_unittest.cc
@@ -556,6 +556,46 @@ translate::TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR, 1); } +TEST_F(TranslateManagerTest, LanguageAddedToAcceptLanguagesAfterTranslation) { + manager_->set_application_locale("en"); + TranslateManager::SetIgnoreMissingKeyForTesting(true); + mock_language_model_.details = { + MockLanguageModel::LanguageDetails("hi", 0.5), + }; + ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL())) + .WillByDefault(Return(true)); + TranslateAcceptLanguages accept_langugages(&prefs_, accept_languages_prefs); + ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages()) + .WillByDefault(Return(&accept_langugages)); + + translate_manager_.reset(new translate::TranslateManager( + &mock_translate_client_, &mock_translate_ranker_, &mock_language_model_)); + + // Accept languages shouldn't contain "hi" before translating to that language + std::vector<std::string> languages; + mock_translate_client_.GetTranslatePrefs()->GetLanguageList(&languages); + EXPECT_EQ(languages.end(), + std::find(languages.begin(), languages.end(), "hi")); + + base::HistogramTester histogram_tester; + prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true); + translate_manager_->GetLanguageState().LanguageDetermined("en", true); + network_notifier_.SimulateOnline(); + + translate_manager_->InitiateTranslation("en"); + histogram_tester.ExpectUniqueSample( + kInitiationStatusName, + translate::TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR, 1); + + translate_manager_->TranslatePage("en", "hi", false); + + // Accept languages should now contain "hi" because the user chose to + // translate to it once. + mock_translate_client_.GetTranslatePrefs()->GetLanguageList(&languages); + EXPECT_NE(languages.end(), + std::find(languages.begin(), languages.end(), "hi")); +} + TEST_F(TranslateManagerTest, DontTranslateOffline) { TranslateManager::SetIgnoreMissingKeyForTesting(true); translate_manager_.reset(new translate::TranslateManager(
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc index ddf3a838..76dc414 100644 --- a/components/translate/core/browser/translate_prefs.cc +++ b/components/translate/core/browser/translate_prefs.cc
@@ -268,6 +268,12 @@ const auto& it = std::find(languages.begin(), languages.end(), chrome_language); if (it != languages.end()) { + // If the language being removed is the most recent language, erase that + // data so that Chrome won't try to translate to it next time Translate is + // triggered. + if (chrome_language == GetRecentTargetLanguage()) + SetRecentTargetLanguage(""); + languages.erase(it); UpdateLanguageList(languages);
diff --git a/components/translate/core/browser/translate_prefs.h b/components/translate/core/browser/translate_prefs.h index 0c0ac19f..e16a9316 100644 --- a/components/translate/core/browser/translate_prefs.h +++ b/components/translate/core/browser/translate_prefs.h
@@ -308,6 +308,8 @@ FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, UnblockLanguage); FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, AddToLanguageList); FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, RemoveFromLanguageList); + FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, + RemoveFromLanguageListClearsRecentLanguage); FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, AddToLanguageListFeatureEnabled); FRIEND_TEST_ALL_PREFIXES(TranslatePrefsTest, RemoveFromLanguageListFeatureEnabled);
diff --git a/components/translate/core/browser/translate_prefs_unittest.cc b/components/translate/core/browser/translate_prefs_unittest.cc index f64f0b9..bbe6062 100644 --- a/components/translate/core/browser/translate_prefs_unittest.cc +++ b/components/translate/core/browser/translate_prefs_unittest.cc
@@ -751,6 +751,25 @@ ExpectBlockedLanguageListContent({"en", "es"}); } +TEST_F(TranslatePrefsTest, RemoveFromLanguageListClearsRecentLanguage) { + std::vector<std::string> languages; + + // Unblock last language of a family. + languages = {"en-US", "es-AR"}; + translate_prefs_->UpdateLanguageList(languages); + translate_prefs_->SetRecentTargetLanguage("en-US"); + EXPECT_EQ("en-US", translate_prefs_->GetRecentTargetLanguage()); + + translate_prefs_->RemoveFromLanguageList("es-AR"); + EXPECT_EQ("en-US", translate_prefs_->GetRecentTargetLanguage()); + + translate_prefs_->UpdateLanguageList(languages); + EXPECT_EQ("en-US", translate_prefs_->GetRecentTargetLanguage()); + + translate_prefs_->RemoveFromLanguageList("en-US"); + EXPECT_EQ("", translate_prefs_->GetRecentTargetLanguage()); +} + TEST_F(TranslatePrefsTest, MoveLanguageToTheTop) { std::vector<std::string> languages; std::string enabled;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 4e9c824f..d19df7f 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -2103,8 +2103,6 @@ "accessibility/web_contents_accessibility_android.h", "android/content_ui_event_handler.cc", "android/content_ui_event_handler.h", - "android/content_view_core.cc", - "android/content_view_core.h", "android/content_view_statics.cc", "android/date_time_chooser_android.cc", "android/date_time_chooser_android.h",
diff --git a/content/browser/android/content_view_core.cc b/content/browser/android/content_view_core.cc deleted file mode 100644 index 25123a21..0000000 --- a/content/browser/android/content_view_core.cc +++ /dev/null
@@ -1,147 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/android/content_view_core.h" - -#include "content/browser/frame_host/interstitial_page_impl.h" -#include "content/browser/renderer_host/render_widget_host_view_android.h" -#include "content/browser/web_contents/web_contents_impl.h" -#include "content/browser/web_contents/web_contents_view_android.h" -#include "content/public/browser/render_view_host.h" -#include "content/public/common/content_client.h" -#include "content/public/common/user_agent.h" -#include "jni/ContentViewCoreImpl_jni.h" -#include "ui/android/window_android.h" - -using base::android::AttachCurrentThread; -using base::android::JavaParamRef; -using base::android::JavaRef; -using base::android::ScopedJavaLocalRef; - -namespace content { - -namespace { - -RenderWidgetHostViewAndroid* GetRenderWidgetHostViewFromHost( - RenderViewHost* host) { - return static_cast<RenderWidgetHostViewAndroid*>( - host->GetWidget()->GetView()); -} - -} // namespace - -ContentViewCore::ContentViewCore(JNIEnv* env, - const JavaRef<jobject>& obj, - WebContents* web_contents) - : WebContentsObserver(web_contents), - java_ref_(env, obj), - web_contents_(static_cast<WebContentsImpl*>(web_contents)) { - // Currently, the only use case we have for overriding a user agent involves - // spoofing a desktop Linux user agent for "Request desktop site". - // Automatically set it for all WebContents so that it is available when a - // NavigationEntry requires the user agent to be overridden. - const char kLinuxInfoStr[] = "X11; Linux x86_64"; - std::string product = content::GetContentClient()->GetProduct(); - std::string spoofed_ua = - BuildUserAgentFromOSAndProduct(kLinuxInfoStr, product); - web_contents->SetUserAgentOverride(spoofed_ua, false); -} - -ContentViewCore::~ContentViewCore() { - JNIEnv* env = base::android::AttachCurrentThread(); - ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env); - java_ref_.reset(); - if (!j_obj.is_null()) { - Java_ContentViewCoreImpl_onNativeContentViewCoreDestroyed( - env, j_obj, reinterpret_cast<intptr_t>(this)); - } -} - -void ContentViewCore::OnJavaContentViewCoreDestroyed( - JNIEnv* env, - const JavaParamRef<jobject>& obj) { - DCHECK(env->IsSameObject(java_ref_.get(env).obj(), obj)); - java_ref_.reset(); - // Java peer has gone, ContentViewCore is not functional and waits to - // be destroyed with WebContents. - DCHECK(web_contents_); -} - -void ContentViewCore::RenderViewReady() { - WebContentsViewAndroid* view = - static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); - if (view->device_orientation() == 0) - return; - RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid(); - if (rwhva) - rwhva->UpdateScreenInfo(GetViewAndroid()); - - web_contents_->OnScreenOrientationChange(); -} - -void ContentViewCore::WebContentsDestroyed() { - delete this; -} - -void ContentViewCore::RenderViewHostChanged(RenderViewHost* old_host, - RenderViewHost* new_host) { - if (old_host) { - auto* view = GetRenderWidgetHostViewFromHost(old_host); - if (view) - view->UpdateNativeViewTree(nullptr); - - view = GetRenderWidgetHostViewFromHost(new_host); - if (view) - view->UpdateNativeViewTree(GetViewAndroid()); - } - SetFocusInternal(GetViewAndroid()->HasFocus()); -} - -RenderWidgetHostViewAndroid* ContentViewCore::GetRenderWidgetHostViewAndroid() - const { - RenderWidgetHostView* rwhv = NULL; - if (web_contents_) { - rwhv = web_contents_->GetRenderWidgetHostView(); - if (web_contents_->ShowingInterstitialPage()) { - rwhv = web_contents_->GetInterstitialPage() - ->GetMainFrame() - ->GetRenderViewHost() - ->GetWidget() - ->GetView(); - } - } - return static_cast<RenderWidgetHostViewAndroid*>(rwhv); -} - -ui::ViewAndroid* ContentViewCore::GetViewAndroid() const { - return web_contents_->GetView()->GetNativeView(); -} - -// ---------------------------------------------------------------------------- -// Methods called from Java via JNI -// ---------------------------------------------------------------------------- - -void ContentViewCore::SetFocusInternal(bool focused) { - if (!GetRenderWidgetHostViewAndroid()) - return; - - if (focused) - GetRenderWidgetHostViewAndroid()->GotFocus(); - else - GetRenderWidgetHostViewAndroid()->LostFocus(); -} - -// This is called for each ContentView. -jlong JNI_ContentViewCoreImpl_Init(JNIEnv* env, - const JavaParamRef<jobject>& obj, - const JavaParamRef<jobject>& jweb_contents) { - WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( - WebContents::FromJavaWebContents(jweb_contents)); - CHECK(web_contents) - << "A ContentViewCore should be created with a valid WebContents."; - return reinterpret_cast<intptr_t>( - new ContentViewCore(env, obj, web_contents)); -} - -} // namespace content
diff --git a/content/browser/android/content_view_core.h b/content/browser/android/content_view_core.h deleted file mode 100644 index a846c53..0000000 --- a/content/browser/android/content_view_core.h +++ /dev/null
@@ -1,70 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_H_ -#define CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_H_ - -#include "base/android/jni_android.h" -#include "base/android/jni_weak_ref.h" -#include "base/android/scoped_java_ref.h" -#include "base/macros.h" -#include "content/public/browser/web_contents_observer.h" - -namespace ui { -class ViewAndroid; -} - -namespace content { - -class RenderWidgetHostViewAndroid; -class WebContentsImpl; - -class ContentViewCore : public WebContentsObserver { - public: - ContentViewCore(JNIEnv* env, - const base::android::JavaRef<jobject>& obj, - WebContents* web_contents); - - ~ContentViewCore() override; - - // -------------------------------------------------------------------------- - // Methods called from Java via JNI - // -------------------------------------------------------------------------- - - void OnJavaContentViewCoreDestroyed( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj); - - private: - - // WebContentsObserver implementation. - void RenderViewReady() override; - void RenderViewHostChanged(RenderViewHost* old_host, - RenderViewHost* new_host) override; - void WebContentsDestroyed() override; - - // -------------------------------------------------------------------------- - // Other private methods and data - // -------------------------------------------------------------------------- - - ui::ViewAndroid* GetViewAndroid() const; - - RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid() const; - - // Update focus state of the RenderWidgetHostView. - void SetFocusInternal(bool focused); - - // A weak reference to the Java ContentViewCore object. - JavaObjectWeakGlobalRef java_ref_; - - // Reference to the current WebContents used to determine how and what to - // display in the ContentViewCore. - WebContentsImpl* web_contents_; - - DISALLOW_COPY_AND_ASSIGN(ContentViewCore); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_ANDROID_CONTENT_VIEW_CORE_H_
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index 06b5f2da..5b9fca0 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -87,7 +87,6 @@ : WebContentsObserver(web_contents), owner_web_contents_(nullptr), attached_(false), - has_attached_since_surface_set_(false), browser_plugin_instance_id_(browser_plugin::kInstanceIDNone), focused_(false), mouse_locked_(false), @@ -409,7 +408,6 @@ void BrowserPluginGuest::SetChildFrameSurface( const viz::SurfaceInfo& surface_info) { - has_attached_since_surface_set_ = false; if (features::IsAshInBrowserProcess()) { SendMessageToEmbedder( std::make_unique<BrowserPluginMsg_SetChildFrameSurface>( @@ -796,7 +794,6 @@ InitInternal(params, embedder_web_contents); attached_ = true; - has_attached_since_surface_set_ = true; SendQueuedMessages(); delegate_->DidAttach(GetGuestProxyRoutingID());
diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index 964137d..7473387 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h
@@ -215,12 +215,6 @@ // Returns whether the guest is attached to an embedder. bool attached() const { return attached_; } - // Returns true when an attachment has taken place since the last time the - // compositor surface was set. - bool has_attached_since_surface_set() const { - return has_attached_since_surface_set_; - } - // Attaches this BrowserPluginGuest to the provided |embedder_web_contents| // and initializes the guest with the provided |params|. Attaching a guest // to an embedder implies that this guest's lifetime is no longer managed @@ -271,11 +265,6 @@ WebContentsImpl* web_contents, BrowserPluginGuestDelegate* delegate); - // Protected for testing. - void set_has_attached_since_surface_set_for_test(bool has_attached) { - has_attached_since_surface_set_ = has_attached; - } - void set_attached_for_test(bool attached) { attached_ = attached; } @@ -397,10 +386,6 @@ // Indicates whether this guest has been attached to a container. bool attached_; - // Used to signal if a browser plugin has been attached since the last time - // the compositing surface was set. - bool has_attached_since_surface_set_; - // An identifier that uniquely identifies a browser plugin within an embedder. int browser_plugin_instance_id_; gfx::Rect frame_rect_;
diff --git a/content/browser/browser_side_navigation_browsertest.cc b/content/browser/browser_side_navigation_browsertest.cc index 3165d3bf..626a64d 100644 --- a/content/browser/browser_side_navigation_browsertest.cc +++ b/content/browser/browser_side_navigation_browsertest.cc
@@ -458,8 +458,6 @@ data_url, Referrer(), ui::PAGE_TRANSITION_LINK, FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT, true /* allow_download */, false /* should_replace_current_entry */, - base::TimeTicks() /* ui_timestamp */, - FrameMsg_UILoadMetricsReportType::NO_REPORT, file_url, /* base_url_for_data_url */ GURL() /* history_url_for_data_url */, PREVIEWS_UNSPECIFIED, base::TimeTicks::Now() /* navigation_start */, "GET",
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc index 95c35fd..59f0ca10 100644 --- a/content/browser/frame_host/navigation_controller_impl.cc +++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -2529,14 +2529,6 @@ entry->set_has_user_gesture(params.has_user_gesture); #endif -#if defined(OS_ANDROID) - if (params.intent_received_timestamp > 0) { - entry->set_intent_received_timestamp( - base::TimeTicks() + - base::TimeDelta::FromMilliseconds(params.intent_received_timestamp)); - } -#endif - switch (params.load_type) { case LOAD_TYPE_DEFAULT: break;
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc index 87a83e4..b0fa217 100644 --- a/content/browser/frame_host/navigation_entry_impl.cc +++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -656,7 +656,6 @@ // ResetForCommit: should_replace_entry_ // ResetForCommit: should_clear_history_list_ // ResetForCommit: frame_tree_node_id_ - // ResetForCommit: intent_received_timestamp_ copy->has_user_gesture_ = has_user_gesture_; // ResetForCommit: reload_type_ copy->extra_data_ = extra_data_; @@ -673,30 +672,11 @@ FrameMsg_Navigate_Type::Value navigation_type, PreviewsState previews_state, const base::TimeTicks& navigation_start) const { - FrameMsg_UILoadMetricsReportType::Value report_type = - FrameMsg_UILoadMetricsReportType::NO_REPORT; - base::TimeTicks ui_timestamp = base::TimeTicks(); - -#if defined(OS_ANDROID) - if (!intent_received_timestamp().is_null()) - report_type = FrameMsg_UILoadMetricsReportType::REPORT_INTENT; - ui_timestamp = intent_received_timestamp(); -#endif - - std::string method; - - // TODO(clamy): Consult the FrameNavigationEntry in all modes that use - // subframe navigation entries. - if (IsBrowserSideNavigationEnabled()) - method = frame_entry.method(); - else - method = (post_body.get() || GetHasPostData()) ? "POST" : "GET"; - return CommonNavigationParams( dest_url, dest_referrer, GetTransitionType(), navigation_type, - !IsViewSourceMode(), should_replace_entry(), ui_timestamp, report_type, - GetBaseURLForDataURL(), GetHistoryURLForDataURL(), previews_state, - navigation_start, method, post_body ? post_body : post_data_, + !IsViewSourceMode(), should_replace_entry(), GetBaseURLForDataURL(), + GetHistoryURLForDataURL(), previews_state, navigation_start, + frame_entry.method(), post_body ? post_body : post_data_, base::Optional<SourceLocation>(), CSPDisposition::CHECK /* should_check_main_world_csp */, has_started_from_context_menu(), has_user_gesture(), @@ -774,12 +754,6 @@ frame_entry->set_source_site_instance(nullptr); frame_entry->set_blob_url_loader_factory(nullptr); } - -#if defined(OS_ANDROID) - // Reset the time stamp so that the metrics are not reported if this entry is - // loaded again in the future. - set_intent_received_timestamp(base::TimeTicks()); -#endif } NavigationEntryImpl::TreeNode* NavigationEntryImpl::GetTreeNode(
diff --git a/content/browser/frame_host/navigation_entry_impl.h b/content/browser/frame_host/navigation_entry_impl.h index 91390f61..8c398afe 100644 --- a/content/browser/frame_host/navigation_entry_impl.h +++ b/content/browser/frame_host/navigation_entry_impl.h
@@ -399,17 +399,6 @@ void set_ssl_error(bool error) { ssl_error_ = error; } bool ssl_error() const { return ssl_error_; } -#if defined(OS_ANDROID) - base::TimeTicks intent_received_timestamp() const { - return intent_received_timestamp_; - } - - void set_intent_received_timestamp( - const base::TimeTicks intent_received_timestamp) { - intent_received_timestamp_ = intent_received_timestamp; - } -#endif - bool has_user_gesture() const { return has_user_gesture_; } @@ -525,12 +514,6 @@ // TODO(creis): Move this to FrameNavigationEntry. int frame_tree_node_id_; -#if defined(OS_ANDROID) - // The time at which Chrome received the Android Intent that triggered this - // URL load operation. Reset at commit and not persisted. - base::TimeTicks intent_received_timestamp_; -#endif - // Whether the URL load carries a user gesture. bool has_user_gesture_;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 47b54581..279bed8 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -23,6 +23,7 @@ #include "base/numerics/safe_conversions.h" #include "base/process/kill.h" #include "base/task_scheduler/post_task.h" +#include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "build/build_config.h" #include "cc/base/switches.h" @@ -1555,20 +1556,7 @@ NOTIMPLEMENTED(); } -void RenderFrameHostImpl::OnDocumentOnLoadCompleted( - FrameMsg_UILoadMetricsReportType::Value report_type, - base::TimeTicks ui_timestamp) { - if (report_type == FrameMsg_UILoadMetricsReportType::REPORT_LINK) { - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation.UI_OnLoadComplete.Link", - base::TimeTicks::Now() - ui_timestamp, - base::TimeDelta::FromMilliseconds(10), - base::TimeDelta::FromMinutes(10), 100); - } else if (report_type == FrameMsg_UILoadMetricsReportType::REPORT_INTENT) { - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation.UI_OnLoadComplete.Intent", - base::TimeTicks::Now() - ui_timestamp, - base::TimeDelta::FromMilliseconds(10), - base::TimeDelta::FromMinutes(10), 100); - } +void RenderFrameHostImpl::OnDocumentOnLoadCompleted() { // This message is only sent for top-level frames. TODO(avi): when frame tree // mirroring works correctly, add a check here to enforce it. delegate_->DocumentOnLoadCompleted(this); @@ -3433,7 +3421,6 @@ CommonNavigationParams common_params( data_url, Referrer(), ui::PAGE_TRANSITION_LINK, FrameMsg_Navigate_Type::DIFFERENT_DOCUMENT, false, false, - base::TimeTicks::Now(), FrameMsg_UILoadMetricsReportType::NO_REPORT, GURL(), GURL(), PREVIEWS_OFF, base::TimeTicks::Now(), "GET", nullptr, base::Optional<SourceLocation>(), CSPDisposition::CHECK /* should_check_main_world_csp */, @@ -3472,8 +3459,17 @@ // the handler ran and allowed the navigation to proceed. if (!ShouldDispatchBeforeUnload()) { DCHECK(!for_navigation); - frame_tree_node_->render_manager()->OnBeforeUnloadACK( - true, base::TimeTicks::Now()); + + // Dispatch the ACK to prevent re-entrancy. + base::OnceClosure task = base::BindOnce( + [](base::WeakPtr<RenderFrameHostImpl> self) { + if (!self) + return; + self->frame_tree_node_->render_manager()->OnBeforeUnloadACK( + true, base::TimeTicks::Now()); + }, + weak_ptr_factory_.GetWeakPtr()); + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(task)); return; } TRACE_EVENT_ASYNC_BEGIN1("navigation", "RenderFrameHostImpl BeforeUnload", @@ -3515,7 +3511,13 @@ void RenderFrameHostImpl::SimulateBeforeUnloadAck() { DCHECK(is_waiting_for_beforeunload_ack_); base::TimeTicks approx_renderer_start_time = send_before_unload_start_time_; - OnBeforeUnloadACK(true, approx_renderer_start_time, base::TimeTicks::Now()); + + // Dispatch the ACK to prevent re-entrancy. + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&RenderFrameHostImpl::OnBeforeUnloadACK, + weak_ptr_factory_.GetWeakPtr(), true, + approx_renderer_start_time, base::TimeTicks::Now())); } bool RenderFrameHostImpl::ShouldDispatchBeforeUnload() { @@ -5041,22 +5043,6 @@ return true; } -void RenderFrameHostImpl::UMACommitReport( - FrameMsg_UILoadMetricsReportType::Value report_type, - const base::TimeTicks& ui_timestamp) { - if (report_type == FrameMsg_UILoadMetricsReportType::REPORT_LINK) { - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation.UI_OnCommitProvisionalLoad.Link", - base::TimeTicks::Now() - ui_timestamp, - base::TimeDelta::FromMilliseconds(10), - base::TimeDelta::FromMinutes(10), 100); - } else if (report_type == FrameMsg_UILoadMetricsReportType::REPORT_INTENT) { - UMA_HISTOGRAM_CUSTOM_TIMES("Navigation.UI_OnCommitProvisionalLoad.Intent", - base::TimeTicks::Now() - ui_timestamp, - base::TimeDelta::FromMilliseconds(10), - base::TimeDelta::FromMinutes(10), 100); - } -} - void RenderFrameHostImpl::UpdateSiteURL(const GURL& url, bool url_is_unreachable) { if (url_is_unreachable || delegate_->GetAsInterstitialPage()) { @@ -5073,9 +5059,6 @@ DCHECK_EQ(ui::PageTransitionIsMainFrame(validated_params->transition), !GetParent()); - UMACommitReport(validated_params->report_type, - validated_params->ui_timestamp); - if (!ValidateDidCommitParams(validated_params)) return false;
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 4798920..7201433 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -801,9 +801,7 @@ void OnDetach(); void OnFrameFocused(); void OnOpenURL(const FrameHostMsg_OpenURL_Params& params); - void OnDocumentOnLoadCompleted( - FrameMsg_UILoadMetricsReportType::Value report_type, - base::TimeTicks ui_timestamp); + void OnDocumentOnLoadCompleted(); void OnDidStartProvisionalLoad( const GURL& url, const std::vector<GURL>& redirect_chain, @@ -1141,11 +1139,6 @@ bool ValidateDidCommitParams( FrameHostMsg_DidCommitProvisionalLoad_Params* validated_params); - // Utility function that does UMA reporting for link click or intent to - // commit timings depending on |report_type|. - void UMACommitReport(FrameMsg_UILoadMetricsReportType::Value report_type, - const base::TimeTicks& ui_timestamp); - // Updates the site url if the navigation was successful and the page is not // an interstitial. void UpdateSiteURL(const GURL& url, bool url_is_unreachable);
diff --git a/content/browser/frame_host/render_widget_host_view_guest.cc b/content/browser/frame_host/render_widget_host_view_guest.cc index 405428c0..6a47f48f 100644 --- a/content/browser/frame_host/render_widget_host_view_guest.cc +++ b/content/browser/frame_host/render_widget_host_view_guest.cc
@@ -153,8 +153,7 @@ // Since we were last shown, our renderer may have had a different surface // set (e.g. showing an interstitial), so we resend our current surface to // the renderer. - if (last_received_local_surface_id_.is_valid()) - SendSurfaceInfoToEmbedder(); + SendSurfaceInfoToEmbedder(); } host()->WasShown(false /* record_presentation_time */); } @@ -251,7 +250,7 @@ const gfx::PointF& point) { // LocalSurfaceId is not needed in Viz hit-test. if (!guest_ || - (!use_viz_hit_test_ && !last_received_local_surface_id_.is_valid())) { + (!use_viz_hit_test_ && !last_activated_surface_info_.is_valid())) { return point; } @@ -264,9 +263,7 @@ // guarantee not to change transformed_point on failure, then we could skip // checking the function return value and directly return transformed_point. if (!root_rwhv->TransformPointToLocalCoordSpace( - point, - viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_), - &transformed_point)) { + point, last_activated_surface_info_.id(), &transformed_point)) { return point; } return transformed_point; @@ -277,19 +274,18 @@ const viz::SurfaceId& original_surface, gfx::PointF* transformed_point) { *transformed_point = point; - if (!guest_ || !last_received_local_surface_id_.is_valid()) + if (!guest_ || !last_activated_surface_info_.is_valid()) return false; - auto local_surface_id = - viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_); - if (original_surface == local_surface_id) + if (original_surface == last_activated_surface_info_.id()) return true; *transformed_point = gfx::ConvertPointToPixel(current_surface_scale_factor(), point); viz::SurfaceHittest hittest(nullptr, GetFrameSinkManager()->surface_manager()); - if (!hittest.TransformPointToTargetSurface(original_surface, local_surface_id, + if (!hittest.TransformPointToTargetSurface(original_surface, + last_activated_surface_info_.id(), transformed_point)) { return false; } @@ -394,6 +390,7 @@ weak_ptr_factory_.GetWeakPtr())); } #endif + SendSurfaceInfoToEmbedder(); } bool RenderWidgetHostViewGuest::OnMessageReceived(const IPC::Message& msg) { @@ -817,10 +814,6 @@ } } -bool RenderWidgetHostViewGuest::HasEmbedderChanged() { - return guest_ && guest_->has_attached_since_surface_set(); -} - #if defined(USE_AURA) void RenderWidgetHostViewGuest::OnGotEmbedToken( const base::UnguessableToken& token) {
diff --git a/content/browser/frame_host/render_widget_host_view_guest.h b/content/browser/frame_host/render_widget_host_view_guest.h index 8f73e23..8125850 100644 --- a/content/browser/frame_host/render_widget_host_view_guest.h +++ b/content/browser/frame_host/render_widget_host_view_guest.h
@@ -190,8 +190,6 @@ void ProcessTouchpadPinchAckInRoot(const blink::WebGestureEvent& event, InputEventAckState ack_result); - bool HasEmbedderChanged() override; - #if defined(USE_AURA) void OnGotEmbedToken(const base::UnguessableToken& token); #endif
diff --git a/content/browser/frame_host/render_widget_host_view_guest_unittest.cc b/content/browser/frame_host/render_widget_host_view_guest_unittest.cc index 180c213..9a5c1dd 100644 --- a/content/browser/frame_host/render_widget_host_view_guest_unittest.cc +++ b/content/browser/frame_host/render_widget_host_view_guest_unittest.cc
@@ -28,7 +28,6 @@ #include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread_bundle.h" -#include "content/test/fake_renderer_compositor_frame_sink.h" #include "content/test/mock_render_widget_host_delegate.h" #include "content/test/mock_widget_impl.h" #include "content/test/test_render_view_host.h" @@ -114,11 +113,6 @@ void ResetTestData() { last_surface_info_ = viz::SurfaceInfo(); } - void set_has_attached_since_surface_set(bool has_attached_since_surface_set) { - BrowserPluginGuest::set_has_attached_since_surface_set_for_test( - has_attached_since_surface_set); - } - void set_attached(bool attached) { BrowserPluginGuest::set_attached_for_test(attached); } @@ -131,9 +125,7 @@ }; // TODO(wjmaclean): we should restructure RenderWidgetHostViewChildFrameTest to -// look more like this one, and then this one could be derived from it. Also, -// include CreateDelegatedFrame as part of the test class so we don't have to -// repeat it here. +// look more like this one, and then this one could be derived from it. class RenderWidgetHostViewGuestSurfaceTest : public testing::Test { public: @@ -162,16 +154,6 @@ view_ = RenderWidgetHostViewGuest::Create( widget_host_, browser_plugin_guest_, (new TestRenderWidgetHostView(widget_host_))->GetWeakPtr()); - viz::mojom::CompositorFrameSinkPtr sink; - viz::mojom::CompositorFrameSinkRequest sink_request = - mojo::MakeRequest(&sink); - viz::mojom::CompositorFrameSinkClientRequest client_request = - mojo::MakeRequest(&renderer_compositor_frame_sink_ptr_); - renderer_compositor_frame_sink_ = - std::make_unique<FakeRendererCompositorFrameSink>( - std::move(sink), std::move(client_request)); - view_->DidCreateNewRendererCompositorFrameSink( - renderer_compositor_frame_sink_ptr_.get()); } void TearDown() override { @@ -192,10 +174,7 @@ DCHECK(view_); RenderWidgetHostViewChildFrame* rwhvcf = static_cast<RenderWidgetHostViewChildFrame*>(view_); - if (!rwhvcf->last_received_local_surface_id_.is_valid()) - return viz::SurfaceId(); - return viz::SurfaceId(rwhvcf->frame_sink_id_, - rwhvcf->last_received_local_surface_id_); + return rwhvcf->last_activated_surface_info_.id(); } protected: @@ -211,8 +190,6 @@ std::unique_ptr<MockWidgetImpl> widget_impl_; RenderWidgetHostImpl* widget_host_; RenderWidgetHostViewGuest* view_; - std::unique_ptr<FakeRendererCompositorFrameSink> - renderer_compositor_frame_sink_; private: viz::mojom::CompositorFrameSinkClientPtr renderer_compositor_frame_sink_ptr_; @@ -220,33 +197,13 @@ DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewGuestSurfaceTest); }; -namespace { -viz::CompositorFrame CreateDelegatedFrame(float scale_factor, - gfx::Size size, - const gfx::Rect& damage) { - viz::CompositorFrame frame; - frame.metadata.device_scale_factor = scale_factor; - frame.metadata.begin_frame_ack = viz::BeginFrameAck(0, 1, true); - - std::unique_ptr<viz::RenderPass> pass = viz::RenderPass::Create(); - pass->SetNew(1, gfx::Rect(size), damage, gfx::Transform()); - frame.render_pass_list.push_back(std::move(pass)); - return frame; -} -} // anonymous namespace - TEST_F(RenderWidgetHostViewGuestSurfaceTest, TestGuestSurface) { - // TODO(jonross): Delete this test once Viz launches as it will be obsolete. - // https://crbug.com/844469 - if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) || - !features::IsAshInBrowserProcess()) { - return; - } - gfx::Size view_size(100, 100); gfx::Rect view_rect(view_size); float scale_factor = 1.f; viz::LocalSurfaceId local_surface_id(1, base::UnguessableToken::Create()); + viz::SurfaceId surface_id(view_->GetFrameSinkId(), local_surface_id); + viz::SurfaceInfo surface_info(surface_id, scale_factor, view_size); ASSERT_TRUE(browser_plugin_guest_); @@ -254,46 +211,24 @@ view_->Show(); browser_plugin_guest_->set_attached(true); - view_->SubmitCompositorFrame( - local_surface_id, - CreateDelegatedFrame(scale_factor, view_size, view_rect), base::nullopt); - viz::SurfaceId id = GetSurfaceId(); + view_->OnFirstSurfaceActivation(surface_info); - EXPECT_TRUE(id.is_valid()); + EXPECT_EQ(surface_id, GetSurfaceId()); -#if !defined(OS_ANDROID) - viz::SurfaceManager* manager = ImageTransportFactory::GetInstance() - ->GetContextFactoryPrivate() - ->GetFrameSinkManager() - ->surface_manager(); - viz::Surface* surface = manager->GetSurfaceForId(id); - EXPECT_TRUE(surface); -#endif // Surface ID should have been passed to BrowserPluginGuest to // be sent to the embedding renderer. - EXPECT_EQ(viz::SurfaceInfo(id, scale_factor, view_size), - browser_plugin_guest_->last_surface_info_); + EXPECT_EQ(surface_info, browser_plugin_guest_->last_surface_info_); browser_plugin_guest_->ResetTestData(); - browser_plugin_guest_->set_has_attached_since_surface_set(true); - view_->SubmitCompositorFrame( - local_surface_id, - CreateDelegatedFrame(scale_factor, view_size, view_rect), base::nullopt); + // The last received SurfaceInfo must be sent to BrowserPluginGuest on + // attachment. + view_->OnAttached(); - // Since we have not changed the frame size and scale factor, the same surface - // id must be used. - DCHECK_EQ(id, GetSurfaceId()); - -#if !defined(OS_ANDROID) - surface = manager->GetSurfaceForId(id); - EXPECT_TRUE(surface); -#endif // Surface ID should have been passed to BrowserPluginGuest to // be sent to the embedding renderer. - EXPECT_EQ(viz::SurfaceInfo(id, scale_factor, view_size), - browser_plugin_guest_->last_surface_info_); + EXPECT_EQ(surface_info, browser_plugin_guest_->last_surface_info_); browser_plugin_guest_->set_attached(false); browser_plugin_guest_->ResetTestData();
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc index d916fcb..e4f966c 100644 --- a/content/browser/media/android/browser_media_player_manager.cc +++ b/content/browser/media/android/browser_media_player_manager.cc
@@ -30,7 +30,6 @@ #include "media/base/media_content_type.h" #if !defined(USE_AURA) -#include "content/browser/android/content_view_core.h" #include "content/browser/renderer_host/render_widget_host_view_android.h" #endif
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc index 172c11df..3fde4d11 100644 --- a/content/browser/media/media_web_contents_observer.cc +++ b/content/browser/media/media_web_contents_observer.cc
@@ -264,7 +264,6 @@ } // Notify observers of the new player. - DCHECK(has_audio || has_video); web_contents_impl()->MediaStartedPlaying( WebContentsObserver::MediaPlayerInfo(has_video, has_audio), id); }
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 770d148..e1ba9b5 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1244,7 +1244,9 @@ float top_shown_pix = top_content_offset * to_pix; float top_translate = top_shown_pix - top_controls_pix; bool top_changed = !FloatEquals(top_shown_pix, prev_top_shown_pix_); - if (top_changed || !controls_initialized_) + // TODO(mthiesse, https://crbug.com/853686): Remove the IsInVR check once + // there are no use cases for ignoring the initial update. + if (top_changed || (!controls_initialized_ && IsInVR())) view_.OnTopControlsChanged(top_translate, top_shown_pix); prev_top_shown_pix_ = top_shown_pix; prev_top_controls_translate_ = top_translate; @@ -1253,7 +1255,7 @@ float bottom_shown_pix = bottom_controls_pix * bottom_controls_shown_ratio; bool bottom_changed = !FloatEquals(bottom_shown_pix, prev_bottom_shown_pix_); float bottom_translate = bottom_controls_pix - bottom_shown_pix; - if (bottom_changed || !controls_initialized_) + if (bottom_changed || (!controls_initialized_ && IsInVR())) view_.OnBottomControlsChanged(bottom_translate, bottom_shown_pix); prev_bottom_shown_pix_ = bottom_shown_pix; prev_bottom_controls_translate_ = bottom_translate; @@ -1888,6 +1890,17 @@ touch_selection_controller_ = CreateSelectionController( touch_selection_controller_client_manager_.get(), view_.parent()); } + + if (is_in_vr_ && controls_initialized_) { + // TODO(mthiesse, https://crbug.com/825765): See the TODO in + // RenderWidgetHostViewAndroid::OnFrameMetadataUpdated. RWHVA isn't + // initialized with VR state so the initial frame metadata top controls + // height can be dropped when a new RWHVA is created. + view_.OnTopControlsChanged(prev_top_controls_translate_, + prev_top_shown_pix_); + view_.OnBottomControlsChanged(prev_bottom_controls_translate_, + prev_bottom_shown_pix_); + } } bool RenderWidgetHostViewAndroid::IsInVR() const {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 3cacc3f..400a822 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1540,7 +1540,8 @@ if (!window_->GetRootWindow()) return; - SyncSurfaceProperties(cc::DeadlinePolicy::UseDefaultDeadline()); + SynchronizeVisualProperties(cc::DeadlinePolicy::UseDefaultDeadline(), + window_->GetLocalSurfaceId()); device_scale_factor_ = new_device_scale_factor; const display::Display display = @@ -2023,7 +2024,15 @@ DCHECK(window_); window_->UpdateLocalSurfaceIdFromEmbeddedClient( child_allocated_local_surface_id); - return SyncSurfaceProperties(deadline_policy); + if (IsLocalSurfaceIdAllocationSuppressed()) + return false; + + if (delegated_frame_host_) { + delegated_frame_host_->EmbedSurface(window_->GetLocalSurfaceId(), + window_->bounds().size(), + deadline_policy); + } + return host()->SynchronizeVisualProperties(); } ui::InputMethod* RenderWidgetHostViewAura::GetInputMethod() const { @@ -2151,7 +2160,8 @@ if (!in_bounds_changed_) window_->SetBounds(rect); - SyncSurfaceProperties(cc::DeadlinePolicy::UseDefaultDeadline()); + SynchronizeVisualProperties(cc::DeadlinePolicy::UseDefaultDeadline(), + window_->GetLocalSurfaceId()); #if defined(OS_WIN) UpdateLegacyWin(); @@ -2161,19 +2171,6 @@ #endif } -bool RenderWidgetHostViewAura::SyncSurfaceProperties( - const cc::DeadlinePolicy& deadline_policy) { - if (IsLocalSurfaceIdAllocationSuppressed()) - return false; - - if (delegated_frame_host_) { - delegated_frame_host_->EmbedSurface(window_->GetLocalSurfaceId(), - window_->bounds().size(), - deadline_policy); - } - return host()->SynchronizeVisualProperties(); -} - #if defined(OS_WIN) void RenderWidgetHostViewAura::UpdateLegacyWin() { if (legacy_window_destroyed_ || !GetHostWindowHWND()) @@ -2482,7 +2479,8 @@ // The first navigation does not need a new LocalSurfaceID. The renderer can // use the ID that was already provided. if (is_first_navigation_) { - SyncSurfaceProperties(cc::DeadlinePolicy::UseExistingDeadline()); + SynchronizeVisualProperties(cc::DeadlinePolicy::UseExistingDeadline(), + window_->GetLocalSurfaceId()); } else { SynchronizeVisualProperties(cc::DeadlinePolicy::UseExistingDeadline(), base::nullopt);
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 5180882..06f4e6f 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -468,9 +468,6 @@ // space is required by the aura::Window. void InternalSetBounds(const gfx::Rect& rect); - // Handles propagation of surface properties when they are changed. - bool SyncSurfaceProperties(const cc::DeadlinePolicy& deadline_policy); - #if defined(OS_WIN) // Creates and/or updates the legacy dummy window which corresponds to // the bounds of the webcontents. It is needed for accessibility and
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.cc b/content/browser/renderer_host/render_widget_host_view_child_frame.cc index 779f270..b1eb399 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame.cc +++ b/content/browser/renderer_host/render_widget_host_view_child_frame.cc
@@ -69,7 +69,6 @@ frame_sink_id_( base::checked_cast<uint32_t>(widget_host->GetProcess()->GetID()), base::checked_cast<uint32_t>(widget_host->GetRoutingID())), - current_surface_scale_factor_(1.f), frame_connector_(nullptr), enable_viz_( base::FeatureList::IsEnabled(features::kVizDisplayCompositor)), @@ -134,7 +133,6 @@ if (frame_connector_) { SetParentFrameSinkId(viz::FrameSinkId()); - last_received_local_surface_id_ = viz::LocalSurfaceId(); // Unlocks the mouse if this RenderWidgetHostView holds the lock. UnlockMouse(); @@ -175,6 +173,8 @@ GetWindowTreeClientFromRenderer()); } #endif + + SendSurfaceInfoToEmbedder(); } #if defined(USE_AURA) @@ -636,10 +636,9 @@ void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedder() { if (!features::IsAshInBrowserProcess()) return; - viz::SurfaceId surface_id(frame_sink_id_, last_received_local_surface_id_); - viz::SurfaceInfo surface_info(surface_id, current_surface_scale_factor_, - current_surface_size_); - SendSurfaceInfoToEmbedderImpl(surface_info); + if (!last_activated_surface_info_.is_valid()) + return; + SendSurfaceInfoToEmbedderImpl(last_activated_surface_info_); } void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedderImpl( @@ -655,20 +654,8 @@ DCHECK(!enable_viz_); TRACE_EVENT0("content", "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); - current_surface_size_ = frame.size_in_pixels(); - current_surface_scale_factor_ = frame.device_scale_factor(); - support_->SubmitCompositorFrame(local_surface_id, std::move(frame), std::move(hit_test_region_list)); - has_frame_ = true; - - if (last_received_local_surface_id_ != local_surface_id || - HasEmbedderChanged()) { - last_received_local_surface_id_ = local_surface_id; - SendSurfaceInfoToEmbedder(); - } - - ProcessFrameSwappedCallbacks(); } void RenderWidgetHostViewChildFrame::OnDidNotProduceFrame( @@ -770,7 +757,7 @@ } viz::SurfaceId RenderWidgetHostViewChildFrame::GetCurrentSurfaceId() const { - return viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_); + return last_activated_surface_info_.id(); } bool RenderWidgetHostViewChildFrame::HasSize() const { @@ -781,12 +768,12 @@ const gfx::PointF& point) { // LocalSurfaceId is not needed in Viz hit-test. if (!frame_connector_ || - (!use_viz_hit_test_ && !last_received_local_surface_id_.is_valid())) { + (!use_viz_hit_test_ && !last_activated_surface_info_.is_valid())) { return point; } return frame_connector_->TransformPointToRootCoordSpace( - point, viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_)); + point, last_activated_surface_info_.id()); } bool RenderWidgetHostViewChildFrame::TransformPointToLocalCoordSpaceLegacy( @@ -794,12 +781,11 @@ const viz::SurfaceId& original_surface, gfx::PointF* transformed_point) { *transformed_point = point; - if (!frame_connector_ || !last_received_local_surface_id_.is_valid()) + if (!frame_connector_ || !last_activated_surface_info_.is_valid()) return false; return frame_connector_->TransformPointToLocalCoordSpaceLegacy( - point, original_surface, - viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_), + point, original_surface, last_activated_surface_info_.id(), transformed_point); } @@ -810,7 +796,7 @@ viz::EventSource source) { // LocalSurfaceId is not needed in Viz hit-test. if (!frame_connector_ || - (!use_viz_hit_test_ && !last_received_local_surface_id_.is_valid())) { + (!use_viz_hit_test_ && !last_activated_surface_info_.is_valid())) { return false; } @@ -820,9 +806,8 @@ } return frame_connector_->TransformPointToCoordSpaceForView( - point, target_view, - viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_), - transformed_point, source); + point, target_view, last_activated_surface_info_.id(), transformed_point, + source); } gfx::PointF RenderWidgetHostViewChildFrame::TransformRootPointToViewCoordSpace( @@ -913,11 +898,11 @@ std::move(callback))); if (src_subrect.IsEmpty()) { - request->set_area(gfx::Rect(current_surface_size_)); + request->set_area(gfx::Rect(last_activated_surface_info_.size_in_pixels())); } else { // |src_subrect| is in DIP coordinates; convert to Surface coordinates. - request->set_area( - gfx::ScaleToRoundedRect(src_subrect, current_surface_scale_factor_)); + request->set_area(gfx::ScaleToRoundedRect( + src_subrect, last_activated_surface_info_.device_scale_factor())); } if (!output_size.IsEmpty()) { @@ -934,8 +919,7 @@ } GetHostFrameSinkManager()->RequestCopyOfOutput( - viz::SurfaceId(frame_sink_id_, last_received_local_surface_id_), - std::move(request)); + last_activated_surface_info_.id(), std::move(request)); } void RenderWidgetHostViewChildFrame::ReclaimResources( @@ -958,7 +942,10 @@ void RenderWidgetHostViewChildFrame::OnFirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { + last_activated_surface_info_ = surface_info; + has_frame_ = true; SendSurfaceInfoToEmbedderImpl(surface_info); + ProcessFrameSwappedCallbacks(); } void RenderWidgetHostViewChildFrame::OnFrameTokenChanged(uint32_t frame_token) { @@ -1150,10 +1137,6 @@ support_.reset(); } -bool RenderWidgetHostViewChildFrame::HasEmbedderChanged() { - return false; -} - bool RenderWidgetHostViewChildFrame::GetSelectionRange( gfx::Range* range) const { if (!text_input_manager_ || !GetFocusedWidget())
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.h b/content/browser/renderer_host/render_widget_host_view_child_frame.h index 0bf747e..62d0bb2 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame.h +++ b/content/browser/renderer_host/render_widget_host_view_child_frame.h
@@ -212,7 +212,9 @@ } // Returns the current surface scale factor. - float current_surface_scale_factor() { return current_surface_scale_factor_; } + float current_surface_scale_factor() { + return last_activated_surface_info_.device_scale_factor(); + } // Returns the view into which this view is directly embedded. This can // return nullptr when this view's associated child frame is not connected @@ -267,9 +269,7 @@ // Surface-related state. std::unique_ptr<viz::CompositorFrameSinkSupport> support_; - viz::LocalSurfaceId last_received_local_surface_id_; - gfx::Size current_surface_size_; - float current_surface_scale_factor_; + viz::SurfaceInfo last_activated_surface_info_; gfx::Rect last_screen_rect_; // frame_connector_ provides a platform abstraction. Messages @@ -296,8 +296,6 @@ void ResetCompositorFrameSinkSupport(); void DetachFromTouchSelectionClientManagerIfNecessary(); - virtual bool HasEmbedderChanged(); - // Returns false if the view cannot be shown. This is the case where the frame // associated with this view or a cross process ancestor frame has been hidden // using CSS.
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc b/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc index 17be4fb..3a2a5bc 100644 --- a/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_child_frame_unittest.cc
@@ -141,12 +141,11 @@ } viz::SurfaceId GetSurfaceId() const { - return viz::SurfaceId(view_->frame_sink_id_, - view_->last_received_local_surface_id_); + return view_->last_activated_surface_info_.id(); } viz::LocalSurfaceId GetLocalSurfaceId() const { - return view_->last_received_local_surface_id_; + return GetSurfaceId().local_surface_id(); } protected:
diff --git a/content/browser/screen_orientation/screen_orientation_delegate_android.cc b/content/browser/screen_orientation/screen_orientation_delegate_android.cc index f328210..7f88ed3 100644 --- a/content/browser/screen_orientation/screen_orientation_delegate_android.cc +++ b/content/browser/screen_orientation/screen_orientation_delegate_android.cc
@@ -4,7 +4,6 @@ #include "content/browser/screen_orientation/screen_orientation_delegate_android.h" -#include "content/browser/android/content_view_core.h" #include "content/browser/screen_orientation/screen_orientation_provider.h" #include "jni/ScreenOrientationProviderImpl_jni.h" #include "ui/android/window_android.h"
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc index 62fcad18..3e7a3fbf 100644 --- a/content/browser/site_per_process_hit_test_browsertest.cc +++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -1624,11 +1624,15 @@ HitTestWatermark(shell(), embedded_test_server()); } -// TODO(jonross): Update this to use HitTestRegionObserver, then disable for /2 -// as currently that variant does not submit hit test regions for overlapping -// surfaces. https://crbug.com/846798 IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest, HitTestStaleDataDeletedView) { + // TODO(sunxd): Hit test regions are not submitted for overlapping surfaces, + // causing /2 to fail outside of Viz. https::/crbug.com/846798 + if (base::FeatureList::IsEnabled(features::kEnableVizHitTestSurfaceLayer) && + !base::FeatureList::IsEnabled(features::kVizDisplayCompositor)) { + return; + } + // Have two iframes to avoid going to short circuit path during the second // targeting. GURL main_url( @@ -1660,8 +1664,8 @@ static_cast<RenderWidgetHostViewBase*>( child_node2->current_frame_host()->GetRenderWidgetHost()->GetView()); - WaitForChildFrameSurfaceReady(child_node1->current_frame_host()); - WaitForChildFrameSurfaceReady(child_node2->current_frame_host()); + WaitForHitTestDataOrChildSurfaceReady(child_node1->current_frame_host()); + WaitForHitTestDataOrChildSurfaceReady(child_node2->current_frame_host()); const gfx::PointF child_location(50, 50); gfx::PointF parent_location =
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc index 790e9a3..43bfc21 100644 --- a/content/browser/web_contents/web_contents_android.cc +++ b/content/browser/web_contents/web_contents_android.cc
@@ -21,7 +21,6 @@ #include "base/task_scheduler/post_task.h" #include "content/browser/accessibility/browser_accessibility_android.h" #include "content/browser/accessibility/browser_accessibility_manager_android.h" -#include "content/browser/android/content_view_core.h" #include "content/browser/android/java/gin_java_bridge_dispatcher_host.h" #include "content/browser/frame_host/interstitial_page_impl.h" #include "content/browser/media/android/browser_media_player_manager.h" @@ -850,13 +849,9 @@ void WebContentsAndroid::SetFocus(JNIEnv* env, const JavaParamRef<jobject>& obj, jboolean focused) { - RenderWidgetHostViewAndroid* rwhva = GetRenderWidgetHostViewAndroid(); - if (!rwhva) - return; - if (focused) - rwhva->GotFocus(); - else - rwhva->LostFocus(); + WebContentsViewAndroid* view = + static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); + view->SetFocus(focused); } int WebContentsAndroid::GetTopControlsShrinkBlinkHeightPixForTesting(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index c586ac2..661ca89 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1640,9 +1640,10 @@ } void WebContentsImpl::WasHidden() { - // If there are entities capturing screenshots or video (e.g., mirroring), - // don't activate the "disable rendering" optimization. - if (!IsBeingCaptured()) { + // If there are entities capturing screenshots or video (e.g. mirroring), + // or in Picture-in-Picture mode, don't activate the "disable rendering" + // optimization. + if (!IsBeingCaptured() && !HasPictureInPictureVideo()) { // |GetRenderViewHost()| can be NULL if the user middle clicks a link to // open a tab in the background, then closes the tab before selecting it. // This is because closing the tab calls WebContentsImpl::Destroy(), which @@ -5299,6 +5300,8 @@ view_->Focus(); } + view_->RenderViewReady(); + for (auto& observer : observers_) observer.RenderViewReady(); }
diff --git a/content/browser/web_contents/web_contents_view.h b/content/browser/web_contents/web_contents_view.h index cf8c74f..b9cc9d60 100644 --- a/content/browser/web_contents/web_contents_view.h +++ b/content/browser/web_contents/web_contents_view.h
@@ -110,6 +110,9 @@ // fully created. virtual void RenderViewCreated(RenderViewHost* host) = 0; + // Invoked when the WebContents is notified that the RenderView is ready. + virtual void RenderViewReady() = 0; + // Invoked when the WebContents is notified that the RenderView has been // swapped in. virtual void RenderViewSwappedIn(RenderViewHost* host) = 0;
diff --git a/content/browser/web_contents/web_contents_view_android.cc b/content/browser/web_contents/web_contents_view_android.cc index 28c9065..c331c552 100644 --- a/content/browser/web_contents/web_contents_view_android.cc +++ b/content/browser/web_contents/web_contents_view_android.cc
@@ -57,22 +57,6 @@ !content::GetContentClient()->UsingSynchronousCompositing(); return should_request_unbuffered_dispatch; } - -RenderWidgetHostViewAndroid* GetRenderWidgetHostViewAndroid( - WebContents* web_contents) { - RenderWidgetHostView* rwhv = NULL; - if (web_contents) { - rwhv = web_contents->GetRenderWidgetHostView(); - if (web_contents->ShowingInterstitialPage()) { - rwhv = web_contents->GetInterstitialPage() - ->GetMainFrame() - ->GetRenderViewHost() - ->GetWidget() - ->GetView(); - } - } - return static_cast<RenderWidgetHostViewAndroid*>(rwhv); -} } // static @@ -131,19 +115,22 @@ void WebContentsViewAndroid::SetOverscrollRefreshHandler( std::unique_ptr<ui::OverscrollRefreshHandler> overscroll_refresh_handler) { overscroll_refresh_handler_ = std::move(overscroll_refresh_handler); - RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid(); - if (rwhv) - rwhv->OnOverscrollRefreshHandlerAvailable(); + auto* rwhv = web_contents_->GetRenderWidgetHostView(); + if (rwhv) { + static_cast<RenderWidgetHostViewAndroid*>(rwhv) + ->OnOverscrollRefreshHandlerAvailable(); + } if (web_contents_->ShowingInterstitialPage()) { - rwhv = static_cast<RenderWidgetHostViewAndroid*>( - web_contents_->GetInterstitialPage() - ->GetMainFrame() - ->GetRenderViewHost() - ->GetWidget() - ->GetView()); - if (rwhv) - rwhv->OnOverscrollRefreshHandlerAvailable(); + rwhv = web_contents_->GetInterstitialPage() + ->GetMainFrame() + ->GetRenderViewHost() + ->GetWidget() + ->GetView(); + if (rwhv) { + static_cast<RenderWidgetHostViewAndroid*>(rwhv) + ->OnOverscrollRefreshHandlerAvailable(); + } } } @@ -167,8 +154,16 @@ RenderWidgetHostViewAndroid* WebContentsViewAndroid::GetRenderWidgetHostViewAndroid() { - return static_cast<RenderWidgetHostViewAndroid*>( - web_contents_->GetRenderWidgetHostView()); + RenderWidgetHostView* rwhv = nullptr; + rwhv = web_contents_->GetRenderWidgetHostView(); + if (web_contents_->ShowingInterstitialPage()) { + rwhv = web_contents_->GetInterstitialPage() + ->GetMainFrame() + ->GetRenderViewHost() + ->GetWidget() + ->GetView(); + } + return static_cast<RenderWidgetHostViewAndroid*>(rwhv); } gfx::NativeWindow WebContentsViewAndroid::GetTopLevelNativeWindow() const { @@ -191,11 +186,13 @@ } void WebContentsViewAndroid::Focus() { - RenderWidgetHostViewAndroid* rwhv = GetRenderWidgetHostViewAndroid(); if (web_contents_->ShowingInterstitialPage()) { web_contents_->GetInterstitialPage()->Focus(); - } else if (rwhv) { - rwhv->Focus(); + } else { + auto* rwhv = web_contents_->GetRenderWidgetHostView(); + if (rwhv) { + static_cast<RenderWidgetHostViewAndroid*>(rwhv)->Focus(); + } } } @@ -273,7 +270,45 @@ void WebContentsViewAndroid::RenderViewCreated(RenderViewHost* host) { } +void WebContentsViewAndroid::RenderViewReady() { + render_view_host_ = web_contents_->GetRenderViewHost(); + if (device_orientation_ == 0) + return; + auto* rwhva = GetRenderWidgetHostViewAndroid(); + if (rwhva) + rwhva->UpdateScreenInfo(web_contents_->GetView()->GetNativeView()); + + web_contents_->OnScreenOrientationChange(); +} + void WebContentsViewAndroid::RenderViewSwappedIn(RenderViewHost* host) { + if (render_view_host_) { + auto* rwhv = render_view_host_->GetWidget()->GetView(); + if (rwhv && rwhv->GetNativeView()) { + static_cast<RenderWidgetHostViewAndroid*>(rwhv)->UpdateNativeViewTree( + nullptr); + } + } + auto* rwhv = host->GetWidget()->GetView(); + if (rwhv && rwhv->GetNativeView()) { + static_cast<RenderWidgetHostViewAndroid*>(rwhv)->UpdateNativeViewTree( + GetNativeView()); + } + + SetFocus(view_.HasFocus()); + render_view_host_ = host; +} + +void WebContentsViewAndroid::SetFocus(bool focused) { + auto* rwhv = GetRenderWidgetHostViewAndroid(); + if (!rwhv || !rwhv->GetNativeView()) + return; + + auto* rwhva = static_cast<RenderWidgetHostViewAndroid*>(rwhv); + if (focused) + rwhva->GotFocus(); + else + rwhva->LostFocus(); } void WebContentsViewAndroid::SetOverscrollControllerEnabled(bool enabled) { @@ -281,11 +316,13 @@ void WebContentsViewAndroid::ShowContextMenu( RenderFrameHost* render_frame_host, const ContextMenuParams& params) { - RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid(); + auto* rwhv = static_cast<RenderWidgetHostViewAndroid*>( + web_contents_->GetRenderWidgetHostView()); // See if context menu is handled by SelectionController as a selection menu. // If not, use the delegate to show it. - if (view && view->ShowSelectionMenu(params)) + if (rwhv && rwhv->ShowSelectionMenu(params)) { return; + } if (delegate_) delegate_->ShowContextMenu(render_frame_host, params); @@ -550,7 +587,7 @@ } void WebContentsViewAndroid::OnSizeChanged() { - auto* rwhv = ::content::GetRenderWidgetHostViewAndroid(web_contents_); + auto* rwhv = GetRenderWidgetHostViewAndroid(); if (rwhv) { web_contents_->SendScreenRects(); rwhv->SynchronizeVisualProperties();
diff --git a/content/browser/web_contents/web_contents_view_android.h b/content/browser/web_contents/web_contents_view_android.h index 3b6ab05e..28c7e5b 100644 --- a/content/browser/web_contents/web_contents_view_android.h +++ b/content/browser/web_contents/web_contents_view_android.h
@@ -80,6 +80,7 @@ RenderWidgetHost* render_widget_host) override; void SetPageTitle(const base::string16& title) override; void RenderViewCreated(RenderViewHost* host) override; + void RenderViewReady() override; void RenderViewSwappedIn(RenderViewHost* host) override; void SetOverscrollControllerEnabled(bool enabled) override; @@ -122,6 +123,7 @@ void OnSizeChanged() override; void OnPhysicalBackingSizeChanged() override; + void SetFocus(bool focused); void set_device_orientation(int orientation) { device_orientation_ = orientation; } @@ -168,6 +170,8 @@ gfx::PointF drag_location_; gfx::PointF drag_screen_location_; + RenderViewHost* render_view_host_ = nullptr; + DISALLOW_COPY_AND_ASSIGN(WebContentsViewAndroid); };
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index 617bfe3..47423474 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -843,6 +843,8 @@ void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { } +void WebContentsViewAura::RenderViewReady() {} + void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { }
diff --git a/content/browser/web_contents/web_contents_view_aura.h b/content/browser/web_contents/web_contents_view_aura.h index 82807c7f..047c902 100644 --- a/content/browser/web_contents/web_contents_view_aura.h +++ b/content/browser/web_contents/web_contents_view_aura.h
@@ -119,6 +119,7 @@ RenderWidgetHost* render_widget_host) override; void SetPageTitle(const base::string16& title) override; void RenderViewCreated(RenderViewHost* host) override; + void RenderViewReady() override; void RenderViewSwappedIn(RenderViewHost* host) override; void SetOverscrollControllerEnabled(bool enabled) override;
diff --git a/content/browser/web_contents/web_contents_view_child_frame.cc b/content/browser/web_contents/web_contents_view_child_frame.cc index e95c31d6..94874ac 100644 --- a/content/browser/web_contents/web_contents_view_child_frame.cc +++ b/content/browser/web_contents/web_contents_view_child_frame.cc
@@ -99,6 +99,8 @@ void WebContentsViewChildFrame::RenderViewCreated(RenderViewHost* host) {} +void WebContentsViewChildFrame::RenderViewReady() {} + void WebContentsViewChildFrame::RenderViewSwappedIn(RenderViewHost* host) {} void WebContentsViewChildFrame::SetOverscrollControllerEnabled(bool enabled) {
diff --git a/content/browser/web_contents/web_contents_view_child_frame.h b/content/browser/web_contents/web_contents_view_child_frame.h index 17275be..973e0ae9 100644 --- a/content/browser/web_contents/web_contents_view_child_frame.h +++ b/content/browser/web_contents/web_contents_view_child_frame.h
@@ -45,6 +45,7 @@ RenderWidgetHost* render_widget_host) override; void SetPageTitle(const base::string16& title) override; void RenderViewCreated(RenderViewHost* host) override; + void RenderViewReady() override; void RenderViewSwappedIn(RenderViewHost* host) override; void SetOverscrollControllerEnabled(bool enabled) override; #if defined(OS_MACOSX)
diff --git a/content/browser/web_contents/web_contents_view_guest.cc b/content/browser/web_contents/web_contents_view_guest.cc index f6a43ca6..84e2810f 100644 --- a/content/browser/web_contents/web_contents_view_guest.cc +++ b/content/browser/web_contents/web_contents_view_guest.cc
@@ -163,6 +163,10 @@ platform_view_->RenderViewCreated(host); } +void WebContentsViewGuest::RenderViewReady() { + platform_view_->RenderViewReady(); +} + void WebContentsViewGuest::RenderViewSwappedIn(RenderViewHost* host) { platform_view_->RenderViewSwappedIn(host); }
diff --git a/content/browser/web_contents/web_contents_view_guest.h b/content/browser/web_contents/web_contents_view_guest.h index 4a06fe5f..3ccd66e 100644 --- a/content/browser/web_contents/web_contents_view_guest.h +++ b/content/browser/web_contents/web_contents_view_guest.h
@@ -63,6 +63,7 @@ RenderWidgetHost* render_widget_host) override; void SetPageTitle(const base::string16& title) override; void RenderViewCreated(RenderViewHost* host) override; + void RenderViewReady() override; void RenderViewSwappedIn(RenderViewHost* host) override; void SetOverscrollControllerEnabled(bool enabled) override; #if defined(OS_MACOSX)
diff --git a/content/browser/web_contents/web_contents_view_mac.h b/content/browser/web_contents/web_contents_view_mac.h index 4640550..8d62193b 100644 --- a/content/browser/web_contents/web_contents_view_mac.h +++ b/content/browser/web_contents/web_contents_view_mac.h
@@ -98,6 +98,7 @@ RenderWidgetHost* render_widget_host) override; void SetPageTitle(const base::string16& title) override; void RenderViewCreated(RenderViewHost* host) override; + void RenderViewReady() override; void RenderViewSwappedIn(RenderViewHost* host) override; void SetOverscrollControllerEnabled(bool enabled) override; bool IsEventTracking() const override;
diff --git a/content/browser/web_contents/web_contents_view_mac.mm b/content/browser/web_contents/web_contents_view_mac.mm index 00b2d2a..64405196 100644 --- a/content/browser/web_contents/web_contents_view_mac.mm +++ b/content/browser/web_contents/web_contents_view_mac.mm
@@ -423,6 +423,8 @@ host->EnablePreferredSizeMode(); } +void WebContentsViewMac::RenderViewReady() {} + void WebContentsViewMac::RenderViewSwappedIn(RenderViewHost* host) { }
diff --git a/content/child/BUILD.gn b/content/child/BUILD.gn index 7c110b35..3f781bc 100644 --- a/content/child/BUILD.gn +++ b/content/child/BUILD.gn
@@ -67,7 +67,6 @@ "runtime_features.h", "scoped_child_process_reference.cc", "scoped_child_process_reference.h", - "scoped_web_callbacks.h", "service_factory.cc", "service_factory.h", "thread_safe_sender.cc",
diff --git a/content/common/frame_message_enums.h b/content/common/frame_message_enums.h index ff33814c..c2b16621f 100644 --- a/content/common/frame_message_enums.h +++ b/content/common/frame_message_enums.h
@@ -61,20 +61,4 @@ } }; -struct FrameMsg_UILoadMetricsReportType { - public: - enum Value { - // Do not report metrics for this load. - NO_REPORT, - - // Report metrics for this load, that originated from clicking on a link. - REPORT_LINK, - - // Report metrics for this load, that originated from an Android OS intent. - REPORT_INTENT, - - REPORT_TYPE_LAST = REPORT_INTENT, - }; -}; - #endif // CONTENT_COMMON_FRAME_MESSAGE_ENUMS_H_
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index ab429bbb..fc11344 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -111,8 +111,6 @@ content::JAVASCRIPT_DIALOG_TYPE_PROMPT) IPC_ENUM_TRAITS_MAX_VALUE(FrameMsg_Navigate_Type::Value, FrameMsg_Navigate_Type::NAVIGATE_TYPE_LAST) -IPC_ENUM_TRAITS_MAX_VALUE(FrameMsg_UILoadMetricsReportType::Value, - FrameMsg_UILoadMetricsReportType::REPORT_TYPE_LAST) IPC_ENUM_TRAITS_MAX_VALUE(blink::WebContextMenuData::MediaType, blink::WebContextMenuData::kMediaTypeLast) IPC_ENUM_TRAITS_MAX_VALUE(blink::WebContextMenuData::InputFieldType, @@ -416,13 +414,6 @@ // RenderFrameProxies. IPC_STRUCT_MEMBER(url::Origin, origin) - // How navigation metrics starting on UI action for this load should be - // reported. - IPC_STRUCT_MEMBER(FrameMsg_UILoadMetricsReportType::Value, report_type) - - // Timestamp at which the UI action that triggered the navigation originated. - IPC_STRUCT_MEMBER(base::TimeTicks, ui_timestamp) - // The insecure request policy the document for the load is enforcing. IPC_STRUCT_MEMBER(blink::WebInsecureRequestPolicy, insecure_request_policy) @@ -477,8 +468,6 @@ IPC_STRUCT_TRAITS_MEMBER(navigation_type) IPC_STRUCT_TRAITS_MEMBER(allow_download) IPC_STRUCT_TRAITS_MEMBER(should_replace_current_entry) - IPC_STRUCT_TRAITS_MEMBER(ui_timestamp) - IPC_STRUCT_TRAITS_MEMBER(report_type) IPC_STRUCT_TRAITS_MEMBER(base_url_for_data_url) IPC_STRUCT_TRAITS_MEMBER(history_url_for_data_url) IPC_STRUCT_TRAITS_MEMBER(previews_state) @@ -1255,9 +1244,7 @@ // in this frame. Sent for top-level frames. |report_type| and |ui_timestamp| // are used to report navigation metrics starting on the ui input event that // triggered the navigation timestamp. -IPC_MESSAGE_ROUTED2(FrameHostMsg_DocumentOnLoadCompleted, - FrameMsg_UILoadMetricsReportType::Value /* report_type */, - base::TimeTicks /* ui_timestamp */) +IPC_MESSAGE_ROUTED0(FrameHostMsg_DocumentOnLoadCompleted) // Notifies that the initial empty document of a view has been accessed. // After this, it is no longer safe to show a pending navigation's URL without
diff --git a/content/common/navigation_params.cc b/content/common/navigation_params.cc index e11e92e8..1ee0fe1 100644 --- a/content/common/navigation_params.cc +++ b/content/common/navigation_params.cc
@@ -33,8 +33,6 @@ FrameMsg_Navigate_Type::Value navigation_type, bool allow_download, bool should_replace_current_entry, - base::TimeTicks ui_timestamp, - FrameMsg_UILoadMetricsReportType::Value report_type, const GURL& base_url_for_data_url, const GURL& history_url_for_data_url, PreviewsState previews_state, @@ -53,8 +51,6 @@ navigation_type(navigation_type), allow_download(allow_download), should_replace_current_entry(should_replace_current_entry), - ui_timestamp(ui_timestamp), - report_type(report_type), base_url_for_data_url(base_url_for_data_url), history_url_for_data_url(history_url_for_data_url), previews_state(previews_state),
diff --git a/content/common/navigation_params.h b/content/common/navigation_params.h index e571195..5ce8be8 100644 --- a/content/common/navigation_params.h +++ b/content/common/navigation_params.h
@@ -66,8 +66,6 @@ FrameMsg_Navigate_Type::Value navigation_type, bool allow_download, bool should_replace_current_entry, - base::TimeTicks ui_timestamp, - FrameMsg_UILoadMetricsReportType::Value report_type, const GURL& base_url_for_data_url, const GURL& history_url_for_data_url, PreviewsState previews_state, @@ -109,15 +107,6 @@ // the navigation commits, it should commit in the existing page. bool should_replace_current_entry = false; - // Timestamp of the user input event that triggered this navigation. Empty if - // the navigation was not triggered by clicking on a link or by receiving an - // intent on Android. - base::TimeTicks ui_timestamp; - - // The report type to be used when recording the metric using |ui_timestamp|. - FrameMsg_UILoadMetricsReportType::Value report_type = - FrameMsg_UILoadMetricsReportType::NO_REPORT; - // Base URL for use in Blink's SubstituteData. // Is only used with data: URLs. GURL base_url_for_data_url;
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn index 7ca2e1c..1220284 100644 --- a/content/public/android/BUILD.gn +++ b/content/public/android/BUILD.gn
@@ -363,7 +363,6 @@ "java/src/org/chromium/content/browser/ContentNfcDelegate.java", "java/src/org/chromium/content/browser/ContentUiEventHandler.java", "java/src/org/chromium/content/browser/ContentVideoViewImpl.java", - "java/src/org/chromium/content/browser/ContentViewCoreImpl.java", "java/src/org/chromium/content/browser/ContentViewStaticsImpl.java", "java/src/org/chromium/content/browser/GestureListenerManagerImpl.java", "java/src/org/chromium/content/browser/GpuProcessCallback.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java index 728f52f..b1b58f18 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCoreImpl.java
@@ -7,8 +7,6 @@ import android.content.Context; import android.view.ViewGroup; -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.JNINamespace; import org.chromium.content.browser.accessibility.WebContentsAccessibilityImpl; import org.chromium.content.browser.input.ImeAdapterImpl; import org.chromium.content.browser.input.SelectPopup; @@ -25,15 +23,11 @@ /** * Implementation of the interface {@ContentViewCore}. */ -@JNINamespace("content") public class ContentViewCoreImpl implements ContentViewCore { private static final String TAG = "cr_ContentViewCore"; private WebContentsImpl mWebContents; - // Native pointer to C++ ContentViewCore object which will be set by nativeInit(). - private long mNativeContentViewCore; - private boolean mInitialized; private static final class UserDataFactoryLazyHolder { @@ -79,7 +73,6 @@ mWebContents.setViewAndroidDelegate(viewDelegate); mWebContents.setTopLevelNativeWindow(windowAndroid); - mNativeContentViewCore = nativeInit(mWebContents); ViewGroup containerView = viewDelegate.getContainerView(); ImeAdapterImpl.create( @@ -98,16 +91,10 @@ mInitialized = true; } - public boolean initialized() { + private boolean initialized() { return mInitialized; } - @CalledByNative - private void onNativeContentViewCoreDestroyed(long nativeContentViewCore) { - assert nativeContentViewCore == mNativeContentViewCore; - mNativeContentViewCore = 0; - } - @Override public void setContainerViewInternals(InternalAccessDelegate internalDispatcher) { GestureListenerManagerImpl.fromWebContents(mWebContents) @@ -117,19 +104,10 @@ @Override public void destroy() { - if (mNativeContentViewCore != 0) { - nativeOnJavaContentViewCoreDestroyed(mNativeContentViewCore); - } // This is called to fix crash. See https://crbug.com/803244 // TODO(jinsukkim): Use an observer to let the manager handle it on its own. GestureListenerManagerImpl.fromWebContents(mWebContents).reset(); mWebContents.destroyContentsInternal(); mWebContents = null; - mNativeContentViewCore = 0; - - // See warning in javadoc before adding more clean up code here. } - - private native long nativeInit(WebContents webContents); - private native void nativeOnJavaContentViewCoreDestroyed(long nativeContentViewCore); }
diff --git a/content/public/browser/navigation_controller.cc b/content/public/browser/navigation_controller.cc index f4423936..31668bd 100644 --- a/content/public/browser/navigation_controller.cc +++ b/content/public/browser/navigation_controller.cc
@@ -20,9 +20,6 @@ post_data(nullptr), can_load_local_resources(false), should_replace_current_entry(false), -#if defined(OS_ANDROID) - intent_received_timestamp(0), -#endif has_user_gesture(false), should_clear_history_list(false), started_from_context_menu(false),
diff --git a/content/public/browser/navigation_controller.h b/content/public/browser/navigation_controller.h index 71456b9aa..03d9b48 100644 --- a/content/public/browser/navigation_controller.h +++ b/content/public/browser/navigation_controller.h
@@ -175,13 +175,6 @@ // navigated. This is currently only used in tests. std::string frame_name; -#if defined(OS_ANDROID) - // On Android, for a load triggered by an intent, the time Chrome received - // the original intent that prompted the load (in milliseconds active time - // since boot). - int64_t intent_received_timestamp; -#endif - // Indicates that the navigation was triggered by a user gesture. bool has_user_gesture;
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index 634f6b3..9ae6442 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h
@@ -450,6 +450,9 @@ // and subsequently within a WebContents. MediaStartedPlaying() will always // be followed by MediaStoppedPlaying() after player teardown. Observers must // release all stored copies of |id| when MediaStoppedPlaying() is received. + // |has_video| and |has_audio| can both be false in cases where the media + // is playing muted and should be considered as inaudible for all intent and + // purposes. struct MediaPlayerInfo { MediaPlayerInfo(bool has_video, bool has_audio) : has_video(has_video), has_audio(has_audio) {}
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 35a3f90..2a19c17 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -228,7 +228,7 @@ // Mojo-based Session Storage. const base::Feature kMojoSessionStorage{"MojoSessionStorage", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // Enables/disables the video capture service. const base::Feature kMojoVideoCapture {
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index ce9348f..89925fc5 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -558,10 +558,8 @@ void RenderViewTest::Reload(const GURL& url) { CommonNavigationParams common_params( url, Referrer(), ui::PAGE_TRANSITION_LINK, FrameMsg_Navigate_Type::RELOAD, - true, false, base::TimeTicks(), - FrameMsg_UILoadMetricsReportType::NO_REPORT, GURL(), GURL(), - PREVIEWS_UNSPECIFIED, base::TimeTicks::Now(), "GET", nullptr, - base::Optional<SourceLocation>(), + true, false, GURL(), GURL(), PREVIEWS_UNSPECIFIED, base::TimeTicks::Now(), + "GET", nullptr, base::Optional<SourceLocation>(), CSPDisposition::CHECK /* should_check_main_world_csp */, false /* started_from_context_menu */, false /* has_user_gesture */, std::vector<ContentSecurityPolicy>() /* initiator_csp */, @@ -700,8 +698,7 @@ CommonNavigationParams common_params( url, Referrer(), ui::PAGE_TRANSITION_FORWARD_BACK, - FrameMsg_Navigate_Type::HISTORY_DIFFERENT_DOCUMENT, true, false, - base::TimeTicks(), FrameMsg_UILoadMetricsReportType::NO_REPORT, GURL(), + FrameMsg_Navigate_Type::HISTORY_DIFFERENT_DOCUMENT, true, false, GURL(), GURL(), PREVIEWS_UNSPECIFIED, base::TimeTicks::Now(), "GET", nullptr, base::Optional<SourceLocation>(), CSPDisposition::CHECK /* should_check_main_world_csp */,
diff --git a/content/renderer/image_capture/image_capture_frame_grabber.cc b/content/renderer/image_capture/image_capture_frame_grabber.cc index c5e6515..546d981f 100644 --- a/content/renderer/image_capture/image_capture_frame_grabber.cc +++ b/content/renderer/image_capture/image_capture_frame_grabber.cc
@@ -115,7 +115,7 @@ void ImageCaptureFrameGrabber::GrabFrame( blink::WebMediaStreamTrack* track, - WebImageCaptureGrabFrameCallbacks* callbacks) { + std::unique_ptr<blink::WebImageCaptureGrabFrameCallbacks> callbacks) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(!!callbacks); @@ -128,8 +128,8 @@ return; } - ScopedWebCallbacks<WebImageCaptureGrabFrameCallbacks> scoped_callbacks = - make_scoped_web_callbacks(callbacks, base::Bind(&OnError)); + auto scoped_callbacks = blink::MakeScopedWebCallbacks( + std::move(callbacks), base::BindOnce(&OnError)); // A SingleShotFrameHandler is bound and given to the Track to guarantee that // only one VideoFrame is converted and delivered to OnSkImage(), otherwise @@ -149,7 +149,8 @@ } void ImageCaptureFrameGrabber::OnSkImage( - ScopedWebCallbacks<blink::WebImageCaptureGrabFrameCallbacks> callbacks, + blink::ScopedWebCallbacks<blink::WebImageCaptureGrabFrameCallbacks> + callbacks, sk_sp<SkImage> image) { DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/content/renderer/image_capture/image_capture_frame_grabber.h b/content/renderer/image_capture/image_capture_frame_grabber.h index 99356ce..547cc74 100644 --- a/content/renderer/image_capture/image_capture_frame_grabber.h +++ b/content/renderer/image_capture/image_capture_frame_grabber.h
@@ -5,13 +5,15 @@ #ifndef CONTENT_RENDERER_IMAGE_CAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_ #define CONTENT_RENDERER_IMAGE_CAPTURE_IMAGE_CAPTURE_FRAME_GRABBER_H_ +#include <memory> + #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" -#include "content/child/scoped_web_callbacks.h" #include "content/common/content_export.h" #include "content/public/renderer/media_stream_video_sink.h" +#include "third_party/blink/public/platform/scoped_web_callbacks.h" #include "third_party/blink/public/platform/web_image_capture_frame_grabber.h" namespace blink { @@ -36,15 +38,16 @@ // blink::WebImageCaptureFrameGrabber implementation. void GrabFrame(blink::WebMediaStreamTrack* track, - blink::WebImageCaptureGrabFrameCallbacks* callbacks) override; + std::unique_ptr<blink::WebImageCaptureGrabFrameCallbacks> + callbacks) override; private: // Internal class to receive, convert and forward one frame. class SingleShotFrameHandler; - void OnSkImage( - ScopedWebCallbacks<blink::WebImageCaptureGrabFrameCallbacks> callbacks, - sk_sp<SkImage> image); + void OnSkImage(blink::ScopedWebCallbacks< + blink::WebImageCaptureGrabFrameCallbacks> callbacks, + sk_sp<SkImage> image); // Flag to indicate that there is a frame grabbing in progress. bool frame_grab_in_progress_;
diff --git a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc index aa7dd1571..1c262570 100644 --- a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc +++ b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
@@ -544,7 +544,7 @@ void RemotePlaybackCompatibilityChanged(const blink::WebURL& url, bool is_compatible) override {} void OnBecamePersistentVideo(bool) override {} - bool IsAutoplayingMuted() override { return false; } + bool WasAlwaysMuted() override { return false; } bool HasSelectedVideoTrack() override { return false; } blink::WebMediaPlayer::TrackId GetSelectedVideoTrackId() override { return blink::WebMediaPlayer::TrackId();
diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source.cc b/content/renderer/media/webrtc/media_stream_remote_video_source.cc index 526115f..eb85960 100644 --- a/content/renderer/media/webrtc/media_stream_remote_video_source.cc +++ b/content/renderer/media/webrtc/media_stream_remote_video_source.cc
@@ -71,7 +71,6 @@ // Timestamp of the first received frame. base::TimeDelta start_timestamp_; - // WebRTC Chromium timestamp diff const base::TimeDelta time_diff_; }; @@ -118,16 +117,16 @@ scoped_refptr<media::VideoFrame> video_frame; scoped_refptr<webrtc::VideoFrameBuffer> buffer( incoming_frame.video_frame_buffer()); - const gfx::Size size(buffer->width(), buffer->height()); - switch (buffer->type()) { - case webrtc::VideoFrameBuffer::Type::kNative: { - video_frame = static_cast<WebRtcVideoFrameAdapter*>(buffer.get()) - ->getMediaVideoFrame(); - video_frame->set_timestamp(elapsed_timestamp); - break; - } - case webrtc::VideoFrameBuffer::Type::kI420A: { + if (buffer->type() == webrtc::VideoFrameBuffer::Type::kNative) { + video_frame = static_cast<WebRtcVideoFrameAdapter*>(buffer.get()) + ->getMediaVideoFrame(); + video_frame->set_timestamp(elapsed_timestamp); + } else { + const gfx::Size size(buffer->width(), buffer->height()); + const bool has_alpha = + buffer->type() == webrtc::VideoFrameBuffer::Type::kI420A; + if (has_alpha) { const webrtc::I420ABufferInterface* yuva_buffer = buffer->GetI420A(); video_frame = media::VideoFrame::WrapExternalYuvaData( media::PIXEL_FORMAT_I420A, size, gfx::Rect(size), size, @@ -137,46 +136,36 @@ const_cast<uint8_t*>(yuva_buffer->DataU()), const_cast<uint8_t*>(yuva_buffer->DataV()), const_cast<uint8_t*>(yuva_buffer->DataA()), elapsed_timestamp); - break; - } - case webrtc::VideoFrameBuffer::Type::kI420: { - rtc::scoped_refptr<webrtc::I420BufferInterface> yuv_buffer = - buffer->ToI420(); + } else { + scoped_refptr<webrtc::PlanarYuvBuffer> yuv_buffer; + media::VideoPixelFormat pixel_format; + if (buffer->type() == webrtc::VideoFrameBuffer::Type::kI444) { + yuv_buffer = buffer->GetI444(); + pixel_format = media::PIXEL_FORMAT_I444; + } else { + yuv_buffer = buffer->ToI420(); + pixel_format = media::PIXEL_FORMAT_I420; + } + // Make a shallow copy. Both |frame| and |video_frame| will share a single + // reference counted frame buffer. Const cast and hope no one will + // overwrite the data. video_frame = media::VideoFrame::WrapExternalYuvData( - media::PIXEL_FORMAT_I420, size, gfx::Rect(size), size, - yuv_buffer->StrideY(), yuv_buffer->StrideU(), yuv_buffer->StrideV(), + pixel_format, size, gfx::Rect(size), size, yuv_buffer->StrideY(), + yuv_buffer->StrideU(), yuv_buffer->StrideV(), const_cast<uint8_t*>(yuv_buffer->DataY()), const_cast<uint8_t*>(yuv_buffer->DataU()), const_cast<uint8_t*>(yuv_buffer->DataV()), elapsed_timestamp); - break; } - case webrtc::VideoFrameBuffer::Type::kI444: { - webrtc::I444BufferInterface* yuv_buffer = buffer->GetI444(); - video_frame = media::VideoFrame::WrapExternalYuvData( - media::PIXEL_FORMAT_I444, size, gfx::Rect(size), size, - yuv_buffer->StrideY(), yuv_buffer->StrideU(), yuv_buffer->StrideV(), - const_cast<uint8_t*>(yuv_buffer->DataY()), - const_cast<uint8_t*>(yuv_buffer->DataU()), - const_cast<uint8_t*>(yuv_buffer->DataV()), elapsed_timestamp); - break; - } - default: - NOTREACHED(); + if (!video_frame) + return; + // The bind ensures that we keep a reference to the underlying buffer. + video_frame->AddDestructionObserver(base::BindOnce(&DoNothing, buffer)); } - - if (!video_frame) - return; - - // The bind ensures that we keep a reference to the underlying buffer. - video_frame->AddDestructionObserver(base::BindOnce(&DoNothing, buffer)); - - // Rotation may be explicitly set sometimes. if (incoming_frame.rotation() != webrtc::kVideoRotation_0) { video_frame->metadata()->SetRotation( media::VideoFrameMetadata::ROTATION, WebRTCToMediaVideoRotation(incoming_frame.rotation())); } - // Run render smoothness algorithm only when we don't have to render // immediately. if (!render_immediately) { @@ -246,7 +235,7 @@ } rtc::VideoSinkInterface<webrtc::VideoFrame>* -MediaStreamRemoteVideoSource::SinkInterfaceForTesting() { +MediaStreamRemoteVideoSource::SinkInterfaceForTest() { return delegate_.get(); }
diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source.h b/content/renderer/media/webrtc/media_stream_remote_video_source.h index f07b411..494b11b 100644 --- a/content/renderer/media/webrtc/media_stream_remote_video_source.h +++ b/content/renderer/media/webrtc/media_stream_remote_video_source.h
@@ -24,7 +24,7 @@ // to make sure there is no difference between a video track where the source is // a local source and a video track where the source is a remote video track. class CONTENT_EXPORT MediaStreamRemoteVideoSource - : public MediaStreamVideoSource { + : public MediaStreamVideoSource { public: explicit MediaStreamRemoteVideoSource( std::unique_ptr<TrackObserver> observer); @@ -44,7 +44,7 @@ // Used by tests to test that a frame can be received and that the // MediaStreamRemoteVideoSource behaves as expected. - rtc::VideoSinkInterface<webrtc::VideoFrame>* SinkInterfaceForTesting(); + rtc::VideoSinkInterface<webrtc::VideoFrame>* SinkInterfaceForTest(); private: void OnChanged(webrtc::MediaStreamTrackInterface::TrackState state);
diff --git a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc index e721651..34db57b 100644 --- a/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc +++ b/content/renderer/media/webrtc/media_stream_remote_video_source_unittest.cc
@@ -36,7 +36,7 @@ explicit MediaStreamRemoteVideoSourceUnderTest( std::unique_ptr<TrackObserver> observer) : MediaStreamRemoteVideoSource(std::move(observer)) {} - using MediaStreamRemoteVideoSource::SinkInterfaceForTesting; + using MediaStreamRemoteVideoSource::SinkInterfaceForTest; }; class MediaStreamRemoteVideoSourceTest @@ -171,7 +171,7 @@ webrtc::I420Buffer::SetBlack(buffer); - source()->SinkInterfaceForTesting()->OnFrame( + source()->SinkInterfaceForTest()->OnFrame( webrtc::VideoFrame(buffer, webrtc::kVideoRotation_0, 1000)); run_loop.Run();
diff --git a/content/renderer/media_recorder/media_recorder_handler.cc b/content/renderer/media_recorder/media_recorder_handler.cc index 5ea443fd..15f2d8f 100644 --- a/content/renderer/media_recorder/media_recorder_handler.cc +++ b/content/renderer/media_recorder/media_recorder_handler.cc
@@ -13,7 +13,6 @@ #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" #include "base/sys_info.h" -#include "content/child/scoped_web_callbacks.h" #include "content/renderer/media/stream/media_stream_audio_track.h" #include "content/renderer/media/stream/media_stream_track.h" #include "content/renderer/media/webrtc/webrtc_uma_histograms.h" @@ -27,6 +26,7 @@ #include "media/base/video_frame.h" #include "media/muxers/webm_muxer.h" #include "third_party/blink/public/platform/modules/media_capabilities/web_media_configuration.h" +#include "third_party/blink/public/platform/scoped_web_callbacks.h" #include "third_party/blink/public/platform/web_media_recorder_handler_client.h" #include "third_party/blink/public/platform/web_media_stream_source.h" #include "third_party/blink/public/platform/web_string.h" @@ -350,9 +350,8 @@ DCHECK(configuration.video_configuration || configuration.audio_configuration); - ScopedWebCallbacks<WebMediaCapabilitiesQueryCallbacks> scoped_callbacks = - make_scoped_web_callbacks(callbacks.release(), - base::Bind(&OnEncodingInfoError)); + auto scoped_callbacks = blink::MakeScopedWebCallbacks( + std::move(callbacks), base::BindOnce(&OnEncodingInfoError)); std::unique_ptr<blink::WebMediaCapabilitiesInfo> info( new blink::WebMediaCapabilitiesInfo());
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index bd60a21..749d935 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -473,16 +473,6 @@ request.SetExtraData(std::move(extra_data)); request.SetWasDiscarded(request_params.was_discarded); - // Set the ui timestamp for this navigation. Currently the timestamp here is - // only non empty when the navigation was triggered by an Android intent. The - // timestamp is converted to a double version supported by blink. It will be - // passed back to the browser in the DidCommitProvisionalLoad and the - // DocumentLoadComplete IPCs. - base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); - request.SetUiStartTime(ui_timestamp.InSecondsF()); - request.SetInputPerfMetricReportPolicy( - static_cast<WebURLRequest::InputToLoadPerfMetricReportPolicy>( - common_params.report_type)); return request; } @@ -510,19 +500,6 @@ .Latin1()), info.url_request.GetReferrerPolicy()); - // Set the ui timestamp for this navigation. Currently the timestamp here is - // only non empty when the navigation was triggered by an Android intent, or - // by the user clicking on a link. The timestamp is converted from a double - // version supported by blink. It will be passed back to the renderer in the - // CommitNavigation IPC, and then back to the browser again in the - // DidCommitProvisionalLoad and the DocumentLoadComplete IPCs. - base::TimeTicks ui_timestamp = - base::TimeTicks() + - base::TimeDelta::FromSecondsD(info.url_request.UiStartTime()); - FrameMsg_UILoadMetricsReportType::Value report_type = - static_cast<FrameMsg_UILoadMetricsReportType::Value>( - info.url_request.InputPerfMetricReportPolicy()); - // No history-navigation is expected to happen. DCHECK(info.navigation_type != blink::kWebNavigationTypeBackForward); @@ -555,8 +532,7 @@ DCHECK(extra_data); return CommonNavigationParams( info.url_request.Url(), referrer, extra_data->transition_type(), - navigation_type, true, info.replaces_current_history_item, ui_timestamp, - report_type, GURL(), GURL(), + navigation_type, true, info.replaces_current_history_item, GURL(), GURL(), static_cast<PreviewsState>(info.url_request.GetPreviewsState()), base::TimeTicks::Now(), info.url_request.HttpMethod().Latin1(), GetRequestBodyForWebURLRequest(info.url_request), source_location, @@ -4317,18 +4293,7 @@ void RenderFrameImpl::DidHandleOnloadEvents() { if (!frame_->Parent()) { - FrameMsg_UILoadMetricsReportType::Value report_type = - static_cast<FrameMsg_UILoadMetricsReportType::Value>( - frame_->GetDocumentLoader() - ->GetRequest() - .InputPerfMetricReportPolicy()); - base::TimeTicks ui_timestamp = - base::TimeTicks() + - base::TimeDelta::FromSecondsD( - frame_->GetDocumentLoader()->GetRequest().UiStartTime()); - - Send(new FrameHostMsg_DocumentOnLoadCompleted( - routing_id_, report_type, ui_timestamp)); + Send(new FrameHostMsg_DocumentOnLoadCompleted(routing_id_)); } } @@ -5387,15 +5352,6 @@ params->history_list_was_cleared = navigation_state->request_params().should_clear_history_list; - - params->report_type = static_cast<FrameMsg_UILoadMetricsReportType::Value>( - frame_->GetDocumentLoader() - ->GetRequest() - .InputPerfMetricReportPolicy()); - params->ui_timestamp = - base::TimeTicks() + - base::TimeDelta::FromSecondsD( - frame_->GetDocumentLoader()->GetRequest().UiStartTime()); } else { // Subframe navigation: the type depends on whether this navigation // generated a new session history entry. When they do generate a session @@ -5408,7 +5364,6 @@ DCHECK(!navigation_state->request_params().should_clear_history_list); params->history_list_was_cleared = false; - params->report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; } // Standard URLs must match the reported origin, when it is not unique.
diff --git a/content/shell/browser/shell_url_request_context_getter.cc b/content/shell/browser/shell_url_request_context_getter.cc index 4d2e631..e9d67ea 100644 --- a/content/shell/browser/shell_url_request_context_getter.cc +++ b/content/shell/browser/shell_url_request_context_getter.cc
@@ -187,7 +187,7 @@ #if BUILDFLAG(ENABLE_REPORTING) if (base::FeatureList::IsEnabled(network::features::kReporting)) { std::unique_ptr<net::ReportingPolicy> reporting_policy = - std::make_unique<net::ReportingPolicy>(); + net::ReportingPolicy::Create(); if (command_line.HasSwitch(switches::kRunWebTests)) reporting_policy->delivery_interval = base::TimeDelta::FromMilliseconds(100);
diff --git a/content/test/data/media/session/autoplay-muted.html b/content/test/data/media/session/autoplay-muted.html index 00c0223..57e912a 100644 --- a/content/test/data/media/session/autoplay-muted.html +++ b/content/test/data/media/session/autoplay-muted.html
@@ -7,5 +7,17 @@ <body> <video id='video' autoplay muted controls playsinline loop src=video-6seconds.webm> </video> + <br> + <button id='play'>play</button> + <button id='unmute'>unmute</button> </body> +<script> + const video = document.querySelector('video'); + document.querySelector('#play').onclick = function() { + video.play(); + } + document.querySelector('#unmute').onclick = function() { + video.muted = false; + } +</script> </html>
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index 2415c51..5beda77 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -174,8 +174,6 @@ params.history_list_was_cleared = false; params.render_view_routing_id = 0; params.origin = url::Origin(); - params.report_type = FrameMsg_UILoadMetricsReportType::NO_REPORT; - params.ui_timestamp = base::TimeTicks(); params.insecure_request_policy = blink::kLeaveInsecureRequestsAlone; params.has_potentially_trustworthy_unique_origin = false; params.searchable_form_url = GURL();
diff --git a/extensions/browser/api/web_contents_capture_client.cc b/extensions/browser/api/web_contents_capture_client.cc index 3114ca29..401c70d 100644 --- a/extensions/browser/api/web_contents_capture_client.cc +++ b/extensions/browser/api/web_contents_capture_client.cc
@@ -6,6 +6,7 @@ #include "base/base64.h" #include "base/strings/stringprintf.h" +#include "base/syslog_logging.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" @@ -54,6 +55,11 @@ view->CopyFromSurface(gfx::Rect(), // Copy entire surface area. gfx::Size(), // Result contains device-level detail. std::move(callback)); + +#if defined(OS_CHROMEOS) + SYSLOG(INFO) << "Screenshot taken"; +#endif + return OK; }
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc index 79a34cf..b496d90 100644 --- a/extensions/common/permissions/permissions_data.cc +++ b/extensions/common/permissions/permissions_data.cc
@@ -19,6 +19,7 @@ #include "extensions/common/switches.h" #include "extensions/common/url_pattern_set.h" #include "url/gurl.h" +#include "url/origin.h" #include "url/url_constants.h" namespace extensions { @@ -366,52 +367,100 @@ int tab_id, std::string* error) const { bool has_active_tab = false; + bool has_all_urls = false; + // Check the real origin, in order to account for filesystem:, blob:, etc. + // (url::Origin grabs the inner origin of these, whereas GURL::GetOrigin() + // does not.) + const GURL origin = url::Origin::Create(document_url).GetURL(); { base::AutoLock auto_lock(runtime_lock_); + // Disallow capturing policy-blocked hosts. No exceptions. + // Note: This isn't foolproof, since an extension could embed a policy- + // blocked host in a different page and then capture that, but it's better + // than nothing (and policy hosts can set their x-frame options + // accordingly). + if (location_ != Manifest::COMPONENT && IsPolicyBlockedHostUnsafe(origin)) { + if (error) + *error = extension_misc::kPolicyBlockedScripting; + return false; + } + const PermissionSet* tab_permissions = GetTabSpecificPermissions(tab_id); has_active_tab = tab_permissions && tab_permissions->HasAPIPermission(APIPermission::kTab); + + const URLPattern all_urls(URLPattern::SCHEME_ALL, + URLPattern::kAllUrlsPattern); + has_all_urls = + active_permissions_unsafe_->explicit_hosts().ContainsPattern(all_urls); } - // We check GetPageAccess() (in addition the the <all_urls> and activeTab - // checks below) for the case of URLs that can be conditionally granted (such - // as file:// URLs or chrome:// URLs for component extensions), and to respect - // policy restrictions, if any. If an extension has <all_urls>, - // GetPageAccess() will still (correctly) return false if, for instance, the - // URL is a file:// URL and the extension does not have file access. - // See https://crbug.com/810220. - if (GetPageAccess(document_url, tab_id, error) != PageAccess::kAllowed) { - if (!document_url.SchemeIs(content::kChromeUIScheme)) - return false; - // Most extensions will not have (and cannot get) access to chrome:// URLs - // (which are restricted). However, allowing them to capture these URLs can - // be useful, such as in the case of capturing a screenshot. Allow - // extensions that have been explicitly invoked (and have the activeTab) - // permission to capture chrome:// URLs. - if (has_active_tab) - return true; - + // At least one of activeTab or <all_urls> is always required; no exceptions. + if (!has_active_tab && !has_all_urls) { if (error) - *error = manifest_errors::kActiveTabPermissionNotGranted; - + *error = manifest_errors::kAllURLOrActiveTabNeeded; return false; } - const URLPattern all_urls(URLPattern::SCHEME_ALL, - URLPattern::kAllUrlsPattern); - - base::AutoLock auto_lock(runtime_lock_); - if (active_permissions_unsafe_->explicit_hosts().ContainsPattern(all_urls)) + // We check GetPageAccess() (in addition to the <all_urls> and activeTab + // checks below) for the case of URLs that can be conditionally granted (such + // as file:// URLs or chrome:// URLs for component extensions). + // If an extension has <all_urls>, GetPageAccess() will still (correctly) + // return false if, for instance, the URL is a file:// URL and the extension + // does not have file access. + // See https://crbug.com/810220. + // If the extension has page access (and has activeTab or <all_urls>, as + // checked above), allow the capture. + std::string access_error; + if (GetPageAccess(origin, tab_id, &access_error) == PageAccess::kAllowed) return true; - const PermissionSet* tab_permissions = GetTabSpecificPermissions(tab_id); - if (tab_permissions && - tab_permissions->HasAPIPermission(APIPermission::kTab)) { + // The extension doesn't have explicit page access. However, there are a + // number of cases where tab capture may still be allowed. + + // First special case: an extension's own pages. + // These aren't restricted URLs, but won't be matched by <all_urls> or + // activeTab (since the extension scheme is not included in the list of valid + // schemes for extension permissions). + // To capture an extension's own page, either activeTab or <all_urls> is + // needed (it's no higher privilege than a normal web page). At least one + // of these is still needed because the extension page may have embedded + // web content. + // TODO(devlin): Should activeTab/<all_urls> account for the extension's own + // domain? + if (origin.host() == extension_id_) return true; + + // The following are special cases that require activeTab explicitly. Normal + // extensions will never have full access to these pages (i.e., can never + // inject scripts or otherwise modify the page), but capturing the page can + // still be useful for e.g. screenshots. We allow these pages only if the + // extension has been explicitly granted activeTab, which serves as a + // stronger guarantee that the user wants to run the extension on the site. + // These origins include: + // - chrome:-scheme pages. + // - Other extension's pages. + // - data: URLs (which don't have a defined underlying origin). + // TODO(devlin): Include the Webstore in this list? + bool allowed_with_active_tab = + origin.SchemeIs(content::kChromeUIScheme) || + origin.SchemeIs(kExtensionScheme) || + // Note: The origin of a data: url is empty, so check the url itself. + document_url.SchemeIs(url::kDataScheme); + + if (!allowed_with_active_tab) { + if (error) + *error = access_error; + return false; } + // If the extension has activeTab, these origins are allowed. + if (has_active_tab) + return true; + + // Otherwise, access is denied. if (error) - *error = manifest_errors::kAllURLOrActiveTabNeeded; + *error = manifest_errors::kActiveTabPermissionNotGranted; return false; }
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn index f7444523..d5eb72f 100644 --- a/extensions/shell/BUILD.gn +++ b/extensions/shell/BUILD.gn
@@ -524,6 +524,10 @@ sources += [ "browser/shell_desktop_controller_aura_browsertest.cc" ] deps += [ "//ui/aura" ] } + + if (is_mac) { + sources += [ "test/test_shell_main_delegate_mac.mm" ] + } } source_set("unit_tests") {
diff --git a/extensions/shell/test/DEPS b/extensions/shell/test/DEPS index ee7b58fe..695820a 100644 --- a/extensions/shell/test/DEPS +++ b/extensions/shell/test/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+content/public/browser", "+content/shell/common", + "+content/shell/browser/shell_application_mac.h", "+content/public/utility", "+services/service_manager/embedder",
diff --git a/extensions/shell/test/test_shell_main_delegate.h b/extensions/shell/test/test_shell_main_delegate.h index 34868ca..286c4f9 100644 --- a/extensions/shell/test/test_shell_main_delegate.h +++ b/extensions/shell/test/test_shell_main_delegate.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/macros.h" +#include "build/build_config.h" #include "extensions/shell/app/shell_main_delegate.h" namespace content { @@ -24,6 +25,9 @@ protected: // content::ContentMainDelegate implementation: content::ContentUtilityClient* CreateContentUtilityClient() override; +#if defined(OS_MACOSX) + void PreContentInitialization() override; +#endif private: std::unique_ptr<content::ContentUtilityClient> utility_client_;
diff --git a/extensions/shell/test/test_shell_main_delegate_mac.mm b/extensions/shell/test/test_shell_main_delegate_mac.mm new file mode 100644 index 0000000..09583cc --- /dev/null +++ b/extensions/shell/test/test_shell_main_delegate_mac.mm
@@ -0,0 +1,16 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/shell/test/test_shell_main_delegate.h" + +#include "content/shell/browser/shell_application_mac.h" + +namespace extensions { + +void TestShellMainDelegate::PreContentInitialization() { + // Force the NSApplication subclass to be used. + [ShellCrApplication sharedApplication]; +} + +} // namespace extensions
diff --git a/ios/build/bots/chromium.mac/UIRefresh-simulator.json b/ios/build/bots/chromium.mac/UIRefresh-simulator.json index 3b697d9..4915810 100644 --- a/ios/build/bots/chromium.mac/UIRefresh-simulator.json +++ b/ios/build/bots/chromium.mac/UIRefresh-simulator.json
@@ -17,7 +17,7 @@ { "include": "uirefresh_unittests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPhone 5s", "os": "11.2" @@ -25,7 +25,7 @@ { "include": "uirefresh_unittests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPhone X", "os": "11.2" @@ -33,7 +33,7 @@ { "include": "uirefresh_unittests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPad Air", "os": "11.2" @@ -41,7 +41,7 @@ { "include": "internal_earl_grey_tests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPhone X", "os": "11.2" @@ -49,7 +49,7 @@ { "include": "internal_earl_grey_tests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPad Air", "os": "11.2" @@ -57,7 +57,7 @@ { "include": "eg_cq_tests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPhone X", "os": "11.2" @@ -65,7 +65,7 @@ { "include": "eg_cq_tests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPad Air", "os": "11.2" @@ -73,7 +73,7 @@ { "include": "eg_tests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPhone X", "os": "11.2" @@ -81,7 +81,7 @@ { "include": "eg_tests.json", "test args": [ - "--enable-features=UIRefreshPhase1" + "--disable-features=UIRefreshPhase1" ], "device type": "iPad Air", "os": "11.2"
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm index ec14ce8..6cbc6a5 100644 --- a/ios/chrome/browser/about_flags.mm +++ b/ios/chrome/browser/about_flags.mm
@@ -348,6 +348,9 @@ flag_descriptions::kWebPageTextAccessibilityName, flag_descriptions::kWebPageTextAccessibilityDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(web::kWebPageTextAccessibility)}, + {"web-frame-messaging", flag_descriptions::kWebFrameMessagingName, + flag_descriptions::kWebFrameMessagingDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(web::features::kWebFrameMessaging)}, }; // Add all switches from experimental flags to |command_line|.
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc index a227b58..557f58b 100644 --- a/ios/chrome/browser/application_context_impl.cc +++ b/ios/chrome/browser/application_context_impl.cc
@@ -287,7 +287,7 @@ network_time_tracker_.reset(new network_time::NetworkTimeTracker( base::WrapUnique(new base::DefaultClock), base::WrapUnique(new base::DefaultTickClock), GetLocalState(), - GetSystemURLRequestContext())); + GetSharedURLLoaderFactory())); } return network_time_tracker_.get(); }
diff --git a/ios/chrome/browser/autofill/form_suggestion_view.mm b/ios/chrome/browser/autofill/form_suggestion_view.mm index 38d5368..17be4e8 100644 --- a/ios/chrome/browser/autofill/form_suggestion_view.mm +++ b/ios/chrome/browser/autofill/form_suggestion_view.mm
@@ -85,6 +85,13 @@ [stackView.heightAnchor constraintEqualToAnchor:self.heightAnchor].active = true; + // Rotate the UIScrollView and its UIStackView subview 180 degrees so that the + // first suggestion actually shows up first. + if (base::i18n::IsRTL()) { + self.transform = CGAffineTransformMakeRotation(M_PI); + stackView.transform = CGAffineTransformMakeRotation(M_PI); + } + auto setupBlock = ^(FormSuggestion* suggestion, NSUInteger idx, BOOL* stop) { // Disable user interaction with suggestion if it is Google Pay logo. BOOL userInteractionEnabled =
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm index 1dce3b2..6cbbb83 100644 --- a/ios/chrome/browser/context_menu/context_menu_egtest.mm +++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -477,12 +477,36 @@ }); } +// Tests that system touches are cancelled when the context menu is shown. +// (While the kContextMenuElementPostMessage feature is enabled.) +- (void)testContextMenuCancelSystemTouchesMetricPostMessage { + base::test::ScopedFeatureList scopedFeatureList; + scopedFeatureList.InitAndEnableFeature( + web::features::kContextMenuElementPostMessage); + chrome_test_util::HistogramTester histogramTester; + + const GURL pageURL = self.testServer->GetURL(kLogoPagePath); + [ChromeEarlGrey loadURL:pageURL]; + [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]; + + LongPressElement(kLogoPageChromiumImageId); + TapOnContextMenuButton(OpenImageButton()); + [ChromeEarlGrey waitForPageToFinishLoading]; + + // Verify that system touches were cancelled. + histogramTester.ExpectTotalCount("ContextMenu.CancelSystemTouches", 1, + ^(NSString* error) { + GREYFail(error); + }); +} + // Tests that the system selected text callout is displayed instead of the // context menu when user long presses on plain text. - (void)testContextMenuSelectedTextCalloutPostMessage { base::test::ScopedFeatureList scopedFeatureList; scopedFeatureList.InitAndEnableFeature( web::features::kContextMenuElementPostMessage); + chrome_test_util::HistogramTester histogramTester; // Load the destination page directly because it has a plain text message on // it. @@ -499,6 +523,12 @@ // Verify that system text selection callout is displayed. [[[EarlGrey selectElementWithMatcher:SystemSelectionCalloutCopyButton()] inRoot:SystemSelectionCallout()] assertWithMatcher:grey_notNil()]; + + // Verify that system touches were not cancelled. + histogramTester.ExpectTotalCount("ContextMenu.CancelSystemTouches", 0, + ^(NSString* error) { + GREYFail(error); + }); } @end
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc index e2cb174..eb98d83 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -239,6 +239,11 @@ const char kUseDdljsonApiDescription[] = "Enables the new ddljson API to fetch Doodles for the NTP."; +const char kWebFrameMessagingName[] = "Web Frame Messaging"; +const char kWebFrameMessagingDescription[] = + "When enabled, API will be injected into webpages to allow sending messages" + " directly to any frame of a webpage."; + const char kWebPageTextAccessibilityName[] = "Enable text accessibility in web pages"; const char kWebPageTextAccessibilityDescription[] =
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h index 5ee787f..041d6ca2 100644 --- a/ios/chrome/browser/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -199,6 +199,10 @@ extern const char kUseDdljsonApiName[]; extern const char kUseDdljsonApiDescription[]; +// Title and description for the flag to enable web frame messaging. +extern const char kWebFrameMessagingName[]; +extern const char kWebFrameMessagingDescription[]; + // Title and description for the flag to enable text accessibility in webpages. extern const char kWebPageTextAccessibilityName[]; extern const char kWebPageTextAccessibilityDescription[];
diff --git a/ios/chrome/browser/metrics/ukm_egtest.mm b/ios/chrome/browser/metrics/ukm_egtest.mm index ee92393..2af6df2 100644 --- a/ios/chrome/browser/metrics/ukm_egtest.mm +++ b/ios/chrome/browser/metrics/ukm_egtest.mm
@@ -254,9 +254,7 @@ // Per crbug.com/853992, Entire test suite is failing regularly. + (NSArray*)testInvocations { - if (IsIPadIdiom()) - return @[]; - return [super testInvocations]; + return @[]; } + (void)setUp {
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h index 0f33d60c..10f36c2 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h +++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h
@@ -40,8 +40,6 @@ const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>* GetBlockedNavigations() const override; bool IsPlaceholderTab() const override; - int GetSyncId() const override; - void SetSyncId(int sync_id) override; bool ShouldSync(sync_sessions::SyncSessionsClient* sessions_client) override; private: @@ -49,7 +47,6 @@ friend class web::WebStateUserData<IOSChromeSyncedTabDelegate>; web::WebState* web_state_; - int sync_session_id_; DISALLOW_COPY_AND_ASSIGN(IOSChromeSyncedTabDelegate); };
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm index 10b7313..75f3035 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm +++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
@@ -37,8 +37,7 @@ } // namespace IOSChromeSyncedTabDelegate::IOSChromeSyncedTabDelegate(web::WebState* web_state) - : web_state_(web_state), - sync_session_id_(sync_sessions::TabNodePool::kInvalidTabNodeID) {} + : web_state_(web_state) {} IOSChromeSyncedTabDelegate::~IOSChromeSyncedTabDelegate() {} @@ -116,14 +115,6 @@ return false; } -int IOSChromeSyncedTabDelegate::GetSyncId() const { - return sync_session_id_; -} - -void IOSChromeSyncedTabDelegate::SetSyncId(int sync_id) { - sync_session_id_ = sync_id; -} - bool IOSChromeSyncedTabDelegate::ShouldSync( sync_sessions::SyncSessionsClient* sessions_client) { if (sessions_client->GetSyncedWindowDelegatesGetter()->FindById(
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm index cfdb6838..343a075 100644 --- a/ios/chrome/browser/ui/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -5125,8 +5125,14 @@ CGFloat newPageOffset = 0; UIView* newPage = nil; CGFloat offset = 0; - if (tab.webState->GetLastCommittedURL() == kChromeUINewTabURL && - !_isOffTheRecord && ![self canShowTabStrip]) { + GURL tabURL = tab.webState->GetLastCommittedURL(); + // Vislble URL should be more correct here than last committed, but for + // safety, limiting the scope only to WKBasedNavigationManager, which needs + // it to correctly animate NTP. See https://crbug.com/819606. + if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) + tabURL = tab.webState->GetVisibleURL(); + if (tabURL == kChromeUINewTabURL && !_isOffTheRecord && + ![self canShowTabStrip]) { offset = 0; // Temporary expand content area to take whole view space. Otherwise the // animated NTP will be clipped by content area bound. Previous frame will
diff --git a/ios/chrome/browser/ui/list_model/list_model.h b/ios/chrome/browser/ui/list_model/list_model.h index 93981a23..844e7f1 100644 --- a/ios/chrome/browser/ui/list_model/list_model.h +++ b/ios/chrome/browser/ui/list_model/list_model.h
@@ -9,6 +9,15 @@ @class ListItem; +// Collapsable mode to use either the header cell or the first cell to collapse +// sections in ListMode. +typedef NS_ENUM(NSInteger, ListModelCollapsableMode) { + // When a section is collapsed, all items are hidden. + ListModelCollapsableModeHeader = 0, + // When a section is collapsed, all items except the first one are hidden. + ListModelCollapsableModeFirstCell, +}; + // Key for saving collapsed state in the NSUserDefaults. extern NSString* const kListModelCollapsedKey; @@ -189,6 +198,9 @@ #pragma mark Collapsing methods. +// The default value is ListModelCollapsableModeHeader. +@property(nonatomic, assign) ListModelCollapsableMode collapsableMode; + // Sets an existing |sectionIdentifier| |collapsedKey| to be used when // collapsing or expanding a section. |collapsedKey| is a unique identifier for // each section that will be used for persisting information about the collapsed
diff --git a/ios/chrome/browser/ui/list_model/list_model.mm b/ios/chrome/browser/ui/list_model/list_model.mm index 87ffbc3..0b64a03 100644 --- a/ios/chrome/browser/ui/list_model/list_model.mm +++ b/ios/chrome/browser/ui/list_model/list_model.mm
@@ -34,6 +34,8 @@ NSMutableDictionary<NSNumber*, NSString*>* _collapsedKeys; } +@synthesize collapsableMode = _collapsableMode; + - (instancetype)init { if ((self = [super init])) { _sectionIdentifiers = [[NSMutableArray alloc] init]; @@ -293,9 +295,17 @@ - (NSInteger)numberOfItemsInSection:(NSInteger)section { DCHECK_LT(base::checked_cast<NSUInteger>(section), [_sections count]); NSInteger sectionIdentifier = [self sectionIdentifierForSection:section]; - if ([self sectionIsCollapsed:sectionIdentifier]) - return 0; SectionItems* items = [_sections objectAtIndex:section]; + if ([self sectionIsCollapsed:sectionIdentifier]) { + switch (self.collapsableMode) { + case ListModelCollapsableModeHeader: + return 0; + case ListModelCollapsableModeFirstCell: + DCHECK_LT(0ul, items.count); + return 1; + } + NOTREACHED(); + } return items.count; }
diff --git a/ios/chrome/browser/ui/list_model/list_model_collapse_unittest.mm b/ios/chrome/browser/ui/list_model/list_model_collapse_unittest.mm index 8196316a..90d6989 100644 --- a/ios/chrome/browser/ui/list_model/list_model_collapse_unittest.mm +++ b/ios/chrome/browser/ui/list_model/list_model_collapse_unittest.mm
@@ -174,4 +174,27 @@ EXPECT_TRUE([model sectionIsCollapsed:SectionIdentifierBar]); } +TEST_F(ListModelCollapseTest, CollapsedSectionMode) { + model.collapsableMode = ListModelCollapsableModeFirstCell; + [model setSection:SectionIdentifierFoo collapsed:YES]; + [model setSection:SectionIdentifierBar collapsed:YES]; + + // SectionIdentifierFoo + EXPECT_EQ(1, [model numberOfItemsInSection:0]); + EXPECT_TRUE([model sectionIsCollapsed:SectionIdentifierFoo]); + // SectionIdentifierBar + EXPECT_EQ(1, [model numberOfItemsInSection:1]); + EXPECT_TRUE([model sectionIsCollapsed:SectionIdentifierBar]); + + [model setSection:SectionIdentifierFoo collapsed:NO]; + [model setSection:SectionIdentifierBar collapsed:NO]; + + // SectionIdentifierFoo + EXPECT_EQ(1, [model numberOfItemsInSection:0]); + EXPECT_FALSE([model sectionIsCollapsed:SectionIdentifierFoo]); + // SectionIdentifierBar + EXPECT_EQ(2, [model numberOfItemsInSection:1]); + EXPECT_FALSE([model sectionIsCollapsed:SectionIdentifierBar]); +} + } // namespace
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/legacy_recent_tabs_table_coordinator.mm b/ios/chrome/browser/ui/ntp/recent_tabs/legacy_recent_tabs_table_coordinator.mm index 95802c1..0837711 100644 --- a/ios/chrome/browser/ui/ntp/recent_tabs/legacy_recent_tabs_table_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/recent_tabs/legacy_recent_tabs_table_coordinator.mm
@@ -53,7 +53,7 @@ - (void)start { _tableViewController.handsetCommandHandler = self.handsetCommandHandler; [self.mediator initObservers]; - [self.mediator reloadSessions]; + [self.mediator configureConsumer]; } - (void)stop {
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm index 6bf5994..c7e6970e 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.mm
@@ -65,7 +65,7 @@ self.mediator = [[RecentTabsMediator alloc] init]; self.mediator.browserState = self.browserState; // Set the consumer first before calling [self.mediator initObservers] and - // then [self.mediator reloadSessions]. + // then [self.mediator configureConsumer]. self.mediator.consumer = recentTabsTableViewController; // TODO(crbug.com/845636) : Currently, the image data source must be set // before the mediator starts updating its consumer. Fix this so that order of @@ -73,7 +73,7 @@ recentTabsTableViewController.imageDataSource = self.mediator; recentTabsTableViewController.delegate = self.mediator; [self.mediator initObservers]; - [self.mediator reloadSessions]; + [self.mediator configureConsumer]; // Present RecentTabsNavigationController. self.recentTabsNavigationController = [[TableViewNavigationController alloc]
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.h b/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.h index c9d3676..75fefaa1 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.h +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.h
@@ -26,15 +26,8 @@ // accordingly. @interface RecentTabsMediator : NSObject<ClosedTabsObserving, - RecentTabsImageDataSource, - SyncedSessionsObserver, - LegacyRecentTabsTableViewControllerDelegate> - -// Starts observing the he user's signed-in and chrome-sync states. -- (void)initObservers; - -// Disconnects the mediator from all observers. -- (void)disconnect; + LegacyRecentTabsTableViewControllerDelegate, + RecentTabsImageDataSource> // The consumer for this object. This can change during the lifetime of this // object and may be nil. @@ -42,6 +35,17 @@ // The coordinator's BrowserState. @property(nonatomic, assign) ios::ChromeBrowserState* browserState; + +// Starts observing the he user's signed-in and chrome-sync states. +- (void)initObservers; + +// Disconnects the mediator from all observers. +- (void)disconnect; + +// Configures the consumer with current data. Intended to be called immediately +// after initialization. +- (void)configureConsumer; + @end #endif // IOS_CHROME_BROWSER_UI_RECENT_TABS_RECENT_TABS_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm index fe43811c..ffc900b 100644 --- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm +++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_mediator.mm
@@ -30,7 +30,7 @@ const CGFloat kFaviconMinWidthHeight = 16; } // namespace -@interface RecentTabsMediator () { +@interface RecentTabsMediator ()<SyncedSessionsObserver> { std::unique_ptr<synced_sessions::SyncedSessionsObserverBridge> _syncedSessionsObserver; std::unique_ptr<recent_tabs::ClosedTabsObserverBridge> _closedTabsObserver; @@ -47,8 +47,6 @@ - (BOOL)isSyncCompleted; // Reload the panel. - (void)refreshSessionsView; -// Force a contact to the sync server to reload remote sessions. -- (void)reloadSessionsData; @end @@ -88,10 +86,13 @@ } } +- (void)configureConsumer { + [self refreshSessionsView]; +} + #pragma mark - SyncedSessionsObserver - (void)reloadSessions { - [self reloadSessionsData]; [self refreshSessionsView]; } @@ -168,13 +169,6 @@ return _syncedSessionsObserver->IsFirstSyncCycleCompleted(); } -- (void)reloadSessionsData { - const syncer::ModelTypeSet types(syncer::SESSIONS); - // Requests a sync refresh of the sessions for the current profile. - ProfileSyncServiceFactory::GetForBrowserState(_browserState) - ->TriggerRefresh(types); -} - #pragma mark - RecentTabsTableViewControllerDelegate - (void)refreshSessionsView {
diff --git a/ios/chrome/test/testing_application_context.mm b/ios/chrome/test/testing_application_context.mm index 2284b056..e14a0e7 100644 --- a/ios/chrome/test/testing_application_context.mm +++ b/ios/chrome/test/testing_application_context.mm
@@ -160,8 +160,7 @@ DCHECK(local_state_); network_time_tracker_.reset(new network_time::NetworkTimeTracker( base::WrapUnique(new base::DefaultClock), - base::WrapUnique(new base::DefaultTickClock), local_state_, - GetSystemURLRequestContext())); + base::WrapUnique(new base::DefaultTickClock), local_state_, nullptr)); } return network_time_tracker_.get(); }
diff --git a/ios/web/features.mm b/ios/web/features.mm index 5f3c7e3..e72c9c9 100644 --- a/ios/web/features.mm +++ b/ios/web/features.mm
@@ -10,6 +10,9 @@ const base::Feature kContextMenuElementPostMessage{ "ContextMenuElementPostMessage", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kWebFrameMessaging{"WebFrameMessaging", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kSlimNavigationManager{"SlimNavigationManager", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/web/public/features.h b/ios/web/public/features.h index 4750c695..1fe0456 100644 --- a/ios/web/public/features.h +++ b/ios/web/public/features.h
@@ -13,6 +13,9 @@ // Used to enable asynchronous DOM element fetching for context menu. extern const base::Feature kContextMenuElementPostMessage; +// Used to enable API to send messages directly to frames of a webpage. +extern const base::Feature kWebFrameMessaging; + // Used to enable the WKBackForwardList based navigation manager. extern const base::Feature kSlimNavigationManager;
diff --git a/ios/web/web_state/navigation_and_load_callbacks_inttest.mm b/ios/web/web_state/navigation_and_load_callbacks_inttest.mm index 3a21f1f5..80708c2 100644 --- a/ios/web/web_state/navigation_and_load_callbacks_inttest.mm +++ b/ios/web/web_state/navigation_and_load_callbacks_inttest.mm
@@ -9,6 +9,7 @@ #include "base/strings/stringprintf.h" #include "ios/testing/embedded_test_server_handlers.h" #import "ios/testing/wait_util.h" +#include "ios/web/public/features.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_manager.h" #import "ios/web/public/test/fakes/test_native_content.h" @@ -142,7 +143,11 @@ EXPECT_TRUE(error_code == NSURLErrorNetworkConnectionLost); EXPECT_FALSE((*context)->IsRendererInitiated()); EXPECT_FALSE((*context)->GetResponseHeaders()); - ASSERT_FALSE(web_state->IsLoading()); + if (base::FeatureList::IsEnabled(web::features::kWebErrorPages)) { + ASSERT_TRUE(web_state->IsLoading()); + } else { + ASSERT_FALSE(web_state->IsLoading()); + } NavigationManager* navigation_manager = web_state->GetNavigationManager(); NavigationItem* item = navigation_manager->GetLastCommittedItem(); EXPECT_FALSE(item->GetTimestamp().is_null()); @@ -645,10 +650,20 @@ .WillOnce(VerifyPageStartedContext( web_state(), url, ui::PageTransition::PAGE_TRANSITION_TYPED, &context, &nav_id)); - EXPECT_CALL(observer_, DidStopLoading(web_state())); - EXPECT_CALL(observer_, DidFinishNavigation(web_state(), _)) - .WillOnce( - VerifyErrorFinishedContext(web_state(), url, &context, &nav_id)); + + if (base::FeatureList::IsEnabled(web::features::kWebErrorPages)) { + EXPECT_CALL(observer_, DidFinishNavigation(web_state(), _)) + .WillOnce( + VerifyErrorFinishedContext(web_state(), url, &context, &nav_id)); + EXPECT_CALL(observer_, DidStopLoading(web_state())); + + } else { + EXPECT_CALL(observer_, DidStopLoading(web_state())); + EXPECT_CALL(observer_, DidFinishNavigation(web_state(), _)) + .WillOnce( + VerifyErrorFinishedContext(web_state(), url, &context, &nav_id)); + } + EXPECT_CALL(observer_, PageLoaded(web_state(), PageLoadCompletionStatus::FAILURE)); test::LoadUrl(web_state(), url);
diff --git a/ios/web/web_state/navigation_context_impl.mm b/ios/web/web_state/navigation_context_impl.mm index 001cc39..f7c20a17 100644 --- a/ios/web/web_state/navigation_context_impl.mm +++ b/ios/web/web_state/navigation_context_impl.mm
@@ -42,11 +42,13 @@ #ifndef NDEBUG NSString* NavigationContextImpl::GetDescription() const { - return [NSString stringWithFormat: - @"web::WebState: %ld, url: %s, " - "is_same_document: %@, error: %@", - reinterpret_cast<long>(web_state_), url_.spec().c_str(), - is_same_document_ ? @"true" : @"false", error_]; + return [NSString + stringWithFormat: + @"web::WebState: %ld, url: %s, " + "is_same_document: %@, error: %@ is_loading_error_page: %@", + reinterpret_cast<long>(web_state_), url_.spec().c_str(), + is_same_document_ ? @"true" : @"false", error_, + is_loading_error_page_ ? @"true" : @"false"]; } #endif // NDEBUG
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.mm b/ios/web/web_state/ui/crw_context_menu_controller.mm index 8b3701c..c53c0509 100644 --- a/ios/web/web_state/ui/crw_context_menu_controller.mm +++ b/ios/web/web_state/ui/crw_context_menu_controller.mm
@@ -60,6 +60,25 @@ Count }; +// Name of the histogram for recording when the gesture recognizer recognizes a +// long press before the DOM element details are available. +const std::string kContextMenuDelayedElementDetailsHistogram = + "ContextMenu.DelayedElementDetails"; + +// Enum used to record resulting action when the gesture recognizer recognizes a +// long press before the DOM element details are available. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class DelayedElementDetailsState { + // Recorded when the context menu is displayed when receiving the dom element + // details after the gesture recognizer had already recognized a long press. + Show = 0, + // Recorded when the context menu is not displayed after the gesture + // recognizer fully recognized a long press. + Cancel = 1, + kMaxValue = Cancel +}; + // Struct to track the details of the element at |location| in |webView|. struct ContextMenuInfo { // The location of the long press. @@ -95,6 +114,9 @@ - (void)longPressGestureRecognizerBegan; // Called when the |_contextMenuRecognizer| changes. - (void)longPressGestureRecognizerChanged; +// Show the context menu or allow the system default behavior based on the DOM +// element details in |_contextMenuInfoForLastTouch.dom_element|. +- (void)processReceivedDOMElement; // Called when the context menu must be shown. - (void)showContextMenu; // Cancels all touch events in the web view (long presses, tapping, scrolling). @@ -271,27 +293,12 @@ } - (void)longPressGestureRecognizerBegan { - BOOL canShowContextMenu = web::CanShowContextMenuForElementDictionary( - _contextMenuInfoForLastTouch.dom_element); - if (canShowContextMenu) { - // User long pressed on a link or an image. Cancelling all touches will - // intentionally suppress system context menu UI. - [self cancelAllTouches]; + if (_contextMenuInfoForLastTouch.dom_element) { + [self processReceivedDOMElement]; } else { - // There is no link or image under user's gesture. Do not cancel all touches - // to allow system text seletion UI. - } - - if ([_delegate respondsToSelector:@selector(webView:handleContextMenu:)]) { - _contextMenuInfoForLastTouch.location = - [_contextMenuRecognizer locationInView:_webView]; - - if (canShowContextMenu) { - [self showContextMenu]; - } else { - // Shows the context menu once the DOM element information is set. - _contextMenuNeedsDisplay = YES; - } + // Shows the context menu once the DOM element information is set. + _contextMenuNeedsDisplay = YES; + UMA_HISTOGRAM_BOOLEAN("ContextMenu.WaitingForElementDetails", true); } } @@ -317,6 +324,26 @@ } } +- (void)processReceivedDOMElement { + BOOL canShowContextMenu = web::CanShowContextMenuForElementDictionary( + _contextMenuInfoForLastTouch.dom_element); + if (!canShowContextMenu) { + // There is no link or image under user's gesture. Do not cancel all touches + // to allow system text selection UI. + return; + } + + // User long pressed on a link or an image. Cancelling all touches will + // intentionally suppress system context menu UI. + [self cancelAllTouches]; + + if ([_delegate respondsToSelector:@selector(webView:handleContextMenu:)]) { + _contextMenuInfoForLastTouch.location = + [_contextMenuRecognizer locationInView:_webView]; + [self showContextMenu]; + } +} + - (void)showContextMenu { // Log if the element is in the main frame or a child frame. UMA_HISTOGRAM_ENUMERATION("ContextMenu.DOMElementFrame", @@ -333,6 +360,8 @@ } - (void)cancelAllTouches { + UMA_HISTOGRAM_BOOLEAN("ContextMenu.CancelSystemTouches", true); + // Disable web view scrolling. CancelTouches(self.webView.scrollView.panGestureRecognizer); @@ -354,7 +383,9 @@ - (void)setDOMElementForLastTouch:(NSDictionary*)element { _contextMenuInfoForLastTouch.dom_element = [element copy]; if (_contextMenuNeedsDisplay) { - [self showContextMenu]; + UMA_HISTOGRAM_ENUMERATION(kContextMenuDelayedElementDetailsHistogram, + DelayedElementDetailsState::Show); + [self processReceivedDOMElement]; } } @@ -390,7 +421,12 @@ } - (void)cancelContextMenuDisplay { + if (_contextMenuNeedsDisplay) { + UMA_HISTOGRAM_ENUMERATION(kContextMenuDelayedElementDetailsHistogram, + DelayedElementDetailsState::Cancel); + } _contextMenuNeedsDisplay = NO; + _contextMenuInfoForLastTouch.location = CGPointZero; for (HTMLElementFetchRequest* fetchRequest in _pendingElementFetchRequests .allValues) { [fetchRequest invalidate];
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 89c785f..9812e34d 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -1758,13 +1758,15 @@ baseURL:net::NSURLWithGURL(currentURL)]; auto loadHTMLContext = web::NavigationContextImpl::CreateNavigationContext( - _webStateImpl, GURL::EmptyGURL(), + _webStateImpl, currentURL, /*has_user_gesture=*/false, ui::PAGE_TRANSITION_FIRST, /*is_renderer_initiated=*/false); loadHTMLContext->SetLoadingErrorPage(true); [_navigationStates setContext:std::move(loadHTMLContext) forNavigation:navigation]; + [_navigationStates setState:web::WKNavigationState::REQUESTED + forNavigation:navigation]; } // If |context| has placeholder URL, this is the second part of a native error @@ -3091,6 +3093,12 @@ navigationItem:self.currentNavItem navigationContext:navigationContext]; } + + if (base::FeatureList::IsEnabled(web::features::kWebErrorPages) && + !web::GetWebClient()->IsSlimNavigationManagerEnabled()) { + self.navigationManagerImpl->CommitPendingItem(); + } + if ([_navigationStates stateForNavigation:navigation] == web::WKNavigationState::PROVISIONALY_FAILED) { _webStateImpl->OnNavigationFinished(navigationContext); @@ -4277,6 +4285,18 @@ } } + BOOL isMainFrameNavigationAction = [self isMainFrameNavigationAction:action]; + if (base::FeatureList::IsEnabled(web::features::kWebErrorPages) && + isMainFrameNavigationAction) { + web::NavigationContextImpl* context = + [self contextForPendingMainFrameNavigationWithURL:requestURL]; + if (context && context->IsLoadingErrorPage()) { + // loadHTMLString: navigation which loads error page into WKWebView. + decisionHandler(WKNavigationActionPolicyAllow); + return; + } + } + if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) { // WKBasedNavigationManager doesn't use |loadCurrentURL| for reload or back/ // forward navigation. So this is the first point where a form repost would @@ -4320,7 +4340,7 @@ ui::PageTransition transition = [self pageTransitionFromNavigationType:action.navigationType]; web::WebStatePolicyDecider::RequestInfo requestInfo( - transition, [self isMainFrameNavigationAction:action]); + transition, isMainFrameNavigationAction); BOOL allowLoad = self.webStateImpl->ShouldAllowRequest(action.request, requestInfo); if (!allowLoad && action.targetFrame.mainFrame) {
diff --git a/ipc/ipc_mojo_perftest.cc b/ipc/ipc_mojo_perftest.cc index d2652af..754f0e0 100644 --- a/ipc/ipc_mojo_perftest.cc +++ b/ipc/ipc_mojo_perftest.cc
@@ -22,7 +22,6 @@ #include "ipc/ipc_test.mojom.h" #include "ipc/ipc_test_base.h" #include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/embedder/platform_channel_pair.h" #include "mojo/edk/test/mojo_test_base.h" #include "mojo/edk/test/multiprocess_test_helper.h" #include "mojo/public/cpp/bindings/associated_binding_set.h"
diff --git a/media/blink/webmediacapabilitiesclient_impl.cc b/media/blink/webmediacapabilitiesclient_impl.cc index ac764e8..55b19af 100644 --- a/media/blink/webmediacapabilitiesclient_impl.cc +++ b/media/blink/webmediacapabilitiesclient_impl.cc
@@ -22,6 +22,7 @@ #include "third_party/blink/public/platform/modules/media_capabilities/web_media_configuration.h" #include "third_party/blink/public/platform/modules/media_capabilities/web_video_configuration.h" #include "third_party/blink/public/platform/platform.h" +#include "third_party/blink/public/platform/scoped_web_callbacks.h" namespace media { @@ -141,30 +142,21 @@ WebMediaCapabilitiesClientImpl::~WebMediaCapabilitiesClientImpl() = default; namespace { -// This structs wraps WebMediaCapabilitiesQueryCallbacks and makes sure -// they are called even when the mojo response is not received -// (connection error) as there is a pending promise waiting for the callback. -// See https://crbug.com/847211 -struct CallbacksHolder { - std::unique_ptr<blink::WebMediaCapabilitiesQueryCallbacks> callbacks; - - CallbacksHolder(CallbacksHolder&&) = default; - ~CallbacksHolder() { - if (callbacks) { - callbacks->OnError(); - } - } -}; - void VideoPerfInfoCallback( - CallbacksHolder callbacks_holder, + blink::ScopedWebCallbacks<blink::WebMediaCapabilitiesQueryCallbacks> + scoped_callbacks, std::unique_ptr<blink::WebMediaCapabilitiesInfo> info, bool is_smooth, bool is_power_efficient) { DCHECK(info->supported); info->smooth = is_smooth; info->power_efficient = is_power_efficient; - std::move(callbacks_holder.callbacks)->OnSuccess(std::move(info)); + scoped_callbacks.PassCallbacks()->OnSuccess(std::move(info)); +} + +void OnGetPerfInfoError( + std::unique_ptr<blink::WebMediaCapabilitiesQueryCallbacks> callbacks) { + callbacks->OnError(); } } // namespace @@ -226,8 +218,11 @@ decode_history_ptr_->GetPerfInfo( std::move(features), - base::BindOnce(&VideoPerfInfoCallback, - CallbacksHolder{std::move(callbacks)}, std::move(info))); + base::BindOnce( + &VideoPerfInfoCallback, + blink::MakeScopedWebCallbacks(std::move(callbacks), + base::BindOnce(&OnGetPerfInfoError)), + std::move(info))); } void WebMediaCapabilitiesClientImpl::BindVideoDecodePerfHistoryForTests(
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 1f3da7e3..1d9dc06e 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -2584,7 +2584,12 @@ // TODO(sandersd): WebContentsObserverSanityChecker does not allow sending the // 'playing' IPC more than once in a row, even if the metadata has changed. // Figure out whether it should. - bool has_audio = HasAudio() && !client_->IsAutoplayingMuted(); + // Pretend that the media has no audio if it never played unmuted. This is to + // avoid any action related to audible media such as taking audio focus or + // showing a media notification. To preserve a consistent experience, it does + // not apply if a media was audible so the system states do not flicker + // depending on whether the user muted the player. + bool has_audio = HasAudio() && !client_->WasAlwaysMuted(); if (delegate_state_ == new_state && (delegate_state_ != DelegateState::PLAYING || delegate_has_audio_ == has_audio)) {
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index d578c7a8..90eed33 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -161,7 +161,7 @@ MOCK_METHOD2(RemotePlaybackCompatibilityChanged, void(const blink::WebURL&, bool)); MOCK_METHOD1(OnBecamePersistentVideo, void(bool)); - MOCK_METHOD0(IsAutoplayingMuted, bool()); + MOCK_METHOD0(WasAlwaysMuted, bool()); MOCK_METHOD0(HasSelectedVideoTrack, bool()); MOCK_METHOD0(GetSelectedVideoTrackId, blink::WebMediaPlayer::TrackId()); MOCK_METHOD0(HasNativeControls, bool()); @@ -177,9 +177,9 @@ MOCK_METHOD0(RequestPlay, void()); MOCK_METHOD0(RequestPause, void()); - void set_is_autoplaying_muted(bool value) { is_autoplaying_muted_ = value; } + void set_was_always_muted(bool value) { was_always_muted_ = value; } - bool is_autoplaying_muted_ = false; + bool was_always_muted_ = false; private: DISALLOW_COPY_AND_ASSIGN(MockWebMediaPlayerClient); @@ -454,8 +454,8 @@ EXPECT_CALL(client_, ReadyStateChanged()); wmpi_->SetReadyState(blink::WebMediaPlayer::kReadyStateHaveMetadata); - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); wmpi_->pipeline_metadata_.has_audio = has_audio; wmpi_->pipeline_metadata_.has_video = has_video; @@ -481,32 +481,32 @@ } WebMediaPlayerImpl::PlayState ComputePlayState() { - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); return wmpi_->UpdatePlayState_ComputePlayState(false, true, false, false); } WebMediaPlayerImpl::PlayState ComputePlayState_FrameHidden() { - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); return wmpi_->UpdatePlayState_ComputePlayState(false, true, false, true); } WebMediaPlayerImpl::PlayState ComputePlayState_Suspended() { - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); return wmpi_->UpdatePlayState_ComputePlayState(false, true, true, false); } WebMediaPlayerImpl::PlayState ComputePlayState_Remote() { - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); return wmpi_->UpdatePlayState_ComputePlayState(true, true, false, false); } WebMediaPlayerImpl::PlayState ComputePlayState_BackgroundedStreaming() { - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); return wmpi_->UpdatePlayState_ComputePlayState(false, false, false, true); } @@ -1110,17 +1110,17 @@ SetMetadata(true, true); SetReadyState(blink::WebMediaPlayer::kReadyStateHaveFutureData); SetPaused(false); - client_.set_is_autoplaying_muted(true); + client_.set_was_always_muted(true); EXPECT_CALL(delegate_, DidPlay(_, true, false, _)); - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillOnce(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillOnce(Return(client_.was_always_muted_)); SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); - client_.set_is_autoplaying_muted(false); + client_.set_was_always_muted(false); EXPECT_CALL(delegate_, DidPlay(_, true, true, _)); - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillOnce(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillOnce(Return(client_.was_always_muted_)); SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); } @@ -1129,16 +1129,16 @@ SetMetadata(true, true); SetReadyState(blink::WebMediaPlayer::kReadyStateHaveFutureData); SetPaused(false); - client_.set_is_autoplaying_muted(true); + client_.set_was_always_muted(true); EXPECT_CALL(delegate_, DidPlay(_, true, false, _)); - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillOnce(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillOnce(Return(client_.was_always_muted_)); SetDelegateState(WebMediaPlayerImpl::DelegateState::PLAYING); - client_.set_is_autoplaying_muted(false); - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillOnce(Return(client_.is_autoplaying_muted_)); + client_.set_was_always_muted(false); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillOnce(Return(client_.was_always_muted_)); EXPECT_CALL(delegate_, DidPlay(_, true, true, _)); wmpi_->SetVolume(1.0); } @@ -1557,8 +1557,8 @@ // test back into a normal state. EXPECT_TRUE(IsDisableVideoTrackPending()); - EXPECT_CALL(client_, IsAutoplayingMuted()) - .WillRepeatedly(Return(client_.is_autoplaying_muted_)); + EXPECT_CALL(client_, WasAlwaysMuted()) + .WillRepeatedly(Return(client_.was_always_muted_)); ForegroundPlayer(); EXPECT_FALSE(IsVideoTrackDisabled()); EXPECT_FALSE(IsDisableVideoTrackPending());
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn index b0ad79f..26713b3 100644 --- a/mojo/BUILD.gn +++ b/mojo/BUILD.gn
@@ -61,6 +61,7 @@ "//base", "//base/test:test_support", "//mojo/edk", + "//mojo/edk:edk_internal", "//mojo/edk/system:test_utils", "//testing/gtest", ]
diff --git a/mojo/edk/BUILD.gn b/mojo/edk/BUILD.gn index 084becdb0..489b5d0 100644 --- a/mojo/edk/BUILD.gn +++ b/mojo/edk/BUILD.gn
@@ -11,21 +11,39 @@ output_name = "mojo_edk" public = [ + "embedder/configuration.h", "embedder/embedder.h", - "embedder/peer_connection.h", + "embedder/scoped_ipc_support.h", ] sources = [ "embedder/embedder.cc", - "embedder/peer_connection.cc", + "embedder/scoped_ipc_support.cc", ] - defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ] + defines = [ "IS_MOJO_EDK_EMBEDDER_IMPL" ] public_deps = [ + "//base", + ] + + deps = [ + ":edk_internal", + "//mojo/public/c/system", + ] +} + +component("edk_internal") { + output_name = "mojo_edk_internal" + public_deps = [ ":impl_for_edk", - "//mojo/public/cpp/platform", - "//mojo/public/cpp/system", + ] + defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ] + visibility = [ + ":edk", + "//mojo:*", + "//mojo/edk/embedder:embedder_unittests", + "//mojo/edk/system:test_sources", ] } @@ -42,7 +60,7 @@ if (invoker.for_mojo_core) { visibility = [ ":mojo_core" ] } else { - visibility = [ ":edk" ] + visibility = [ ":edk_internal" ] } public = [ @@ -56,7 +74,6 @@ "embedder/platform_handle.h", "embedder/platform_handle_utils.h", "embedder/process_error_callback.h", - "embedder/scoped_ipc_support.h", "embedder/scoped_platform_handle.h", "embedder/transport_protocol.h", "system/channel.h", @@ -95,7 +112,6 @@ "embedder/platform_handle.cc", "embedder/platform_handle_utils.cc", "embedder/platform_handle_utils_win.cc", - "embedder/scoped_ipc_support.cc", "system/atomic_flag.h", "system/broker.h", "system/broker_win.cc",
diff --git a/mojo/edk/embedder/BUILD.gn b/mojo/edk/embedder/BUILD.gn deleted file mode 100644 index a33988e..0000000 --- a/mojo/edk/embedder/BUILD.gn +++ /dev/null
@@ -1,27 +0,0 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -source_set("embedder_unittests") { - testonly = true - - # TODO: Figure out why this visibility check fails on Android. - # visibility = [ "//mojo:mojo_unittests" ] - - sources = [ - "embedder_unittest.cc", - ] - - if (is_posix) { - sources += [ "platform_channel_pair_posix_unittest.cc" ] - } - - deps = [ - "//base", - "//base/test:test_support", - "//mojo/edk", - "//mojo/edk/system:test_utils", - "//mojo/edk/test:test_support", - "//testing/gtest", - ] -}
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc index 8851c4e..35670308 100644 --- a/mojo/edk/embedder/embedder.cc +++ b/mojo/edk/embedder/embedder.cc
@@ -34,20 +34,6 @@ Core::Get()->SetDefaultProcessErrorCallback(callback); } -MojoResult CreateInternalPlatformHandleWrapper( - ScopedInternalPlatformHandle platform_handle, - MojoHandle* platform_handle_wrapper_handle) { - return Core::Get()->CreateInternalPlatformHandleWrapper( - std::move(platform_handle), platform_handle_wrapper_handle); -} - -MojoResult PassWrappedInternalPlatformHandle( - MojoHandle platform_handle_wrapper_handle, - ScopedInternalPlatformHandle* platform_handle) { - return Core::Get()->PassWrappedInternalPlatformHandle( - platform_handle_wrapper_handle, platform_handle); -} - scoped_refptr<base::TaskRunner> GetIOTaskRunner() { return Core::Get()->GetNodeController()->io_task_runner(); }
diff --git a/mojo/edk/embedder/embedder.h b/mojo/edk/embedder/embedder.h index 8bf4515f..572bebb6 100644 --- a/mojo/edk/embedder/embedder.h +++ b/mojo/edk/embedder/embedder.h
@@ -10,14 +10,12 @@ #include <string> #include "base/callback.h" +#include "base/component_export.h" #include "base/memory/ref_counted.h" #include "base/memory/shared_memory_handle.h" #include "base/process/process_handle.h" #include "base/task_runner.h" #include "mojo/edk/embedder/configuration.h" -#include "mojo/edk/embedder/scoped_platform_handle.h" -#include "mojo/edk/system/system_impl_export.h" -#include "mojo/public/c/system/types.h" namespace base { class PortProvider; @@ -34,50 +32,30 @@ // initialize the (global, singleton) system state. There is no corresponding // shutdown operation: once the EDK is initialized, public Mojo C API calls // remain available for the remainder of the process's lifetime. -MOJO_SYSTEM_IMPL_EXPORT void Init(const Configuration& configuration); +COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) +void Init(const Configuration& configuration); // Like above but uses a default Configuration. -MOJO_SYSTEM_IMPL_EXPORT void Init(); +COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) void Init(); // Sets a default callback to invoke when an internal error is reported but // cannot be associated with a specific child process. Calling this is optional. -MOJO_SYSTEM_IMPL_EXPORT void SetDefaultProcessErrorCallback( - const ProcessErrorCallback& callback); - -// Basic functions ------------------------------------------------------------- -// -// The functions in this section are available once |Init()| has been called and -// provide the embedder with some extra capabilities not exposed by public Mojo -// C APIs. - -// Creates a |MojoHandle| that wraps the given |InternalPlatformHandle| (taking -// ownership of it). This |MojoHandle| can then, e.g., be passed through message -// pipes. Note: This takes ownership (and thus closes) |platform_handle| even on -// failure, which is different from what you'd expect from a Mojo API, but it -// makes for a more convenient embedder API. -MOJO_SYSTEM_IMPL_EXPORT MojoResult CreateInternalPlatformHandleWrapper( - ScopedInternalPlatformHandle platform_handle, - MojoHandle* platform_handle_wrapper_handle); - -// Retrieves the |InternalPlatformHandle| that was wrapped into a |MojoHandle| -// (using |CreateInternalPlatformHandleWrapper()| above). Note that the -// |MojoHandle| is closed on success. -MOJO_SYSTEM_IMPL_EXPORT MojoResult PassWrappedInternalPlatformHandle( - MojoHandle platform_handle_wrapper_handle, - ScopedInternalPlatformHandle* platform_handle); +COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) +void SetDefaultProcessErrorCallback(const ProcessErrorCallback& callback); // Initialialization/shutdown for interprocess communication (IPC) ------------- // Retrieves the TaskRunner used for IPC I/O, as set by ScopedIPCSupport. -MOJO_SYSTEM_IMPL_EXPORT scoped_refptr<base::TaskRunner> GetIOTaskRunner(); +COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) +scoped_refptr<base::TaskRunner> GetIOTaskRunner(); #if defined(OS_MACOSX) && !defined(OS_IOS) // Set the |base::PortProvider| for this process. Can be called on any thread, // but must be set in the root process before any Mach ports can be transferred. // // If called at all, this must be called while a ScopedIPCSupport exists. -MOJO_SYSTEM_IMPL_EXPORT void SetMachPortProvider( - base::PortProvider* port_provider); +COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) +void SetMachPortProvider(base::PortProvider* port_provider); #endif } // namespace edk
diff --git a/mojo/edk/embedder/outgoing_broker_client_invitation.cc b/mojo/edk/embedder/outgoing_broker_client_invitation.cc deleted file mode 100644 index 6c9ae1e..0000000 --- a/mojo/edk/embedder/outgoing_broker_client_invitation.cc +++ /dev/null
@@ -1,65 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/edk/embedder/outgoing_broker_client_invitation.h" - -#include "base/logging.h" -#include "mojo/edk/system/core.h" -#include "mojo/edk/system/node_controller.h" -#include "mojo/edk/system/ports/port_ref.h" -#include "mojo/edk/system/request_context.h" - -namespace mojo { -namespace edk { - -OutgoingBrokerClientInvitation::OutgoingBrokerClientInvitation() = default; - -OutgoingBrokerClientInvitation::~OutgoingBrokerClientInvitation() { - RequestContext request_context; - for (auto& entry : attached_ports_) - Core::Get()->GetNodeController()->ClosePort(entry.second); -} - -ScopedMessagePipeHandle OutgoingBrokerClientInvitation::AttachMessagePipe( - const std::string& name) { - DCHECK(!sent_); - ports::PortRef port; - ScopedMessagePipeHandle pipe = ScopedMessagePipeHandle( - MessagePipeHandle(Core::Get()->CreatePartialMessagePipe(&port))); - attached_ports_.emplace_back(name, port); - return pipe; -} - -ScopedMessagePipeHandle -OutgoingBrokerClientInvitation::ExtractInProcessMessagePipe( - const std::string& name) { - // NOTE: Efficiency is not really important here. This is not used in normal - // production code and is in practice only called when |attached_ports_| has - // a single entry. - for (auto it = attached_ports_.begin(); it != attached_ports_.end(); ++it) { - if (it->first == name) { - ScopedMessagePipeHandle pipe = ScopedMessagePipeHandle( - MessagePipeHandle(Core::Get()->CreatePartialMessagePipe(it->second))); - attached_ports_.erase(it); - return pipe; - } - } - - NOTREACHED(); - return ScopedMessagePipeHandle(); -} - -void OutgoingBrokerClientInvitation::Send( - base::ProcessHandle target_process, - ConnectionParams params, - const ProcessErrorCallback& error_callback) { - DCHECK(!sent_); - sent_ = true; - Core::Get()->SendBrokerClientInvitation(target_process, std::move(params), - attached_ports_, error_callback); - attached_ports_.clear(); -} - -} // namespace edk -} // namespace mojo
diff --git a/mojo/edk/embedder/outgoing_broker_client_invitation.h b/mojo/edk/embedder/outgoing_broker_client_invitation.h deleted file mode 100644 index aadf3f8..0000000 --- a/mojo/edk/embedder/outgoing_broker_client_invitation.h +++ /dev/null
@@ -1,93 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_EDK_EMBEDDER_OUTGOING_BROKER_CLIENT_INVITATION_H_ -#define MOJO_EDK_EMBEDDER_OUTGOING_BROKER_CLIENT_INVITATION_H_ - -#include <stdint.h> - -#include <string> -#include <utility> -#include <vector> - -#include "base/macros.h" -#include "base/process/process_handle.h" -#include "mojo/edk/embedder/connection_params.h" -#include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/system/system_impl_export.h" -#include "mojo/public/cpp/system/message_pipe.h" - -namespace mojo { -namespace edk { - -namespace ports { -class PortRef; -} - -// Any Mojo embedder which is either the broker process itself or an existing -// broker client can use a OutgoingBrokerClientInvitation to invite a new -// process into broker's group of connected processes. -// -// In order to use OutgoingBrokerClientInvitation, you must have a valid process -// handle to the target process, as well as a valid ConnectionParams -// corresponding to some ConnectionParams in the target process. -// -// It is the embedder's responsibility get a corresponding ConnectionParams into -// the target process somehow (for example, by using file descriptor inheritance -// at process launch to give it the other end of a socket pair) and ensure that -// the target process constructs a corresponding IncomingBrokerClientInvitation -// object for that ConnectionParams. -// -// New message pipes may be attached to a OutgoingBrokerClientInvitation by -// calling AttachMessagePipe(). -// -// The invitation is sent by calling Send(), and once the invitation is sent -// there is no further need to keep the OutgoingBrokerClientInvitation object -// alive. -class MOJO_SYSTEM_IMPL_EXPORT OutgoingBrokerClientInvitation { - public: - OutgoingBrokerClientInvitation(); - ~OutgoingBrokerClientInvitation(); - - // Attaches a new message pipe to this invitation. The returned message pipe - // handle can be used immediately in the calling process. The other end can be - // obtained by the eventual receiver of this invitation, i.e., the target of - // Send(). - // - // NOTE: This must not be called after Send(). - ScopedMessagePipeHandle AttachMessagePipe(const std::string& name); - - // Sends the invitation to the target process. |target_process| must be a - // valid handle and |params| must correspond to some other ConnectionParams - // (e.g. the other half of a socket pair) in the target process. - void Send( - base::ProcessHandle target_process, - ConnectionParams params, - const ProcessErrorCallback& error_callback = ProcessErrorCallback()); - - // Extracts an attached message pipe endpoint by name. For use only when this - // invitation will NOT be sent to a remote process (i.e. Send() will never be - // be called) after all, and the caller wishes to retrieve the message pipe - // endpoint that would have been received. - // - // TODO(rockot): Remove this. It's only here to support content single-process - // mode and the NaCl broker, both of which could be implemented without this - // after some refactoring. - ScopedMessagePipeHandle ExtractInProcessMessagePipe(const std::string& name); - - private: - // List of named ports attached to this invitation. Each port is the peer of - // some corresponding message pipe handle returned by AttachMessagePipe. - std::vector<std::pair<std::string, ports::PortRef>> attached_ports_; - - // Indicates whether the invitation has been sent yet. - bool sent_ = false; - - DISALLOW_COPY_AND_ASSIGN(OutgoingBrokerClientInvitation); -}; - -} // namespace edk -} // namespace mojo - -#endif // MOJO_EDK_EMBEDDER_OUTGOING_BROKER_CLIENT_INVITATION_H_
diff --git a/mojo/edk/embedder/peer_connection.cc b/mojo/edk/embedder/peer_connection.cc deleted file mode 100644 index 18ded33..0000000 --- a/mojo/edk/embedder/peer_connection.cc +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "mojo/edk/embedder/peer_connection.h" - -#include "base/rand_util.h" -#include "base/strings/string_number_conversions.h" -#include "mojo/edk/system/core.h" -#include "mojo/public/cpp/platform/platform_channel.h" -#include "mojo/public/cpp/system/invitation.h" - -namespace mojo { -namespace edk { - -PeerConnection::PeerConnection() : token_(base::UnguessableToken::Create()) {} - -PeerConnection::~PeerConnection() { - // We send a dummy invitation over a temporary channel, re-using |token_| as - // the name. This ensures that the connection set up by Connect(), if any, - // will be replaced with a short-lived, self-terminating connection. - // - // This is a bit of a hack since Mojo does not provide any API for explicitly - // terminating isolated connections, but this is a decision made to minimize - // the API surface dedicated to isolated connections in anticipation of the - // concept being deprecated eventually. - PlatformChannel channel; - OutgoingInvitation::SendIsolated(channel.TakeLocalEndpoint(), - token_.ToString()); -} - -ScopedMessagePipeHandle PeerConnection::Connect(ConnectionParams params) { - ports::PortRef peer_port; - auto pipe = ScopedMessagePipeHandle( - MessagePipeHandle(Core::Get()->CreatePartialMessagePipe(&peer_port))); - Core::Get()->ConnectIsolated(std::move(params), peer_port, token_.ToString()); - return pipe; -} - -} // namespace edk -} // namespace mojo
diff --git a/mojo/edk/embedder/peer_connection.h b/mojo/edk/embedder/peer_connection.h deleted file mode 100644 index ba11f964..0000000 --- a/mojo/edk/embedder/peer_connection.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MOJO_EDK_EMBEDDER_PEER_CONNECTION_H_ -#define MOJO_EDK_EMBEDDER_PEER_CONNECTION_H_ - -#include "base/macros.h" -#include "base/unguessable_token.h" -#include "mojo/edk/embedder/connection_params.h" -#include "mojo/edk/system/system_impl_export.h" -#include "mojo/public/cpp/system/message_pipe.h" - -namespace mojo { -namespace edk { - -// Used to connect to a peer process. -// -// NOTE: This should ONLY be used if there is no common ancestor for the -// processes being connected. Peer connections have limited capabilities with -// respect to Mojo IPC when compared to standard broker client connections (see -// OutgoingBrokerClientInvitation and IncomingBrokerClientInvitation), and in -// particular it's undefined behavior to attempt to forward any resources -// (message pipes or other system handles) received from a peer process over to -// any other process to which you're connected. -// -// Both processes must construct a PeerConnection with each one corresponding to -// one end of some shared connection medium (e.g. a platform channel.) -// -// Each PeerConnection gets an implicit cross-process message pipe, the local -// endpoint of which may be acquired by a one-time call to TakeMessagePipe(). -// -// Once established, the connection to the remote peer will remain valid as long -// as each process keeps its respective PeerConnection object alive. -class MOJO_SYSTEM_IMPL_EXPORT PeerConnection { - public: - // Constructs a disconnected connection. - PeerConnection(); - ~PeerConnection(); - - // Connects to the peer and returns a primordial message pipe handle which - // will be connected to a corresponding peer pipe in the remote process. - ScopedMessagePipeHandle Connect(ConnectionParams params); - - private: - const base::UnguessableToken token_; - - DISALLOW_COPY_AND_ASSIGN(PeerConnection); -}; - -} // namespace edk -} // namespace mojo - -#endif // MOJO_EDK_EMBEDDER_PEER_CONNECTION_H_
diff --git a/mojo/edk/embedder/scoped_ipc_support.h b/mojo/edk/embedder/scoped_ipc_support.h index 83611b7..0763a789 100644 --- a/mojo/edk/embedder/scoped_ipc_support.h +++ b/mojo/edk/embedder/scoped_ipc_support.h
@@ -5,8 +5,8 @@ #ifndef MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_ #define MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_ +#include "base/component_export.h" #include "base/memory/ref_counted.h" -#include "mojo/edk/system/system_impl_export.h" namespace base { class TaskRunner; @@ -18,7 +18,7 @@ // A simple class that initialized Mojo IPC support on construction and shuts // down IPC support on destruction, optionally blocking the destructor on clean // IPC shutdown completion. -class MOJO_SYSTEM_IMPL_EXPORT ScopedIPCSupport { +class COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) ScopedIPCSupport { public: // ShutdownPolicy is a type for specifying the desired Mojo IPC support // shutdown behavior used during ScopedIPCSupport destruction.
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn index 235f32e3..d671418 100644 --- a/mojo/edk/system/BUILD.gn +++ b/mojo/edk/system/BUILD.gn
@@ -38,6 +38,7 @@ "core_test_base.cc", "core_test_base.h", "core_unittest.cc", + "embedder_unittest.cc", "handle_table_unittest.cc", "message_pipe_unittest.cc", "message_unittest.cc", @@ -49,6 +50,10 @@ "trap_unittest.cc", ] + if (is_posix) { + sources += [ "platform_channel_pair_posix_unittest.cc" ] + } + if (!is_ios) { sources += [ "data_pipe_unittest.cc", @@ -63,7 +68,7 @@ "//base", "//base/test:test_support", "//mojo/edk", - "//mojo/edk/embedder:embedder_unittests", + "//mojo/edk:edk_internal", "//mojo/edk/system/ports:tests", "//mojo/edk/test:run_all_unittests", "//mojo/edk/test:test_support", @@ -71,6 +76,4 @@ "//testing/gmock", "//testing/gtest", ] - - allow_circular_includes_from = [ "//mojo/edk/embedder:embedder_unittests" ] }
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc index f68cd02..26cefb3 100644 --- a/mojo/edk/system/core.cc +++ b/mojo/edk/system/core.cc
@@ -264,36 +264,6 @@ handles_->CancelTransit(dispatchers); } -MojoResult Core::CreateInternalPlatformHandleWrapper( - ScopedInternalPlatformHandle platform_handle, - MojoHandle* wrapper_handle) { - MojoHandle h = AddDispatcher( - PlatformHandleDispatcher::Create(std::move(platform_handle))); - if (h == MOJO_HANDLE_INVALID) - return MOJO_RESULT_RESOURCE_EXHAUSTED; - *wrapper_handle = h; - return MOJO_RESULT_OK; -} - -MojoResult Core::PassWrappedInternalPlatformHandle( - MojoHandle wrapper_handle, - ScopedInternalPlatformHandle* platform_handle) { - base::AutoLock lock(handles_->GetLock()); - scoped_refptr<Dispatcher> d; - MojoResult result = handles_->GetAndRemoveDispatcher(wrapper_handle, &d); - if (result != MOJO_RESULT_OK) - return result; - if (d->GetType() == Dispatcher::Type::PLATFORM_HANDLE) { - PlatformHandleDispatcher* phd = - static_cast<PlatformHandleDispatcher*>(d.get()); - *platform_handle = phd->PassInternalPlatformHandle(); - } else { - result = MOJO_RESULT_INVALID_ARGUMENT; - } - d->Close(); - return result; -} - void Core::RequestShutdown(const base::Closure& callback) { GetNodeController()->RequestShutdown(callback); } @@ -1022,17 +992,36 @@ if (result != MOJO_RESULT_OK) return result; - return CreateInternalPlatformHandleWrapper(std::move(handle), mojo_handle); + MojoHandle h = + AddDispatcher(PlatformHandleDispatcher::Create(std::move(handle))); + if (h == MOJO_HANDLE_INVALID) + return MOJO_RESULT_RESOURCE_EXHAUSTED; + + *mojo_handle = h; + return MOJO_RESULT_OK; } MojoResult Core::UnwrapInternalPlatformHandle( MojoHandle mojo_handle, const MojoUnwrapPlatformHandleOptions* options, MojoPlatformHandle* platform_handle) { - ScopedInternalPlatformHandle handle; - MojoResult result = PassWrappedInternalPlatformHandle(mojo_handle, &handle); - if (result != MOJO_RESULT_OK) - return result; + scoped_refptr<Dispatcher> dispatcher; + { + base::AutoLock lock(handles_->GetLock()); + dispatcher = handles_->GetDispatcher(mojo_handle); + if (dispatcher->GetType() != Dispatcher::Type::PLATFORM_HANDLE) + return MOJO_RESULT_INVALID_ARGUMENT; + + MojoResult result = + handles_->GetAndRemoveDispatcher(mojo_handle, &dispatcher); + if (result != MOJO_RESULT_OK) + return result; + } + + PlatformHandleDispatcher* phd = + static_cast<PlatformHandleDispatcher*>(dispatcher.get()); + ScopedInternalPlatformHandle handle = phd->PassInternalPlatformHandle(); + phd->Close(); return ScopedInternalPlatformHandleToMojoPlatformHandle(std::move(handle), platform_handle);
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h index e88626d..7c015ac2 100644 --- a/mojo/edk/system/core.h +++ b/mojo/edk/system/core.h
@@ -141,15 +141,6 @@ const std::vector<Dispatcher::DispatcherInTransit>& dispatchers, bool in_transit); - // See "mojo/edk/embedder/embedder.h" for more information on these functions. - MojoResult CreateInternalPlatformHandleWrapper( - ScopedInternalPlatformHandle platform_handle, - MojoHandle* wrapper_handle); - - MojoResult PassWrappedInternalPlatformHandle( - MojoHandle wrapper_handle, - ScopedInternalPlatformHandle* platform_handle); - // Requests that the EDK tear itself down. |callback| will be called once // the shutdown process is complete. Note that |callback| is always called // asynchronously on the calling thread if said thread is running a message
diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/system/embedder_unittest.cc similarity index 86% rename from mojo/edk/embedder/embedder_unittest.cc rename to mojo/edk/system/embedder_unittest.cc index abe1c630a..ae9fb26 100644 --- a/mojo/edk/embedder/embedder_unittest.cc +++ b/mojo/edk/system/embedder_unittest.cc
@@ -24,15 +24,11 @@ #include "base/path_service.h" #include "base/rand_util.h" #include "base/run_loop.h" +#include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/waitable_event.h" #include "base/test/test_timeouts.h" #include "build/build_config.h" -#include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/embedder/named_platform_handle.h" -#include "mojo/edk/embedder/named_platform_handle_utils.h" -#include "mojo/edk/embedder/peer_connection.h" -#include "mojo/edk/embedder/platform_channel_pair.h" #include "mojo/edk/system/core.h" #include "mojo/edk/system/shared_buffer_dispatcher.h" #include "mojo/edk/system/test_utils.h" @@ -40,6 +36,7 @@ #include "mojo/public/c/system/core.h" #include "mojo/public/cpp/system/handle.h" #include "mojo/public/cpp/system/message_pipe.h" +#include "mojo/public/cpp/system/platform_handle.h" #include "mojo/public/cpp/system/wait.h" #include "testing/gtest/include/gtest/gtest.h" @@ -349,12 +346,10 @@ enum class HandleType { POSIX, MACH, - MACH_NULL, }; const HandleType kTestHandleTypes[] = { - HandleType::MACH, HandleType::MACH_NULL, HandleType::POSIX, - HandleType::POSIX, HandleType::MACH, + HandleType::MACH, HandleType::POSIX, HandleType::POSIX, HandleType::MACH, }; // Test that we can mix file descriptors and mach port handles. @@ -362,22 +357,17 @@ const size_t kShmSize = 1234; RunTestClient("MultiprocessMixMachAndFdsClient", [&](MojoHandle server_mp) { // 1. Create fds or Mach objects and mojo handles from them. - MojoHandle platform_handles[arraysize(kTestHandleTypes)]; - for (size_t i = 0; i < arraysize(kTestHandleTypes); i++) { + MojoHandle platform_handles[base::size(kTestHandleTypes)]; + for (size_t i = 0; i < base::size(kTestHandleTypes); i++) { const auto type = kTestHandleTypes[i]; - ScopedInternalPlatformHandle scoped_handle; + PlatformHandle scoped_handle; if (type == HandleType::POSIX) { // The easiest source of fds is opening /dev/null. base::File file(base::FilePath("/dev/null"), base::File::FLAG_OPEN | base::File::FLAG_WRITE); ASSERT_TRUE(file.IsValid()); - scoped_handle.reset(InternalPlatformHandle(file.TakePlatformFile())); - EXPECT_EQ(InternalPlatformHandle::Type::POSIX, - scoped_handle.get().type); - } else if (type == HandleType::MACH_NULL) { - scoped_handle.reset( - InternalPlatformHandle(static_cast<mach_port_t>(MACH_PORT_NULL))); - EXPECT_EQ(InternalPlatformHandle::Type::MACH, scoped_handle.get().type); + scoped_handle = PlatformHandle(base::ScopedFD(file.TakePlatformFile())); + ASSERT_TRUE(scoped_handle.is_valid_fd()); } else { auto shared_memory = base::UnsafeSharedMemoryRegion::Create(kShmSize); ASSERT_TRUE(shared_memory.IsValid()); @@ -385,17 +375,16 @@ base::UnsafeSharedMemoryRegion::TakeHandleForSerialization( std::move(shared_memory)) .PassPlatformHandle(); - scoped_handle.reset(InternalPlatformHandle(shm_handle.release())); - EXPECT_EQ(InternalPlatformHandle::Type::MACH, scoped_handle.get().type); + scoped_handle = PlatformHandle(std::move(shm_handle)); + ASSERT_TRUE(scoped_handle.is_valid_mach_port()); } - ASSERT_EQ(MOJO_RESULT_OK, - CreateInternalPlatformHandleWrapper(std::move(scoped_handle), - platform_handles + i)); + platform_handles[i] = + WrapPlatformHandle(std::move(scoped_handle)).release().value(); } // 2. Send all the handles to the child. WriteMessageWithHandles(server_mp, "hello", platform_handles, - arraysize(kTestHandleTypes)); + base::size(kTestHandleTypes)); // 3. Read a message from |server_mp|. EXPECT_EQ("bye", ReadMessage(server_mp)); @@ -405,7 +394,7 @@ DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessMixMachAndFdsClient, EmbedderTest, client_mp) { - const int kNumHandles = arraysize(kTestHandleTypes); + const int kNumHandles = base::size(kTestHandleTypes); MojoHandle platform_handles[kNumHandles]; // 1. Read from |client_mp|, which should have a message containing @@ -416,20 +405,12 @@ // 2. Extract each handle, and verify the type. for (int i = 0; i < kNumHandles; i++) { const auto type = kTestHandleTypes[i]; - ScopedInternalPlatformHandle scoped_handle; - ASSERT_EQ(MOJO_RESULT_OK, PassWrappedInternalPlatformHandle( - platform_handles[i], &scoped_handle)); + PlatformHandle scoped_handle = + UnwrapPlatformHandle(ScopedHandle(Handle(platform_handles[i]))); if (type == HandleType::POSIX) { - EXPECT_NE(0, scoped_handle.get().handle); - EXPECT_EQ(InternalPlatformHandle::Type::POSIX, scoped_handle.get().type); - } else if (type == HandleType::MACH_NULL) { - EXPECT_EQ(static_cast<mach_port_t>(MACH_PORT_NULL), - scoped_handle.get().port); - EXPECT_EQ(InternalPlatformHandle::Type::MACH, scoped_handle.get().type); + EXPECT_TRUE(scoped_handle.is_valid_fd()); } else { - EXPECT_NE(static_cast<mach_port_t>(MACH_PORT_NULL), - scoped_handle.get().port); - EXPECT_EQ(InternalPlatformHandle::Type::MACH, scoped_handle.get().type); + EXPECT_TRUE(scoped_handle.is_valid_mach_port()); } }
diff --git a/mojo/edk/system/message_unittest.cc b/mojo/edk/system/message_unittest.cc index b493bad..29c1cbe 100644 --- a/mojo/edk/system/message_unittest.cc +++ b/mojo/edk/system/message_unittest.cc
@@ -11,10 +11,9 @@ #include "base/numerics/safe_math.h" #include "base/rand_util.h" #include "build/build_config.h" -#include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/embedder/platform_channel_pair.h" #include "mojo/edk/system/user_message_impl.h" #include "mojo/edk/test/mojo_test_base.h" +#include "mojo/public/cpp/platform/platform_channel.h" #include "mojo/public/cpp/system/buffer.h" #include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/platform_handle.h" @@ -815,11 +814,15 @@ MojoHandle handles[5]; CreateMessagePipe(&handles[0], &handles[1]); - PlatformChannelPair channel; - ASSERT_EQ(MOJO_RESULT_OK, CreateInternalPlatformHandleWrapper( - channel.PassServerHandle(), &handles[2])); - ASSERT_EQ(MOJO_RESULT_OK, CreateInternalPlatformHandleWrapper( - channel.PassClientHandle(), &handles[3])); + PlatformChannel channel; + handles[2] = + WrapPlatformHandle(channel.TakeLocalEndpoint().TakePlatformHandle()) + .release() + .value(); + handles[3] = + WrapPlatformHandle(channel.TakeRemoteEndpoint().TakePlatformHandle()) + .release() + .value(); handles[4] = SharedBufferHandle::Create(64).release().value(); MojoMessageHandle message; @@ -864,11 +867,15 @@ TEST_F(MessageTest, ExtendPayloadWithHandlesAttachedViaExtension) { MojoHandle handles[5]; CreateMessagePipe(&handles[0], &handles[4]); - PlatformChannelPair channel; - ASSERT_EQ(MOJO_RESULT_OK, CreateInternalPlatformHandleWrapper( - channel.PassServerHandle(), &handles[1])); - ASSERT_EQ(MOJO_RESULT_OK, CreateInternalPlatformHandleWrapper( - channel.PassClientHandle(), &handles[2])); + PlatformChannel channel; + handles[1] = + WrapPlatformHandle(channel.TakeLocalEndpoint().TakePlatformHandle()) + .release() + .value(); + handles[2] = + WrapPlatformHandle(channel.TakeRemoteEndpoint().TakePlatformHandle()) + .release() + .value(); handles[3] = SharedBufferHandle::Create(64).release().value(); MojoMessageHandle message;
diff --git a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc b/mojo/edk/system/platform_channel_pair_posix_unittest.cc similarity index 99% rename from mojo/edk/embedder/platform_channel_pair_posix_unittest.cc rename to mojo/edk/system/platform_channel_pair_posix_unittest.cc index 9e011f2..f13a153 100644 --- a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc +++ b/mojo/edk/system/platform_channel_pair_posix_unittest.cc
@@ -23,6 +23,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/logging.h" #include "base/macros.h" +#include "build/build_config.h" #include "mojo/edk/embedder/platform_channel_utils_posix.h" #include "mojo/edk/embedder/platform_handle.h" #include "mojo/edk/embedder/scoped_platform_handle.h"
diff --git a/mojo/edk/test/mojo_test_base.cc b/mojo/edk/test/mojo_test_base.cc index d0ec959c..52df0b7 100644 --- a/mojo/edk/test/mojo_test_base.cc +++ b/mojo/edk/test/mojo_test_base.cc
@@ -9,7 +9,6 @@ #include "base/run_loop.h" #include "base/synchronization/waitable_event.h" #include "mojo/edk/embedder/embedder.h" -#include "mojo/edk/system/handle_signals_state.h" #include "mojo/public/c/system/buffer.h" #include "mojo/public/c/system/data_pipe.h" #include "mojo/public/c/system/functions.h"
diff --git a/mojo/edk/test/test_utils.h b/mojo/edk/test/test_utils.h index f49e055..53c2c3b 100644 --- a/mojo/edk/test/test_utils.h +++ b/mojo/edk/test/test_utils.h
@@ -11,7 +11,6 @@ #include <string> #include "base/files/scoped_file.h" -#include "mojo/edk/embedder/scoped_platform_handle.h" #include "mojo/public/cpp/platform/platform_handle.h" namespace mojo {
diff --git a/mojo/public/c/system/thunks.cc b/mojo/public/c/system/thunks.cc index 38fc966..bcf0c6f9 100644 --- a/mojo/public/c/system/thunks.cc +++ b/mojo/public/c/system/thunks.cc
@@ -10,6 +10,8 @@ #include "base/logging.h" #include "base/macros.h" +#include "base/memory/protected_memory.h" +#include "base/memory/protected_memory_cfi.h" #include "base/no_destructor.h" #include "build/build_config.h" #include "mojo/public/c/system/core.h" @@ -24,10 +26,20 @@ namespace { -MojoSystemThunks g_thunks = {0}; +typedef void (*MojoGetSystemThunksFunction)(MojoSystemThunks* thunks); + +#if defined(OS_CHROMEOS) || defined(OS_LINUX) +PROTECTED_MEMORY_SECTION +base::ProtectedMemory<MojoGetSystemThunksFunction> g_get_thunks; +#endif + +PROTECTED_MEMORY_SECTION base::ProtectedMemory<MojoSystemThunks> g_thunks; } // namespace +#define INVOKE_THUNK(name, ...) \ + base::UnsanitizedCfiCall(g_thunks, &MojoSystemThunks::name)(__VA_ARGS__) + namespace mojo { // NOTE: This is defined within the global mojo namespace so that it can be @@ -35,8 +47,6 @@ // enabled. class CoreLibraryInitializer { public: - typedef void (*MojoGetSystemThunksFunction)(MojoSystemThunks* thunks); - CoreLibraryInitializer() { #if defined(OS_CHROMEOS) || defined(OS_LINUX) auto environment = base::Environment::Create(); @@ -61,16 +71,21 @@ << "MOJO_CORE_LIBRARY_PATH environment variable."; const char kGetThunksFunctionName[] = "MojoGetSystemThunks"; - MojoGetSystemThunksFunction get_thunks = - reinterpret_cast<MojoGetSystemThunksFunction>( - library_->GetFunctionPointer(kGetThunksFunctionName)); - CHECK(get_thunks) << "Invalid mojo_core library"; + { + auto writer = base::AutoWritableMemory::Create(g_get_thunks); + *g_get_thunks = reinterpret_cast<MojoGetSystemThunksFunction>( + library_->GetFunctionPointer(kGetThunksFunctionName)); + } + CHECK(*g_get_thunks) << "Invalid mojo_core library"; - DCHECK_EQ(g_thunks.size, 0u); - g_thunks.size = sizeof(g_thunks); - get_thunks(&g_thunks); + DCHECK_EQ(g_thunks->size, 0u); + { + auto writer = base::AutoWritableMemory::Create(g_thunks); + g_thunks->size = sizeof(*g_thunks); + base::UnsanitizedCfiCall(g_get_thunks)(&*g_thunks); + } - CHECK_GT(g_thunks.size, 0u) << "Invalid mojo_core library"; + CHECK_GT(g_thunks->size, 0u) << "Invalid mojo_core library"; #else // defined(OS_CHROMEOS) || defined(OS_LINUX) NOTREACHED() << "Dynamic mojo_core loading is not supported on this platform."; @@ -94,115 +109,118 @@ MojoResult MojoInitialize(const struct MojoInitializeOptions* options) { static base::NoDestructor<mojo::CoreLibraryInitializer> initializer; ALLOW_UNUSED_LOCAL(initializer); - DCHECK(g_thunks.Initialize); + DCHECK(g_thunks->Initialize); - return g_thunks.Initialize(options); + return INVOKE_THUNK(Initialize, options); } MojoTimeTicks MojoGetTimeTicksNow() { - return g_thunks.GetTimeTicksNow(); + return INVOKE_THUNK(GetTimeTicksNow); } MojoResult MojoClose(MojoHandle handle) { - return g_thunks.Close(handle); + return INVOKE_THUNK(Close, handle); } MojoResult MojoQueryHandleSignalsState( MojoHandle handle, struct MojoHandleSignalsState* signals_state) { - return g_thunks.QueryHandleSignalsState(handle, signals_state); + return INVOKE_THUNK(QueryHandleSignalsState, handle, signals_state); } MojoResult MojoCreateMessagePipe(const MojoCreateMessagePipeOptions* options, MojoHandle* message_pipe_handle0, MojoHandle* message_pipe_handle1) { - return g_thunks.CreateMessagePipe(options, message_pipe_handle0, - message_pipe_handle1); + return INVOKE_THUNK(CreateMessagePipe, options, message_pipe_handle0, + message_pipe_handle1); } MojoResult MojoWriteMessage(MojoHandle message_pipe_handle, MojoMessageHandle message_handle, const MojoWriteMessageOptions* options) { - return g_thunks.WriteMessage(message_pipe_handle, message_handle, options); + return INVOKE_THUNK(WriteMessage, message_pipe_handle, message_handle, + options); } MojoResult MojoReadMessage(MojoHandle message_pipe_handle, const MojoReadMessageOptions* options, MojoMessageHandle* message_handle) { - return g_thunks.ReadMessage(message_pipe_handle, options, message_handle); + return INVOKE_THUNK(ReadMessage, message_pipe_handle, options, + message_handle); } MojoResult MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1, const MojoFuseMessagePipesOptions* options) { - return g_thunks.FuseMessagePipes(handle0, handle1, options); + return INVOKE_THUNK(FuseMessagePipes, handle0, handle1, options); } MojoResult MojoCreateDataPipe(const MojoCreateDataPipeOptions* options, MojoHandle* data_pipe_producer_handle, MojoHandle* data_pipe_consumer_handle) { - return g_thunks.CreateDataPipe(options, data_pipe_producer_handle, - data_pipe_consumer_handle); + return INVOKE_THUNK(CreateDataPipe, options, data_pipe_producer_handle, + data_pipe_consumer_handle); } MojoResult MojoWriteData(MojoHandle data_pipe_producer_handle, const void* elements, uint32_t* num_elements, const MojoWriteDataOptions* options) { - return g_thunks.WriteData(data_pipe_producer_handle, elements, num_elements, - options); + return INVOKE_THUNK(WriteData, data_pipe_producer_handle, elements, + num_elements, options); } MojoResult MojoBeginWriteData(MojoHandle data_pipe_producer_handle, const MojoBeginWriteDataOptions* options, void** buffer, uint32_t* buffer_num_elements) { - return g_thunks.BeginWriteData(data_pipe_producer_handle, options, buffer, - buffer_num_elements); + return INVOKE_THUNK(BeginWriteData, data_pipe_producer_handle, options, + buffer, buffer_num_elements); } MojoResult MojoEndWriteData(MojoHandle data_pipe_producer_handle, uint32_t num_elements_written, const MojoEndWriteDataOptions* options) { - return g_thunks.EndWriteData(data_pipe_producer_handle, num_elements_written, - options); + return INVOKE_THUNK(EndWriteData, data_pipe_producer_handle, + num_elements_written, options); } MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle, const MojoReadDataOptions* options, void* elements, uint32_t* num_elements) { - return g_thunks.ReadData(data_pipe_consumer_handle, options, elements, - num_elements); + return INVOKE_THUNK(ReadData, data_pipe_consumer_handle, options, elements, + num_elements); } MojoResult MojoBeginReadData(MojoHandle data_pipe_consumer_handle, const MojoBeginReadDataOptions* options, const void** buffer, uint32_t* buffer_num_elements) { - return g_thunks.BeginReadData(data_pipe_consumer_handle, options, buffer, - buffer_num_elements); + return INVOKE_THUNK(BeginReadData, data_pipe_consumer_handle, options, buffer, + buffer_num_elements); } MojoResult MojoEndReadData(MojoHandle data_pipe_consumer_handle, uint32_t num_elements_read, const MojoEndReadDataOptions* options) { - return g_thunks.EndReadData(data_pipe_consumer_handle, num_elements_read, - options); + return INVOKE_THUNK(EndReadData, data_pipe_consumer_handle, num_elements_read, + options); } MojoResult MojoCreateSharedBuffer(uint64_t num_bytes, const MojoCreateSharedBufferOptions* options, MojoHandle* shared_buffer_handle) { - return g_thunks.CreateSharedBuffer(num_bytes, options, shared_buffer_handle); + return INVOKE_THUNK(CreateSharedBuffer, num_bytes, options, + shared_buffer_handle); } MojoResult MojoDuplicateBufferHandle( MojoHandle buffer_handle, const MojoDuplicateBufferHandleOptions* options, MojoHandle* new_buffer_handle) { - return g_thunks.DuplicateBufferHandle(buffer_handle, options, - new_buffer_handle); + return INVOKE_THUNK(DuplicateBufferHandle, buffer_handle, options, + new_buffer_handle); } MojoResult MojoMapBuffer(MojoHandle buffer_handle, @@ -210,23 +228,24 @@ uint64_t num_bytes, const MojoMapBufferOptions* options, void** buffer) { - return g_thunks.MapBuffer(buffer_handle, offset, num_bytes, options, buffer); + return INVOKE_THUNK(MapBuffer, buffer_handle, offset, num_bytes, options, + buffer); } MojoResult MojoUnmapBuffer(void* buffer) { - return g_thunks.UnmapBuffer(buffer); + return INVOKE_THUNK(UnmapBuffer, buffer); } MojoResult MojoGetBufferInfo(MojoHandle buffer_handle, const MojoGetBufferInfoOptions* options, MojoSharedBufferInfo* info) { - return g_thunks.GetBufferInfo(buffer_handle, options, info); + return INVOKE_THUNK(GetBufferInfo, buffer_handle, options, info); } MojoResult MojoCreateTrap(MojoTrapEventHandler handler, const MojoCreateTrapOptions* options, MojoHandle* trap_handle) { - return g_thunks.CreateTrap(handler, options, trap_handle); + return INVOKE_THUNK(CreateTrap, handler, options, trap_handle); } MojoResult MojoAddTrigger(MojoHandle trap_handle, @@ -235,14 +254,14 @@ MojoTriggerCondition condition, uintptr_t context, const MojoAddTriggerOptions* options) { - return g_thunks.AddTrigger(trap_handle, handle, signals, condition, context, - options); + return INVOKE_THUNK(AddTrigger, trap_handle, handle, signals, condition, + context, options); } MojoResult MojoRemoveTrigger(MojoHandle trap_handle, uintptr_t context, const MojoRemoveTriggerOptions* options) { - return g_thunks.RemoveTrigger(trap_handle, context, options); + return INVOKE_THUNK(RemoveTrigger, trap_handle, context, options); } MojoResult MojoArmTrap(MojoHandle trap_handle, @@ -251,22 +270,22 @@ uintptr_t* ready_triggers, MojoResult* ready_results, MojoHandleSignalsState* ready_signals_states) { - return g_thunks.ArmTrap(trap_handle, options, num_ready_triggers, - ready_triggers, ready_results, ready_signals_states); + return INVOKE_THUNK(ArmTrap, trap_handle, options, num_ready_triggers, + ready_triggers, ready_results, ready_signals_states); } MojoResult MojoCreateMessage(const MojoCreateMessageOptions* options, MojoMessageHandle* message) { - return g_thunks.CreateMessage(options, message); + return INVOKE_THUNK(CreateMessage, options, message); } MojoResult MojoDestroyMessage(MojoMessageHandle message) { - return g_thunks.DestroyMessage(message); + return INVOKE_THUNK(DestroyMessage, message); } MojoResult MojoSerializeMessage(MojoMessageHandle message, const MojoSerializeMessageOptions* options) { - return g_thunks.SerializeMessage(message, options); + return INVOKE_THUNK(SerializeMessage, message, options); } MojoResult MojoAppendMessageData(MojoMessageHandle message, @@ -276,8 +295,8 @@ const MojoAppendMessageDataOptions* options, void** buffer, uint32_t* buffer_size) { - return g_thunks.AppendMessageData(message, payload_size, handles, num_handles, - options, buffer, buffer_size); + return INVOKE_THUNK(AppendMessageData, message, payload_size, handles, + num_handles, options, buffer, buffer_size); } MojoResult MojoGetMessageData(MojoMessageHandle message, @@ -286,8 +305,8 @@ uint32_t* num_bytes, MojoHandle* handles, uint32_t* num_handles) { - return g_thunks.GetMessageData(message, options, buffer, num_bytes, handles, - num_handles); + return INVOKE_THUNK(GetMessageData, message, options, buffer, num_bytes, + handles, num_handles); } MojoResult MojoSetMessageContext(MojoMessageHandle message, @@ -295,34 +314,37 @@ MojoMessageContextSerializer serializer, MojoMessageContextDestructor destructor, const MojoSetMessageContextOptions* options) { - return g_thunks.SetMessageContext(message, context, serializer, destructor, - options); + return INVOKE_THUNK(SetMessageContext, message, context, serializer, + destructor, options); } MojoResult MojoGetMessageContext(MojoMessageHandle message, const MojoGetMessageContextOptions* options, uintptr_t* context) { - return g_thunks.GetMessageContext(message, options, context); + return INVOKE_THUNK(GetMessageContext, message, options, context); } MojoResult MojoNotifyBadMessage(MojoMessageHandle message, const char* error, uint32_t error_num_bytes, const MojoNotifyBadMessageOptions* options) { - return g_thunks.NotifyBadMessage(message, error, error_num_bytes, options); + return INVOKE_THUNK(NotifyBadMessage, message, error, error_num_bytes, + options); } MojoResult MojoWrapPlatformHandle(const MojoPlatformHandle* platform_handle, const MojoWrapPlatformHandleOptions* options, MojoHandle* mojo_handle) { - return g_thunks.WrapPlatformHandle(platform_handle, options, mojo_handle); + return INVOKE_THUNK(WrapPlatformHandle, platform_handle, options, + mojo_handle); } MojoResult MojoUnwrapPlatformHandle( MojoHandle mojo_handle, const MojoUnwrapPlatformHandleOptions* options, MojoPlatformHandle* platform_handle) { - return g_thunks.UnwrapPlatformHandle(mojo_handle, options, platform_handle); + return INVOKE_THUNK(UnwrapPlatformHandle, mojo_handle, options, + platform_handle); } MojoResult MojoWrapPlatformSharedMemoryRegion( @@ -333,9 +355,9 @@ MojoPlatformSharedMemoryRegionAccessMode access_mode, const MojoWrapPlatformSharedMemoryRegionOptions* options, MojoHandle* mojo_handle) { - return g_thunks.WrapPlatformSharedMemoryRegion( - platform_handles, num_platform_handles, num_bytes, guid, access_mode, - options, mojo_handle); + return INVOKE_THUNK(WrapPlatformSharedMemoryRegion, platform_handles, + num_platform_handles, num_bytes, guid, access_mode, + options, mojo_handle); } MojoResult MojoUnwrapPlatformSharedMemoryRegion( @@ -346,14 +368,14 @@ uint64_t* num_bytes, struct MojoSharedBufferGuid* guid, MojoPlatformSharedMemoryRegionAccessMode* access_mode) { - return g_thunks.UnwrapPlatformSharedMemoryRegion( - mojo_handle, options, platform_handles, num_platform_handles, num_bytes, - guid, access_mode); + return INVOKE_THUNK(UnwrapPlatformSharedMemoryRegion, mojo_handle, options, + platform_handles, num_platform_handles, num_bytes, guid, + access_mode); } MojoResult MojoCreateInvitation(const MojoCreateInvitationOptions* options, MojoHandle* invitation_handle) { - return g_thunks.CreateInvitation(options, invitation_handle); + return INVOKE_THUNK(CreateInvitation, options, invitation_handle); } MojoResult MojoAttachMessagePipeToInvitation( @@ -362,8 +384,8 @@ uint32_t name_num_bytes, const MojoAttachMessagePipeToInvitationOptions* options, MojoHandle* message_pipe_handle) { - return g_thunks.AttachMessagePipeToInvitation( - invitation_handle, name, name_num_bytes, options, message_pipe_handle); + return INVOKE_THUNK(AttachMessagePipeToInvitation, invitation_handle, name, + name_num_bytes, options, message_pipe_handle); } MojoResult MojoExtractMessagePipeFromInvitation( @@ -372,8 +394,8 @@ uint32_t name_num_bytes, const MojoExtractMessagePipeFromInvitationOptions* options, MojoHandle* message_pipe_handle) { - return g_thunks.ExtractMessagePipeFromInvitation( - invitation_handle, name, name_num_bytes, options, message_pipe_handle); + return INVOKE_THUNK(ExtractMessagePipeFromInvitation, invitation_handle, name, + name_num_bytes, options, message_pipe_handle); } MojoResult MojoSendInvitation( @@ -383,17 +405,17 @@ MojoProcessErrorHandler error_handler, uintptr_t error_handler_context, const MojoSendInvitationOptions* options) { - return g_thunks.SendInvitation(invitation_handle, process_handle, - transport_endpoint, error_handler, - error_handler_context, options); + return INVOKE_THUNK(SendInvitation, invitation_handle, process_handle, + transport_endpoint, error_handler, error_handler_context, + options); } MojoResult MojoAcceptInvitation( const MojoInvitationTransportEndpoint* transport_endpoint, const MojoAcceptInvitationOptions* options, MojoHandle* invitation_handle) { - return g_thunks.AcceptInvitation(transport_endpoint, options, - invitation_handle); + return INVOKE_THUNK(AcceptInvitation, transport_endpoint, options, + invitation_handle); } } // extern "C" @@ -401,13 +423,14 @@ void MojoEmbedderSetSystemThunks(const MojoSystemThunks* thunks) { // Assume embedders will always use matching versions of the EDK and public // APIs. - DCHECK_EQ(thunks->size, sizeof(g_thunks)); + DCHECK_EQ(thunks->size, sizeof(*g_thunks)); - // This should only have to check that the |g_thunks.size| is zero, but we + // This should only have to check that the |g_thunks->size| is zero, but we // have multiple EDK initializations in some test suites still. For now we // allow double calls as long as they're the same thunks as before. - DCHECK(g_thunks.size == 0 || !memcmp(&g_thunks, thunks, sizeof(g_thunks))) + DCHECK(g_thunks->size == 0 || !memcmp(&*g_thunks, thunks, sizeof(*g_thunks))) << "Cannot set embedder thunks after Mojo API calls have been made."; - g_thunks = *thunks; + auto writer = base::AutoWritableMemory::Create(g_thunks); + *g_thunks = *thunks; }
diff --git a/net/base/file_stream_context_win.cc b/net/base/file_stream_context_win.cc index 584d7203..5bcd235 100644 --- a/net/base/file_stream_context_win.cc +++ b/net/base/file_stream_context_win.cc
@@ -119,8 +119,10 @@ } void FileStream::Context::OnFileOpened() { - base::MessageLoopCurrentForIO::Get()->RegisterIOHandler( + HRESULT hr = base::MessageLoopCurrentForIO::Get()->RegisterIOHandler( file_.GetPlatformFile(), this); + if (!SUCCEEDED(hr)) + file_.Close(); } void FileStream::Context::IOCompletionIsPending(CompletionOnceCallback callback,
diff --git a/net/base/file_stream_unittest.cc b/net/base/file_stream_unittest.cc index 98b1ac9..dd9e2fa 100644 --- a/net/base/file_stream_unittest.cc +++ b/net/base/file_stream_unittest.cc
@@ -21,6 +21,7 @@ #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" +#include "build/build_config.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h" @@ -805,6 +806,27 @@ base::RunLoop().RunUntilIdle(); } +#if defined(OS_WIN) +// Verifies that a FileStream will close itself if it receives a File whose +// async flag doesn't match the async state of the underlying handle. +TEST_F(FileStreamTest, AsyncFlagMismatch) { + // Open the test file without async, then make a File with the same sync + // handle but with the async flag set to true. + uint32_t flags = base::File::FLAG_OPEN | base::File::FLAG_READ; + base::File file(temp_file_path(), flags); + base::File lying_file = + base::File::CreateForAsyncHandle(file.TakePlatformFile()); + ASSERT_TRUE(lying_file.IsValid()); + + FileStream stream(std::move(lying_file), base::ThreadTaskRunnerHandle::Get()); + ASSERT_FALSE(stream.IsOpen()); + TestCompletionCallback callback; + scoped_refptr<IOBufferWithSize> buf = new IOBufferWithSize(4); + int rv = stream.Read(buf.get(), buf->size(), callback.callback()); + EXPECT_THAT(callback.GetResult(rv), IsError(ERR_UNEXPECTED)); +} +#endif + #if defined(OS_ANDROID) TEST_F(FileStreamTest, ContentUriRead) { base::FilePath test_dir;
diff --git a/net/network_error_logging/network_error_logging_end_to_end_test.cc b/net/network_error_logging/network_error_logging_end_to_end_test.cc index 1e207e8..05979c2 100644 --- a/net/network_error_logging/network_error_logging_end_to_end_test.cc +++ b/net/network_error_logging/network_error_logging_end_to_end_test.cc
@@ -60,7 +60,7 @@ upload_should_hang_(false), upload_received_(false) { // Make report delivery happen instantly. - auto policy = std::make_unique<ReportingPolicy>(); + auto policy = ReportingPolicy::Create(); policy->delivery_interval = base::TimeDelta::FromSeconds(0); URLRequestContextBuilder builder;
diff --git a/net/reporting/reporting_policy.cc b/net/reporting/reporting_policy.cc index 1c4d163..71304935 100644 --- a/net/reporting/reporting_policy.cc +++ b/net/reporting/reporting_policy.cc
@@ -4,10 +4,32 @@ #include "net/reporting/reporting_policy.h" +#include "base/no_destructor.h" #include "base/time/time.h" namespace net { +namespace { + +ReportingPolicy* policy_for_testing = nullptr; + +} // namespace + +// static +std::unique_ptr<ReportingPolicy> ReportingPolicy::Create() { + if (policy_for_testing != nullptr) { + return std::make_unique<ReportingPolicy>(*policy_for_testing); + } + return std::make_unique<ReportingPolicy>(); +} + +// static +void ReportingPolicy::UsePolicyForTesting(const ReportingPolicy& policy) { + static base::NoDestructor<ReportingPolicy> owned_policy; + policy_for_testing = owned_policy.get(); + *owned_policy = policy; +} + ReportingPolicy::ReportingPolicy() : max_report_count(100u), max_client_count(1000u),
diff --git a/net/reporting/reporting_policy.h b/net/reporting/reporting_policy.h index 86d8858..fab5b7739 100644 --- a/net/reporting/reporting_policy.h +++ b/net/reporting/reporting_policy.h
@@ -5,6 +5,8 @@ #ifndef NET_REPORTING_REPORTING_POLICY_H_ #define NET_REPORTING_REPORTING_POLICY_H_ +#include <memory> + #include "base/time/time.h" #include "net/base/backoff_entry.h" #include "net/base/net_export.h" @@ -14,6 +16,13 @@ // Various policy knobs for the Reporting system. struct NET_EXPORT ReportingPolicy { // Provides a reasonable default for use in a browser embedder. + static std::unique_ptr<ReportingPolicy> Create(); + + // Lets you override the default policy returned by |Create|. Use this in + // browser tests, where there isn't any other way to pass in a specific test + // policy to use. + static void UsePolicyForTesting(const ReportingPolicy& policy); + ReportingPolicy(); ReportingPolicy(const ReportingPolicy& other); ~ReportingPolicy();
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index 53f09b0..0dbc6811 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -266,6 +266,8 @@ "test/test_data_pipe_getter.cc", "test/test_data_pipe_getter.h", "test/test_network_context.h", + "test/test_shared_url_loader_factory.cc", + "test/test_shared_url_loader_factory.h", "test/test_url_loader_client.cc", "test/test_url_loader_client.h", "test/test_url_loader_factory.cc",
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 9d13361..9884ead5 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -808,7 +808,7 @@ #if BUILDFLAG(ENABLE_REPORTING) if (base::FeatureList::IsEnabled(features::kReporting)) - builder->set_reporting_policy(std::make_unique<net::ReportingPolicy>()); + builder->set_reporting_policy(net::ReportingPolicy::Create()); else builder->set_reporting_policy(nullptr);
diff --git a/services/network/test/test_shared_url_loader_factory.cc b/services/network/test/test_shared_url_loader_factory.cc new file mode 100644 index 0000000..f7bc84c --- /dev/null +++ b/services/network/test/test_shared_url_loader_factory.cc
@@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/network/test/test_shared_url_loader_factory.h" + +#include "base/logging.h" +#include "net/url_request/url_request_test_util.h" +#include "services/network/network_context.h" +#include "services/network/public/cpp/cross_thread_shared_url_loader_factory_info.h" + +namespace network { + +TestSharedURLLoaderFactory::TestSharedURLLoaderFactory() { + url_request_context_ = std::make_unique<net::TestURLRequestContext>(); + mojom::NetworkContextPtr network_context; + network_context_ = std::make_unique<NetworkContext>( + nullptr, mojo::MakeRequest(&network_context), url_request_context_.get()); + mojom::URLLoaderFactoryParamsPtr params = + mojom::URLLoaderFactoryParams::New(); + params->process_id = mojom::kBrowserProcessId; + params->is_corb_enabled = false; + network_context_->CreateURLLoaderFactory( + mojo::MakeRequest(&url_loader_factory_), std::move(params)); +} + +TestSharedURLLoaderFactory::~TestSharedURLLoaderFactory() {} + +void TestSharedURLLoaderFactory::CreateLoaderAndStart( + mojom::URLLoaderRequest loader, + int32_t routing_id, + int32_t request_id, + uint32_t options, + const ResourceRequest& request, + mojom::URLLoaderClientPtr client, + const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) { + url_loader_factory_->CreateLoaderAndStart( + std::move(loader), routing_id, request_id, options, std::move(request), + std::move(client), traffic_annotation); +} + +void TestSharedURLLoaderFactory::Clone(mojom::URLLoaderFactoryRequest request) { + NOTREACHED(); +} + +// SharedURLLoaderFactoryInfo implementation +std::unique_ptr<SharedURLLoaderFactoryInfo> +TestSharedURLLoaderFactory::Clone() { + return std::make_unique<CrossThreadSharedURLLoaderFactoryInfo>(this); +} + +} // namespace network
diff --git a/services/network/test/test_shared_url_loader_factory.h b/services/network/test/test_shared_url_loader_factory.h new file mode 100644 index 0000000..d75836b --- /dev/null +++ b/services/network/test/test_shared_url_loader_factory.h
@@ -0,0 +1,55 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_NETWORK_TEST_TEST_SHARED_URL_LOADER_FACTORY_H_ +#define SERVICES_NETWORK_TEST_TEST_SHARED_URL_LOADER_FACTORY_H_ + +#include "base/macros.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + +namespace net { +class TestURLRequestContext; +} + +namespace network { + +class NetworkContext; + +// A helper class to create a full functioning SharedURLLoaderFactory. This is +// backed by a real URLLoader implementation. Use this in unittests which have a +// real IO thread and want to exercise the network stack. +// Note that Clone() can be used to receive a SharedURLLoaderFactory that works +// across threads. +class TestSharedURLLoaderFactory : public SharedURLLoaderFactory { + public: + TestSharedURLLoaderFactory(); + + // URLLoaderFactory implementation: + void CreateLoaderAndStart(mojom::URLLoaderRequest loader, + int32_t routing_id, + int32_t request_id, + uint32_t options, + const ResourceRequest& request, + mojom::URLLoaderClientPtr client, + const net::MutableNetworkTrafficAnnotationTag& + traffic_annotation) override; + void Clone(mojom::URLLoaderFactoryRequest request) override; + + // SharedURLLoaderFactoryInfo implementation + std::unique_ptr<SharedURLLoaderFactoryInfo> Clone() override; + + private: + friend class base::RefCounted<TestSharedURLLoaderFactory>; + ~TestSharedURLLoaderFactory() override; + + std::unique_ptr<net::TestURLRequestContext> url_request_context_; + std::unique_ptr<NetworkContext> network_context_; + mojom::URLLoaderFactoryPtr url_loader_factory_; + + DISALLOW_COPY_AND_ASSIGN(TestSharedURLLoaderFactory); +}; + +} // namespace network + +#endif // SERVICES_NETWORK_TEST_TEST_SHARED_URL_LOADER_FACTORY_H_
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.cc b/services/service_manager/public/cpp/test/test_connector_factory.cc index b736757..d9f7c53 100644 --- a/services/service_manager/public/cpp/test/test_connector_factory.cc +++ b/services/service_manager/public/cpp/test/test_connector_factory.cc
@@ -8,6 +8,7 @@ #include "base/guid.h" #include "base/macros.h" +#include "mojo/public/cpp/bindings/associated_binding.h" #include "mojo/public/cpp/bindings/binding_set.h" #include "services/service_manager/public/cpp/service.h" #include "services/service_manager/public/cpp/service_context.h" @@ -17,28 +18,64 @@ namespace { +class TestServiceControl : public mojom::ServiceControl { + public: + TestServiceControl(ServiceContext* context, + mojom::ServiceControlAssociatedRequest control_request) + : context_(context), binding_(this, std::move(control_request)) {} + + // mojom::ServiceControl implementation + void RequestQuit() override { context_->QuitNow(); } + + private: + ServiceContext* const context_; + mojo::AssociatedBinding<mojom::ServiceControl> binding_; +}; + class TestConnectorImplBase : public mojom::Connector { public: - TestConnectorImplBase(std::string test_user_id) - : test_user_id_(std::move(test_user_id)) {} + TestConnectorImplBase(std::string test_user_id, + bool release_service_on_quit_request) + : test_user_id_(std::move(test_user_id)), + release_service_on_quit_request_(release_service_on_quit_request) {} ~TestConnectorImplBase() override = default; void AddService(const std::string& service_name, std::unique_ptr<Service> service, mojom::ServicePtr* service_ptr) { - service_contexts_.push_back(std::make_unique<ServiceContext>( - std::move(service), mojo::MakeRequest(service_ptr))); + auto service_context = std::make_unique<ServiceContext>( + std::move(service), mojo::MakeRequest(service_ptr)); + auto* service_context_ptr = service_context.get(); + // Use of |Unretained(this)| is safe because |this| owns + // |service_context|. + service_context->SetQuitClosure( + base::BindRepeating(&TestConnectorImplBase::OnServiceRequestingQuit, + base::Unretained(this), service_context_ptr)); + service_contexts_.emplace(service_context_ptr, std::move(service_context)); (*service_ptr) ->OnStart(Identity("TestConnectorFactory", test_user_id_), base::BindOnce(&TestConnectorImplBase::OnStartCallback, - base::Unretained(this))); + base::Unretained(this), service_context_ptr)); } private: virtual mojom::ServicePtr* GetServicePtr(const std::string& service_name) = 0; - void OnStartCallback(mojom::ConnectorRequest request, + void OnStartCallback(ServiceContext* context, + mojom::ConnectorRequest request, mojom::ServiceControlAssociatedRequest control_request) { + if (!release_service_on_quit_request_) + return; + service_controls_.emplace(context, + std::make_unique<TestServiceControl>( + context, std::move(control_request))); + } + + void OnServiceRequestingQuit(ServiceContext* context) { + DCHECK(base::ContainsKey(service_controls_, context)); + DCHECK(base::ContainsKey(service_contexts_, context)); + service_controls_.erase(context); + service_contexts_.erase(context); } // mojom::Connector implementation: @@ -88,8 +125,11 @@ NOTREACHED(); } - std::string test_user_id_; - std::vector<std::unique_ptr<ServiceContext>> service_contexts_; + const std::string test_user_id_; + const bool release_service_on_quit_request_; + std::map<ServiceContext*, std::unique_ptr<ServiceContext>> service_contexts_; + std::map<ServiceContext*, std::unique_ptr<TestServiceControl>> + service_controls_; mojo::BindingSet<mojom::Connector> bindings_; DISALLOW_COPY_AND_ASSIGN(TestConnectorImplBase); @@ -98,8 +138,10 @@ class UniqueServiceConnector : public TestConnectorImplBase { public: explicit UniqueServiceConnector(std::unique_ptr<Service> service, - std::string test_user_id) - : TestConnectorImplBase(std::move(test_user_id)) { + std::string test_user_id, + bool release_service_on_quit_request) + : TestConnectorImplBase(std::move(test_user_id), + release_service_on_quit_request) { AddService(/*service_name=*/std::string(), std::move(service), &service_ptr_); } @@ -118,8 +160,10 @@ public: explicit MultipleServiceConnector( TestConnectorFactory::NameToServiceMap services, - std::string test_user_id) - : TestConnectorImplBase(std::move(test_user_id)) { + std::string test_user_id, + bool release_service_on_quit_request) + : TestConnectorImplBase(std::move(test_user_id), + release_service_on_quit_request) { for (auto& name_and_service : services) { mojom::ServicePtr service_ptr; const std::string& service_name = name_and_service.first; @@ -154,21 +198,26 @@ // static std::unique_ptr<TestConnectorFactory> -TestConnectorFactory::CreateForUniqueService(std::unique_ptr<Service> service) { +TestConnectorFactory::CreateForUniqueService( + std::unique_ptr<Service> service, + bool release_service_on_quit_request) { // Note that we are not using std::make_unique below so TestConnectorFactory's // constructor can be kept private. std::string guid = base::GenerateGUID(); return std::unique_ptr<TestConnectorFactory>(new TestConnectorFactory( - std::make_unique<UniqueServiceConnector>(std::move(service), guid), + std::make_unique<UniqueServiceConnector>(std::move(service), guid, + release_service_on_quit_request), guid)); } // static std::unique_ptr<TestConnectorFactory> TestConnectorFactory::CreateForServices( - NameToServiceMap services) { + NameToServiceMap services, + bool release_service_on_quit_request) { std::string guid = base::GenerateGUID(); return std::unique_ptr<TestConnectorFactory>(new TestConnectorFactory( - std::make_unique<MultipleServiceConnector>(std::move(services), guid), + std::make_unique<MultipleServiceConnector>( + std::move(services), guid, release_service_on_quit_request), guid)); }
diff --git a/services/service_manager/public/cpp/test/test_connector_factory.h b/services/service_manager/public/cpp/test/test_connector_factory.h index 028f068f..8af22ba 100644 --- a/services/service_manager/public/cpp/test/test_connector_factory.h +++ b/services/service_manager/public/cpp/test/test_connector_factory.h
@@ -57,15 +57,21 @@ using NameToServiceMap = std::map<std::string, std::unique_ptr<Service>>; // Constructs a new TestConnectorFactory which creates Connectors whose - // requests are routed directly to |service|. + // requests are routed directly to |service|. If + // |release_service_on_quit_request| is set to true, the Connector will + // release the service instance when the service requests to be quit. static std::unique_ptr<TestConnectorFactory> CreateForUniqueService( - std::unique_ptr<Service> service); + std::unique_ptr<Service> service, + bool release_service_on_quit_request = false); // Constructs a new TestConnectorFactory which creates Connectors whose // requests are routed directly to a service in |services| based on the name - // they are associated with. + // they are associated with. If |release_service_on_quit_request| + // is set to true, the Connector will release the service instance when the + // service requests to be quit. static std::unique_ptr<TestConnectorFactory> CreateForServices( - NameToServiceMap services); + NameToServiceMap services, + bool release_service_on_quit_request = false); // Creates a new connector which routes BindInterfaces requests directly to // the Service instance associated with this factory.
diff --git a/services/ui/test_ws/test_ws.cc b/services/ui/test_ws/test_ws.cc index 8da0bdf..b93a8a2 100644 --- a/services/ui/test_ws/test_ws.cc +++ b/services/ui/test_ws/test_ws.cc
@@ -16,7 +16,7 @@ #include "services/service_manager/public/cpp/service_context.h" #include "services/service_manager/public/cpp/service_runner.h" #include "services/ui/public/interfaces/window_tree_host_factory.mojom.h" -#include "services/ui/ws2/gpu_support.h" +#include "services/ui/ws2/gpu_interface_provider.h" #include "services/ui/ws2/window_service.h" #include "services/ui/ws2/window_service_delegate.h" #include "services/ui/ws2/window_tree.h"
diff --git a/services/ui/ws2/BUILD.gn b/services/ui/ws2/BUILD.gn index cfff29b..fdaea45 100644 --- a/services/ui/ws2/BUILD.gn +++ b/services/ui/ws2/BUILD.gn
@@ -15,7 +15,7 @@ ":test_support", ] public = [ - "gpu_support.h", + "gpu_interface_provider.h", "ids.h", "window_delegate_impl.h", "window_properties.h",
diff --git a/services/ui/ws2/gpu_interface_provider.h b/services/ui/ws2/gpu_interface_provider.h new file mode 100644 index 0000000..f099d7c --- /dev/null +++ b/services/ui/ws2/gpu_interface_provider.h
@@ -0,0 +1,31 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_UI_WS2_GPU_INTERFACE_PROVIDER_H_ +#define SERVICES_UI_WS2_GPU_INTERFACE_PROVIDER_H_ + +#include "base/component_export.h" +#include "services/service_manager/public/cpp/binder_registry.h" + +namespace ui { +namespace ws2 { + +// GpuInterfaceProvider is responsible for providing the Gpu related interfaces. +// The implementation of these varies depending upon where the WindowService is +// hosted. +class COMPONENT_EXPORT(WINDOW_SERVICE) GpuInterfaceProvider { + public: + virtual ~GpuInterfaceProvider() {} + + // Registers the gpu-related interfaces, specifically + // discardable_memory::mojom::DiscardableSharedMemoryManagerRequest and + // ui::mojom::GpuRequest. + virtual void RegisterGpuInterfaces( + service_manager::BinderRegistry* registry) = 0; +}; + +} // namespace ws2 +} // namespace ui + +#endif // SERVICES_UI_WS2_GPU_INTERFACE_PROVIDER_H_
diff --git a/services/ui/ws2/gpu_support.h b/services/ui/ws2/gpu_support.h deleted file mode 100644 index 303584a..0000000 --- a/services/ui/ws2/gpu_support.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef SERVICES_UI_WS2_GPU_SUPPORT_H_ -#define SERVICES_UI_WS2_GPU_SUPPORT_H_ - -#include "base/component_export.h" -#include "base/memory/scoped_refptr.h" -#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h" -#include "services/ui/public/interfaces/gpu.mojom.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace ui { -namespace ws2 { - -// GpuSupport provides the functions needed for gpu related functionality. It is -// expected this class is bound to functions in content that do this. Once Viz -// moves out of content, this class can be removed. -class COMPONENT_EXPORT(WINDOW_SERVICE) GpuSupport { - public: - virtual ~GpuSupport() {} - - // Returns the task runner used to bind gpu related interfaces on. This is - // typically the io-thread. - virtual scoped_refptr<base::SingleThreadTaskRunner> GetGpuTaskRunner() = 0; - - // The Bind functions are called when a client requests a gpu related - // interface. - virtual void BindDiscardableSharedMemoryManagerOnGpuTaskRunner( - discardable_memory::mojom::DiscardableSharedMemoryManagerRequest - request) = 0; - virtual void BindGpuRequestOnGpuTaskRunner(ui::mojom::GpuRequest request) = 0; -}; - -} // namespace ws2 -} // namespace ui - -#endif // SERVICES_UI_WS2_GPU_SUPPORT_H_
diff --git a/services/ui/ws2/window_service.cc b/services/ui/ws2/window_service.cc index 8fff32f8..62161078 100644 --- a/services/ui/ws2/window_service.cc +++ b/services/ui/ws2/window_service.cc
@@ -6,7 +6,7 @@ #include "base/bind.h" #include "base/single_thread_task_runner.h" -#include "services/ui/ws2/gpu_support.h" +#include "services/ui/ws2/gpu_interface_provider.h" #include "services/ui/ws2/screen_provider.h" #include "services/ui/ws2/server_window.h" #include "services/ui/ws2/window_service_delegate.h" @@ -18,11 +18,12 @@ namespace ui { namespace ws2 { -WindowService::WindowService(WindowServiceDelegate* delegate, - std::unique_ptr<GpuSupport> gpu_support, - aura::client::FocusClient* focus_client) +WindowService::WindowService( + WindowServiceDelegate* delegate, + std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider, + aura::client::FocusClient* focus_client) : delegate_(delegate), - gpu_support_(std::move(gpu_support)), + gpu_interface_provider_(std::move(gpu_interface_provider)), screen_provider_(std::make_unique<ScreenProvider>()), focus_client_(focus_client), ime_registrar_(&ime_driver_) { @@ -99,18 +100,9 @@ registry_.AddInterface(base::BindRepeating( &WindowService::BindWindowTreeFactoryRequest, base::Unretained(this))); - // |gpu_support_| may be null in tests. - if (gpu_support_) { - registry_.AddInterface( - base::BindRepeating( - &GpuSupport::BindDiscardableSharedMemoryManagerOnGpuTaskRunner, - base::Unretained(gpu_support_.get())), - gpu_support_->GetGpuTaskRunner()); - registry_.AddInterface( - base::BindRepeating(&GpuSupport::BindGpuRequestOnGpuTaskRunner, - base::Unretained(gpu_support_.get())), - gpu_support_->GetGpuTaskRunner()); - } + // |gpu_interface_provider_| may be null in tests. + if (gpu_interface_provider_) + gpu_interface_provider_->RegisterGpuInterfaces(®istry_); } void WindowService::OnBindInterface(
diff --git a/services/ui/ws2/window_service.h b/services/ui/ws2/window_service.h index c6f34de..7a9928d 100644 --- a/services/ui/ws2/window_service.h +++ b/services/ui/ws2/window_service.h
@@ -43,7 +43,7 @@ namespace ws2 { -class GpuSupport; +class GpuInterfaceProvider; class ScreenProvider; class ServerWindow; class WindowServiceDelegate; @@ -57,7 +57,7 @@ : public service_manager::Service { public: WindowService(WindowServiceDelegate* delegate, - std::unique_ptr<GpuSupport> gpu_support, + std::unique_ptr<GpuInterfaceProvider> gpu_support, aura::client::FocusClient* focus_client); ~WindowService() override; @@ -108,8 +108,8 @@ WindowServiceDelegate* delegate_; - // GpuSupport may be null in tests. - std::unique_ptr<GpuSupport> gpu_support_; + // GpuInterfaceProvider may be null in tests. + std::unique_ptr<GpuInterfaceProvider> gpu_interface_provider_; std::unique_ptr<ScreenProvider> screen_provider_;
diff --git a/services/ui/ws2/window_service_test_setup.cc b/services/ui/ws2/window_service_test_setup.cc index bbf6a1d0..5ea6a4d9 100644 --- a/services/ui/ws2/window_service_test_setup.cc +++ b/services/ui/ws2/window_service_test_setup.cc
@@ -5,7 +5,7 @@ #include "services/ui/ws2/window_service_test_setup.h" #include "services/ui/ws2/embedding.h" -#include "services/ui/ws2/gpu_support.h" +#include "services/ui/ws2/gpu_interface_provider.h" #include "services/ui/ws2/window_service.h" #include "services/ui/ws2/window_tree.h" #include "services/ui/ws2/window_tree_binding.h"
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 7136f12c..775130c 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -620,6 +620,7 @@ defines = skia_core_defines sources = skia_core_sources sources += skia_effects_sources + sources += skia_effects_imagefilter_sources if (skia_support_gpu) { deps = [ "//gpu/config:workaround_list",
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 617f5166..4e8cf42 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -184,9 +184,6 @@ // Remove this and rebaseline affected layout tests. #define SK_DONT_DROP_UNNECESSARY_AA_IN_TEXTURE_OP -#define SK_DISABLE_LOWP_BILERP_CLAMP_CLAMP_STAGE - - #ifndef SK_SUPPORT_LEGACY_THREADED_DAA_BUGS #define SK_SUPPORT_LEGACY_THREADED_DAA_BUGS #endif
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index b358eb5..181fa46 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -511,6 +511,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "mojo_core_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "mojo_unittests" }, { @@ -1219,6 +1225,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "mojo_core_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "mojo_unittests" }, {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 3804bd35..8df0f6c9 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -1676,6 +1676,7 @@ { "args": [ "--enable-surface-synchronization", + "--test-launcher-filter-file=../../testing/buildbot/filters/surface_sync.content_browsertests.filter", "--gs-results-bucket=chromium-result-details", "--recover-devices" ], @@ -1723,7 +1724,7 @@ { "args": [ "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter", + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.android.content_browsertests.filter", "--gs-results-bucket=chromium-result-details", "--recover-devices" ], @@ -1767,53 +1768,6 @@ "shards": 2 }, "test": "content_browsertests" - }, - { - "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "viz_content_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "viz_content_unittests", - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_type": "bullhead", - "os": "Android" - } - ], - "hard_timeout": 3600, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ] - }, - "test": "content_unittests" } ] },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 29376c46..681b942 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -3864,6 +3864,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "mojo_core_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "mojo_unittests" }, { @@ -4135,9 +4141,6 @@ "test": "boringssl_ssl_tests" }, { - "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/browser_tests_cros_asan.filter" - ], "swarming": { "can_use_on_swarming_builders": true, "shards": 10 @@ -4147,8 +4150,7 @@ { "args": [ "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.browser_tests.filter", - "--test-launcher-filter-file=../../testing/buildbot/filters/browser_tests_cros_asan.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/viz.browser_tests.filter" ], "name": "viz_browser_tests", "swarming": { @@ -4532,9 +4534,6 @@ "test": "ui_touch_selection_unittests" }, { - "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/unit_tests_cros_asan.filter" - ], "swarming": { "can_use_on_swarming_builders": true },
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index e9c6090..7d89cf1 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -738,7 +738,7 @@ "--browser=android-chromium", "--upload-results", "--run-ref-build", - "--test-shard-map-filename=mobile_7_shard_map.json" + "--test-shard-map-filename=pixel2_7_shard_map.json" ], "isolate_name": "performance_test_suite", "merge": { @@ -788,7 +788,7 @@ "--browser=android-webview", "--upload-results", "--webview-embedder-apk=../../out/Release/apks/SystemWebViewShell.apk", - "--test-shard-map-filename=mobile_7_shard_map.json" + "--test-shard-map-filename=pixel2_webview_7_shard_map.json" ], "isolate_name": "performance_webview_test_suite", "merge": {
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index cb3b726..4ab8b7a 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -36759,7 +36759,7 @@ "--browser=release", "--upload-results", "--run-ref-build", - "--test-shard-map-filename=benchmark_desktop_bot_map.json" + "--test-shard-map-filename=linux_perf_shard_map.json" ], "isolate_name": "performance_test_suite", "merge": { @@ -36930,7 +36930,7 @@ "--browser=release", "--upload-results", "--run-ref-build", - "--test-shard-map-filename=benchmark_desktop_bot_map.json" + "--test-shard-map-filename=mac_1012_low_end_26_shard_map.json" ], "isolate_name": "performance_test_suite", "merge": { @@ -37060,7 +37060,7 @@ "--browser=release", "--upload-results", "--run-ref-build", - "--test-shard-map-filename=benchmark_desktop_bot_map.json" + "--test-shard-map-filename=mac_1013_high_end_26_shard_map.json" ], "isolate_name": "performance_test_suite", "merge": {
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index 399355e..d65b30d 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -30,7 +30,6 @@ data = [ "//testing/buildbot/filters/mash.browser_tests.filter", "//testing/buildbot/filters/mojo.fyi.network_browser_tests.filter", - "//testing/buildbot/filters/browser_tests_cros_asan.filter", "//testing/buildbot/filters/viz.browser_tests.filter", ] } @@ -42,6 +41,8 @@ "//testing/buildbot/filters/cast-linux.content_browsertests.filter", "//testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter", "//testing/buildbot/filters/site-per-process.content_browsertests.filter", + "//testing/buildbot/filters/surface_sync.content_browsertests.filter", + "//testing/buildbot/filters/viz.android.content_browsertests.filter", "//testing/buildbot/filters/viz.content_browsertests.filter", ] } @@ -54,14 +55,6 @@ ] } -source_set("unit_tests_filters") { - testonly = true - - data = [ - "//testing/buildbot/filters/unit_tests_cros_asan.filter", - ] -} - source_set("fuchsia_filters") { data = [ "//testing/buildbot/filters/fuchsia.base_unittests.filter",
diff --git a/testing/buildbot/filters/browser_tests_cros_asan.filter b/testing/buildbot/filters/browser_tests_cros_asan.filter deleted file mode 100644 index e8cd0482..0000000 --- a/testing/buildbot/filters/browser_tests_cros_asan.filter +++ /dev/null
@@ -1,8 +0,0 @@ -# TODO(crbug.com/759291): Test is flaky on CrOS with ASan. --SamlTest.ScrapedMultiple - -# TODO(crbug.com/778405): Test is flaky on CrOS with ASan. --MemoryTracingBrowserTest.TestBackgroundMemoryInfra - -# TODO(crbug.com/807465): Test is flaky on CrOS with ASan in viz_browser_tests. --ArcAccessibilityHelperBridgeBrowserTest.PreferenceChange
diff --git a/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter b/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter index 3e5a0d4..26a84ea 100644 --- a/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter +++ b/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter
@@ -4,44 +4,234 @@ -ConstrainedWebDialogBrowserTest.* # Investigation, round 2. +-All/PasswordManagerBrowserTestWithViewsFeature.* -AllForms/FormStructureBrowserTest.* +-AppApiTest.* +-AppBackgroundPageApiTest.* +-AppBannerManagerBrowserTest.* +-AppWindowAPITest.* -AppWindowApiTest.* +-AutocompleteBrowserTest.* -AutofillRendererTest.* +-AutomationApiTest.* +-AutoplayPolicyTest.* +-BluetoothChooserBrowserTest.* +-BluetoothPrivateApiTest.* +-BookmarkAppNavigationThrottleCommonFormSubmissionBrowserTest.* +-BookmarkAppNavigationThrottleCommonLinkBrowserTest.* +-BookmarkAppNavigationThrottleExperimentalBrowserTest.* +-BookmarkAppNavigationThrottleExperimentalLinkBrowserTest.* +-BookmarkFolderAppleScriptTest.* +-BrowserActionApiTest.* +-BrowserActionsBarBrowserTest.* +-BrowserCloseManagerBrowserTest/BrowserCloseManagerBrowserTest.* +-BrowserNavigatorTest.* -BrowserTabRestoreTest.* +-BrowserTest.* -BrowserUiTest.* +-BrowsingDataRemoverBrowserTestP.* +-CDM_11/ECKEncryptedMediaTest.* +-CDM_9/ECKEncryptedMediaTest.* +-CaptivePortalBlockingPageTest.* +-CaptivePortalBrowserTest.* +-CardUnmaskPromptViewBrowserTest.* -ChromeLocatorTest.* +-ChromeSSLHostStateDelegateTest.* +-ChromeSitePerProcessTest.* +-CommandServiceTest.* +-ConnectionHelpTabHelperTest.* -ConstrainedWebDialogBrowserTest.* +-ContentCapabilitiesTest.* +-ContentFaviconDriverTest.* +-ContentScriptApiTest.* +-ContentSettingBubbleDialogTest.* -ContentSettingBubbleModelMixedScriptTest.* -ContentSettingFramebustBlockBubbleModelTest.* +-ContentSettingsObserverBrowserTest.* +-ContextMenuBrowserTest.* +-ContinueWhereILeftOffTest.* +-CookieSettingsTest.* -CrExtensionsA11yTest.* -CrExtensionsA11yTestWithMultipleExensions.* -CrExtensionsErrorConsoleA11yTest.* +-CrExtensionsItemsTest.* -CrExtensionsShortcutA11yTestWithExtensions.* -CrExtensionsShortcutA11yTestWithNoExtensions.* +-DNSErrorPageTest.* +-DeclarativeApiTest.* +-DeclarativeContentApiTest.* +-DeclarativeNetRequestBrowserTest.* +-DeclarativeNetRequestHostPermissionsBrowserTest.* +-DevToolsExtensionTest.* +-DevToolsSanityTest.* +-DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.* +-DiceBrowserTest.* +-DomDistillerViewerSourceBrowserTest.* +-DownloadDangerPromptBrowserTest.* +-DownloadExtensionTest.* -DownloadInterruptReasonEnumsSynced.* +-DownloadTest.* +-EncodingAliases/BrowserEncodingTest.* +-ExecuteScriptApiTest.* +-ExecuteScriptApiTest/DestructiveScriptTest.* +-ExtensionApiTabTest.* +-ExtensionApiTest.* +-ExtensionBrowserTest.* +-ExtensionCrxInstallerTest.* +-ExtensionInstallDialogViewInteractiveBrowserTest.* +-ExtensionManagementApiTest.* +-ExtensionMessageBubbleBrowserTestMac.* +-ExtensionTabsTest.* +-ExtensionWebRequestApiTest.* +-ExtensionWebstorePrivateApiTest.* +-ExternalProtocolDialogBrowserTest.* +-FetchBehaviorTests/ContentVerifierHashTest.* +-FileSystemApiTest.* +-FindInPageControllerTest.* +-FlashEmbeds/ChromeContentRendererClientBrowserTest.* +-FlashPermissionBrowserTest.* -FormAutocompleteTest.* -FormAutofillTest.* +-FormClassifierTest.* +-FormControlClickDetectionTest.* +-FullscreenControllerTest.* +-GcmApiTest.* +-GeolocationBrowserTest.* +-GetAuthTokenFunctionTest.* +-HistoryBrowserTest.* +-HostedAppPWAOnlyTest.* +-HostedAppTest.* +-HttpsEngagementPageLoadMetricsBrowserTest.* +-IncognitoProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.* +-InfoBarUiTest.* +-InlineLoginHelperBrowserTest.* +-InlineLoginUIBrowserTest.* -InspectUITest.* +-InstallableManagerBrowserTest.* -InstantThemeTest.* +-InterstitialUITest.* +-InterventionsInternalsUITest.* +-JavaScript/ExtensionBindingsApiTest.* +-JavaScriptBindings/ExternallyConnectableMessagingTest.* +-LocalNTPDoodleTest.* -LocalNTPOneGoogleBarSmokeTest.* -LocalNTPVoiceSearchSmokeTest.* +-LoginPromptBrowserTest.* +-MSE_ClearKey/EncryptedMediaTest.* +-MSE_ExternalClearKey/EncryptedMediaTest.* +-ManifestVerifierBrowserTest.* +-MediaEngagementAutoplayBrowserTest.* +-MediaEngagementBrowserTest.* +-MediaGalleriesPlatformAppBrowserTest.* +-MediaRouterElementsBrowserTest.* +-MediaRouterIntegrationBrowserTest.* +-MediaStreamDevicesControllerTest.* +-Memlog/MemlogBrowserTest.* +-MimeHandlerViewTests/MimeHandlerViewTest.* +-NaClBrowserTestGLibc.* +-NaClBrowserTestNewlib.* +-NaClBrowserTestPnacl.* +-Native/ExtensionBindingsApiTest.* +-NativeAppWindowCocoaBrowserTestInstance/NativeAppWindowCocoaBrowserTest.* +-NativeBindings/ExternallyConnectableMessagingTest.* +-NavigationEntryRemoverTest.* -NetInternalsTest.* +-NetworkingPrivateApiTest.* +-NetworkingPrivateApiTestFail.* -NewTabPageNavigationThrottleTest.* -NewTabUIBrowserTest.* +-NoSessionRestoreTest.* +-NoStatePrefetchBrowserTest.* +-OnSignInChangedEventTest.* +-OutOfProcessPPAPITest.* +-PDFExtensionTest.* +-PPAPIFileChooserTest.* +-PPAPINaClNewlibTest.* +-PPAPINaClPNaClTest.* +-PageInfoBubbleViewBrowserTest.* +-PageLoadMetricsBrowserTest.* -PagePasswordsAnalyserTest.* -PasswordAutofillAgentTest.* +-PasswordDialogViewTest.* -PasswordGenerationAgentTest.* +-PasswordsPrivateApiTest.* +-PaymentManifestParserTest.* +-PaymentRequestCanMakePaymentMetricsTest.* +-PaymentRequestCompletionStatusMetricsTest.* +-PaymentRequestCreditCardEditorTest.* +-PaymentRequestModifiersTest.* +-PaymentRequestNoShippingTest.* +-PaymentRequestPaymentAppTest.* +-PaymentRequestShippingAddressEditorTest.* +-PermissionRequestManagerBrowserTest.* -PhishingDOMFeatureExtractorTest.* +-PlatformAppBrowserTest.* +-PlatformAppWithFileBrowserTest.* +-PluginPowerSaverBrowserTest.* +-PolicyTest.* +-PolicyToolUITest.* +-PredictorBrowserTest.* +-PrefsFunctionalTest.* -PrefsTabHelperBrowserTest.* +-PrerenderBrowserTest.* +-PrintBrowserTest.* +-PrintPreviewDialogControllerBrowserTest.* +-PrintPreviewSettingsSectionsTest.* -PrintPreviewUIBrowserTest.* +-ProcessManagerBrowserTest.* +-ProfileChooserViewExtensionsTest.* +-ProfileMainNetworkContext/NetworkContextConfigurationBrowserTest.* -ProfileSigninConfirmationHelperBrowserTest.* +-PushMessagingBrowserTest.* +-RedirectTest.* +-ReferrerPolicyTest.* +-SBNavigationObserverBrowserTest.* +-SRC_ExternalClearKey/EncryptedMediaTest.* +-SSLUIMITMSoftwareEnabledTest.* +-SSLUITest.* +-SSLUITestWithExtendedReporting.* +-SSLUIWorkerFetchTest.* +-SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.* +-SafeBrowsingNetworkContext/NetworkContextConfigurationBrowserTest.* +-SafeBrowsingServiceJsRequestNoInterstitialTest.* +-SafeBrowsingServiceTest.* +-SaveCardBubbleViewsFullFormBrowserTest.* +-SavePageBrowserTest.* +-SaveType/SavePageOriginalVsSavedComparisonTest.* -SearchEngineTabHelperBrowserTest.* +-SecurityStateTabHelperTest.* +-ServiceWorkerTestWithJSBindings/ServiceWorkerTest.* +-ServiceWorkerTestWithNativeBindings/ServiceWorkerTest.* +-SessionRestorePageLoadMetricsBrowserTest.* +-SessionRestoreTest.* -SettingsA11yManagePasswords.* -SettingsA11ySignOut.* -SettingsAccessibilityTest.* -StartupBrowserCreatorFirstRunTest.* +-SubresourceFilterBrowserTest.* +-SubresourceFilterPopupBrowserTest.* +-SuperfishSSLUITest.* +-SyncFileSystemApiTest.* +-SystemNetworkContext/NetworkContextConfigurationBrowserTest.* +-TabManagerTestWithTwoTabs.* +-TabRestoreTest.* +-TaskManagerBrowserTest.* +-TestStatsDictionaryTest.* -ThreatDOMDetailsTest.* -TranslateHelperBrowserTest.* -TranslateScriptBrowserTest.* +-UkmBrowserTest.* +-UnloadTest.* -UpdateRecommendedDialogTest.* -UsbChooserBrowserTest.* +-ViewSourceTest.* +-WebNavigationApiTest.* +-WebRtcBrowserTest.* +-WebUIBrowserAsyncGenTest.* +-WebUIBrowserAsyncTest.* +-WebUIResourceBrowserTest.* +-WebViewTest.* +-WebrtcLoggingPrivateApiTest.* +-WebstoreInlineInstallerTest.* +-WindowAppleScriptTest.* +-WindowOpenApiTest.*
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter index 8bb8b3e..c93ced4 100644 --- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter +++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -6,6 +6,28 @@ # See https://crbug.com/769401 # Uncategorized timeouts or test failures. +-ExtensionDisabledGlobalErrorTest.HigherPermissionsFromSync +-ExtensionDisabledGlobalErrorTest.RemoteInstall +-ExtensionStorageMonitorTest.HostedAppTemporaryFilesystem +-ExtensionUnloadBrowserTest.UnloadWithContentScripts +-ProcessManagerBrowserTest.NestedURLNavigationsToExtensionAllowed +-ProxySettingsApiTest.ProxyEventsInvalidProxy +-RegisterProtocolHandlerBrowserTest.CustomHandler +-SecurityStateTabHelperTest.DefaultSecurityLevelOnFilesystemUrl/0 +-SecurityStateTabHelperTest.DefaultSecurityLevelOnFilesystemUrl/1 +-SecurityStateTabHelperTest.DefaultSecurityLevelOnSecureFilesystemUrl/0 +-SecurityStateTabHelperTest.DefaultSecurityLevelOnSecureFilesystemUrl/1 +-SSLUITest.TestBadHTTPSDownload/0 +-SSLUITest.TestBadHTTPSDownload/1 +-SubresourceFilterBrowserTest.FailedProvisionalLoadInMainframe +-WebstoreInstallerBrowserTest.SimultaneousInstall +-WebViewTest.WebViewInBackgroundPage + +# A large number of Cloud Print files use URLFetchers. +# A few of the bugs: +# https://crbug.com/844950 +# https://crbug.com/844951 +# https://crbug.com/844952 -CloudPolicyManagerTest.Register -CloudPolicyManagerTest.RegisterFailsWithRetries -CloudPolicyManagerTest.RegisterWithRetry @@ -15,7 +37,29 @@ -ComponentCloudPolicyTest.InstallNewExtension -ComponentCloudPolicyTest.SignOutAndBackIn -ComponentCloudPolicyTest.UpdateExtensionPolicy +-KeyRotationComponentCloudPolicyTest.Basic +-MachineLevelUserCloudPolicyEnrollmentTest.Test/2 +-MachineLevelUserCloudPolicyEnrollmentTest.Test/3 +-MachineLevelUserCloudPolicyServiceIntegrationTestInstance/MachineLevelUserCloudPolicyServiceIntegrationTest.ChromeDesktopReport/0 +-MachineLevelUserCloudPolicyServiceIntegrationTestInstance/MachineLevelUserCloudPolicyServiceIntegrationTest.Registration/0 + +# These tests uses net::URLRequestFilter (through TestRequestInterceptor) to +# mock out network responses. Unclear if the code being tested uses +# SimpleURLLoader or URLFetcher. -ComponentUpdaterPolicyTest.EnabledComponentUpdates +-PolicyTest.ExtensionInstallBlacklistSharedModules +-PolicyTest.ExtensionInstallForcelist +-PolicyTest.ExtensionInstallForcelist_DefaultedUpdateUrl +-PolicyTest.ExtensionMinimumVersionForceInstalled +-PolicyTest.ExtensionMinimumVersionRequired +-PolicyTest.ExtensionMinimumVersionRequiredAlt +-PolicyTest.ExtensionRecommendedInstallationMode +-PolicyUpdateServiceTest.Backoff +-PolicyUpdateServiceTest.FailedUpdateRetries +-PolicyUpdateServiceTest.PolicyCorruptedOnStartup + +# components/policy/core/common/cloud/device_management_service.cc still uses URLFetcher. +# https://crbug.com/844950 -DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.ApiAuthCodeFetch/0 -DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.ApiAuthCodeFetch/1 -DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.AppInstallReport/0 @@ -28,40 +72,55 @@ -DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Registration/1 -DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Unregistration/0 -DeviceManagementServiceIntegrationTestInstance/DeviceManagementServiceIntegrationTest.Unregistration/1 --DisabledSignInIsolationBrowserTest.SyntheticTrial + +# Domain Reliability has yet to be hookup to the NetworkService. +# https://crbug.com/853251 -DomainReliabilityBrowserTest.Upload --EnabledSignInIsolationBrowserTest.SyntheticTrial --ExtensionDisabledGlobalErrorTest.HigherPermissionsFromSync --ExtensionDisabledGlobalErrorTest.RemoteInstall + +# extensions/browser/updater/extension_downloader.cc still uses URLFetcher. +# https://crbug.com/844928 -ExtensionManagementTest.AutoUpdate -ExtensionManagementTest.AutoUpdateDisabledExtensions -ExtensionManagementTest.ExternalPolicyRefresh -ExtensionManagementTest.ExternalUrlUpdate -ExtensionManagementTest.PolicyOverridesUserInstall --ExtensionStorageMonitorTest.HostedAppTemporaryFilesystem --ExtensionUnloadBrowserTest.UnloadWithContentScripts + +# components/image_fetcher/core/image_fetcher_impl.cc still uses URLFetcher. +# https://crbug.com/843205 -ImageFetcherImplBrowserTest.MultipleFetch -ImageFetcherImplBrowserTest.NormalFetch --KeyRotationComponentCloudPolicyTest.Basic --MachineLevelUserCloudPolicyEnrollmentTest.Test/2 --MachineLevelUserCloudPolicyEnrollmentTest.Test/3 --MachineLevelUserCloudPolicyServiceIntegrationTestInstance/MachineLevelUserCloudPolicyServiceIntegrationTest.ChromeDesktopReport/0 --MachineLevelUserCloudPolicyServiceIntegrationTestInstance/MachineLevelUserCloudPolicyServiceIntegrationTest.Registration/0 + +# components/payments/core/payment_manifest_downloader.cc still uses +# URLFetcher. +# https://crbug.com/853778 -ManifestVerifierBrowserTest.BobPayHandlerCanUseMethodThatSupportsAllOrigins -ManifestVerifierBrowserTest.Handler404CanUseMethodThatSupportsAllOrigins -ManifestVerifierBrowserTest.OneSupportedOrigin -ManifestVerifierBrowserTest.ThreeTypesOfMethods --MediaGalleriesPlatformAppBrowserTest.GetMetadata --NetworkTimePolicyTest.NetworkTimeQueriesDisabled/0 --NetworkTimePolicyTest.NetworkTimeQueriesDisabled/1 --NewlibPackagedAppTest.SuccessfulLoad --OutOfProcessPPAPITest.HostResolver --OutOfProcessPPAPITest.HostResolverPrivate_Resolve --OutOfProcessPPAPITest.HostResolverPrivate_ResolveIPv4 +-ServiceWorkerPaymentAppFactoryBrowserTest.AllOringsSupported +-ServiceWorkerPaymentAppFactoryBrowserTest.SupportedOrigin +-ServiceWorkerPaymentAppFactoryBrowserTest.TwoAppsDifferentMethods +-ServiceWorkerPaymentAppFactoryBrowserTest.TwoAppsSameMethod + +# These try to resolver host names using ResourceContext, using the old +# in-process HostResolver API. Neither works when the network service is +# enabled, so they'll need to be moved over to a new API. +# https://crubug.com/821021 -OutOfProcessPPAPITest.TCPServerSocketPrivate -OutOfProcessPPAPITest.TCPSocket -OutOfProcessPPAPITest.TCPSocketPrivate -OutOfProcessPPAPITest.TCPSocketPrivateTrusted +-PPAPINaClNewlibTest.TCPServerSocketPrivate +-PPAPINaClNewlibTest.TCPSocket +-PPAPINaClNewlibTest.TCPSocketPrivate +-PPAPINaClPNaClNonSfiTest.TCPServerSocketPrivate +-PPAPINaClPNaClNonSfiTest.TCPSocket +-PPAPINaClPNaClNonSfiTest.TCPSocketPrivate + +# Uncategorized PPAPI timeouts or test failures. +-OutOfProcessPPAPITest.HostResolver +-OutOfProcessPPAPITest.HostResolverPrivate_Resolve +-OutOfProcessPPAPITest.HostResolverPrivate_ResolveIPv4 -OutOfProcessPPAPITest.UDPSocket_Broadcast -OutOfProcessPPAPITest.UDPSocket_Multicast -OutOfProcessPPAPITest.UDPSocket_ParallelSend @@ -70,16 +129,6 @@ -OutOfProcessPPAPITest.UDPSocket_SetOption_1_0 -OutOfProcessPPAPITest.UDPSocket_SetOption_1_1 -OutOfProcessPPAPITest.UDPSocketPrivate_Connect --PolicyTest.ExtensionInstallBlacklistSharedModules --PolicyTest.ExtensionInstallForcelist --PolicyTest.ExtensionInstallForcelist_DefaultedUpdateUrl --PolicyTest.ExtensionMinimumVersionForceInstalled --PolicyTest.ExtensionMinimumVersionRequired --PolicyTest.ExtensionMinimumVersionRequiredAlt --PolicyTest.ExtensionRecommendedInstallationMode --PolicyUpdateServiceTest.Backoff --PolicyUpdateServiceTest.FailedUpdateRetries --PolicyUpdateServiceTest.PolicyCorruptedOnStartup -PPAPINaClGLibcTest.UDPSocket_Broadcast -PPAPINaClGLibcTest.UDPSocket_Multicast -PPAPINaClGLibcTest.UDPSocket_ParallelSend @@ -91,9 +140,6 @@ -PPAPINaClNewlibTest.HostResolverPrivate_Resolve -PPAPINaClNewlibTest.HostResolverPrivate_ResolveIPv4 -PPAPINaClNewlibTest.NetAddressPrivate --PPAPINaClNewlibTest.TCPServerSocketPrivate --PPAPINaClNewlibTest.TCPSocket --PPAPINaClNewlibTest.TCPSocketPrivate -PPAPINaClNewlibTest.UDPSocket_Broadcast -PPAPINaClNewlibTest.UDPSocket_Multicast -PPAPINaClNewlibTest.UDPSocket_ParallelSend @@ -106,9 +152,6 @@ -PPAPINaClPNaClNonSfiTest.HostResolverPrivate_Resolve -PPAPINaClPNaClNonSfiTest.HostResolverPrivate_ResolveIPv4 -PPAPINaClPNaClNonSfiTest.NetAddressPrivate --PPAPINaClPNaClNonSfiTest.TCPServerSocketPrivate --PPAPINaClPNaClNonSfiTest.TCPSocket --PPAPINaClPNaClNonSfiTest.TCPSocketPrivate -PPAPINaClPNaClNonSfiTest.UDPSocket_Broadcast -PPAPINaClPNaClNonSfiTest.UDPSocket_Multicast -PPAPINaClPNaClNonSfiTest.UDPSocket_ParallelSend @@ -117,44 +160,26 @@ -PPAPINaClPNaClNonSfiTest.UDPSocket_SetOption_1_0 -PPAPINaClPNaClNonSfiTest.UDPSocket_SetOption_1_1 -PPAPINaClPNaClNonSfiTest.UDPSocketPrivate_Connect --PreviewsOptimizationGuideBrowserTest.NoScriptPreviewsEnabledByWhitelist --ProcessManagerBrowserTest.NestedURLNavigationsToExtensionAllowed + +# These tests use URLFetchers directly. +# https://crbug.com/853798 -ProfileBrowserTest.SeparateMediaCache -ProfileBrowserTest.URLFetcherUsingMainContextDuringIncognitoTeardown -ProfileBrowserTest.URLFetcherUsingMainContextDuringShutdown -ProfileBrowserTest.URLFetcherUsingMediaContextDuringShutdown -ProfileWithoutMediaCacheBrowserTest.NoSeparateMediaCache --ProxySettingsApiTest.ProxyEventsInvalidProxy --RegisterProtocolHandlerBrowserTest.CustomHandler --SecurityStateTabHelperTest.DefaultSecurityLevelOnFilesystemUrl/0 --SecurityStateTabHelperTest.DefaultSecurityLevelOnFilesystemUrl/1 --SecurityStateTabHelperTest.DefaultSecurityLevelOnSecureFilesystemUrl/0 --SecurityStateTabHelperTest.DefaultSecurityLevelOnSecureFilesystemUrl/1 --ServiceWorkerPaymentAppFactoryBrowserTest.AllOringsSupported --ServiceWorkerPaymentAppFactoryBrowserTest.SupportedOrigin --ServiceWorkerPaymentAppFactoryBrowserTest.TwoAppsDifferentMethods --ServiceWorkerPaymentAppFactoryBrowserTest.TwoAppsSameMethod --SSLNetworkTimeBrowserTest.CloseTabBeforeNetworkFetchCompletes/0 --SSLNetworkTimeBrowserTest.CloseTabBeforeNetworkFetchCompletes/1 --SSLNetworkTimeBrowserTest.NavigateAwayBeforeTimeoutExpires/0 --SSLNetworkTimeBrowserTest.NavigateAwayBeforeTimeoutExpires/1 --SSLNetworkTimeBrowserTest.OnDemandFetchClockWrong/0 --SSLNetworkTimeBrowserTest.OnDemandFetchClockWrong/1 --SSLNetworkTimeBrowserTest.ReloadBeforeTimeoutExpires/0 --SSLNetworkTimeBrowserTest.ReloadBeforeTimeoutExpires/1 --SSLNetworkTimeBrowserTest.StopBeforeTimeoutExpires/0 --SSLNetworkTimeBrowserTest.StopBeforeTimeoutExpires/1 --SSLNetworkTimeBrowserTest.TimeoutExpiresBeforeFetchCompletes/0 --SSLNetworkTimeBrowserTest.TimeoutExpiresBeforeFetchCompletes/1 --SSLUITest.TestBadHTTPSDownload/0 --SSLUITest.TestBadHTTPSDownload/1 --SubresourceFilterBrowserTest.FailedProvisionalLoadInMainframe + +# components/update_client/ still uses URLFetcher. +# https://crbug.com/844973 -UpdateServiceTest.NoUpdate -UpdateServiceTest.PolicyCorrupted -UpdateServiceTest.SuccessfulUpdate -UpdateServiceTest.TwoUpdateCheckErrors -UpdateServiceTest.UpdateCheckError --WebstoreInstallerBrowserTest.SimultaneousInstall + +# extensions\browser\guest_view\web_view\web_ui\web_ui_url_fetcher.cc uses a +# URLFetcher to fetch chrome:// URLs. +# https://crbug.com/844927 -WebUIWebViewBrowserTest.AddAndRemoveContentScripts -WebUIWebViewBrowserTest.AddContentScript -WebUIWebViewBrowserTest.AddContentScriptsWithNewWindowAPI @@ -162,7 +187,6 @@ -WebUIWebViewBrowserTest.AddMultiContentScripts -WebUIWebViewBrowserTest.ContentScriptExistsAsLongAsWebViewTagExists -WebUIWebViewBrowserTest.ExecuteScriptCodeFromFile --WebViewTest.WebViewInBackgroundPage # about:net-internals should be largely removed before shipping the network # service. @@ -223,10 +247,6 @@ -ProcessManagerBrowserTest.ServerRedirectToNonWebAccessibleResource -ProcessManagerBrowserTest.CrossExtensionEmbeddingOfWebAccessibleResources -# Need support for blocking cookies via content settings: -# https://crbug.com/789632. --CookieSettingsTest.BlockCookies/3 - # https://crbug.com/853256 -ClientHintsBrowserTest.ClientHintsLifetimeNotAttachedCookiesBlocked -ClientHintsBrowserTest.ClientHintsNoLifetimeCookiesNotAllowed @@ -388,6 +408,11 @@ # https://crbug.com/846339: CORB: Don't block requests from plugins. -OutOfProcessPPAPITest.URLLoaderTrusted +# https://crbug.com/845559 +# Reporting needs to check BACKGROUND_SYNC permission before uploading reports +# about an origin. +-ReportingBrowserTest.TestReportingHeadersProcessed + # NOTE: if adding an exclusion for an existing failure (e.g. additional test for # feature X that is already not working), please add it beside the existing # failures. Otherwise please reach out to network-service-dev@.
diff --git a/testing/buildbot/filters/surface_sync.content_browsertests.filter b/testing/buildbot/filters/surface_sync.content_browsertests.filter new file mode 100644 index 0000000..09bd07d --- /dev/null +++ b/testing/buildbot/filters/surface_sync.content_browsertests.filter
@@ -0,0 +1,9 @@ +# Android failures +# TODO(jonross): Triage these +-CompositorEventAckBrowserTest.* +-NavigationHandleImplBrowserTest.BlockCredentialedSubresources +-*CompositorImplLowEndBrowserTest.* +-SitePerProcess* +-ScrollLatencyBrowserTest.SmoothWheelScroll +-TouchInputBrowserTest.TouchHandlerConsume +-TouchSelectionControllerClientAndroidSiteIsolationTest.BasicSelectionIsolatedIframe
diff --git a/testing/buildbot/filters/unit_tests_cros_asan.filter b/testing/buildbot/filters/unit_tests_cros_asan.filter deleted file mode 100644 index 494328b5f..0000000 --- a/testing/buildbot/filters/unit_tests_cros_asan.filter +++ /dev/null
@@ -1,5 +0,0 @@ -# TODO(crbug.com/756844): Fix memory leaks. --SafeBrowsingBlockingQuietPageTests.* - -# TODO(crbug.com/760309): Fix use after free. --FileManagerFileWatcherTest.WatchLocalFile
diff --git a/testing/buildbot/filters/viz.android.content_browsertests.filter b/testing/buildbot/filters/viz.android.content_browsertests.filter new file mode 100644 index 0000000..07e5d89e --- /dev/null +++ b/testing/buildbot/filters/viz.android.content_browsertests.filter
@@ -0,0 +1,65 @@ +# Android Failures +# TODO(jonross): Triage these +-CompositorEventAckBrowserTest.* +-ContentBrowserTestSanityTest.SingleProcess +-DomSerializerTests.SerializeHTMLDOMWithAddingMOTW +-DomSerializerTests.SerializeHTMLDOMWithBaseTag +-DomSerializerTests.SerializeHTMLDOMWithEmptyHead +-DomSerializerTests.SerializeHTMLDOMWithEntitiesInAttributeValue +-DomSerializerTests.SerializeHTMLDOMWithEntitiesInText +-DomSerializerTests.SerializeHTMLDOMWithNonStandardEntities +-DomSerializerTests.SerializeHTMLDOMWithoutDocType +-DomSerializerTests.SerializeXMLDocWithBuiltInEntities +-DomSerializerTests.SubResourceForElementsInNonHTMLNamespace +-IndexedDBBrowserTestSingleProcess.RenderThreadShutdownTest +-P/CompositorImplLowEndBrowserTest.CompositorImplDropsResourcesOnBackground/0 +-RenderThreadImplDiscardableMemoryBrowserTest.DiscardableMemoryAddressSpace +-RenderThreadImplDiscardableMemoryBrowserTest.LockDiscardableMemory +-RenderThreadImplDiscardableMemoryBrowserTest.ReleaseFreeDiscardableMemory +-RenderThreadImplDiscardableMemoryBrowserTest.ReleaseFreeMemory +-RenderViewBrowserTest.ConfirmCacheInformationPlumbed +-ResourceFetcherTests.ResourceFetcher404 +-ResourceFetcherTests.ResourceFetcherDeletedInCallback +-ResourceFetcherTests.ResourceFetcherDidFail +-ResourceFetcherTests.ResourceFetcherDownload +-ResourceFetcherTests.ResourceFetcherPost +-ResourceFetcherTests.ResourceFetcherRedirect +-ResourceFetcherTests.ResourceFetcherSetHeader +-ResourceFetcherTests.ResourceFetcherTimeout +-SavableResourcesTest.GetSavableResourceLinksWithPageHasInvalidLinks +-SavableResourcesTest.GetSavableResourceLinksWithPageHasValidLinks +-SavableResourcesTest.GetSavableResourceLinksWithPageHasValidStyleLink +-ScrollLatencyBrowserTest.SmoothWheelScroll +-SingleProcessMemoryTracingTest.BrowserInitiatedSingleDump +-SingleProcessMemoryTracingTest.ManyInterleavedDumps +-SingleProcessMemoryTracingTest.RendererInitiatedSingleDump +-SitePerProcessHitTestBrowserTest.CrossProcessTooltipTestAndroid/1 +-SitePerProcessHitTestBrowserTest.CrossProcessTooltipTestAndroid/2 +-TouchInputBrowserTest.TouchHandlerConsume +-TouchInputBrowserTest.TouchHandlerNoConsume +-TouchSelectionControllerClientAndroidSiteIsolationTest.BasicSelectionIsolatedIframe + +## Base viz.content_browsertests.filter since we cannot chain filter files +# SynchronizeVisualPropertiesMessageFilter::WaitForRect() times out. +# https://crbug.com/848825 +-SitePerProcessBrowserTest.ViewBoundsInNestedFrameTest + +#### Hit Testing +# Test failure: https://crbug.com/848325 +-SitePerProcessHitTestBrowserTest.RootConsumesScrollDuringOverscrollGesture* + +# InputEventAckWaiter never receives the event: https://crbug.com/848348 +-SitePerProcessHitTestBrowserTest.CrossProcessMouseEnterAndLeaveTest* +-SitePerProcessHitTestBrowserTest.CrossProcessMouseCapture* +-SitePerProcessHitTestBrowserTest.TouchpadPinchOverOOPIF* + +# /2 Variant does not handle overlapping surfaces: https://crbug.com/846798 +-SitePerProcessHitTestBrowserTest.HitTestStaleDataDeletedView* + +### Mac +# BrowserSideFlingBrowserTest timing out https://crbug.com/842325 +-BrowserSideFlingBrowserTest.AutoscrollFling +-BrowserSideFlingBrowserTest.TouchpadFling +-BrowserSideFlingBrowserTest.TouchscreenFling +-SitePerProcessBrowserTest.TouchpadGestureFlingStart +-SitePerProcessBrowserTest.TouchscreenGestureFlingStart
diff --git a/testing/buildbot/filters/viz.content_browsertests.filter b/testing/buildbot/filters/viz.content_browsertests.filter index 4172aab..1bc69ef 100644 --- a/testing/buildbot/filters/viz.content_browsertests.filter +++ b/testing/buildbot/filters/viz.content_browsertests.filter
@@ -11,9 +11,6 @@ -SitePerProcessHitTestBrowserTest.CrossProcessMouseCapture* -SitePerProcessHitTestBrowserTest.TouchpadPinchOverOOPIF* -# /2 Variant does not handle overlapping surfaces: https://crbug.com/846798 --SitePerProcessHitTestBrowserTest.HitTestStaleDataDeletedView* - ### Mac # BrowserSideFlingBrowserTest timing out https://crbug.com/842325 -BrowserSideFlingBrowserTest.AutoscrollFling
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 7a6b3da..4caefcae 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -303,11 +303,6 @@ 'shards': 30, }, }, - 'Linux Chromium OS ASan LSan Tests (1)': { - 'args': [ - '--test-launcher-filter-file=../../testing/buildbot/filters/browser_tests_cros_asan.filter', - ], - }, 'Mac ASan 64 Tests (1)': { 'swarming': { 'shards': 20, @@ -1591,15 +1586,6 @@ 'Out of Process Profiling Mac', ], }, - 'mojo_core_unittests': { - 'remove_from': [ - # chromium.clang - 'CFI Linux (icall)', # https://crbug.com/850464 - 'CFI Linux ToT', # https://crbug.com/850464 - # chromium.memory - 'Linux CFI', # https://crbug.com/850464 - ], - }, 'mojo_test_apk': { 'modifications': { # chromium.clang @@ -2342,11 +2328,6 @@ 'shards': 4, }, }, - 'Linux Chromium OS ASan LSan Tests (1)': { - 'args': [ - '--test-launcher-filter-file=../../testing/buildbot/filters/unit_tests_cros_asan.filter', - ], - }, 'Linux TSan Tests': { 'swarming': { 'shards': 2, @@ -2462,11 +2443,6 @@ 'shards': 20, }, }, - 'Linux Chromium OS ASan LSan Tests (1)': { - 'args': [ - '--test-launcher-filter-file=../../testing/buildbot/filters/browser_tests_cros_asan.filter', - ], - }, }, }, 'viz_screenshot_sync_tests': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 12a276b..51f18fe 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -2266,6 +2266,7 @@ 'surface_sync_content_browsertests': { 'args': [ '--enable-surface-synchronization', + '--test-launcher-filter-file=../../testing/buildbot/filters/surface_sync.content_browsertests.filter', ], 'swarming': { 'shards': 2, @@ -2275,20 +2276,13 @@ 'viz_content_browsertests': { 'args': [ '--enable-features=VizDisplayCompositor', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter', + '--test-launcher-filter-file=../../testing/buildbot/filters/viz.android.content_browsertests.filter', ], 'swarming': { 'shards': 2, }, 'test': 'content_browsertests', }, - 'viz_content_unittests': { - 'args': [ - '--enable-features=VizDisplayCompositor', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_unittests.filter', - ], - 'test': 'content_unittests', - }, }, 'vr_platform_specific_chromium_gtests': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index aec6ae7..75a476a 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -359,12 +359,13 @@ ], "experiments": [ { - "name": "AudioProcess", + "name": "AudioProcess_LaunchOnStartup_v2", "params": { - "teardown_timeout_s": "300" + "teardown_timeout_s": "0" }, "enable_features": [ "AudioServiceAudioStreams", + "AudioServiceLaunchOnStartup", "AudioServiceOutOfProcess" ] } @@ -1878,6 +1879,24 @@ ] } ], + "InspectDownloadedRarFiles": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "win" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "InspectDownloadedRarFiles" + ] + } + ] + } + ], "InstanceID": [ { "platforms": [ @@ -2475,7 +2494,7 @@ ], "experiments": [ { - "name": "Enabled3", + "name": "Enabled_Holdback", "enable_features": [ "KeepPrefetchedContentSuggestions", "OfflinePagesPrefetching" @@ -2976,40 +2995,6 @@ ] } ], - "PrintPdfAsImage": [ - { - "platforms": [ - "chromeos", - "linux" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "PrintPdfAsImage" - ] - } - ] - } - ], - "PrintScaling": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "win" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "PrintScaling" - ] - } - ] - } - ], "PrioritizedSimpleCacheTasks": [ { "platforms": [ @@ -4677,6 +4662,21 @@ ] } ], + "WebRTC-SimulcastScreenshare": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "win" + ], + "experiments": [ + { + "name": "Enabled" + } + ] + } + ], "WebRtcUseEchoCanceller3": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index f6e3fa8d..e01ad0e 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1999,6 +1999,7 @@ crbug.com/569139 fast/js/string-replace-2.html [ Failure ] crbug.com/569139 fast/js/regexp-caching.html [ Failure ] crbug.com/597221 fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ] +crbug.com/597221 virtual/user-activation-v2/fast/dom/Window/window-postmessage-clone-deep-array.html [ Failure ] crbug.com/498539 http/tests/devtools/tracing/timeline-misc/timeline-bound-function.js [ Pass Failure ] crbug.com/498539 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-bound-function.js [ Pass Failure ] @@ -2051,6 +2052,7 @@ crbug.com/542660 fast/css/absolute-inline-alignment-2.html [ Failure ] crbug.com/766135 fast/dom/Window/redirect-with-timer.html [ Timeout Pass ] +crbug.com/766135 virtual/user-activation-v2/fast/dom/Window/redirect-with-timer.html [ Timeout Pass ] # Ref tests that needs investigation. crbug.com/404597 [ Mac ] fast/css3-text/css3-text-justify/text-justify-crash.html [ Failure ] @@ -4035,6 +4037,7 @@ crbug.com/731509 [ Win ] css3/viewport-percentage-lengths/viewport-percentage-lengths-resize.html [ Failure Pass Timeout ] crbug.com/731535 [ Mac Win7 ] fast/dom/Window/window-resize-contents.html [ Failure Pass ] +crbug.com/731535 [ Mac Win7 ] virtual/user-activation-v2/fast/dom/Window/window-resize-contents.html [ Failure Pass ] crbug.com/732103 [ Mac ] http/tests/shapedetection/shapedetection-cross-origin.html [ Timeout Pass ] @@ -4522,6 +4525,7 @@ crbug.com/816475 [ Win7 Linux ] external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Failure Pass ] crbug.com/816914 [ Mac ] fast/canvas/canvas-drawImage-live-video.html [ Failure Pass ] crbug.com/816766 [ Mac ] fast/dom/Window/window-focus-self.html [ Failure Pass ] +crbug.com/816766 [ Mac ] virtual/user-activation-v2/fast/dom/Window/window-focus-self.html [ Failure Pass ] crbug.com/817167 http/tests/devtools/oopif/oopif-cookies-refresh.js [ Failure Timeout Pass ] # Sheriff 2018-03-02
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites index 6685943..e564cf22 100644 --- a/third_party/WebKit/LayoutTests/VirtualTestSuites +++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -677,6 +677,11 @@ }, { "prefix": "user-activation-v2", + "base": "fast/dom/Window", + "args": ["--enable-features=UserActivationV2"] + }, + { + "prefix": "user-activation-v2", "base": "fast/events", "args": ["--enable-features=UserActivationV2"] },
diff --git a/third_party/WebKit/LayoutTests/external/wpt/BackgroundSync/interfaces.any.js b/third_party/WebKit/LayoutTests/external/wpt/BackgroundSync/interfaces.https.any.js similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/BackgroundSync/interfaces.any.js rename to third_party/WebKit/LayoutTests/external/wpt/BackgroundSync/interfaces.https.any.js
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https.html b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https.html index 03a7fb6..f4178489 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-worker.https.html
@@ -11,5 +11,5 @@ <script> 'use strict'; -service_worker_test('interfaces.worker.js', 'Service Worker-scoped tests.'); +service_worker_test('interfaces.https.worker.js', 'Service Worker-scoped tests.'); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https-expected.txt similarity index 99% rename from third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt rename to third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https-expected.txt index f6ef5a2..9e61c390 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https-expected.txt
@@ -1,5 +1,4 @@ This is a testharness.js-based test. -Found 72 tests; 56 PASS, 16 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Exposed interfaces in a Document. PASS Partial interface ServiceWorkerGlobalScope: original interface defined PASS Partial interface ServiceWorkerRegistration: original interface defined
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.html similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.html rename to third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.worker-expected.txt similarity index 99% rename from third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt rename to third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.worker-expected.txt index fb83daa..7ab48ed9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.worker-expected.txt
@@ -1,5 +1,4 @@ This is a testharness.js-based test. -Found 79 tests; 58 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Exposed interfaces in a Service Worker. PASS Partial interface ServiceWorkerGlobalScope: original interface defined PASS Partial interface ServiceWorkerRegistration: original interface defined
diff --git a/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker.js b/third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.worker.js similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.worker.js rename to third_party/WebKit/LayoutTests/external/wpt/background-fetch/interfaces.https.worker.js
diff --git a/third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl-expected.txt deleted file mode 100644 index c75bc11..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Untitled Only secure origins are allowed (see: https://goo.gl/Y0ZkNV). -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl.html b/third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl.https.html similarity index 100% rename from third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl.html rename to third_party/WebKit/LayoutTests/external/wpt/server-timing/service_worker_idl.https.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/detached-context.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/detached-context.https-expected.txt new file mode 100644 index 0000000..904eaa7c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/detached-context.https-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +FAIL accessing a ServiceWorkerRegistration from a removed iframe assert_equals: expected (string) "activated" but got (undefined) undefined +PASS accessing a ServiceWorker object from a removed iframe +PASS accessing navigator.serviceWorker on a detached iframe +PASS accessing navigator on a removed frame +PASS accessing navigator.serviceWorker on a removed about:blank frame +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/http-to-https-redirect-and-register.https.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/http-to-https-redirect-and-register.https.html index d1c6678..5626237 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/http-to-https-redirect-and-register.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/http-to-https-redirect-and-register.https.html
@@ -42,7 +42,7 @@ return redirect_and_register(target_url) .then(result => { - assert_equals(result, 'FAIL: SecurityError'); + assert_equals(result, 'FAIL: navigator.serviceWorker is undefined'); }); }, 'register on a non-secure page after redirect from an non-secure url'); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/local-url-inherit-controller.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/local-url-inherit-controller.https-expected.txt index 24ee27b8..9a2bd38 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/local-url-inherit-controller.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/local-url-inherit-controller.https-expected.txt
@@ -3,7 +3,7 @@ FAIL Same-origin blob URL iframe should intercept fetch(). assert_equals: blob URL iframe should intercept fetch expected "intercepted" but got "Hello world\n" FAIL Same-origin blob URL worker should inherit service worker controller. promise_test: Unhandled rejection with value: "Uncaught TypeError: Cannot read property 'controller' of undefined" PASS Same-origin blob URL worker should intercept fetch(). -FAIL Data URL iframe should not inherit service worker controller. assert_equals: data URL iframe should not inherit controller expected (object) null but got (string) "Failed to read the 'serviceWorker' property from 'Navigator': Access to service workers is denied in this document origin." +FAIL Data URL iframe should not inherit service worker controller. assert_equals: data URL iframe should not inherit controller expected (object) null but got (string) "Cannot read property 'controller' of undefined" PASS Data URL iframe should not intercept fetch(). FAIL Data URL worker should not inherit service worker controller. promise_test: Unhandled rejection with value: "Uncaught TypeError: Cannot read property 'controller' of undefined" FAIL Data URL worker should not intercept fetch(). assert_equals: data URL worker should not intercept fetch expected "" but got "intercepted"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html index 8c48a18..bcab353 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html +++ b/third_party/WebKit/LayoutTests/external/wpt/service-workers/service-worker/resources/http-to-https-redirect-and-register-iframe.html
@@ -4,18 +4,22 @@ <script> 'use strict'; -navigator.serviceWorker.register('empty-worker.js', {scope: 'scope-register'}) - .then( - registration => { - registration.unregister().then(() => { - window.opener.postMessage('OK', '*'); - }); - }, - error => { - window.opener.postMessage('FAIL: ' + error.name, '*'); - }) - .catch(error => { - window.opener.postMessage('ERROR: ' + error.name, '*'); - }); +if (!navigator.serviceWorker) { + window.opener.postMessage('FAIL: navigator.serviceWorker is undefined', '*'); +} else { + navigator.serviceWorker.register('empty-worker.js', {scope: 'scope-register'}) + .then( + registration => { + registration.unregister().then(() => { + window.opener.postMessage('OK', '*'); + }); + }, + error => { + window.opener.postMessage('FAIL: ' + error.name, '*'); + }) + .catch(error => { + window.opener.postMessage('ERROR: ' + error.name, '*'); + }); +} </script> </body>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture-expected.txt index ca31767db..218dac2 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture-expected.txt
@@ -2,8 +2,8 @@ Click me PASS Stack postMessages on self window and the user gesture is only consumed once -PASS Bounce postMessages between self and frame window and the user gesture is only consumed once in self window -PASS Bounce postMessages between self and frame window and the user gesture is only consumed once in frame +PASS Bounce postMessages between self and frame window and the user gesture is consumed only once in self window +PASS Bounce postMessages between self and frame window and the user gesture is consumed only once in frame PASS successfullyParsed is true TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture.html b/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture.html index 947b134..52f2ae7 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture.html +++ b/third_party/WebKit/LayoutTests/fast/dom/Window/window-postmessage-user-gesture.html
@@ -56,14 +56,20 @@ if (msg.count < msg.bounceTotal) document.getElementById("subframe").contentWindow.postMessage(msg, "*"); else { - if (msg.consumeCount == 1) - testPassed("Bounce postMessages between self and frame window and" + - " the user gesture is only consumed once " + - (consumeInFrame ? "in frame" : "in self window")); + var outputStr = "Bounce postMessages between self and frame window" + + " and the user gesture is consumed " + + (msg.consumeCount == 1? "only once " : msg.consumeCount + " times ") + + (consumeInFrame ? "in frame" : "in self window"); + + var consumeCountIsCorrect = (msg.consumeCount == 1); + if (internals.runtimeFlags.userActivationV2Enabled) + consumeCountIsCorrect = (!consumeInFrame && msg.consumeCount == 1) || + (consumeInFrame && msg.consumeCount == 0); + + if (consumeCountIsCorrect) + testPassed(outputStr); else - testFailed("Bounce postMessages between self and frame window and" + - " the user gesture is consumed " + msg.consumeCount + " times "+ - (consumeInFrame ? "in frame" : "in self window")); + testFailed(outputStr); if (!consumeInFrame) { consumeInFrame = true;
diff --git a/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html b/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html index 948cd3e..9673a7c3 100644 --- a/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html +++ b/third_party/WebKit/LayoutTests/http/tests/security/powerfulFeatureRestrictions/serviceworker-on-insecure-origin.html
@@ -7,21 +7,8 @@ if (window.location.origin != get_host_info().UNAUTHENTICATED_ORIGIN) { window.location = get_host_info().UNAUTHENTICATED_ORIGIN + window.location.pathname; } else { - async_test(function() { - var scope = 'resources/registration/'; - navigator.serviceWorker.register( - 'resources/registration-worker.js', - {scope: scope} - ).then( - this.step_func(function() { - assert_unreached('Registration should fail, but succeeded.'); - service_worker_unregister_and_done(this, scope); - }), - this.step_func(function(reason) { - assert_equals(reason.name, "SecurityError"); - this.done(); - }) - ); - }, "Registering on an unauthenticated origin"); + test(t => { + assert_false('serviceWorker' in navigator, 'navigator.serviceWorker should not be present'); + }, 'navigator.serviceWorker requires a secure context'); } </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register-iframe.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register-iframe.html index 40ea09b8..415cc5ec 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register-iframe.html +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/http-to-https-redirect-and-register-iframe.html
@@ -44,7 +44,9 @@ '/serviceworker/resources/register.html'; return redirect_and_register(target_url) - .then(result => {assert_equals(result, 'FAIL: SecurityError');}); + .then(result => { + assert_equals(result, 'FAIL: navigator.serviceWorker is undefined'); + }); }, 'register on a non-secure page after redirect from an non-secure url'); </script> </body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/claim-worker.js b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/claim-worker.js index a0e1ac83..0d3f296 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/claim-worker.js +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/claim-worker.js
@@ -12,3 +12,9 @@ event.data.port.postMessage('FAIL: exception: ' + error.name); })); }); + +self.addEventListener('fetch', event => { + if (event.request.url.indexOf('simple.txt') >= 0) { + event.respondWith(new Response('sw controls the insecure page')); + } + });
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/insecure-inscope.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/insecure-inscope.html index 7fd97f2..e2141fe5 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/insecure-inscope.html +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/insecure-inscope.html
@@ -3,10 +3,19 @@ <title>Insecure inscope page</title> <script> // The top window messages us when it wants to check for a controller. -window.onmessage = (e => { - if (navigator.serviceWorker.controller === null) - window.top.postMessage('PASS', '*'); - else - window.top.postMessage('FAIL', '*'); - }); +window.onmessage = (async e => { + if (navigator.serviceWorker) { + window.top.postMessage('FAIL: navigator.serviceWorker is defined on an insecure context', '*'); + return; + } + + // Perform a fetch() to detect whether a service worker controls this page. + const response = await fetch('simple.txt'); + const text = await response.text(); + if (text != 'a simple text file\n') { + window.top.postMessage('FAIL: fetched ' + text, '*'); + return; + } + window.top.postMessage('PASS', '*'); +}); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register.html b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register.html index e954067..cf3c9fe 100644 --- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register.html +++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/resources/register.html
@@ -4,18 +4,22 @@ <script> 'use strict'; -navigator.serviceWorker.register('empty-worker.js', {scope: 'scope-register'}) - .then( - registration => { - registration.unregister().then(() => { - window.parent.postMessage('OK', '*'); - }); - }, - error => { - window.parent.postMessage('FAIL: ' + error.name, '*'); - }) - .catch(error => { - window.parent.postMessage('ERROR: ' + error.name, '*'); - }); +if (!navigator.serviceWorker) { + window.parent.postMessage('FAIL: navigator.serviceWorker is undefined', '*'); +} else { + navigator.serviceWorker.register('empty-worker.js', {scope: 'scope-register'}) + .then( + registration => { + registration.unregister().then(() => { + window.parent.postMessage('OK', '*'); + }); + }, + error => { + window.parent.postMessage('FAIL: ' + error.name, '*'); + }) + .catch(error => { + window.parent.postMessage('ERROR: ' + error.name, '*'); + }); +} </script> </body>
diff --git a/third_party/WebKit/LayoutTests/virtual/user-activation-v2/fast/dom/Window/README.txt b/third_party/WebKit/LayoutTests/virtual/user-activation-v2/fast/dom/Window/README.txt new file mode 100644 index 0000000..ef3197a --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/user-activation-v2/fast/dom/Window/README.txt
@@ -0,0 +1,2 @@ +# This suite runs tests with --enable-features=UserActivationV2. +# See http://bit.ly/2E9E3IA
diff --git a/third_party/WebKit/LayoutTests/virtual/user-activation-v2/fast/dom/Window/window-postmessage-user-gesture-expected.txt b/third_party/WebKit/LayoutTests/virtual/user-activation-v2/fast/dom/Window/window-postmessage-user-gesture-expected.txt new file mode 100644 index 0000000..0f448c1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/user-activation-v2/fast/dom/Window/window-postmessage-user-gesture-expected.txt
@@ -0,0 +1,10 @@ +Test that user gesture is kept when postMessage() to self or across frames. +Click me + +PASS Stack postMessages on self window and the user gesture is only consumed once +PASS Bounce postMessages between self and frame window and the user gesture is consumed only once in self window +PASS Bounce postMessages between self and frame window and the user gesture is consumed 0 times in frame +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index d986d9f2..beb304e 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -195,6 +195,7 @@ "platform/scheduler/web_main_thread_scheduler.h", "platform/scheduler/web_render_widget_scheduling_state.h", "platform/scheduler/web_thread_scheduler.h", + "platform/scoped_web_callbacks.h", "platform/shape_properties.h", "platform/task_type.h", "platform/url_conversion.h",
diff --git a/content/child/scoped_web_callbacks.h b/third_party/blink/public/platform/scoped_web_callbacks.h similarity index 66% rename from content/child/scoped_web_callbacks.h rename to third_party/blink/public/platform/scoped_web_callbacks.h index 725548f..3d45802 100644 --- a/content/child/scoped_web_callbacks.h +++ b/third_party/blink/public/platform/scoped_web_callbacks.h
@@ -1,18 +1,18 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_CHILD_SCOPED_WEB_CALLBACKS_H_ -#define CONTENT_CHILD_SCOPED_WEB_CALLBACKS_H_ +#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCOPED_WEB_CALLBACKS_H_ +#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCOPED_WEB_CALLBACKS_H_ #include <memory> #include <utility> #include "base/callback.h" -#include "base/macros.h" -#include "base/memory/ptr_util.h" #include "third_party/blink/public/platform/web_callbacks.h" +namespace blink { + // A ScopedWebCallbacks is a move-only scoper which helps manage the lifetime of // a blink::WebCallbacks object. This is particularly useful when you're // simultaneously dealing with the following two conditions: @@ -48,14 +48,14 @@ // } // // // Blink client implementation -// void FooClientImpl::doMagic(FooCallbacks* callbacks) { +// void FooClientImpl::doMagic(std::unique_ptr<FooCallbacks> callbacks) { // auto scoped_callbacks = make_scoped_web_callbacks( -// callbacks, base::Bind(&OnCallbacksDropped)); +// std::move(callbacks), base::BindOnce(&OnCallbacksDropped)); // // // Call to some lower-level service which may never run the callback we // // give it. -// foo_service_->DoMagic(base::Bind(&RespondWithSuccess, -// base::Passed(&scoped_callbacks))); +// foo_service_->DoMagic(base::BindOnce(&RespondWithSuccess, +// std::move(scoped_callbacks))); // } // // If the bound RespondWithSuccess callback actually runs, PassCallbacks() will @@ -69,44 +69,43 @@ class ScopedWebCallbacks { public: using DestructionCallback = - base::Callback<void(std::unique_ptr<CallbacksType> callbacks)>; + base::OnceCallback<void(std::unique_ptr<CallbacksType> callbacks)>; ScopedWebCallbacks(std::unique_ptr<CallbacksType> callbacks, - const DestructionCallback& destruction_callback) + DestructionCallback destruction_callback) : callbacks_(std::move(callbacks)), - destruction_callback_(destruction_callback) {} + destruction_callback_(std::move(destruction_callback)) {} ~ScopedWebCallbacks() { - if (callbacks_) - destruction_callback_.Run(std::move(callbacks_)); + if (destruction_callback_) + std::move(destruction_callback_).Run(std::move(callbacks_)); } - ScopedWebCallbacks(ScopedWebCallbacks&& other) { *this = std::move(other); } + ScopedWebCallbacks(ScopedWebCallbacks&& other) = default; + ScopedWebCallbacks(const ScopedWebCallbacks& other) = delete; - ScopedWebCallbacks& operator=(ScopedWebCallbacks&& other) { - callbacks_ = std::move(other.callbacks_); - destruction_callback_ = other.destruction_callback_; - return *this; - } + ScopedWebCallbacks& operator=(ScopedWebCallbacks&& other) = default; + ScopedWebCallbacks& operator=(const ScopedWebCallbacks& other) = delete; std::unique_ptr<CallbacksType> PassCallbacks() { + destruction_callback_ = DestructionCallback(); return std::move(callbacks_); } private: std::unique_ptr<CallbacksType> callbacks_; DestructionCallback destruction_callback_; - - DISALLOW_COPY_AND_ASSIGN(ScopedWebCallbacks); }; template <typename CallbacksType> -ScopedWebCallbacks<CallbacksType> make_scoped_web_callbacks( - CallbacksType* callbacks, - const typename ScopedWebCallbacks<CallbacksType>::DestructionCallback& +ScopedWebCallbacks<CallbacksType> MakeScopedWebCallbacks( + std::unique_ptr<CallbacksType> callbacks, + typename ScopedWebCallbacks<CallbacksType>::DestructionCallback destruction_callback) { - return ScopedWebCallbacks<CallbacksType>(base::WrapUnique(callbacks), - destruction_callback); + return ScopedWebCallbacks<CallbacksType>(std::move(callbacks), + std::move(destruction_callback)); } -#endif // CONTENT_CHILD_SCOPED_WEB_CALLBACKS_H_ +} // namespace blink + +#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_SCOPED_WEB_CALLBACKS_H_
diff --git a/third_party/blink/public/platform/web_image_capture_frame_grabber.h b/third_party/blink/public/platform/web_image_capture_frame_grabber.h index d1f8d967..7fac875 100644 --- a/third_party/blink/public/platform/web_image_capture_frame_grabber.h +++ b/third_party/blink/public/platform/web_image_capture_frame_grabber.h
@@ -5,6 +5,8 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMAGE_CAPTURE_FRAME_GRABBER_H_ #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMAGE_CAPTURE_FRAME_GRABBER_H_ +#include <memory> + #include "third_party/blink/public/platform/web_callbacks.h" #include "third_party/blink/public/platform/web_common.h" #include "third_party/skia/include/core/SkRefCnt.h" @@ -22,8 +24,9 @@ public: virtual ~WebImageCaptureFrameGrabber() = default; - virtual void GrabFrame(WebMediaStreamTrack*, - WebImageCaptureGrabFrameCallbacks*) = 0; + virtual void GrabFrame( + WebMediaStreamTrack*, + std::unique_ptr<WebImageCaptureGrabFrameCallbacks> callbacks) = 0; }; } // namespace blink
diff --git a/third_party/blink/public/platform/web_media_player_client.h b/third_party/blink/public/platform/web_media_player_client.h index ac171b3..65f01c0 100644 --- a/third_party/blink/public/platform/web_media_player_client.h +++ b/third_party/blink/public/platform/web_media_player_client.h
@@ -111,8 +111,9 @@ // calling WebMediaPlayer::BecameDominantVisibleContent(bool). virtual void ActivateViewportIntersectionMonitoring(bool) = 0; - // Returns whether the media element is in an autoplay muted state. - virtual bool IsAutoplayingMuted() = 0; + // Returns whether the media element has always been muted. This is used to + // avoid take audio focus for elements that the user is not aware is playing. + virtual bool WasAlwaysMuted() = 0; // Returns if there's a selected video track. virtual bool HasSelectedVideoTrack() = 0;
diff --git a/third_party/blink/public/platform/web_url_request.h b/third_party/blink/public/platform/web_url_request.h index f969fe1..b0ac714 100644 --- a/third_party/blink/public/platform/web_url_request.h +++ b/third_party/blink/public/platform/web_url_request.h
@@ -111,15 +111,6 @@ kRequestContextXSLT }; - // Used to report performance metrics timed from the UI action that - // triggered them (as opposed to navigation start time used in the - // Navigation Timing API). - enum InputToLoadPerfMetricReportPolicy : uint8_t { - kNoReport, // Don't report metrics for this WebURLRequest. - kReportLink, // Report metrics with UI action link clicked. - kReportIntent, // Report metrics with UI action displayed intent. - }; - typedef int PreviewsState; // The Previews types which determines whether to request a Preview version of @@ -318,16 +309,6 @@ BLINK_PLATFORM_EXPORT bool WasDiscarded() const; BLINK_PLATFORM_EXPORT void SetWasDiscarded(bool); - // This is used to report navigation metrics starting from the UI action - // that triggered the navigation (which can be different from the navigation - // start time used in the Navigation Timing API). - BLINK_PLATFORM_EXPORT double UiStartTime() const; - BLINK_PLATFORM_EXPORT void SetUiStartTime(double); - BLINK_PLATFORM_EXPORT WebURLRequest::InputToLoadPerfMetricReportPolicy - InputPerfMetricReportPolicy() const; - BLINK_PLATFORM_EXPORT void SetInputPerfMetricReportPolicy( - WebURLRequest::InputToLoadPerfMetricReportPolicy); - // https://wicg.github.io/cors-rfc1918/#external-request BLINK_PLATFORM_EXPORT bool IsExternalRequest() const;
diff --git a/third_party/blink/renderer/controller/bloated_renderer_detector_test.cc b/third_party/blink/renderer/controller/bloated_renderer_detector_test.cc index e5577c3..7172996 100644 --- a/third_party/blink/renderer/controller/bloated_renderer_detector_test.cc +++ b/third_party/blink/renderer/controller/bloated_renderer_detector_test.cc
@@ -4,41 +4,38 @@ #include "third_party/blink/renderer/controller/bloated_renderer_detector.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/platform/testing/wtf/scoped_mock_clock.h" #include "third_party/blink/renderer/platform/wtf/time.h" namespace blink { class BloatedRendererDetectorTest : public testing::Test { public: - static double GetMockLargeUptime() { - int large_uptime = BloatedRendererDetector::kMinimumUptimeInMinutes + 1; - return WTF::TimeTicksInSeconds( - WTF::TimeTicksFromSeconds(large_uptime * 60)); + static TimeDelta GetMockLargeUptime() { + return TimeDelta::FromMinutes( + BloatedRendererDetector::kMinimumUptimeInMinutes + 1); } - static double GetMockSmallUptime() { - int small_uptime = BloatedRendererDetector::kMinimumUptimeInMinutes - 1; - return WTF::TimeTicksInSeconds( - WTF::TimeTicksFromSeconds(small_uptime * 60)); + static TimeDelta GetMockSmallUptime() { + return TimeDelta::FromMinutes( + BloatedRendererDetector::kMinimumUptimeInMinutes - 1); } }; TEST_F(BloatedRendererDetectorTest, ForwardToBrowser) { - BloatedRendererDetector detector(WTF::TimeTicksFromSeconds(0)); - WTF::TimeFunction original_time_function = - WTF::SetTimeFunctionsForTesting(GetMockLargeUptime); + WTF::ScopedMockClock clock; + clock.Advance(GetMockLargeUptime()); + BloatedRendererDetector detector(TimeTicks{}); EXPECT_EQ(NearV8HeapLimitHandling::kForwardedToBrowser, detector.OnNearV8HeapLimitOnMainThreadImpl()); - WTF::SetTimeFunctionsForTesting(original_time_function); } TEST_F(BloatedRendererDetectorTest, SmallUptime) { - BloatedRendererDetector detector(WTF::TimeTicksFromSeconds(0)); - WTF::TimeFunction original_time_function = - SetTimeFunctionsForTesting(GetMockSmallUptime); + WTF::ScopedMockClock clock; + clock.Advance(GetMockSmallUptime()); + BloatedRendererDetector detector(TimeTicks{}); EXPECT_EQ(NearV8HeapLimitHandling::kIgnoredDueToSmallUptime, detector.OnNearV8HeapLimitOnMainThreadImpl()); - WTF::SetTimeFunctionsForTesting(original_time_function); } } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/idle_deadline_test.cc b/third_party/blink/renderer/core/dom/idle_deadline_test.cc index 7f41010..f2834a6 100644 --- a/third_party/blink/renderer/core/dom/idle_deadline_test.cc +++ b/third_party/blink/renderer/core/dom/idle_deadline_test.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" +#include "third_party/blink/renderer/platform/testing/wtf/scoped_mock_clock.h" #include "third_party/blink/renderer/platform/wtf/time.h" namespace blink { @@ -85,16 +86,10 @@ class IdleDeadlineTest : public testing::Test { public: - void SetUp() override { - original_time_function_ = SetTimeFunctionsForTesting([] { return 1.0; }); - } - - void TearDown() override { - SetTimeFunctionsForTesting(original_time_function_); - } + void SetUp() override { clock_.Advance(TimeDelta::FromSeconds(1)); } private: - TimeFunction original_time_function_; + WTF::ScopedMockClock clock_; }; TEST_F(IdleDeadlineTest, deadlineInFuture) {
diff --git a/third_party/blink/renderer/core/dom/user_gesture_indicator_test.cc b/third_party/blink/renderer/core/dom/user_gesture_indicator_test.cc index 0b946a49..df4f5ea 100644 --- a/third_party/blink/renderer/core/dom/user_gesture_indicator_test.cc +++ b/third_party/blink/renderer/core/dom/user_gesture_indicator_test.cc
@@ -6,20 +6,11 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/platform/testing/wtf/scoped_mock_clock.h" #include "third_party/blink/renderer/platform/wtf/time.h" namespace blink { -static double g_current_time = 1000.0; - -static void AdvanceClock(double seconds) { - g_current_time += seconds; -} - -static double MockTimeFunction() { - return g_current_time; -} - // Checks for the initial state of UserGestureIndicator. TEST(UserGestureIndicatorTest, InitialState) { EXPECT_FALSE(UserGestureIndicator::ProcessingUserGesture()); @@ -120,7 +111,7 @@ } TEST(UserGestureIndicatorTest, Timeouts) { - TimeFunction previous = SetTimeFunctionsForTesting(MockTimeFunction); + WTF::ScopedMockClock clock; { // Token times out after 1 second. @@ -128,9 +119,9 @@ Frame::NotifyUserActivation(nullptr); scoped_refptr<UserGestureToken> token = user_gesture_scope->CurrentToken(); EXPECT_TRUE(token->HasGestures()); - AdvanceClock(0.75); + clock.Advance(TimeDelta::FromSecondsD(0.75)); EXPECT_TRUE(token->HasGestures()); - AdvanceClock(0.75); + clock.Advance(TimeDelta::FromSecondsD(0.75)); EXPECT_FALSE(token->HasGestures()); } @@ -143,20 +134,18 @@ Frame::NotifyUserActivation(nullptr); token = user_gesture_scope->CurrentToken(); EXPECT_TRUE(token->HasGestures()); - AdvanceClock(0.75); + clock.Advance(TimeDelta::FromSecondsD(0.75)); EXPECT_TRUE(token->HasGestures()); } { UserGestureIndicator user_gesture_scope(token.get()); - AdvanceClock(0.75); + clock.Advance(TimeDelta::FromSecondsD(0.75)); EXPECT_TRUE(token->HasGestures()); - AdvanceClock(0.75); + clock.Advance(TimeDelta::FromSecondsD(0.75)); EXPECT_FALSE(token->HasGestures()); } } - - SetTimeFunctionsForTesting(previous); } } // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 605ab57..4ed40932 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -345,7 +345,7 @@ return node_count; } - static void GetElementAndCaretBonundsForFocusedEditableElement( + static void GetElementAndCaretBoundsForFocusedEditableElement( FrameTestHelpers::WebViewHelper& helper, IntRect& element_bounds, IntRect& caret_bounds) { @@ -4155,7 +4155,7 @@ IntPoint scroll; bool need_animation; IntRect element_bounds, caret_bounds; - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4175,7 +4175,7 @@ web_view_helper.Resize(WebSize(viewport_width, viewport_height)); SetScaleAndScrollAndLayout(web_view_helper.GetWebView(), WebPoint(0, 0), initial_scale); - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4191,7 +4191,7 @@ initial_scale); // Move focus to edit box with text. web_view_helper.GetWebView()->AdvanceFocus(false); - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4213,7 +4213,7 @@ within_tolerance_scale); // Move focus back to the second edit box. web_view_helper.GetWebView()->AdvanceFocus(false); - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4263,7 +4263,7 @@ IntPoint scroll; bool need_animation; IntRect element_bounds, caret_bounds; - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4283,7 +4283,7 @@ h_scroll = 200; SetScaleAndScrollAndLayout(web_view_helper.GetWebView(), WebPoint(h_scroll, 0), new_scale); - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4341,7 +4341,7 @@ IntPoint scroll; bool need_animation; IntRect element_bounds, caret_bounds; - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4364,7 +4364,7 @@ web_view_helper.GetWebView()->AdvanceFocus(true); WebRect rect, caret; web_view_helper.GetWebView()->SelectionBounds(caret, rect); - GetElementAndCaretBonundsForFocusedEditableElement( + GetElementAndCaretBoundsForFocusedEditableElement( web_view_helper, element_bounds, caret_bounds); web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, @@ -4376,6 +4376,60 @@ EXPECT_FALSE(need_animation); } +// Tests zoom into editable zoom and scroll correctly when zoom-for-dsf enabled. +TEST_F(WebFrameTest, DivScrollIntoEditableTestWithDeviceScaleFactor) { + RegisterMockedHttpURLLoad("get_scale_for_zoom_into_editable_test.html"); + + bool kAutoZoomToLegibleScale = true; + const float kDeviceScaleFactor = 2.f; + int viewport_width = 200 * kDeviceScaleFactor; + int viewport_height = 150 * kDeviceScaleFactor; + float min_readable_caret_height = 16.0f * kDeviceScaleFactor; + + FrameTestHelpers::WebViewHelper web_view_helper; + web_view_helper.InitializeAndLoad( + base_url_ + "get_scale_for_zoom_into_editable_test.html", nullptr, + nullptr, nullptr, ConfigureAndroid); + web_view_helper.GetWebView() + ->GetPage() + ->GetSettings() + .SetTextAutosizingEnabled(false); + web_view_helper.Resize(WebSize(viewport_width, viewport_height)); + web_view_helper.GetWebView()->SetZoomFactorForDeviceScaleFactor( + kDeviceScaleFactor); + web_view_helper.GetWebView()->SetDefaultPageScaleLimits(0.25f, 4); + + web_view_helper.GetWebView()->EnableFakePageScaleAnimationForTesting(true); + + WebRect edit_box_with_text(200 * kDeviceScaleFactor, 200 * kDeviceScaleFactor, + 250 * kDeviceScaleFactor, 20 * kDeviceScaleFactor); + web_view_helper.GetWebView()->AdvanceFocus(false); + + // Set the page scale to be smaller than the minimal readable scale. + float initial_scale = 0.5f; + SetScaleAndScrollAndLayout(web_view_helper.GetWebView(), WebPoint(0, 0), + initial_scale); + ASSERT_EQ(web_view_helper.GetWebView()->PageScaleFactor(), initial_scale); + + float scale; + IntPoint scroll; + bool need_animation; + IntRect element_bounds, caret_bounds; + GetElementAndCaretBoundsForFocusedEditableElement( + web_view_helper, element_bounds, caret_bounds); + web_view_helper.GetWebView()->ComputeScaleAndScrollForEditableElementRects( + element_bounds, caret_bounds, kAutoZoomToLegibleScale, scale, scroll, + need_animation); + EXPECT_TRUE(need_animation); + // The edit box wider than the viewport when legible should be left aligned. + int h_scroll = edit_box_with_text.x; + EXPECT_NEAR(h_scroll, scroll.X(), 2); + int v_scroll = edit_box_with_text.y - + (viewport_height / scale - edit_box_with_text.height) / 2; + EXPECT_NEAR(v_scroll, scroll.Y(), 2); + EXPECT_NEAR(min_readable_caret_height / caret_bounds.Height(), scale, 0.1); +} + TEST_F(WebFrameTest, CharacterIndexAtPointWithPinchZoom) { RegisterMockedHttpURLLoad("sometext.html");
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 066b937..0dd1cad 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -2393,10 +2393,11 @@ // the caret height will become minReadableCaretHeightForNode (adjusted // for dpi and font scale factor). const int min_readable_caret_height_for_node = - element_bounds_in_document.Height() >= - 2 * caret_bounds_in_document.Height() - ? minReadableCaretHeightForTextArea - : minReadableCaretHeight; + (element_bounds_in_document.Height() >= + 2 * caret_bounds_in_document.Height() + ? minReadableCaretHeightForTextArea + : minReadableCaretHeight) * + MainFrameImpl()->GetFrame()->PageZoomFactor(); new_scale = ClampPageScaleFactorToLimits( MaximumLegiblePageScale() * min_readable_caret_height_for_node / caret_bounds_in_document.Height());
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index 3a9f024..44a1db8 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -471,6 +471,8 @@ DivScrollIntoEditablePreservePageScaleTest); FRIEND_TEST_ALL_PREFIXES(WebFrameTest, DivScrollIntoEditableTestZoomToLegibleScaleDisabled); + FRIEND_TEST_ALL_PREFIXES(WebFrameTest, + DivScrollIntoEditableTestWithDeviceScaleFactor); void SetPageScaleFactorAndLocation(float, const FloatPoint&); void PropagateZoomFactorToLocalFrameRoots(Frame*, float);
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc index 9c110fe..88fa2d4 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
@@ -323,6 +323,7 @@ } if (data_length != total_bytes_) { Failed(FileError::kNotReadableErr, FailureType::kReadSizesIncorrect); + return; } received_on_complete_ = true;
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index e18218d..92a1e5a 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -346,10 +346,6 @@ SendPings(completed_url); ResourceRequest request(completed_url); - request.SetUIStartTime( - (event->PlatformTimeStamp() - TimeTicks()).InSecondsF()); - request.SetInputPerfMetricReportPolicy( - InputToLoadPerfMetricReportPolicy::kReportLink); ReferrerPolicy policy; if (hasAttribute(referrerpolicyAttr) &&
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.cc b/third_party/blink/renderer/core/html/media/autoplay_policy.cc index 8ecab28..f8fddfc9 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_policy.cc +++ b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
@@ -278,10 +278,6 @@ return base::nullopt; } -bool AutoplayPolicy::IsAutoplayingMuted() const { - return IsAutoplayingMutedInternal(element_->muted()); -} - bool AutoplayPolicy::IsAutoplayingMutedInternal(bool muted) const { return !element_->paused() && IsOrWillBeAutoplayingMutedInternal(muted); }
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.h b/third_party/blink/renderer/core/html/media/autoplay_policy.h index 8f7cf6e..81c12a3 100644 --- a/third_party/blink/renderer/core/html/media/autoplay_policy.h +++ b/third_party/blink/renderer/core/html/media/autoplay_policy.h
@@ -75,9 +75,6 @@ // only be called once per call of setMuted(). bool RequestAutoplayUnmute(); - // Indicates the media element is autoplaying because of being muted. - bool IsAutoplayingMuted() const; - // Indicates the media element is or will autoplay because of being // muted. CORE_EXPORT bool IsOrWillBeAutoplayingMuted() const;
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index b852854..db191c29 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -504,6 +504,7 @@ playing_remotely_(false), in_overlay_fullscreen_video_(false), mostly_filling_viewport_(false), + was_always_muted_(true), audio_tracks_(AudioTrackList::Create(*this)), video_tracks_(VideoTrackList::Create(*this)), audio_source_node_(nullptr), @@ -2634,8 +2635,13 @@ if (!muted_ && !autoplay_policy_->RequestAutoplayUnmute()) pause(); - // This is called after the volumechange event to make sure isAutoplayingMuted - // returns the right value when webMediaPlayer receives the volume update. + // If playback was not paused by the autoplay policy and got unmuted, the + // element is marked as being allowed to play unmuted. + if (!muted_ && PotentiallyPlaying()) + was_always_muted_ = false; + + // This is called at the end to make sure the WebMediaPlayer has the right + // information. if (GetWebMediaPlayer()) GetWebMediaPlayer()->SetVolume(EffectiveMediaVolume()); @@ -3358,8 +3364,8 @@ return track->id(); } -bool HTMLMediaElement::IsAutoplayingMuted() { - return autoplay_policy_->IsAutoplayingMuted(); +bool HTMLMediaElement::WasAlwaysMuted() { + return was_always_muted_; } // MediaPlayerPresentation methods @@ -3486,6 +3492,9 @@ << ") - shouldBePlaying = " << BoolString(should_be_playing) << ", isPlaying = " << BoolString(is_playing); + if (should_be_playing && !muted_) + was_always_muted_ = false; + if (should_be_playing) { SetDisplayMode(kVideo);
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h index 73b1516..d9de0cc3 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.h +++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -427,7 +427,7 @@ void OnBecamePersistentVideo(bool) override {} bool HasSelectedVideoTrack() final; WebMediaPlayer::TrackId GetSelectedVideoTrackId() final; - bool IsAutoplayingMuted() final; + bool WasAlwaysMuted() final; void ActivateViewportIntersectionMonitoring(bool) final; bool HasNativeControls() final; bool IsAudioElement() final; @@ -663,6 +663,8 @@ bool mostly_filling_viewport_ : 1; + bool was_always_muted_ : 1; + TraceWrapperMember<AudioTrackList> audio_tracks_; TraceWrapperMember<VideoTrackList> video_tracks_; TraceWrapperMember<TextTrackList> text_tracks_;
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc index e8071b6..3920612 100644 --- a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc +++ b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
@@ -1903,8 +1903,6 @@ EXPECT_TRUE(image_resource->GetContent()->GetImage()->IsBitmapImage()); EXPECT_EQ(50, image_resource->GetContent()->GetImage()->width()); EXPECT_EQ(50, image_resource->GetContent()->GetImage()->height()); - - WTF::SetTimeFunctionsForTesting(nullptr); } TEST(ImageResourceTest, DeferredInvalidation) {
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc index 7c11c06..81e2077 100644 --- a/third_party/blink/renderer/core/timing/window_performance_test.cc +++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -3,46 +3,28 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/timing/window_performance.h" + +#include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_double.h" #include "third_party/blink/renderer/bindings/core/v8/string_or_double_or_performance_measure_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/platform/bindings/exception_state.h" - -#include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/performance_monitor.h" #include "third_party/blink/renderer/core/loader/document_load_timing.h" #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" #include "third_party/blink/renderer/core/timing/dom_window_performance.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/wtf/scoped_mock_clock.h" namespace blink { -static const int kTimeOrigin = 500; - namespace { -class FakeTimer { - public: - FakeTimer(double init_time) { - g_mock_time = init_time; - original_time_function_ = - WTF::SetTimeFunctionsForTesting(GetMockTimeInSeconds); - } - - ~FakeTimer() { WTF::SetTimeFunctionsForTesting(original_time_function_); } - - static double GetMockTimeInSeconds() { return g_mock_time; } - - void AdvanceTimer(double duration) { g_mock_time += duration; } - - private: - TimeFunction original_time_function_; - static double g_mock_time; -}; - -double FakeTimer::g_mock_time = 1000.; +TimeTicks GetTimeOrigin() { + return TimeTicks() + TimeDelta::FromSeconds(500); +} } // namespace @@ -53,7 +35,7 @@ page_holder_->GetDocument().SetURL(KURL("https://example.com")); performance_ = WindowPerformance::Create(page_holder_->GetDocument().domWindow()); - performance_->time_origin_ = TimeTicksFromSeconds(kTimeOrigin); + performance_->time_origin_ = GetTimeOrigin(); // Create another dummy page holder and pretend this is the iframe. another_page_holder_ = DummyPageHolder::Create(IntSize(400, 300)); @@ -204,15 +186,16 @@ // order. (http://crbug.com/767560) TEST_F(WindowPerformanceTest, EnsureEntryListOrder) { V8TestingScope scope; - FakeTimer timer(kTimeOrigin); + WTF::ScopedMockClock clock; + clock.Advance(GetTimeOrigin() - TimeTicks()); DummyExceptionStateForTesting exception_state; - timer.AdvanceTimer(2); + clock.Advance(TimeDelta::FromSeconds(2)); for (int i = 0; i < 8; i++) { performance_->mark(scope.GetScriptState(), String::Number(i), exception_state); } - timer.AdvanceTimer(2); + clock.Advance(TimeDelta::FromSeconds(2)); for (int i = 8; i < 17; i++) { performance_->mark(scope.GetScriptState(), String::Number(i), exception_state); @@ -233,12 +216,12 @@ ScopedEventTimingForTest event_timing(true); EXPECT_TRUE(page_holder_->GetFrame().Loader().GetDocumentLoader()); - TimeTicks start_time = TimeTicksFromSeconds(kTimeOrigin + 1.1); - TimeTicks processing_start = TimeTicksFromSeconds(kTimeOrigin + 3.3); - TimeTicks processing_end = TimeTicksFromSeconds(kTimeOrigin + 3.8); + TimeTicks start_time = GetTimeOrigin() + TimeDelta::FromSecondsD(1.1); + TimeTicks processing_start = GetTimeOrigin() + TimeDelta::FromSecondsD(3.3); + TimeTicks processing_end = GetTimeOrigin() + TimeDelta::FromSecondsD(3.8); performance_->RegisterEventTiming("click", start_time, processing_start, processing_end, false); - TimeTicks swap_time = TimeTicksFromSeconds(kTimeOrigin + 6.0); + TimeTicks swap_time = GetTimeOrigin() + TimeDelta::FromSecondsD(6.0); SimulateSwapPromise(swap_time); EXPECT_EQ(1u, performance_->getEntriesByName("click", "event").size()); performance_->clearEventTimings(); @@ -267,18 +250,22 @@ TEST_F(WindowPerformanceTest, EventTimingDuration) { ScopedEventTimingForTest event_timing(true); - TimeTicks start_time = TimeTicksFromSeconds(kTimeOrigin + 1.0); - TimeTicks processing_start = TimeTicksFromSeconds(kTimeOrigin + 1.001); - TimeTicks processing_end = TimeTicksFromSeconds(kTimeOrigin + 1.002); + TimeTicks start_time = GetTimeOrigin() + TimeDelta::FromMilliseconds(1000); + TimeTicks processing_start = + GetTimeOrigin() + TimeDelta::FromMilliseconds(1001); + TimeTicks processing_end = + GetTimeOrigin() + TimeDelta::FromMilliseconds(1002); performance_->RegisterEventTiming("click", start_time, processing_start, processing_end, false); - TimeTicks short_swap_time = TimeTicksFromSeconds(kTimeOrigin + 1.003); + TimeTicks short_swap_time = + GetTimeOrigin() + TimeDelta::FromMilliseconds(1003); SimulateSwapPromise(short_swap_time); EXPECT_EQ(0u, performance_->getEntriesByName("click", "event").size()); performance_->RegisterEventTiming("click", start_time, processing_start, processing_end, true); - TimeTicks long_swap_time = TimeTicksFromSeconds(kTimeOrigin + 1.1); + TimeTicks long_swap_time = + GetTimeOrigin() + TimeDelta::FromMilliseconds(1100); SimulateSwapPromise(long_swap_time); EXPECT_EQ(1u, performance_->getEntriesByName("click", "event").size()); @@ -296,14 +283,14 @@ size_t num_events = 10; for (size_t i = 0; i < num_events; ++i) { - TimeTicks start_time = TimeTicksFromSeconds(kTimeOrigin + i); - TimeTicks processing_start = TimeTicksFromSeconds(kTimeOrigin + i + 0.1); - TimeTicks processing_end = TimeTicksFromSeconds(kTimeOrigin + i + 0.2); + TimeTicks start_time = GetTimeOrigin() + TimeDelta::FromSeconds(i); + TimeTicks processing_start = start_time + TimeDelta::FromMilliseconds(100); + TimeTicks processing_end = start_time + TimeDelta::FromMilliseconds(200); performance_->RegisterEventTiming("click", start_time, processing_start, processing_end, false); EXPECT_EQ(0u, performance_->getEntriesByName("click", "event").size()); } - TimeTicks swap_time = TimeTicksFromSeconds(kTimeOrigin + num_events); + TimeTicks swap_time = GetTimeOrigin() + TimeDelta::FromSeconds(num_events); SimulateSwapPromise(swap_time); EXPECT_EQ(num_events, performance_->getEntriesByName("click", "event").size());
diff --git a/third_party/blink/renderer/devtools/front_end/inspector_main/InspectorMain.js b/third_party/blink/renderer/devtools/front_end/inspector_main/InspectorMain.js index e1ce167..7a60d01 100644 --- a/third_party/blink/renderer/devtools/front_end/inspector_main/InspectorMain.js +++ b/third_party/blink/renderer/devtools/front_end/inspector_main/InspectorMain.js
@@ -41,6 +41,8 @@ * @return {number} */ _capabilitiesForMainTarget() { + if (Runtime.queryParam('v8only')) + return SDK.Target.Capability.JS; return SDK.Target.Capability.Browser | SDK.Target.Capability.DOM | SDK.Target.Capability.DeviceEmulation | SDK.Target.Capability.Emulation | SDK.Target.Capability.Input | SDK.Target.Capability.JS | SDK.Target.Capability.Log | SDK.Target.Capability.Network | SDK.Target.Capability.ScreenCapture |
diff --git a/third_party/blink/renderer/modules/imagecapture/image_capture.cc b/third_party/blink/renderer/modules/imagecapture/image_capture.cc index 108510b..e9d81621 100644 --- a/third_party/blink/renderer/modules/imagecapture/image_capture.cc +++ b/third_party/blink/renderer/modules/imagecapture/image_capture.cc
@@ -313,8 +313,9 @@ // The platform does not know about MediaStreamTrack, so we wrap it up. WebMediaStreamTrack track(stream_track_->Component()); - frame_grabber_->GrabFrame( - &track, new CallbackPromiseAdapter<ImageBitmap, void>(resolver)); + auto resolver_callback_adapter = + std::make_unique<CallbackPromiseAdapter<ImageBitmap, void>>(resolver); + frame_grabber_->GrabFrame(&track, std::move(resolver_callback_adapter)); return promise; }
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_download_button_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_download_button_element.cc index 29c99ac..73e6513 100644 --- a/third_party/blink/renderer/modules/media_controls/elements/media_control_download_button_element.cc +++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_download_button_element.cc
@@ -76,10 +76,6 @@ Platform::Current()->RecordAction( UserMetricsAction("Media.Controls.Download")); ResourceRequest request(url); - request.SetUIStartTime( - (event->PlatformTimeStamp() - TimeTicks()).InSecondsF()); - request.SetInputPerfMetricReportPolicy( - InputToLoadPerfMetricReportPolicy::kReportLink); request.SetSuggestedFilename(MediaElement().title()); request.SetRequestContext(WebURLRequest::kRequestContextDownload); request.SetRequestorOrigin(SecurityOrigin::Create(GetDocument().Url()));
diff --git a/third_party/blink/renderer/modules/serviceworkers/navigator_service_worker.idl b/third_party/blink/renderer/modules/serviceworkers/navigator_service_worker.idl index ef59d5d..6569d07 100644 --- a/third_party/blink/renderer/modules/serviceworkers/navigator_service_worker.idl +++ b/third_party/blink/renderer/modules/serviceworkers/navigator_service_worker.idl
@@ -6,5 +6,5 @@ [ ImplementedAs=NavigatorServiceWorker ] partial interface Navigator { - [RaisesException, CallWith=ScriptState] readonly attribute ServiceWorkerContainer serviceWorker; + [SecureContext, RaisesException, CallWith=ScriptState] readonly attribute ServiceWorkerContainer serviceWorker; };
diff --git a/third_party/blink/renderer/modules/serviceworkers/service_worker.idl b/third_party/blink/renderer/modules/serviceworkers/service_worker.idl index 038367d..505ea01 100644 --- a/third_party/blink/renderer/modules/serviceworkers/service_worker.idl +++ b/third_party/blink/renderer/modules/serviceworkers/service_worker.idl
@@ -39,7 +39,8 @@ }; [ - ActiveScriptWrappable + ActiveScriptWrappable, + SecureContext ] interface ServiceWorker : EventTarget { [PostMessage, RaisesException] void postMessage(any message, optional sequence<object> transfer);
diff --git a/third_party/blink/renderer/modules/serviceworkers/service_worker_container.cc b/third_party/blink/renderer/modules/serviceworkers/service_worker_container.cc index 198b3b71..28734bf8 100644 --- a/third_party/blink/renderer/modules/serviceworkers/service_worker_container.cc +++ b/third_party/blink/renderer/modules/serviceworkers/service_worker_container.cc
@@ -183,14 +183,10 @@ ServiceWorkerRegistration, ServiceWorkerErrorForUpdate>>(resolver); ExecutionContext* execution_context = ExecutionContext::From(script_state); - String error_message; - // Restrict to secure origins: - // https://w3c.github.io/webappsec-secure-contexts/#is-settings-object-contextually-secure - if (!execution_context->IsSecureContext(error_message)) { - callbacks->OnError(WebServiceWorkerError( - mojom::blink::ServiceWorkerErrorType::kSecurity, error_message)); - return promise; - } + + // The IDL definition is expected to restrict service worker to secure + // contexts. + CHECK(execution_context->IsSecureContext()); scoped_refptr<const SecurityOrigin> document_origin = execution_context->GetSecurityOrigin(); @@ -309,15 +305,13 @@ } ExecutionContext* execution_context = ExecutionContext::From(script_state); + + // The IDL definition is expected to restrict service worker to secure + // contexts. + CHECK(execution_context->IsSecureContext()); + scoped_refptr<const SecurityOrigin> document_origin = execution_context->GetSecurityOrigin(); - String error_message; - if (!execution_context->IsSecureContext(error_message)) { - resolver->Reject( - DOMException::Create(DOMExceptionCode::kSecurityError, error_message)); - return promise; - } - KURL page_url = KURL(NullURL(), document_origin->ToString()); if (!SchemeRegistry::ShouldTreatURLSchemeAsAllowingServiceWorkers( page_url.Protocol())) { @@ -363,15 +357,13 @@ } ExecutionContext* execution_context = ExecutionContext::From(script_state); + + // The IDL definition is expected to restrict service worker to secure + // contexts. + CHECK(execution_context->IsSecureContext()); + scoped_refptr<const SecurityOrigin> document_origin = execution_context->GetSecurityOrigin(); - String error_message; - if (!execution_context->IsSecureContext(error_message)) { - resolver->Reject( - DOMException::Create(DOMExceptionCode::kSecurityError, error_message)); - return promise; - } - KURL page_url = KURL(NullURL(), document_origin->ToString()); if (!SchemeRegistry::ShouldTreatURLSchemeAsAllowingServiceWorkers( page_url.Protocol())) {
diff --git a/third_party/blink/renderer/modules/serviceworkers/service_worker_container.idl b/third_party/blink/renderer/modules/serviceworkers/service_worker_container.idl index 135059b..e4ad5ca2 100644 --- a/third_party/blink/renderer/modules/serviceworkers/service_worker_container.idl +++ b/third_party/blink/renderer/modules/serviceworkers/service_worker_container.idl
@@ -29,7 +29,9 @@ */ // https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface -interface ServiceWorkerContainer : EventTarget { +[ + SecureContext +] interface ServiceWorkerContainer : EventTarget { readonly attribute ServiceWorker? controller; [CallWith=ScriptState] readonly attribute Promise<ServiceWorkerRegistration> ready;
diff --git a/third_party/blink/renderer/modules/serviceworkers/service_worker_container_test.cc b/third_party/blink/renderer/modules/serviceworkers/service_worker_container_test.cc index a753be5..04f3b01b 100644 --- a/third_party/blink/renderer/modules/serviceworkers/service_worker_container_test.cc +++ b/third_party/blink/renderer/modules/serviceworkers/service_worker_container_test.cc
@@ -211,15 +211,6 @@ } }; -TEST_F(ServiceWorkerContainerTest, Register_NonSecureOriginIsRejected) { - SetPageURL("http://www.example.com/"); - TestRegisterRejected( - "http://www.example.com/worker.js", "http://www.example.com/", - ExpectDOMException( - "SecurityError", - "Only secure origins are allowed (see: https://goo.gl/Y0ZkNV).")); -} - TEST_F(ServiceWorkerContainerTest, Register_CrossOriginScriptIsRejected) { SetPageURL("https://www.example.com"); TestRegisterRejected( @@ -244,15 +235,6 @@ "('https://www.example.com').")); } -TEST_F(ServiceWorkerContainerTest, GetRegistration_NonSecureOriginIsRejected) { - SetPageURL("http://www.example.com/"); - TestGetRegistrationRejected( - "http://www.example.com/", - ExpectDOMException( - "SecurityError", - "Only secure origins are allowed (see: https://goo.gl/Y0ZkNV).")); -} - TEST_F(ServiceWorkerContainerTest, GetRegistration_CrossOriginURLIsRejected) { SetPageURL("https://www.example.com/"); TestGetRegistrationRejected(
diff --git a/third_party/blink/renderer/modules/serviceworkers/service_worker_registration.idl b/third_party/blink/renderer/modules/serviceworkers/service_worker_registration.idl index 88471e9..a50faeb 100644 --- a/third_party/blink/renderer/modules/serviceworkers/service_worker_registration.idl +++ b/third_party/blink/renderer/modules/serviceworkers/service_worker_registration.idl
@@ -14,6 +14,7 @@ // https://w3c.github.io/ServiceWorker/#serviceworkerregistration-interface [ ActiveScriptWrappable, + SecureContext, Exposed=(Window,Worker) ] interface ServiceWorkerRegistration : EventTarget { readonly attribute ServiceWorker? installing;
diff --git a/third_party/blink/renderer/modules/vr/vr_display.cc b/third_party/blink/renderer/modules/vr/vr_display.cc index 4f6de82a..e358672 100644 --- a/third_party/blink/renderer/modules/vr/vr_display.cc +++ b/third_party/blink/renderer/modules/vr/vr_display.cc
@@ -67,17 +67,17 @@ void Invoke(double high_res_time_ms) override { if (Id() != vr_display_->PendingMagicWindowVSyncId()) return; - double monotonic_time; + TimeTicks monotonic_time; if (!vr_display_->GetDocument() || !vr_display_->GetDocument()->Loader()) { - monotonic_time = WTF::CurrentTimeTicksInSeconds(); + monotonic_time = WTF::CurrentTimeTicks(); } else { // Convert document-zero time back to monotonic time. - double reference_monotonic_time = - TimeTicksInSeconds(vr_display_->GetDocument() - ->Loader() - ->GetTiming() - .ReferenceMonotonicTime()); - monotonic_time = (high_res_time_ms / 1000.0) + reference_monotonic_time; + TimeTicks reference_monotonic_time = vr_display_->GetDocument() + ->Loader() + ->GetTiming() + .ReferenceMonotonicTime(); + monotonic_time = reference_monotonic_time + + TimeDelta::FromMillisecondsD(high_res_time_ms); } vr_display_->OnMagicWindowVSync(monotonic_time); } @@ -602,7 +602,7 @@ // Run window.rAF once manually so that applications get a chance to // schedule a VRDisplay.rAF in case they do so only while presenting. if (!pending_vrdisplay_raf_ && !capabilities_->hasExternalDisplay()) { - double timestamp = WTF::CurrentTimeTicksInSeconds(); + TimeTicks timestamp = WTF::CurrentTimeTicks(); Platform::Current()->CurrentThread()->GetTaskRunner()->PostTask( FROM_HERE, WTF::Bind(&VRDisplay::ProcessScheduledWindowAnimations, WrapWeakPersistent(this), timestamp)); @@ -849,7 +849,7 @@ EventTypeNames::vrdisplaydeactivate, this, reason)); } -void VRDisplay::ProcessScheduledWindowAnimations(double timestamp) { +void VRDisplay::ProcessScheduledWindowAnimations(TimeTicks timestamp) { TRACE_EVENT1("gpu", "VRDisplay::window.rAF", "frame", vr_frame_id_); auto* doc = navigator_vr_->GetDocument(); if (!doc) @@ -860,8 +860,7 @@ bool had_pending_vrdisplay_raf = pending_vrdisplay_raf_; // TODO(klausw): update timestamp based on scheduling delay? - page->Animator().ServiceScriptedAnimations( - base::TimeTicks() + base::TimeDelta::FromSecondsD(timestamp)); + page->Animator().ServiceScriptedAnimations(timestamp); if (had_pending_vrdisplay_raf != pending_vrdisplay_raf_) { DVLOG(1) << __FUNCTION__ @@ -879,7 +878,7 @@ } } -void VRDisplay::ProcessScheduledAnimations(double timestamp) { +void VRDisplay::ProcessScheduledAnimations(TimeTicks timestamp) { DVLOG(2) << __FUNCTION__; // Check if we still have a valid context, the animation controller // or document may have disappeared since we scheduled this. @@ -905,8 +904,7 @@ base::AutoReset<bool> animating(&in_animation_frame_, true); pending_vrdisplay_raf_ = false; did_submit_this_frame_ = false; - scripted_animation_controller_->ServiceScriptedAnimations( - base::TimeTicks() + base::TimeDelta::FromSecondsD(timestamp)); + scripted_animation_controller_->ServiceScriptedAnimations(timestamp); // If presenting and the script didn't call SubmitFrame, let the device // side know so that it can cleanly reuse resources and make appropriate // timing decisions. Note that is_presenting_ could become false during @@ -971,10 +969,10 @@ // the interface being waited on. Platform::Current()->CurrentThread()->GetTaskRunner()->PostTask( FROM_HERE, WTF::Bind(&VRDisplay::ProcessScheduledAnimations, - WrapWeakPersistent(this), time_delta.InSecondsF())); + WrapWeakPersistent(this), TimeTicks() + time_delta)); } -void VRDisplay::OnMagicWindowVSync(double timestamp) { +void VRDisplay::OnMagicWindowVSync(TimeTicks timestamp) { DVLOG(2) << __FUNCTION__; pending_magic_window_vsync_ = false; pending_magic_window_vsync_id_ = -1;
diff --git a/third_party/blink/renderer/modules/vr/vr_display.h b/third_party/blink/renderer/modules/vr/vr_display.h index 0006cb0..1f4c6b6 100644 --- a/third_party/blink/renderer/modules/vr/vr_display.h +++ b/third_party/blink/renderer/modules/vr/vr_display.h
@@ -99,7 +99,7 @@ void FocusChanged(); - void OnMagicWindowVSync(double timestamp); + void OnMagicWindowVSync(TimeTicks timestamp); int PendingMagicWindowVSyncId() { return pending_magic_window_vsync_id_; } void Trace(blink::Visitor*) override; @@ -156,8 +156,8 @@ bool FocusedOrPresenting(); ScriptedAnimationController& EnsureScriptedAnimationController(Document*); - void ProcessScheduledAnimations(double timestamp); - void ProcessScheduledWindowAnimations(double timestamp); + void ProcessScheduledAnimations(TimeTicks timestamp); + void ProcessScheduledWindowAnimations(TimeTicks timestamp); // Request delivery of a VSync event for either magic window mode or // presenting mode as applicable. May be called more than once per frame, it
diff --git a/third_party/blink/renderer/platform/exported/web_url_request.cc b/third_party/blink/renderer/platform/exported/web_url_request.cc index 09b885ea..036547f 100644 --- a/third_party/blink/renderer/platform/exported/web_url_request.cc +++ b/third_party/blink/renderer/platform/exported/web_url_request.cc
@@ -368,14 +368,6 @@ resource_request_->SetWasDiscarded(was_discarded); } -double WebURLRequest::UiStartTime() const { - return resource_request_->UiStartTime(); -} - -void WebURLRequest::SetUiStartTime(double time_seconds) { - resource_request_->SetUIStartTime(time_seconds); -} - bool WebURLRequest::IsExternalRequest() const { return resource_request_->IsExternalRequest(); } @@ -390,18 +382,6 @@ resource_request_->SetNavigationStartTime(navigation_start_seconds); } -WebURLRequest::InputToLoadPerfMetricReportPolicy -WebURLRequest::InputPerfMetricReportPolicy() const { - return static_cast<WebURLRequest::InputToLoadPerfMetricReportPolicy>( - resource_request_->InputPerfMetricReportPolicy()); -} - -void WebURLRequest::SetInputPerfMetricReportPolicy( - WebURLRequest::InputToLoadPerfMetricReportPolicy policy) { - resource_request_->SetInputPerfMetricReportPolicy( - static_cast<blink::InputToLoadPerfMetricReportPolicy>(policy)); -} - base::Optional<WebString> WebURLRequest::GetSuggestedFilename() const { if (!resource_request_->GetSuggestedFilename().has_value()) return base::Optional<WebString>();
diff --git a/third_party/blink/renderer/platform/fonts/shaping/run_segmenter_test.cc b/third_party/blink/renderer/platform/fonts/shaping/run_segmenter_test.cc index ecb791d..20c9d58 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/run_segmenter_test.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/run_segmenter_test.cc
@@ -241,4 +241,15 @@ FontFallbackPriority::kEmojiEmoji}}); } +TEST_F(RunSegmenterTest, NonEmojiPresentationSymbols) { + CheckRunsHorizontal( + {{u8"\U00002626\U0000262a\U00002638\U0000271d\U00002721", USCRIPT_COMMON, + OrientationIterator::kOrientationKeep, + FontFallbackPriority::kEmojiText}, + {u8"\U00002627\U00002628\U00002629\U0000262b\U0000262c\U00002670" + "\U00002671\U0000271f\U00002720", + USCRIPT_COMMON, OrientationIterator::kOrientationKeep, + FontFallbackPriority::kText}}); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc index a75502d..8a6ac54 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.cc
@@ -77,12 +77,9 @@ did_set_http_referrer_(false), check_for_browser_side_navigation_(true), was_discarded_(false), - ui_start_time_(0), is_external_request_(false), cors_preflight_policy_( network::mojom::CORSPreflightPolicy::kConsiderPreflight), - input_perf_metric_report_policy_( - InputToLoadPerfMetricReportPolicy::kNoReport), redirect_status_(RedirectStatus::kNoRedirect) {} ResourceRequest::ResourceRequest(CrossThreadResourceRequestData* data) @@ -119,10 +116,8 @@ referrer_policy_ = data->referrer_policy_; did_set_http_referrer_ = data->did_set_http_referrer_; check_for_browser_side_navigation_ = data->check_for_browser_side_navigation_; - ui_start_time_ = data->ui_start_time_; is_external_request_ = data->is_external_request_; cors_preflight_policy_ = data->cors_preflight_policy_; - input_perf_metric_report_policy_ = data->input_perf_metric_report_policy_; redirect_status_ = data->redirect_status_; suggested_filename_ = data->suggested_filename_; is_ad_resource_ = data->is_ad_resource_; @@ -216,10 +211,8 @@ data->referrer_policy_ = referrer_policy_; data->did_set_http_referrer_ = did_set_http_referrer_; data->check_for_browser_side_navigation_ = check_for_browser_side_navigation_; - data->ui_start_time_ = ui_start_time_; data->is_external_request_ = is_external_request_; data->cors_preflight_policy_ = cors_preflight_policy_; - data->input_perf_metric_report_policy_ = input_perf_metric_report_policy_; data->redirect_status_ = redirect_status_; data->suggested_filename_ = suggested_filename_; data->is_ad_resource_ = is_ad_resource_;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request.h b/third_party/blink/renderer/platform/loader/fetch/resource_request.h index f358fd5..1a05755f 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_request.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_request.h
@@ -52,12 +52,6 @@ namespace blink { -enum InputToLoadPerfMetricReportPolicy : uint8_t { - kNoReport, // Don't report metrics for this ResourceRequest. - kReportLink, // Report metrics for this request as initiated by a link click. - kReportIntent, // Report metrics for this request as initiated by an intent. -}; - struct CrossThreadResourceRequestData; // A ResourceRequest is a "request" object for ResourceLoader. Conceptually @@ -325,11 +319,6 @@ bool WasDiscarded() const { return was_discarded_; } void SetWasDiscarded(bool was_discarded) { was_discarded_ = was_discarded; } - double UiStartTime() const { return ui_start_time_; } - void SetUIStartTime(double ui_start_time_seconds) { - ui_start_time_ = ui_start_time_seconds; - } - // https://wicg.github.io/cors-rfc1918/#external-request bool IsExternalRequest() const { return is_external_request_; } void SetExternalRequestStateFromRequestorAddressSpace(mojom::IPAddressSpace); @@ -341,14 +330,6 @@ cors_preflight_policy_ = policy; } - InputToLoadPerfMetricReportPolicy InputPerfMetricReportPolicy() const { - return input_perf_metric_report_policy_; - } - void SetInputPerfMetricReportPolicy( - InputToLoadPerfMetricReportPolicy input_perf_metric_report_policy) { - input_perf_metric_report_policy_ = input_perf_metric_report_policy; - } - void SetRedirectStatus(RedirectStatus status) { redirect_status_ = status; } RedirectStatus GetRedirectStatus() const { return redirect_status_; } @@ -440,10 +421,8 @@ bool did_set_http_referrer_; bool check_for_browser_side_navigation_; bool was_discarded_; - double ui_start_time_; bool is_external_request_; network::mojom::CORSPreflightPolicy cors_preflight_policy_; - InputToLoadPerfMetricReportPolicy input_perf_metric_report_policy_; RedirectStatus redirect_status_; base::Optional<String> suggested_filename_; @@ -509,10 +488,8 @@ ReferrerPolicy referrer_policy_; bool did_set_http_referrer_; bool check_for_browser_side_navigation_; - double ui_start_time_; bool is_external_request_; network::mojom::CORSPreflightPolicy cors_preflight_policy_; - InputToLoadPerfMetricReportPolicy input_perf_metric_report_policy_; ResourceRequest::RedirectStatus redirect_status_; base::Optional<String> suggested_filename_; bool is_ad_resource_;
diff --git a/third_party/blink/renderer/platform/ukm_time_aggregator_test.cc b/third_party/blink/renderer/platform/ukm_time_aggregator_test.cc index d2c8e2a..c6f7f45 100644 --- a/third_party/blink/renderer/platform/ukm_time_aggregator_test.cc +++ b/third_party/blink/renderer/platform/ukm_time_aggregator_test.cc
@@ -6,6 +6,7 @@ #include "components/ukm/test_ukm_recorder.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/platform/testing/wtf/scoped_mock_clock.h" namespace blink { namespace { @@ -19,34 +20,22 @@ const char* kMetric2Average = "Paint.Average"; const char* kMetric2WorstCase = "Paint.WorstCase"; -struct Timer { - static double GetTime() { return fake_time; } - static double fake_time; -}; - -double Timer::fake_time = 0; - TEST(UkmTimeAggregatorTest, EmptyEventsNotRecorded) { - Timer::fake_time = 0; - auto original_time_function = SetTimeFunctionsForTesting(&Timer::GetTime); - + WTF::ScopedMockClock clock; ukm::TestUkmRecorder recorder; int64_t source_id = ukm::UkmRecorder::GetNewSourceID(); std::unique_ptr<UkmTimeAggregator> aggregator( new UkmTimeAggregator(kEvent, source_id, &recorder, {kMetric1, kMetric2}, TimeDelta::FromSeconds(1))); - Timer::fake_time += 10.; + clock.Advance(TimeDelta::FromSeconds(10)); aggregator.reset(); EXPECT_EQ(recorder.sources_count(), 0u); EXPECT_EQ(recorder.entries_count(), 0u); - SetTimeFunctionsForTesting(original_time_function); } TEST(UkmTimeAggregatorTest, EventsRecordedPerSecond) { - Timer::fake_time = 0; - auto original_time_function = SetTimeFunctionsForTesting(&Timer::GetTime); - + WTF::ScopedMockClock clock; ukm::TestUkmRecorder recorder; int64_t source_id = ukm::UkmRecorder::GetNewSourceID(); std::unique_ptr<UkmTimeAggregator> aggregator( @@ -57,7 +46,7 @@ // ..., 8-9 seconds. for (int i = 0; i < 100; ++i) { auto timer = aggregator->GetScopedTimer(i % 2); - Timer::fake_time += 0.099; + clock.Advance(TimeDelta::FromMilliseconds(99)); } EXPECT_EQ(recorder.entries_count(), 9u); @@ -91,14 +80,10 @@ ukm::TestUkmRecorder::GetEntryMetric(entry, kMetric2WorstCase); EXPECT_NEAR(*metric2_worst / 1e6, 0.099, 0.0001); } - - SetTimeFunctionsForTesting(original_time_function); } TEST(UkmTimeAggregatorTest, EventsAveragedCorrectly) { - Timer::fake_time = 0; - auto original_time_function = SetTimeFunctionsForTesting(&Timer::GetTime); - + WTF::ScopedMockClock clock; ukm::TestUkmRecorder recorder; int64_t source_id = ukm::UkmRecorder::GetNewSourceID(); std::unique_ptr<UkmTimeAggregator> aggregator( @@ -107,17 +92,17 @@ // 1, 2, and 3 seconds. for (int i = 1; i <= 3; ++i) { auto timer = aggregator->GetScopedTimer(0); - Timer::fake_time += i; + clock.Advance(TimeDelta::FromSeconds(i)); } // 3, 3, 3, and then 1 outside of the loop. for (int i = 0; i < 3; ++i) { auto timer = aggregator->GetScopedTimer(1); - Timer::fake_time += 3.; + clock.Advance(TimeDelta::FromSeconds(3)); } { auto timer = aggregator->GetScopedTimer(1); - Timer::fake_time += 1.; + clock.Advance(TimeDelta::FromSeconds(1)); } aggregator.reset(); @@ -148,8 +133,6 @@ ukm::TestUkmRecorder::GetEntryMetric(entry, kMetric2WorstCase); // metric1 (3, 3, 3, 1) worst case is 3 EXPECT_NEAR(*metric2_worst / 1e6, 3.0, 0.0001); - - SetTimeFunctionsForTesting(original_time_function); } } // namespace
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index eea790b..218a66d9 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-9-1-56 -Revision: 8f1ed54877ffab4fc2cf2be329446c748a885842 +Version: VER-2-9-1-97 +Revision: 7915fd51f123d0adbe6a0b9ad19eb941e1733c87 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses" License File: src/docs/FTL.TXT
diff --git a/third_party/freetype/include/freetype-custom-config/ftconfig.h b/third_party/freetype/include/freetype-custom-config/ftconfig.h index 09199c1..3b6bbaf 100644 --- a/third_party/freetype/include/freetype-custom-config/ftconfig.h +++ b/third_party/freetype/include/freetype-custom-config/ftconfig.h
@@ -151,33 +151,33 @@ #endif - /*************************************************************************/ - /* */ - /* <Section> */ - /* basic_types */ - /* */ - /*************************************************************************/ + /************************************************************************** + * + * @section: + * basic_types + * + */ - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int16 */ - /* */ - /* <Description> */ - /* A typedef for a 16bit signed integer type. */ - /* */ + /************************************************************************** + * + * @type: + * FT_Int16 + * + * @description: + * A typedef for a 16bit signed integer type. + */ typedef signed short FT_Int16; - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt16 */ - /* */ - /* <Description> */ - /* A typedef for a 16bit unsigned integer type. */ - /* */ + /************************************************************************** + * + * @type: + * FT_UInt16 + * + * @description: + * A typedef for a 16bit unsigned integer type. + */ typedef unsigned short FT_UInt16; /* */ @@ -186,50 +186,50 @@ /* this #if 0 ... #endif clause is for documentation purposes */ #if 0 - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int32 */ - /* */ - /* <Description> */ - /* A typedef for a 32bit signed integer type. The size depends on */ - /* the configuration. */ - /* */ + /************************************************************************** + * + * @type: + * FT_Int32 + * + * @description: + * A typedef for a 32bit signed integer type. The size depends on + * the configuration. + */ typedef signed XXX FT_Int32; - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt32 */ - /* */ - /* A typedef for a 32bit unsigned integer type. The size depends on */ - /* the configuration. */ - /* */ + /************************************************************************** + * + * @type: + * FT_UInt32 + * + * A typedef for a 32bit unsigned integer type. The size depends on + * the configuration. + */ typedef unsigned XXX FT_UInt32; - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_Int64 */ - /* */ - /* A typedef for a 64bit signed integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ + /************************************************************************** + * + * @type: + * FT_Int64 + * + * A typedef for a 64bit signed integer type. The size depends on + * the configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ typedef signed XXX FT_Int64; - /*************************************************************************/ - /* */ - /* <Type> */ - /* FT_UInt64 */ - /* */ - /* A typedef for a 64bit unsigned integer type. The size depends on */ - /* the configuration. Only defined if there is real 64bit support; */ - /* otherwise, it gets emulated with a structure (if necessary). */ - /* */ + /************************************************************************** + * + * @type: + * FT_UInt64 + * + * A typedef for a 64bit unsigned integer type. The size depends on + * the configuration. Only defined if there is real 64bit support; + * otherwise, it gets emulated with a structure (if necessary). + */ typedef unsigned XXX FT_UInt64; /* */
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index 616adce..ecc795ec 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -80,12 +80,6 @@ if 'LLVM_REPO_URL' in os.environ: LLVM_REPO_URL = os.environ['LLVM_REPO_URL'] -# Bump after VC updates. -DIA_DLL = { - '2013': 'msdia120.dll', - '2015': 'msdia140.dll', - '2017': 'msdia140.dll', -} def DownloadUrl(url, output_file): @@ -372,14 +366,21 @@ win_sdk_dir = None -msvs_version = None +dia_dll = None def GetWinSDKDir(): - """Get the location of the current SDK. Sets msvs_version as a side-effect.""" + """Get the location of the current SDK. Sets dia_dll as a side-effect.""" global win_sdk_dir - global msvs_version + global dia_dll if win_sdk_dir: return win_sdk_dir + # Bump after VC updates. + DIA_DLL = { + '2013': 'msdia120.dll', + '2015': 'msdia140.dll', + '2017': 'msdia140.dll', + } + # Don't let vs_toolchain overwrite our environment. environ_bak = os.environ @@ -388,14 +389,21 @@ win_sdk_dir = vs_toolchain.SetEnvironmentAndGetSDKDir() msvs_version = vs_toolchain.GetVisualStudioVersion() + if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))): + dia_path = os.path.join(win_sdk_dir, '..', 'DIA SDK', 'bin', 'amd64') + else: + vs_path = vs_toolchain.DetectVisualStudioPath() + dia_path = os.path.join(vs_path, 'DIA SDK', 'bin', 'amd64') + + dia_dll = os.path.join(dia_path, DIA_DLL[msvs_version]) + os.environ = environ_bak return win_sdk_dir def CopyDiaDllTo(target_dir): # This script always wants to use the 64-bit msdia*.dll. - dia_path = os.path.join(GetWinSDKDir(), '..', 'DIA SDK', 'bin', 'amd64') - dia_dll = os.path.join(dia_path, DIA_DLL[msvs_version]) + GetWinSDKDir() CopyFile(dia_dll, target_dir)
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index c3533689..a93f81d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -7209,6 +7209,21 @@ <int value="12" label="CONTEXT_LOST_INVALID_GPU_MESSAGE"/> </enum> +<enum name="ContextMenuDelayedElementDetails"> + <summary> + Used to record resulting action when the gesture recognizer recognizes a + long press before the DOM element details are available. + </summary> + <int value="0" label="Show"> + Recorded when the context menu is shown once the DOM element details become + available. + </int> + <int value="1" label="Cancel"> + Recorded when the context menu display is cancelled before the DOM element + details are available. + </int> +</enum> + <enum name="ContextMenuDOMElementFrame"> <summary>The frame that the element was found in.</summary> <int value="0" label="Main frame">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 77b23b5e1..594a41a 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -13400,6 +13400,26 @@ </summary> </histogram> +<histogram name="ContextMenu.CancelSystemTouches" enum="BooleanHit"> + <owner>michaeldo@chromium.org</owner> + <summary> + Logs true when the system touches are cancelled in order to show the Context + Menu instead of performing a default system action. Only logged on iOS. + </summary> +</histogram> + +<histogram name="ContextMenu.DelayedElementDetails" + enum="ContextMenuDelayedElementDetails"> + <owner>michaeldo@chromium.org</owner> + <summary> + Logged when DOM element details are not yet available when the user + completes a long press. Also logs if the context menu was shown once the + element details became available or if the display was cancelled. This + ensures that all context menu gestures are eventually processed. Only logged + on iOS. + </summary> +</histogram> + <histogram name="ContextMenu.DOMElementFetchDuration" units="ms"> <owner>michaeldo@chromium.org</owner> <summary> @@ -13458,6 +13478,15 @@ </summary> </histogram> +<histogram name="ContextMenu.WaitingForElementDetails" enum="BooleanHit"> + <owner>michaeldo@chromium.org</owner> + <summary> + Logs true when the context menu gesture recognizer fully recognizes a long + press, but is still waiting on the DOM element details before the context + menu can be shown. Only logged on iOS. + </summary> +</histogram> + <histogram name="ContextualSuggestions.EnabledState" enum="BooleanEnabled"> <owner>huayinz@chromium.org</owner> <owner>twellington@chromium.org</owner> @@ -45770,6 +45799,14 @@ </summary> </histogram> +<histogram name="NativeSmbFileShare.ReadDirectoryDuration" units="ms"> + <owner>zentaro@chromium.org</owner> + <summary> + The duration of ReadDirectory call to SmbProvider in milliseconds. This is + recorded after the D-Bus call returns. + </summary> +</histogram> + <histogram name="NativeSmbFileShare.RemountResult" enum="NativeSmbFileShare_MountResult"> <owner>zentaro@chromium.org</owner> @@ -46250,30 +46287,45 @@ </histogram> <histogram name="Navigation.UI_OnCommitProvisionalLoad.Intent" units="ms"> + <obsolete> + Deprecated 06/2018 in favor of PageLoad metrics. + </obsolete> <owner>clamy@chromium.org</owner> <summary> - Time between receiving an Android Intent and the navigation commit. + Obsolete. Time between receiving an Android Intent and the navigation + commit. </summary> </histogram> <histogram name="Navigation.UI_OnCommitProvisionalLoad.Link" units="ms"> + <obsolete> + Deprecated 06/2018 in favor of PageLoad metrics. + </obsolete> <owner>clamy@chromium.org</owner> - <summary>Time between clicking on a link and the navigation commit.</summary> + <summary> + Obsolete. Time between clicking on a link and the navigation commit. + </summary> </histogram> <histogram name="Navigation.UI_OnLoadComplete.Intent" units="ms"> + <obsolete> + Deprecated 06/2018 in favor of PageLoad metrics. + </obsolete> <owner>clamy@chromium.org</owner> <summary> - Time between receiving an Android intent and the document load complete - event for a navigation in the main frame. + Obsolete. Time between receiving an Android intent and the document load + complete event for a navigation in the main frame. </summary> </histogram> <histogram name="Navigation.UI_OnLoadComplete.Link" units="ms"> + <obsolete> + Deprecated 06/2018 in favor of PageLoad metrics. + </obsolete> <owner>clamy@chromium.org</owner> <summary> - Time between clicking on a link and the document load complete event for a - navigation in the main frame. + Obsolete. Time between clicking on a link and the document load complete + event for a navigation in the main frame. </summary> </histogram> @@ -98186,7 +98238,10 @@ </histogram> <histogram name="Sync.SesssionsDuplicateSyncId" units="count"> - <owner>skym@chromium.org</owner> + <obsolete> + Deprecated in M69. + </obsolete> + <owner>mastiz@chromium.org</owner> <summary> https://crbug.com/639009, count of duplicate sync ids (tab node id) when any are encountered. Likely caused from a persistence race between native tab
diff --git a/tools/perf/contrib/cros_benchmarks/page_cycler_v2.py b/tools/perf/contrib/cros_benchmarks/page_cycler_v2.py index 34ff057..0d33b1e7 100644 --- a/tools/perf/contrib/cros_benchmarks/page_cycler_v2.py +++ b/tools/perf/contrib/cros_benchmarks/page_cycler_v2.py
@@ -13,7 +13,6 @@ from benchmarks import loading_metrics_category from telemetry import benchmark -from telemetry.page import cache_temperature from telemetry.web_perf import timeline_based_measurement class _PageCyclerV2(perf_benchmark.PerfBenchmark): @@ -38,9 +37,7 @@ return 'page_cycler_v2.typical_25' def CreateStorySet(self, options): - return page_sets.Typical25PageSet(run_no_page_interactions=True, - cache_temperatures=[ - cache_temperature.COLD, cache_temperature.WARM]) + return page_sets.Typical25PageSet() @benchmark.Owner(emails=['kouhei@chromium.org', 'ksakamoto@chromium.org']) @@ -56,8 +53,7 @@ return 'page_cycler_v2.intl_ar_fa_he' def CreateStorySet(self, options): - return page_sets.IntlArFaHePageSet(cache_temperatures=[ - cache_temperature.COLD, cache_temperature.WARM]) + return page_sets.IntlArFaHePageSet() @benchmark.Owner(emails=['kouhei@chromium.org', 'ksakamoto@chromium.org']) @@ -73,8 +69,7 @@ return 'page_cycler_v2.intl_es_fr_pt-BR' def CreateStorySet(self, options): - return page_sets.IntlEsFrPtBrPageSet(cache_temperatures=[ - cache_temperature.COLD, cache_temperature.WARM]) + return page_sets.IntlEsFrPtBrPageSet() @benchmark.Owner(emails=['kouhei@chromium.org', 'ksakamoto@chromium.org']) @@ -90,8 +85,7 @@ return 'page_cycler_v2.intl_hi_ru' def CreateStorySet(self, options): - return page_sets.IntlHiRuPageSet(cache_temperatures=[ - cache_temperature.COLD, cache_temperature.WARM]) + return page_sets.IntlHiRuPageSet() @benchmark.Owner(emails=['kouhei@chromium.org', 'ksakamoto@chromium.org']) @@ -106,8 +100,7 @@ return 'page_cycler_v2.intl_ja_zh' def CreateStorySet(self, options): - return page_sets.IntlJaZhPageSet(cache_temperatures=[ - cache_temperature.COLD, cache_temperature.WARM]) + return page_sets.IntlJaZhPageSet() @benchmark.Owner(emails=['kouhei@chromium.org', 'ksakamoto@chromium.org']) @@ -123,5 +116,4 @@ return 'page_cycler_v2.intl_ko_th_vi' def CreateStorySet(self, options): - return page_sets.IntlKoThViPageSet(cache_temperatures=[ - cache_temperature.COLD, cache_temperature.WARM]) + return page_sets.IntlKoThViPageSet()
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index a47ff25f..b65e63b 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -1020,7 +1020,7 @@ { 'isolate': 'performance_webview_test_suite', 'extra_args': [ - '--test-shard-map-filename=mobile_7_shard_map.json', + '--test-shard-map-filename=pixel2_webview_7_shard_map.json', ], 'num_shards': 7 } @@ -1042,7 +1042,7 @@ 'isolate': 'performance_test_suite', 'extra_args': [ '--run-ref-build', - '--test-shard-map-filename=mobile_7_shard_map.json', + '--test-shard-map-filename=pixel2_7_shard_map.json', ], 'num_shards': 7 } @@ -1071,7 +1071,7 @@ 'num_shards': 26, 'extra_args': [ '--run-ref-build', - '--test-shard-map-filename=benchmark_desktop_bot_map.json', + '--test-shard-map-filename=mac_1012_low_end_26_shard_map.json', ], }, { @@ -1101,7 +1101,7 @@ 'num_shards': 26, 'extra_args': [ '--run-ref-build', - '--test-shard-map-filename=benchmark_desktop_bot_map.json', + '--test-shard-map-filename=linux_perf_shard_map.json', ], }, { @@ -1139,7 +1139,7 @@ 'isolate': 'performance_test_suite', 'extra_args': [ '--run-ref-build', - '--test-shard-map-filename=benchmark_desktop_bot_map.json', + '--test-shard-map-filename=mac_1013_high_end_26_shard_map.json', ], 'num_shards': 26 },
diff --git a/tools/perf/core/shard_maps/desktop_benchmark_avg_times.json b/tools/perf/core/shard_maps/desktop_benchmark_avg_times.json deleted file mode 100644 index 0681a97..0000000 --- a/tools/perf/core/shard_maps/desktop_benchmark_avg_times.json +++ /dev/null
@@ -1,5270 +0,0 @@ -[ - { - "avg_duration": "5.302031819047618E-4", - "name": "battor.steady_state/http://abcnews.go.com/" - }, - { - "avg_duration": "53.98835522222223", - "name": "battor.steady_state/http://www.indiatimes.com" - }, - { - "avg_duration": "54.39300617171719", - "name": "battor.steady_state/http://www.microsoft.com" - }, - { - "avg_duration": "56.97899307070704", - "name": "battor.steady_state/http://www.sina.com.cn" - }, - { - "avg_duration": "60.737736949494945", - "name": "battor.steady_state/http://www.slideshare.net/patrickmeenan" - }, - { - "avg_duration": "66.46961935353536", - "name": "battor.steady_state/http://www.uol.com.br" - }, - { - "avg_duration": "56.18560269696972", - "name": "battor.steady_state/https://instagram.com/cnn/" - }, - { - "avg_duration": "81.35751621212121", - "name": "battor.trivial_pages/TrivialAnimationPageSharedPageState" - }, - { - "avg_duration": "78.61233286868686", - "name": "battor.trivial_pages/TrivialBlinkingCursorPageSharedPageState" - }, - { - "avg_duration": "80.04742334343432", - "name": "battor.trivial_pages/TrivialBlurAnimationPageSharedPageState" - }, - { - "avg_duration": "84.9719728787879", - "name": "battor.trivial_pages/TrivialCanvasPageSharedPageState" - }, - { - "avg_duration": "79.85430667676768", - "name": "battor.trivial_pages/TrivialFullscreenVideoPageSharedPageState" - }, - { - "avg_duration": "78.05467134343439", - "name": "battor.trivial_pages/TrivialGifPageSharedPageState" - }, - { - "avg_duration": "80.37248601010101", - "name": "battor.trivial_pages/TrivialScrollingPageSharedPageState" - }, - { - "avg_duration": "80.72836950505052", - "name": "battor.trivial_pages/TrivialWebGLPageSharedPageState" - }, - { - "avg_duration": "16.773022914141414", - "name": "blink_perf.bindings/append-child.html" - }, - { - "avg_duration": "8.716282465656565", - "name": "blink_perf.bindings/create-element.html" - }, - { - "avg_duration": "8.118593769696972", - "name": "blink_perf.bindings/document-implementation.html" - }, - { - "avg_duration": "8.06025010808081", - "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" - }, - { - "avg_duration": "8.125574681818179", - "name": "blink_perf.bindings/first-child.html" - }, - { - "avg_duration": "4.937952378787881", - "name": "blink_perf.bindings/gc-forest.html" - }, - { - "avg_duration": "5.583934774747474", - "name": "blink_perf.bindings/gc-mini-tree.html" - }, - { - "avg_duration": "16.874073318181818", - "name": "blink_perf.bindings/gc-tree.html" - }, - { - "avg_duration": "7.999108751515151", - "name": "blink_perf.bindings/get-attribute-rare.html" - }, - { - "avg_duration": "7.984979027272734", - "name": "blink_perf.bindings/get-attribute.html" - }, - { - "avg_duration": "8.006428053535357", - "name": "blink_perf.bindings/get-element-by-id.html" - }, - { - "avg_duration": "8.041794737373735", - "name": "blink_perf.bindings/get-elements-by-tag-name.html" - }, - { - "avg_duration": "8.86276114848485", - "name": "blink_perf.bindings/id-getter.html" - }, - { - "avg_duration": "8.738682066666664", - "name": "blink_perf.bindings/id-setter.html" - }, - { - "avg_duration": "8.287429955555558", - "name": "blink_perf.bindings/indexed-getter.html" - }, - { - "avg_duration": "8.004031334343434", - "name": "blink_perf.bindings/insert-before.html" - }, - { - "avg_duration": "7.981697240404043", - "name": "blink_perf.bindings/named-property-enumerator.html" - }, - { - "avg_duration": "22.758668151515163", - "name": "blink_perf.bindings/node-list-access.html" - }, - { - "avg_duration": "8.082139729292928", - "name": "blink_perf.bindings/node-type.html" - }, - { - "avg_duration": "2.942233206060606", - "name": "blink_perf.bindings/post-message.html" - }, - { - "avg_duration": "8.095300461616164", - "name": "blink_perf.bindings/sequence-conversion-array.html" - }, - { - "avg_duration": "9.4018578010101", - "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" - }, - { - "avg_duration": "2.9943871717171704", - "name": "blink_perf.bindings/serialize-array.html" - }, - { - "avg_duration": "2.7931550505050495", - "name": "blink_perf.bindings/serialize-long-string.html" - }, - { - "avg_duration": "4.213973845454545", - "name": "blink_perf.bindings/serialize-map.html" - }, - { - "avg_duration": "2.9242801070707065", - "name": "blink_perf.bindings/serialize-nested-array.html" - }, - { - "avg_duration": "8.303823129292928", - "name": "blink_perf.bindings/set-attribute-rare.html" - }, - { - "avg_duration": "8.094254244444445", - "name": "blink_perf.bindings/set-attribute.html" - }, - { - "avg_duration": "7.870054220202021", - "name": "blink_perf.bindings/structured-clone-json-deserialize.html" - }, - { - "avg_duration": "7.9102691303030275", - "name": "blink_perf.bindings/structured-clone-json-serialize.html" - }, - { - "avg_duration": "4.678272586868685", - "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" - }, - { - "avg_duration": "4.705334503030302", - "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" - }, - { - "avg_duration": "8.444386767676768", - "name": "blink_perf.bindings/typed-array-construct-from-array.html" - }, - { - "avg_duration": "8.178032686868688", - "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" - }, - { - "avg_duration": "8.147242687878789", - "name": "blink_perf.bindings/typed-array-construct-from-typed.html" - }, - { - "avg_duration": "8.16015957979798", - "name": "blink_perf.bindings/typed-array-set-from-typed.html" - }, - { - "avg_duration": "8.081441251515157", - "name": "blink_perf.bindings/undefined-first-child.html" - }, - { - "avg_duration": "8.015433060606062", - "name": "blink_perf.bindings/undefined-get-element-by-id.html" - }, - { - "avg_duration": "8.142836812121214", - "name": "blink_perf.bindings/undefined-id-getter.html" - }, - { - "avg_duration": "14.236904306060609", - "name": "blink_perf.canvas/createImageBitmapFromImageData.html" - }, - { - "avg_duration": "4.995624249494951", - "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "8.894809848484847", - "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "2.8643702919191933", - "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" - }, - { - "avg_duration": "4.585784591919192", - "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "3.466747397979797", - "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "4.826577683838384", - "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "7.55687335151515", - "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" - }, - { - "avg_duration": "7.335447341414141", - "name": "blink_perf.canvas/drawimage.html" - }, - { - "avg_duration": "7.64779133838384", - "name": "blink_perf.canvas/getImageData.html" - }, - { - "avg_duration": "8.800404815151513", - "name": "blink_perf.canvas/getImageDataColorManaged.html" - }, - { - "avg_duration": "7.401786830303029", - "name": "blink_perf.canvas/putImageData.html" - }, - { - "avg_duration": "4.612158217171714", - "name": "blink_perf.canvas/toBlob_duration.html" - }, - { - "avg_duration": "3.2985377838383854", - "name": "blink_perf.canvas/toBlob_duration_jpeg.html" - }, - { - "avg_duration": "3.3772829252525245", - "name": "blink_perf.canvas/transferFromImageBitmap.html" - }, - { - "avg_duration": "4.161765300000004", - "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" - }, - { - "avg_duration": "8.860451266666667", - "name": "blink_perf.canvas/upload-video-to-sub-texture.html" - }, - { - "avg_duration": "4.039678795959598", - "name": "blink_perf.canvas/upload-video-to-texture.html" - }, - { - "avg_duration": "4.166316069696968", - "name": "blink_perf.canvas/upload-webgl-to-texture.html" - }, - { - "avg_duration": "20.776238691919197", - "name": "blink_perf.css/AttributeDescendantSelector.html" - }, - { - "avg_duration": "8.240761166666665", - "name": "blink_perf.css/CSSPropertySetterGetter.html" - }, - { - "avg_duration": "8.271032160606062", - "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" - }, - { - "avg_duration": "8.257586206060607", - "name": "blink_perf.css/CSSPropertyUpdateValue.html" - }, - { - "avg_duration": "8.48535281111111", - "name": "blink_perf.css/ChangeStyleChildClassSelector.html" - }, - { - "avg_duration": "8.490432706060604", - "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" - }, - { - "avg_duration": "8.383557843434344", - "name": "blink_perf.css/ChangeStyleElementSelector.html" - }, - { - "avg_duration": "8.380746948484845", - "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" - }, - { - "avg_duration": "8.350103655555555", - "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" - }, - { - "avg_duration": "8.376173821212122", - "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" - }, - { - "avg_duration": "8.400705159595956", - "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" - }, - { - "avg_duration": "8.376654993939393", - "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" - }, - { - "avg_duration": "8.428886806060607", - "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" - }, - { - "avg_duration": "8.382177380808082", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" - }, - { - "avg_duration": "8.409009067676765", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" - }, - { - "avg_duration": "9.466456000000003", - "name": "blink_perf.css/ChangeStyleShallowTree.html" - }, - { - "avg_duration": "8.336727115151515", - "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" - }, - { - "avg_duration": "8.338422672727269", - "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" - }, - { - "avg_duration": "8.354532946464644", - "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" - }, - { - "avg_duration": "8.36928337676768", - "name": "blink_perf.css/ChangeStyleUniversalSelector.html" - }, - { - "avg_duration": "8.34756862121212", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" - }, - { - "avg_duration": "9.197208310101006", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" - }, - { - "avg_duration": "11.975508757575763", - "name": "blink_perf.css/ClassDescendantSelector.html" - }, - { - "avg_duration": "8.877939627272724", - "name": "blink_perf.css/ClassInvalidation.html" - }, - { - "avg_duration": "10.871572898989902", - "name": "blink_perf.css/FocusUpdate.html" - }, - { - "avg_duration": "8.64706868888889", - "name": "blink_perf.css/LoadBootstrapBlog.html" - }, - { - "avg_duration": "8.765137048484847", - "name": "blink_perf.css/LoadMaterializeStarterPage.html" - }, - { - "avg_duration": "9.043712960606062", - "name": "blink_perf.css/LoadSemanticPageExample.html" - }, - { - "avg_duration": "8.154615455555554", - "name": "blink_perf.css/PseudoClassSelectors.html" - }, - { - "avg_duration": "9.077009935353534", - "name": "blink_perf.css/SelectorCountScaling.html" - }, - { - "avg_duration": "17.04508574747475", - "name": "blink_perf.dom/addRange.html" - }, - { - "avg_duration": "3.323301005050504", - "name": "blink_perf.dom/delete-in-password-field.html" - }, - { - "avg_duration": "9.185517664646467", - "name": "blink_perf.dom/div-editable.html" - }, - { - "avg_duration": "2.9128276228282837", - "name": "blink_perf.dom/inner_html_with_selection.html" - }, - { - "avg_duration": "15.81343821717171", - "name": "blink_perf.dom/long-sibling-list.html" - }, - { - "avg_duration": "3.7322596313131315", - "name": "blink_perf.dom/modify-element-classname.html" - }, - { - "avg_duration": "3.2765141404040414", - "name": "blink_perf.dom/modify-element-id.html" - }, - { - "avg_duration": "3.266949967676767", - "name": "blink_perf.dom/modify-element-title.html" - }, - { - "avg_duration": "3.008963382828284", - "name": "blink_perf.dom/move-down-with-hidden-elements.html" - }, - { - "avg_duration": "2.978461224242425", - "name": "blink_perf.dom/move-up-with-hidden-elements.html" - }, - { - "avg_duration": "3.6961337717171703", - "name": "blink_perf.dom/remove_child_with_selection.html" - }, - { - "avg_duration": "8.565711615151514", - "name": "blink_perf.dom/select-multiple-add.html" - }, - { - "avg_duration": "8.455364243434342", - "name": "blink_perf.dom/select-single-add.html" - }, - { - "avg_duration": "8.631446456565657", - "name": "blink_perf.dom/select-single-remove.html" - }, - { - "avg_duration": "8.447328528282831", - "name": "blink_perf.dom/textarea-dom.html" - }, - { - "avg_duration": "8.302876743434343", - "name": "blink_perf.dom/textarea-edit.html" - }, - { - "avg_duration": "14.758635984848487", - "name": "blink_perf.events/EventsDispatching.html" - }, - { - "avg_duration": "9.41202722525253", - "name": "blink_perf.events/EventsDispatchingInDeeplyNestedShadowTrees.html" - }, - { - "avg_duration": "16.716974964646464", - "name": "blink_perf.events/EventsDispatchingInShadowTrees.html" - }, - { - "avg_duration": "12.02576745959596", - "name": "blink_perf.events/hit-test-lots-of-layers.html" - }, - { - "avg_duration": "27.46352823232325", - "name": "blink_perf.image_decoder/decode-gif.html" - }, - { - "avg_duration": "11.39665317171717", - "name": "blink_perf.image_decoder/decode-jpeg.html" - }, - { - "avg_duration": "15.983880969696973", - "name": "blink_perf.image_decoder/decode-lossless-webp.html" - }, - { - "avg_duration": "9.576698281818182", - "name": "blink_perf.image_decoder/decode-lossy-webp.html" - }, - { - "avg_duration": "12.270531040404038", - "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" - }, - { - "avg_duration": "10.38577244949495", - "name": "blink_perf.image_decoder/decode-png-palette.html" - }, - { - "avg_duration": "15.558344636363634", - "name": "blink_perf.image_decoder/decode-png.html" - }, - { - "avg_duration": "9.612785195959596", - "name": "blink_perf.layout/ArabicLineLayout.html" - }, - { - "avg_duration": "2.9082444868686865", - "name": "blink_perf.layout/Shapes/MultipleShapes.html" - }, - { - "avg_duration": "8.161499794949492", - "name": "blink_perf.layout/SimpleTextPathLineLayout.html" - }, - { - "avg_duration": "17.201968555555545", - "name": "blink_perf.layout/add-remove-inline-floats.html" - }, - { - "avg_duration": "8.496584162626267", - "name": "blink_perf.layout/attach-inlines-2.html" - }, - { - "avg_duration": "8.224137477777774", - "name": "blink_perf.layout/attach-inlines.html" - }, - { - "avg_duration": "9.055423787878793", - "name": "blink_perf.layout/auto-grid-lots-of-data.html" - }, - { - "avg_duration": "8.581141229292934", - "name": "blink_perf.layout/chapter-reflow-once-random.html" - }, - { - "avg_duration": "10.400743852525254", - "name": "blink_perf.layout/chapter-reflow-once.html" - }, - { - "avg_duration": "8.565095359595965", - "name": "blink_perf.layout/chapter-reflow-thrice.html" - }, - { - "avg_duration": "8.884877741414144", - "name": "blink_perf.layout/chapter-reflow-twice.html" - }, - { - "avg_duration": "8.477073050505053", - "name": "blink_perf.layout/chapter-reflow.html" - }, - { - "avg_duration": "4.3225059303030315", - "name": "blink_perf.layout/character_fallback.html" - }, - { - "avg_duration": "2.8864314454545426", - "name": "blink_perf.layout/character_fallback_aat.html" - }, - { - "avg_duration": "9.1291994040404", - "name": "blink_perf.layout/fixed-grid-lots-of-data.html" - }, - { - "avg_duration": "9.097260567676772", - "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" - }, - { - "avg_duration": "8.17292342525253", - "name": "blink_perf.layout/flexbox-column-nowrap.html" - }, - { - "avg_duration": "8.164697651515151", - "name": "blink_perf.layout/flexbox-column-wrap.html" - }, - { - "avg_duration": "8.172700752525252", - "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" - }, - { - "avg_duration": "9.922518389898988", - "name": "blink_perf.layout/flexbox-lots-of-data.html" - }, - { - "avg_duration": "8.144036452525254", - "name": "blink_perf.layout/flexbox-row-nowrap.html" - }, - { - "avg_duration": "8.173872342424245", - "name": "blink_perf.layout/flexbox-row-wrap.html" - }, - { - "avg_duration": "9.064281669696966", - "name": "blink_perf.layout/flexbox-with-stretch-layout.html" - }, - { - "avg_duration": "8.358032324242425", - "name": "blink_perf.layout/floats_100_100.html" - }, - { - "avg_duration": "8.403397812121213", - "name": "blink_perf.layout/floats_100_100_nested.html" - }, - { - "avg_duration": "6.08735914848485", - "name": "blink_perf.layout/floats_10_1000.html" - }, - { - "avg_duration": "4.319120286868686", - "name": "blink_perf.layout/floats_20_100.html" - }, - { - "avg_duration": "4.793291721212119", - "name": "blink_perf.layout/floats_20_100_nested.html" - }, - { - "avg_duration": "3.5669449060606055", - "name": "blink_perf.layout/floats_2_100.html" - }, - { - "avg_duration": "3.5200132010101015", - "name": "blink_perf.layout/floats_2_100_nested.html" - }, - { - "avg_duration": "5.007788923232323", - "name": "blink_perf.layout/floats_50_100.html" - }, - { - "avg_duration": "5.129166725252525", - "name": "blink_perf.layout/floats_50_100_nested.html" - }, - { - "avg_duration": "9.949663414141419", - "name": "blink_perf.layout/hindi-line-layout.html" - }, - { - "avg_duration": "8.026973660606064", - "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" - }, - { - "avg_duration": "8.00178643232323", - "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" - }, - { - "avg_duration": "7.955311985858583", - "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" - }, - { - "avg_duration": "3.0793970929292938", - "name": "blink_perf.layout/latin-complex-text.html" - }, - { - "avg_duration": "3.282991826262625", - "name": "blink_perf.layout/layers_overlap_2d.html" - }, - { - "avg_duration": "3.3675922222222217", - "name": "blink_perf.layout/layers_overlap_3d.html" - }, - { - "avg_duration": "7.887447313131314", - "name": "blink_perf.layout/line-layout-line-height.html" - }, - { - "avg_duration": "8.161259202020203", - "name": "blink_perf.layout/line-layout-repeat-append.html" - }, - { - "avg_duration": "7.925117391919194", - "name": "blink_perf.layout/line-layout.html" - }, - { - "avg_duration": "2.984637953535355", - "name": "blink_perf.layout/long-line-nowrap-collapse.html" - }, - { - "avg_duration": "3.008405839393939", - "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" - }, - { - "avg_duration": "4.863557156565656", - "name": "blink_perf.layout/long-line-nowrap.html" - }, - { - "avg_duration": "8.237180292929295", - "name": "blink_perf.layout/multicol/deeply-nested-tables.html" - }, - { - "avg_duration": "8.095231237373737", - "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" - }, - { - "avg_duration": "7.9935902212121235", - "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" - }, - { - "avg_duration": "8.13422524040404", - "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" - }, - { - "avg_duration": "7.9059005989898985", - "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" - }, - { - "avg_duration": "8.4439984969697", - "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" - }, - { - "avg_duration": "8.385950247474748", - "name": "blink_perf.layout/multicol/tall-content-short-columns.html" - }, - { - "avg_duration": "8.091126237373732", - "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" - }, - { - "avg_duration": "8.211111664646463", - "name": "blink_perf.layout/nested-grid.html" - }, - { - "avg_duration": "9.172431075757578", - "name": "blink_perf.layout/nested-percent-height-tables.html" - }, - { - "avg_duration": "42.900172999999995", - "name": "blink_perf.layout/subtree-detaching.html" - }, - { - "avg_duration": "3.7028767363636375", - "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" - }, - { - "avg_duration": "4.255294450505051", - "name": "blink_perf.layout/word-break-break-all.html" - }, - { - "avg_duration": "4.26417021111111", - "name": "blink_perf.layout/word-break-break-word.html" - }, - { - "avg_duration": "4.256407837373739", - "name": "blink_perf.layout/word-wrap-break-word.html" - }, - { - "avg_duration": "21.503413595959593", - "name": "blink_perf.owp_storage/blob-perf-files.html" - }, - { - "avg_duration": "11.512120666666672", - "name": "blink_perf.owp_storage/blob-perf-ipc.html" - }, - { - "avg_duration": "9.439906111111108", - "name": "blink_perf.owp_storage/blob-perf-shm.html" - }, - { - "avg_duration": "10.6695953989899", - "name": "blink_perf.owp_storage/blob-perf-tiny.html" - }, - { - "avg_duration": "12.670256156565653", - "name": "blink_perf.owp_storage/idb-load-docs.html" - }, - { - "avg_duration": "16.748638611111108", - "name": "blink_perf.paint/appending-text.html" - }, - { - "avg_duration": "14.907952484848483", - "name": "blink_perf.paint/color-changes.html" - }, - { - "avg_duration": "14.605819969696972", - "name": "blink_perf.paint/complex-content-slow-scroll.html" - }, - { - "avg_duration": "12.428782873737372", - "name": "blink_perf.paint/containment-resize.html" - }, - { - "avg_duration": "12.29746341414141", - "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" - }, - { - "avg_duration": "13.771671141414142", - "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" - }, - { - "avg_duration": "11.344751696969702", - "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" - }, - { - "avg_duration": "14.399643757575765", - "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" - }, - { - "avg_duration": "11.999382429292929", - "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" - }, - { - "avg_duration": "12.72212498989899", - "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" - }, - { - "avg_duration": "10.595035075757572", - "name": "blink_perf.paint/large-table-collapsed-border-change.html" - }, - { - "avg_duration": "13.825203333333329", - "name": "blink_perf.paint/large-table-repaint.html" - }, - { - "avg_duration": "10.318830171717167", - "name": "blink_perf.paint/move-text-with-mask.html" - }, - { - "avg_duration": "12.172590141414137", - "name": "blink_perf.paint/paint-offset-changes.html" - }, - { - "avg_duration": "16.04461566161616", - "name": "blink_perf.paint/transform-changes.html" - }, - { - "avg_duration": "17.179161292929287", - "name": "blink_perf.parser/css-parser-yui.html" - }, - { - "avg_duration": "8.56719642929293", - "name": "blink_perf.parser/html-parser-threaded.html" - }, - { - "avg_duration": "7.985291129292931", - "name": "blink_perf.parser/html-parser.html" - }, - { - "avg_duration": "27.350605393939386", - "name": "blink_perf.parser/html5-full-render.html" - }, - { - "avg_duration": "8.752782847474746", - "name": "blink_perf.parser/iframe-append-remove.html" - }, - { - "avg_duration": "8.543882695959596", - "name": "blink_perf.parser/innerHTML-setter-siblings.html" - }, - { - "avg_duration": "8.540866556565657", - "name": "blink_perf.parser/innerHTML-setter.html" - }, - { - "avg_duration": "8.476234859595962", - "name": "blink_perf.parser/query-selector-all-attribute-complex.html" - }, - { - "avg_duration": "8.425073442424242", - "name": "blink_perf.parser/query-selector-all-attribute.html" - }, - { - "avg_duration": "8.260514586868688", - "name": "blink_perf.parser/query-selector-all-class-deep.html" - }, - { - "avg_duration": "9.296937440404038", - "name": "blink_perf.parser/query-selector-all-class-first.html" - }, - { - "avg_duration": "8.291204864646469", - "name": "blink_perf.parser/query-selector-all-class-last.html" - }, - { - "avg_duration": "8.54160734848485", - "name": "blink_perf.parser/query-selector-all-class.html" - }, - { - "avg_duration": "8.264857709090911", - "name": "blink_perf.parser/query-selector-all-deep.html" - }, - { - "avg_duration": "9.222030328282834", - "name": "blink_perf.parser/query-selector-all-first.html" - }, - { - "avg_duration": "9.30724493131313", - "name": "blink_perf.parser/query-selector-all-id-deep.html" - }, - { - "avg_duration": "9.291835893939396", - "name": "blink_perf.parser/query-selector-all-id-first.html" - }, - { - "avg_duration": "9.480865242424244", - "name": "blink_perf.parser/query-selector-all-id-last.html" - }, - { - "avg_duration": "8.382565568686868", - "name": "blink_perf.parser/query-selector-all-last.html" - }, - { - "avg_duration": "8.21404118181818", - "name": "blink_perf.parser/query-selector-deep.html" - }, - { - "avg_duration": "8.128832775757573", - "name": "blink_perf.parser/query-selector-first.html" - }, - { - "avg_duration": "9.04393113131313", - "name": "blink_perf.parser/query-selector-id-deep.html" - }, - { - "avg_duration": "8.38492974141414", - "name": "blink_perf.parser/query-selector-id-last.html" - }, - { - "avg_duration": "8.395543107070704", - "name": "blink_perf.parser/query-selector-last.html" - }, - { - "avg_duration": "7.969514906060604", - "name": "blink_perf.parser/simple-url.html" - }, - { - "avg_duration": "8.617393844444447", - "name": "blink_perf.parser/textarea-parsing.html" - }, - { - "avg_duration": "8.36028874848485", - "name": "blink_perf.parser/tiny-innerHTML.html" - }, - { - "avg_duration": "9.126411107070707", - "name": "blink_perf.parser/url-parser.html" - }, - { - "avg_duration": "8.047724416161621", - "name": "blink_perf.parser/xml-parser.html" - }, - { - "avg_duration": "11.048984967676766", - "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" - }, - { - "avg_duration": "3.0641409", - "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" - }, - { - "avg_duration": "3.1729644636363643", - "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" - }, - { - "avg_duration": "2.7396156686868687", - "name": "blink_perf.shadow_dom/shadow-style-share.html" - }, - { - "avg_duration": "2.857006583838385", - "name": "blink_perf.shadow_dom/style-sheet-insert.html" - }, - { - "avg_duration": "2.6088636101010096", - "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" - }, - { - "avg_duration": "3.118839016161617", - "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" - }, - { - "avg_duration": "4.198366514141415", - "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" - }, - { - "avg_duration": "4.453216229292929", - "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" - }, - { - "avg_duration": "2.663110354545454", - "name": "blink_perf.shadow_dom/v0-content-reprojection.html" - }, - { - "avg_duration": "2.479458371717172", - "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" - }, - { - "avg_duration": "2.4826591505050506", - "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" - }, - { - "avg_duration": "2.6306750595959594", - "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" - }, - { - "avg_duration": "2.5741712929292926", - "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" - }, - { - "avg_duration": "13.282517075757575", - "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" - }, - { - "avg_duration": "2.3484554040404038", - "name": "blink_perf.shadow_dom/v1-distribution.html" - }, - { - "avg_duration": "2.37601325959596", - "name": "blink_perf.shadow_dom/v1-host-child-append.html" - }, - { - "avg_duration": "13.598006388888896", - "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" - }, - { - "avg_duration": "25.804457545454536", - "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" - }, - { - "avg_duration": "2.302250147474748", - "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" - }, - { - "avg_duration": "2.362692618181818", - "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" - }, - { - "avg_duration": "2.6838765161616163", - "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" - }, - { - "avg_duration": "2.5099529767676763", - "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" - }, - { - "avg_duration": "2.500188935353534", - "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" - }, - { - "avg_duration": "2.5474127989899005", - "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" - }, - { - "avg_duration": "2.394710485858586", - "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" - }, - { - "avg_duration": "2.458080154545454", - "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" - }, - { - "avg_duration": "2.464575471717172", - "name": "blink_perf.shadow_dom/v1-slot-append.html" - }, - { - "avg_duration": "3.5802945161616164", - "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" - }, - { - "avg_duration": "3.5385489676767676", - "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" - }, - { - "avg_duration": "2.332901873737375", - "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" - }, - { - "avg_duration": "2.438151573737374", - "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" - }, - { - "avg_duration": "10.736709205050506", - "name": "blink_perf.svg/AzLizardBenjiPark.html" - }, - { - "avg_duration": "4.553785876767679", - "name": "blink_perf.svg/Bamboo.html" - }, - { - "avg_duration": "3.2235910353535355", - "name": "blink_perf.svg/Cactus.html" - }, - { - "avg_duration": "3.231468716161616", - "name": "blink_perf.svg/Cowboy.html" - }, - { - "avg_duration": "4.396290931313131", - "name": "blink_perf.svg/Cowboy_transform.html" - }, - { - "avg_duration": "2.940060709090909", - "name": "blink_perf.svg/CrawFishGanson.html" - }, - { - "avg_duration": "3.0202295434343434", - "name": "blink_perf.svg/Debian.html" - }, - { - "avg_duration": "2.99058754949495", - "name": "blink_perf.svg/DropsOnABlade.html" - }, - { - "avg_duration": "3.1717513575757583", - "name": "blink_perf.svg/FlowerFromMyGarden.html" - }, - { - "avg_duration": "3.113728554545454", - "name": "blink_perf.svg/FoodLeifLodahl.html" - }, - { - "avg_duration": "3.009731938383837", - "name": "blink_perf.svg/France.html" - }, - { - "avg_duration": "2.958613517171719", - "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" - }, - { - "avg_duration": "3.1093663030303027", - "name": "blink_perf.svg/GearFlowers.html" - }, - { - "avg_duration": "3.1087998909090917", - "name": "blink_perf.svg/HarveyRayner.html" - }, - { - "avg_duration": "3.060517882828283", - "name": "blink_perf.svg/HereGear.html" - }, - { - "avg_duration": "5.072709896969697", - "name": "blink_perf.svg/MtSaintHelens.html" - }, - { - "avg_duration": "2.8198144929292934", - "name": "blink_perf.svg/Samurai.html" - }, - { - "avg_duration": "30.342954272727283", - "name": "blink_perf.svg/SierpinskiCarpet.html" - }, - { - "avg_duration": "3.408611788888889", - "name": "blink_perf.svg/SvgCubics.html" - }, - { - "avg_duration": "3.252221430303033", - "name": "blink_perf.svg/SvgHitTesting.html" - }, - { - "avg_duration": "9.260763322222221", - "name": "blink_perf.svg/SvgNestedUse.html" - }, - { - "avg_duration": "2.978896241414142", - "name": "blink_perf.svg/UnderTheSee.html" - }, - { - "avg_duration": "3.2542273454545447", - "name": "blink_perf.svg/WorldIso.html" - }, - { - "avg_duration": "4.026546466666669", - "name": "blink_perf.svg/Worldcup.html" - }, - { - "avg_duration": "42.223021686868684", - "name": "dromaeo/http://dromaeo.com?dom-attr" - }, - { - "avg_duration": "33.643220838383854", - "name": "dromaeo/http://dromaeo.com?dom-modify" - }, - { - "avg_duration": "48.6303281919192", - "name": "dromaeo/http://dromaeo.com?dom-query" - }, - { - "avg_duration": "29.485233202020197", - "name": "dromaeo/http://dromaeo.com?dom-traverse" - }, - { - "avg_duration": "19.709514797979807", - "name": "dummy_benchmark.histogram_benchmark_1/dummy_page.html" - }, - { - "avg_duration": "11.105253877777775", - "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" - }, - { - "avg_duration": "8.960481487878784", - "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" - }, - { - "avg_duration": "191.61576151515152", - "name": "jetstream/http://browserbench.org/JetStream/" - }, - { - "avg_duration": "30.56688854545453", - "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" - }, - { - "avg_duration": "17.796277247474755", - "name": "loading.desktop/24h" - }, - { - "avg_duration": "6.053167176470588E-4", - "name": "loading.desktop/2ch" - }, - { - "avg_duration": "23.32977772727273", - "name": "loading.desktop/AirBnB" - }, - { - "avg_duration": "14.35587063636363", - "name": "loading.desktop/Aljayyash" - }, - { - "avg_duration": "25.69859237373737", - "name": "loading.desktop/AllRecipes" - }, - { - "avg_duration": "23.967720909090897", - "name": "loading.desktop/ArsTechnica" - }, - { - "avg_duration": "14.484889469696979", - "name": "loading.desktop/Baidu" - }, - { - "avg_duration": "21.470289984848495", - "name": "loading.desktop/Bhaskar" - }, - { - "avg_duration": "18.273458545454545", - "name": "loading.desktop/Chosun" - }, - { - "avg_duration": "17.120065191919192", - "name": "loading.desktop/Colorado.edu" - }, - { - "avg_duration": "16.772643863636368", - "name": "loading.desktop/Danawa" - }, - { - "avg_duration": "16.382558186868685", - "name": "loading.desktop/Daum" - }, - { - "avg_duration": "18.68032998484848", - "name": "loading.desktop/Donga" - }, - { - "avg_duration": "22.094248080808086", - "name": "loading.desktop/Economist" - }, - { - "avg_duration": "28.238622393939387", - "name": "loading.desktop/Elmundo" - }, - { - "avg_duration": "16.790820515151506", - "name": "loading.desktop/FC2Blog" - }, - { - "avg_duration": "5.716193733333335E-4", - "name": "loading.desktop/FDA" - }, - { - "avg_duration": "17.361459186868693", - "name": "loading.desktop/FIFA" - }, - { - "avg_duration": "40.36078966666667", - "name": "loading.desktop/FarsNews" - }, - { - "avg_duration": "16.743160757575755", - "name": "loading.desktop/Flickr" - }, - { - "avg_duration": "16.321034707070705", - "name": "loading.desktop/FlipKart" - }, - { - "avg_duration": "14.682688106060613", - "name": "loading.desktop/Free.fr" - }, - { - "avg_duration": "13.883316282828279", - "name": "loading.desktop/HTML5Rocks" - }, - { - "avg_duration": "14.732891873737373", - "name": "loading.desktop/Haraj" - }, - { - "avg_duration": "18.699535343434338", - "name": "loading.desktop/HatenaBookmark" - }, - { - "avg_duration": "18.63500644444445", - "name": "loading.desktop/IGN" - }, - { - "avg_duration": "18.404064242424237", - "name": "loading.desktop/IMDB" - }, - { - "avg_duration": "17.078999020202012", - "name": "loading.desktop/IndiaTimes" - }, - { - "avg_duration": "18.299065792929294", - "name": "loading.desktop/Kakaku" - }, - { - "avg_duration": "26.364479767676755", - "name": "loading.desktop/Kenh14" - }, - { - "avg_duration": "6.699826959259259E-4", - "name": "loading.desktop/Leboncoin" - }, - { - "avg_duration": "6.735722163888891E-4", - "name": "loading.desktop/MLB" - }, - { - "avg_duration": "16.75509259595959", - "name": "loading.desktop/Mercadolivre" - }, - { - "avg_duration": "10.425556988888891", - "name": "loading.desktop/NatGeo" - }, - { - "avg_duration": "16.084199015151512", - "name": "loading.desktop/Naver" - }, - { - "avg_duration": "13.306234318181819", - "name": "loading.desktop/Orange" - }, - { - "avg_duration": "16.383443353535355", - "name": "loading.desktop/Pantip" - }, - { - "avg_duration": "18.824666085858585", - "name": "loading.desktop/PremierLeague" - }, - { - "avg_duration": "20.873495560606067", - "name": "loading.desktop/QQ" - }, - { - "avg_duration": "17.756320070707066", - "name": "loading.desktop/REI" - }, - { - "avg_duration": "5.671536477777775E-4", - "name": "loading.desktop/Rambler" - }, - { - "avg_duration": "15.540136848484838", - "name": "loading.desktop/Ruten" - }, - { - "avg_duration": "21.22598319191919", - "name": "loading.desktop/Sina" - }, - { - "avg_duration": "20.91638601515151", - "name": "loading.desktop/Taobao" - }, - { - "avg_duration": "21.258698010101007", - "name": "loading.desktop/TheOnion" - }, - { - "avg_duration": "21.38990183838383", - "name": "loading.desktop/TheVerge" - }, - { - "avg_duration": "22.450392171717166", - "name": "loading.desktop/TicketMaster" - }, - { - "avg_duration": "29.81191333333334", - "name": "loading.desktop/Vietnamnet" - }, - { - "avg_duration": "23.136903939393946", - "name": "loading.desktop/Vnexpress" - }, - { - "avg_duration": "24.069781343434347", - "name": "loading.desktop/Walgreens" - }, - { - "avg_duration": "14.709329474747472", - "name": "loading.desktop/Yandex" - }, - { - "avg_duration": "0.0011434201837037033", - "name": "loading.desktop/Ynet" - }, - { - "avg_duration": "20.243895636363625", - "name": "loading.desktop/amazon.co.jp" - }, - { - "avg_duration": "5.454439027272728E-4", - "name": "loading.desktop/goo.ne.jp" - }, - { - "avg_duration": "15.653099813131314", - "name": "loading.desktop/ja.wikipedia" - }, - { - "avg_duration": "24.017602959595955", - "name": "loading.desktop/money.cnn" - }, - { - "avg_duration": "15.870605075757581", - "name": "loading.desktop/ru.wikipedia" - }, - { - "avg_duration": "26.81979053535353", - "name": "loading.desktop/uol.com.br" - }, - { - "avg_duration": "17.995120010101008", - "name": "loading.desktop/yahoo.co.jp" - }, - { - "avg_duration": "16.986887727272723", - "name": "media.desktop/mse.html?media=aac_audio.mp4" - }, - { - "avg_duration": "17.899610424242432", - "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4" - }, - { - "avg_duration": "17.873924747474753", - "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4&waitForPageLoaded=true" - }, - { - "avg_duration": "16.98963155050504", - "name": "media.desktop/mse.html?media=h264_video.mp4" - }, - { - "avg_duration": "30.339194444444434", - "name": "media.desktop/video.html?src=crowd.ogg&type=audio" - }, - { - "avg_duration": "26.675061444444445", - "name": "media.desktop/video.html?src=crowd1080.mp4" - }, - { - "avg_duration": "26.26268078787879", - "name": "media.desktop/video.html?src=crowd1080.webm" - }, - { - "avg_duration": "24.37151872727272", - "name": "media.desktop/video.html?src=crowd1080_vp9.webm" - }, - { - "avg_duration": "15.165228141414142", - "name": "media.desktop/video.html?src=crowd1080_vp9.webm&seek" - }, - { - "avg_duration": "24.315737777777784", - "name": "media.desktop/video.html?src=crowd720_vp9.webm" - }, - { - "avg_duration": "27.20205337373738", - "name": "media.desktop/video.html?src=garden2_10s.mp4" - }, - { - "avg_duration": "17.236390333333333", - "name": "media.desktop/video.html?src=garden2_10s.mp4&seek" - }, - { - "avg_duration": "25.054333858585856", - "name": "media.desktop/video.html?src=garden2_10s.webm" - }, - { - "avg_duration": "15.082535828282833", - "name": "media.desktop/video.html?src=garden2_10s.webm&seek" - }, - { - "avg_duration": "18.85643757070707", - "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek" - }, - { - "avg_duration": "32.22215992929294", - "name": "media.desktop/video.html?src=tulip2.m4a&type=audio" - }, - { - "avg_duration": "32.21110791919193", - "name": "media.desktop/video.html?src=tulip2.mp3&type=audio" - }, - { - "avg_duration": "13.515092808080809", - "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek" - }, - { - "avg_duration": "33.86674483838383", - "name": "media.desktop/video.html?src=tulip2.mp4" - }, - { - "avg_duration": "35.592176333333335", - "name": "media.desktop/video.html?src=tulip2.mp4&busyjs" - }, - { - "avg_duration": "15.15670805050505", - "name": "media.desktop/video.html?src=tulip2.mp4&seek" - }, - { - "avg_duration": "32.209504404040395", - "name": "media.desktop/video.html?src=tulip2.ogg&type=audio" - }, - { - "avg_duration": "13.45914174747475", - "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek" - }, - { - "avg_duration": "33.91589607070707", - "name": "media.desktop/video.html?src=tulip2.vp9.webm" - }, - { - "avg_duration": "26.105682575757577", - "name": "media.desktop/video.html?src=tulip2.vp9.webm&background" - }, - { - "avg_duration": "16.367539904040402", - "name": "media.desktop/video.html?src=tulip2.vp9.webm&seek" - }, - { - "avg_duration": "39.29338516161616", - "name": "media.desktop/video.html?src=tulip2.vp9.webm_Regular-3G" - }, - { - "avg_duration": "32.441990909090904", - "name": "media.desktop/video.html?src=tulip2.wav&type=audio" - }, - { - "avg_duration": "13.604958843434344", - "name": "media.desktop/video.html?src=tulip2.wav&type=audio&seek" - }, - { - "avg_duration": "24.63618251515151", - "name": "memory.desktop/TrivialAnimationPageSharedPageState" - }, - { - "avg_duration": "23.35281334343434", - "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState" - }, - { - "avg_duration": "27.360383646464655", - "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState" - }, - { - "avg_duration": "24.567629575757582", - "name": "memory.desktop/TrivialCanvasPageSharedPageState" - }, - { - "avg_duration": "23.836052383838393", - "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState" - }, - { - "avg_duration": "23.607972030303024", - "name": "memory.desktop/TrivialGifPageSharedPageState" - }, - { - "avg_duration": "33.95000451515153", - "name": "memory.desktop/TrivialScrollingPageSharedPageState" - }, - { - "avg_duration": "25.206339363636367", - "name": "memory.desktop/TrivialWebGLPageSharedPageState" - }, - { - "avg_duration": "160.525265959596", - "name": "memory.long_running_idle_gmail_background_tbmv2/https://mail.google.com/mail/" - }, - { - "avg_duration": "160.1974557575758", - "name": "memory.long_running_idle_gmail_tbmv2/https://mail.google.com/mail/" - }, - { - "avg_duration": "47.731232868686874", - "name": "octane/http://chromium.github.io/octane/index.html?auto=1" - }, - { - "avg_duration": "76.16149284848484", - "name": "oortonline_tbmv2/http://oortonline.gl/#run" - }, - { - "avg_duration": "53.77012491304347", - "name": "power.desktop/TrivialAnimationPageSharedPageState" - }, - { - "avg_duration": "47.06500773913041", - "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState" - }, - { - "avg_duration": "57.39386284782609", - "name": "power.desktop/TrivialBlurAnimationPageSharedPageState" - }, - { - "avg_duration": "51.68192066304348", - "name": "power.desktop/TrivialCanvasPageSharedPageState" - }, - { - "avg_duration": "48.297374771739136", - "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState" - }, - { - "avg_duration": "46.90243145652175", - "name": "power.desktop/TrivialGifPageSharedPageState" - }, - { - "avg_duration": "58.830163793478235", - "name": "power.desktop/TrivialScrollingPageSharedPageState" - }, - { - "avg_duration": "52.85900113043477", - "name": "power.desktop/TrivialWebGLPageSharedPageState" - }, - { - "avg_duration": "137.25834413043475", - "name": "power.desktop/abcnews" - }, - { - "avg_duration": "47.34948593478261", - "name": "power.desktop/indiatimes" - }, - { - "avg_duration": "51.88114372826089", - "name": "power.desktop/instagram" - }, - { - "avg_duration": "47.84216095652173", - "name": "power.desktop/microsoft" - }, - { - "avg_duration": "49.606469456521744", - "name": "power.desktop/sina" - }, - { - "avg_duration": "49.940412347826076", - "name": "power.desktop/slideshare" - }, - { - "avg_duration": "61.285550010869535", - "name": "power.desktop/uol" - }, - { - "avg_duration": "23.015368969696976", - "name": "power.idle_platform/IdleStory_10s" - }, - { - "avg_duration": "136.58828583838377", - "name": "power.idle_platform/IdleStory_120s" - }, - { - "avg_duration": "72.56164295959597", - "name": "power.idle_platform/IdleStory_60s" - }, - { - "avg_duration": "13.939839732323236", - "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" - }, - { - "avg_duration": "24.60178244444445", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" - }, - { - "avg_duration": "10.062929842424241", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" - }, - { - "avg_duration": "11.009921340404043", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" - }, - { - "avg_duration": "13.322416137373741", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" - }, - { - "avg_duration": "10.717329493939392", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" - }, - { - "avg_duration": "19.20029315151514", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" - }, - { - "avg_duration": "10.453902502020199", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" - }, - { - "avg_duration": "11.29588626262626", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" - }, - { - "avg_duration": "10.29865538080808", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" - }, - { - "avg_duration": "8.560305636363639", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" - }, - { - "avg_duration": "10.424668083838382", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" - }, - { - "avg_duration": "13.572645570707067", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" - }, - { - "avg_duration": "22.58585426262627", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" - }, - { - "avg_duration": "9.336152664646466", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" - }, - { - "avg_duration": "8.940455361616165", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" - }, - { - "avg_duration": "27.212685383838387", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" - }, - { - "avg_duration": "16.507937090909092", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" - }, - { - "avg_duration": "14.031394323232323", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" - }, - { - "avg_duration": "5.062736279310344E-4", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html" - }, - { - "avg_duration": "15.321374190909088", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" - }, - { - "avg_duration": "10.890456581818185", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" - }, - { - "avg_duration": "23.34685303030304", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" - }, - { - "avg_duration": "100.98689316161611", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" - }, - { - "avg_duration": "85.29090675757575", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" - }, - { - "avg_duration": "24.792838454545457", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" - }, - { - "avg_duration": "3.44342653E-4", - "name": "rendering.desktop/amazon" - }, - { - "avg_duration": "32.23481807070707", - "name": "rendering.desktop/analog_clock_svg" - }, - { - "avg_duration": "22.84507216304348", - "name": "rendering.desktop/balls_css_key_frame_animations" - }, - { - "avg_duration": "26.77139425000001", - "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform" - }, - { - "avg_duration": "26.14243802173914", - "name": "rendering.desktop/balls_css_transition_2_properties" - }, - { - "avg_duration": "26.23570299999999", - "name": "rendering.desktop/balls_css_transition_40_properties" - }, - { - "avg_duration": "26.237633130434787", - "name": "rendering.desktop/balls_css_transition_all_properties" - }, - { - "avg_duration": "25.419334771739123", - "name": "rendering.desktop/balls_javascript_canvas" - }, - { - "avg_duration": "22.605375619565212", - "name": "rendering.desktop/balls_javascript_css" - }, - { - "avg_duration": "26.34060051086956", - "name": "rendering.desktop/balls_svg_animations" - }, - { - "avg_duration": "27.77739368686869", - "name": "rendering.desktop/blogspot" - }, - { - "avg_duration": "16.513189308080815", - "name": "rendering.desktop/booking.com" - }, - { - "avg_duration": "17.163900070707072", - "name": "rendering.desktop/bouncing_balls_15" - }, - { - "avg_duration": "16.40321768686869", - "name": "rendering.desktop/bouncing_balls_shadow" - }, - { - "avg_duration": "16.761407101010096", - "name": "rendering.desktop/bouncing_clipped_rectangles" - }, - { - "avg_duration": "17.91543892424243", - "name": "rendering.desktop/bouncing_gradient_circles" - }, - { - "avg_duration": "13.388183570707074", - "name": "rendering.desktop/bouncing_png_images" - }, - { - "avg_duration": "22.2694844949495", - "name": "rendering.desktop/bouncing_svg_images" - }, - { - "avg_duration": "24.263730530303043", - "name": "rendering.desktop/canvas_animation_no_clear" - }, - { - "avg_duration": "17.431412318181813", - "name": "rendering.desktop/canvas_arcs" - }, - { - "avg_duration": "16.217379646464636", - "name": "rendering.desktop/canvas_font_cycler" - }, - { - "avg_duration": "16.737339752525248", - "name": "rendering.desktop/canvas_lines" - }, - { - "avg_duration": "16.622581393939395", - "name": "rendering.desktop/canvas_to_blob" - }, - { - "avg_duration": "20.71951031313132", - "name": "rendering.desktop/chip_tune" - }, - { - "avg_duration": "6.033615554545455E-4", - "name": "rendering.desktop/cnn" - }, - { - "avg_duration": "26.953036217391308", - "name": "rendering.desktop/compositor_heavy_animation" - }, - { - "avg_duration": "19.732214020202026", - "name": "rendering.desktop/crafty_mind" - }, - { - "avg_duration": "22.162743010869566", - "name": "rendering.desktop/css_animations_many_keyframes" - }, - { - "avg_duration": "21.74792739130434", - "name": "rendering.desktop/css_animations_simultaneous_inline_style" - }, - { - "avg_duration": "22.383995793478256", - "name": "rendering.desktop/css_animations_simultaneous_new_element" - }, - { - "avg_duration": "21.731999749999996", - "name": "rendering.desktop/css_animations_simultaneous_style_element" - }, - { - "avg_duration": "21.75569220652173", - "name": "rendering.desktop/css_animations_simultaneous_updating_class" - }, - { - "avg_duration": "21.14137066304348", - "name": "rendering.desktop/css_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "24.34902766304348", - "name": "rendering.desktop/css_animations_staggered_inline_style" - }, - { - "avg_duration": "28.746734097826092", - "name": "rendering.desktop/css_animations_staggered_new_element" - }, - { - "avg_duration": "25.247548521739127", - "name": "rendering.desktop/css_animations_staggered_style_element" - }, - { - "avg_duration": "24.469455999999997", - "name": "rendering.desktop/css_animations_staggered_updating_class" - }, - { - "avg_duration": "24.944197826086956", - "name": "rendering.desktop/css_animations_triggered_inline_style" - }, - { - "avg_duration": "35.431130152173914", - "name": "rendering.desktop/css_animations_triggered_new_element" - }, - { - "avg_duration": "25.689787586956527", - "name": "rendering.desktop/css_animations_triggered_style_element" - }, - { - "avg_duration": "24.915712847826086", - "name": "rendering.desktop/css_animations_triggered_updating_class" - }, - { - "avg_duration": "21.888190728260867", - "name": "rendering.desktop/css_transitions_inline_style" - }, - { - "avg_duration": "22.436129184782605", - "name": "rendering.desktop/css_transitions_new_element" - }, - { - "avg_duration": "22.335085913043475", - "name": "rendering.desktop/css_transitions_staggered_inline_style" - }, - { - "avg_duration": "23.227262336956525", - "name": "rendering.desktop/css_transitions_staggered_new_element" - }, - { - "avg_duration": "22.671832260869575", - "name": "rendering.desktop/css_transitions_staggered_style_element" - }, - { - "avg_duration": "22.346157554347823", - "name": "rendering.desktop/css_transitions_staggered_updating_class" - }, - { - "avg_duration": "22.01950536956522", - "name": "rendering.desktop/css_transitions_style_element" - }, - { - "avg_duration": "25.343238597826076", - "name": "rendering.desktop/css_transitions_triggered_inline_style" - }, - { - "avg_duration": "25.478697043478267", - "name": "rendering.desktop/css_transitions_triggered_new_element" - }, - { - "avg_duration": "25.549056532608702", - "name": "rendering.desktop/css_transitions_triggered_style_element" - }, - { - "avg_duration": "25.467266706521745", - "name": "rendering.desktop/css_transitions_triggered_updating_class" - }, - { - "avg_duration": "21.92593485869566", - "name": "rendering.desktop/css_transitions_updating_class" - }, - { - "avg_duration": "21.65085111956522", - "name": "rendering.desktop/css_value_type_color" - }, - { - "avg_duration": "48.9700790652174", - "name": "rendering.desktop/css_value_type_filter" - }, - { - "avg_duration": "22.80907332608696", - "name": "rendering.desktop/css_value_type_length" - }, - { - "avg_duration": "24.512565108695654", - "name": "rendering.desktop/css_value_type_length_complex" - }, - { - "avg_duration": "24.16843460869566", - "name": "rendering.desktop/css_value_type_length_simple" - }, - { - "avg_duration": "23.768057999999996", - "name": "rendering.desktop/css_value_type_path" - }, - { - "avg_duration": "24.95825792391305", - "name": "rendering.desktop/css_value_type_shadow" - }, - { - "avg_duration": "22.718714597826082", - "name": "rendering.desktop/css_value_type_transform_complex" - }, - { - "avg_duration": "22.4806019347826", - "name": "rendering.desktop/css_value_type_transform_simple" - }, - { - "avg_duration": "13.303307055555551", - "name": "rendering.desktop/ebay" - }, - { - "avg_duration": "20.786806626262628", - "name": "rendering.desktop/effect_games" - }, - { - "avg_duration": "17.878968282828286", - "name": "rendering.desktop/espn" - }, - { - "avg_duration": "14.307120464646468", - "name": "rendering.desktop/facebook" - }, - { - "avg_duration": "17.145088813131313", - "name": "rendering.desktop/fill_shapes" - }, - { - "avg_duration": "29.07482417171717", - "name": "rendering.desktop/filter_terrain_svg" - }, - { - "avg_duration": "17.026026323232323", - "name": "rendering.desktop/geo_apis" - }, - { - "avg_duration": "23.924797595959593", - "name": "rendering.desktop/gmail" - }, - { - "avg_duration": "28.33538300000001", - "name": "rendering.desktop/gmail_move" - }, - { - "avg_duration": "15.92227727777778", - "name": "rendering.desktop/google_calendar" - }, - { - "avg_duration": "31.63932657575758", - "name": "rendering.desktop/google_docs" - }, - { - "avg_duration": "19.767774686868684", - "name": "rendering.desktop/google_image_search" - }, - { - "avg_duration": "21.736239242424247", - "name": "rendering.desktop/google_plus" - }, - { - "avg_duration": "14.199730959595955", - "name": "rendering.desktop/google_web_search" - }, - { - "avg_duration": "26.895519161616168", - "name": "rendering.desktop/guimark_vector_chart" - }, - { - "avg_duration": "19.366948747474744", - "name": "rendering.desktop/hakim" - }, - { - "avg_duration": "34.281546212121214", - "name": "rendering.desktop/ie_chalkboard" - }, - { - "avg_duration": "28.129559838383837", - "name": "rendering.desktop/ie_pirate_mark" - }, - { - "avg_duration": "23.04584223232323", - "name": "rendering.desktop/jarro_doverson" - }, - { - "avg_duration": "16.68955993434343", - "name": "rendering.desktop/kevs_3d" - }, - { - "avg_duration": "21.33538952173913", - "name": "rendering.desktop/keyframed_animations" - }, - { - "avg_duration": "16.512718343434347", - "name": "rendering.desktop/linkedin" - }, - { - "avg_duration": "21.6931847979798", - "name": "rendering.desktop/man_in_blue" - }, - { - "avg_duration": "21.743285838383837", - "name": "rendering.desktop/many_images" - }, - { - "avg_duration": "19.132848030303027", - "name": "rendering.desktop/maps_move" - }, - { - "avg_duration": "15.54562393939394", - "name": "rendering.desktop/megi_dish" - }, - { - "avg_duration": "18.244211525252528", - "name": "rendering.desktop/microsoft_asteroid_belt" - }, - { - "avg_duration": "25.3127308888889", - "name": "rendering.desktop/microsoft_fireflies" - }, - { - "avg_duration": "18.430522308080814", - "name": "rendering.desktop/microsoft_fish_ie_tank" - }, - { - "avg_duration": "21.49526712626263", - "name": "rendering.desktop/microsoft_snow" - }, - { - "avg_duration": "16.02544925252525", - "name": "rendering.desktop/microsoft_speed_reading" - }, - { - "avg_duration": "17.045696727272727", - "name": "rendering.desktop/microsoft_tweet_map" - }, - { - "avg_duration": "24.33272039393939", - "name": "rendering.desktop/microsoft_video_city" - }, - { - "avg_duration": "18.21287603030303", - "name": "rendering.desktop/microsoft_worker_fountains" - }, - { - "avg_duration": "15.91745314141414", - "name": "rendering.desktop/mix_10k" - }, - { - "avg_duration": "21.12254688607596", - "name": "rendering.desktop/mix_blend_mode_animation_difference" - }, - { - "avg_duration": "21.149859101265815", - "name": "rendering.desktop/mix_blend_mode_animation_hue" - }, - { - "avg_duration": "23.769520989130434", - "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation" - }, - { - "avg_duration": "24.06873829347827", - "name": "rendering.desktop/mix_blend_mode_animation_screen" - }, - { - "avg_duration": "23.948956808080812", - "name": "rendering.desktop/motion_mark_canvas_fill_shapes" - }, - { - "avg_duration": "24.675626010101013", - "name": "rendering.desktop/motion_mark_canvas_stroke_shapes" - }, - { - "avg_duration": "30.004777515151513", - "name": "rendering.desktop/motion_mark_focus" - }, - { - "avg_duration": "43.38852559782608", - "name": "rendering.desktop/overlay_background_color_css_transitions_page" - }, - { - "avg_duration": "22.833681828282828", - "name": "rendering.desktop/pinterest" - }, - { - "avg_duration": "17.211929757575756", - "name": "rendering.desktop/put_get_image_data" - }, - { - "avg_duration": "17.435395353535352", - "name": "rendering.desktop/runway" - }, - { - "avg_duration": "19.09892994444444", - "name": "rendering.desktop/smash_cat" - }, - { - "avg_duration": "15.77969653030303", - "name": "rendering.desktop/spielzeugz" - }, - { - "avg_duration": "17.801805909090906", - "name": "rendering.desktop/stroke_shapes" - }, - { - "avg_duration": "40.69789875757574", - "name": "rendering.desktop/techcrunch" - }, - { - "avg_duration": "24.991641260869567", - "name": "rendering.desktop/transform_transitions" - }, - { - "avg_duration": "20.655563695652173", - "name": "rendering.desktop/transform_transitions_js_block" - }, - { - "avg_duration": "16.018982737373733", - "name": "rendering.desktop/twitter" - }, - { - "avg_duration": "19.931932530303026", - "name": "rendering.desktop/weather.com" - }, - { - "avg_duration": "22.34548729347826", - "name": "rendering.desktop/web_animation_value_type_color" - }, - { - "avg_duration": "23.28671939130435", - "name": "rendering.desktop/web_animation_value_type_length_3d" - }, - { - "avg_duration": "24.31206143478261", - "name": "rendering.desktop/web_animation_value_type_length_complex" - }, - { - "avg_duration": "24.313030228260875", - "name": "rendering.desktop/web_animation_value_type_length_simple" - }, - { - "avg_duration": "23.85834029347826", - "name": "rendering.desktop/web_animation_value_type_path" - }, - { - "avg_duration": "24.863936152173913", - "name": "rendering.desktop/web_animation_value_type_shadow" - }, - { - "avg_duration": "22.778717836956528", - "name": "rendering.desktop/web_animation_value_type_transform_complex" - }, - { - "avg_duration": "22.44251680434782", - "name": "rendering.desktop/web_animation_value_type_transform_simple" - }, - { - "avg_duration": "23.026747815217387", - "name": "rendering.desktop/web_animations_many_keyframes" - }, - { - "avg_duration": "22.26854544565217", - "name": "rendering.desktop/web_animations_set_current_time" - }, - { - "avg_duration": "22.206556282608688", - "name": "rendering.desktop/web_animations_simultaneous" - }, - { - "avg_duration": "24.555969217391315", - "name": "rendering.desktop/web_animations_staggered_chaining" - }, - { - "avg_duration": "21.325846206521742", - "name": "rendering.desktop/web_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "25.101195782608695", - "name": "rendering.desktop/web_animations_staggered_triggering_page" - }, - { - "avg_duration": "20.364619969696975", - "name": "rendering.desktop/wikipedia" - }, - { - "avg_duration": "23.659137787878787", - "name": "rendering.desktop/wordpress" - }, - { - "avg_duration": "14.043235414141417", - "name": "rendering.desktop/yahoo_answers" - }, - { - "avg_duration": "25.72189804040405", - "name": "rendering.desktop/yahoo_games" - }, - { - "avg_duration": "19.26464831818181", - "name": "rendering.desktop/yahoo_news" - }, - { - "avg_duration": "21.380682151515153", - "name": "rendering.desktop/yahoo_sports" - }, - { - "avg_duration": "20.872036868686873", - "name": "rendering.desktop/youtube" - }, - { - "avg_duration": "17.478642222222213", - "name": "scheduler.tough_scheduling_cases/raf.html" - }, - { - "avg_duration": "17.48852294949495", - "name": "scheduler.tough_scheduling_cases/raf_animation.html" - }, - { - "avg_duration": "17.015820772727274", - "name": "scheduler.tough_scheduling_cases/raf_canvas.html" - }, - { - "avg_duration": "16.263381909090906", - "name": "scheduler.tough_scheduling_cases/raf_touch_animation.html" - }, - { - "avg_duration": "10.41283162626263", - "name": "scheduler.tough_scheduling_cases/second_batch_js.html?heavy" - }, - { - "avg_duration": "10.317407484848486", - "name": "scheduler.tough_scheduling_cases/second_batch_js.html?light" - }, - { - "avg_duration": "10.370052313131312", - "name": "scheduler.tough_scheduling_cases/second_batch_js.html?medium" - }, - { - "avg_duration": "21.380705727272723", - "name": "scheduler.tough_scheduling_cases/simple_text_page.html" - }, - { - "avg_duration": "10.924102466666671", - "name": "scheduler.tough_scheduling_cases/simple_touch_drag.html" - }, - { - "avg_duration": "13.309566813131319", - "name": "scheduler.tough_scheduling_cases/sync_scroll_offset.html" - }, - { - "avg_duration": "15.489430944444441", - "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling.html" - }, - { - "avg_duration": "14.102468540404036", - "name": "smoothness.desktop_tough_pinch_zoom_cases/Blogger" - }, - { - "avg_duration": "15.041881651515151", - "name": "smoothness.desktop_tough_pinch_zoom_cases/ESPN" - }, - { - "avg_duration": "14.10240523232323", - "name": "smoothness.desktop_tough_pinch_zoom_cases/Facebook" - }, - { - "avg_duration": "13.622143166666666", - "name": "smoothness.desktop_tough_pinch_zoom_cases/LinkedIn" - }, - { - "avg_duration": "16.103051959595966", - "name": "smoothness.desktop_tough_pinch_zoom_cases/Twitter" - }, - { - "avg_duration": "15.889530505050505", - "name": "smoothness.desktop_tough_pinch_zoom_cases/Weather.com" - }, - { - "avg_duration": "13.999643249999998", - "name": "smoothness.desktop_tough_pinch_zoom_cases/amazon_pinch" - }, - { - "avg_duration": "14.50147525", - "name": "smoothness.desktop_tough_pinch_zoom_cases/blogspot_pinch" - }, - { - "avg_duration": "14.837971687500001", - "name": "smoothness.desktop_tough_pinch_zoom_cases/booking_pinch" - }, - { - "avg_duration": "16.376194437500004", - "name": "smoothness.desktop_tough_pinch_zoom_cases/cnn_pinch" - }, - { - "avg_duration": "16.500532624999998", - "name": "smoothness.desktop_tough_pinch_zoom_cases/ebay_pinch" - }, - { - "avg_duration": "15.91411371875", - "name": "smoothness.desktop_tough_pinch_zoom_cases/espn_pinch" - }, - { - "avg_duration": "14.509050312499998", - "name": "smoothness.desktop_tough_pinch_zoom_cases/facebook_pinch" - }, - { - "avg_duration": "16.667279250000004", - "name": "smoothness.desktop_tough_pinch_zoom_cases/gmail_pinch" - }, - { - "avg_duration": "16.110508", - "name": "smoothness.desktop_tough_pinch_zoom_cases/google_calendar_pinch" - }, - { - "avg_duration": "14.428805500000001", - "name": "smoothness.desktop_tough_pinch_zoom_cases/google_image_pinch" - }, - { - "avg_duration": "16.720629", - "name": "smoothness.desktop_tough_pinch_zoom_cases/google_search_pinch" - }, - { - "avg_duration": "14.151752919191921", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://booking.com" - }, - { - "avg_duration": "21.15502472727272", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://games.yahoo.com" - }, - { - "avg_duration": "14.483797803030301", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://news.yahoo.com" - }, - { - "avg_duration": "17.566921156565662", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://sports.yahoo.com/" - }, - { - "avg_duration": "13.57856017676768", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.amazon.com" - }, - { - "avg_duration": "15.43905115151516", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.cnn.com" - }, - { - "avg_duration": "15.257356843434343", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.ebay.com" - }, - { - "avg_duration": "16.178363843434344", - "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.youtube.com" - }, - { - "avg_duration": "15.901054888888893", - "name": "smoothness.desktop_tough_pinch_zoom_cases/https://mail.google.com/mail/" - }, - { - "avg_duration": "14.635385540404041", - "name": "smoothness.desktop_tough_pinch_zoom_cases/https://www.google.com/#hl=en&q=barack+obama" - }, - { - "avg_duration": "15.73644109090909", - "name": "smoothness.desktop_tough_pinch_zoom_cases/https://www.google.com/calendar/" - }, - { - "avg_duration": "13.924579469696974", - "name": "smoothness.desktop_tough_pinch_zoom_cases/https://www.google.com/search?q=cats&tbm=isch" - }, - { - "avg_duration": "13.898394156250001", - "name": "smoothness.desktop_tough_pinch_zoom_cases/linkedin_pinch" - }, - { - "avg_duration": "16.7541483125", - "name": "smoothness.desktop_tough_pinch_zoom_cases/twitter_pinch" - }, - { - "avg_duration": "17.1845795625", - "name": "smoothness.desktop_tough_pinch_zoom_cases/weather_pinch" - }, - { - "avg_duration": "22.829458374999998", - "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_games_pinch" - }, - { - "avg_duration": "15.499808937500001", - "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_news_pinch" - }, - { - "avg_duration": "19.3829574375", - "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_sports_pinch" - }, - { - "avg_duration": "16.7619159375", - "name": "smoothness.desktop_tough_pinch_zoom_cases/youtube_pinch" - }, - { - "avg_duration": "25.7057951111111", - "name": "smoothness.gpu_rasterization.tough_filters_cases/Analog_Clock_SVG" - }, - { - "avg_duration": "24.358386717171722", - "name": "smoothness.gpu_rasterization.tough_filters_cases/Filter_Terrain_SVG" - }, - { - "avg_duration": "24.096294121212132", - "name": "smoothness.gpu_rasterization.tough_filters_cases/IE_PirateMark" - }, - { - "avg_duration": "29.290757232323234", - "name": "smoothness.gpu_rasterization.tough_filters_cases/MotionMark_Focus" - }, - { - "avg_duration": "23.740482323232335", - "name": "smoothness.gpu_rasterization.tough_filters_cases/analog_clock_svg" - }, - { - "avg_duration": "23.903764161616156", - "name": "smoothness.gpu_rasterization.tough_filters_cases/filter_terrain_svg" - }, - { - "avg_duration": "23.66255340404041", - "name": "smoothness.gpu_rasterization.tough_filters_cases/ie_pirate_mark" - }, - { - "avg_duration": "30.651896181818174", - "name": "smoothness.gpu_rasterization.tough_filters_cases/motion_mark_focus" - }, - { - "avg_duration": "24.802073737373735", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" - }, - { - "avg_duration": "30.626049434343436", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/IE_Chalkboard" - }, - { - "avg_duration": "20.15231878787878", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" - }, - { - "avg_duration": "20.43747068686869", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" - }, - { - "avg_duration": "29.384177555555546", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/guimark_vector_chart" - }, - { - "avg_duration": "31.296670282828288", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/ie_chalkboard" - }, - { - "avg_duration": "20.76249540404041", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" - }, - { - "avg_duration": "20.46850056565657", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" - }, - { - "avg_duration": "17.20702480303031", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_05000_pixels_per_second" - }, - { - "avg_duration": "16.69641657575757", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_10000_pixels_per_second" - }, - { - "avg_duration": "14.485236843434349", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_15000_pixels_per_second" - }, - { - "avg_duration": "13.320695984848488", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_20000_pixels_per_second" - }, - { - "avg_duration": "12.23233838383838", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_30000_pixels_per_second" - }, - { - "avg_duration": "11.705608939393938", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_40000_pixels_per_second" - }, - { - "avg_duration": "11.386289020202023", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_50000_pixels_per_second" - }, - { - "avg_duration": "11.064250641414139", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_60000_pixels_per_second" - }, - { - "avg_duration": "10.925364732323231", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_75000_pixels_per_second" - }, - { - "avg_duration": "10.789570106060605", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_90000_pixels_per_second" - }, - { - "avg_duration": "23.93210795454546", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_05000_pixels_per_second" - }, - { - "avg_duration": "15.964597848484853", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_10000_pixels_per_second" - }, - { - "avg_duration": "13.110332575757583", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_15000_pixels_per_second" - }, - { - "avg_duration": "11.964903803030307", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_20000_pixels_per_second" - }, - { - "avg_duration": "11.440399696969695", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_30000_pixels_per_second" - }, - { - "avg_duration": "10.83936691919192", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_40000_pixels_per_second" - }, - { - "avg_duration": "9.962159757575755", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_50000_pixels_per_second" - }, - { - "avg_duration": "9.65616229292929", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_60000_pixels_per_second" - }, - { - "avg_duration": "9.491587792929293", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_75000_pixels_per_second" - }, - { - "avg_duration": "9.323780962626262", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_90000_pixels_per_second" - }, - { - "avg_duration": "18.480147232323226", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" - }, - { - "avg_duration": "17.790991318181824", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" - }, - { - "avg_duration": "15.511747393939396", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" - }, - { - "avg_duration": "14.414810212121209", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" - }, - { - "avg_duration": "13.315803545454541", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" - }, - { - "avg_duration": "12.706241080808079", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" - }, - { - "avg_duration": "12.407853757575758", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" - }, - { - "avg_duration": "12.155457313131315", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" - }, - { - "avg_duration": "12.39892254545454", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" - }, - { - "avg_duration": "12.339273489898988", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" - }, - { - "avg_duration": "15.685731747474748", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_05000_pixels_per_second" - }, - { - "avg_duration": "15.052804797979801", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_10000_pixels_per_second" - }, - { - "avg_duration": "12.958962242424242", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_15000_pixels_per_second" - }, - { - "avg_duration": "11.90668604545455", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_20000_pixels_per_second" - }, - { - "avg_duration": "10.756206232323235", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_30000_pixels_per_second" - }, - { - "avg_duration": "10.178428262626264", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_40000_pixels_per_second" - }, - { - "avg_duration": "9.865516540404037", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_50000_pixels_per_second" - }, - { - "avg_duration": "9.641958469696966", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_60000_pixels_per_second" - }, - { - "avg_duration": "9.40877238282828", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_75000_pixels_per_second" - }, - { - "avg_duration": "9.260978202020203", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_90000_pixels_per_second" - }, - { - "avg_duration": "28.5860754949495", - "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding.html" - }, - { - "avg_duration": "27.778140313131317", - "name": "smoothness.image_decoding_cases/yuv_decoding.html" - }, - { - "avg_duration": "19.922734707070703", - "name": "smoothness.key_desktop_move_cases/Maps" - }, - { - "avg_duration": "22.579443404761903", - "name": "smoothness.key_desktop_move_cases/gmail_move" - }, - { - "avg_duration": "25.88235309090909", - "name": "smoothness.key_desktop_move_cases/https://mail.google.com/mail/" - }, - { - "avg_duration": "23.37720471717171", - "name": "smoothness.key_desktop_move_cases/maps_move" - }, - { - "avg_duration": "24.551472985858588", - "name": "smoothness.maps/maps_perf_test" - }, - { - "avg_duration": "5.351962700344829E-4", - "name": "smoothness.top_25_smooth/amazon" - }, - { - "avg_duration": "18.52020870707071", - "name": "smoothness.top_25_smooth/blogspot" - }, - { - "avg_duration": "14.266362535353533", - "name": "smoothness.top_25_smooth/booking.com" - }, - { - "avg_duration": "7.075019440579713E-4", - "name": "smoothness.top_25_smooth/cnn" - }, - { - "avg_duration": "12.118431732323229", - "name": "smoothness.top_25_smooth/ebay" - }, - { - "avg_duration": "15.765459843434343", - "name": "smoothness.top_25_smooth/espn" - }, - { - "avg_duration": "12.940324989898993", - "name": "smoothness.top_25_smooth/facebook" - }, - { - "avg_duration": "24.654850424242408", - "name": "smoothness.top_25_smooth/gmail" - }, - { - "avg_duration": "14.028745449494952", - "name": "smoothness.top_25_smooth/google_calendar" - }, - { - "avg_duration": "22.5047492020202", - "name": "smoothness.top_25_smooth/google_docs" - }, - { - "avg_duration": "16.404584904040412", - "name": "smoothness.top_25_smooth/google_image_search" - }, - { - "avg_duration": "18.448493090909093", - "name": "smoothness.top_25_smooth/google_plus" - }, - { - "avg_duration": "11.240640434343428", - "name": "smoothness.top_25_smooth/google_web_search" - }, - { - "avg_duration": "15.38301813636364", - "name": "smoothness.top_25_smooth/linkedin" - }, - { - "avg_duration": "17.114487565656564", - "name": "smoothness.top_25_smooth/pinterest" - }, - { - "avg_duration": "21.7880092020202", - "name": "smoothness.top_25_smooth/techcrunch" - }, - { - "avg_duration": "16.64673301515151", - "name": "smoothness.top_25_smooth/twitter" - }, - { - "avg_duration": "14.284436797979795", - "name": "smoothness.top_25_smooth/weather.com" - }, - { - "avg_duration": "18.341946424242416", - "name": "smoothness.top_25_smooth/wikipedia" - }, - { - "avg_duration": "17.88175111111111", - "name": "smoothness.top_25_smooth/wordpress" - }, - { - "avg_duration": "12.42694668181818", - "name": "smoothness.top_25_smooth/yahoo_answers" - }, - { - "avg_duration": "20.35017104040404", - "name": "smoothness.top_25_smooth/yahoo_games" - }, - { - "avg_duration": "14.949772065656557", - "name": "smoothness.top_25_smooth/yahoo_news" - }, - { - "avg_duration": "15.947523919191916", - "name": "smoothness.top_25_smooth/yahoo_sports" - }, - { - "avg_duration": "17.31190335353535", - "name": "smoothness.top_25_smooth/youtube" - }, - { - "avg_duration": "25.427441545454542", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swiffy72.html" - }, - { - "avg_duration": "20.684610141414144", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swiffy72.html" - }, - { - "avg_duration": "20.75189987878788", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swiffy72.html" - }, - { - "avg_duration": "20.68451311111111", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swiffy72.html" - }, - { - "avg_duration": "20.697630616161625", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swiffy72.html" - }, - { - "avg_duration": "20.713541333333335", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swiffy72.html" - }, - { - "avg_duration": "20.79310641414141", - "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swiffy72.html" - }, - { - "avg_duration": "20.68882041414141", - "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swiffy72.html" - }, - { - "avg_duration": "20.727818393939394", - "name": "smoothness.tough_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swiffy72.html" - }, - { - "avg_duration": "20.695565111111115", - "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swiffy72.html" - }, - { - "avg_duration": "20.924979515151513", - "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swiffy72.html" - }, - { - "avg_duration": "20.72931501010101", - "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations" - }, - { - "avg_duration": "22.029601292929296", - "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations_composited_transform" - }, - { - "avg_duration": "20.33082168686869", - "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations.html" - }, - { - "avg_duration": "22.54135391919192", - "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations_composited_transform.html" - }, - { - "avg_duration": "22.816800585858584", - "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties" - }, - { - "avg_duration": "22.270674949494953", - "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties.html" - }, - { - "avg_duration": "23.272130646464635", - "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties" - }, - { - "avg_duration": "22.30194813131314", - "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties.html" - }, - { - "avg_duration": "22.839448959595963", - "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties" - }, - { - "avg_duration": "22.2889395050505", - "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties.html" - }, - { - "avg_duration": "20.597736010101013", - "name": "smoothness.tough_animation_cases/balls_javascript_canvas" - }, - { - "avg_duration": "20.55900861616161", - "name": "smoothness.tough_animation_cases/balls_javascript_canvas.html" - }, - { - "avg_duration": "20.262476676767676", - "name": "smoothness.tough_animation_cases/balls_javascript_css" - }, - { - "avg_duration": "19.708901454545458", - "name": "smoothness.tough_animation_cases/balls_javascript_css.html" - }, - { - "avg_duration": "27.304045050505053", - "name": "smoothness.tough_animation_cases/balls_svg_animations" - }, - { - "avg_duration": "24.145910676767674", - "name": "smoothness.tough_animation_cases/balls_svg_animations.html" - }, - { - "avg_duration": "23.867585388888887", - "name": "smoothness.tough_animation_cases/compositor_heavy_animation" - }, - { - "avg_duration": "25.117134161616157", - "name": "smoothness.tough_animation_cases/compositor_heavy_animation.html?N=0200" - }, - { - "avg_duration": "19.805703020202024", - "name": "smoothness.tough_animation_cases/css_animations_many_keyframes" - }, - { - "avg_duration": "19.249797434343428", - "name": "smoothness.tough_animation_cases/css_animations_many_keyframes.html?N=0316" - }, - { - "avg_duration": "19.843873020202025", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "19.266266161616162", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "19.240896050505057", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_class.html?N=0316" - }, - { - "avg_duration": "19.251082474747477", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "19.980121191919185", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_inline_style" - }, - { - "avg_duration": "20.522001161616164", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_new_element" - }, - { - "avg_duration": "19.981653555555557", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_style_element" - }, - { - "avg_duration": "20.045240010101008", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_updating_class" - }, - { - "avg_duration": "24.18597062626263", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "21.83513900000001", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "21.254668676767686", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_class.html?N=0316" - }, - { - "avg_duration": "21.2781091919192", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "19.88947425252525", - "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "18.651829494949492", - "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations.html?N=0316" - }, - { - "avg_duration": "21.889274474747477", - "name": "smoothness.tough_animation_cases/css_animations_staggered_inline_style" - }, - { - "avg_duration": "25.696701090909094", - "name": "smoothness.tough_animation_cases/css_animations_staggered_new_element" - }, - { - "avg_duration": "22.61742122222223", - "name": "smoothness.tough_animation_cases/css_animations_staggered_style_element" - }, - { - "avg_duration": "28.005393424242435", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "22.007449919191917", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "21.65072099999999", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_class.html?N=0316" - }, - { - "avg_duration": "21.67086817171717", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "21.868782878787883", - "name": "smoothness.tough_animation_cases/css_animations_staggered_updating_class" - }, - { - "avg_duration": "22.164024252525262", - "name": "smoothness.tough_animation_cases/css_animations_triggered_inline_style" - }, - { - "avg_duration": "30.665086232323215", - "name": "smoothness.tough_animation_cases/css_animations_triggered_new_element" - }, - { - "avg_duration": "22.350055525252518", - "name": "smoothness.tough_animation_cases/css_animations_triggered_style_element" - }, - { - "avg_duration": "22.190895565656565", - "name": "smoothness.tough_animation_cases/css_animations_triggered_updating_class" - }, - { - "avg_duration": "20.117356151515146", - "name": "smoothness.tough_animation_cases/css_transitions_inline_style" - }, - { - "avg_duration": "21.20347986868686", - "name": "smoothness.tough_animation_cases/css_transitions_new_element" - }, - { - "avg_duration": "20.019149282828284", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "19.591567141414135", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "19.391697040404047", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_class.html?N=0316" - }, - { - "avg_duration": "20.152232373737373", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "20.230183939393935", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "19.675483676767673", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "19.592879141414137", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_class.html?N=0316" - }, - { - "avg_duration": "19.585286181818184", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "20.817858202020208", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_inline_style" - }, - { - "avg_duration": "20.8190513939394", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_new_element" - }, - { - "avg_duration": "20.356800828282836", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_style_element" - }, - { - "avg_duration": "21.924275757575757", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "21.865035686868683", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "21.933537292929287", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_class.html?N=0316" - }, - { - "avg_duration": "21.828485353535353", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "20.282889949494955", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_updating_class" - }, - { - "avg_duration": "20.205512727272723", - "name": "smoothness.tough_animation_cases/css_transitions_style_element" - }, - { - "avg_duration": "22.146159989898983", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_inline_style" - }, - { - "avg_duration": "22.625836858585856", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_new_element" - }, - { - "avg_duration": "22.040797595959596", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_style_element" - }, - { - "avg_duration": "22.129561626262625", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_updating_class" - }, - { - "avg_duration": "20.536039717171718", - "name": "smoothness.tough_animation_cases/css_transitions_updating_class" - }, - { - "avg_duration": "19.48575651515151", - "name": "smoothness.tough_animation_cases/css_value_type_color" - }, - { - "avg_duration": "18.635115525252527", - "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=css_animations&N=0316" - }, - { - "avg_duration": "18.59557777777778", - "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=web_animations&N=0316" - }, - { - "avg_duration": "21.552717757575753", - "name": "smoothness.tough_animation_cases/css_value_type_filter" - }, - { - "avg_duration": "21.44867075757575", - "name": "smoothness.tough_animation_cases/css_value_type_filter.html?api=css_animations&N=0316" - }, - { - "avg_duration": "20.31625244444445", - "name": "smoothness.tough_animation_cases/css_value_type_length" - }, - { - "avg_duration": "19.414654767676772", - "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=css_animations&N=0316" - }, - { - "avg_duration": "19.231903808080805", - "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=web_animations&N=0316" - }, - { - "avg_duration": "21.256938535353534", - "name": "smoothness.tough_animation_cases/css_value_type_length_complex" - }, - { - "avg_duration": "20.169262676767673", - "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=css_animations&N=0316" - }, - { - "avg_duration": "20.087911707070713", - "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=web_animations&N=0316" - }, - { - "avg_duration": "21.181893484848487", - "name": "smoothness.tough_animation_cases/css_value_type_length_simple" - }, - { - "avg_duration": "20.010342969696968", - "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=css_animations&N=0316" - }, - { - "avg_duration": "20.069618040404038", - "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=web_animations&N=0316" - }, - { - "avg_duration": "20.709780898989905", - "name": "smoothness.tough_animation_cases/css_value_type_path" - }, - { - "avg_duration": "19.731114222222224", - "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=css_animations&N=0316" - }, - { - "avg_duration": "19.70664002020202", - "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=web_animations&N=0316" - }, - { - "avg_duration": "21.509252969696973", - "name": "smoothness.tough_animation_cases/css_value_type_shadow" - }, - { - "avg_duration": "21.35838207070707", - "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=css_animations&N=0316" - }, - { - "avg_duration": "21.33587556565656", - "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=web_animations&N=0316" - }, - { - "avg_duration": "20.33879624242424", - "name": "smoothness.tough_animation_cases/css_value_type_transform_complex" - }, - { - "avg_duration": "19.51641103030303", - "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=css_animations&N=0316" - }, - { - "avg_duration": "19.436825878787882", - "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=web_animations&N=0316" - }, - { - "avg_duration": "20.386949040404044", - "name": "smoothness.tough_animation_cases/css_value_type_transform_simple" - }, - { - "avg_duration": "19.19156432323231", - "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=css_animations&N=0316" - }, - { - "avg_duration": "19.137003050505047", - "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=web_animations&N=0316" - }, - { - "avg_duration": "19.599594303030308", - "name": "smoothness.tough_animation_cases/keyframed_animations" - }, - { - "avg_duration": "19.132103171717173", - "name": "smoothness.tough_animation_cases/keyframed_animations.html" - }, - { - "avg_duration": "19.86910092929293", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference" - }, - { - "avg_duration": "20.370881343434352", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference.html" - }, - { - "avg_duration": "19.900191191919195", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue" - }, - { - "avg_duration": "20.413504656565657", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue.html" - }, - { - "avg_duration": "21.131431525252523", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_propagating_isolation" - }, - { - "avg_duration": "20.187679181818183", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen" - }, - { - "avg_duration": "19.845335171717174", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen.html" - }, - { - "avg_duration": "19.5461165050505", - "name": "smoothness.tough_animation_cases/mix_blend_mode_propagating_isolation.html" - }, - { - "avg_duration": "32.22767561616162", - "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions.html" - }, - { - "avg_duration": "33.20080795959595", - "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions_page" - }, - { - "avg_duration": "4.8455595767857155E-4", - "name": "smoothness.tough_animation_cases/robohornetpro" - }, - { - "avg_duration": "17.972939474747474", - "name": "smoothness.tough_animation_cases/transform_transition_js_block.html" - }, - { - "avg_duration": "19.30439973737375", - "name": "smoothness.tough_animation_cases/transform_transitions" - }, - { - "avg_duration": "18.755499161616164", - "name": "smoothness.tough_animation_cases/transform_transitions.html" - }, - { - "avg_duration": "18.67489663636364", - "name": "smoothness.tough_animation_cases/transform_transitions_js_block" - }, - { - "avg_duration": "19.473717414141415", - "name": "smoothness.tough_animation_cases/web_animation_value_type_color" - }, - { - "avg_duration": "20.168445252525256", - "name": "smoothness.tough_animation_cases/web_animation_value_type_length_3d" - }, - { - "avg_duration": "21.21062104040404", - "name": "smoothness.tough_animation_cases/web_animation_value_type_length_complex" - }, - { - "avg_duration": "21.261173383838386", - "name": "smoothness.tough_animation_cases/web_animation_value_type_length_simple" - }, - { - "avg_duration": "21.080833535353534", - "name": "smoothness.tough_animation_cases/web_animation_value_type_path" - }, - { - "avg_duration": "21.378515292929293", - "name": "smoothness.tough_animation_cases/web_animation_value_type_shadow" - }, - { - "avg_duration": "20.269837080808088", - "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_complex" - }, - { - "avg_duration": "20.10208724242425", - "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_simple" - }, - { - "avg_duration": "20.526850353535348", - "name": "smoothness.tough_animation_cases/web_animations_many_keyframes" - }, - { - "avg_duration": "20.01270072727274", - "name": "smoothness.tough_animation_cases/web_animations_many_keyframes.html?N=0316" - }, - { - "avg_duration": "20.012832191919205", - "name": "smoothness.tough_animation_cases/web_animations_set_current_time" - }, - { - "avg_duration": "19.18994384848485", - "name": "smoothness.tough_animation_cases/web_animations_set_current_time_in_raf.html?N=0316" - }, - { - "avg_duration": "20.206273292929303", - "name": "smoothness.tough_animation_cases/web_animations_simultaneous" - }, - { - "avg_duration": "19.400241252525248", - "name": "smoothness.tough_animation_cases/web_animations_simultaneous.html?N=0316" - }, - { - "avg_duration": "21.733926222222212", - "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining" - }, - { - "avg_duration": "21.070184010101006", - "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining.html?N=0316" - }, - { - "avg_duration": "19.501389666666665", - "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "18.54585196969697", - "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations.html?N=0316" - }, - { - "avg_duration": "21.3411191010101", - "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering.html?N=0316" - }, - { - "avg_duration": "22.24820121212121", - "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering_page" - }, - { - "avg_duration": "16.97109825757576", - "name": "smoothness.tough_canvas_cases/../../../chrome/test/data/perf/canvas_bench/many_images.html" - }, - { - "avg_duration": "15.538356575757577", - "name": "smoothness.tough_canvas_cases/bouncing_balls_15" - }, - { - "avg_duration": "15.720745090909087", - "name": "smoothness.tough_canvas_cases/bouncing_balls_shadow" - }, - { - "avg_duration": "15.245964232323232", - "name": "smoothness.tough_canvas_cases/bouncing_clipped_rectangles" - }, - { - "avg_duration": "15.494264762626255", - "name": "smoothness.tough_canvas_cases/bouncing_gradient_circles" - }, - { - "avg_duration": "13.239104550505049", - "name": "smoothness.tough_canvas_cases/bouncing_png_images" - }, - { - "avg_duration": "20.56157848484848", - "name": "smoothness.tough_canvas_cases/bouncing_svg_images" - }, - { - "avg_duration": "20.488119636363635", - "name": "smoothness.tough_canvas_cases/canvas_animation_no_clear" - }, - { - "avg_duration": "15.099083020202018", - "name": "smoothness.tough_canvas_cases/canvas_arcs" - }, - { - "avg_duration": "14.708627131313127", - "name": "smoothness.tough_canvas_cases/canvas_font_cycler" - }, - { - "avg_duration": "15.006874752525253", - "name": "smoothness.tough_canvas_cases/canvas_lines" - }, - { - "avg_duration": "15.454984131313129", - "name": "smoothness.tough_canvas_cases/canvas_to_blob" - }, - { - "avg_duration": "15.830254590909096", - "name": "smoothness.tough_canvas_cases/chip_tune" - }, - { - "avg_duration": "16.37808577777777", - "name": "smoothness.tough_canvas_cases/crafty_mind" - }, - { - "avg_duration": "15.295616560606065", - "name": "smoothness.tough_canvas_cases/effect_games" - }, - { - "avg_duration": "15.303718626262631", - "name": "smoothness.tough_canvas_cases/fill_shapes" - }, - { - "avg_duration": "21.22070805050505", - "name": "smoothness.tough_canvas_cases/geo_apis" - }, - { - "avg_duration": "14.725042464646462", - "name": "smoothness.tough_canvas_cases/hakim" - }, - { - "avg_duration": "17.873728191919195", - "name": "smoothness.tough_canvas_cases/http://geoapis.appspot.com/agdnZW9hcGlzchMLEgtFeGFtcGxlQ29kZRjh1wIM" - }, - { - "avg_duration": "14.327840186868686", - "name": "smoothness.tough_canvas_cases/http://hakim.se/experiments/html5/magnetic/02/" - }, - { - "avg_duration": "15.016141116161611", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/TweetMap/Default.html" - }, - { - "avg_duration": "18.092686353535345", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/VideoCity/Default.html" - }, - { - "avg_duration": "16.27687405555556", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/WorkerFountains/Default.html" - }, - { - "avg_duration": "16.23176753535353", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/AsteroidBelt/Default.html" - }, - { - "avg_duration": "15.996415777777782", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html" - }, - { - "avg_duration": "16.678581666666666", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/LetItSnow/" - }, - { - "avg_duration": "14.578852136363633", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/SpeedReading/Default.html" - }, - { - "avg_duration": "18.561154525252526", - "name": "smoothness.tough_canvas_cases/http://jarrodoverson.com/static/demos/particleSystem/" - }, - { - "avg_duration": "13.65435204545454", - "name": "smoothness.tough_canvas_cases/http://mix10k.visitmix.com/Entry/Details/169" - }, - { - "avg_duration": "12.91898266161616", - "name": "smoothness.tough_canvas_cases/http://runway.countlessprojects.com/prototype/performance_test.html" - }, - { - "avg_duration": "14.191666898989906", - "name": "smoothness.tough_canvas_cases/http://spielzeugz.de/html5/liquid-particles.html" - }, - { - "avg_duration": "16.512002121212127", - "name": "smoothness.tough_canvas_cases/http://themaninblue.com/experiment/AnimationBenchmark/canvas/" - }, - { - "avg_duration": "15.916070868686866", - "name": "smoothness.tough_canvas_cases/http://www.chiptune.com/starfield/starfield.html" - }, - { - "avg_duration": "16.094371313131305", - "name": "smoothness.tough_canvas_cases/http://www.craftymind.com/factory/guimark2/HTML5ChartingTest.html" - }, - { - "avg_duration": "15.279647075757573", - "name": "smoothness.tough_canvas_cases/http://www.effectgames.com/demos/canvascycle/" - }, - { - "avg_duration": "14.155126570707068", - "name": "smoothness.tough_canvas_cases/http://www.kevs3d.co.uk/dev/canvask3d/k3d_test.html" - }, - { - "avg_duration": "13.687673974747469", - "name": "smoothness.tough_canvas_cases/http://www.megidish.net/awjs/" - }, - { - "avg_duration": "16.762573949494946", - "name": "smoothness.tough_canvas_cases/http://www.smashcat.org/av/canvas_test/" - }, - { - "avg_duration": "19.762025681818173", - "name": "smoothness.tough_canvas_cases/jarro_doverson" - }, - { - "avg_duration": "14.637509353535355", - "name": "smoothness.tough_canvas_cases/kevs_3d" - }, - { - "avg_duration": "16.356347752525252", - "name": "smoothness.tough_canvas_cases/man_in_blue" - }, - { - "avg_duration": "17.426727262626255", - "name": "smoothness.tough_canvas_cases/many_images" - }, - { - "avg_duration": "14.308331959595959", - "name": "smoothness.tough_canvas_cases/megi_dish" - }, - { - "avg_duration": "16.321057101010105", - "name": "smoothness.tough_canvas_cases/microsoft_asteroid_belt" - }, - { - "avg_duration": "15.864297222222218", - "name": "smoothness.tough_canvas_cases/microsoft_fish_ie_tank" - }, - { - "avg_duration": "18.011851843434346", - "name": "smoothness.tough_canvas_cases/microsoft_snow" - }, - { - "avg_duration": "14.284111949494955", - "name": "smoothness.tough_canvas_cases/microsoft_speed_reading" - }, - { - "avg_duration": "14.98003592424243", - "name": "smoothness.tough_canvas_cases/microsoft_tweet_map" - }, - { - "avg_duration": "18.007255909090905", - "name": "smoothness.tough_canvas_cases/microsoft_video_city" - }, - { - "avg_duration": "15.702358747474753", - "name": "smoothness.tough_canvas_cases/microsoft_worker_fountains" - }, - { - "avg_duration": "14.357012328282824", - "name": "smoothness.tough_canvas_cases/mix_10k" - }, - { - "avg_duration": "15.41180637373737", - "name": "smoothness.tough_canvas_cases/put_get_image_data" - }, - { - "avg_duration": "13.613691797979799", - "name": "smoothness.tough_canvas_cases/runway" - }, - { - "avg_duration": "16.755570808080815", - "name": "smoothness.tough_canvas_cases/smash_cat" - }, - { - "avg_duration": "14.532395055555549", - "name": "smoothness.tough_canvas_cases/spielzeugz" - }, - { - "avg_duration": "15.41411887878788", - "name": "smoothness.tough_canvas_cases/stroke_shapes" - }, - { - "avg_duration": "20.054326540404045", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-animation-no-clear.html" - }, - { - "avg_duration": "14.101594818181812", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-font-cycler.html" - }, - { - "avg_duration": "15.412620070707074", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=image_with_shadow&back=image" - }, - { - "avg_duration": "15.63554960606061", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=text&back=white&ball_count=15" - }, - { - "avg_duration": "14.723285803030306", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas_toBlob.html" - }, - { - "avg_duration": "14.860972863636366", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_clipped_rectangles.html" - }, - { - "avg_duration": "15.230798515151516", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_gradient_circles.html" - }, - { - "avg_duration": "12.513170196969696", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_png_images.html" - }, - { - "avg_duration": "20.379388156565657", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_svg_images.html" - }, - { - "avg_duration": "14.934645621212125", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_arcs.html" - }, - { - "avg_duration": "14.733427994949492", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_lines.html" - }, - { - "avg_duration": "15.068431050505058", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/fill_shapes.html" - }, - { - "avg_duration": "15.120008510101007", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/put_get_image_data.html" - }, - { - "avg_duration": "15.179336010101013", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/stroke_shapes.html" - }, - { - "avg_duration": "22.727957838383833", - "name": "smoothness.tough_filters_cases/Analog_Clock_SVG" - }, - { - "avg_duration": "22.67620416161616", - "name": "smoothness.tough_filters_cases/Filter_Terrain_SVG" - }, - { - "avg_duration": "23.08172914141414", - "name": "smoothness.tough_filters_cases/IE_PirateMark" - }, - { - "avg_duration": "28.46426723232322", - "name": "smoothness.tough_filters_cases/MotionMark_Focus" - }, - { - "avg_duration": "23.285338616161617", - "name": "smoothness.tough_filters_cases/analog_clock_svg" - }, - { - "avg_duration": "24.16397927272728", - "name": "smoothness.tough_filters_cases/filter_terrain_svg" - }, - { - "avg_duration": "24.253582171717163", - "name": "smoothness.tough_filters_cases/ie_pirate_mark" - }, - { - "avg_duration": "30.587078949494956", - "name": "smoothness.tough_filters_cases/motion_mark_focus" - }, - { - "avg_duration": "15.585223045454546", - "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-unscaled.html" - }, - { - "avg_duration": "10.104114913131314", - "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-viewport-width.html" - }, - { - "avg_duration": "25.255139696969703", - "name": "smoothness.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" - }, - { - "avg_duration": "29.456434151515147", - "name": "smoothness.tough_path_rendering_cases/IE_Chalkboard" - }, - { - "avg_duration": "20.348708040404045", - "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" - }, - { - "avg_duration": "20.199610969696977", - "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" - }, - { - "avg_duration": "29.06890104040404", - "name": "smoothness.tough_path_rendering_cases/guimark_vector_chart" - }, - { - "avg_duration": "30.640856222222226", - "name": "smoothness.tough_path_rendering_cases/ie_chalkboard" - }, - { - "avg_duration": "20.625455080808084", - "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" - }, - { - "avg_duration": "20.417677454545455", - "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" - }, - { - "avg_duration": "17.238790444444444", - "name": "smoothness.tough_scrolling_cases/canvas_05000_pixels_per_second" - }, - { - "avg_duration": "16.739972484848497", - "name": "smoothness.tough_scrolling_cases/canvas_10000_pixels_per_second" - }, - { - "avg_duration": "14.558255898989902", - "name": "smoothness.tough_scrolling_cases/canvas_15000_pixels_per_second" - }, - { - "avg_duration": "13.419603904040411", - "name": "smoothness.tough_scrolling_cases/canvas_20000_pixels_per_second" - }, - { - "avg_duration": "12.281880525252527", - "name": "smoothness.tough_scrolling_cases/canvas_30000_pixels_per_second" - }, - { - "avg_duration": "11.730005388888891", - "name": "smoothness.tough_scrolling_cases/canvas_40000_pixels_per_second" - }, - { - "avg_duration": "11.333403070707075", - "name": "smoothness.tough_scrolling_cases/canvas_50000_pixels_per_second" - }, - { - "avg_duration": "11.157241106060603", - "name": "smoothness.tough_scrolling_cases/canvas_60000_pixels_per_second" - }, - { - "avg_duration": "10.998777262626264", - "name": "smoothness.tough_scrolling_cases/canvas_75000_pixels_per_second" - }, - { - "avg_duration": "10.751525414141412", - "name": "smoothness.tough_scrolling_cases/canvas_90000_pixels_per_second" - }, - { - "avg_duration": "23.956693641414134", - "name": "smoothness.tough_scrolling_cases/text_05000_pixels_per_second" - }, - { - "avg_duration": "15.471544207070703", - "name": "smoothness.tough_scrolling_cases/text_10000_pixels_per_second" - }, - { - "avg_duration": "13.055524484848483", - "name": "smoothness.tough_scrolling_cases/text_15000_pixels_per_second" - }, - { - "avg_duration": "12.016709434343435", - "name": "smoothness.tough_scrolling_cases/text_20000_pixels_per_second" - }, - { - "avg_duration": "10.860229146464645", - "name": "smoothness.tough_scrolling_cases/text_30000_pixels_per_second" - }, - { - "avg_duration": "10.291745373737374", - "name": "smoothness.tough_scrolling_cases/text_40000_pixels_per_second" - }, - { - "avg_duration": "9.914364974747475", - "name": "smoothness.tough_scrolling_cases/text_50000_pixels_per_second" - }, - { - "avg_duration": "9.687836404040405", - "name": "smoothness.tough_scrolling_cases/text_60000_pixels_per_second" - }, - { - "avg_duration": "9.456424206060607", - "name": "smoothness.tough_scrolling_cases/text_75000_pixels_per_second" - }, - { - "avg_duration": "9.330212476767677", - "name": "smoothness.tough_scrolling_cases/text_90000_pixels_per_second" - }, - { - "avg_duration": "18.553055444444443", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" - }, - { - "avg_duration": "17.924506070707064", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" - }, - { - "avg_duration": "15.610034106060615", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" - }, - { - "avg_duration": "14.571982964646464", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" - }, - { - "avg_duration": "13.399331171717172", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" - }, - { - "avg_duration": "12.926660883838377", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" - }, - { - "avg_duration": "12.553170378787879", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" - }, - { - "avg_duration": "12.330210712121211", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" - }, - { - "avg_duration": "12.132675595959599", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" - }, - { - "avg_duration": "11.996525459595958", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" - }, - { - "avg_duration": "15.637217287878789", - "name": "smoothness.tough_scrolling_cases/text_hover_05000_pixels_per_second" - }, - { - "avg_duration": "15.013510984848477", - "name": "smoothness.tough_scrolling_cases/text_hover_10000_pixels_per_second" - }, - { - "avg_duration": "12.932072560606056", - "name": "smoothness.tough_scrolling_cases/text_hover_15000_pixels_per_second" - }, - { - "avg_duration": "11.891085045454547", - "name": "smoothness.tough_scrolling_cases/text_hover_20000_pixels_per_second" - }, - { - "avg_duration": "10.715879035353531", - "name": "smoothness.tough_scrolling_cases/text_hover_30000_pixels_per_second" - }, - { - "avg_duration": "10.152733813131311", - "name": "smoothness.tough_scrolling_cases/text_hover_40000_pixels_per_second" - }, - { - "avg_duration": "9.834022005050508", - "name": "smoothness.tough_scrolling_cases/text_hover_50000_pixels_per_second" - }, - { - "avg_duration": "9.687693368686869", - "name": "smoothness.tough_scrolling_cases/text_hover_60000_pixels_per_second" - }, - { - "avg_duration": "9.411259032323231", - "name": "smoothness.tough_scrolling_cases/text_hover_75000_pixels_per_second" - }, - { - "avg_duration": "9.328577730303032", - "name": "smoothness.tough_scrolling_cases/text_hover_90000_pixels_per_second" - }, - { - "avg_duration": "29.898551515151507", - "name": "smoothness.tough_texture_upload_cases/background_color_animation.html" - }, - { - "avg_duration": "26.97655106060606", - "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient.html" - }, - { - "avg_duration": "21.937712414141416", - "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads.html" - }, - { - "avg_duration": "23.010325434343436", - "name": "smoothness.tough_texture_upload_cases/large_texture_uploads.html" - }, - { - "avg_duration": "20.144559727272725", - "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads.html" - }, - { - "avg_duration": "19.173596474747477", - "name": "smoothness.tough_texture_upload_cases/small_texture_uploads.html" - }, - { - "avg_duration": "26.835263686868682", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swf.webglbeta.html" - }, - { - "avg_duration": "20.65970282828284", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swf.webglbeta.html" - }, - { - "avg_duration": "20.663596636363636", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swf.webglbeta.html" - }, - { - "avg_duration": "20.676733939393934", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swf.webglbeta.html" - }, - { - "avg_duration": "20.675622323232318", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swf.webglbeta.html" - }, - { - "avg_duration": "20.71086863636363", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swf.webglbeta.html" - }, - { - "avg_duration": "20.667169020202017", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swf.webglbeta.html" - }, - { - "avg_duration": "20.6848757979798", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swf.webglbeta.html" - }, - { - "avg_duration": "20.69032996969697", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swf.webglbeta.html" - }, - { - "avg_duration": "20.63939316161616", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swf.webglbeta.html" - }, - { - "avg_duration": "20.83241933333334", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swf.webglbeta.html" - }, - { - "avg_duration": "15.171302206060602", - "name": "smoothness.tough_webgl_cases/animometer_webgl" - }, - { - "avg_duration": "22.39897465353535", - "name": "smoothness.tough_webgl_cases/aquarium" - }, - { - "avg_duration": "19.40566771919192", - "name": "smoothness.tough_webgl_cases/aquarium_20k" - }, - { - "avg_duration": "15.418316095959597", - "name": "smoothness.tough_webgl_cases/blob" - }, - { - "avg_duration": "16.78242027979798", - "name": "smoothness.tough_webgl_cases/dynamic_cube_map" - }, - { - "avg_duration": "14.551259337373732", - "name": "smoothness.tough_webgl_cases/earth" - }, - { - "avg_duration": "16.12191535959596", - "name": "smoothness.tough_webgl_cases/http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html" - }, - { - "avg_duration": "24.400172367676767", - "name": "smoothness.tough_webgl_cases/http://webglsamples.org/aquarium/aquarium.html" - }, - { - "avg_duration": "15.875539536363634", - "name": "smoothness.tough_webgl_cases/http://webglsamples.org/blob/blob.html" - }, - { - "avg_duration": "16.65242191111111", - "name": "smoothness.tough_webgl_cases/http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html" - }, - { - "avg_duration": "19.3204608989899", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html" - }, - { - "avg_duration": "15.888718343434338", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html" - }, - { - "avg_duration": "17.34557523030303", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html" - }, - { - "avg_duration": "14.812420464646463", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html" - }, - { - "avg_duration": "15.137208694949496", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html" - }, - { - "avg_duration": "15.981114429032262", - "name": "smoothness.tough_webgl_cases/ken_russell" - }, - { - "avg_duration": "15.064020697979801", - "name": "smoothness.tough_webgl_cases/many_planets_deep" - }, - { - "avg_duration": "23.52423369999999", - "name": "smoothness.tough_webgl_cases/nvidia_vertex_buffer_object" - }, - { - "avg_duration": "16.78399364545454", - "name": "smoothness.tough_webgl_cases/particles" - }, - { - "avg_duration": "19.17932523030303", - "name": "smoothness.tough_webgl_cases/san_angeles" - }, - { - "avg_duration": "18.439315783870963", - "name": "smoothness.tough_webgl_cases/sans_angeles" - }, - { - "avg_duration": "51.34675094949495", - "name": "speedometer-future/http://browserbench.org/Speedometer/" - }, - { - "avg_duration": "50.92902790909092", - "name": "speedometer/http://browserbench.org/Speedometer/" - }, - { - "avg_duration": "94.09177914141412", - "name": "speedometer2-future/Speedometer2" - }, - { - "avg_duration": "94.40510892929296", - "name": "speedometer2/Speedometer2" - }, - { - "avg_duration": "82.3368541919192", - "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "114.199672979798", - "name": "system_health.common_desktop/browse:media:imgur" - }, - { - "avg_duration": "76.68722123232325", - "name": "system_health.common_desktop/browse:media:pinterest" - }, - { - "avg_duration": "5.139589276E-4", - "name": "system_health.common_desktop/browse:media:tumblr" - }, - { - "avg_duration": "83.1258405757576", - "name": "system_health.common_desktop/browse:media:youtube" - }, - { - "avg_duration": "89.7009535858586", - "name": "system_health.common_desktop/browse:news:cnn" - }, - { - "avg_duration": "60.783960141414134", - "name": "system_health.common_desktop/browse:news:flipboard" - }, - { - "avg_duration": "54.17100810101009", - "name": "system_health.common_desktop/browse:news:hackernews" - }, - { - "avg_duration": "93.92613203030301", - "name": "system_health.common_desktop/browse:news:nytimes" - }, - { - "avg_duration": "74.04722950505051", - "name": "system_health.common_desktop/browse:news:reddit" - }, - { - "avg_duration": "61.00552963636365", - "name": "system_health.common_desktop/browse:search:google" - }, - { - "avg_duration": "43.49988181818182", - "name": "system_health.common_desktop/browse:search:google_india" - }, - { - "avg_duration": "79.3170623232323", - "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "92.21371959595956", - "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "54.536502686868694", - "name": "system_health.common_desktop/browse:social:twitter" - }, - { - "avg_duration": "93.12901788888887", - "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll" - }, - { - "avg_duration": "81.3542751313131", - "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "66.36275320202014", - "name": "system_health.common_desktop/browse:tools:earth" - }, - { - "avg_duration": "51.19878194949495", - "name": "system_health.common_desktop/browse:tools:maps" - }, - { - "avg_duration": "26.438733101010126", - "name": "system_health.common_desktop/browse_accessibility:tech:codesearch" - }, - { - "avg_duration": "6.959592072580643E-4", - "name": "system_health.common_desktop/browse_accessibility:tools:gmail_compose" - }, - { - "avg_duration": "20.498148757575763", - "name": "system_health.common_desktop/load:chrome:blank" - }, - { - "avg_duration": "23.657834606060597", - "name": "system_health.common_desktop/load:games:alphabetty" - }, - { - "avg_duration": "26.60185096969698", - "name": "system_health.common_desktop/load:games:bubbles" - }, - { - "avg_duration": "22.550100707070712", - "name": "system_health.common_desktop/load:games:lazors" - }, - { - "avg_duration": "28.25394541414142", - "name": "system_health.common_desktop/load:games:miniclip" - }, - { - "avg_duration": "31.449059858585862", - "name": "system_health.common_desktop/load:games:spychase" - }, - { - "avg_duration": "38.108721494949485", - "name": "system_health.common_desktop/load:media:9gag" - }, - { - "avg_duration": "25.831872272727274", - "name": "system_health.common_desktop/load:media:dailymotion" - }, - { - "avg_duration": "24.407848686868682", - "name": "system_health.common_desktop/load:media:google_images" - }, - { - "avg_duration": "30.662335959595946", - "name": "system_health.common_desktop/load:media:imgur" - }, - { - "avg_duration": "31.20423959595959", - "name": "system_health.common_desktop/load:media:soundcloud" - }, - { - "avg_duration": "27.025370494949495", - "name": "system_health.common_desktop/load:media:youtube" - }, - { - "avg_duration": "25.268706818181816", - "name": "system_health.common_desktop/load:news:bbc" - }, - { - "avg_duration": "31.48729373737373", - "name": "system_health.common_desktop/load:news:cnn" - }, - { - "avg_duration": "24.8549688080808", - "name": "system_health.common_desktop/load:news:flipboard" - }, - { - "avg_duration": "22.198739515151512", - "name": "system_health.common_desktop/load:news:hackernews" - }, - { - "avg_duration": "29.012636151515146", - "name": "system_health.common_desktop/load:news:nytimes" - }, - { - "avg_duration": "32.84296372727271", - "name": "system_health.common_desktop/load:news:qq" - }, - { - "avg_duration": "24.114319313131308", - "name": "system_health.common_desktop/load:news:reddit" - }, - { - "avg_duration": "24.452644808080798", - "name": "system_health.common_desktop/load:news:wikipedia" - }, - { - "avg_duration": "25.183808939393945", - "name": "system_health.common_desktop/load:search:amazon" - }, - { - "avg_duration": "23.196135676767675", - "name": "system_health.common_desktop/load:search:baidu" - }, - { - "avg_duration": "26.03403817171716", - "name": "system_health.common_desktop/load:search:ebay" - }, - { - "avg_duration": "23.733672323232327", - "name": "system_health.common_desktop/load:search:google" - }, - { - "avg_duration": "25.097237101010098", - "name": "system_health.common_desktop/load:search:taobao" - }, - { - "avg_duration": "23.240718767676764", - "name": "system_health.common_desktop/load:search:yahoo" - }, - { - "avg_duration": "23.24786594949495", - "name": "system_health.common_desktop/load:search:yandex" - }, - { - "avg_duration": "25.43468824242425", - "name": "system_health.common_desktop/load:social:instagram" - }, - { - "avg_duration": "26.404636090909086", - "name": "system_health.common_desktop/load:social:pinterest" - }, - { - "avg_duration": "24.782769080808084", - "name": "system_health.common_desktop/load:social:vk" - }, - { - "avg_duration": "42.88676370707072", - "name": "system_health.common_desktop/load:tools:docs" - }, - { - "avg_duration": "36.499996141414144", - "name": "system_health.common_desktop/load:tools:drive" - }, - { - "avg_duration": "25.988827888888896", - "name": "system_health.common_desktop/load:tools:dropbox" - }, - { - "avg_duration": "31.304849868686865", - "name": "system_health.common_desktop/load:tools:gmail" - }, - { - "avg_duration": "24.93964053535354", - "name": "system_health.common_desktop/load:tools:stackoverflow" - }, - { - "avg_duration": "29.95352874747475", - "name": "system_health.common_desktop/load:tools:weather" - }, - { - "avg_duration": "24.104244505050495", - "name": "system_health.common_desktop/load_accessibility:media:wikipedia" - }, - { - "avg_duration": "30.78014754545453", - "name": "system_health.common_desktop/load_accessibility:shopping:amazon" - }, - { - "avg_duration": "142.47029868686872", - "name": "system_health.common_desktop/long_running:tools:gmail-background" - }, - { - "avg_duration": "227.13041292929293", - "name": "system_health.common_desktop/long_running:tools:gmail-foreground" - }, - { - "avg_duration": "156.25515313131314", - "name": "system_health.common_desktop/multitab:misc:typical24" - }, - { - "avg_duration": "3.4683483846153845E-4", - "name": "system_health.common_desktop/play:media:google_play_music" - }, - { - "avg_duration": "6.63543563448276E-4", - "name": "system_health.common_desktop/play:media:pandora" - }, - { - "avg_duration": "60.47353866666664", - "name": "system_health.common_desktop/play:media:soundcloud" - }, - { - "avg_duration": "62.540415717171726", - "name": "system_health.memory_desktop/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "73.17505626262624", - "name": "system_health.memory_desktop/browse:media:imgur" - }, - { - "avg_duration": "65.55952032323233", - "name": "system_health.memory_desktop/browse:media:pinterest" - }, - { - "avg_duration": "63.901727717171724", - "name": "system_health.memory_desktop/browse:media:tumblr" - }, - { - "avg_duration": "63.57714311111111", - "name": "system_health.memory_desktop/browse:media:youtube" - }, - { - "avg_duration": "60.451394080808086", - "name": "system_health.memory_desktop/browse:news:cnn" - }, - { - "avg_duration": "48.577630929292944", - "name": "system_health.memory_desktop/browse:news:flipboard" - }, - { - "avg_duration": "49.652371212121224", - "name": "system_health.memory_desktop/browse:news:hackernews" - }, - { - "avg_duration": "60.24062453535355", - "name": "system_health.memory_desktop/browse:news:nytimes" - }, - { - "avg_duration": "58.30893571717173", - "name": "system_health.memory_desktop/browse:news:reddit" - }, - { - "avg_duration": "48.3390072222222", - "name": "system_health.memory_desktop/browse:search:google" - }, - { - "avg_duration": "38.33019343434345", - "name": "system_health.memory_desktop/browse:search:google_india" - }, - { - "avg_duration": "65.8463427171717", - "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "66.58066644444442", - "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "46.90201471717174", - "name": "system_health.memory_desktop/browse:social:twitter" - }, - { - "avg_duration": "5.771389978571429E-4", - "name": "system_health.memory_desktop/browse:social:twitter_infinite_scroll" - }, - { - "avg_duration": "64.16041628282828", - "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "48.39082823232322", - "name": "system_health.memory_desktop/browse:tools:earth" - }, - { - "avg_duration": "40.98182826262629", - "name": "system_health.memory_desktop/browse:tools:maps" - }, - { - "avg_duration": "22.609168292929287", - "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch" - }, - { - "avg_duration": "7.160620196363636E-4", - "name": "system_health.memory_desktop/browse_accessibility:tools:gmail_compose" - }, - { - "avg_duration": "17.987341237373737", - "name": "system_health.memory_desktop/load:chrome:blank" - }, - { - "avg_duration": "20.48097976767676", - "name": "system_health.memory_desktop/load:games:alphabetty" - }, - { - "avg_duration": "23.22872671717172", - "name": "system_health.memory_desktop/load:games:bubbles" - }, - { - "avg_duration": "19.74540738383838", - "name": "system_health.memory_desktop/load:games:lazors" - }, - { - "avg_duration": "22.72987362626263", - "name": "system_health.memory_desktop/load:games:miniclip" - }, - { - "avg_duration": "25.78747860606061", - "name": "system_health.memory_desktop/load:games:spychase" - }, - { - "avg_duration": "29.139935939393922", - "name": "system_health.memory_desktop/load:media:9gag" - }, - { - "avg_duration": "21.76572581818184", - "name": "system_health.memory_desktop/load:media:dailymotion" - }, - { - "avg_duration": "21.194054626262623", - "name": "system_health.memory_desktop/load:media:google_images" - }, - { - "avg_duration": "24.956811464646467", - "name": "system_health.memory_desktop/load:media:imgur" - }, - { - "avg_duration": "24.08559647474747", - "name": "system_health.memory_desktop/load:media:soundcloud" - }, - { - "avg_duration": "21.931889818181826", - "name": "system_health.memory_desktop/load:media:youtube" - }, - { - "avg_duration": "22.139209707070712", - "name": "system_health.memory_desktop/load:news:bbc" - }, - { - "avg_duration": "25.07644933333334", - "name": "system_health.memory_desktop/load:news:cnn" - }, - { - "avg_duration": "21.04197846464646", - "name": "system_health.memory_desktop/load:news:flipboard" - }, - { - "avg_duration": "19.308445282828288", - "name": "system_health.memory_desktop/load:news:hackernews" - }, - { - "avg_duration": "22.910361060606053", - "name": "system_health.memory_desktop/load:news:nytimes" - }, - { - "avg_duration": "26.24032229292928", - "name": "system_health.memory_desktop/load:news:qq" - }, - { - "avg_duration": "20.63625094949495", - "name": "system_health.memory_desktop/load:news:reddit" - }, - { - "avg_duration": "21.339096181818185", - "name": "system_health.memory_desktop/load:news:wikipedia" - }, - { - "avg_duration": "21.09931973737374", - "name": "system_health.memory_desktop/load:search:amazon" - }, - { - "avg_duration": "20.080840383838392", - "name": "system_health.memory_desktop/load:search:baidu" - }, - { - "avg_duration": "21.5326737979798", - "name": "system_health.memory_desktop/load:search:ebay" - }, - { - "avg_duration": "20.245210585858583", - "name": "system_health.memory_desktop/load:search:google" - }, - { - "avg_duration": "21.467310151515147", - "name": "system_health.memory_desktop/load:search:taobao" - }, - { - "avg_duration": "20.289292959595954", - "name": "system_health.memory_desktop/load:search:yahoo" - }, - { - "avg_duration": "20.155686191919195", - "name": "system_health.memory_desktop/load:search:yandex" - }, - { - "avg_duration": "21.69161568686868", - "name": "system_health.memory_desktop/load:social:instagram" - }, - { - "avg_duration": "22.68231987878788", - "name": "system_health.memory_desktop/load:social:pinterest" - }, - { - "avg_duration": "21.298487202020205", - "name": "system_health.memory_desktop/load:social:vk" - }, - { - "avg_duration": "25.276945767676764", - "name": "system_health.memory_desktop/load:tools:docs" - }, - { - "avg_duration": "26.12457269696969", - "name": "system_health.memory_desktop/load:tools:drive" - }, - { - "avg_duration": "21.425068696969696", - "name": "system_health.memory_desktop/load:tools:dropbox" - }, - { - "avg_duration": "24.685946939393943", - "name": "system_health.memory_desktop/load:tools:gmail" - }, - { - "avg_duration": "21.492869202020206", - "name": "system_health.memory_desktop/load:tools:stackoverflow" - }, - { - "avg_duration": "23.8091004949495", - "name": "system_health.memory_desktop/load:tools:weather" - }, - { - "avg_duration": "20.61608703030303", - "name": "system_health.memory_desktop/load_accessibility:media:wikipedia" - }, - { - "avg_duration": "26.48231772727273", - "name": "system_health.memory_desktop/load_accessibility:shopping:amazon" - }, - { - "avg_duration": "155.32871151515158", - "name": "system_health.memory_desktop/long_running:tools:gmail-background" - }, - { - "avg_duration": "153.4656069696969", - "name": "system_health.memory_desktop/long_running:tools:gmail-foreground" - }, - { - "avg_duration": "110.54936367676765", - "name": "system_health.memory_desktop/multitab:misc:typical24" - }, - { - "avg_duration": "5.100965390625E-4", - "name": "system_health.memory_desktop/play:media:google_play_music" - }, - { - "avg_duration": "6.563242638235293E-4", - "name": "system_health.memory_desktop/play:media:pandora" - }, - { - "avg_duration": "44.85171574747477", - "name": "system_health.memory_desktop/play:media:soundcloud" - }, - { - "avg_duration": "110.98863632323229", - "name": "tab_switching.typical_25/multitab:misc:typical24" - }, - { - "avg_duration": "34.149533383838396", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/beqojupo/1/quiet?JS_FULL_SCREEN_INVALIDATION" - }, - { - "avg_duration": "30.843939171717167", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/covoqi/1/quiet?NEW_TILINGS" - }, - { - "avg_duration": "24.387449161616154", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/falefice/1/quiet?CC_POSTER_CIRCLE" - }, - { - "avg_duration": "25.694355505050503", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/giqafofe/1/quiet?JS_POSTER_CIRCLE" - }, - { - "avg_duration": "21.990855666666672", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/jevibahi/4/quiet?JS_SCROLL_200_LAYER_GRID" - }, - { - "avg_duration": "25.600268939393935", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/pixavefe/1/quiet?CC_SCROLL_TEXT_ONLY" - }, - { - "avg_duration": "22.239103838383834", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/wixadinu/2/quiet?JS_SCROLL_TEXT_ONLY" - }, - { - "avg_duration": "21.8991898989899", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/yakagevo/1/quiet?CC_SCROLL_200_LAYER_GRID" - }, - { - "avg_duration": "19.36332038383839", - "name": "thread_times.tough_scrolling_cases/canvas_05000_pixels_per_second" - }, - { - "avg_duration": "18.944455050505052", - "name": "thread_times.tough_scrolling_cases/canvas_10000_pixels_per_second" - }, - { - "avg_duration": "16.132776828282832", - "name": "thread_times.tough_scrolling_cases/canvas_15000_pixels_per_second" - }, - { - "avg_duration": "14.716707888888882", - "name": "thread_times.tough_scrolling_cases/canvas_20000_pixels_per_second" - }, - { - "avg_duration": "13.274723732323233", - "name": "thread_times.tough_scrolling_cases/canvas_30000_pixels_per_second" - }, - { - "avg_duration": "12.619827611111107", - "name": "thread_times.tough_scrolling_cases/canvas_40000_pixels_per_second" - }, - { - "avg_duration": "12.097747136363642", - "name": "thread_times.tough_scrolling_cases/canvas_50000_pixels_per_second" - }, - { - "avg_duration": "11.751150651515152", - "name": "thread_times.tough_scrolling_cases/canvas_60000_pixels_per_second" - }, - { - "avg_duration": "11.513722232323232", - "name": "thread_times.tough_scrolling_cases/canvas_75000_pixels_per_second" - }, - { - "avg_duration": "11.28553542424243", - "name": "thread_times.tough_scrolling_cases/canvas_90000_pixels_per_second" - }, - { - "avg_duration": "24.900535383838406", - "name": "thread_times.tough_scrolling_cases/text_05000_pixels_per_second" - }, - { - "avg_duration": "16.877746686868687", - "name": "thread_times.tough_scrolling_cases/text_10000_pixels_per_second" - }, - { - "avg_duration": "14.138678474747481", - "name": "thread_times.tough_scrolling_cases/text_15000_pixels_per_second" - }, - { - "avg_duration": "12.818808818181818", - "name": "thread_times.tough_scrolling_cases/text_20000_pixels_per_second" - }, - { - "avg_duration": "11.470634833333335", - "name": "thread_times.tough_scrolling_cases/text_30000_pixels_per_second" - }, - { - "avg_duration": "10.768681949494953", - "name": "thread_times.tough_scrolling_cases/text_40000_pixels_per_second" - }, - { - "avg_duration": "10.404906333333335", - "name": "thread_times.tough_scrolling_cases/text_50000_pixels_per_second" - }, - { - "avg_duration": "10.077428035353538", - "name": "thread_times.tough_scrolling_cases/text_60000_pixels_per_second" - }, - { - "avg_duration": "9.842940550505048", - "name": "thread_times.tough_scrolling_cases/text_75000_pixels_per_second" - }, - { - "avg_duration": "9.679638830303038", - "name": "thread_times.tough_scrolling_cases/text_90000_pixels_per_second" - }, - { - "avg_duration": "21.54457829292929", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" - }, - { - "avg_duration": "20.98124339393939", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" - }, - { - "avg_duration": "17.95952094444445", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" - }, - { - "avg_duration": "16.430293747474757", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" - }, - { - "avg_duration": "14.841692257575756", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" - }, - { - "avg_duration": "14.169464277777791", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" - }, - { - "avg_duration": "13.605584282828282", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" - }, - { - "avg_duration": "13.225295873737373", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" - }, - { - "avg_duration": "12.941363888888894", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" - }, - { - "avg_duration": "12.738944398989894", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" - }, - { - "avg_duration": "17.13551661111111", - "name": "thread_times.tough_scrolling_cases/text_hover_05000_pixels_per_second" - }, - { - "avg_duration": "16.534765737373732", - "name": "thread_times.tough_scrolling_cases/text_hover_10000_pixels_per_second" - }, - { - "avg_duration": "14.062752171717182", - "name": "thread_times.tough_scrolling_cases/text_hover_15000_pixels_per_second" - }, - { - "avg_duration": "12.701652040404042", - "name": "thread_times.tough_scrolling_cases/text_hover_20000_pixels_per_second" - }, - { - "avg_duration": "11.357989202020201", - "name": "thread_times.tough_scrolling_cases/text_hover_30000_pixels_per_second" - }, - { - "avg_duration": "10.66951190909091", - "name": "thread_times.tough_scrolling_cases/text_hover_40000_pixels_per_second" - }, - { - "avg_duration": "10.301456666666668", - "name": "thread_times.tough_scrolling_cases/text_hover_50000_pixels_per_second" - }, - { - "avg_duration": "10.745966434343432", - "name": "thread_times.tough_scrolling_cases/text_hover_60000_pixels_per_second" - }, - { - "avg_duration": "9.723813595959594", - "name": "thread_times.tough_scrolling_cases/text_hover_75000_pixels_per_second" - }, - { - "avg_duration": "9.553528681818182", - "name": "thread_times.tough_scrolling_cases/text_hover_90000_pixels_per_second" - }, - { - "avg_duration": "11.759683878787877", - "name": "tracing.tracing_with_background_memory_infra/Facebook" - }, - { - "avg_duration": "12.269666929292931", - "name": "tracing.tracing_with_background_memory_infra/Wikipedia" - }, - { - "avg_duration": "10.292047621212122", - "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" - }, - { - "avg_duration": "10.897554914141413", - "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" - }, - { - "avg_duration": "10.410087525252523", - "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" - }, - { - "avg_duration": "10.963668171717181", - "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" - }, - { - "avg_duration": "12.867173823232323", - "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" - }, - { - "avg_duration": "18.63103838383838", - "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" - }, - { - "avg_duration": "13.57200807070707", - "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" - }, - { - "avg_duration": "86.8862782323232", - "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "265.3043401010102", - "name": "v8.browsing_desktop-future/browse:media:imgur" - }, - { - "avg_duration": "88.4343057979798", - "name": "v8.browsing_desktop-future/browse:media:pinterest" - }, - { - "avg_duration": "100.77457501010095", - "name": "v8.browsing_desktop-future/browse:media:tumblr" - }, - { - "avg_duration": "107.1324632121213", - "name": "v8.browsing_desktop-future/browse:media:youtube" - }, - { - "avg_duration": "146.1861557373738", - "name": "v8.browsing_desktop-future/browse:news:cnn" - }, - { - "avg_duration": "69.01329135353538", - "name": "v8.browsing_desktop-future/browse:news:flipboard" - }, - { - "avg_duration": "57.35667355555554", - "name": "v8.browsing_desktop-future/browse:news:hackernews" - }, - { - "avg_duration": "135.74188761616162", - "name": "v8.browsing_desktop-future/browse:news:nytimes" - }, - { - "avg_duration": "87.9440824242425", - "name": "v8.browsing_desktop-future/browse:news:reddit" - }, - { - "avg_duration": "61.98612421212122", - "name": "v8.browsing_desktop-future/browse:search:google" - }, - { - "avg_duration": "46.10064057575759", - "name": "v8.browsing_desktop-future/browse:search:google_india" - }, - { - "avg_duration": "103.75746748484845", - "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "114.25329769696967", - "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "60.74103158585857", - "name": "v8.browsing_desktop-future/browse:social:twitter" - }, - { - "avg_duration": "97.95393153535356", - "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll" - }, - { - "avg_duration": "119.90146006060604", - "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "92.68529465656566", - "name": "v8.browsing_desktop-future/browse:tools:earth" - }, - { - "avg_duration": "70.27434320202018", - "name": "v8.browsing_desktop-future/browse:tools:maps" - }, - { - "avg_duration": "86.72092447474748", - "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "257.50523424242425", - "name": "v8.browsing_desktop/browse:media:imgur" - }, - { - "avg_duration": "88.19363127272732", - "name": "v8.browsing_desktop/browse:media:pinterest" - }, - { - "avg_duration": "99.07795723232324", - "name": "v8.browsing_desktop/browse:media:tumblr" - }, - { - "avg_duration": "106.48767910101009", - "name": "v8.browsing_desktop/browse:media:youtube" - }, - { - "avg_duration": "144.25491795959593", - "name": "v8.browsing_desktop/browse:news:cnn" - }, - { - "avg_duration": "51.23079594185878", - "name": "v8.browsing_desktop/browse:news:flipboard" - }, - { - "avg_duration": "43.78456548728386", - "name": "v8.browsing_desktop/browse:news:hackernews" - }, - { - "avg_duration": "134.13734256565655", - "name": "v8.browsing_desktop/browse:news:nytimes" - }, - { - "avg_duration": "87.5141026868687", - "name": "v8.browsing_desktop/browse:news:reddit" - }, - { - "avg_duration": "62.04862045454543", - "name": "v8.browsing_desktop/browse:search:google" - }, - { - "avg_duration": "46.19492078787879", - "name": "v8.browsing_desktop/browse:search:google_india" - }, - { - "avg_duration": "104.50446749494951", - "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "114.82597389898987", - "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "60.68723423232323", - "name": "v8.browsing_desktop/browse:social:twitter" - }, - { - "avg_duration": "97.92195691919194", - "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll" - }, - { - "avg_duration": "121.61664322222221", - "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "93.83666450505046", - "name": "v8.browsing_desktop/browse:tools:earth" - }, - { - "avg_duration": "69.7128163989899", - "name": "v8.browsing_desktop/browse:tools:maps" - }, - { - "avg_duration": "31.977842505050504", - "name": "v8.runtime_stats.top_25/AdsAMPAds" - }, - { - "avg_duration": "31.562849333333325", - "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds" - }, - { - "avg_duration": "30.304836090909102", - "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage" - }, - { - "avg_duration": "32.387147202020195", - "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds" - }, - { - "avg_duration": "30.973827585858558", - "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots" - }, - { - "avg_duration": "30.404232313131303", - "name": "v8.runtime_stats.top_25/AdsOnScreenDetection" - }, - { - "avg_duration": "31.206053676767688", - "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage" - }, - { - "avg_duration": "30.55591422222223", - "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage" - }, - { - "avg_duration": "40.59781237373735", - "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering" - }, - { - "avg_duration": "35.376139262626275", - "name": "v8.runtime_stats.top_25/http://edition.cnn.com" - }, - { - "avg_duration": "31.127331565656565", - "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0" - }, - { - "avg_duration": "32.79572127272727", - "name": "v8.runtime_stats.top_25/http://inbox.google.com" - }, - { - "avg_duration": "31.80995276767676", - "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo" - }, - { - "avg_duration": "32.130399010100994", - "name": "v8.runtime_stats.top_25/http://meta.discourse.org" - }, - { - "avg_duration": "30.462735555555565", - "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular" - }, - { - "avg_duration": "30.232333686868685", - "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone" - }, - { - "avg_duration": "30.37380113131312", - "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember" - }, - { - "avg_duration": "30.198748737373744", - "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery" - }, - { - "avg_duration": "30.153131545454546", - "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla" - }, - { - "avg_duration": "33.029896989899", - "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io" - }, - { - "avg_duration": "32.92650995959597", - "name": "v8.runtime_stats.top_25/http://weibo.com" - }, - { - "avg_duration": "31.843477747474736", - "name": "v8.runtime_stats.top_25/http://world.taobao.com" - }, - { - "avg_duration": "30.792920505050503", - "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8" - }, - { - "avg_duration": "30.872393111111112", - "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8" - }, - { - "avg_duration": "30.37419947474747", - "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine" - }, - { - "avg_duration": "35.00979769696969", - "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8" - }, - { - "avg_duration": "31.877609454545468", - "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest" - }, - { - "avg_duration": "34.29373953535353", - "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae" - }, - { - "avg_duration": "32.01835513131312", - "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular" - }, - { - "avg_duration": "64.3208128686869", - "name": "v8.runtime_stats.top_25/http://www.qq.com" - }, - { - "avg_duration": "31.598082393939407", - "name": "v8.runtime_stats.top_25/http://www.reddit.com" - }, - { - "avg_duration": "32.1831180909091", - "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13" - }, - { - "avg_duration": "31.739804232323237", - "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill" - }, - { - "avg_duration": "31.03223385858586", - "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp" - }, - { - "avg_duration": "30.99851531313131", - "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8" - }, - { - "avg_duration": "55.903774333333324", - "name": "v8.runtime_stats.top_25/https://adwords.google.com" - }, - { - "avg_duration": "30.068539878787874", - "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3" - }, - { - "avg_duration": "35.59601106060607", - "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit" - }, - { - "avg_duration": "31.766680191919168", - "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira" - }, - { - "avg_duration": "36.41602893939393", - "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8" - }, - { - "avg_duration": "32.18308850505051", - "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/" - }, - { - "avg_duration": "34.8667446060606", - "name": "v8.runtime_stats.top_25/https://www.youtube.com" - }, - { - "avg_duration": "36.90751096969696", - "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg" - }, - { - "avg_duration": "70.70299275757571", - "name": "wasm/AsmJsZenGarden" - }, - { - "avg_duration": "24.037755505050516", - "name": "wasm/WasmSpaceBuggy" - }, - { - "avg_duration": "58.932792272727305", - "name": "wasm/WasmStylizedRenderer" - }, - { - "avg_duration": "55.11374985050506", - "name": "wasm/WasmSunTemple" - }, - { - "avg_duration": "39.24113844444443", - "name": "wasm/WasmTanks" - }, - { - "avg_duration": "55.70884981010103", - "name": "wasm/WasmZenGarden" - }, - { - "avg_duration": "106.24800352525254", - "name": "webrtc/10s_datachannel_transfer" - }, - { - "avg_duration": "24.09367597979798", - "name": "webrtc/canvas_capture_peer_connection" - }, - { - "avg_duration": "33.10214334343434", - "name": "webrtc/codec_constraints_h264" - }, - { - "avg_duration": "33.134536404040404", - "name": "webrtc/codec_constraints_vp8" - }, - { - "avg_duration": "33.076898575757575", - "name": "webrtc/codec_constraints_vp9" - }, - { - "avg_duration": "21.60273815151515", - "name": "webrtc/hd_local_stream_10s" - }, - { - "avg_duration": "82.12761175757578", - "name": "webrtc/multiple_peerconnections" - }, - { - "avg_duration": "80.00451425252524", - "name": "webrtc/pause_play_peerconnections" - } -]
diff --git a/tools/perf/core/shard_maps/linux_perf_shard_map.json b/tools/perf/core/shard_maps/linux_perf_shard_map.json new file mode 100644 index 0000000..bd35a9f --- /dev/null +++ b/tools/perf/core/shard_maps/linux_perf_shard_map.json
@@ -0,0 +1,299 @@ +{ + "0": { + "benchmarks": { + "blink_perf.bindings": {}, + "blink_perf.canvas": {}, + "blink_perf.css": {}, + "blink_perf.dom": {}, + "blink_perf.events": {}, + "blink_perf.image_decoder": {}, + "blink_perf.layout": { + "end": 32 + } + } + }, + "1": { + "benchmarks": { + "blink_perf.layout": { + "begin": 32 + }, + "blink_perf.owp_storage": {}, + "blink_perf.paint": {}, + "blink_perf.parser": {}, + "blink_perf.shadow_dom": {}, + "blink_perf.svg": {}, + "dromaeo": {} + } + }, + "2": { + "benchmarks": { + "dummy_benchmark.histogram_benchmark_1": {}, + "dummy_benchmark.noisy_benchmark_1": {}, + "dummy_benchmark.stable_benchmark_1": {}, + "jetstream": {}, + "kraken": {}, + "loading.desktop": { + "end": 37 + } + } + }, + "3": { + "benchmarks": { + "loading.desktop": { + "begin": 37, + "end": 77 + } + } + }, + "4": { + "benchmarks": { + "loading.desktop": { + "begin": 77 + }, + "loading.mobile": {}, + "media.desktop": { + "end": 19 + } + } + }, + "5": { + "benchmarks": { + "media.desktop": { + "begin": 19 + }, + "media.mobile": {}, + "memory.desktop": {}, + "memory.long_running_idle_gmail_background_tbmv2": {}, + "memory.long_running_idle_gmail_tbmv2": {}, + "memory.top_10_mobile": {}, + "octane": {}, + "oortonline_tbmv2": {}, + "power.desktop": { + "end": 4 + } + } + }, + "6": { + "benchmarks": { + "power.desktop": { + "begin": 4 + }, + "power.idle_platform": {}, + "power.typical_10_mobile": {}, + "rasterize_and_record_micro.partial_invalidation": {}, + "rasterize_and_record_micro.top_25": { + "end": 17 + } + } + }, + "7": { + "benchmarks": { + "rasterize_and_record_micro.top_25": { + "begin": 17 + }, + "rendering.desktop": { + "end": 58 + } + } + }, + "8": { + "benchmarks": { + "rendering.desktop": { + "begin": 58, + "end": 132 + } + } + }, + "9": { + "benchmarks": { + "rendering.desktop": { + "begin": 132, + "end": 215 + } + } + }, + "10": { + "benchmarks": { + "rendering.desktop": { + "begin": 215 + }, + "rendering.mobile": {}, + "scheduler.tough_scheduling_cases": {}, + "smoothness.desktop_tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.polymer": {}, + "smoothness.gpu_rasterization.top_25_smooth": {}, + "smoothness.gpu_rasterization.tough_filters_cases": {}, + "smoothness.gpu_rasterization.tough_path_rendering_cases": {}, + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.tough_scrolling_cases": {}, + "smoothness.gpu_rasterization_and_decoding.image_decoding_cases": {}, + "smoothness.image_decoding_cases": {}, + "smoothness.key_desktop_move_cases": {}, + "smoothness.key_mobile_sites_smooth": {}, + "smoothness.key_silk_cases": {}, + "smoothness.maps": {}, + "smoothness.pathological_mobile_sites": {}, + "smoothness.simple_mobile_sites": {}, + "smoothness.sync_scroll.key_mobile_sites_smooth": {}, + "smoothness.top_25_smooth": {} + } + }, + "11": { + "benchmarks": { + "smoothness.tough_ad_cases": {}, + "smoothness.tough_animation_cases": { + "end": 62 + } + } + }, + "12": { + "benchmarks": { + "smoothness.tough_animation_cases": { + "begin": 62 + }, + "smoothness.tough_canvas_cases": {}, + "smoothness.tough_filters_cases": {}, + "smoothness.tough_image_decode_cases": {}, + "smoothness.tough_path_rendering_cases": {}, + "smoothness.tough_pinch_zoom_cases": {}, + "smoothness.tough_scrolling_cases": {}, + "smoothness.tough_texture_upload_cases": {}, + "smoothness.tough_webgl_ad_cases": { + "end": 5 + } + } + }, + "13": { + "benchmarks": { + "smoothness.tough_webgl_ad_cases": { + "begin": 5 + }, + "smoothness.tough_webgl_cases": {}, + "speedometer": {}, + "speedometer-future": {}, + "speedometer2": {}, + "speedometer2-future": {}, + "start_with_url.cold.startup_pages": {}, + "start_with_url.warm.startup_pages": {}, + "system_health.common_desktop": { + "end": 23 + } + } + }, + "14": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 23, + "end": 60 + } + } + }, + "15": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 60 + }, + "system_health.common_mobile": {}, + "system_health.memory_desktop": { + "end": 11 + } + } + }, + "16": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 11, + "end": 29 + } + } + }, + "17": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 29, + "end": 53 + } + } + }, + "18": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 53, + "end": 59 + } + } + }, + "19": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 59 + }, + "system_health.memory_mobile": {}, + "system_health.webview_startup": {}, + "tab_switching.typical_25": {}, + "thread_times.key_hit_test_cases": {}, + "thread_times.key_idle_power_cases": {}, + "thread_times.key_mobile_sites_smooth": {}, + "thread_times.key_noop_cases": {}, + "thread_times.key_silk_cases": {}, + "thread_times.simple_mobile_sites": {}, + "thread_times.tough_compositor_cases": {}, + "thread_times.tough_scrolling_cases": { + "end": 35 + } + } + }, + "20": { + "benchmarks": { + "thread_times.tough_scrolling_cases": { + "begin": 35 + }, + "tracing.tracing_with_background_memory_infra": {}, + "v8.browsing_desktop": { + "end": 18 + } + } + }, + "21": { + "benchmarks": { + "v8.browsing_desktop": { + "begin": 18 + }, + "v8.browsing_desktop-future": {} + } + }, + "22": { + "benchmarks": { + "v8.browsing_mobile": {}, + "v8.browsing_mobile-future": {}, + "v8.runtime_stats.top_25": { + "end": 39 + } + } + }, + "23": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 39, + "end": 81 + } + } + }, + "24": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 81, + "end": 120 + } + } + }, + "25": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 120 + }, + "wasm": {}, + "webrtc": {} + } + } +} \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/mac_1012_low_end_26_shard_map.json b/tools/perf/core/shard_maps/mac_1012_low_end_26_shard_map.json new file mode 100644 index 0000000..60e1db8 --- /dev/null +++ b/tools/perf/core/shard_maps/mac_1012_low_end_26_shard_map.json
@@ -0,0 +1,307 @@ +{ + "0": { + "benchmarks": { + "blink_perf.bindings": {}, + "blink_perf.canvas": {}, + "blink_perf.css": {}, + "blink_perf.dom": {}, + "blink_perf.events": {}, + "blink_perf.image_decoder": {}, + "blink_perf.layout": {}, + "blink_perf.owp_storage": {}, + "blink_perf.paint": { + "end": 7 + } + } + }, + "1": { + "benchmarks": { + "blink_perf.paint": { + "begin": 7 + }, + "blink_perf.parser": {}, + "blink_perf.shadow_dom": {}, + "blink_perf.svg": {}, + "dromaeo": {}, + "dummy_benchmark.histogram_benchmark_1": {}, + "dummy_benchmark.noisy_benchmark_1": {}, + "dummy_benchmark.stable_benchmark_1": {}, + "jetstream": {}, + "kraken": {}, + "loading.desktop": { + "end": 13 + } + } + }, + "2": { + "benchmarks": { + "loading.desktop": { + "begin": 13, + "end": 52 + } + } + }, + "3": { + "benchmarks": { + "loading.desktop": { + "begin": 52, + "end": 85 + } + } + }, + "4": { + "benchmarks": { + "loading.desktop": { + "begin": 85 + }, + "loading.mobile": {}, + "media.desktop": {}, + "media.mobile": {}, + "memory.desktop": { + "end": 1 + } + } + }, + "5": { + "benchmarks": { + "memory.desktop": { + "begin": 1 + }, + "memory.long_running_idle_gmail_background_tbmv2": {}, + "memory.long_running_idle_gmail_tbmv2": {}, + "memory.top_10_mobile": {}, + "octane": {}, + "oortonline_tbmv2": {}, + "power.desktop": { + "end": 6 + } + } + }, + "6": { + "benchmarks": { + "power.desktop": { + "begin": 6 + }, + "power.idle_platform": {}, + "power.typical_10_mobile": {}, + "rasterize_and_record_micro.partial_invalidation": {}, + "rasterize_and_record_micro.top_25": {}, + "rendering.desktop": { + "end": 11 + } + } + }, + "7": { + "benchmarks": { + "rendering.desktop": { + "begin": 11, + "end": 65 + } + } + }, + "8": { + "benchmarks": { + "rendering.desktop": { + "begin": 65, + "end": 126 + } + } + }, + "9": { + "benchmarks": { + "rendering.desktop": { + "begin": 126, + "end": 205 + } + } + }, + "10": { + "benchmarks": { + "rendering.desktop": { + "begin": 205 + }, + "rendering.mobile": {}, + "scheduler.tough_scheduling_cases": {}, + "smoothness.desktop_tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.polymer": {}, + "smoothness.gpu_rasterization.top_25_smooth": {}, + "smoothness.gpu_rasterization.tough_filters_cases": {}, + "smoothness.gpu_rasterization.tough_path_rendering_cases": {}, + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.tough_scrolling_cases": { + "end": 32 + } + } + }, + "11": { + "benchmarks": { + "smoothness.gpu_rasterization.tough_scrolling_cases": { + "begin": 32 + }, + "smoothness.gpu_rasterization_and_decoding.image_decoding_cases": {}, + "smoothness.image_decoding_cases": {}, + "smoothness.key_desktop_move_cases": {}, + "smoothness.key_mobile_sites_smooth": {}, + "smoothness.key_silk_cases": {}, + "smoothness.maps": {}, + "smoothness.pathological_mobile_sites": {}, + "smoothness.simple_mobile_sites": {}, + "smoothness.sync_scroll.key_mobile_sites_smooth": {}, + "smoothness.top_25_smooth": {}, + "smoothness.tough_ad_cases": {}, + "smoothness.tough_animation_cases": { + "end": 33 + } + } + }, + "12": { + "benchmarks": { + "smoothness.tough_animation_cases": { + "begin": 33 + }, + "smoothness.tough_canvas_cases": {}, + "smoothness.tough_filters_cases": {}, + "smoothness.tough_image_decode_cases": {}, + "smoothness.tough_path_rendering_cases": {}, + "smoothness.tough_pinch_zoom_cases": {}, + "smoothness.tough_scrolling_cases": { + "end": 11 + } + } + }, + "13": { + "benchmarks": { + "smoothness.tough_scrolling_cases": { + "begin": 11 + }, + "smoothness.tough_texture_upload_cases": {}, + "smoothness.tough_webgl_ad_cases": {}, + "smoothness.tough_webgl_cases": {}, + "speedometer": {}, + "speedometer-future": {}, + "speedometer2": {}, + "speedometer2-future": {}, + "start_with_url.cold.startup_pages": {}, + "start_with_url.warm.startup_pages": {}, + "system_health.common_desktop": { + "end": 9 + } + } + }, + "14": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 9, + "end": 54 + } + } + }, + "15": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 54 + }, + "system_health.common_mobile": {}, + "system_health.memory_desktop": { + "end": 10 + } + } + }, + "16": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 10, + "end": 28 + } + } + }, + "17": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 28, + "end": 52 + } + } + }, + "18": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 52, + "end": 59 + } + } + }, + "19": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 59 + }, + "system_health.memory_mobile": {}, + "system_health.webview_startup": {}, + "tab_switching.typical_25": {}, + "thread_times.key_hit_test_cases": {}, + "thread_times.key_idle_power_cases": {}, + "thread_times.key_mobile_sites_smooth": {}, + "thread_times.key_noop_cases": {}, + "thread_times.key_silk_cases": {}, + "thread_times.simple_mobile_sites": {}, + "thread_times.tough_compositor_cases": {}, + "thread_times.tough_scrolling_cases": { + "end": 22 + } + } + }, + "20": { + "benchmarks": { + "thread_times.tough_scrolling_cases": { + "begin": 22 + }, + "tracing.tracing_with_background_memory_infra": {}, + "v8.browsing_desktop": { + "end": 18 + } + } + }, + "21": { + "benchmarks": { + "v8.browsing_desktop": { + "begin": 18 + }, + "v8.browsing_desktop-future": {} + } + }, + "22": { + "benchmarks": { + "v8.browsing_mobile": {}, + "v8.browsing_mobile-future": {}, + "v8.runtime_stats.top_25": { + "end": 38 + } + } + }, + "23": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 38, + "end": 78 + } + } + }, + "24": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 78, + "end": 121 + } + } + }, + "25": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 121 + }, + "wasm": {}, + "webrtc": {} + } + } +}
diff --git a/tools/perf/core/shard_maps/mac_1013_high_end_26_shard_map.json b/tools/perf/core/shard_maps/mac_1013_high_end_26_shard_map.json new file mode 100644 index 0000000..ed301cb0 --- /dev/null +++ b/tools/perf/core/shard_maps/mac_1013_high_end_26_shard_map.json
@@ -0,0 +1,312 @@ +{ + "0": { + "benchmarks": { + "blink_perf.bindings": {}, + "blink_perf.canvas": {}, + "blink_perf.css": {}, + "blink_perf.dom": {}, + "blink_perf.events": {}, + "blink_perf.image_decoder": {}, + "blink_perf.layout": { + "end": 56 + } + } + }, + "1": { + "benchmarks": { + "blink_perf.layout": { + "begin": 56 + }, + "blink_perf.owp_storage": {}, + "blink_perf.paint": {}, + "blink_perf.parser": {}, + "blink_perf.shadow_dom": {}, + "blink_perf.svg": {}, + "dromaeo": {}, + "dummy_benchmark.histogram_benchmark_1": {}, + "dummy_benchmark.noisy_benchmark_1": {}, + "dummy_benchmark.stable_benchmark_1": {}, + "jetstream": {}, + "kraken": {}, + "loading.desktop": { + "end": 6 + } + } + }, + "2": { + "benchmarks": { + "loading.desktop": { + "begin": 6, + "end": 44 + } + } + }, + "3": { + "benchmarks": { + "loading.desktop": { + "begin": 44, + "end": 81 + } + } + }, + "4": { + "benchmarks": { + "loading.desktop": { + "begin": 81 + }, + "loading.mobile": {}, + "media.desktop": { + "end": 26 + } + } + }, + "5": { + "benchmarks": { + "media.desktop": { + "begin": 26 + }, + "media.mobile": {}, + "memory.desktop": {}, + "memory.long_running_idle_gmail_background_tbmv2": {}, + "memory.long_running_idle_gmail_tbmv2": {}, + "memory.top_10_mobile": {}, + "octane": {}, + "oortonline_tbmv2": {}, + "power.desktop": { + "end": 4 + } + } + }, + "6": { + "benchmarks": { + "power.desktop": { + "begin": 4 + }, + "power.idle_platform": {}, + "power.typical_10_mobile": {}, + "rasterize_and_record_micro.partial_invalidation": {}, + "rasterize_and_record_micro.top_25": {}, + "rendering.desktop": { + "end": 7 + } + } + }, + "7": { + "benchmarks": { + "rendering.desktop": { + "begin": 7, + "end": 65 + } + } + }, + "8": { + "benchmarks": { + "rendering.desktop": { + "begin": 65, + "end": 128 + } + } + }, + "9": { + "benchmarks": { + "rendering.desktop": { + "begin": 128, + "end": 207 + } + } + }, + "10": { + "benchmarks": { + "rendering.desktop": { + "begin": 207 + }, + "rendering.mobile": {}, + "scheduler.tough_scheduling_cases": {}, + "smoothness.desktop_tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.polymer": {}, + "smoothness.gpu_rasterization.top_25_smooth": {}, + "smoothness.gpu_rasterization.tough_filters_cases": {}, + "smoothness.gpu_rasterization.tough_path_rendering_cases": {}, + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.tough_scrolling_cases": { + "end": 34 + } + } + }, + "11": { + "benchmarks": { + "smoothness.gpu_rasterization.tough_scrolling_cases": { + "begin": 34 + }, + "smoothness.gpu_rasterization_and_decoding.image_decoding_cases": {}, + "smoothness.image_decoding_cases": {}, + "smoothness.key_desktop_move_cases": {}, + "smoothness.key_mobile_sites_smooth": {}, + "smoothness.key_silk_cases": {}, + "smoothness.maps": {}, + "smoothness.pathological_mobile_sites": {}, + "smoothness.simple_mobile_sites": {}, + "smoothness.sync_scroll.key_mobile_sites_smooth": {}, + "smoothness.top_25_smooth": {}, + "smoothness.tough_ad_cases": {}, + "smoothness.tough_animation_cases": { + "end": 35 + } + } + }, + "12": { + "benchmarks": { + "smoothness.tough_animation_cases": { + "begin": 35 + }, + "smoothness.tough_canvas_cases": {}, + "smoothness.tough_filters_cases": {}, + "smoothness.tough_image_decode_cases": {}, + "smoothness.tough_path_rendering_cases": {}, + "smoothness.tough_pinch_zoom_cases": {}, + "smoothness.tough_scrolling_cases": { + "end": 14 + } + } + }, + "13": { + "benchmarks": { + "smoothness.tough_scrolling_cases": { + "begin": 14 + }, + "smoothness.tough_texture_upload_cases": {}, + "smoothness.tough_webgl_ad_cases": {}, + "smoothness.tough_webgl_cases": {}, + "speedometer": {}, + "speedometer-future": {}, + "speedometer2": {}, + "speedometer2-future": {}, + "start_with_url.cold.startup_pages": {}, + "start_with_url.warm.startup_pages": {}, + "system_health.common_desktop": { + "end": 11 + } + } + }, + "14": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 11, + "end": 58 + } + } + }, + "15": { + "benchmarks": { + "system_health.common_desktop": { + "begin": 58 + }, + "system_health.common_mobile": {}, + "system_health.memory_desktop": { + "end": 10 + } + } + }, + "16": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 10, + "end": 29 + } + } + }, + "17": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 29, + "end": 53 + } + } + }, + "18": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 53, + "end": 59 + } + } + }, + "19": { + "benchmarks": { + "system_health.memory_desktop": { + "begin": 59 + }, + "system_health.memory_mobile": {}, + "system_health.webview_startup": {}, + "tab_switching.typical_25": {}, + "thread_times.key_hit_test_cases": {}, + "thread_times.key_idle_power_cases": {}, + "thread_times.key_mobile_sites_smooth": {}, + "thread_times.key_noop_cases": {}, + "thread_times.key_silk_cases": {}, + "thread_times.simple_mobile_sites": {}, + "thread_times.tough_compositor_cases": {}, + "thread_times.tough_scrolling_cases": { + "end": 27 + } + } + }, + "20": { + "benchmarks": { + "thread_times.tough_scrolling_cases": { + "begin": 27 + }, + "tracing.tracing_with_background_memory_infra": {}, + "v8.browsing_desktop": { + "end": 17 + } + } + }, + "21": { + "benchmarks": { + "v8.browsing_desktop": { + "begin": 17 + }, + "v8.browsing_desktop-future": { + "end": 18 + } + } + }, + "22": { + "benchmarks": { + "v8.browsing_desktop-future": { + "begin": 18 + }, + "v8.browsing_mobile": {}, + "v8.browsing_mobile-future": {}, + "v8.runtime_stats.top_25": { + "end": 35 + } + } + }, + "23": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 35, + "end": 76 + } + } + }, + "24": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 76, + "end": 118 + } + } + }, + "25": { + "benchmarks": { + "v8.runtime_stats.top_25": { + "begin": 118 + }, + "wasm": {}, + "webrtc": {} + } + } +} \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/mobile_benchmark_avg_times.json b/tools/perf/core/shard_maps/mobile_benchmark_avg_times.json deleted file mode 100644 index 10f9676..0000000 --- a/tools/perf/core/shard_maps/mobile_benchmark_avg_times.json +++ /dev/null
@@ -1,6758 +0,0 @@ -[ - { - "avg_duration": "23.825328545454543", - "name": "blink_perf.bindings/append-child.html" - }, - { - "avg_duration": "21.14663209090909", - "name": "blink_perf.bindings/create-element.html" - }, - { - "avg_duration": "28.702171732323226", - "name": "blink_perf.bindings/document-implementation.html" - }, - { - "avg_duration": "13.478793424242424", - "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" - }, - { - "avg_duration": "16.852491297979796", - "name": "blink_perf.bindings/first-child.html" - }, - { - "avg_duration": "25.866757313131306", - "name": "blink_perf.bindings/gc-forest.html" - }, - { - "avg_duration": "44.273376606060594", - "name": "blink_perf.bindings/gc-mini-tree.html" - }, - { - "avg_duration": "111.89212050505051", - "name": "blink_perf.bindings/gc-tree.html" - }, - { - "avg_duration": "12.840796166666657", - "name": "blink_perf.bindings/get-attribute-rare.html" - }, - { - "avg_duration": "14.969746095959598", - "name": "blink_perf.bindings/get-attribute.html" - }, - { - "avg_duration": "12.82788092929293", - "name": "blink_perf.bindings/get-element-by-id.html" - }, - { - "avg_duration": "23.93317702020202", - "name": "blink_perf.bindings/get-elements-by-tag-name.html" - }, - { - "avg_duration": "16.537282318181816", - "name": "blink_perf.bindings/id-getter.html" - }, - { - "avg_duration": "20.704102227272724", - "name": "blink_perf.bindings/id-setter.html" - }, - { - "avg_duration": "20.167345964646472", - "name": "blink_perf.bindings/indexed-getter.html" - }, - { - "avg_duration": "16.426121095959594", - "name": "blink_perf.bindings/insert-before.html" - }, - { - "avg_duration": "13.178499904040406", - "name": "blink_perf.bindings/named-property-enumerator.html" - }, - { - "avg_duration": "202.70362955555552", - "name": "blink_perf.bindings/node-list-access.html" - }, - { - "avg_duration": "15.426967984848481", - "name": "blink_perf.bindings/node-type.html" - }, - { - "avg_duration": "7.604219276767677", - "name": "blink_perf.bindings/post-message.html" - }, - { - "avg_duration": "18.06021577777777", - "name": "blink_perf.bindings/sequence-conversion-array.html" - }, - { - "avg_duration": "15.446238212121218", - "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" - }, - { - "avg_duration": "18.666999861616162", - "name": "blink_perf.bindings/serialize-array.html" - }, - { - "avg_duration": "6.471897144444444", - "name": "blink_perf.bindings/serialize-long-string.html" - }, - { - "avg_duration": "18.622496378787872", - "name": "blink_perf.bindings/serialize-map.html" - }, - { - "avg_duration": "6.373852271717173", - "name": "blink_perf.bindings/serialize-nested-array.html" - }, - { - "avg_duration": "23.458962459595963", - "name": "blink_perf.bindings/set-attribute-rare.html" - }, - { - "avg_duration": "12.63570499494949", - "name": "blink_perf.bindings/set-attribute.html" - }, - { - "avg_duration": "47.13248871717171", - "name": "blink_perf.bindings/structured-clone-json-deserialize.html" - }, - { - "avg_duration": "65.07754981818181", - "name": "blink_perf.bindings/structured-clone-json-serialize.html" - }, - { - "avg_duration": "14.286479671717172", - "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" - }, - { - "avg_duration": "14.418589404040402", - "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" - }, - { - "avg_duration": "15.53052648989899", - "name": "blink_perf.bindings/typed-array-construct-from-array.html" - }, - { - "avg_duration": "15.939480060606058", - "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" - }, - { - "avg_duration": "20.2352509949495", - "name": "blink_perf.bindings/typed-array-construct-from-typed.html" - }, - { - "avg_duration": "18.008675439393937", - "name": "blink_perf.bindings/typed-array-set-from-typed.html" - }, - { - "avg_duration": "17.006282848484844", - "name": "blink_perf.bindings/undefined-first-child.html" - }, - { - "avg_duration": "14.852494353535354", - "name": "blink_perf.bindings/undefined-get-element-by-id.html" - }, - { - "avg_duration": "15.199279116161616", - "name": "blink_perf.bindings/undefined-id-getter.html" - }, - { - "avg_duration": "12.71262267171717", - "name": "blink_perf.canvas/createImageBitmapFromImageData.html" - }, - { - "avg_duration": "11.234638848484849", - "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "28.08200181818184", - "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "6.795916886868684", - "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" - }, - { - "avg_duration": "0.0015345868680952384", - "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "8.232859537373736", - "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "13.102238010101011", - "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" - }, - { - "avg_duration": "14.58948328282829", - "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" - }, - { - "avg_duration": "17.65307675252525", - "name": "blink_perf.canvas/drawimage.html" - }, - { - "avg_duration": "24.193281565656573", - "name": "blink_perf.canvas/getImageData.html" - }, - { - "avg_duration": "17.58367502525252", - "name": "blink_perf.canvas/getImageDataColorManaged.html" - }, - { - "avg_duration": "54.782270025252515", - "name": "blink_perf.canvas/putImageData.html" - }, - { - "avg_duration": "13.065796116161618", - "name": "blink_perf.canvas/toBlob_duration.html" - }, - { - "avg_duration": "10.99511834848485", - "name": "blink_perf.canvas/toBlob_duration_jpeg.html" - }, - { - "avg_duration": "41.954842842424235", - "name": "blink_perf.canvas/transferFromImageBitmap.html" - }, - { - "avg_duration": "14.066476707070711", - "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" - }, - { - "avg_duration": "14.839908742424248", - "name": "blink_perf.canvas/upload-video-to-sub-texture.html" - }, - { - "avg_duration": "22.507939746464654", - "name": "blink_perf.canvas/upload-video-to-texture.html" - }, - { - "avg_duration": "13.919921328282827", - "name": "blink_perf.canvas/upload-webgl-to-texture.html" - }, - { - "avg_duration": "22.964157555555563", - "name": "blink_perf.css/AttributeDescendantSelector.html" - }, - { - "avg_duration": "14.691391459595952", - "name": "blink_perf.css/CSSPropertySetterGetter.html" - }, - { - "avg_duration": "14.964386207070703", - "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" - }, - { - "avg_duration": "15.40067669696969", - "name": "blink_perf.css/CSSPropertyUpdateValue.html" - }, - { - "avg_duration": "11.353418757575756", - "name": "blink_perf.css/ChangeStyleChildClassSelector.html" - }, - { - "avg_duration": "11.749962772727274", - "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" - }, - { - "avg_duration": "11.239976383838382", - "name": "blink_perf.css/ChangeStyleElementSelector.html" - }, - { - "avg_duration": "11.3317520959596", - "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" - }, - { - "avg_duration": "16.796486808080815", - "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" - }, - { - "avg_duration": "11.33576827777778", - "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" - }, - { - "avg_duration": "11.192571429292926", - "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" - }, - { - "avg_duration": "11.274814762626262", - "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" - }, - { - "avg_duration": "18.573828414141413", - "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" - }, - { - "avg_duration": "11.454816636363637", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" - }, - { - "avg_duration": "11.465628686868687", - "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" - }, - { - "avg_duration": "14.103446656565655", - "name": "blink_perf.css/ChangeStyleShallowTree.html" - }, - { - "avg_duration": "11.298962030303027", - "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" - }, - { - "avg_duration": "17.91665353535354", - "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" - }, - { - "avg_duration": "11.335185606060607", - "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" - }, - { - "avg_duration": "34.0764383838384", - "name": "blink_perf.css/ChangeStyleUniversalSelector.html" - }, - { - "avg_duration": "13.422896095959594", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" - }, - { - "avg_duration": "11.428208595959601", - "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" - }, - { - "avg_duration": "26.091253333333338", - "name": "blink_perf.css/ClassDescendantSelector.html" - }, - { - "avg_duration": "19.76747678787879", - "name": "blink_perf.css/ClassInvalidation.html" - }, - { - "avg_duration": "21.16251791919191", - "name": "blink_perf.css/FocusUpdate.html" - }, - { - "avg_duration": "12.524699863636357", - "name": "blink_perf.css/LoadBootstrapBlog.html" - }, - { - "avg_duration": "13.139714510101014", - "name": "blink_perf.css/LoadMaterializeStarterPage.html" - }, - { - "avg_duration": "14.666528974747477", - "name": "blink_perf.css/LoadSemanticPageExample.html" - }, - { - "avg_duration": "15.560089611111119", - "name": "blink_perf.css/PseudoClassSelectors.html" - }, - { - "avg_duration": "18.059500767676766", - "name": "blink_perf.css/SelectorCountScaling.html" - }, - { - "avg_duration": "30.62274181818181", - "name": "blink_perf.dom/addRange.html" - }, - { - "avg_duration": "7.623872966666667", - "name": "blink_perf.dom/delete-in-password-field.html" - }, - { - "avg_duration": "19.918641343434338", - "name": "blink_perf.dom/div-editable.html" - }, - { - "avg_duration": "6.300362560606059", - "name": "blink_perf.dom/inner_html_with_selection.html" - }, - { - "avg_duration": "34.29391838383839", - "name": "blink_perf.dom/long-sibling-list.html" - }, - { - "avg_duration": "15.67883731313131", - "name": "blink_perf.dom/modify-element-classname.html" - }, - { - "avg_duration": "11.384814584848487", - "name": "blink_perf.dom/modify-element-id.html" - }, - { - "avg_duration": "11.58222360303031", - "name": "blink_perf.dom/modify-element-title.html" - }, - { - "avg_duration": "7.59112216060606", - "name": "blink_perf.dom/move-down-with-hidden-elements.html" - }, - { - "avg_duration": "11.572585887878788", - "name": "blink_perf.dom/move-up-with-hidden-elements.html" - }, - { - "avg_duration": "17.302896162626265", - "name": "blink_perf.dom/remove_child_with_selection.html" - }, - { - "avg_duration": "17.224066237373737", - "name": "blink_perf.dom/select-multiple-add.html" - }, - { - "avg_duration": "14.5953755959596", - "name": "blink_perf.dom/select-single-add.html" - }, - { - "avg_duration": "16.30030747474748", - "name": "blink_perf.dom/select-single-remove.html" - }, - { - "avg_duration": "12.649496404040407", - "name": "blink_perf.dom/textarea-dom.html" - }, - { - "avg_duration": "24.395432858585863", - "name": "blink_perf.dom/textarea-edit.html" - }, - { - "avg_duration": "15.202636176767681", - "name": "blink_perf.events/EventsDispatching.html" - }, - { - "avg_duration": "43.816040141414156", - "name": "blink_perf.events/EventsDispatchingInDeeplyNestedShadowTrees.html" - }, - { - "avg_duration": "62.69387558585858", - "name": "blink_perf.events/EventsDispatchingInShadowTrees.html" - }, - { - "avg_duration": "69.73227323232322", - "name": "blink_perf.events/hit-test-lots-of-layers.html" - }, - { - "avg_duration": "42.03368857575759", - "name": "blink_perf.image_decoder/decode-gif.html" - }, - { - "avg_duration": "29.642972464646455", - "name": "blink_perf.image_decoder/decode-jpeg.html" - }, - { - "avg_duration": "74.63885277777773", - "name": "blink_perf.image_decoder/decode-lossless-webp.html" - }, - { - "avg_duration": "20.57036235353535", - "name": "blink_perf.image_decoder/decode-lossy-webp.html" - }, - { - "avg_duration": "30.32857055555557", - "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" - }, - { - "avg_duration": "20.154933444444445", - "name": "blink_perf.image_decoder/decode-png-palette.html" - }, - { - "avg_duration": "52.18423812121216", - "name": "blink_perf.image_decoder/decode-png.html" - }, - { - "avg_duration": "16.74159285858586", - "name": "blink_perf.layout/ArabicLineLayout.html" - }, - { - "avg_duration": "10.45775367272727", - "name": "blink_perf.layout/Shapes/MultipleShapes.html" - }, - { - "avg_duration": "14.276868585858589", - "name": "blink_perf.layout/SimpleTextPathLineLayout.html" - }, - { - "avg_duration": "13.99522876767677", - "name": "blink_perf.layout/add-remove-inline-floats.html" - }, - { - "avg_duration": "17.96166413131313", - "name": "blink_perf.layout/attach-inlines-2.html" - }, - { - "avg_duration": "18.216841621212122", - "name": "blink_perf.layout/attach-inlines.html" - }, - { - "avg_duration": "15.10447073737374", - "name": "blink_perf.layout/auto-grid-lots-of-data.html" - }, - { - "avg_duration": "12.422559939393938", - "name": "blink_perf.layout/chapter-reflow-once-random.html" - }, - { - "avg_duration": "13.775665161616168", - "name": "blink_perf.layout/chapter-reflow-once.html" - }, - { - "avg_duration": "21.45017298484848", - "name": "blink_perf.layout/chapter-reflow-thrice.html" - }, - { - "avg_duration": "23.643941676767664", - "name": "blink_perf.layout/chapter-reflow-twice.html" - }, - { - "avg_duration": "16.483647702020196", - "name": "blink_perf.layout/chapter-reflow.html" - }, - { - "avg_duration": "12.4645858969697", - "name": "blink_perf.layout/character_fallback.html" - }, - { - "avg_duration": "10.8966791979798", - "name": "blink_perf.layout/character_fallback_aat.html" - }, - { - "avg_duration": "16.400755348484854", - "name": "blink_perf.layout/fixed-grid-lots-of-data.html" - }, - { - "avg_duration": "16.26834856565656", - "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" - }, - { - "avg_duration": "15.331582030303023", - "name": "blink_perf.layout/flexbox-column-nowrap.html" - }, - { - "avg_duration": "13.587494202020196", - "name": "blink_perf.layout/flexbox-column-wrap.html" - }, - { - "avg_duration": "15.302413085858579", - "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" - }, - { - "avg_duration": "17.651731787878795", - "name": "blink_perf.layout/flexbox-lots-of-data.html" - }, - { - "avg_duration": "18.269747752525255", - "name": "blink_perf.layout/flexbox-row-nowrap.html" - }, - { - "avg_duration": "12.837608787878796", - "name": "blink_perf.layout/flexbox-row-wrap.html" - }, - { - "avg_duration": "12.976291434343441", - "name": "blink_perf.layout/flexbox-with-stretch-layout.html" - }, - { - "avg_duration": "57.526212010101005", - "name": "blink_perf.layout/floats_100_100.html" - }, - { - "avg_duration": "56.173011727272716", - "name": "blink_perf.layout/floats_100_100_nested.html" - }, - { - "avg_duration": "29.874782414141414", - "name": "blink_perf.layout/floats_10_1000.html" - }, - { - "avg_duration": "17.594987858585853", - "name": "blink_perf.layout/floats_20_100.html" - }, - { - "avg_duration": "21.06038343434342", - "name": "blink_perf.layout/floats_20_100_nested.html" - }, - { - "avg_duration": "15.774817186868686", - "name": "blink_perf.layout/floats_2_100.html" - }, - { - "avg_duration": "14.385207272727275", - "name": "blink_perf.layout/floats_2_100_nested.html" - }, - { - "avg_duration": "51.836647010101025", - "name": "blink_perf.layout/floats_50_100.html" - }, - { - "avg_duration": "27.231643202020194", - "name": "blink_perf.layout/floats_50_100_nested.html" - }, - { - "avg_duration": "12.538071767676767", - "name": "blink_perf.layout/hindi-line-layout.html" - }, - { - "avg_duration": "48.634438868686885", - "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" - }, - { - "avg_duration": "50.844217121212104", - "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" - }, - { - "avg_duration": "52.23996789898988", - "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" - }, - { - "avg_duration": "21.908042011111103", - "name": "blink_perf.layout/latin-complex-text.html" - }, - { - "avg_duration": "15.671146409090914", - "name": "blink_perf.layout/layers_overlap_2d.html" - }, - { - "avg_duration": "21.77235146969697", - "name": "blink_perf.layout/layers_overlap_3d.html" - }, - { - "avg_duration": "45.94356990909089", - "name": "blink_perf.layout/line-layout-line-height.html" - }, - { - "avg_duration": "12.749871777777782", - "name": "blink_perf.layout/line-layout-repeat-append.html" - }, - { - "avg_duration": "18.713610136363634", - "name": "blink_perf.layout/line-layout.html" - }, - { - "avg_duration": "20.175870916161614", - "name": "blink_perf.layout/long-line-nowrap-collapse.html" - }, - { - "avg_duration": "16.45115202222222", - "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" - }, - { - "avg_duration": "18.456354520202016", - "name": "blink_perf.layout/long-line-nowrap.html" - }, - { - "avg_duration": "15.70875581313131", - "name": "blink_perf.layout/multicol/deeply-nested-tables.html" - }, - { - "avg_duration": "12.205207070707065", - "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" - }, - { - "avg_duration": "16.533692045454547", - "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" - }, - { - "avg_duration": "18.98394867676768", - "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" - }, - { - "avg_duration": "18.482416035353534", - "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" - }, - { - "avg_duration": "16.16033261616161", - "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" - }, - { - "avg_duration": "21.740220868686865", - "name": "blink_perf.layout/multicol/tall-content-short-columns.html" - }, - { - "avg_duration": "18.15735452525252", - "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" - }, - { - "avg_duration": "15.077506151515152", - "name": "blink_perf.layout/nested-grid.html" - }, - { - "avg_duration": "12.758106560606064", - "name": "blink_perf.layout/nested-percent-height-tables.html" - }, - { - "avg_duration": "308.88052414141424", - "name": "blink_perf.layout/subtree-detaching.html" - }, - { - "avg_duration": "13.989486429292928", - "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" - }, - { - "avg_duration": "20.740292863636366", - "name": "blink_perf.layout/word-break-break-all.html" - }, - { - "avg_duration": "20.468810252525245", - "name": "blink_perf.layout/word-break-break-word.html" - }, - { - "avg_duration": "18.758807616161615", - "name": "blink_perf.layout/word-wrap-break-word.html" - }, - { - "avg_duration": "18.253576575757567", - "name": "blink_perf.owp_storage/blob-perf-files.html" - }, - { - "avg_duration": "21.349657939393932", - "name": "blink_perf.owp_storage/blob-perf-ipc.html" - }, - { - "avg_duration": "24.808729328282833", - "name": "blink_perf.owp_storage/blob-perf-shm.html" - }, - { - "avg_duration": "27.99301717171718", - "name": "blink_perf.owp_storage/blob-perf-tiny.html" - }, - { - "avg_duration": "22.300750595959595", - "name": "blink_perf.owp_storage/idb-load-docs.html" - }, - { - "avg_duration": "20.244144969696976", - "name": "blink_perf.paint/appending-text.html" - }, - { - "avg_duration": "42.32066056565657", - "name": "blink_perf.paint/color-changes.html" - }, - { - "avg_duration": "29.43191067676767", - "name": "blink_perf.paint/complex-content-slow-scroll.html" - }, - { - "avg_duration": "35.36646934343431", - "name": "blink_perf.paint/containment-resize.html" - }, - { - "avg_duration": "35.07971011111112", - "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" - }, - { - "avg_duration": "46.65307252525255", - "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" - }, - { - "avg_duration": "30.45700697979797", - "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" - }, - { - "avg_duration": "49.80347435353536", - "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" - }, - { - "avg_duration": "33.591322515151525", - "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" - }, - { - "avg_duration": "38.40874627272726", - "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" - }, - { - "avg_duration": "26.772146444444424", - "name": "blink_perf.paint/large-table-collapsed-border-change.html" - }, - { - "avg_duration": "50.28399370707071", - "name": "blink_perf.paint/large-table-repaint.html" - }, - { - "avg_duration": "36.49184244444446", - "name": "blink_perf.paint/move-text-with-mask.html" - }, - { - "avg_duration": "36.716847414141405", - "name": "blink_perf.paint/paint-offset-changes.html" - }, - { - "avg_duration": "46.07214046464647", - "name": "blink_perf.paint/transform-changes.html" - }, - { - "avg_duration": "14.725341439393937", - "name": "blink_perf.parser/css-parser-yui.html" - }, - { - "avg_duration": "57.34327724242423", - "name": "blink_perf.parser/html-parser-threaded.html" - }, - { - "avg_duration": "71.08322907070708", - "name": "blink_perf.parser/html-parser.html" - }, - { - "avg_duration": "199.88011585858587", - "name": "blink_perf.parser/html5-full-render.html" - }, - { - "avg_duration": "14.483229636363637", - "name": "blink_perf.parser/iframe-append-remove.html" - }, - { - "avg_duration": "14.54089071212121", - "name": "blink_perf.parser/innerHTML-setter-siblings.html" - }, - { - "avg_duration": "13.222216611111113", - "name": "blink_perf.parser/innerHTML-setter.html" - }, - { - "avg_duration": "13.272821171717174", - "name": "blink_perf.parser/query-selector-all-attribute-complex.html" - }, - { - "avg_duration": "16.163946212121218", - "name": "blink_perf.parser/query-selector-all-attribute.html" - }, - { - "avg_duration": "13.978740287878784", - "name": "blink_perf.parser/query-selector-all-class-deep.html" - }, - { - "avg_duration": "21.208894116161613", - "name": "blink_perf.parser/query-selector-all-class-first.html" - }, - { - "avg_duration": "14.333800727272726", - "name": "blink_perf.parser/query-selector-all-class-last.html" - }, - { - "avg_duration": "14.171897277777784", - "name": "blink_perf.parser/query-selector-all-class.html" - }, - { - "avg_duration": "15.664501141414137", - "name": "blink_perf.parser/query-selector-all-deep.html" - }, - { - "avg_duration": "16.359245792929297", - "name": "blink_perf.parser/query-selector-all-first.html" - }, - { - "avg_duration": "21.668282651515145", - "name": "blink_perf.parser/query-selector-all-id-deep.html" - }, - { - "avg_duration": "16.028751626262626", - "name": "blink_perf.parser/query-selector-all-id-first.html" - }, - { - "avg_duration": "24.152344202020213", - "name": "blink_perf.parser/query-selector-all-id-last.html" - }, - { - "avg_duration": "15.805274434343435", - "name": "blink_perf.parser/query-selector-all-last.html" - }, - { - "avg_duration": "14.443836449494949", - "name": "blink_perf.parser/query-selector-deep.html" - }, - { - "avg_duration": "16.9861181969697", - "name": "blink_perf.parser/query-selector-first.html" - }, - { - "avg_duration": "18.98684406060606", - "name": "blink_perf.parser/query-selector-id-deep.html" - }, - { - "avg_duration": "23.363235787878793", - "name": "blink_perf.parser/query-selector-id-last.html" - }, - { - "avg_duration": "13.882731242424242", - "name": "blink_perf.parser/query-selector-last.html" - }, - { - "avg_duration": "18.798301989898995", - "name": "blink_perf.parser/simple-url.html" - }, - { - "avg_duration": "15.531182803030294", - "name": "blink_perf.parser/textarea-parsing.html" - }, - { - "avg_duration": "30.645930676767673", - "name": "blink_perf.parser/tiny-innerHTML.html" - }, - { - "avg_duration": "16.18543930303031", - "name": "blink_perf.parser/url-parser.html" - }, - { - "avg_duration": "14.281497974747476", - "name": "blink_perf.parser/xml-parser.html" - }, - { - "avg_duration": "12.171589893939393", - "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" - }, - { - "avg_duration": "10.508874065656569", - "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" - }, - { - "avg_duration": "12.55592618888889", - "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" - }, - { - "avg_duration": "35.21006400000001", - "name": "blink_perf.shadow_dom/shadow-style-share.html" - }, - { - "avg_duration": "8.313272666666665", - "name": "blink_perf.shadow_dom/style-sheet-insert.html" - }, - { - "avg_duration": "9.420986285858588", - "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" - }, - { - "avg_duration": "16.846363267676765", - "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" - }, - { - "avg_duration": "32.08851507070707", - "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" - }, - { - "avg_duration": "36.38679415151517", - "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" - }, - { - "avg_duration": "8.31532636262626", - "name": "blink_perf.shadow_dom/v0-content-reprojection.html" - }, - { - "avg_duration": "7.350902268686868", - "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" - }, - { - "avg_duration": "7.31435421818182", - "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" - }, - { - "avg_duration": "8.675350107070708", - "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" - }, - { - "avg_duration": "8.08365581919192", - "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" - }, - { - "avg_duration": "74.55699457575756", - "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" - }, - { - "avg_duration": "6.731840344444444", - "name": "blink_perf.shadow_dom/v1-distribution.html" - }, - { - "avg_duration": "7.186113258585857", - "name": "blink_perf.shadow_dom/v1-host-child-append.html" - }, - { - "avg_duration": "78.99122408080805", - "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" - }, - { - "avg_duration": "240.09555969696973", - "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" - }, - { - "avg_duration": "8.987092211111113", - "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" - }, - { - "avg_duration": "7.006901234343433", - "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" - }, - { - "avg_duration": "10.936233762626266", - "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" - }, - { - "avg_duration": "7.009645070707071", - "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" - }, - { - "avg_duration": "7.599413882828283", - "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" - }, - { - "avg_duration": "11.168782617171715", - "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" - }, - { - "avg_duration": "7.165553462626266", - "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" - }, - { - "avg_duration": "8.722389912121212", - "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" - }, - { - "avg_duration": "6.62528173131313", - "name": "blink_perf.shadow_dom/v1-slot-append.html" - }, - { - "avg_duration": "46.223495939393935", - "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" - }, - { - "avg_duration": "46.66416798484848", - "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" - }, - { - "avg_duration": "6.698166654545451", - "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" - }, - { - "avg_duration": "6.773533988888888", - "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" - }, - { - "avg_duration": "10.392607234343435", - "name": "blink_perf.svg/AzLizardBenjiPark.html" - }, - { - "avg_duration": "16.42304400000001", - "name": "blink_perf.svg/Bamboo.html" - }, - { - "avg_duration": "10.385168507070706", - "name": "blink_perf.svg/Cactus.html" - }, - { - "avg_duration": "8.650724542424244", - "name": "blink_perf.svg/Cowboy.html" - }, - { - "avg_duration": "10.442477126262625", - "name": "blink_perf.svg/Cowboy_transform.html" - }, - { - "avg_duration": "7.279906125252531", - "name": "blink_perf.svg/CrawFishGanson.html" - }, - { - "avg_duration": "8.143893556565658", - "name": "blink_perf.svg/Debian.html" - }, - { - "avg_duration": "6.642113523232319", - "name": "blink_perf.svg/DropsOnABlade.html" - }, - { - "avg_duration": "7.088144601010099", - "name": "blink_perf.svg/FlowerFromMyGarden.html" - }, - { - "avg_duration": "7.0389363313131295", - "name": "blink_perf.svg/FoodLeifLodahl.html" - }, - { - "avg_duration": "7.484456716161614", - "name": "blink_perf.svg/France.html" - }, - { - "avg_duration": "6.551707915151517", - "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" - }, - { - "avg_duration": "12.654668727272728", - "name": "blink_perf.svg/GearFlowers.html" - }, - { - "avg_duration": "7.458695986868685", - "name": "blink_perf.svg/HarveyRayner.html" - }, - { - "avg_duration": "7.019041427272728", - "name": "blink_perf.svg/HereGear.html" - }, - { - "avg_duration": "19.194267954545456", - "name": "blink_perf.svg/MtSaintHelens.html" - }, - { - "avg_duration": "6.361059801010098", - "name": "blink_perf.svg/Samurai.html" - }, - { - "avg_duration": "229.90237757575764", - "name": "blink_perf.svg/SierpinskiCarpet.html" - }, - { - "avg_duration": "9.762262712121217", - "name": "blink_perf.svg/SvgCubics.html" - }, - { - "avg_duration": "9.934780316161618", - "name": "blink_perf.svg/SvgHitTesting.html" - }, - { - "avg_duration": "13.493558934343433", - "name": "blink_perf.svg/SvgNestedUse.html" - }, - { - "avg_duration": "7.156444250505054", - "name": "blink_perf.svg/UnderTheSee.html" - }, - { - "avg_duration": "8.23501515353535", - "name": "blink_perf.svg/WorldIso.html" - }, - { - "avg_duration": "18.230803287878796", - "name": "blink_perf.svg/Worldcup.html" - }, - { - "avg_duration": "50.9704983131313", - "name": "dromaeo/http://dromaeo.com?dom-attr" - }, - { - "avg_duration": "39.02773621212121", - "name": "dromaeo/http://dromaeo.com?dom-modify" - }, - { - "avg_duration": "53.45231556565652", - "name": "dromaeo/http://dromaeo.com?dom-query" - }, - { - "avg_duration": "32.94629616161617", - "name": "dromaeo/http://dromaeo.com?dom-traverse" - }, - { - "avg_duration": "24.893030535353528", - "name": "dummy_benchmark.histogram_benchmark_1/dummy_page.html" - }, - { - "avg_duration": "17.01432105050505", - "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" - }, - { - "avg_duration": "17.86657671717172", - "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" - }, - { - "avg_duration": "550.6994195959596", - "name": "jetstream/http://browserbench.org/JetStream/" - }, - { - "avg_duration": "138.85948746464655", - "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" - }, - { - "avg_duration": "21.75019996969697", - "name": "loading.mobile/58Pic" - }, - { - "avg_duration": "25.043642747474742", - "name": "loading.mobile/Amazon" - }, - { - "avg_duration": "26.767283232323223", - "name": "loading.mobile/BOLNoticias" - }, - { - "avg_duration": "24.66610529292929", - "name": "loading.mobile/Baidu" - }, - { - "avg_duration": "22.743441454545454", - "name": "loading.mobile/Bradesco" - }, - { - "avg_duration": "49.826558656565645", - "name": "loading.mobile/Dailymotion" - }, - { - "avg_duration": "36.24283613131315", - "name": "loading.mobile/Dawn" - }, - { - "avg_duration": "21.499994454545465", - "name": "loading.mobile/DevOpera" - }, - { - "avg_duration": "29.160051535353528", - "name": "loading.mobile/Dramaq" - }, - { - "avg_duration": "19.088078656565667", - "name": "loading.mobile/EnquiryIndianRail" - }, - { - "avg_duration": "20.82014687373738", - "name": "loading.mobile/Facebook" - }, - { - "avg_duration": "22.039394797979796", - "name": "loading.mobile/FlipBoard" - }, - { - "avg_duration": "28.160304414141407", - "name": "loading.mobile/FlipKart" - }, - { - "avg_duration": "20.3198886060606", - "name": "loading.mobile/FranceTVInfo" - }, - { - "avg_duration": "3.5803568921052625E-4", - "name": "loading.mobile/G1" - }, - { - "avg_duration": "31.850997696969692", - "name": "loading.mobile/GSShop" - }, - { - "avg_duration": "17.28055077272727", - "name": "loading.mobile/GoogleBrazil" - }, - { - "avg_duration": "18.64253190909091", - "name": "loading.mobile/GoogleIndia" - }, - { - "avg_duration": "17.129938070707077", - "name": "loading.mobile/GoogleIndonesia" - }, - { - "avg_duration": "32.767898151515155", - "name": "loading.mobile/GoogleRedirectToGoogleJapan" - }, - { - "avg_duration": "4.353523265789475E-4", - "name": "loading.mobile/HashOcean" - }, - { - "avg_duration": "22.86111801010102", - "name": "loading.mobile/Hongkiat" - }, - { - "avg_duration": "3.264703260526316E-4", - "name": "loading.mobile/IBI" - }, - { - "avg_duration": "23.73878628282827", - "name": "loading.mobile/KapanLagi" - }, - { - "avg_duration": "34.25681862626263", - "name": "loading.mobile/Kaskus" - }, - { - "avg_duration": "22.753868111111117", - "name": "loading.mobile/LocalMoxie" - }, - { - "avg_duration": "17.979040606060604", - "name": "loading.mobile/Locanto" - }, - { - "avg_duration": "22.48373137373737", - "name": "loading.mobile/OLX" - }, - { - "avg_duration": "18.443411282828283", - "name": "loading.mobile/QQNews" - }, - { - "avg_duration": "23.097109717171733", - "name": "loading.mobile/SlideShare" - }, - { - "avg_duration": "33.42109513131313", - "name": "loading.mobile/Suumo" - }, - { - "avg_duration": "26.588249818181815", - "name": "loading.mobile/Thairath" - }, - { - "avg_duration": "37.21253293939394", - "name": "loading.mobile/TheStar" - }, - { - "avg_duration": "30.478156353535347", - "name": "loading.mobile/TribunNews" - }, - { - "avg_duration": "18.56630891919192", - "name": "loading.mobile/Twitter" - }, - { - "avg_duration": "18.81120715151515", - "name": "loading.mobile/VoiceMemos" - }, - { - "avg_duration": "19.677678540404035", - "name": "loading.mobile/Wikipedia" - }, - { - "avg_duration": "32.22483365656566", - "name": "loading.mobile/YahooNews" - }, - { - "avg_duration": "19.741859424242417", - "name": "loading.mobile/Youtube" - }, - { - "avg_duration": "32.95862685858585", - "name": "media.mobile/mse.html?media=aac_audio.mp4" - }, - { - "avg_duration": "40.03535505050504", - "name": "media.mobile/mse.html?media=aac_audio.mp4,h264_video.mp4" - }, - { - "avg_duration": "40.232802959595965", - "name": "media.mobile/mse.html?media=aac_audio.mp4,h264_video.mp4&waitForPageLoaded=true" - }, - { - "avg_duration": "36.439058727272716", - "name": "media.mobile/mse.html?media=h264_video.mp4" - }, - { - "avg_duration": "44.847482383838376", - "name": "media.mobile/video.html?src=crowd.ogg&type=audio" - }, - { - "avg_duration": "45.77408928282828", - "name": "media.mobile/video.html?src=crowd1080_vp9.webm" - }, - { - "avg_duration": "31.35255567676768", - "name": "media.mobile/video.html?src=crowd1080_vp9.webm&seek" - }, - { - "avg_duration": "37.30891801010099", - "name": "media.mobile/video.html?src=crowd720_vp9.webm" - }, - { - "avg_duration": "41.48531612121211", - "name": "media.mobile/video.html?src=tulip2.m4a&type=audio" - }, - { - "avg_duration": "41.15276181818184", - "name": "media.mobile/video.html?src=tulip2.mp3&type=audio" - }, - { - "avg_duration": "21.05737197979798", - "name": "media.mobile/video.html?src=tulip2.mp3&type=audio&seek" - }, - { - "avg_duration": "46.844388454545474", - "name": "media.mobile/video.html?src=tulip2.mp4" - }, - { - "avg_duration": "47.77718787878787", - "name": "media.mobile/video.html?src=tulip2.mp4&busyjs" - }, - { - "avg_duration": "26.26105707070707", - "name": "media.mobile/video.html?src=tulip2.mp4&seek" - }, - { - "avg_duration": "41.48884055555555", - "name": "media.mobile/video.html?src=tulip2.ogg&type=audio" - }, - { - "avg_duration": "21.868658464646476", - "name": "media.mobile/video.html?src=tulip2.ogg&type=audio&seek" - }, - { - "avg_duration": "55.90143264646464", - "name": "media.mobile/video.html?src=tulip2.vp9.webm" - }, - { - "avg_duration": "37.80698554545452", - "name": "media.mobile/video.html?src=tulip2.vp9.webm&background" - }, - { - "avg_duration": "42.426937969696965", - "name": "media.mobile/video.html?src=tulip2.vp9.webm&seek" - }, - { - "avg_duration": "77.47535136363632", - "name": "media.mobile/video.html?src=tulip2.vp9.webm_Regular-3G" - }, - { - "avg_duration": "41.865464787878786", - "name": "media.mobile/video.html?src=tulip2.wav&type=audio" - }, - { - "avg_duration": "21.42603659595959", - "name": "media.mobile/video.html?src=tulip2.wav&type=audio&seek" - }, - { - "avg_duration": "278.7000764646464", - "name": "memory.long_running_idle_gmail_background_tbmv2/https://mail.google.com/mail/" - }, - { - "avg_duration": "234.46262717171712", - "name": "memory.long_running_idle_gmail_tbmv2/https://mail.google.com/mail/" - }, - { - "avg_duration": "20.951881828282833", - "name": "memory.top_10_mobile/after_http_en_m_wikipedia_org_wiki_Science" - }, - { - "avg_duration": "20.127390080808084", - "name": "memory.top_10_mobile/after_http_m_intl_taobao_com_group_purchase_html" - }, - { - "avg_duration": "20.50546215151515", - "name": "memory.top_10_mobile/after_http_m_youtube_com_results_q_science" - }, - { - "avg_duration": "20.459200939393938", - "name": "memory.top_10_mobile/after_http_search_yahoo_com_search__ylt_p_google" - }, - { - "avg_duration": "20.782483474747476", - "name": "memory.top_10_mobile/after_http_www_amazon_com_gp_aw_s_k_nexus" - }, - { - "avg_duration": "20.406451111111107", - "name": "memory.top_10_mobile/after_http_www_baidu_com_s_word_google" - }, - { - "avg_duration": "20.519196393939392", - "name": "memory.top_10_mobile/after_http_yandex_ru_touchsearch_text_science" - }, - { - "avg_duration": "20.099522373737372", - "name": "memory.top_10_mobile/after_https_m_facebook_com_rihanna" - }, - { - "avg_duration": "20.4561969090909", - "name": "memory.top_10_mobile/after_https_mobile_twitter_com_justinbieber_skip_interstitial_true" - }, - { - "avg_duration": "21.09522846464646", - "name": "memory.top_10_mobile/after_https_www_google_co_uk_hl_en_q_science" - }, - { - "avg_duration": "23.664340747474757", - "name": "memory.top_10_mobile/http_en_m_wikipedia_org_wiki_Science" - }, - { - "avg_duration": "21.325632454545453", - "name": "memory.top_10_mobile/http_m_intl_taobao_com_group_purchase_html" - }, - { - "avg_duration": "22.647110343434335", - "name": "memory.top_10_mobile/http_m_youtube_com_results_q_science" - }, - { - "avg_duration": "21.62388212121213", - "name": "memory.top_10_mobile/http_search_yahoo_com_search__ylt_p_google" - }, - { - "avg_duration": "22.075752404040394", - "name": "memory.top_10_mobile/http_www_amazon_com_gp_aw_s_k_nexus" - }, - { - "avg_duration": "22.35336668686869", - "name": "memory.top_10_mobile/http_www_baidu_com_s_word_google" - }, - { - "avg_duration": "22.58562837373737", - "name": "memory.top_10_mobile/http_yandex_ru_touchsearch_text_science" - }, - { - "avg_duration": "21.480552393939398", - "name": "memory.top_10_mobile/https_m_facebook_com_rihanna" - }, - { - "avg_duration": "22.102766747474753", - "name": "memory.top_10_mobile/https_mobile_twitter_com_justinbieber_skip_interstitial_true" - }, - { - "avg_duration": "38.234203848484846", - "name": "memory.top_10_mobile/https_www_google_co_uk_hl_en_q_science" - }, - { - "avg_duration": "104.06084001010102", - "name": "octane/http://chromium.github.io/octane/index.html?auto=1" - }, - { - "avg_duration": "26.87892843434344", - "name": "oortonline_tbmv2/http://oortonline.gl/#run" - }, - { - "avg_duration": "38.57512457575758", - "name": "power.idle_platform/IdleStory_10s" - }, - { - "avg_duration": "174.6822825252525", - "name": "power.idle_platform/IdleStory_120s" - }, - { - "avg_duration": "94.58296920202022", - "name": "power.idle_platform/IdleStory_60s" - }, - { - "avg_duration": "62.21622050505056", - "name": "power.typical_10_mobile/http://de.m.wikipedia.org/wiki/K%C3%B6lner_Dom" - }, - { - "avg_duration": "64.89404592929293", - "name": "power.typical_10_mobile/http://m.chiebukuro.yahoo.co.jp/detail/q10136829180" - }, - { - "avg_duration": "56.15736628282829", - "name": "power.typical_10_mobile/http://m.ebay.com/itm/351157205404" - }, - { - "avg_duration": "74.51524581818182", - "name": "power.typical_10_mobile/http://m.facebook.com/barackobama" - }, - { - "avg_duration": "62.357539949494935", - "name": "power.typical_10_mobile/http://m.huffpost.com/us/entry/6004486" - }, - { - "avg_duration": "61.84227526262629", - "name": "power.typical_10_mobile/http://m.ynet.co.il" - }, - { - "avg_duration": "63.24283149494949", - "name": "power.typical_10_mobile/http://siriuslymeg.tumblr.com/" - }, - { - "avg_duration": "56.6548617070707", - "name": "power.typical_10_mobile/http://wapbaike.baidu.com/" - }, - { - "avg_duration": "58.70401741414141", - "name": "power.typical_10_mobile/http://www.cnn.com/2014/03/31/showbiz/tv/himym-finale/index.html" - }, - { - "avg_duration": "63.2289314747475", - "name": "power.typical_10_mobile/http://www.rg.ru/2014/10/21/cska-site.html" - }, - { - "avg_duration": "61.8616701919192", - "name": "power.typical_10_mobile/https://en.wikipedia.org/wiki/File:Rotating_earth_(large).gif" - }, - { - "avg_duration": "26.16693281818183", - "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" - }, - { - "avg_duration": "35.44355297979797", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" - }, - { - "avg_duration": "17.99480702020203", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" - }, - { - "avg_duration": "30.242524717171708", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" - }, - { - "avg_duration": "26.85440639393939", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" - }, - { - "avg_duration": "18.5918143030303", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" - }, - { - "avg_duration": "53.50615541414142", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" - }, - { - "avg_duration": "21.34219820202021", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" - }, - { - "avg_duration": "37.77514841414141", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" - }, - { - "avg_duration": "35.380024040404045", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" - }, - { - "avg_duration": "24.971621909090906", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" - }, - { - "avg_duration": "26.737329111111105", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" - }, - { - "avg_duration": "36.61834593939395", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" - }, - { - "avg_duration": "49.05106523232323", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" - }, - { - "avg_duration": "27.412891404040415", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" - }, - { - "avg_duration": "13.255012601010103", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" - }, - { - "avg_duration": "49.123169545454566", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" - }, - { - "avg_duration": "59.438699484848485", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" - }, - { - "avg_duration": "26.290351111111107", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" - }, - { - "avg_duration": "3.749194894736842E-4", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html" - }, - { - "avg_duration": "22.289832702020206", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" - }, - { - "avg_duration": "22.476403424242424", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" - }, - { - "avg_duration": "45.087055252525246", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" - }, - { - "avg_duration": "126.94431737373733", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" - }, - { - "avg_duration": "124.36808338383838", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" - }, - { - "avg_duration": "57.55828744444443", - "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" - }, - { - "avg_duration": "4.4997114736842114E-4", - "name": "rendering.mobile/amazon" - }, - { - "avg_duration": "2.3240792126315787E-4", - "name": "rendering.mobile/amazon_desktop" - }, - { - "avg_duration": "2.1879296547368422E-4", - "name": "rendering.mobile/amazon_desktop_gpu_raster" - }, - { - "avg_duration": "4.0802202894736845E-4", - "name": "rendering.mobile/amazon_sync_scroll" - }, - { - "avg_duration": "27.783888949494962", - "name": "rendering.mobile/analog_clock_svg" - }, - { - "avg_duration": "26.481059474747468", - "name": "rendering.mobile/androidpolice" - }, - { - "avg_duration": "28.00320652525253", - "name": "rendering.mobile/androidpolice_mobile" - }, - { - "avg_duration": "32.4049613131313", - "name": "rendering.mobile/androidpolice_mobile_sync_scroll" - }, - { - "avg_duration": "27.133917242424232", - "name": "rendering.mobile/androidpolice_sync_scroll" - }, - { - "avg_duration": "17.775057712121207", - "name": "rendering.mobile/baidu" - }, - { - "avg_duration": "17.297259035353534", - "name": "rendering.mobile/baidu_mobile" - }, - { - "avg_duration": "17.174688868686868", - "name": "rendering.mobile/baidu_mobile_sync_scroll" - }, - { - "avg_duration": "17.857244989898998", - "name": "rendering.mobile/baidu_sync_scroll" - }, - { - "avg_duration": "30.20186622413792", - "name": "rendering.mobile/balls_css_key_frame_animations" - }, - { - "avg_duration": "27.739558224137937", - "name": "rendering.mobile/balls_css_transition_2_properties" - }, - { - "avg_duration": "31.125825896551714", - "name": "rendering.mobile/balls_css_transition_40_properties" - }, - { - "avg_duration": "27.818368327586207", - "name": "rendering.mobile/balls_css_transition_all_properties" - }, - { - "avg_duration": "29.978107879310343", - "name": "rendering.mobile/balls_javascript_canvas" - }, - { - "avg_duration": "28.096952931034483", - "name": "rendering.mobile/balls_javascript_css" - }, - { - "avg_duration": "46.57572248275862", - "name": "rendering.mobile/balls_svg_animations" - }, - { - "avg_duration": "16.390959434343433", - "name": "rendering.mobile/bing" - }, - { - "avg_duration": "17.863962368686852", - "name": "rendering.mobile/bing_mobile" - }, - { - "avg_duration": "15.997709449494945", - "name": "rendering.mobile/bing_mobile_sync_scroll" - }, - { - "avg_duration": "16.358838737373738", - "name": "rendering.mobile/bing_sync_scroll" - }, - { - "avg_duration": "33.01118054545454", - "name": "rendering.mobile/blogspot" - }, - { - "avg_duration": "35.899059565656565", - "name": "rendering.mobile/blogspot_desktop" - }, - { - "avg_duration": "31.391872232323216", - "name": "rendering.mobile/blogspot_desktop_gpu_raster" - }, - { - "avg_duration": "16.586968732323232", - "name": "rendering.mobile/blogspot_mobile" - }, - { - "avg_duration": "16.57863847979798", - "name": "rendering.mobile/blogspot_mobile_sync_scroll" - }, - { - "avg_duration": "19.030865737373738", - "name": "rendering.mobile/blogspot_sync_scroll" - }, - { - "avg_duration": "37.91880395959595", - "name": "rendering.mobile/boingboing" - }, - { - "avg_duration": "39.089734252525254", - "name": "rendering.mobile/boingboing_mobile" - }, - { - "avg_duration": "41.12423346464646", - "name": "rendering.mobile/boingboing_sync_scroll" - }, - { - "avg_duration": "24.399986707070717", - "name": "rendering.mobile/booking.com" - }, - { - "avg_duration": "23.03914211111112", - "name": "rendering.mobile/booking.com_desktop" - }, - { - "avg_duration": "22.29360981818182", - "name": "rendering.mobile/booking.com_desktop_gpu_raster" - }, - { - "avg_duration": "24.750638696969688", - "name": "rendering.mobile/booking.com_mobile" - }, - { - "avg_duration": "26.561235464646458", - "name": "rendering.mobile/booking.com_mobile_sync_scroll" - }, - { - "avg_duration": "26.601080232323227", - "name": "rendering.mobile/booking.com_sync_scroll" - }, - { - "avg_duration": "25.647194163043483", - "name": "rendering.mobile/bouncing_balls_15" - }, - { - "avg_duration": "40.808054837837844", - "name": "rendering.mobile/bouncing_balls_shadow" - }, - { - "avg_duration": "25.321212673913045", - "name": "rendering.mobile/bouncing_clipped_rectangles" - }, - { - "avg_duration": "21.302330934782614", - "name": "rendering.mobile/bouncing_gradient_circles" - }, - { - "avg_duration": "20.344167293478264", - "name": "rendering.mobile/bouncing_png_images" - }, - { - "avg_duration": "28.788849032608685", - "name": "rendering.mobile/bouncing_svg_images" - }, - { - "avg_duration": "27.82252706593406", - "name": "rendering.mobile/canvas_animation_no_clear" - }, - { - "avg_duration": "21.647887989130442", - "name": "rendering.mobile/canvas_arcs" - }, - { - "avg_duration": "22.669851195652175", - "name": "rendering.mobile/canvas_font_cycler" - }, - { - "avg_duration": "22.427092521739127", - "name": "rendering.mobile/canvas_lines" - }, - { - "avg_duration": "21.486900064102567", - "name": "rendering.mobile/canvas_to_blob" - }, - { - "avg_duration": "34.23622364646463", - "name": "rendering.mobile/capitolvolkswagen" - }, - { - "avg_duration": "27.871385636363634", - "name": "rendering.mobile/capitolvolkswagen_mobile" - }, - { - "avg_duration": "26.874439040404045", - "name": "rendering.mobile/capitolvolkswagen_mobile_sync_scroll" - }, - { - "avg_duration": "27.167248575757576", - "name": "rendering.mobile/capitolvolkswagen_sync_scroll" - }, - { - "avg_duration": "35.14790765217392", - "name": "rendering.mobile/chip_tune" - }, - { - "avg_duration": "20.578741181818184", - "name": "rendering.mobile/cnn" - }, - { - "avg_duration": "38.74340611111112", - "name": "rendering.mobile/cnn_article" - }, - { - "avg_duration": "39.921548595959585", - "name": "rendering.mobile/cnn_article_mobile" - }, - { - "avg_duration": "40.94295752525254", - "name": "rendering.mobile/cnn_article_mobile_sync_scroll" - }, - { - "avg_duration": "39.316985181818175", - "name": "rendering.mobile/cnn_article_sync_scroll" - }, - { - "avg_duration": "4.0370539526315784E-4", - "name": "rendering.mobile/cnn_desktop" - }, - { - "avg_duration": "3.8338962526315786E-4", - "name": "rendering.mobile/cnn_desktop_gpu_raster" - }, - { - "avg_duration": "22.378834848484843", - "name": "rendering.mobile/cnn_mobile" - }, - { - "avg_duration": "22.395494151515148", - "name": "rendering.mobile/cnn_mobile_sync_scroll" - }, - { - "avg_duration": "20.657582888888882", - "name": "rendering.mobile/cnn_sync_scroll" - }, - { - "avg_duration": "32.3981826724138", - "name": "rendering.mobile/compositor_heavy_animation" - }, - { - "avg_duration": "33.237606184782614", - "name": "rendering.mobile/crafty_mind" - }, - { - "avg_duration": "30.119004574468082", - "name": "rendering.mobile/css_animations_many_keyframes" - }, - { - "avg_duration": "34.55429648275863", - "name": "rendering.mobile/css_animations_simultaneous_inline_style" - }, - { - "avg_duration": "29.392476396551718", - "name": "rendering.mobile/css_animations_simultaneous_new_element" - }, - { - "avg_duration": "28.951959448275854", - "name": "rendering.mobile/css_animations_simultaneous_style_element" - }, - { - "avg_duration": "28.704441482758618", - "name": "rendering.mobile/css_animations_simultaneous_updating_class" - }, - { - "avg_duration": "27.292782482758625", - "name": "rendering.mobile/css_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "30.80966094827587", - "name": "rendering.mobile/css_animations_staggered_inline_style" - }, - { - "avg_duration": "35.02853256896552", - "name": "rendering.mobile/css_animations_staggered_new_element" - }, - { - "avg_duration": "32.61701981034483", - "name": "rendering.mobile/css_animations_staggered_style_element" - }, - { - "avg_duration": "31.151561310344825", - "name": "rendering.mobile/css_animations_staggered_updating_class" - }, - { - "avg_duration": "34.04953150000001", - "name": "rendering.mobile/css_animations_triggered_inline_style" - }, - { - "avg_duration": "38.41714039655171", - "name": "rendering.mobile/css_animations_triggered_new_element" - }, - { - "avg_duration": "30.169576982758613", - "name": "rendering.mobile/css_animations_triggered_style_element" - }, - { - "avg_duration": "34.23217017241381", - "name": "rendering.mobile/css_animations_triggered_updating_class" - }, - { - "avg_duration": "28.96919379310345", - "name": "rendering.mobile/css_transitions_inline_style" - }, - { - "avg_duration": "29.38407798275863", - "name": "rendering.mobile/css_transitions_new_element" - }, - { - "avg_duration": "28.76500598245613", - "name": "rendering.mobile/css_transitions_staggered_inline_style" - }, - { - "avg_duration": "32.18199898245614", - "name": "rendering.mobile/css_transitions_staggered_new_element" - }, - { - "avg_duration": "29.435762315789464", - "name": "rendering.mobile/css_transitions_staggered_style_element" - }, - { - "avg_duration": "28.754867508771927", - "name": "rendering.mobile/css_transitions_staggered_updating_class" - }, - { - "avg_duration": "28.281098263157894", - "name": "rendering.mobile/css_transitions_style_element" - }, - { - "avg_duration": "33.49062917543859", - "name": "rendering.mobile/css_transitions_triggered_inline_style" - }, - { - "avg_duration": "30.328290859649115", - "name": "rendering.mobile/css_transitions_triggered_new_element" - }, - { - "avg_duration": "33.042005157894735", - "name": "rendering.mobile/css_transitions_triggered_style_element" - }, - { - "avg_duration": "30.358155842105266", - "name": "rendering.mobile/css_transitions_triggered_updating_class" - }, - { - "avg_duration": "28.587535035087715", - "name": "rendering.mobile/css_transitions_updating_class" - }, - { - "avg_duration": "31.407885175438608", - "name": "rendering.mobile/css_value_type_color" - }, - { - "avg_duration": "46.5375960877193", - "name": "rendering.mobile/css_value_type_filter" - }, - { - "avg_duration": "26.155265175438597", - "name": "rendering.mobile/css_value_type_length" - }, - { - "avg_duration": "31.038099614035087", - "name": "rendering.mobile/css_value_type_length_complex" - }, - { - "avg_duration": "27.850365859649127", - "name": "rendering.mobile/css_value_type_length_simple" - }, - { - "avg_duration": "31.40362696491228", - "name": "rendering.mobile/css_value_type_path" - }, - { - "avg_duration": "26.780836333333333", - "name": "rendering.mobile/css_value_type_shadow" - }, - { - "avg_duration": "26.174629491228064", - "name": "rendering.mobile/css_value_type_transform_complex" - }, - { - "avg_duration": "25.99877754385966", - "name": "rendering.mobile/css_value_type_transform_simple" - }, - { - "avg_duration": "35.88538525252525", - "name": "rendering.mobile/cuteoverload" - }, - { - "avg_duration": "38.99499784848485", - "name": "rendering.mobile/cuteoverload_mobile" - }, - { - "avg_duration": "36.57658565656565", - "name": "rendering.mobile/cuteoverload_sync_scroll" - }, - { - "avg_duration": "28.658946161616175", - "name": "rendering.mobile/deviantart" - }, - { - "avg_duration": "30.402941484848494", - "name": "rendering.mobile/deviantart_mobile" - }, - { - "avg_duration": "30.9530388989899", - "name": "rendering.mobile/deviantart_mobile_sync_scroll" - }, - { - "avg_duration": "28.99130738383839", - "name": "rendering.mobile/deviantart_sync_scroll" - }, - { - "avg_duration": "4.682791894736842E-4", - "name": "rendering.mobile/digg" - }, - { - "avg_duration": "4.6456488000000005E-4", - "name": "rendering.mobile/digg_sync_scroll" - }, - { - "avg_duration": "19.233112060606057", - "name": "rendering.mobile/ebay" - }, - { - "avg_duration": "17.865257262626265", - "name": "rendering.mobile/ebay_desktop" - }, - { - "avg_duration": "17.4742270959596", - "name": "rendering.mobile/ebay_desktop_gpu_raster" - }, - { - "avg_duration": "23.01759167676768", - "name": "rendering.mobile/ebay_mobile" - }, - { - "avg_duration": "21.6573207878788", - "name": "rendering.mobile/ebay_mobile_sync_scroll" - }, - { - "avg_duration": "37.527715352941165", - "name": "rendering.mobile/ebay_scroll" - }, - { - "avg_duration": "21.968960949494942", - "name": "rendering.mobile/ebay_sync_scroll" - }, - { - "avg_duration": "30.122271916666666", - "name": "rendering.mobile/effect_games" - }, - { - "avg_duration": "16.76000070707071", - "name": "rendering.mobile/espn" - }, - { - "avg_duration": "17.213942803030307", - "name": "rendering.mobile/espn_desktop" - }, - { - "avg_duration": "14.821043868686878", - "name": "rendering.mobile/espn_desktop_gpu_raster" - }, - { - "avg_duration": "4.968266752631579E-4", - "name": "rendering.mobile/espn_sync_scroll" - }, - { - "avg_duration": "27.33693521212122", - "name": "rendering.mobile/facebook" - }, - { - "avg_duration": "29.233186191919188", - "name": "rendering.mobile/facebook_desktop" - }, - { - "avg_duration": "33.10860816161617", - "name": "rendering.mobile/facebook_desktop_gpu_raster" - }, - { - "avg_duration": "22.980294272727274", - "name": "rendering.mobile/facebook_mobile" - }, - { - "avg_duration": "23.32235171717173", - "name": "rendering.mobile/facebook_mobile_sync_scroll" - }, - { - "avg_duration": "22.000981777777774", - "name": "rendering.mobile/facebook_sync_scroll" - }, - { - "avg_duration": "20.836025098901104", - "name": "rendering.mobile/fill_shapes" - }, - { - "avg_duration": "28.78960374747474", - "name": "rendering.mobile/filter_terrain_svg" - }, - { - "avg_duration": "42.69862152380952", - "name": "rendering.mobile/flickr_scroll" - }, - { - "avg_duration": "2.206752178947368E-4", - "name": "rendering.mobile/forecast.io" - }, - { - "avg_duration": "2.958147163157895E-4", - "name": "rendering.mobile/forecast.io_sync_scroll" - }, - { - "avg_duration": "23.3837131617647", - "name": "rendering.mobile/geo_apis" - }, - { - "avg_duration": "51.22139887878786", - "name": "rendering.mobile/gmail" - }, - { - "avg_duration": "60.09795686868685", - "name": "rendering.mobile/gmail_desktop" - }, - { - "avg_duration": "47.89112306060607", - "name": "rendering.mobile/gmail_desktop_gpu_raster" - }, - { - "avg_duration": "36.991741", - "name": "rendering.mobile/google_calendar" - }, - { - "avg_duration": "31.33091190909092", - "name": "rendering.mobile/google_calendar_desktop" - }, - { - "avg_duration": "30.8694653030303", - "name": "rendering.mobile/google_calendar_desktop_gpu_raster" - }, - { - "avg_duration": "51.17541760606062", - "name": "rendering.mobile/google_docs" - }, - { - "avg_duration": "47.733880484848484", - "name": "rendering.mobile/google_docs_desktop" - }, - { - "avg_duration": "51.53360365656565", - "name": "rendering.mobile/google_docs_desktop_gpu_raster" - }, - { - "avg_duration": "39.26347754545454", - "name": "rendering.mobile/google_image_search" - }, - { - "avg_duration": "35.451469515151494", - "name": "rendering.mobile/google_image_search_desktop" - }, - { - "avg_duration": "35.193688060606064", - "name": "rendering.mobile/google_image_search_desktop_gpu_raster" - }, - { - "avg_duration": "27.867751939393926", - "name": "rendering.mobile/google_news" - }, - { - "avg_duration": "29.256312464646456", - "name": "rendering.mobile/google_news_mobile" - }, - { - "avg_duration": "28.911090565656572", - "name": "rendering.mobile/google_news_mobile_sync_scroll" - }, - { - "avg_duration": "27.60572487878788", - "name": "rendering.mobile/google_news_sync_scroll" - }, - { - "avg_duration": "41.72251697979799", - "name": "rendering.mobile/google_plus" - }, - { - "avg_duration": "42.52798232323232", - "name": "rendering.mobile/google_plus_desktop" - }, - { - "avg_duration": "45.768008454545445", - "name": "rendering.mobile/google_plus_desktop_gpu_raster" - }, - { - "avg_duration": "23.752549454545466", - "name": "rendering.mobile/google_plus_mobile" - }, - { - "avg_duration": "22.39412078787879", - "name": "rendering.mobile/google_plus_mobile_sync_scroll" - }, - { - "avg_duration": "22.68834180808082", - "name": "rendering.mobile/google_plus_sync_scroll" - }, - { - "avg_duration": "19.062246994949493", - "name": "rendering.mobile/google_web_search" - }, - { - "avg_duration": "17.661082722222226", - "name": "rendering.mobile/google_web_search_desktop" - }, - { - "avg_duration": "17.119348060606065", - "name": "rendering.mobile/google_web_search_desktop_gpu_raster" - }, - { - "avg_duration": "21.442972808080818", - "name": "rendering.mobile/google_web_search_mobile" - }, - { - "avg_duration": "18.13323271717172", - "name": "rendering.mobile/google_web_search_mobile_sync_scroll" - }, - { - "avg_duration": "18.361238459595953", - "name": "rendering.mobile/google_web_search_sync_scroll" - }, - { - "avg_duration": "23.429734156565655", - "name": "rendering.mobile/gsp.ro" - }, - { - "avg_duration": "20.969917131313128", - "name": "rendering.mobile/gsp.ro_mobile" - }, - { - "avg_duration": "19.226089181818175", - "name": "rendering.mobile/gsp.ro_mobile_sync_scroll" - }, - { - "avg_duration": "19.948855777777787", - "name": "rendering.mobile/gsp.ro_sync_scroll" - }, - { - "avg_duration": "31.028887978947363", - "name": "rendering.mobile/guimark_vector_chart" - }, - { - "avg_duration": "24.415809450549453", - "name": "rendering.mobile/hakim" - }, - { - "avg_duration": "38.443217770833336", - "name": "rendering.mobile/ie_chalkboard" - }, - { - "avg_duration": "36.13859636363636", - "name": "rendering.mobile/ie_pirate_mark" - }, - { - "avg_duration": "26.791301175824163", - "name": "rendering.mobile/jarro_doverson" - }, - { - "avg_duration": "24.063546611111114", - "name": "rendering.mobile/kevs_3d" - }, - { - "avg_duration": "26.925064263157893", - "name": "rendering.mobile/keyframed_animations" - }, - { - "avg_duration": "20.381916484848485", - "name": "rendering.mobile/linkedin" - }, - { - "avg_duration": "20.907745303030303", - "name": "rendering.mobile/linkedin_desktop" - }, - { - "avg_duration": "18.583634919191915", - "name": "rendering.mobile/linkedin_desktop_gpu_raster" - }, - { - "avg_duration": "23.246175181818188", - "name": "rendering.mobile/linkedin_mobile" - }, - { - "avg_duration": "25.223574323232324", - "name": "rendering.mobile/linkedin_mobile_sync_scroll" - }, - { - "avg_duration": "23.984529909090913", - "name": "rendering.mobile/linkedin_sync_scroll" - }, - { - "avg_duration": "23.5355852967033", - "name": "rendering.mobile/man_in_blue" - }, - { - "avg_duration": "31.04116969230768", - "name": "rendering.mobile/many_images" - }, - { - "avg_duration": "25.926508033333338", - "name": "rendering.mobile/megi_dish" - }, - { - "avg_duration": "25.368362197802195", - "name": "rendering.mobile/microsoft_asteroid_belt" - }, - { - "avg_duration": "26.340189948717946", - "name": "rendering.mobile/microsoft_fireflies" - }, - { - "avg_duration": "26.136617087912086", - "name": "rendering.mobile/microsoft_fish_ie_tank" - }, - { - "avg_duration": "23.887397249999996", - "name": "rendering.mobile/microsoft_snow" - }, - { - "avg_duration": "27.143643153846163", - "name": "rendering.mobile/microsoft_speed_reading" - }, - { - "avg_duration": "26.18756757142857", - "name": "rendering.mobile/microsoft_tweet_map" - }, - { - "avg_duration": "27.29123584615384", - "name": "rendering.mobile/microsoft_video_city" - }, - { - "avg_duration": "21.98539505555555", - "name": "rendering.mobile/microsoft_worker_fountains" - }, - { - "avg_duration": "22.403961155555557", - "name": "rendering.mobile/mix_10k" - }, - { - "avg_duration": "33.528797375", - "name": "rendering.mobile/mix_blend_mode_animation_difference" - }, - { - "avg_duration": "33.48355337500001", - "name": "rendering.mobile/mix_blend_mode_animation_hue" - }, - { - "avg_duration": "31.08688732142856", - "name": "rendering.mobile/mix_blend_mode_animation_propagating_isolation" - }, - { - "avg_duration": "31.241930053571426", - "name": "rendering.mobile/mix_blend_mode_animation_screen" - }, - { - "avg_duration": "16.862632777777783", - "name": "rendering.mobile/mlb" - }, - { - "avg_duration": "16.438405439393932", - "name": "rendering.mobile/mlb_mobile" - }, - { - "avg_duration": "16.17500063636363", - "name": "rendering.mobile/mlb_mobile_sync_scroll" - }, - { - "avg_duration": "17.033653853535352", - "name": "rendering.mobile/mlb_sync_scroll" - }, - { - "avg_duration": "26.519346287234047", - "name": "rendering.mobile/motion_mark_canvas_fill_shapes" - }, - { - "avg_duration": "29.13223607446808", - "name": "rendering.mobile/motion_mark_canvas_stroke_shapes" - }, - { - "avg_duration": "33.8372841111111", - "name": "rendering.mobile/motion_mark_focus" - }, - { - "avg_duration": "33.60362649019609", - "name": "rendering.mobile/nyc_gov_scroll" - }, - { - "avg_duration": "22.93084146464646", - "name": "rendering.mobile/nytimes" - }, - { - "avg_duration": "29.092878141414126", - "name": "rendering.mobile/nytimes_mobile" - }, - { - "avg_duration": "31.191308039215674", - "name": "rendering.mobile/nytimes_scroll" - }, - { - "avg_duration": "22.841213969696977", - "name": "rendering.mobile/nytimes_sync_scroll" - }, - { - "avg_duration": "35.165274535714275", - "name": "rendering.mobile/overlay_background_color_css_transitions_page" - }, - { - "avg_duration": "28.286828888888895", - "name": "rendering.mobile/pinterest" - }, - { - "avg_duration": "27.056615979797968", - "name": "rendering.mobile/pinterest_desktop" - }, - { - "avg_duration": "4.2822486578947375E-4", - "name": "rendering.mobile/pinterest_desktop_gpu_raster" - }, - { - "avg_duration": "25.879050060606072", - "name": "rendering.mobile/pinterest_mobile" - }, - { - "avg_duration": "26.945117828282825", - "name": "rendering.mobile/pinterest_mobile_sync_scroll" - }, - { - "avg_duration": "29.38301956565656", - "name": "rendering.mobile/pinterest_sync_scroll" - }, - { - "avg_duration": "22.983013433333337", - "name": "rendering.mobile/put_get_image_data" - }, - { - "avg_duration": "28.317460898989886", - "name": "rendering.mobile/reddit" - }, - { - "avg_duration": "27.587387686868684", - "name": "rendering.mobile/reddit_mobile" - }, - { - "avg_duration": "28.613129383838395", - "name": "rendering.mobile/reddit_sync_scroll" - }, - { - "avg_duration": "23.1905617", - "name": "rendering.mobile/runway" - }, - { - "avg_duration": "23.820506020202018", - "name": "rendering.mobile/sfgate" - }, - { - "avg_duration": "23.435349191919194", - "name": "rendering.mobile/sfgate_mobile" - }, - { - "avg_duration": "24.160053030303033", - "name": "rendering.mobile/sfgate_mobile_sync_scroll" - }, - { - "avg_duration": "24.360379191919193", - "name": "rendering.mobile/sfgate_sync_scroll" - }, - { - "avg_duration": "28.575324565656548", - "name": "rendering.mobile/slashdot" - }, - { - "avg_duration": "28.343825161616156", - "name": "rendering.mobile/slashdot_mobile" - }, - { - "avg_duration": "28.882843535353548", - "name": "rendering.mobile/slashdot_sync_scroll" - }, - { - "avg_duration": "28.385936305555553", - "name": "rendering.mobile/smash_cat" - }, - { - "avg_duration": "22.067401566666664", - "name": "rendering.mobile/spielzeugz" - }, - { - "avg_duration": "23.681412344444446", - "name": "rendering.mobile/stroke_shapes" - }, - { - "avg_duration": "41.57966722222223", - "name": "rendering.mobile/techcrunch" - }, - { - "avg_duration": "41.30093230303029", - "name": "rendering.mobile/techcrunch_desktop" - }, - { - "avg_duration": "43.741591777777785", - "name": "rendering.mobile/techcrunch_desktop_gpu_raster" - }, - { - "avg_duration": "20.54433752525253", - "name": "rendering.mobile/techcrunch_mobile" - }, - { - "avg_duration": "19.4070098030303", - "name": "rendering.mobile/techcrunch_mobile_sync_scroll" - }, - { - "avg_duration": "20.052568904040406", - "name": "rendering.mobile/techcrunch_sync_scroll" - }, - { - "avg_duration": "21.65879686868685", - "name": "rendering.mobile/theverge" - }, - { - "avg_duration": "36.69248611111111", - "name": "rendering.mobile/theverge_article" - }, - { - "avg_duration": "36.807814383838384", - "name": "rendering.mobile/theverge_article_mobile" - }, - { - "avg_duration": "37.05229389898991", - "name": "rendering.mobile/theverge_article_mobile_sync_scroll" - }, - { - "avg_duration": "35.36095122222223", - "name": "rendering.mobile/theverge_article_sync_scroll" - }, - { - "avg_duration": "21.405028848484857", - "name": "rendering.mobile/theverge_mobile" - }, - { - "avg_duration": "21.53724829292929", - "name": "rendering.mobile/theverge_mobile_sync_scroll" - }, - { - "avg_duration": "21.753474303030305", - "name": "rendering.mobile/theverge_sync_scroll" - }, - { - "avg_duration": "28.822892178571436", - "name": "rendering.mobile/transform_transitions" - }, - { - "avg_duration": "26.429194125000006", - "name": "rendering.mobile/transform_transitions_js_block" - }, - { - "avg_duration": "23.414796959595968", - "name": "rendering.mobile/twitter" - }, - { - "avg_duration": "23.96239649494949", - "name": "rendering.mobile/twitter_desktop" - }, - { - "avg_duration": "23.935962919191905", - "name": "rendering.mobile/twitter_desktop_gpu_raster" - }, - { - "avg_duration": "4.168937057894736E-4", - "name": "rendering.mobile/twitter_sync_scroll" - }, - { - "avg_duration": "35.39226241414143", - "name": "rendering.mobile/usatoday" - }, - { - "avg_duration": "34.955244414141404", - "name": "rendering.mobile/usatoday_mobile" - }, - { - "avg_duration": "36.85197191919192", - "name": "rendering.mobile/usatoday_mobile_sync_scroll" - }, - { - "avg_duration": "36.24619392929293", - "name": "rendering.mobile/usatoday_sync_scroll" - }, - { - "avg_duration": "29.379590272727263", - "name": "rendering.mobile/weather.com" - }, - { - "avg_duration": "28.406873949494933", - "name": "rendering.mobile/weather.com_desktop" - }, - { - "avg_duration": "27.58141986868687", - "name": "rendering.mobile/weather.com_desktop_gpu_raster" - }, - { - "avg_duration": "28.278045517857148", - "name": "rendering.mobile/web_animation_value_type_color" - }, - { - "avg_duration": "26.226855803571443", - "name": "rendering.mobile/web_animation_value_type_length_3d" - }, - { - "avg_duration": "27.705266607142857", - "name": "rendering.mobile/web_animation_value_type_length_complex" - }, - { - "avg_duration": "28.05337917857142", - "name": "rendering.mobile/web_animation_value_type_length_simple" - }, - { - "avg_duration": "28.183935839285713", - "name": "rendering.mobile/web_animation_value_type_path" - }, - { - "avg_duration": "26.727275392857155", - "name": "rendering.mobile/web_animation_value_type_shadow" - }, - { - "avg_duration": "26.02598791071429", - "name": "rendering.mobile/web_animation_value_type_transform_complex" - }, - { - "avg_duration": "26.252197964285724", - "name": "rendering.mobile/web_animation_value_type_transform_simple" - }, - { - "avg_duration": "38.945183078947366", - "name": "rendering.mobile/web_animations_many_keyframes" - }, - { - "avg_duration": "26.45217371428571", - "name": "rendering.mobile/web_animations_set_current_time" - }, - { - "avg_duration": "27.573824017857138", - "name": "rendering.mobile/web_animations_simultaneous" - }, - { - "avg_duration": "29.85531603571428", - "name": "rendering.mobile/web_animations_staggered_chaining" - }, - { - "avg_duration": "27.04445533928572", - "name": "rendering.mobile/web_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "30.500536285714297", - "name": "rendering.mobile/web_animations_staggered_triggering_page" - }, - { - "avg_duration": "33.18601714141415", - "name": "rendering.mobile/wikipedia" - }, - { - "avg_duration": "25.001719414141412", - "name": "rendering.mobile/wikipedia_delayed_scroll_start" - }, - { - "avg_duration": "24.943456242424244", - "name": "rendering.mobile/wikipedia_delayed_scroll_start_sync_scroll" - }, - { - "avg_duration": "33.901694222222204", - "name": "rendering.mobile/wikipedia_desktop" - }, - { - "avg_duration": "32.886838979797986", - "name": "rendering.mobile/wikipedia_desktop_gpu_raster" - }, - { - "avg_duration": "24.633500888888886", - "name": "rendering.mobile/wikipedia_mobile" - }, - { - "avg_duration": "26.62216548484848", - "name": "rendering.mobile/wikipedia_mobile_sync_scroll" - }, - { - "avg_duration": "25.291053151515165", - "name": "rendering.mobile/wikipedia_sync_scroll" - }, - { - "avg_duration": "32.85694827272727", - "name": "rendering.mobile/wordpress" - }, - { - "avg_duration": "31.729104767676773", - "name": "rendering.mobile/wordpress_desktop" - }, - { - "avg_duration": "31.09887745454546", - "name": "rendering.mobile/wordpress_desktop_gpu_raster" - }, - { - "avg_duration": "30.83481945454545", - "name": "rendering.mobile/wordpress_mobile" - }, - { - "avg_duration": "31.860839222222225", - "name": "rendering.mobile/wordpress_mobile_sync_scroll" - }, - { - "avg_duration": "29.76665632323232", - "name": "rendering.mobile/wordpress_sync_scroll" - }, - { - "avg_duration": "46.03359234343434", - "name": "rendering.mobile/worldjournal" - }, - { - "avg_duration": "46.0279662929293", - "name": "rendering.mobile/worldjournal_mobile" - }, - { - "avg_duration": "45.04662032323232", - "name": "rendering.mobile/worldjournal_mobile_sync_scroll" - }, - { - "avg_duration": "46.33259222222221", - "name": "rendering.mobile/worldjournal_sync_scroll" - }, - { - "avg_duration": "41.18477061616162", - "name": "rendering.mobile/wowwiki" - }, - { - "avg_duration": "40.452797989899", - "name": "rendering.mobile/wowwiki_mobile" - }, - { - "avg_duration": "38.82358830303029", - "name": "rendering.mobile/wowwiki_mobile_sync_scroll" - }, - { - "avg_duration": "40.604145050505046", - "name": "rendering.mobile/wowwiki_sync_scroll" - }, - { - "avg_duration": "22.320979585858588", - "name": "rendering.mobile/wsj" - }, - { - "avg_duration": "23.305896999999998", - "name": "rendering.mobile/wsj_mobile" - }, - { - "avg_duration": "19.711433661616166", - "name": "rendering.mobile/wsj_mobile_sync_scroll" - }, - { - "avg_duration": "20.588050757575747", - "name": "rendering.mobile/wsj_sync_scroll" - }, - { - "avg_duration": "22.95796197979798", - "name": "rendering.mobile/yahoo_answers" - }, - { - "avg_duration": "23.426635525252518", - "name": "rendering.mobile/yahoo_answers_desktop" - }, - { - "avg_duration": "20.85524991919192", - "name": "rendering.mobile/yahoo_answers_desktop_gpu_raster" - }, - { - "avg_duration": "22.95456173737374", - "name": "rendering.mobile/yahoo_answers_mobile" - }, - { - "avg_duration": "23.2735251919192", - "name": "rendering.mobile/yahoo_answers_mobile_sync_scroll" - }, - { - "avg_duration": "23.848167429292925", - "name": "rendering.mobile/yahoo_answers_sync_scroll" - }, - { - "avg_duration": "34.95552792929295", - "name": "rendering.mobile/yahoo_games" - }, - { - "avg_duration": "36.08923959595958", - "name": "rendering.mobile/yahoo_games_desktop" - }, - { - "avg_duration": "35.21559961616162", - "name": "rendering.mobile/yahoo_games_desktop_gpu_raster" - }, - { - "avg_duration": "26.414852999999997", - "name": "rendering.mobile/yahoo_news" - }, - { - "avg_duration": "25.79643895959595", - "name": "rendering.mobile/yahoo_news_desktop" - }, - { - "avg_duration": "24.665815171717174", - "name": "rendering.mobile/yahoo_news_desktop_gpu_raster" - }, - { - "avg_duration": "23.57228013131313", - "name": "rendering.mobile/yahoo_news_mobile" - }, - { - "avg_duration": "22.12417446464646", - "name": "rendering.mobile/yahoo_news_mobile_sync_scroll" - }, - { - "avg_duration": "22.365634060606055", - "name": "rendering.mobile/yahoo_news_sync_scroll" - }, - { - "avg_duration": "25.540416020202017", - "name": "rendering.mobile/yahoo_sports" - }, - { - "avg_duration": "25.97166287878787", - "name": "rendering.mobile/yahoo_sports_desktop" - }, - { - "avg_duration": "26.69797717171716", - "name": "rendering.mobile/yahoo_sports_desktop_gpu_raster" - }, - { - "avg_duration": "34.63320229292929", - "name": "rendering.mobile/youtube" - }, - { - "avg_duration": "36.04504458585859", - "name": "rendering.mobile/youtube_desktop" - }, - { - "avg_duration": "36.24930206060605", - "name": "rendering.mobile/youtube_desktop_gpu_raster" - }, - { - "avg_duration": "17.68407111111111", - "name": "rendering.mobile/youtube_mobile" - }, - { - "avg_duration": "16.02665546464647", - "name": "rendering.mobile/youtube_mobile_sync_scroll" - }, - { - "avg_duration": "18.213291702020204", - "name": "rendering.mobile/youtube_sync_scroll" - }, - { - "avg_duration": "20.913077202020204", - "name": "scheduler.tough_scheduling_cases/raf.html" - }, - { - "avg_duration": "24.635589050505043", - "name": "scheduler.tough_scheduling_cases/raf_animation.html" - }, - { - "avg_duration": "20.82431129292929", - "name": "scheduler.tough_scheduling_cases/raf_canvas.html" - }, - { - "avg_duration": "28.321065232323235", - "name": "scheduler.tough_scheduling_cases/raf_touch_animation.html" - }, - { - "avg_duration": "14.925686424242413", - "name": "scheduler.tough_scheduling_cases/second_batch_js.html?heavy" - }, - { - "avg_duration": "14.360280818181819", - "name": "scheduler.tough_scheduling_cases/second_batch_js.html?light" - }, - { - "avg_duration": "17.855072651515155", - "name": "scheduler.tough_scheduling_cases/second_batch_js.html?medium" - }, - { - "avg_duration": "31.715716232323214", - "name": "scheduler.tough_scheduling_cases/simple_text_page.html" - }, - { - "avg_duration": "24.717855398989908", - "name": "scheduler.tough_scheduling_cases/simple_touch_drag.html" - }, - { - "avg_duration": "20.68927139393939", - "name": "scheduler.tough_scheduling_cases/sync_scroll_offset.html" - }, - { - "avg_duration": "19.76253951515152", - "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling.html" - }, - { - "avg_duration": "1.542118360377358E-4", - "name": "smoothness.gpu_rasterization.top_25_smooth/amazon" - }, - { - "avg_duration": "25.724918313131326", - "name": "smoothness.gpu_rasterization.top_25_smooth/blogspot" - }, - { - "avg_duration": "17.687302782828286", - "name": "smoothness.gpu_rasterization.top_25_smooth/booking.com" - }, - { - "avg_duration": "2.1754120828301887E-4", - "name": "smoothness.gpu_rasterization.top_25_smooth/cnn" - }, - { - "avg_duration": "14.370211707070705", - "name": "smoothness.gpu_rasterization.top_25_smooth/ebay" - }, - { - "avg_duration": "17.819825979797976", - "name": "smoothness.gpu_rasterization.top_25_smooth/espn" - }, - { - "avg_duration": "22.287473717171714", - "name": "smoothness.gpu_rasterization.top_25_smooth/facebook" - }, - { - "avg_duration": "46.07341517171718", - "name": "smoothness.gpu_rasterization.top_25_smooth/gmail" - }, - { - "avg_duration": "23.760292252525247", - "name": "smoothness.gpu_rasterization.top_25_smooth/google_calendar" - }, - { - "avg_duration": "34.76894616161616", - "name": "smoothness.gpu_rasterization.top_25_smooth/google_docs" - }, - { - "avg_duration": "25.94070510101011", - "name": "smoothness.gpu_rasterization.top_25_smooth/google_image_search" - }, - { - "avg_duration": "31.581746131313135", - "name": "smoothness.gpu_rasterization.top_25_smooth/google_plus" - }, - { - "avg_duration": "14.355700454545456", - "name": "smoothness.gpu_rasterization.top_25_smooth/google_web_search" - }, - { - "avg_duration": "17.35543887878788", - "name": "smoothness.gpu_rasterization.top_25_smooth/linkedin" - }, - { - "avg_duration": "2.7613819735849065E-4", - "name": "smoothness.gpu_rasterization.top_25_smooth/pinterest" - }, - { - "avg_duration": "25.167481525252512", - "name": "smoothness.gpu_rasterization.top_25_smooth/techcrunch" - }, - { - "avg_duration": "19.8375575050505", - "name": "smoothness.gpu_rasterization.top_25_smooth/twitter" - }, - { - "avg_duration": "19.005042252525254", - "name": "smoothness.gpu_rasterization.top_25_smooth/weather.com" - }, - { - "avg_duration": "26.92178294949494", - "name": "smoothness.gpu_rasterization.top_25_smooth/wikipedia" - }, - { - "avg_duration": "23.369528666666657", - "name": "smoothness.gpu_rasterization.top_25_smooth/wordpress" - }, - { - "avg_duration": "16.10403476767676", - "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_answers" - }, - { - "avg_duration": "35.28816591919192", - "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_games" - }, - { - "avg_duration": "26.399818333333332", - "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_news" - }, - { - "avg_duration": "24.406223757575763", - "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_sports" - }, - { - "avg_duration": "28.265372535353542", - "name": "smoothness.gpu_rasterization.top_25_smooth/youtube" - }, - { - "avg_duration": "25.551159676767686", - "name": "smoothness.gpu_rasterization.tough_filters_cases/Analog_Clock_SVG" - }, - { - "avg_duration": "26.242665474747483", - "name": "smoothness.gpu_rasterization.tough_filters_cases/Filter_Terrain_SVG" - }, - { - "avg_duration": "31.51811605050504", - "name": "smoothness.gpu_rasterization.tough_filters_cases/IE_PirateMark" - }, - { - "avg_duration": "38.48926367676766", - "name": "smoothness.gpu_rasterization.tough_filters_cases/MotionMark_Focus" - }, - { - "avg_duration": "29.113643707070718", - "name": "smoothness.gpu_rasterization.tough_filters_cases/analog_clock_svg" - }, - { - "avg_duration": "26.41287190909091", - "name": "smoothness.gpu_rasterization.tough_filters_cases/filter_terrain_svg" - }, - { - "avg_duration": "29.09380533333334", - "name": "smoothness.gpu_rasterization.tough_filters_cases/ie_pirate_mark" - }, - { - "avg_duration": "37.980301363636364", - "name": "smoothness.gpu_rasterization.tough_filters_cases/motion_mark_focus" - }, - { - "avg_duration": "35.84146124242423", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" - }, - { - "avg_duration": "37.655639363636354", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/IE_Chalkboard" - }, - { - "avg_duration": "23.456848353535356", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" - }, - { - "avg_duration": "23.78690839393939", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" - }, - { - "avg_duration": "36.06593980219778", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/guimark_vector_chart" - }, - { - "avg_duration": "39.263521461538446", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/ie_chalkboard" - }, - { - "avg_duration": "26.990411747252736", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" - }, - { - "avg_duration": "35.492741637362634", - "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" - }, - { - "avg_duration": "24.44428904040403", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Blogger" - }, - { - "avg_duration": "31.095632707070717", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/ESPN" - }, - { - "avg_duration": "25.98218874747474", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Facebook" - }, - { - "avg_duration": "22.955201050505043", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/LinkedIn" - }, - { - "avg_duration": "24.65373467676768", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Twitter" - }, - { - "avg_duration": "28.647950959595978", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Weather.com" - }, - { - "avg_duration": "18.940645769230773", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/amazon_pinch" - }, - { - "avg_duration": "24.32244229230769", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/blogspot_pinch" - }, - { - "avg_duration": "24.397305123076922", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/booking_pinch" - }, - { - "avg_duration": "31.731765184615394", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/cnn_pinch" - }, - { - "avg_duration": "24.094995276923076", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/ebay_pinch" - }, - { - "avg_duration": "29.673103076923077", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/espn_pinch" - }, - { - "avg_duration": "22.326847953846148", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/facebook_pinch" - }, - { - "avg_duration": "32.43584595384615", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/gmail_pinch" - }, - { - "avg_duration": "22.059978599999997", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/google_calendar_pinch" - }, - { - "avg_duration": "24.22383429230769", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/google_image_pinch" - }, - { - "avg_duration": "33.78266433846152", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/google_search_pinch" - }, - { - "avg_duration": "23.669095737373734", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://booking.com" - }, - { - "avg_duration": "31.96806668686868", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://games.yahoo.com" - }, - { - "avg_duration": "29.07976007070707", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://news.yahoo.com" - }, - { - "avg_duration": "33.496390222222225", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://sports.yahoo.com/" - }, - { - "avg_duration": "22.81468584848484", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.amazon.com" - }, - { - "avg_duration": "29.63658420202019", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.cnn.com" - }, - { - "avg_duration": "24.363258777777787", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.ebay.com" - }, - { - "avg_duration": "24.025222161616167", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.youtube.com" - }, - { - "avg_duration": "32.6284919090909", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://mail.google.com/mail/" - }, - { - "avg_duration": "34.44611145454547", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://www.google.com/#hl=en&q=barack+obama" - }, - { - "avg_duration": "26.018181232323233", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://www.google.com/calendar/" - }, - { - "avg_duration": "23.41310527272728", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://www.google.com/search?q=cats&tbm=isch" - }, - { - "avg_duration": "24.75671632307692", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/linkedin_pinch" - }, - { - "avg_duration": "25.362324430769235", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/twitter_pinch" - }, - { - "avg_duration": "30.19131010769232", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/weather_pinch" - }, - { - "avg_duration": "32.04907820833333", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/yahoo_games_pinch" - }, - { - "avg_duration": "28.297539276923086", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/yahoo_news_pinch" - }, - { - "avg_duration": "27.869883323076934", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/yahoo_sports_pinch" - }, - { - "avg_duration": "23.769277353846146", - "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/youtube_pinch" - }, - { - "avg_duration": "20.989678707070702", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_05000_pixels_per_second" - }, - { - "avg_duration": "21.04205947474748", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_10000_pixels_per_second" - }, - { - "avg_duration": "19.56849081818182", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_15000_pixels_per_second" - }, - { - "avg_duration": "18.651714686868686", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_20000_pixels_per_second" - }, - { - "avg_duration": "17.599210929292923", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_30000_pixels_per_second" - }, - { - "avg_duration": "17.040607570707078", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_40000_pixels_per_second" - }, - { - "avg_duration": "16.811813959595966", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_50000_pixels_per_second" - }, - { - "avg_duration": "16.110914131313127", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_60000_pixels_per_second" - }, - { - "avg_duration": "15.420053313131314", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_75000_pixels_per_second" - }, - { - "avg_duration": "14.949764277777781", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_90000_pixels_per_second" - }, - { - "avg_duration": "32.06965845454547", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_05000_pixels_per_second" - }, - { - "avg_duration": "20.384735202020202", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_10000_pixels_per_second" - }, - { - "avg_duration": "18.98804222222222", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_15000_pixels_per_second" - }, - { - "avg_duration": "17.944121797979804", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_20000_pixels_per_second" - }, - { - "avg_duration": "17.00659578787879", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_30000_pixels_per_second" - }, - { - "avg_duration": "16.555120873737376", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_40000_pixels_per_second" - }, - { - "avg_duration": "16.123937666666667", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_50000_pixels_per_second" - }, - { - "avg_duration": "15.429336939393938", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_60000_pixels_per_second" - }, - { - "avg_duration": "14.969355893939397", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_75000_pixels_per_second" - }, - { - "avg_duration": "14.442744999999997", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_90000_pixels_per_second" - }, - { - "avg_duration": "21.3985448989899", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" - }, - { - "avg_duration": "21.504723707070706", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" - }, - { - "avg_duration": "20.14132902020202", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" - }, - { - "avg_duration": "19.235051636363632", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" - }, - { - "avg_duration": "18.309997939393934", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" - }, - { - "avg_duration": "17.85127041919192", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" - }, - { - "avg_duration": "17.635778883838384", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" - }, - { - "avg_duration": "17.178300090909094", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" - }, - { - "avg_duration": "16.48738457070706", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" - }, - { - "avg_duration": "16.100531621212117", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" - }, - { - "avg_duration": "19.83887755555557", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_05000_pixels_per_second" - }, - { - "avg_duration": "20.321555656565653", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_10000_pixels_per_second" - }, - { - "avg_duration": "18.812301292929302", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_15000_pixels_per_second" - }, - { - "avg_duration": "17.912936136363633", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_20000_pixels_per_second" - }, - { - "avg_duration": "16.845287904040404", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_30000_pixels_per_second" - }, - { - "avg_duration": "16.41065398989899", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_40000_pixels_per_second" - }, - { - "avg_duration": "16.025777338383833", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_50000_pixels_per_second" - }, - { - "avg_duration": "15.536551015151506", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_60000_pixels_per_second" - }, - { - "avg_duration": "14.752677388888886", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_75000_pixels_per_second" - }, - { - "avg_duration": "14.303562090909093", - "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_90000_pixels_per_second" - }, - { - "avg_duration": "45.12514313131314", - "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding.html" - }, - { - "avg_duration": "46.47254501010101", - "name": "smoothness.image_decoding_cases/yuv_decoding.html" - }, - { - "avg_duration": "3.542810133962264E-4", - "name": "smoothness.key_mobile_sites_smooth/amazon" - }, - { - "avg_duration": "21.238338292929303", - "name": "smoothness.key_mobile_sites_smooth/androidpolice" - }, - { - "avg_duration": "18.645301676767676", - "name": "smoothness.key_mobile_sites_smooth/baidu" - }, - { - "avg_duration": "13.874585742424243", - "name": "smoothness.key_mobile_sites_smooth/bing" - }, - { - "avg_duration": "17.862244792929296", - "name": "smoothness.key_mobile_sites_smooth/blogspot" - }, - { - "avg_duration": "26.996344343434366", - "name": "smoothness.key_mobile_sites_smooth/boingboing" - }, - { - "avg_duration": "19.744547959595955", - "name": "smoothness.key_mobile_sites_smooth/booking.com" - }, - { - "avg_duration": "32.858561626262635", - "name": "smoothness.key_mobile_sites_smooth/capitolvolkswagen" - }, - { - "avg_duration": "16.953021277777772", - "name": "smoothness.key_mobile_sites_smooth/cnn" - }, - { - "avg_duration": "30.66291437373736", - "name": "smoothness.key_mobile_sites_smooth/cnn_article" - }, - { - "avg_duration": "26.310887545454545", - "name": "smoothness.key_mobile_sites_smooth/cuteoverload" - }, - { - "avg_duration": "24.579020070707074", - "name": "smoothness.key_mobile_sites_smooth/deviantart" - }, - { - "avg_duration": "3.435971588679246E-4", - "name": "smoothness.key_mobile_sites_smooth/digg" - }, - { - "avg_duration": "17.49971458585858", - "name": "smoothness.key_mobile_sites_smooth/ebay" - }, - { - "avg_duration": "3.9178920377358495E-4", - "name": "smoothness.key_mobile_sites_smooth/espn" - }, - { - "avg_duration": "17.711359040404037", - "name": "smoothness.key_mobile_sites_smooth/facebook" - }, - { - "avg_duration": "2.3010541811320756E-4", - "name": "smoothness.key_mobile_sites_smooth/forecast.io" - }, - { - "avg_duration": "22.10674645454545", - "name": "smoothness.key_mobile_sites_smooth/google_news" - }, - { - "avg_duration": "18.331098484848486", - "name": "smoothness.key_mobile_sites_smooth/google_plus" - }, - { - "avg_duration": "15.346138025252529", - "name": "smoothness.key_mobile_sites_smooth/google_web_search" - }, - { - "avg_duration": "15.90865051515151", - "name": "smoothness.key_mobile_sites_smooth/gsp.ro" - }, - { - "avg_duration": "19.143353777777776", - "name": "smoothness.key_mobile_sites_smooth/linkedin" - }, - { - "avg_duration": "14.268390353535354", - "name": "smoothness.key_mobile_sites_smooth/mlb" - }, - { - "avg_duration": "20.1163763030303", - "name": "smoothness.key_mobile_sites_smooth/nytimes" - }, - { - "avg_duration": "24.280120202020214", - "name": "smoothness.key_mobile_sites_smooth/pinterest" - }, - { - "avg_duration": "22.81478362626263", - "name": "smoothness.key_mobile_sites_smooth/reddit" - }, - { - "avg_duration": "21.318667656565655", - "name": "smoothness.key_mobile_sites_smooth/sfgate" - }, - { - "avg_duration": "26.00345693939393", - "name": "smoothness.key_mobile_sites_smooth/slashdot" - }, - { - "avg_duration": "15.822747636363633", - "name": "smoothness.key_mobile_sites_smooth/techcrunch" - }, - { - "avg_duration": "17.66032740404041", - "name": "smoothness.key_mobile_sites_smooth/theverge" - }, - { - "avg_duration": "27.359446848484836", - "name": "smoothness.key_mobile_sites_smooth/theverge_article" - }, - { - "avg_duration": "3.8222996773584896E-4", - "name": "smoothness.key_mobile_sites_smooth/twitter" - }, - { - "avg_duration": "25.456887585858585", - "name": "smoothness.key_mobile_sites_smooth/usatoday" - }, - { - "avg_duration": "20.523009585858578", - "name": "smoothness.key_mobile_sites_smooth/wikipedia" - }, - { - "avg_duration": "24.42267426262627", - "name": "smoothness.key_mobile_sites_smooth/wikipedia_delayed_scroll_start" - }, - { - "avg_duration": "22.661818222222216", - "name": "smoothness.key_mobile_sites_smooth/wordpress" - }, - { - "avg_duration": "27.660394060606055", - "name": "smoothness.key_mobile_sites_smooth/worldjournal" - }, - { - "avg_duration": "29.787398686868695", - "name": "smoothness.key_mobile_sites_smooth/wowwiki" - }, - { - "avg_duration": "23.72853553535354", - "name": "smoothness.key_mobile_sites_smooth/wsj" - }, - { - "avg_duration": "18.4540087979798", - "name": "smoothness.key_mobile_sites_smooth/yahoo_answers" - }, - { - "avg_duration": "17.904535868686867", - "name": "smoothness.key_mobile_sites_smooth/yahoo_news" - }, - { - "avg_duration": "15.144450090909087", - "name": "smoothness.key_mobile_sites_smooth/youtube" - }, - { - "avg_duration": "20.155592030303033", - "name": "smoothness.key_silk_cases/font_wipe.html" - }, - { - "avg_duration": "44.078633757575744", - "name": "smoothness.key_silk_cases/http://groupcloned.com/test/plain/list-recycle-transform.html" - }, - { - "avg_duration": "18.421168868686873", - "name": "smoothness.key_silk_cases/http://groupcloned.com/test/plain/sticky-using-webkit-backface-visibility.html" - }, - { - "avg_duration": "17.097623787878785", - "name": "smoothness.key_silk_cases/http://jsbin.com/UVIgUTa/38/quiet" - }, - { - "avg_duration": "19.330370353535358", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/3yDKh/15/show/" - }, - { - "avg_duration": "19.104859171717177", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/3yDKh/16/show/" - }, - { - "avg_duration": "19.509213202020202", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/R8DX9/4/show/" - }, - { - "avg_duration": "20.434390424242423", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/TLXLu/3/show/" - }, - { - "avg_duration": "20.72343090909091", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/bNp2h/3/show/" - }, - { - "avg_duration": "20.22124606060606", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/cKB9D/7/show/" - }, - { - "avg_duration": "20.750291101010102", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/jx5De/14/show/" - }, - { - "avg_duration": "19.38558821212121", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/rF9Gh/7/show/" - }, - { - "avg_duration": "20.683318595959594", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/ugkd4/10/show/" - }, - { - "avg_duration": "20.76744356565656", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/vBQHH/11/show/" - }, - { - "avg_duration": "20.11391773737374", - "name": "smoothness.key_silk_cases/http://jsfiddle.net/xLuvC/1/show/" - }, - { - "avg_duration": "21.671225707070697", - "name": "smoothness.key_silk_cases/http://mobile-news.sandbox.google.com/news/pt0?scroll" - }, - { - "avg_duration": "18.20485574747475", - "name": "smoothness.key_silk_cases/http://mobile-news.sandbox.google.com/news/pt0?swipe" - }, - { - "avg_duration": "27.599614131313142", - "name": "smoothness.key_silk_cases/http://plus.google.com/app/basic/stream" - }, - { - "avg_duration": "2.941397526923076E-4", - "name": "smoothness.key_silk_cases/http://s.codepen.io/befamous/fullpage/pFsqb?scroll" - }, - { - "avg_duration": "27.666681070707078", - "name": "smoothness.key_silk_cases/http://wiltzius.github.io/shape-shifter/" - }, - { - "avg_duration": "21.094049101010114", - "name": "smoothness.key_silk_cases/http://www.google.com/#q=google" - }, - { - "avg_duration": "3.1393308057692314E-4", - "name": "smoothness.key_silk_cases/https://polymer-topeka.appspot.com/" - }, - { - "avg_duration": "20.863767979797984", - "name": "smoothness.key_silk_cases/https://www.google.com/search?hl=en&q=define%3Aboogie" - }, - { - "avg_duration": "3.02374363076923E-4", - "name": "smoothness.key_silk_cases/inbox_app.html?slide_drawer" - }, - { - "avg_duration": "28.068095606060616", - "name": "smoothness.key_silk_cases/inbox_app.html?stress_hidey_bars" - }, - { - "avg_duration": "15.853583666666665", - "name": "smoothness.key_silk_cases/inbox_app.html?swipe_to_dismiss" - }, - { - "avg_duration": "23.094688151515143", - "name": "smoothness.key_silk_cases/inbox_app.html?toggle_drawer" - }, - { - "avg_duration": "23.870248313131313", - "name": "smoothness.key_silk_cases/infinite_scrolling.html" - }, - { - "avg_duration": "18.171651565656568", - "name": "smoothness.key_silk_cases/list_animation_simple.html" - }, - { - "avg_duration": "23.382971313131304", - "name": "smoothness.key_silk_cases/masonry.html" - }, - { - "avg_duration": "21.433235", - "name": "smoothness.key_silk_cases/pushState.html" - }, - { - "avg_duration": "27.249028414141414", - "name": "smoothness.key_silk_cases/silk_finance.html" - }, - { - "avg_duration": "35.57881804040406", - "name": "smoothness.maps/maps_perf_test" - }, - { - "avg_duration": "39.509850923076925", - "name": "smoothness.pathological_mobile_sites/cnn_pathological" - }, - { - "avg_duration": "21.772028538461537", - "name": "smoothness.pathological_mobile_sites/espn_pathological" - }, - { - "avg_duration": "18.155532153846153", - "name": "smoothness.pathological_mobile_sites/guardian_pathological" - }, - { - "avg_duration": "40.05510368686869", - "name": "smoothness.pathological_mobile_sites/http://edition.cnn.com" - }, - { - "avg_duration": "21.902274040404034", - "name": "smoothness.pathological_mobile_sites/http://m.espn.go.com/nhl/rankings" - }, - { - "avg_duration": "26.00019458585858", - "name": "smoothness.pathological_mobile_sites/http://recode.net" - }, - { - "avg_duration": "28.701987555555547", - "name": "smoothness.pathological_mobile_sites/http://sports.yahoo.com/" - }, - { - "avg_duration": "24.190865080808074", - "name": "smoothness.pathological_mobile_sites/http://www.latimes.com" - }, - { - "avg_duration": "24.687891999999998", - "name": "smoothness.pathological_mobile_sites/http://www.pbs.org/newshour/bb/much-really-cost-live-city-like-seattle/#the-rundown" - }, - { - "avg_duration": "18.41906974747475", - "name": "smoothness.pathological_mobile_sites/http://www.theguardian.com/politics/2015/mar/09/ed-balls-tory-spending-plans-nhs-charging" - }, - { - "avg_duration": "27.31372278787878", - "name": "smoothness.pathological_mobile_sites/http://www.wowwiki.com/World_of_Warcraft:_Mists_of_Pandaria" - }, - { - "avg_duration": "22.304844606060602", - "name": "smoothness.pathological_mobile_sites/http://www.zdnet.com" - }, - { - "avg_duration": "21.640668222222224", - "name": "smoothness.pathological_mobile_sites/https://www.linkedin.com/in/linustorvalds" - }, - { - "avg_duration": "24.01704284615384", - "name": "smoothness.pathological_mobile_sites/latimes_pathological" - }, - { - "avg_duration": "21.48898056410256", - "name": "smoothness.pathological_mobile_sites/linkedin_pathological" - }, - { - "avg_duration": "24.59948774358974", - "name": "smoothness.pathological_mobile_sites/pbs_pathological" - }, - { - "avg_duration": "25.98680143589743", - "name": "smoothness.pathological_mobile_sites/recode_pathological" - }, - { - "avg_duration": "27.186927974358976", - "name": "smoothness.pathological_mobile_sites/wow_wiki_pathological" - }, - { - "avg_duration": "28.060707166666663", - "name": "smoothness.pathological_mobile_sites/yahoo_sports_pathological" - }, - { - "avg_duration": "22.312783333333332", - "name": "smoothness.pathological_mobile_sites/zdnet_pathological" - }, - { - "avg_duration": "49.27374351999999", - "name": "smoothness.simple_mobile_sites/ebay_scroll" - }, - { - "avg_duration": "31.900598950000006", - "name": "smoothness.simple_mobile_sites/flickr_scroll" - }, - { - "avg_duration": "28.379994666666676", - "name": "smoothness.simple_mobile_sites/http://m.nytimes.com/" - }, - { - "avg_duration": "45.950561212121215", - "name": "smoothness.simple_mobile_sites/http://www.ebay.co.uk/" - }, - { - "avg_duration": "29.770662797979806", - "name": "smoothness.simple_mobile_sites/http://www.nyc.gov" - }, - { - "avg_duration": "34.16473003030304", - "name": "smoothness.simple_mobile_sites/https://www.flickr.com/" - }, - { - "avg_duration": "29.38167954", - "name": "smoothness.simple_mobile_sites/nyc_gov_scroll" - }, - { - "avg_duration": "28.099333599999994", - "name": "smoothness.simple_mobile_sites/nytimes_scroll" - }, - { - "avg_duration": "18.98055633333334", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/amazon" - }, - { - "avg_duration": "22.87109837373738", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/androidpolice" - }, - { - "avg_duration": "15.401430050505047", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/baidu" - }, - { - "avg_duration": "16.15127318686869", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/bing" - }, - { - "avg_duration": "16.61126853030303", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/blogspot" - }, - { - "avg_duration": "29.10641223232322", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/boingboing" - }, - { - "avg_duration": "20.415526797979798", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/booking.com" - }, - { - "avg_duration": "35.38239894949496", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/capitolvolkswagen" - }, - { - "avg_duration": "17.385957075757574", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/cnn" - }, - { - "avg_duration": "33.47237256565657", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/cnn_article" - }, - { - "avg_duration": "28.368863848484846", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/cuteoverload" - }, - { - "avg_duration": "23.125893121212123", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/deviantart" - }, - { - "avg_duration": "3.4530813000000003E-4", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/digg" - }, - { - "avg_duration": "18.25351337373737", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/ebay" - }, - { - "avg_duration": "26.03399145454546", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/espn" - }, - { - "avg_duration": "18.674222767676778", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/facebook" - }, - { - "avg_duration": "22.327571717171722", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/forecast.io" - }, - { - "avg_duration": "22.66042847474747", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/google_news" - }, - { - "avg_duration": "21.012240585858585", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/google_plus" - }, - { - "avg_duration": "15.938103818181814", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/google_web_search" - }, - { - "avg_duration": "16.712202282828283", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/gsp.ro" - }, - { - "avg_duration": "20.21166636363636", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/linkedin" - }, - { - "avg_duration": "14.661083904040407", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/mlb" - }, - { - "avg_duration": "19.02367514141415", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/nytimes" - }, - { - "avg_duration": "25.82549221212123", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/pinterest" - }, - { - "avg_duration": "25.182972797979797", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/reddit" - }, - { - "avg_duration": "20.414415424242414", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/sfgate" - }, - { - "avg_duration": "23.53522901010102", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/slashdot" - }, - { - "avg_duration": "20.17896754040404", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/techcrunch" - }, - { - "avg_duration": "20.169552338383834", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/theverge" - }, - { - "avg_duration": "29.523370545454537", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/theverge_article" - }, - { - "avg_duration": "18.52847153030303", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/twitter" - }, - { - "avg_duration": "27.046645888888882", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/usatoday" - }, - { - "avg_duration": "23.226261646464632", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wikipedia" - }, - { - "avg_duration": "21.302006585858585", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wikipedia_delayed_scroll_start" - }, - { - "avg_duration": "23.639588181818176", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wordpress" - }, - { - "avg_duration": "30.587148303030315", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/worldjournal" - }, - { - "avg_duration": "31.728298686868683", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wowwiki" - }, - { - "avg_duration": "20.609689989898985", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wsj" - }, - { - "avg_duration": "19.999084161616167", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/yahoo_answers" - }, - { - "avg_duration": "18.581034575757574", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/yahoo_news" - }, - { - "avg_duration": "16.129265964646468", - "name": "smoothness.sync_scroll.key_mobile_sites_smooth/youtube" - }, - { - "avg_duration": "2.1219703400000004E-4", - "name": "smoothness.top_25_smooth/amazon" - }, - { - "avg_duration": "32.41803863636363", - "name": "smoothness.top_25_smooth/blogspot" - }, - { - "avg_duration": "18.748482383838393", - "name": "smoothness.top_25_smooth/booking.com" - }, - { - "avg_duration": "2.821391482264151E-4", - "name": "smoothness.top_25_smooth/cnn" - }, - { - "avg_duration": "16.989793858585866", - "name": "smoothness.top_25_smooth/ebay" - }, - { - "avg_duration": "19.19900515151515", - "name": "smoothness.top_25_smooth/espn" - }, - { - "avg_duration": "26.36687424242424", - "name": "smoothness.top_25_smooth/facebook" - }, - { - "avg_duration": "46.486851222222214", - "name": "smoothness.top_25_smooth/gmail" - }, - { - "avg_duration": "34.79239256565657", - "name": "smoothness.top_25_smooth/google_calendar" - }, - { - "avg_duration": "41.40588384848484", - "name": "smoothness.top_25_smooth/google_docs" - }, - { - "avg_duration": "29.438939515151503", - "name": "smoothness.top_25_smooth/google_image_search" - }, - { - "avg_duration": "35.48059893939394", - "name": "smoothness.top_25_smooth/google_plus" - }, - { - "avg_duration": "19.115866459595956", - "name": "smoothness.top_25_smooth/google_web_search" - }, - { - "avg_duration": "21.658352055555554", - "name": "smoothness.top_25_smooth/linkedin" - }, - { - "avg_duration": "21.976168767676775", - "name": "smoothness.top_25_smooth/pinterest" - }, - { - "avg_duration": "28.106415232323233", - "name": "smoothness.top_25_smooth/techcrunch" - }, - { - "avg_duration": "22.114209686868683", - "name": "smoothness.top_25_smooth/twitter" - }, - { - "avg_duration": "20.33430164646465", - "name": "smoothness.top_25_smooth/weather.com" - }, - { - "avg_duration": "28.24357274747474", - "name": "smoothness.top_25_smooth/wikipedia" - }, - { - "avg_duration": "26.120561929292936", - "name": "smoothness.top_25_smooth/wordpress" - }, - { - "avg_duration": "19.227436606060614", - "name": "smoothness.top_25_smooth/yahoo_answers" - }, - { - "avg_duration": "34.68755016161616", - "name": "smoothness.top_25_smooth/yahoo_games" - }, - { - "avg_duration": "25.576577323232325", - "name": "smoothness.top_25_smooth/yahoo_news" - }, - { - "avg_duration": "23.3399226060606", - "name": "smoothness.top_25_smooth/yahoo_sports" - }, - { - "avg_duration": "28.731769363636367", - "name": "smoothness.top_25_smooth/youtube" - }, - { - "avg_duration": "35.95637848484848", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swiffy72.html" - }, - { - "avg_duration": "23.306549656565654", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swiffy72.html" - }, - { - "avg_duration": "23.34821803030302", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swiffy72.html" - }, - { - "avg_duration": "23.308518464646472", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swiffy72.html" - }, - { - "avg_duration": "23.310814686868685", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swiffy72.html" - }, - { - "avg_duration": "23.297569707070718", - "name": "smoothness.tough_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swiffy72.html" - }, - { - "avg_duration": "23.342983171717165", - "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swiffy72.html" - }, - { - "avg_duration": "23.379114838383842", - "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swiffy72.html" - }, - { - "avg_duration": "23.485553575757578", - "name": "smoothness.tough_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swiffy72.html" - }, - { - "avg_duration": "23.26642813131313", - "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swiffy72.html" - }, - { - "avg_duration": "23.200837393939388", - "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swiffy72.html" - }, - { - "avg_duration": "28.49831090540542", - "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations" - }, - { - "avg_duration": "32.99254107070706", - "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations.html" - }, - { - "avg_duration": "3.1253269666666676E-4", - "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations_composited_transform.html" - }, - { - "avg_duration": "25.904632162162162", - "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties" - }, - { - "avg_duration": "26.201632313131316", - "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties.html" - }, - { - "avg_duration": "26.0560925", - "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties" - }, - { - "avg_duration": "26.288326373737373", - "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties.html" - }, - { - "avg_duration": "26.17528881081081", - "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties" - }, - { - "avg_duration": "26.135221181818174", - "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties.html" - }, - { - "avg_duration": "24.95292863513513", - "name": "smoothness.tough_animation_cases/balls_javascript_canvas" - }, - { - "avg_duration": "25.469188181818183", - "name": "smoothness.tough_animation_cases/balls_javascript_canvas.html" - }, - { - "avg_duration": "26.327469229729722", - "name": "smoothness.tough_animation_cases/balls_javascript_css" - }, - { - "avg_duration": "30.065795111111118", - "name": "smoothness.tough_animation_cases/balls_javascript_css.html" - }, - { - "avg_duration": "49.04901648648648", - "name": "smoothness.tough_animation_cases/balls_svg_animations" - }, - { - "avg_duration": "46.59268967676768", - "name": "smoothness.tough_animation_cases/balls_svg_animations.html" - }, - { - "avg_duration": "24.424026476190473", - "name": "smoothness.tough_animation_cases/compositor_heavy_animation" - }, - { - "avg_duration": "24.957013535353543", - "name": "smoothness.tough_animation_cases/compositor_heavy_animation.html?N=0200" - }, - { - "avg_duration": "41.867363030769226", - "name": "smoothness.tough_animation_cases/css_animations_many_keyframes" - }, - { - "avg_duration": "33.06253350505051", - "name": "smoothness.tough_animation_cases/css_animations_many_keyframes.html?N=0316" - }, - { - "avg_duration": "26.863968101010105", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "26.004054727272717", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "26.008029818181825", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_class.html?N=0316" - }, - { - "avg_duration": "26.038312626262616", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "25.75810817567568", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_inline_style" - }, - { - "avg_duration": "29.16487631081081", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_new_element" - }, - { - "avg_duration": "25.753389202702703", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_style_element" - }, - { - "avg_duration": "25.759982270270267", - "name": "smoothness.tough_animation_cases/css_animations_simultaneous_updating_class" - }, - { - "avg_duration": "28.758704484848494", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "28.67386421212122", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "42.394976666666665", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_class.html?N=0316" - }, - { - "avg_duration": "31.461677494949477", - "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "36.62317236486486", - "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "30.22378584848485", - "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations.html?N=0316" - }, - { - "avg_duration": "29.991268675675673", - "name": "smoothness.tough_animation_cases/css_animations_staggered_inline_style" - }, - { - "avg_duration": "28.46743006756757", - "name": "smoothness.tough_animation_cases/css_animations_staggered_new_element" - }, - { - "avg_duration": "28.08917404054055", - "name": "smoothness.tough_animation_cases/css_animations_staggered_style_element" - }, - { - "avg_duration": "30.64385336363637", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "28.52010148484849", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "27.610643999999997", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_class.html?N=0316" - }, - { - "avg_duration": "35.05299682828283", - "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "27.58818441891893", - "name": "smoothness.tough_animation_cases/css_animations_staggered_updating_class" - }, - { - "avg_duration": "34.75739825675676", - "name": "smoothness.tough_animation_cases/css_animations_triggered_inline_style" - }, - { - "avg_duration": "30.884173783783798", - "name": "smoothness.tough_animation_cases/css_animations_triggered_new_element" - }, - { - "avg_duration": "26.43892174324324", - "name": "smoothness.tough_animation_cases/css_animations_triggered_style_element" - }, - { - "avg_duration": "27.424432743243237", - "name": "smoothness.tough_animation_cases/css_animations_triggered_updating_class" - }, - { - "avg_duration": "26.140116162162172", - "name": "smoothness.tough_animation_cases/css_transitions_inline_style" - }, - { - "avg_duration": "36.5103947972973", - "name": "smoothness.tough_animation_cases/css_transitions_new_element" - }, - { - "avg_duration": "48.89388634343436", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "26.575321515151515", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "26.420314141414153", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_class.html?N=0316" - }, - { - "avg_duration": "26.498795323232315", - "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "26.593723909090905", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "26.8463016969697", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "26.73312910101011", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_class.html?N=0316" - }, - { - "avg_duration": "26.67038623232324", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "26.581548108108098", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_inline_style" - }, - { - "avg_duration": "26.38610678378378", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_new_element" - }, - { - "avg_duration": "26.722880797297297", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_style_element" - }, - { - "avg_duration": "27.213294626262634", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_new_element.html?N=0316" - }, - { - "avg_duration": "30.428302212121235", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_style_element.html?N=0316" - }, - { - "avg_duration": "34.53906672727273", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_class.html?N=0316" - }, - { - "avg_duration": "34.523925919191925", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_inline_style.html?N=0316" - }, - { - "avg_duration": "26.574637702702702", - "name": "smoothness.tough_animation_cases/css_transitions_staggered_updating_class" - }, - { - "avg_duration": "26.17728170270269", - "name": "smoothness.tough_animation_cases/css_transitions_style_element" - }, - { - "avg_duration": "36.65796904054054", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_inline_style" - }, - { - "avg_duration": "26.765774175675677", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_new_element" - }, - { - "avg_duration": "28.817230162162172", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_style_element" - }, - { - "avg_duration": "29.42409390540541", - "name": "smoothness.tough_animation_cases/css_transitions_triggered_updating_class" - }, - { - "avg_duration": "26.157187486486485", - "name": "smoothness.tough_animation_cases/css_transitions_updating_class" - }, - { - "avg_duration": "27.131645229729727", - "name": "smoothness.tough_animation_cases/css_value_type_color" - }, - { - "avg_duration": "24.953952646464646", - "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=css_animations&N=0316" - }, - { - "avg_duration": "25.006384343434338", - "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=web_animations&N=0316" - }, - { - "avg_duration": "38.48311812162162", - "name": "smoothness.tough_animation_cases/css_value_type_filter" - }, - { - "avg_duration": "36.025085525252514", - "name": "smoothness.tough_animation_cases/css_value_type_filter.html?api=css_animations&N=0316" - }, - { - "avg_duration": "34.09547675675674", - "name": "smoothness.tough_animation_cases/css_value_type_length" - }, - { - "avg_duration": "35.55683137373737", - "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=css_animations&N=0316" - }, - { - "avg_duration": "28.272545242424243", - "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=web_animations&N=0316" - }, - { - "avg_duration": "24.540445554054056", - "name": "smoothness.tough_animation_cases/css_value_type_length_complex" - }, - { - "avg_duration": "26.7266267979798", - "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=css_animations&N=0316" - }, - { - "avg_duration": "26.84686278787879", - "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=web_animations&N=0316" - }, - { - "avg_duration": "27.164727175675683", - "name": "smoothness.tough_animation_cases/css_value_type_length_simple" - }, - { - "avg_duration": "25.033533787878785", - "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=css_animations&N=0316" - }, - { - "avg_duration": "26.840665272727275", - "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=web_animations&N=0316" - }, - { - "avg_duration": "25.141545513513513", - "name": "smoothness.tough_animation_cases/css_value_type_path" - }, - { - "avg_duration": "32.86001573737374", - "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=css_animations&N=0316" - }, - { - "avg_duration": "34.63296713131314", - "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=web_animations&N=0316" - }, - { - "avg_duration": "32.21410671621622", - "name": "smoothness.tough_animation_cases/css_value_type_shadow" - }, - { - "avg_duration": "37.80193273737373", - "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=css_animations&N=0316" - }, - { - "avg_duration": "34.26183446464646", - "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=web_animations&N=0316" - }, - { - "avg_duration": "26.690249567567555", - "name": "smoothness.tough_animation_cases/css_value_type_transform_complex" - }, - { - "avg_duration": "26.350700151515145", - "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=css_animations&N=0316" - }, - { - "avg_duration": "26.34364486868687", - "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=web_animations&N=0316" - }, - { - "avg_duration": "24.223487472972966", - "name": "smoothness.tough_animation_cases/css_value_type_transform_simple" - }, - { - "avg_duration": "24.47642905050504", - "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=css_animations&N=0316" - }, - { - "avg_duration": "26.401348656565663", - "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=web_animations&N=0316" - }, - { - "avg_duration": "23.811728662162164", - "name": "smoothness.tough_animation_cases/keyframed_animations" - }, - { - "avg_duration": "25.979278080808083", - "name": "smoothness.tough_animation_cases/keyframed_animations.html" - }, - { - "avg_duration": "28.324215094594585", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference" - }, - { - "avg_duration": "26.251588777777766", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference.html" - }, - { - "avg_duration": "25.90876581081082", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue" - }, - { - "avg_duration": "28.14967276767677", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue.html" - }, - { - "avg_duration": "25.190857986486492", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_propagating_isolation" - }, - { - "avg_duration": "27.842370972972965", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen" - }, - { - "avg_duration": "29.20768957575758", - "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen.html" - }, - { - "avg_duration": "30.932018010100993", - "name": "smoothness.tough_animation_cases/mix_blend_mode_propagating_isolation.html" - }, - { - "avg_duration": "30.982889040404036", - "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions.html" - }, - { - "avg_duration": "30.93103416216216", - "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions_page" - }, - { - "avg_duration": "3.2016538758064517E-4", - "name": "smoothness.tough_animation_cases/robohornetpro" - }, - { - "avg_duration": "24.262432646464653", - "name": "smoothness.tough_animation_cases/transform_transition_js_block.html" - }, - { - "avg_duration": "24.192187513513513", - "name": "smoothness.tough_animation_cases/transform_transitions" - }, - { - "avg_duration": "24.4222555050505", - "name": "smoothness.tough_animation_cases/transform_transitions.html" - }, - { - "avg_duration": "33.84628005405405", - "name": "smoothness.tough_animation_cases/transform_transitions_js_block" - }, - { - "avg_duration": "24.70194375675676", - "name": "smoothness.tough_animation_cases/web_animation_value_type_color" - }, - { - "avg_duration": "24.334419824324318", - "name": "smoothness.tough_animation_cases/web_animation_value_type_length_3d" - }, - { - "avg_duration": "24.625728324324324", - "name": "smoothness.tough_animation_cases/web_animation_value_type_length_complex" - }, - { - "avg_duration": "27.15627716216215", - "name": "smoothness.tough_animation_cases/web_animation_value_type_length_simple" - }, - { - "avg_duration": "29.904963202702692", - "name": "smoothness.tough_animation_cases/web_animation_value_type_path" - }, - { - "avg_duration": "24.835762189189197", - "name": "smoothness.tough_animation_cases/web_animation_value_type_shadow" - }, - { - "avg_duration": "24.260034000000008", - "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_complex" - }, - { - "avg_duration": "24.282274891891888", - "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_simple" - }, - { - "avg_duration": "38.851248384615396", - "name": "smoothness.tough_animation_cases/web_animations_many_keyframes" - }, - { - "avg_duration": "40.18636682828281", - "name": "smoothness.tough_animation_cases/web_animations_many_keyframes.html?N=0316" - }, - { - "avg_duration": "24.54919001351351", - "name": "smoothness.tough_animation_cases/web_animations_set_current_time" - }, - { - "avg_duration": "28.36906731313132", - "name": "smoothness.tough_animation_cases/web_animations_set_current_time_in_raf.html?N=0316" - }, - { - "avg_duration": "25.813825527027017", - "name": "smoothness.tough_animation_cases/web_animations_simultaneous" - }, - { - "avg_duration": "26.051484585858585", - "name": "smoothness.tough_animation_cases/web_animations_simultaneous.html?N=0316" - }, - { - "avg_duration": "27.08635798648648", - "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining" - }, - { - "avg_duration": "29.28183461616161", - "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining.html?N=0316" - }, - { - "avg_duration": "24.487718864864867", - "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations" - }, - { - "avg_duration": "28.391424151515164", - "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations.html?N=0316" - }, - { - "avg_duration": "29.563231434343436", - "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering.html?N=0316" - }, - { - "avg_duration": "29.791197432432444", - "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering_page" - }, - { - "avg_duration": "29.439491585858576", - "name": "smoothness.tough_canvas_cases/../../../chrome/test/data/perf/canvas_bench/many_images.html" - }, - { - "avg_duration": "17.92992491111112", - "name": "smoothness.tough_canvas_cases/bouncing_balls_15" - }, - { - "avg_duration": "35.72736065625", - "name": "smoothness.tough_canvas_cases/bouncing_balls_shadow" - }, - { - "avg_duration": "22.24271352222223", - "name": "smoothness.tough_canvas_cases/bouncing_clipped_rectangles" - }, - { - "avg_duration": "20.384827499999997", - "name": "smoothness.tough_canvas_cases/bouncing_gradient_circles" - }, - { - "avg_duration": "22.786952027777787", - "name": "smoothness.tough_canvas_cases/bouncing_png_images" - }, - { - "avg_duration": "25.78149852222223", - "name": "smoothness.tough_canvas_cases/bouncing_svg_images" - }, - { - "avg_duration": "17.927428241379314", - "name": "smoothness.tough_canvas_cases/canvas_animation_no_clear" - }, - { - "avg_duration": "20.764118788888883", - "name": "smoothness.tough_canvas_cases/canvas_arcs" - }, - { - "avg_duration": "24.38596079999999", - "name": "smoothness.tough_canvas_cases/canvas_font_cycler" - }, - { - "avg_duration": "18.038348500000005", - "name": "smoothness.tough_canvas_cases/canvas_lines" - }, - { - "avg_duration": "18.034649287500002", - "name": "smoothness.tough_canvas_cases/canvas_to_blob" - }, - { - "avg_duration": "18.192950766666673", - "name": "smoothness.tough_canvas_cases/chip_tune" - }, - { - "avg_duration": "17.9744522", - "name": "smoothness.tough_canvas_cases/crafty_mind" - }, - { - "avg_duration": "21.024139625", - "name": "smoothness.tough_canvas_cases/effect_games" - }, - { - "avg_duration": "18.3754941", - "name": "smoothness.tough_canvas_cases/fill_shapes" - }, - { - "avg_duration": "30.71956342647057", - "name": "smoothness.tough_canvas_cases/geo_apis" - }, - { - "avg_duration": "18.225915022222214", - "name": "smoothness.tough_canvas_cases/hakim" - }, - { - "avg_duration": "31.000741181818185", - "name": "smoothness.tough_canvas_cases/http://geoapis.appspot.com/agdnZW9hcGlzchMLEgtFeGFtcGxlQ29kZRjh1wIM" - }, - { - "avg_duration": "18.377372323232326", - "name": "smoothness.tough_canvas_cases/http://hakim.se/experiments/html5/magnetic/02/" - }, - { - "avg_duration": "24.338396535353542", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/TweetMap/Default.html" - }, - { - "avg_duration": "30.452799747474742", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/VideoCity/Default.html" - }, - { - "avg_duration": "20.01363780808081", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/WorkerFountains/Default.html" - }, - { - "avg_duration": "27.36280462626263", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/AsteroidBelt/Default.html" - }, - { - "avg_duration": "18.811206808080808", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html" - }, - { - "avg_duration": "18.957486565656566", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/LetItSnow/" - }, - { - "avg_duration": "18.146114161616158", - "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/SpeedReading/Default.html" - }, - { - "avg_duration": "21.020279828282835", - "name": "smoothness.tough_canvas_cases/http://jarrodoverson.com/static/demos/particleSystem/" - }, - { - "avg_duration": "18.020033171717177", - "name": "smoothness.tough_canvas_cases/http://mix10k.visitmix.com/Entry/Details/169" - }, - { - "avg_duration": "18.060677545454542", - "name": "smoothness.tough_canvas_cases/http://runway.countlessprojects.com/prototype/performance_test.html" - }, - { - "avg_duration": "19.566015696969696", - "name": "smoothness.tough_canvas_cases/http://spielzeugz.de/html5/liquid-particles.html" - }, - { - "avg_duration": "18.474638777777777", - "name": "smoothness.tough_canvas_cases/http://themaninblue.com/experiment/AnimationBenchmark/canvas/" - }, - { - "avg_duration": "18.256305161616165", - "name": "smoothness.tough_canvas_cases/http://www.chiptune.com/starfield/starfield.html" - }, - { - "avg_duration": "18.124438626262627", - "name": "smoothness.tough_canvas_cases/http://www.craftymind.com/factory/guimark2/HTML5ChartingTest.html" - }, - { - "avg_duration": "21.418370454545457", - "name": "smoothness.tough_canvas_cases/http://www.effectgames.com/demos/canvascycle/" - }, - { - "avg_duration": "20.453375474747475", - "name": "smoothness.tough_canvas_cases/http://www.kevs3d.co.uk/dev/canvask3d/k3d_test.html" - }, - { - "avg_duration": "18.74962767676768", - "name": "smoothness.tough_canvas_cases/http://www.megidish.net/awjs/" - }, - { - "avg_duration": "20.425429141414146", - "name": "smoothness.tough_canvas_cases/http://www.smashcat.org/av/canvas_test/" - }, - { - "avg_duration": "20.533563800000003", - "name": "smoothness.tough_canvas_cases/jarro_doverson" - }, - { - "avg_duration": "19.953108687500002", - "name": "smoothness.tough_canvas_cases/kevs_3d" - }, - { - "avg_duration": "18.303952977777776", - "name": "smoothness.tough_canvas_cases/man_in_blue" - }, - { - "avg_duration": "25.634037666666664", - "name": "smoothness.tough_canvas_cases/many_images" - }, - { - "avg_duration": "18.516882449438203", - "name": "smoothness.tough_canvas_cases/megi_dish" - }, - { - "avg_duration": "25.8367050888889", - "name": "smoothness.tough_canvas_cases/microsoft_asteroid_belt" - }, - { - "avg_duration": "18.61417198888889", - "name": "smoothness.tough_canvas_cases/microsoft_fish_ie_tank" - }, - { - "avg_duration": "18.74359384444445", - "name": "smoothness.tough_canvas_cases/microsoft_snow" - }, - { - "avg_duration": "17.81778445555556", - "name": "smoothness.tough_canvas_cases/microsoft_speed_reading" - }, - { - "avg_duration": "28.878648000000013", - "name": "smoothness.tough_canvas_cases/microsoft_tweet_map" - }, - { - "avg_duration": "23.578974533333334", - "name": "smoothness.tough_canvas_cases/microsoft_video_city" - }, - { - "avg_duration": "18.095517033333334", - "name": "smoothness.tough_canvas_cases/microsoft_worker_fountains" - }, - { - "avg_duration": "18.096671533333332", - "name": "smoothness.tough_canvas_cases/mix_10k" - }, - { - "avg_duration": "22.557841766666666", - "name": "smoothness.tough_canvas_cases/put_get_image_data" - }, - { - "avg_duration": "18.292135588888893", - "name": "smoothness.tough_canvas_cases/runway" - }, - { - "avg_duration": "20.265556812499998", - "name": "smoothness.tough_canvas_cases/smash_cat" - }, - { - "avg_duration": "17.735526655555553", - "name": "smoothness.tough_canvas_cases/spielzeugz" - }, - { - "avg_duration": "22.463675355555555", - "name": "smoothness.tough_canvas_cases/stroke_shapes" - }, - { - "avg_duration": "18.187026151515152", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-animation-no-clear.html" - }, - { - "avg_duration": "20.32787922222222", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-font-cycler.html" - }, - { - "avg_duration": "36.40099983838385", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=image_with_shadow&back=image" - }, - { - "avg_duration": "19.8219696060606", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=text&back=white&ball_count=15" - }, - { - "avg_duration": "19.359112676767683", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas_toBlob.html" - }, - { - "avg_duration": "25.222977343434362", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_clipped_rectangles.html" - }, - { - "avg_duration": "23.97848861616161", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_gradient_circles.html" - }, - { - "avg_duration": "22.356240792929302", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_png_images.html" - }, - { - "avg_duration": "25.779627141414146", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_svg_images.html" - }, - { - "avg_duration": "20.57201338383838", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_arcs.html" - }, - { - "avg_duration": "23.482588131313136", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_lines.html" - }, - { - "avg_duration": "20.127239353535355", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/fill_shapes.html" - }, - { - "avg_duration": "21.363238474747483", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/put_get_image_data.html" - }, - { - "avg_duration": "25.26536531313132", - "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/stroke_shapes.html" - }, - { - "avg_duration": "24.489426050505045", - "name": "smoothness.tough_filters_cases/Analog_Clock_SVG" - }, - { - "avg_duration": "24.400363030303026", - "name": "smoothness.tough_filters_cases/Filter_Terrain_SVG" - }, - { - "avg_duration": "27.684885929292935", - "name": "smoothness.tough_filters_cases/IE_PirateMark" - }, - { - "avg_duration": "38.84724903030302", - "name": "smoothness.tough_filters_cases/MotionMark_Focus" - }, - { - "avg_duration": "24.482420919191927", - "name": "smoothness.tough_filters_cases/analog_clock_svg" - }, - { - "avg_duration": "24.521134808080806", - "name": "smoothness.tough_filters_cases/filter_terrain_svg" - }, - { - "avg_duration": "27.40105320202021", - "name": "smoothness.tough_filters_cases/ie_pirate_mark" - }, - { - "avg_duration": "39.03036286868687", - "name": "smoothness.tough_filters_cases/motion_mark_focus" - }, - { - "avg_duration": "24.77072903030303", - "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-unscaled.html" - }, - { - "avg_duration": "12.024548282828281", - "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-viewport-width.html" - }, - { - "avg_duration": "36.72452497979799", - "name": "smoothness.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" - }, - { - "avg_duration": "35.79060067676766", - "name": "smoothness.tough_path_rendering_cases/IE_Chalkboard" - }, - { - "avg_duration": "23.51601307070706", - "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" - }, - { - "avg_duration": "23.898884282828277", - "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" - }, - { - "avg_duration": "35.980648010101014", - "name": "smoothness.tough_path_rendering_cases/guimark_vector_chart" - }, - { - "avg_duration": "33.55460415151514", - "name": "smoothness.tough_path_rendering_cases/ie_chalkboard" - }, - { - "avg_duration": "23.202369767676768", - "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" - }, - { - "avg_duration": "23.573388727272743", - "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" - }, - { - "avg_duration": "23.353762949494953", - "name": "smoothness.tough_pinch_zoom_cases/Blogger" - }, - { - "avg_duration": "27.531257787878797", - "name": "smoothness.tough_pinch_zoom_cases/ESPN" - }, - { - "avg_duration": "20.927005060606064", - "name": "smoothness.tough_pinch_zoom_cases/Facebook" - }, - { - "avg_duration": "18.10518640404041", - "name": "smoothness.tough_pinch_zoom_cases/LinkedIn" - }, - { - "avg_duration": "21.423731000000014", - "name": "smoothness.tough_pinch_zoom_cases/Twitter" - }, - { - "avg_duration": "25.317448333333342", - "name": "smoothness.tough_pinch_zoom_cases/Weather.com" - }, - { - "avg_duration": "17.656060929824555", - "name": "smoothness.tough_pinch_zoom_cases/amazon_pinch" - }, - { - "avg_duration": "22.72517022807018", - "name": "smoothness.tough_pinch_zoom_cases/blogspot_pinch" - }, - { - "avg_duration": "19.953673631578948", - "name": "smoothness.tough_pinch_zoom_cases/booking_pinch" - }, - { - "avg_duration": "24.38340798245614", - "name": "smoothness.tough_pinch_zoom_cases/cnn_pinch" - }, - { - "avg_duration": "22.18955466666667", - "name": "smoothness.tough_pinch_zoom_cases/ebay_pinch" - }, - { - "avg_duration": "27.620279263157894", - "name": "smoothness.tough_pinch_zoom_cases/espn_pinch" - }, - { - "avg_duration": "20.442973070175427", - "name": "smoothness.tough_pinch_zoom_cases/facebook_pinch" - }, - { - "avg_duration": "29.237876754385965", - "name": "smoothness.tough_pinch_zoom_cases/gmail_pinch" - }, - { - "avg_duration": "20.799546982456143", - "name": "smoothness.tough_pinch_zoom_cases/google_calendar_pinch" - }, - { - "avg_duration": "19.904528877192977", - "name": "smoothness.tough_pinch_zoom_cases/google_image_pinch" - }, - { - "avg_duration": "31.46573203508772", - "name": "smoothness.tough_pinch_zoom_cases/google_search_pinch" - }, - { - "avg_duration": "20.443949171717172", - "name": "smoothness.tough_pinch_zoom_cases/http://booking.com" - }, - { - "avg_duration": "31.706886979797975", - "name": "smoothness.tough_pinch_zoom_cases/http://games.yahoo.com" - }, - { - "avg_duration": "24.440676878787883", - "name": "smoothness.tough_pinch_zoom_cases/http://news.yahoo.com" - }, - { - "avg_duration": "26.812851030303023", - "name": "smoothness.tough_pinch_zoom_cases/http://sports.yahoo.com/" - }, - { - "avg_duration": "18.039277595959593", - "name": "smoothness.tough_pinch_zoom_cases/http://www.amazon.com" - }, - { - "avg_duration": "24.97205581818182", - "name": "smoothness.tough_pinch_zoom_cases/http://www.cnn.com" - }, - { - "avg_duration": "22.888007353535365", - "name": "smoothness.tough_pinch_zoom_cases/http://www.ebay.com" - }, - { - "avg_duration": "22.62019333333335", - "name": "smoothness.tough_pinch_zoom_cases/http://www.youtube.com" - }, - { - "avg_duration": "29.537616666666647", - "name": "smoothness.tough_pinch_zoom_cases/https://mail.google.com/mail/" - }, - { - "avg_duration": "31.99516341414141", - "name": "smoothness.tough_pinch_zoom_cases/https://www.google.com/#hl=en&q=barack+obama" - }, - { - "avg_duration": "21.16391017171717", - "name": "smoothness.tough_pinch_zoom_cases/https://www.google.com/calendar/" - }, - { - "avg_duration": "20.298346353535347", - "name": "smoothness.tough_pinch_zoom_cases/https://www.google.com/search?q=cats&tbm=isch" - }, - { - "avg_duration": "17.590600631578944", - "name": "smoothness.tough_pinch_zoom_cases/linkedin_pinch" - }, - { - "avg_duration": "20.875270491228072", - "name": "smoothness.tough_pinch_zoom_cases/twitter_pinch" - }, - { - "avg_duration": "25.094129", - "name": "smoothness.tough_pinch_zoom_cases/weather_pinch" - }, - { - "avg_duration": "31.333815941176475", - "name": "smoothness.tough_pinch_zoom_cases/yahoo_games_pinch" - }, - { - "avg_duration": "23.874233929824566", - "name": "smoothness.tough_pinch_zoom_cases/yahoo_news_pinch" - }, - { - "avg_duration": "26.129624017543858", - "name": "smoothness.tough_pinch_zoom_cases/yahoo_sports_pinch" - }, - { - "avg_duration": "22.300116894736842", - "name": "smoothness.tough_pinch_zoom_cases/youtube_pinch" - }, - { - "avg_duration": "23.293013474747468", - "name": "smoothness.tough_scrolling_cases/canvas_05000_pixels_per_second" - }, - { - "avg_duration": "23.341905474747477", - "name": "smoothness.tough_scrolling_cases/canvas_10000_pixels_per_second" - }, - { - "avg_duration": "23.370502616161616", - "name": "smoothness.tough_scrolling_cases/canvas_15000_pixels_per_second" - }, - { - "avg_duration": "23.13051263636364", - "name": "smoothness.tough_scrolling_cases/canvas_20000_pixels_per_second" - }, - { - "avg_duration": "22.838911464646465", - "name": "smoothness.tough_scrolling_cases/canvas_30000_pixels_per_second" - }, - { - "avg_duration": "22.921968959595965", - "name": "smoothness.tough_scrolling_cases/canvas_40000_pixels_per_second" - }, - { - "avg_duration": "22.530012272727276", - "name": "smoothness.tough_scrolling_cases/canvas_50000_pixels_per_second" - }, - { - "avg_duration": "21.347635252525258", - "name": "smoothness.tough_scrolling_cases/canvas_60000_pixels_per_second" - }, - { - "avg_duration": "20.022929919191917", - "name": "smoothness.tough_scrolling_cases/canvas_75000_pixels_per_second" - }, - { - "avg_duration": "19.031172707070706", - "name": "smoothness.tough_scrolling_cases/canvas_90000_pixels_per_second" - }, - { - "avg_duration": "31.861010828282826", - "name": "smoothness.tough_scrolling_cases/text_05000_pixels_per_second" - }, - { - "avg_duration": "20.095136494949486", - "name": "smoothness.tough_scrolling_cases/text_10000_pixels_per_second" - }, - { - "avg_duration": "18.77193128282828", - "name": "smoothness.tough_scrolling_cases/text_15000_pixels_per_second" - }, - { - "avg_duration": "17.78254572727273", - "name": "smoothness.tough_scrolling_cases/text_20000_pixels_per_second" - }, - { - "avg_duration": "16.86483035353535", - "name": "smoothness.tough_scrolling_cases/text_30000_pixels_per_second" - }, - { - "avg_duration": "16.317991883838385", - "name": "smoothness.tough_scrolling_cases/text_40000_pixels_per_second" - }, - { - "avg_duration": "15.836607787878787", - "name": "smoothness.tough_scrolling_cases/text_50000_pixels_per_second" - }, - { - "avg_duration": "15.266891378787875", - "name": "smoothness.tough_scrolling_cases/text_60000_pixels_per_second" - }, - { - "avg_duration": "14.658939449494943", - "name": "smoothness.tough_scrolling_cases/text_75000_pixels_per_second" - }, - { - "avg_duration": "14.289251292929295", - "name": "smoothness.tough_scrolling_cases/text_90000_pixels_per_second" - }, - { - "avg_duration": "21.39463565656565", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" - }, - { - "avg_duration": "21.635556797979806", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" - }, - { - "avg_duration": "31.211775797979797", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" - }, - { - "avg_duration": "24.834693651515142", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" - }, - { - "avg_duration": "22.188177202020217", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" - }, - { - "avg_duration": "21.542490388888883", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" - }, - { - "avg_duration": "17.57069402020202", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" - }, - { - "avg_duration": "17.305560696969696", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" - }, - { - "avg_duration": "22.172982161616158", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" - }, - { - "avg_duration": "17.96852995959596", - "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" - }, - { - "avg_duration": "19.788681929292917", - "name": "smoothness.tough_scrolling_cases/text_hover_05000_pixels_per_second" - }, - { - "avg_duration": "20.209324575757574", - "name": "smoothness.tough_scrolling_cases/text_hover_10000_pixels_per_second" - }, - { - "avg_duration": "18.608341656565656", - "name": "smoothness.tough_scrolling_cases/text_hover_15000_pixels_per_second" - }, - { - "avg_duration": "17.85150402525253", - "name": "smoothness.tough_scrolling_cases/text_hover_20000_pixels_per_second" - }, - { - "avg_duration": "16.760568075757572", - "name": "smoothness.tough_scrolling_cases/text_hover_30000_pixels_per_second" - }, - { - "avg_duration": "16.334448535353538", - "name": "smoothness.tough_scrolling_cases/text_hover_40000_pixels_per_second" - }, - { - "avg_duration": "15.869700479797974", - "name": "smoothness.tough_scrolling_cases/text_hover_50000_pixels_per_second" - }, - { - "avg_duration": "15.339095944444448", - "name": "smoothness.tough_scrolling_cases/text_hover_60000_pixels_per_second" - }, - { - "avg_duration": "14.643076732323237", - "name": "smoothness.tough_scrolling_cases/text_hover_75000_pixels_per_second" - }, - { - "avg_duration": "14.283427883838378", - "name": "smoothness.tough_scrolling_cases/text_hover_90000_pixels_per_second" - }, - { - "avg_duration": "37.29011187878785", - "name": "smoothness.tough_texture_upload_cases/background_color_animation.html" - }, - { - "avg_duration": "26.331396595959582", - "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient.html" - }, - { - "avg_duration": "34.23178943434342", - "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads.html" - }, - { - "avg_duration": "25.86199158585858", - "name": "smoothness.tough_texture_upload_cases/large_texture_uploads.html" - }, - { - "avg_duration": "27.527700252525264", - "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads.html" - }, - { - "avg_duration": "34.833154969696956", - "name": "smoothness.tough_texture_upload_cases/small_texture_uploads.html" - }, - { - "avg_duration": "34.78186461616162", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swf.webglbeta.html" - }, - { - "avg_duration": "23.323586252525246", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swf.webglbeta.html" - }, - { - "avg_duration": "23.31514130303028", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swf.webglbeta.html" - }, - { - "avg_duration": "23.244006212121207", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swf.webglbeta.html" - }, - { - "avg_duration": "23.292254353535345", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swf.webglbeta.html" - }, - { - "avg_duration": "23.25231871717172", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swf.webglbeta.html" - }, - { - "avg_duration": "23.26372436363636", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swf.webglbeta.html" - }, - { - "avg_duration": "23.263838161616164", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swf.webglbeta.html" - }, - { - "avg_duration": "23.282327575757574", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swf.webglbeta.html" - }, - { - "avg_duration": "23.283901272727267", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swf.webglbeta.html" - }, - { - "avg_duration": "23.270302121212122", - "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swf.webglbeta.html" - }, - { - "avg_duration": "5.4150582140350885", - "name": "smoothness.tough_webgl_cases/animometer_webgl" - }, - { - "avg_duration": "5.410679352564104", - "name": "smoothness.tough_webgl_cases/aquarium" - }, - { - "avg_duration": "5.379401950505051", - "name": "smoothness.tough_webgl_cases/aquarium_20k" - }, - { - "avg_duration": "5.364906720512822", - "name": "smoothness.tough_webgl_cases/blob" - }, - { - "avg_duration": "5.390500505128206", - "name": "smoothness.tough_webgl_cases/dynamic_cube_map" - }, - { - "avg_duration": "5.426454451282051", - "name": "smoothness.tough_webgl_cases/earth" - }, - { - "avg_duration": "5.537015993939393", - "name": "smoothness.tough_webgl_cases/http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html" - }, - { - "avg_duration": "5.529591531313132", - "name": "smoothness.tough_webgl_cases/http://webglsamples.org/aquarium/aquarium.html" - }, - { - "avg_duration": "5.550190913131313", - "name": "smoothness.tough_webgl_cases/http://webglsamples.org/blob/blob.html" - }, - { - "avg_duration": "5.538322748484848", - "name": "smoothness.tough_webgl_cases/http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html" - }, - { - "avg_duration": "17.47953714646464", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html" - }, - { - "avg_duration": "5.499369072727275", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html" - }, - { - "avg_duration": "5.554951992929294", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html" - }, - { - "avg_duration": "5.513998517171715", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html" - }, - { - "avg_duration": "5.531285539393942", - "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html" - }, - { - "avg_duration": "5.2868313", - "name": "smoothness.tough_webgl_cases/ken_russell" - }, - { - "avg_duration": "5.375855752564104", - "name": "smoothness.tough_webgl_cases/many_planets_deep" - }, - { - "avg_duration": "17.9675766025641", - "name": "smoothness.tough_webgl_cases/nvidia_vertex_buffer_object" - }, - { - "avg_duration": "5.360554980769231", - "name": "smoothness.tough_webgl_cases/particles" - }, - { - "avg_duration": "5.441353922807016", - "name": "smoothness.tough_webgl_cases/san_angeles" - }, - { - "avg_duration": "5.3788686666666665", - "name": "smoothness.tough_webgl_cases/sans_angeles" - }, - { - "avg_duration": "109.29955197979801", - "name": "speedometer-future/http://browserbench.org/Speedometer/" - }, - { - "avg_duration": "106.58715172727268", - "name": "speedometer/http://browserbench.org/Speedometer/" - }, - { - "avg_duration": "179.62395040404036", - "name": "speedometer2-future/Speedometer2" - }, - { - "avg_duration": "179.42690452525252", - "name": "speedometer2/Speedometer2" - }, - { - "avg_duration": "44.43901197979799", - "name": "start_with_url.cold.startup_pages/about:blank" - }, - { - "avg_duration": "35.33574768686869", - "name": "start_with_url.cold.startup_pages/http://bbc.co.uk" - }, - { - "avg_duration": "42.081678949494965", - "name": "start_with_url.warm.startup_pages/about:blank" - }, - { - "avg_duration": "34.53523362626263", - "name": "start_with_url.warm.startup_pages/http://bbc.co.uk" - }, - { - "avg_duration": "25.988195545454545", - "name": "system_health.common_mobile/background:media:imgur" - }, - { - "avg_duration": "3.100713078333334E-4", - "name": "system_health.common_mobile/background:news:nytimes" - }, - { - "avg_duration": "27.706807555555546", - "name": "system_health.common_mobile/background:search:google" - }, - { - "avg_duration": "37.15662161616161", - "name": "system_health.common_mobile/background:social:facebook" - }, - { - "avg_duration": "41.077123696969686", - "name": "system_health.common_mobile/background:tools:gmail" - }, - { - "avg_duration": "131.28622834343437", - "name": "system_health.common_mobile/browse:chrome:newtab" - }, - { - "avg_duration": "43.1110251919192", - "name": "system_health.common_mobile/browse:chrome:omnibox" - }, - { - "avg_duration": "99.23072377777778", - "name": "system_health.common_mobile/browse:media:facebook_photos" - }, - { - "avg_duration": "66.76362095959595", - "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "88.71328305050507", - "name": "system_health.common_mobile/browse:media:imgur" - }, - { - "avg_duration": "125.60014651515148", - "name": "system_health.common_mobile/browse:media:youtube" - }, - { - "avg_duration": "151.33356459595956", - "name": "system_health.common_mobile/browse:news:cnn" - }, - { - "avg_duration": "72.1936093838384", - "name": "system_health.common_mobile/browse:news:cricbuzz" - }, - { - "avg_duration": "1.8135021431034482E-4", - "name": "system_health.common_mobile/browse:news:globo" - }, - { - "avg_duration": "63.799564454545475", - "name": "system_health.common_mobile/browse:news:qq" - }, - { - "avg_duration": "68.21644541414139", - "name": "system_health.common_mobile/browse:news:reddit" - }, - { - "avg_duration": "2.9417153086206896E-4", - "name": "system_health.common_mobile/browse:news:toi" - }, - { - "avg_duration": "62.620704444444414", - "name": "system_health.common_mobile/browse:news:washingtonpost" - }, - { - "avg_duration": "90.00789340404042", - "name": "system_health.common_mobile/browse:shopping:amazon" - }, - { - "avg_duration": "99.07865761616162", - "name": "system_health.common_mobile/browse:shopping:avito" - }, - { - "avg_duration": "2.971723160344827E-4", - "name": "system_health.common_mobile/browse:shopping:flipkart" - }, - { - "avg_duration": "44.313372373737366", - "name": "system_health.common_mobile/browse:shopping:lazada" - }, - { - "avg_duration": "87.4797423333333", - "name": "system_health.common_mobile/browse:social:facebook" - }, - { - "avg_duration": "158.18682888888887", - "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "114.99227984848484", - "name": "system_health.common_mobile/browse:social:instagram" - }, - { - "avg_duration": "96.6507063131314", - "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll" - }, - { - "avg_duration": "117.43332544444439", - "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "63.4013594848485", - "name": "system_health.common_mobile/browse:social:twitter" - }, - { - "avg_duration": "81.47887527272725", - "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "53.42906687878786", - "name": "system_health.common_mobile/browse:tools:maps" - }, - { - "avg_duration": "22.065476707070708", - "name": "system_health.common_mobile/load:chrome:blank" - }, - { - "avg_duration": "29.250431555555558", - "name": "system_health.common_mobile/load:games:bubbles" - }, - { - "avg_duration": "22.583623777777767", - "name": "system_health.common_mobile/load:games:lazors" - }, - { - "avg_duration": "2.4092608482758628E-4", - "name": "system_health.common_mobile/load:games:spychase" - }, - { - "avg_duration": "31.890032888888907", - "name": "system_health.common_mobile/load:media:dailymotion" - }, - { - "avg_duration": "25.837792333333333", - "name": "system_health.common_mobile/load:media:facebook_photos" - }, - { - "avg_duration": "25.716132484848476", - "name": "system_health.common_mobile/load:media:google_images" - }, - { - "avg_duration": "25.40194714141416", - "name": "system_health.common_mobile/load:media:imgur" - }, - { - "avg_duration": "28.017707757575742", - "name": "system_health.common_mobile/load:media:soundcloud" - }, - { - "avg_duration": "25.42400703030303", - "name": "system_health.common_mobile/load:media:youtube" - }, - { - "avg_duration": "46.716104979798", - "name": "system_health.common_mobile/load:news:cnn" - }, - { - "avg_duration": "36.240584898989894", - "name": "system_health.common_mobile/load:news:irctc" - }, - { - "avg_duration": "31.562040535353535", - "name": "system_health.common_mobile/load:news:nytimes" - }, - { - "avg_duration": "24.670504282828283", - "name": "system_health.common_mobile/load:news:qq" - }, - { - "avg_duration": "26.582767828282833", - "name": "system_health.common_mobile/load:news:reddit" - }, - { - "avg_duration": "28.608908545454554", - "name": "system_health.common_mobile/load:news:washingtonpost" - }, - { - "avg_duration": "26.419383939393942", - "name": "system_health.common_mobile/load:news:wikipedia" - }, - { - "avg_duration": "24.962195232323232", - "name": "system_health.common_mobile/load:search:baidu" - }, - { - "avg_duration": "25.975529888888882", - "name": "system_health.common_mobile/load:search:ebay" - }, - { - "avg_duration": "23.48877367676768", - "name": "system_health.common_mobile/load:search:google" - }, - { - "avg_duration": "25.123876959595957", - "name": "system_health.common_mobile/load:search:taobao" - }, - { - "avg_duration": "23.63376964646465", - "name": "system_health.common_mobile/load:search:yahoo" - }, - { - "avg_duration": "24.66763929292929", - "name": "system_health.common_mobile/load:search:yandex" - }, - { - "avg_duration": "24.596533555555563", - "name": "system_health.common_mobile/load:social:twitter" - }, - { - "avg_duration": "23.963808494949497", - "name": "system_health.common_mobile/load:tools:docs" - }, - { - "avg_duration": "38.95401166666668", - "name": "system_health.common_mobile/load:tools:drive" - }, - { - "avg_duration": "27.66011117171718", - "name": "system_health.common_mobile/load:tools:dropbox" - }, - { - "avg_duration": "3.0045673724137943E-4", - "name": "system_health.common_mobile/load:tools:gmail" - }, - { - "avg_duration": "25.623266424242427", - "name": "system_health.common_mobile/load:tools:stackoverflow" - }, - { - "avg_duration": "34.367315999999995", - "name": "system_health.common_mobile/load:tools:weather" - }, - { - "avg_duration": "145.28288212121217", - "name": "system_health.common_mobile/long_running:tools:gmail-background" - }, - { - "avg_duration": "146.56698272727272", - "name": "system_health.common_mobile/long_running:tools:gmail-foreground" - }, - { - "avg_duration": "27.444477676767672", - "name": "system_health.memory_mobile/background:media:imgur" - }, - { - "avg_duration": "44.26214973737374", - "name": "system_health.memory_mobile/background:news:nytimes" - }, - { - "avg_duration": "28.625617191919197", - "name": "system_health.memory_mobile/background:search:google" - }, - { - "avg_duration": "44.29199093939394", - "name": "system_health.memory_mobile/background:social:facebook" - }, - { - "avg_duration": "38.19925648484848", - "name": "system_health.memory_mobile/background:tools:gmail" - }, - { - "avg_duration": "113.24159193939396", - "name": "system_health.memory_mobile/browse:chrome:newtab" - }, - { - "avg_duration": "40.32843911111111", - "name": "system_health.memory_mobile/browse:chrome:omnibox" - }, - { - "avg_duration": "86.815341020202", - "name": "system_health.memory_mobile/browse:media:facebook_photos" - }, - { - "avg_duration": "48.580843989899", - "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "74.9791508686869", - "name": "system_health.memory_mobile/browse:media:imgur" - }, - { - "avg_duration": "91.12809710101008", - "name": "system_health.memory_mobile/browse:media:youtube" - }, - { - "avg_duration": "117.61481880808086", - "name": "system_health.memory_mobile/browse:news:cnn" - }, - { - "avg_duration": "57.088922454545425", - "name": "system_health.memory_mobile/browse:news:cricbuzz" - }, - { - "avg_duration": "2.0542791271186447E-4", - "name": "system_health.memory_mobile/browse:news:globo" - }, - { - "avg_duration": "53.59363260606061", - "name": "system_health.memory_mobile/browse:news:qq" - }, - { - "avg_duration": "61.3005328181818", - "name": "system_health.memory_mobile/browse:news:reddit" - }, - { - "avg_duration": "3.011671161016949E-4", - "name": "system_health.memory_mobile/browse:news:toi" - }, - { - "avg_duration": "52.958127343434356", - "name": "system_health.memory_mobile/browse:news:washingtonpost" - }, - { - "avg_duration": "66.62322513131316", - "name": "system_health.memory_mobile/browse:shopping:amazon" - }, - { - "avg_duration": "72.00728402020202", - "name": "system_health.memory_mobile/browse:shopping:avito" - }, - { - "avg_duration": "3.2243890152542363E-4", - "name": "system_health.memory_mobile/browse:shopping:flipkart" - }, - { - "avg_duration": "39.58702445454547", - "name": "system_health.memory_mobile/browse:shopping:lazada" - }, - { - "avg_duration": "71.5717666060606", - "name": "system_health.memory_mobile/browse:social:facebook" - }, - { - "avg_duration": "89.91997316161617", - "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "93.48008061616162", - "name": "system_health.memory_mobile/browse:social:instagram" - }, - { - "avg_duration": "79.27313457575757", - "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll" - }, - { - "avg_duration": "85.95016434343434", - "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "55.35043223232323", - "name": "system_health.memory_mobile/browse:social:twitter" - }, - { - "avg_duration": "65.55717352525255", - "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "50.04201490909089", - "name": "system_health.memory_mobile/browse:tools:maps" - }, - { - "avg_duration": "24.14599689898989", - "name": "system_health.memory_mobile/load:chrome:blank" - }, - { - "avg_duration": "25.543341545454545", - "name": "system_health.memory_mobile/load:games:bubbles" - }, - { - "avg_duration": "24.340448949494952", - "name": "system_health.memory_mobile/load:games:lazors" - }, - { - "avg_duration": "33.82637664646466", - "name": "system_health.memory_mobile/load:games:spychase" - }, - { - "avg_duration": "29.947075959595953", - "name": "system_health.memory_mobile/load:media:dailymotion" - }, - { - "avg_duration": "26.7875127070707", - "name": "system_health.memory_mobile/load:media:facebook_photos" - }, - { - "avg_duration": "26.873115545454542", - "name": "system_health.memory_mobile/load:media:google_images" - }, - { - "avg_duration": "26.09521881818181", - "name": "system_health.memory_mobile/load:media:imgur" - }, - { - "avg_duration": "27.409813404040406", - "name": "system_health.memory_mobile/load:media:soundcloud" - }, - { - "avg_duration": "26.691482262626266", - "name": "system_health.memory_mobile/load:media:youtube" - }, - { - "avg_duration": "43.84045249494949", - "name": "system_health.memory_mobile/load:news:cnn" - }, - { - "avg_duration": "30.810075656565665", - "name": "system_health.memory_mobile/load:news:irctc" - }, - { - "avg_duration": "31.339511323232333", - "name": "system_health.memory_mobile/load:news:nytimes" - }, - { - "avg_duration": "25.671198646464646", - "name": "system_health.memory_mobile/load:news:qq" - }, - { - "avg_duration": "27.935939101010085", - "name": "system_health.memory_mobile/load:news:reddit" - }, - { - "avg_duration": "28.2062058989899", - "name": "system_health.memory_mobile/load:news:washingtonpost" - }, - { - "avg_duration": "27.76266986868687", - "name": "system_health.memory_mobile/load:news:wikipedia" - }, - { - "avg_duration": "26.11002083838385", - "name": "system_health.memory_mobile/load:search:baidu" - }, - { - "avg_duration": "25.641593818181814", - "name": "system_health.memory_mobile/load:search:ebay" - }, - { - "avg_duration": "25.33336872727272", - "name": "system_health.memory_mobile/load:search:google" - }, - { - "avg_duration": "25.989878262626263", - "name": "system_health.memory_mobile/load:search:taobao" - }, - { - "avg_duration": "25.2707898181818", - "name": "system_health.memory_mobile/load:search:yahoo" - }, - { - "avg_duration": "25.702617", - "name": "system_health.memory_mobile/load:search:yandex" - }, - { - "avg_duration": "25.7817851010101", - "name": "system_health.memory_mobile/load:social:twitter" - }, - { - "avg_duration": "25.58833191919193", - "name": "system_health.memory_mobile/load:tools:docs" - }, - { - "avg_duration": "33.844317676767666", - "name": "system_health.memory_mobile/load:tools:drive" - }, - { - "avg_duration": "27.910569585858585", - "name": "system_health.memory_mobile/load:tools:dropbox" - }, - { - "avg_duration": "3.3679654999999996E-4", - "name": "system_health.memory_mobile/load:tools:gmail" - }, - { - "avg_duration": "27.04643414141414", - "name": "system_health.memory_mobile/load:tools:stackoverflow" - }, - { - "avg_duration": "32.87655633333333", - "name": "system_health.memory_mobile/load:tools:weather" - }, - { - "avg_duration": "244.0835692929292", - "name": "system_health.memory_mobile/long_running:tools:gmail-background" - }, - { - "avg_duration": "220.94309191919191", - "name": "system_health.memory_mobile/long_running:tools:gmail-foreground" - }, - { - "avg_duration": "37.5463620909091", - "name": "system_health.webview_startup/load:chrome:blank" - }, - { - "avg_duration": "37.87562931313131", - "name": "thread_times.key_idle_power_cases/animated-gif.html" - }, - { - "avg_duration": "43.91918554545454", - "name": "thread_times.key_idle_power_cases/blank.html" - }, - { - "avg_duration": "40.90098204040403", - "name": "thread_times.key_idle_power_cases/css-animation.html" - }, - { - "avg_duration": "42.65344473737373", - "name": "thread_times.key_idle_power_cases/request-animation-frame.html" - }, - { - "avg_duration": "42.845891141414135", - "name": "thread_times.key_idle_power_cases/set-timeout.html" - }, - { - "avg_duration": "117.73655492929295", - "name": "thread_times.key_idle_power_cases/set-timeout.html (Long Idle)" - }, - { - "avg_duration": "37.109182010101", - "name": "thread_times.key_mobile_sites_smooth/boingboing" - }, - { - "avg_duration": "35.64103996969696", - "name": "thread_times.key_mobile_sites_smooth/cuteoverload" - }, - { - "avg_duration": "35.710743373737365", - "name": "thread_times.key_mobile_sites_smooth/nytimes" - }, - { - "avg_duration": "27.311984929292944", - "name": "thread_times.key_mobile_sites_smooth/reddit" - }, - { - "avg_duration": "27.51880162626263", - "name": "thread_times.key_mobile_sites_smooth/slashdot" - }, - { - "avg_duration": "38.0871896161616", - "name": "thread_times.key_noop_cases/no_op_raf.html" - }, - { - "avg_duration": "18.761875696969703", - "name": "thread_times.key_noop_cases/no_op_scroll.html" - }, - { - "avg_duration": "17.341720212121217", - "name": "thread_times.key_noop_cases/no_op_settimeout.html" - }, - { - "avg_duration": "20.894067383838376", - "name": "thread_times.key_noop_cases/no_op_touch_handler.html" - }, - { - "avg_duration": "23.244460181818173", - "name": "thread_times.key_silk_cases/font_wipe.html" - }, - { - "avg_duration": "38.870071656565656", - "name": "thread_times.key_silk_cases/http://groupcloned.com/test/plain/list-recycle-transform.html" - }, - { - "avg_duration": "17.1357890050505", - "name": "thread_times.key_silk_cases/http://groupcloned.com/test/plain/sticky-using-webkit-backface-visibility.html" - }, - { - "avg_duration": "16.326147797979797", - "name": "thread_times.key_silk_cases/http://jsbin.com/UVIgUTa/38/quiet" - }, - { - "avg_duration": "20.28956074747474", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/3yDKh/15/show/" - }, - { - "avg_duration": "19.454316969696965", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/3yDKh/16/show/" - }, - { - "avg_duration": "20.766055080808073", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/R8DX9/4/show/" - }, - { - "avg_duration": "27.21085317171716", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/TLXLu/3/show/" - }, - { - "avg_duration": "29.074316919191926", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/bNp2h/3/show/" - }, - { - "avg_duration": "24.43227407070708", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/cKB9D/7/show/" - }, - { - "avg_duration": "22.557781060606057", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/jx5De/14/show/" - }, - { - "avg_duration": "20.744874272727273", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/rF9Gh/7/show/" - }, - { - "avg_duration": "24.569451787878798", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/ugkd4/10/show/" - }, - { - "avg_duration": "35.72461805050505", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/vBQHH/11/show/" - }, - { - "avg_duration": "26.76224451515151", - "name": "thread_times.key_silk_cases/http://jsfiddle.net/xLuvC/1/show/" - }, - { - "avg_duration": "22.080873131313123", - "name": "thread_times.key_silk_cases/http://mobile-news.sandbox.google.com/news/pt0?scroll" - }, - { - "avg_duration": "17.35973695959596", - "name": "thread_times.key_silk_cases/http://mobile-news.sandbox.google.com/news/pt0?swipe" - }, - { - "avg_duration": "3.646832929629629E-4", - "name": "thread_times.key_silk_cases/http://plus.google.com/app/basic/stream" - }, - { - "avg_duration": "3.9006162481481483E-4", - "name": "thread_times.key_silk_cases/http://s.codepen.io/befamous/fullpage/pFsqb?scroll" - }, - { - "avg_duration": "28.581566", - "name": "thread_times.key_silk_cases/http://wiltzius.github.io/shape-shifter/" - }, - { - "avg_duration": "20.12362924242424", - "name": "thread_times.key_silk_cases/http://www.google.com/#q=google" - }, - { - "avg_duration": "3.795977005555555E-4", - "name": "thread_times.key_silk_cases/https://polymer-topeka.appspot.com/" - }, - { - "avg_duration": "19.964125202020202", - "name": "thread_times.key_silk_cases/https://www.google.com/search?hl=en&q=define%3Aboogie" - }, - { - "avg_duration": "3.736681401851852E-4", - "name": "thread_times.key_silk_cases/inbox_app.html?slide_drawer" - }, - { - "avg_duration": "33.97529071717173", - "name": "thread_times.key_silk_cases/inbox_app.html?stress_hidey_bars" - }, - { - "avg_duration": "3.703965077777777E-4", - "name": "thread_times.key_silk_cases/inbox_app.html?swipe_to_dismiss" - }, - { - "avg_duration": "24.546497565656562", - "name": "thread_times.key_silk_cases/inbox_app.html?toggle_drawer" - }, - { - "avg_duration": "25.430517252525263", - "name": "thread_times.key_silk_cases/infinite_scrolling.html" - }, - { - "avg_duration": "17.857330777777786", - "name": "thread_times.key_silk_cases/list_animation_simple.html" - }, - { - "avg_duration": "2.105898323888888E-4", - "name": "thread_times.key_silk_cases/masonry.html" - }, - { - "avg_duration": "22.887406454545456", - "name": "thread_times.key_silk_cases/pushState.html" - }, - { - "avg_duration": "32.132643010101006", - "name": "thread_times.key_silk_cases/silk_finance.html" - }, - { - "avg_duration": "49.17056009615385", - "name": "thread_times.simple_mobile_sites/ebay_scroll" - }, - { - "avg_duration": "35.09973678846153", - "name": "thread_times.simple_mobile_sites/flickr_scroll" - }, - { - "avg_duration": "29.4666692020202", - "name": "thread_times.simple_mobile_sites/http://m.nytimes.com/" - }, - { - "avg_duration": "48.44875013131313", - "name": "thread_times.simple_mobile_sites/http://www.ebay.co.uk/" - }, - { - "avg_duration": "31.98761282828284", - "name": "thread_times.simple_mobile_sites/http://www.nyc.gov" - }, - { - "avg_duration": "34.27174599999999", - "name": "thread_times.simple_mobile_sites/https://www.flickr.com/" - }, - { - "avg_duration": "32.03909976923076", - "name": "thread_times.simple_mobile_sites/nyc_gov_scroll" - }, - { - "avg_duration": "30.096055576923074", - "name": "thread_times.simple_mobile_sites/nytimes_scroll" - }, - { - "avg_duration": "45.81399463636365", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/beqojupo/1/quiet?JS_FULL_SCREEN_INVALIDATION" - }, - { - "avg_duration": "52.344524040404025", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/covoqi/1/quiet?NEW_TILINGS" - }, - { - "avg_duration": "28.9273756060606", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/falefice/1/quiet?CC_POSTER_CIRCLE" - }, - { - "avg_duration": "32.17013638383838", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/giqafofe/1/quiet?JS_POSTER_CIRCLE" - }, - { - "avg_duration": "26.51114175757575", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/jevibahi/4/quiet?JS_SCROLL_200_LAYER_GRID" - }, - { - "avg_duration": "33.49664024242425", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/pixavefe/1/quiet?CC_SCROLL_TEXT_ONLY" - }, - { - "avg_duration": "26.51139456565656", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/wixadinu/2/quiet?JS_SCROLL_TEXT_ONLY" - }, - { - "avg_duration": "26.23169404040404", - "name": "thread_times.tough_compositor_cases/http://jsbin.com/yakagevo/1/quiet?CC_SCROLL_200_LAYER_GRID" - }, - { - "avg_duration": "27.822680212121202", - "name": "thread_times.tough_scrolling_cases/canvas_05000_pixels_per_second" - }, - { - "avg_duration": "27.87371044444444", - "name": "thread_times.tough_scrolling_cases/canvas_10000_pixels_per_second" - }, - { - "avg_duration": "27.981729999999988", - "name": "thread_times.tough_scrolling_cases/canvas_15000_pixels_per_second" - }, - { - "avg_duration": "28.18200306060607", - "name": "thread_times.tough_scrolling_cases/canvas_20000_pixels_per_second" - }, - { - "avg_duration": "27.643227808080812", - "name": "thread_times.tough_scrolling_cases/canvas_30000_pixels_per_second" - }, - { - "avg_duration": "27.813002484848486", - "name": "thread_times.tough_scrolling_cases/canvas_40000_pixels_per_second" - }, - { - "avg_duration": "26.831613343434345", - "name": "thread_times.tough_scrolling_cases/canvas_50000_pixels_per_second" - }, - { - "avg_duration": "24.61992739393938", - "name": "thread_times.tough_scrolling_cases/canvas_60000_pixels_per_second" - }, - { - "avg_duration": "22.567202868686877", - "name": "thread_times.tough_scrolling_cases/canvas_75000_pixels_per_second" - }, - { - "avg_duration": "21.18338876767677", - "name": "thread_times.tough_scrolling_cases/canvas_90000_pixels_per_second" - }, - { - "avg_duration": "33.691405383838365", - "name": "thread_times.tough_scrolling_cases/text_05000_pixels_per_second" - }, - { - "avg_duration": "21.99632250505051", - "name": "thread_times.tough_scrolling_cases/text_10000_pixels_per_second" - }, - { - "avg_duration": "20.472763010101005", - "name": "thread_times.tough_scrolling_cases/text_15000_pixels_per_second" - }, - { - "avg_duration": "19.29065455555555", - "name": "thread_times.tough_scrolling_cases/text_20000_pixels_per_second" - }, - { - "avg_duration": "18.099176580808084", - "name": "thread_times.tough_scrolling_cases/text_30000_pixels_per_second" - }, - { - "avg_duration": "17.30406960606061", - "name": "thread_times.tough_scrolling_cases/text_40000_pixels_per_second" - }, - { - "avg_duration": "16.723098494949497", - "name": "thread_times.tough_scrolling_cases/text_50000_pixels_per_second" - }, - { - "avg_duration": "15.779209474747475", - "name": "thread_times.tough_scrolling_cases/text_60000_pixels_per_second" - }, - { - "avg_duration": "14.780213348484846", - "name": "thread_times.tough_scrolling_cases/text_75000_pixels_per_second" - }, - { - "avg_duration": "14.175640661616164", - "name": "thread_times.tough_scrolling_cases/text_90000_pixels_per_second" - }, - { - "avg_duration": "24.652948565656565", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" - }, - { - "avg_duration": "25.122678828282805", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" - }, - { - "avg_duration": "28.225185363636367", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" - }, - { - "avg_duration": "24.851671383838386", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" - }, - { - "avg_duration": "21.53218876262626", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" - }, - { - "avg_duration": "18.728064035353537", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" - }, - { - "avg_duration": "18.366261338383833", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" - }, - { - "avg_duration": "19.501981095959593", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" - }, - { - "avg_duration": "20.431342590909093", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" - }, - { - "avg_duration": "16.252319287878795", - "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" - }, - { - "avg_duration": "20.811511222222222", - "name": "thread_times.tough_scrolling_cases/text_hover_05000_pixels_per_second" - }, - { - "avg_duration": "22.323912989898986", - "name": "thread_times.tough_scrolling_cases/text_hover_10000_pixels_per_second" - }, - { - "avg_duration": "20.562409333333342", - "name": "thread_times.tough_scrolling_cases/text_hover_15000_pixels_per_second" - }, - { - "avg_duration": "19.364416050505046", - "name": "thread_times.tough_scrolling_cases/text_hover_20000_pixels_per_second" - }, - { - "avg_duration": "18.030160429292938", - "name": "thread_times.tough_scrolling_cases/text_hover_30000_pixels_per_second" - }, - { - "avg_duration": "17.33084298989899", - "name": "thread_times.tough_scrolling_cases/text_hover_40000_pixels_per_second" - }, - { - "avg_duration": "16.55682129797979", - "name": "thread_times.tough_scrolling_cases/text_hover_50000_pixels_per_second" - }, - { - "avg_duration": "15.71207099494949", - "name": "thread_times.tough_scrolling_cases/text_hover_60000_pixels_per_second" - }, - { - "avg_duration": "14.74523831818182", - "name": "thread_times.tough_scrolling_cases/text_hover_75000_pixels_per_second" - }, - { - "avg_duration": "14.188868863636362", - "name": "thread_times.tough_scrolling_cases/text_hover_90000_pixels_per_second" - }, - { - "avg_duration": "15.880807181818174", - "name": "tracing.tracing_with_background_memory_infra/Facebook" - }, - { - "avg_duration": "17.55864979292929", - "name": "tracing.tracing_with_background_memory_infra/Wikipedia" - }, - { - "avg_duration": "12.561552656565654", - "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" - }, - { - "avg_duration": "13.182729515151525", - "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" - }, - { - "avg_duration": "16.398660398989897", - "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" - }, - { - "avg_duration": "13.755263510101008", - "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" - }, - { - "avg_duration": "16.748363712121215", - "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" - }, - { - "avg_duration": "26.216529080808083", - "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" - }, - { - "avg_duration": "15.557060222222212", - "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" - }, - { - "avg_duration": "146.80372595959594", - "name": "v8.browsing_mobile-future/browse:chrome:newtab" - }, - { - "avg_duration": "48.349494565656556", - "name": "v8.browsing_mobile-future/browse:chrome:omnibox" - }, - { - "avg_duration": "121.5468902929293", - "name": "v8.browsing_mobile-future/browse:media:facebook_photos" - }, - { - "avg_duration": "70.2735223434344", - "name": "v8.browsing_mobile-future/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "109.89061083838381", - "name": "v8.browsing_mobile-future/browse:media:imgur" - }, - { - "avg_duration": "145.7920797979798", - "name": "v8.browsing_mobile-future/browse:media:youtube" - }, - { - "avg_duration": "209.84340555555548", - "name": "v8.browsing_mobile-future/browse:news:cnn" - }, - { - "avg_duration": "93.24410144444442", - "name": "v8.browsing_mobile-future/browse:news:cricbuzz" - }, - { - "avg_duration": "2.2064817344827592E-4", - "name": "v8.browsing_mobile-future/browse:news:globo" - }, - { - "avg_duration": "76.75495341414144", - "name": "v8.browsing_mobile-future/browse:news:qq" - }, - { - "avg_duration": "80.6963658181818", - "name": "v8.browsing_mobile-future/browse:news:reddit" - }, - { - "avg_duration": "3.0785182551724136E-4", - "name": "v8.browsing_mobile-future/browse:news:toi" - }, - { - "avg_duration": "78.303831", - "name": "v8.browsing_mobile-future/browse:news:washingtonpost" - }, - { - "avg_duration": "136.05438400000003", - "name": "v8.browsing_mobile-future/browse:shopping:amazon" - }, - { - "avg_duration": "114.92199287878779", - "name": "v8.browsing_mobile-future/browse:shopping:avito" - }, - { - "avg_duration": "3.711190710344828E-4", - "name": "v8.browsing_mobile-future/browse:shopping:flipkart" - }, - { - "avg_duration": "53.03355575757575", - "name": "v8.browsing_mobile-future/browse:shopping:lazada" - }, - { - "avg_duration": "115.03659278787882", - "name": "v8.browsing_mobile-future/browse:social:facebook" - }, - { - "avg_duration": "249.04827101010108", - "name": "v8.browsing_mobile-future/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "155.1888494949495", - "name": "v8.browsing_mobile-future/browse:social:instagram" - }, - { - "avg_duration": "129.8515875959596", - "name": "v8.browsing_mobile-future/browse:social:pinterest_infinite_scroll" - }, - { - "avg_duration": "151.44554632323232", - "name": "v8.browsing_mobile-future/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "72.65199058585861", - "name": "v8.browsing_mobile-future/browse:social:twitter" - }, - { - "avg_duration": "98.63434421212125", - "name": "v8.browsing_mobile-future/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "69.00645864646467", - "name": "v8.browsing_mobile-future/browse:tools:maps" - }, - { - "avg_duration": "149.43553848484854", - "name": "v8.browsing_mobile/browse:chrome:newtab" - }, - { - "avg_duration": "47.87011082828285", - "name": "v8.browsing_mobile/browse:chrome:omnibox" - }, - { - "avg_duration": "122.47564840404044", - "name": "v8.browsing_mobile/browse:media:facebook_photos" - }, - { - "avg_duration": "72.65491519191917", - "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll" - }, - { - "avg_duration": "110.12972566666664", - "name": "v8.browsing_mobile/browse:media:imgur" - }, - { - "avg_duration": "148.99428086868687", - "name": "v8.browsing_mobile/browse:media:youtube" - }, - { - "avg_duration": "216.58361969696963", - "name": "v8.browsing_mobile/browse:news:cnn" - }, - { - "avg_duration": "96.5612542929293", - "name": "v8.browsing_mobile/browse:news:cricbuzz" - }, - { - "avg_duration": "2.1016597672413796E-4", - "name": "v8.browsing_mobile/browse:news:globo" - }, - { - "avg_duration": "76.62115958585859", - "name": "v8.browsing_mobile/browse:news:qq" - }, - { - "avg_duration": "80.08455575757579", - "name": "v8.browsing_mobile/browse:news:reddit" - }, - { - "avg_duration": "2.985411693103447E-4", - "name": "v8.browsing_mobile/browse:news:toi" - }, - { - "avg_duration": "78.96239012121212", - "name": "v8.browsing_mobile/browse:news:washingtonpost" - }, - { - "avg_duration": "141.11691706060606", - "name": "v8.browsing_mobile/browse:shopping:amazon" - }, - { - "avg_duration": "119.78490646464648", - "name": "v8.browsing_mobile/browse:shopping:avito" - }, - { - "avg_duration": "3.4583848224137943E-4", - "name": "v8.browsing_mobile/browse:shopping:flipkart" - }, - { - "avg_duration": "54.563538717171696", - "name": "v8.browsing_mobile/browse:shopping:lazada" - }, - { - "avg_duration": "109.07096896969696", - "name": "v8.browsing_mobile/browse:social:facebook" - }, - { - "avg_duration": "235.04101060606064", - "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll" - }, - { - "avg_duration": "155.5627393939394", - "name": "v8.browsing_mobile/browse:social:instagram" - }, - { - "avg_duration": "129.86991275757575", - "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll" - }, - { - "avg_duration": "156.81991555555555", - "name": "v8.browsing_mobile/browse:social:tumblr_infinite_scroll" - }, - { - "avg_duration": "72.95442306060606", - "name": "v8.browsing_mobile/browse:social:twitter" - }, - { - "avg_duration": "103.36866806060607", - "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll" - }, - { - "avg_duration": "69.63564166666664", - "name": "v8.browsing_mobile/browse:tools:maps" - }, - { - "avg_duration": "11.330470979797985", - "name": "wasm/AsmJsZenGarden" - }, - { - "avg_duration": "32.46427666666668", - "name": "wasm/WasmSpaceBuggy" - }, - { - "avg_duration": "11.363871742424243", - "name": "wasm/WasmStylizedRenderer" - }, - { - "avg_duration": "11.419351449494949", - "name": "wasm/WasmSunTemple" - }, - { - "avg_duration": "45.43566052525251", - "name": "wasm/WasmTanks" - }, - { - "avg_duration": "11.38358393434344", - "name": "wasm/WasmZenGarden" - }, - { - "avg_duration": "23.92676617171717", - "name": "webrtc/10s_datachannel_transfer" - }, - { - "avg_duration": "30.665775797979776", - "name": "webrtc/canvas_capture_peer_connection" - }, - { - "avg_duration": "40.83536702020203", - "name": "webrtc/codec_constraints_h264" - }, - { - "avg_duration": "40.745852676767676", - "name": "webrtc/codec_constraints_vp8" - }, - { - "avg_duration": "40.94942309090908", - "name": "webrtc/codec_constraints_vp9" - }, - { - "avg_duration": "27.08421294949495", - "name": "webrtc/hd_local_stream_10s" - }, - { - "avg_duration": "49.19093528282828", - "name": "webrtc/multiple_peerconnections" - }, - { - "avg_duration": "73.61559331313133", - "name": "webrtc/pause_play_peerconnections" - } -]
diff --git a/tools/perf/core/shard_maps/pixel2_shard_map.json b/tools/perf/core/shard_maps/pixel2_shard_map.json new file mode 100644 index 0000000..c42ead3 --- /dev/null +++ b/tools/perf/core/shard_maps/pixel2_shard_map.json
@@ -0,0 +1,152 @@ +{ + "0": { + "benchmarks": { + "blink_perf.bindings": {}, + "blink_perf.canvas": {}, + "blink_perf.css": {}, + "blink_perf.dom": {}, + "blink_perf.events": {}, + "blink_perf.image_decoder": {}, + "blink_perf.layout": {}, + "blink_perf.owp_storage": {}, + "blink_perf.paint": {}, + "blink_perf.parser": {}, + "blink_perf.shadow_dom": {}, + "blink_perf.svg": {}, + "dromaeo": {}, + "dummy_benchmark.histogram_benchmark_1": {}, + "dummy_benchmark.noisy_benchmark_1": {}, + "dummy_benchmark.stable_benchmark_1": {}, + "jetstream": {}, + "kraken": {}, + "loading.desktop": {}, + "loading.mobile": { + "end": 35 + } + } + }, + "1": { + "benchmarks": { + "loading.mobile": { + "begin": 35 + }, + "media.desktop": {}, + "media.mobile": {}, + "memory.desktop": {}, + "memory.long_running_idle_gmail_background_tbmv2": {}, + "memory.long_running_idle_gmail_tbmv2": {}, + "memory.top_10_mobile": { + "end": 6 + } + } + }, + "2": { + "benchmarks": { + "memory.top_10_mobile": { + "begin": 6 + }, + "octane": {}, + "oortonline_tbmv2": {}, + "power.desktop": {}, + "power.idle_platform": {}, + "power.typical_10_mobile": {}, + "rasterize_and_record_micro.partial_invalidation": {}, + "rasterize_and_record_micro.top_25": {}, + "rendering.desktop": {}, + "rendering.mobile": { + "end": 185 + } + } + }, + "3": { + "benchmarks": { + "rendering.mobile": { + "begin": 185 + }, + "scheduler.tough_scheduling_cases": {}, + "smoothness.desktop_tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.polymer": {}, + "smoothness.gpu_rasterization.top_25_smooth": {}, + "smoothness.gpu_rasterization.tough_filters_cases": {}, + "smoothness.gpu_rasterization.tough_path_rendering_cases": {}, + "smoothness.gpu_rasterization.tough_pinch_zoom_cases": {}, + "smoothness.gpu_rasterization.tough_scrolling_cases": {}, + "smoothness.gpu_rasterization_and_decoding.image_decoding_cases": {}, + "smoothness.image_decoding_cases": {}, + "smoothness.key_desktop_move_cases": {}, + "smoothness.key_mobile_sites_smooth": {}, + "smoothness.key_silk_cases": { + "end": 14 + } + } + }, + "4": { + "benchmarks": { + "smoothness.key_silk_cases": { + "begin": 14 + }, + "smoothness.maps": {}, + "smoothness.pathological_mobile_sites": {}, + "smoothness.simple_mobile_sites": {}, + "smoothness.sync_scroll.key_mobile_sites_smooth": {}, + "smoothness.top_25_smooth": {}, + "smoothness.tough_ad_cases": {}, + "smoothness.tough_animation_cases": {}, + "smoothness.tough_canvas_cases": {}, + "smoothness.tough_filters_cases": {}, + "smoothness.tough_image_decode_cases": {}, + "smoothness.tough_path_rendering_cases": {}, + "smoothness.tough_pinch_zoom_cases": {}, + "smoothness.tough_scrolling_cases": {}, + "smoothness.tough_texture_upload_cases": {}, + "smoothness.tough_webgl_ad_cases": {}, + "smoothness.tough_webgl_cases": {}, + "speedometer": {}, + "speedometer-future": {}, + "speedometer2": {}, + "speedometer2-future": {}, + "start_with_url.cold.startup_pages": {}, + "start_with_url.warm.startup_pages": {}, + "system_health.common_desktop": {}, + "system_health.common_mobile": { + "end": 33 + } + } + }, + "5": { + "benchmarks": { + "system_health.common_mobile": { + "begin": 33 + }, + "system_health.memory_desktop": {}, + "system_health.memory_mobile": { + "end": 59 + } + } + }, + "6": { + "benchmarks": { + "system_health.memory_mobile": { + "begin": 59 + }, + "system_health.webview_startup": {}, + "tab_switching.typical_25": {}, + "thread_times.key_hit_test_cases": {}, + "thread_times.key_idle_power_cases": {}, + "thread_times.key_mobile_sites_smooth": {}, + "thread_times.key_noop_cases": {}, + "thread_times.key_silk_cases": {}, + "thread_times.simple_mobile_sites": {}, + "thread_times.tough_compositor_cases": {}, + "thread_times.tough_scrolling_cases": {}, + "tracing.tracing_with_background_memory_infra": {}, + "v8.browsing_desktop": {}, + "v8.browsing_desktop-future": {}, + "v8.browsing_mobile": {}, + "v8.browsing_mobile-future": {}, + "v8.runtime_stats.top_25": {}, + "wasm": {}, + "webrtc": {} + } + } +} \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/pixel2_webview_shard_map.json b/tools/perf/core/shard_maps/pixel2_webview_shard_map.json new file mode 100644 index 0000000..be05bc0 --- /dev/null +++ b/tools/perf/core/shard_maps/pixel2_webview_shard_map.json
@@ -0,0 +1,23 @@ +{ + "0": { + "benchmarks": {} + }, + "1": { + "benchmarks": {} + }, + "2": { + "benchmarks": {} + }, + "3": { + "benchmarks": {} + }, + "4": { + "benchmarks": {} + }, + "5": { + "benchmarks": {} + }, + "6": { + "benchmarks": {} + } +} \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/linux_perf_story_timing.json b/tools/perf/core/shard_maps/timing_data/linux_perf_story_timing.json new file mode 100644 index 0000000..6199f550 --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/linux_perf_story_timing.json
@@ -0,0 +1,6314 @@ +[ + { + "duration": "14.513494116161612", + "name": "blink_perf.bindings/append-child.html" + }, + { + "duration": "11.509948914141415", + "name": "blink_perf.bindings/create-element.html" + }, + { + "duration": "11.245559762626266", + "name": "blink_perf.bindings/document-implementation.html" + }, + { + "duration": "11.136652540404047", + "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" + }, + { + "duration": "11.178642494949496", + "name": "blink_perf.bindings/first-child.html" + }, + { + "duration": "7.598370741414139", + "name": "blink_perf.bindings/gc-forest.html" + }, + { + "duration": "8.141105384848483", + "name": "blink_perf.bindings/gc-mini-tree.html" + }, + { + "duration": "21.123456191919196", + "name": "blink_perf.bindings/gc-tree.html" + }, + { + "duration": "11.150597515151512", + "name": "blink_perf.bindings/get-attribute-rare.html" + }, + { + "duration": "11.226167287878786", + "name": "blink_perf.bindings/get-attribute.html" + }, + { + "duration": "11.050259823232322", + "name": "blink_perf.bindings/get-element-by-id.html" + }, + { + "duration": "11.183115267676767", + "name": "blink_perf.bindings/get-elements-by-tag-name.html" + }, + { + "duration": "12.773579762626259", + "name": "blink_perf.bindings/id-getter.html" + }, + { + "duration": "11.187581828282825", + "name": "blink_perf.bindings/id-setter.html" + }, + { + "duration": "11.276052227272729", + "name": "blink_perf.bindings/indexed-getter.html" + }, + { + "duration": "11.0482386969697", + "name": "blink_perf.bindings/insert-before.html" + }, + { + "duration": "11.362461136363631", + "name": "blink_perf.bindings/named-property-enumerator.html" + }, + { + "duration": "24.338628999999997", + "name": "blink_perf.bindings/node-list-access.html" + }, + { + "duration": "11.196180707070706", + "name": "blink_perf.bindings/node-type.html" + }, + { + "duration": "6.146644289898991", + "name": "blink_perf.bindings/post-message.html" + }, + { + "duration": "11.051583207070705", + "name": "blink_perf.bindings/sequence-conversion-array.html" + }, + { + "duration": "13.858878373737376", + "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" + }, + { + "duration": "6.207376408080806", + "name": "blink_perf.bindings/serialize-array.html" + }, + { + "duration": "6.056866277777779", + "name": "blink_perf.bindings/serialize-long-string.html" + }, + { + "duration": "7.11095476262626", + "name": "blink_perf.bindings/serialize-map.html" + }, + { + "duration": "6.05300824343434", + "name": "blink_perf.bindings/serialize-nested-array.html" + }, + { + "duration": "11.220061717171715", + "name": "blink_perf.bindings/set-attribute-rare.html" + }, + { + "duration": "11.295162787878796", + "name": "blink_perf.bindings/set-attribute.html" + }, + { + "duration": "9.267459843434343", + "name": "blink_perf.bindings/structured-clone-json-deserialize.html" + }, + { + "duration": "9.291257176767672", + "name": "blink_perf.bindings/structured-clone-json-serialize.html" + }, + { + "duration": "6.878919740404035", + "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" + }, + { + "duration": "6.8816229676767655", + "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" + }, + { + "duration": "12.002830893939395", + "name": "blink_perf.bindings/typed-array-construct-from-array.html" + }, + { + "duration": "11.196236060606061", + "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" + }, + { + "duration": "11.183115075757575", + "name": "blink_perf.bindings/typed-array-construct-from-typed.html" + }, + { + "duration": "11.32896023232323", + "name": "blink_perf.bindings/typed-array-set-from-typed.html" + }, + { + "duration": "11.117420823232328", + "name": "blink_perf.bindings/undefined-first-child.html" + }, + { + "duration": "11.134976085858591", + "name": "blink_perf.bindings/undefined-get-element-by-id.html" + }, + { + "duration": "11.102489116161612", + "name": "blink_perf.bindings/undefined-id-getter.html" + }, + { + "duration": "14.544857424242432", + "name": "blink_perf.canvas/createImageBitmapFromImageData.html" + }, + { + "duration": "6.956888752525255", + "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "8.66559975757576", + "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "6.194289610101013", + "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" + }, + { + "duration": "8.8674155959596", + "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "6.764388952525252", + "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "7.2394801020202015", + "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "11.715736095959592", + "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" + }, + { + "duration": "11.408900631313129", + "name": "blink_perf.canvas/drawimage.html" + }, + { + "duration": "11.25512444444444", + "name": "blink_perf.canvas/getImageData.html" + }, + { + "duration": "12.201714222222224", + "name": "blink_perf.canvas/getImageDataColorManaged.html" + }, + { + "duration": "11.454348959595956", + "name": "blink_perf.canvas/putImageData.html" + }, + { + "duration": "7.017268228282829", + "name": "blink_perf.canvas/toBlob_duration.html" + }, + { + "duration": "6.834430806060604", + "name": "blink_perf.canvas/toBlob_duration_jpeg.html" + }, + { + "duration": "6.210382030303031", + "name": "blink_perf.canvas/transferFromImageBitmap.html" + }, + { + "duration": "7.244066819191919", + "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" + }, + { + "duration": "12.995004414141407", + "name": "blink_perf.canvas/upload-video-to-sub-texture.html" + }, + { + "duration": "6.535389775757577", + "name": "blink_perf.canvas/upload-video-to-texture.html" + }, + { + "duration": "7.262055430303031", + "name": "blink_perf.canvas/upload-webgl-to-texture.html" + }, + { + "duration": "18.55831296464647", + "name": "blink_perf.css/AttributeDescendantSelector.html" + }, + { + "duration": "11.327445595959597", + "name": "blink_perf.css/CSSPropertySetterGetter.html" + }, + { + "duration": "11.382841757575754", + "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" + }, + { + "duration": "11.382999777777778", + "name": "blink_perf.css/CSSPropertyUpdateValue.html" + }, + { + "duration": "9.491019121212123", + "name": "blink_perf.css/ChangeStyleChildClassSelector.html" + }, + { + "duration": "9.490471833333334", + "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" + }, + { + "duration": "9.483735939393936", + "name": "blink_perf.css/ChangeStyleElementSelector.html" + }, + { + "duration": "9.491103691919191", + "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" + }, + { + "duration": "9.483345797979798", + "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" + }, + { + "duration": "9.486182393939393", + "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" + }, + { + "duration": "9.485504606060601", + "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" + }, + { + "duration": "9.487847116161612", + "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" + }, + { + "duration": "9.48686713131313", + "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" + }, + { + "duration": "9.487828813131314", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" + }, + { + "duration": "9.487419338383843", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "10.240027232323232", + "name": "blink_perf.css/ChangeStyleShallowTree.html" + }, + { + "duration": "9.485785383838385", + "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" + }, + { + "duration": "9.48711612121212", + "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" + }, + { + "duration": "9.49382132323232", + "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" + }, + { + "duration": "9.490691409090905", + "name": "blink_perf.css/ChangeStyleUniversalSelector.html" + }, + { + "duration": "9.491599651515152", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" + }, + { + "duration": "11.564440287878787", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "15.428031035353532", + "name": "blink_perf.css/ClassDescendantSelector.html" + }, + { + "duration": "11.954897525252512", + "name": "blink_perf.css/ClassInvalidation.html" + }, + { + "duration": "13.710578368686866", + "name": "blink_perf.css/FocusUpdate.html" + }, + { + "duration": "9.702126383838385", + "name": "blink_perf.css/LoadBootstrapBlog.html" + }, + { + "duration": "9.747366116161613", + "name": "blink_perf.css/LoadMaterializeStarterPage.html" + }, + { + "duration": "9.939919858585856", + "name": "blink_perf.css/LoadSemanticPageExample.html" + }, + { + "duration": "11.323637318181813", + "name": "blink_perf.css/PseudoClassSelectors.html" + }, + { + "duration": "11.949540974747473", + "name": "blink_perf.css/SelectorCountScaling.html" + }, + { + "duration": "11.185859295959593", + "name": "blink_perf.dom/addRange.html" + }, + { + "duration": "6.103049341414138", + "name": "blink_perf.dom/delete-in-password-field.html" + }, + { + "duration": "12.49028867676768", + "name": "blink_perf.dom/div-editable.html" + }, + { + "duration": "6.0115359066666665", + "name": "blink_perf.dom/inner_html_with_selection.html" + }, + { + "duration": "17.004722424242427", + "name": "blink_perf.dom/long-sibling-list.html" + }, + { + "duration": "6.691068869696969", + "name": "blink_perf.dom/modify-element-classname.html" + }, + { + "duration": "6.423746304040403", + "name": "blink_perf.dom/modify-element-id.html" + }, + { + "duration": "6.402380993939394", + "name": "blink_perf.dom/modify-element-title.html" + }, + { + "duration": "6.265829383838383", + "name": "blink_perf.dom/move-down-with-hidden-elements.html" + }, + { + "duration": "6.243200423232326", + "name": "blink_perf.dom/move-up-with-hidden-elements.html" + }, + { + "duration": "8.134362985858585", + "name": "blink_perf.dom/remove_child_with_selection.html" + }, + { + "duration": "11.471118666666662", + "name": "blink_perf.dom/select-multiple-add.html" + }, + { + "duration": "11.471082676767676", + "name": "blink_perf.dom/select-single-add.html" + }, + { + "duration": "11.719477823232324", + "name": "blink_perf.dom/select-single-remove.html" + }, + { + "duration": "11.496038358585857", + "name": "blink_perf.dom/textarea-dom.html" + }, + { + "duration": "11.453217505050509", + "name": "blink_perf.dom/textarea-edit.html" + }, + { + "duration": "14.627615641414135", + "name": "blink_perf.events/EventsDispatching.html" + }, + { + "duration": "12.531318737373734", + "name": "blink_perf.events/EventsDispatchingInDeeplyNestedShadowTrees.html" + }, + { + "duration": "16.631713111111107", + "name": "blink_perf.events/EventsDispatchingInShadowTrees.html" + }, + { + "duration": "14.227277287878783", + "name": "blink_perf.events/hit-test-lots-of-layers.html" + }, + { + "duration": "17.994578121212125", + "name": "blink_perf.image_decoder/decode-gif.html" + }, + { + "duration": "13.954265232323237", + "name": "blink_perf.image_decoder/decode-jpeg.html" + }, + { + "duration": "14.996625328282828", + "name": "blink_perf.image_decoder/decode-lossless-webp.html" + }, + { + "duration": "11.768512166666667", + "name": "blink_perf.image_decoder/decode-lossy-webp.html" + }, + { + "duration": "12.838408939393934", + "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" + }, + { + "duration": "11.366270848484852", + "name": "blink_perf.image_decoder/decode-png-palette.html" + }, + { + "duration": "14.495188686868682", + "name": "blink_perf.image_decoder/decode-png.html" + }, + { + "duration": "14.551436621212117", + "name": "blink_perf.layout/ArabicLineLayout.html" + }, + { + "duration": "6.125489778787876", + "name": "blink_perf.layout/Shapes/MultipleShapes.html" + }, + { + "duration": "11.24078968181818", + "name": "blink_perf.layout/SimpleTextPathLineLayout.html" + }, + { + "duration": "11.40600641414142", + "name": "blink_perf.layout/add-remove-inline-floats.html" + }, + { + "duration": "11.336876666666663", + "name": "blink_perf.layout/attach-inlines-2.html" + }, + { + "duration": "11.065435696969693", + "name": "blink_perf.layout/attach-inlines.html" + }, + { + "duration": "12.326196156565663", + "name": "blink_perf.layout/auto-grid-lots-of-data.html" + }, + { + "duration": "11.8007465959596", + "name": "blink_perf.layout/chapter-reflow-once-random.html" + }, + { + "duration": "11.28009661111111", + "name": "blink_perf.layout/chapter-reflow-once.html" + }, + { + "duration": "11.50621362121212", + "name": "blink_perf.layout/chapter-reflow-thrice.html" + }, + { + "duration": "11.33638355555556", + "name": "blink_perf.layout/chapter-reflow-twice.html" + }, + { + "duration": "11.172699267676764", + "name": "blink_perf.layout/chapter-reflow.html" + }, + { + "duration": "6.648403040404039", + "name": "blink_perf.layout/character_fallback.html" + }, + { + "duration": "6.2515005959595955", + "name": "blink_perf.layout/character_fallback_aat.html" + }, + { + "duration": "12.352944757575758", + "name": "blink_perf.layout/fixed-grid-lots-of-data.html" + }, + { + "duration": "12.348520353535356", + "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" + }, + { + "duration": "11.283832878787882", + "name": "blink_perf.layout/flexbox-column-nowrap.html" + }, + { + "duration": "11.249169227272725", + "name": "blink_perf.layout/flexbox-column-wrap.html" + }, + { + "duration": "11.162960873737376", + "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" + }, + { + "duration": "14.740108111111107", + "name": "blink_perf.layout/flexbox-lots-of-data.html" + }, + { + "duration": "11.294963772727272", + "name": "blink_perf.layout/flexbox-row-nowrap.html" + }, + { + "duration": "11.251004308080814", + "name": "blink_perf.layout/flexbox-row-wrap.html" + }, + { + "duration": "11.328669055555556", + "name": "blink_perf.layout/flexbox-with-stretch-layout.html" + }, + { + "duration": "9.508990111111107", + "name": "blink_perf.layout/floats_100_100.html" + }, + { + "duration": "9.554034328282828", + "name": "blink_perf.layout/floats_100_100_nested.html" + }, + { + "duration": "8.686673929292926", + "name": "blink_perf.layout/floats_10_1000.html" + }, + { + "duration": "7.33771678989899", + "name": "blink_perf.layout/floats_20_100.html" + }, + { + "duration": "7.61878456161616", + "name": "blink_perf.layout/floats_20_100_nested.html" + }, + { + "duration": "6.6992718424242454", + "name": "blink_perf.layout/floats_2_100.html" + }, + { + "duration": "6.598894890909091", + "name": "blink_perf.layout/floats_2_100_nested.html" + }, + { + "duration": "7.633987044444444", + "name": "blink_perf.layout/floats_50_100.html" + }, + { + "duration": "7.72579653939394", + "name": "blink_perf.layout/floats_50_100_nested.html" + }, + { + "duration": "11.289598848484852", + "name": "blink_perf.layout/hindi-line-layout.html" + }, + { + "duration": "10.353696121212122", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" + }, + { + "duration": "10.348266146464642", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" + }, + { + "duration": "10.349323747474745", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" + }, + { + "duration": "6.099813178787877", + "name": "blink_perf.layout/latin-complex-text.html" + }, + { + "duration": "6.427045430303031", + "name": "blink_perf.layout/layers_overlap_2d.html" + }, + { + "duration": "6.506450562626264", + "name": "blink_perf.layout/layers_overlap_3d.html" + }, + { + "duration": "9.479731025252525", + "name": "blink_perf.layout/line-layout-line-height.html" + }, + { + "duration": "11.108102055555557", + "name": "blink_perf.layout/line-layout-repeat-append.html" + }, + { + "duration": "11.204823126262628", + "name": "blink_perf.layout/line-layout.html" + }, + { + "duration": "6.2228540151515155", + "name": "blink_perf.layout/long-line-nowrap-collapse.html" + }, + { + "duration": "6.230835564646465", + "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" + }, + { + "duration": "7.4194100929292945", + "name": "blink_perf.layout/long-line-nowrap.html" + }, + { + "duration": "11.19993910101011", + "name": "blink_perf.layout/multicol/deeply-nested-tables.html" + }, + { + "duration": "11.272425808080802", + "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" + }, + { + "duration": "11.13316597979798", + "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" + }, + { + "duration": "11.274172883838382", + "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" + }, + { + "duration": "10.992862237373737", + "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" + }, + { + "duration": "11.298452035353536", + "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" + }, + { + "duration": "11.29685925757576", + "name": "blink_perf.layout/multicol/tall-content-short-columns.html" + }, + { + "duration": "11.285529166666672", + "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" + }, + { + "duration": "11.165555338383832", + "name": "blink_perf.layout/nested-grid.html" + }, + { + "duration": "11.333841464646467", + "name": "blink_perf.layout/nested-percent-height-tables.html" + }, + { + "duration": "39.444542050505056", + "name": "blink_perf.layout/subtree-detaching.html" + }, + { + "duration": "6.626490181818186", + "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" + }, + { + "duration": "7.238174893939396", + "name": "blink_perf.layout/word-break-break-all.html" + }, + { + "duration": "7.234849005050505", + "name": "blink_perf.layout/word-break-break-word.html" + }, + { + "duration": "7.182745638383838", + "name": "blink_perf.layout/word-wrap-break-word.html" + }, + { + "duration": "13.504092878787882", + "name": "blink_perf.owp_storage/blob-perf-files.html" + }, + { + "duration": "12.87247345454546", + "name": "blink_perf.owp_storage/blob-perf-ipc.html" + }, + { + "duration": "10.095910348484848", + "name": "blink_perf.owp_storage/blob-perf-shm.html" + }, + { + "duration": "10.893217212121211", + "name": "blink_perf.owp_storage/blob-perf-tiny.html" + }, + { + "duration": "10.988969153535358", + "name": "blink_perf.owp_storage/idb-load-docs.html" + }, + { + "duration": "13.592318449494952", + "name": "blink_perf.paint/appending-text.html" + }, + { + "duration": "14.390461641414142", + "name": "blink_perf.paint/color-changes.html" + }, + { + "duration": "14.42596021717171", + "name": "blink_perf.paint/complex-content-slow-scroll.html" + }, + { + "duration": "12.544073535353531", + "name": "blink_perf.paint/containment-resize.html" + }, + { + "duration": "12.625623803030303", + "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" + }, + { + "duration": "13.644714742424238", + "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" + }, + { + "duration": "11.591791166666665", + "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" + }, + { + "duration": "13.928241505050508", + "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" + }, + { + "duration": "12.1020171969697", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" + }, + { + "duration": "12.65980824242425", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" + }, + { + "duration": "11.144968", + "name": "blink_perf.paint/large-table-collapsed-border-change.html" + }, + { + "duration": "14.825607727272725", + "name": "blink_perf.paint/large-table-repaint.html" + }, + { + "duration": "10.972024459595959", + "name": "blink_perf.paint/move-text-with-mask.html" + }, + { + "duration": "12.339141499999997", + "name": "blink_perf.paint/paint-offset-changes.html" + }, + { + "duration": "13.427785318181815", + "name": "blink_perf.paint/transform-changes.html" + }, + { + "duration": "14.629117939393941", + "name": "blink_perf.parser/css-parser-yui.html" + }, + { + "duration": "9.85166581818182", + "name": "blink_perf.parser/html-parser-threaded.html" + }, + { + "duration": "9.828668202020205", + "name": "blink_perf.parser/html-parser.html" + }, + { + "duration": "23.856799151515162", + "name": "blink_perf.parser/html5-full-render.html" + }, + { + "duration": "12.09978248989899", + "name": "blink_perf.parser/iframe-append-remove.html" + }, + { + "duration": "11.567638176767682", + "name": "blink_perf.parser/innerHTML-setter-siblings.html" + }, + { + "duration": "11.574179090909094", + "name": "blink_perf.parser/innerHTML-setter.html" + }, + { + "duration": "11.666584686868685", + "name": "blink_perf.parser/query-selector-all-attribute-complex.html" + }, + { + "duration": "11.688186747474747", + "name": "blink_perf.parser/query-selector-all-attribute.html" + }, + { + "duration": "11.40027195454546", + "name": "blink_perf.parser/query-selector-all-class-deep.html" + }, + { + "duration": "12.36058548989899", + "name": "blink_perf.parser/query-selector-all-class-first.html" + }, + { + "duration": "11.308101651515152", + "name": "blink_perf.parser/query-selector-all-class-last.html" + }, + { + "duration": "11.721170085858581", + "name": "blink_perf.parser/query-selector-all-class.html" + }, + { + "duration": "11.556049898989897", + "name": "blink_perf.parser/query-selector-all-deep.html" + }, + { + "duration": "12.328669308080812", + "name": "blink_perf.parser/query-selector-all-first.html" + }, + { + "duration": "12.506333264646464", + "name": "blink_perf.parser/query-selector-all-id-deep.html" + }, + { + "duration": "12.381116984848484", + "name": "blink_perf.parser/query-selector-all-id-first.html" + }, + { + "duration": "12.595968151515153", + "name": "blink_perf.parser/query-selector-all-id-last.html" + }, + { + "duration": "11.471384878787877", + "name": "blink_perf.parser/query-selector-all-last.html" + }, + { + "duration": "11.171858873737376", + "name": "blink_perf.parser/query-selector-deep.html" + }, + { + "duration": "11.292633055555557", + "name": "blink_perf.parser/query-selector-first.html" + }, + { + "duration": "13.463676979797985", + "name": "blink_perf.parser/query-selector-id-deep.html" + }, + { + "duration": "11.49463622222222", + "name": "blink_perf.parser/query-selector-id-last.html" + }, + { + "duration": "11.510498994949495", + "name": "blink_perf.parser/query-selector-last.html" + }, + { + "duration": "11.108851338383838", + "name": "blink_perf.parser/simple-url.html" + }, + { + "duration": "11.688399161616164", + "name": "blink_perf.parser/textarea-parsing.html" + }, + { + "duration": "11.934446277777775", + "name": "blink_perf.parser/tiny-innerHTML.html" + }, + { + "duration": "12.454494383838384", + "name": "blink_perf.parser/url-parser.html" + }, + { + "duration": "11.144563474747477", + "name": "blink_perf.parser/xml-parser.html" + }, + { + "duration": "7.8223476898989865", + "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" + }, + { + "duration": "6.273441096969698", + "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" + }, + { + "duration": "8.63617063737374", + "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" + }, + { + "duration": "6.044700004040405", + "name": "blink_perf.shadow_dom/shadow-style-share.html" + }, + { + "duration": "6.116052308080807", + "name": "blink_perf.shadow_dom/style-sheet-insert.html" + }, + { + "duration": "6.1797867494949505", + "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" + }, + { + "duration": "6.456021278787877", + "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" + }, + { + "duration": "8.805562469696968", + "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" + }, + { + "duration": "7.354538352525255", + "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" + }, + { + "duration": "6.1748722333333355", + "name": "blink_perf.shadow_dom/v0-content-reprojection.html" + }, + { + "duration": "6.075533095959595", + "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" + }, + { + "duration": "6.048711948484849", + "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" + }, + { + "duration": "6.187493113131311", + "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" + }, + { + "duration": "6.105432778787877", + "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" + }, + { + "duration": "20.41686710606061", + "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" + }, + { + "duration": "6.024730242424242", + "name": "blink_perf.shadow_dom/v1-distribution.html" + }, + { + "duration": "6.023793010101011", + "name": "blink_perf.shadow_dom/v1-host-child-append.html" + }, + { + "duration": "20.37298143939394", + "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" + }, + { + "duration": "63.770208393939384", + "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" + }, + { + "duration": "6.0171015020202026", + "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" + }, + { + "duration": "6.02449483030303", + "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" + }, + { + "duration": "6.265382601010104", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" + }, + { + "duration": "6.025571859595958", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "6.028275893939394", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" + }, + { + "duration": "6.115569261616162", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" + }, + { + "duration": "6.026955436363634", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "6.037779977777777", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" + }, + { + "duration": "6.016752089898989", + "name": "blink_perf.shadow_dom/v1-slot-append.html" + }, + { + "duration": "7.762991485858586", + "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" + }, + { + "duration": "7.815863341414137", + "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" + }, + { + "duration": "6.016233386868687", + "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" + }, + { + "duration": "6.021491235353534", + "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" + }, + { + "duration": "9.489256339393938", + "name": "blink_perf.svg/AzLizardBenjiPark.html" + }, + { + "duration": "6.899305760606058", + "name": "blink_perf.svg/Bamboo.html" + }, + { + "duration": "6.266423423232324", + "name": "blink_perf.svg/Cactus.html" + }, + { + "duration": "6.266877496969697", + "name": "blink_perf.svg/Cowboy.html" + }, + { + "duration": "7.038109163636363", + "name": "blink_perf.svg/Cowboy_transform.html" + }, + { + "duration": "6.192080212121213", + "name": "blink_perf.svg/CrawFishGanson.html" + }, + { + "duration": "6.196871690909095", + "name": "blink_perf.svg/Debian.html" + }, + { + "duration": "6.179975287878791", + "name": "blink_perf.svg/DropsOnABlade.html" + }, + { + "duration": "6.188197419191921", + "name": "blink_perf.svg/FlowerFromMyGarden.html" + }, + { + "duration": "6.198499153535354", + "name": "blink_perf.svg/FoodLeifLodahl.html" + }, + { + "duration": "6.196440718181815", + "name": "blink_perf.svg/France.html" + }, + { + "duration": "6.236702899999997", + "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" + }, + { + "duration": "6.26549283838384", + "name": "blink_perf.svg/GearFlowers.html" + }, + { + "duration": "6.192938567676767", + "name": "blink_perf.svg/HarveyRayner.html" + }, + { + "duration": "6.189208473737374", + "name": "blink_perf.svg/HereGear.html" + }, + { + "duration": "9.191776405050506", + "name": "blink_perf.svg/MtSaintHelens.html" + }, + { + "duration": "6.145609913131312", + "name": "blink_perf.svg/Samurai.html" + }, + { + "duration": "28.51723932323233", + "name": "blink_perf.svg/SierpinskiCarpet.html" + }, + { + "duration": "6.5726521737373735", + "name": "blink_perf.svg/SvgCubics.html" + }, + { + "duration": "6.428633327272725", + "name": "blink_perf.svg/SvgHitTesting.html" + }, + { + "duration": "11.886736444444434", + "name": "blink_perf.svg/SvgNestedUse.html" + }, + { + "duration": "6.19407679191919", + "name": "blink_perf.svg/UnderTheSee.html" + }, + { + "duration": "6.363368121212121", + "name": "blink_perf.svg/WorldIso.html" + }, + { + "duration": "6.940585972727272", + "name": "blink_perf.svg/Worldcup.html" + }, + { + "duration": "39.74085267676767", + "name": "dromaeo/http://dromaeo.com?dom-attr" + }, + { + "duration": "36.4297771111111", + "name": "dromaeo/http://dromaeo.com?dom-modify" + }, + { + "duration": "52.306013959595965", + "name": "dromaeo/http://dromaeo.com?dom-query" + }, + { + "duration": "32.63116017171717", + "name": "dromaeo/http://dromaeo.com?dom-traverse" + }, + { + "duration": "15.033352065656567", + "name": "dummy_benchmark.histogram_benchmark_1/dummy_page.html" + }, + { + "duration": "9.440990050505047", + "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" + }, + { + "duration": "9.39538251515151", + "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" + }, + { + "duration": "182.4893480808081", + "name": "jetstream/http://browserbench.org/JetStream/" + }, + { + "duration": "27.126773777777778", + "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" + }, + { + "duration": "69.05069456565658", + "name": "loading.desktop/24h" + }, + { + "duration": "30.80669252777777", + "name": "loading.desktop/24h_cold" + }, + { + "duration": "38.24881516666667", + "name": "loading.desktop/24h_warm" + }, + { + "duration": "107.62802949494953", + "name": "loading.desktop/AirBnB" + }, + { + "duration": "43.80981216666667", + "name": "loading.desktop/AirBnB_cold" + }, + { + "duration": "64.46681938888888", + "name": "loading.desktop/AirBnB_warm" + }, + { + "duration": "60.275913646464666", + "name": "loading.desktop/Aljayyash" + }, + { + "duration": "27.54659875", + "name": "loading.desktop/Aljayyash_cold" + }, + { + "duration": "32.55028616666666", + "name": "loading.desktop/Aljayyash_warm" + }, + { + "duration": "95.53738694949493", + "name": "loading.desktop/AllRecipes" + }, + { + "duration": "39.30033255555555", + "name": "loading.desktop/AllRecipes_cold" + }, + { + "duration": "55.86898711111112", + "name": "loading.desktop/AllRecipes_warm" + }, + { + "duration": "96.38536522222219", + "name": "loading.desktop/ArsTechnica" + }, + { + "duration": "39.96324494444444", + "name": "loading.desktop/ArsTechnica_cold" + }, + { + "duration": "55.080511055555554", + "name": "loading.desktop/ArsTechnica_warm" + }, + { + "duration": "60.87412631818181", + "name": "loading.desktop/Baidu" + }, + { + "duration": "27.84273283333333", + "name": "loading.desktop/Baidu_cold" + }, + { + "duration": "32.87229944444445", + "name": "loading.desktop/Baidu_warm" + }, + { + "duration": "80.66133055555552", + "name": "loading.desktop/Bhaskar" + }, + { + "duration": "34.916471277777774", + "name": "loading.desktop/Bhaskar_cold" + }, + { + "duration": "45.434582222222225", + "name": "loading.desktop/Bhaskar_warm" + }, + { + "duration": "70.37601564141414", + "name": "loading.desktop/Chosun" + }, + { + "duration": "31.074650833333326", + "name": "loading.desktop/Chosun_cold" + }, + { + "duration": "38.56108605555554", + "name": "loading.desktop/Chosun_warm" + }, + { + "duration": "66.88890290404039", + "name": "loading.desktop/Colorado.edu" + }, + { + "duration": "29.82094413888889", + "name": "loading.desktop/Colorado.edu_cold" + }, + { + "duration": "36.9992265", + "name": "loading.desktop/Colorado.edu_warm" + }, + { + "duration": "69.33581670707075", + "name": "loading.desktop/Danawa" + }, + { + "duration": "30.774991972222224", + "name": "loading.desktop/Danawa_cold" + }, + { + "duration": "38.43555838888889", + "name": "loading.desktop/Danawa_warm" + }, + { + "duration": "67.67442307070712", + "name": "loading.desktop/Daum" + }, + { + "duration": "29.860621499999997", + "name": "loading.desktop/Daum_cold" + }, + { + "duration": "37.046283888888894", + "name": "loading.desktop/Daum_warm" + }, + { + "duration": "71.11272977272725", + "name": "loading.desktop/Donga" + }, + { + "duration": "31.45784527777778", + "name": "loading.desktop/Donga_cold" + }, + { + "duration": "39.388444166666666", + "name": "loading.desktop/Donga_warm" + }, + { + "duration": "96.97215548484847", + "name": "loading.desktop/Economist" + }, + { + "duration": "39.55985605555556", + "name": "loading.desktop/Economist_cold" + }, + { + "duration": "57.03178455555556", + "name": "loading.desktop/Economist_warm" + }, + { + "duration": "163.2446002828283", + "name": "loading.desktop/Elmundo" + }, + { + "duration": "40.14866005555555", + "name": "loading.desktop/Elmundo_cold" + }, + { + "duration": "123.88347788888889", + "name": "loading.desktop/Elmundo_warm" + }, + { + "duration": "69.7370215808081", + "name": "loading.desktop/FC2Blog" + }, + { + "duration": "31.103862249999995", + "name": "loading.desktop/FC2Blog_cold" + }, + { + "duration": "37.66509305555556", + "name": "loading.desktop/FC2Blog_warm" + }, + { + "duration": "75.09787662121212", + "name": "loading.desktop/FIFA" + }, + { + "duration": "32.17993027777778", + "name": "loading.desktop/FIFA_cold" + }, + { + "duration": "42.316773999999995", + "name": "loading.desktop/FIFA_warm" + }, + { + "duration": "81.3397588383838", + "name": "loading.desktop/FarsNews" + }, + { + "duration": "47.89564386111111", + "name": "loading.desktop/FarsNews_cold" + }, + { + "duration": "36.64177877777777", + "name": "loading.desktop/FarsNews_warm" + }, + { + "duration": "71.33285917676766", + "name": "loading.desktop/Flickr" + }, + { + "duration": "31.269193055555554", + "name": "loading.desktop/Flickr_cold" + }, + { + "duration": "39.790001833333335", + "name": "loading.desktop/Flickr_warm" + }, + { + "duration": "72.51572385353535", + "name": "loading.desktop/FlipKart" + }, + { + "duration": "31.483129638888897", + "name": "loading.desktop/FlipKart_cold" + }, + { + "duration": "40.954270055555554", + "name": "loading.desktop/FlipKart_warm" + }, + { + "duration": "61.38930050505051", + "name": "loading.desktop/Free.fr" + }, + { + "duration": "27.784928166666667", + "name": "loading.desktop/Free.fr_cold" + }, + { + "duration": "33.08568672222222", + "name": "loading.desktop/Free.fr_warm" + }, + { + "duration": "58.119651843434326", + "name": "loading.desktop/HTML5Rocks" + }, + { + "duration": "26.907549805555558", + "name": "loading.desktop/HTML5Rocks_cold" + }, + { + "duration": "31.112536305555555", + "name": "loading.desktop/HTML5Rocks_warm" + }, + { + "duration": "59.93631544444445", + "name": "loading.desktop/Haraj" + }, + { + "duration": "27.428107194444443", + "name": "loading.desktop/Haraj_cold" + }, + { + "duration": "32.48114088888888", + "name": "loading.desktop/Haraj_warm" + }, + { + "duration": "70.0606452373737", + "name": "loading.desktop/HatenaBookmark" + }, + { + "duration": "31.785204833333328", + "name": "loading.desktop/HatenaBookmark_cold" + }, + { + "duration": "38.290986722222215", + "name": "loading.desktop/HatenaBookmark_warm" + }, + { + "duration": "72.51533885353535", + "name": "loading.desktop/IGN" + }, + { + "duration": "32.144549805555556", + "name": "loading.desktop/IGN_cold" + }, + { + "duration": "39.23927966666667", + "name": "loading.desktop/IGN_warm" + }, + { + "duration": "75.3259112828283", + "name": "loading.desktop/IMDB" + }, + { + "duration": "32.83310627777778", + "name": "loading.desktop/IMDB_cold" + }, + { + "duration": "42.69010072222222", + "name": "loading.desktop/IMDB_warm" + }, + { + "duration": "72.78318368181817", + "name": "loading.desktop/IndiaTimes" + }, + { + "duration": "31.89443158333334", + "name": "loading.desktop/IndiaTimes_cold" + }, + { + "duration": "40.73694788888889", + "name": "loading.desktop/IndiaTimes_warm" + }, + { + "duration": "73.48181101010103", + "name": "loading.desktop/Kakaku" + }, + { + "duration": "32.17507738888888", + "name": "loading.desktop/Kakaku_cold" + }, + { + "duration": "41.36903133333333", + "name": "loading.desktop/Kakaku_warm" + }, + { + "duration": "109.7665688686869", + "name": "loading.desktop/Kenh14" + }, + { + "duration": "45.27140694444444", + "name": "loading.desktop/Kenh14_cold" + }, + { + "duration": "63.615794444444454", + "name": "loading.desktop/Kenh14_warm" + }, + { + "duration": "65.946189", + "name": "loading.desktop/Mercadolivre" + }, + { + "duration": "29.497683527777774", + "name": "loading.desktop/Mercadolivre_cold" + }, + { + "duration": "36.37256272222222", + "name": "loading.desktop/Mercadolivre_warm" + }, + { + "duration": "81.99455004000001", + "name": "loading.desktop/NatGeo" + }, + { + "duration": "65.81515659090908", + "name": "loading.desktop/Naver" + }, + { + "duration": "29.176722111111108", + "name": "loading.desktop/Naver_cold" + }, + { + "duration": "35.21329961111111", + "name": "loading.desktop/Naver_warm" + }, + { + "duration": "61.35054911616161", + "name": "loading.desktop/Orange" + }, + { + "duration": "27.771023055555553", + "name": "loading.desktop/Orange_cold" + }, + { + "duration": "33.377425999999986", + "name": "loading.desktop/Orange_warm" + }, + { + "duration": "67.65342053030304", + "name": "loading.desktop/Pantip" + }, + { + "duration": "30.16744375", + "name": "loading.desktop/Pantip_cold" + }, + { + "duration": "37.355472111111105", + "name": "loading.desktop/Pantip_warm" + }, + { + "duration": "71.8033911767677", + "name": "loading.desktop/PremierLeague" + }, + { + "duration": "39.14950616666667", + "name": "loading.desktop/PremierLeague_cold" + }, + { + "duration": "39.27810622222223", + "name": "loading.desktop/PremierLeague_warm" + }, + { + "duration": "83.57290010101009", + "name": "loading.desktop/QQ" + }, + { + "duration": "35.571800277777776", + "name": "loading.desktop/QQ_cold" + }, + { + "duration": "47.2189875", + "name": "loading.desktop/QQ_warm" + }, + { + "duration": "69.90659418181816", + "name": "loading.desktop/REI" + }, + { + "duration": "30.950458055555558", + "name": "loading.desktop/REI_cold" + }, + { + "duration": "38.53204777777778", + "name": "loading.desktop/REI_warm" + }, + { + "duration": "63.182250934343436", + "name": "loading.desktop/Ruten" + }, + { + "duration": "28.55056966666666", + "name": "loading.desktop/Ruten_cold" + }, + { + "duration": "34.47354316666667", + "name": "loading.desktop/Ruten_warm" + }, + { + "duration": "87.50607447474746", + "name": "loading.desktop/Sina" + }, + { + "duration": "36.052511499999994", + "name": "loading.desktop/Sina_cold" + }, + { + "duration": "50.47816677777778", + "name": "loading.desktop/Sina_warm" + }, + { + "duration": "84.52406710101015", + "name": "loading.desktop/Taobao" + }, + { + "duration": "35.94836583333333", + "name": "loading.desktop/Taobao_cold" + }, + { + "duration": "48.483219555555564", + "name": "loading.desktop/Taobao_warm" + }, + { + "duration": "82.67320690909092", + "name": "loading.desktop/TheOnion" + }, + { + "duration": "35.48907816666666", + "name": "loading.desktop/TheOnion_cold" + }, + { + "duration": "46.65776761111111", + "name": "loading.desktop/TheOnion_warm" + }, + { + "duration": "80.2471845353535", + "name": "loading.desktop/TheVerge" + }, + { + "duration": "35.000387666666676", + "name": "loading.desktop/TheVerge_cold" + }, + { + "duration": "45.15523761111111", + "name": "loading.desktop/TheVerge_warm" + }, + { + "duration": "87.35491532323232", + "name": "loading.desktop/TicketMaster" + }, + { + "duration": "37.525634222222216", + "name": "loading.desktop/TicketMaster_cold" + }, + { + "duration": "49.462949888888886", + "name": "loading.desktop/TicketMaster_warm" + }, + { + "duration": "106.46508324242424", + "name": "loading.desktop/Vietnamnet" + }, + { + "duration": "45.03156644444445", + "name": "loading.desktop/Vietnamnet_cold" + }, + { + "duration": "61.0556267777778", + "name": "loading.desktop/Vietnamnet_warm" + }, + { + "duration": "86.75162514141412", + "name": "loading.desktop/Vnexpress" + }, + { + "duration": "35.95948122222222", + "name": "loading.desktop/Vnexpress_cold" + }, + { + "duration": "48.830984666666666", + "name": "loading.desktop/Vnexpress_warm" + }, + { + "duration": "103.76494244444444", + "name": "loading.desktop/Walgreens" + }, + { + "duration": "41.16672544444443", + "name": "loading.desktop/Walgreens_cold" + }, + { + "duration": "63.47957744444446", + "name": "loading.desktop/Walgreens_warm" + }, + { + "duration": "63.271106393939405", + "name": "loading.desktop/Yandex" + }, + { + "duration": "29.253635249999995", + "name": "loading.desktop/Yandex_cold" + }, + { + "duration": "33.942704444444445", + "name": "loading.desktop/Yandex_warm" + }, + { + "duration": "83.64180593939393", + "name": "loading.desktop/amazon.co.jp" + }, + { + "duration": "35.51794494444445", + "name": "loading.desktop/amazon.co.jp_cold" + }, + { + "duration": "47.25391394444445", + "name": "loading.desktop/amazon.co.jp_warm" + }, + { + "duration": "65.07259878282828", + "name": "loading.desktop/ja.wikipedia" + }, + { + "duration": "29.370651111111115", + "name": "loading.desktop/ja.wikipedia_cold" + }, + { + "duration": "35.480744944444446", + "name": "loading.desktop/ja.wikipedia_warm" + }, + { + "duration": "93.02707291919194", + "name": "loading.desktop/money.cnn" + }, + { + "duration": "38.679949388888886", + "name": "loading.desktop/money.cnn_cold" + }, + { + "duration": "54.18395444444444", + "name": "loading.desktop/money.cnn_warm" + }, + { + "duration": "65.08846737373737", + "name": "loading.desktop/ru.wikipedia" + }, + { + "duration": "29.38095294444444", + "name": "loading.desktop/ru.wikipedia_cold" + }, + { + "duration": "35.354729944444436", + "name": "loading.desktop/ru.wikipedia_warm" + }, + { + "duration": "70.38954205555555", + "name": "loading.desktop/yahoo.co.jp" + }, + { + "duration": "31.149980722222217", + "name": "loading.desktop/yahoo.co.jp_cold" + }, + { + "duration": "39.25085011111111", + "name": "loading.desktop/yahoo.co.jp_warm" + }, + { + "duration": "15.067173106060606", + "name": "media.desktop/mse.html?media=aac_audio.mp4" + }, + { + "duration": "15.812147287878787", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4" + }, + { + "duration": "15.79571231818182", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4&waitForPageLoaded=true" + }, + { + "duration": "15.553615747474746", + "name": "media.desktop/mse.html?media=h264_video.mp4" + }, + { + "duration": "25.442006111111105", + "name": "media.desktop/video.html?src=crowd.ogg&type=audio" + }, + { + "duration": "25.110357292929294", + "name": "media.desktop/video.html?src=crowd1080.mp4" + }, + { + "duration": "24.287978757575747", + "name": "media.desktop/video.html?src=crowd1080.webm" + }, + { + "duration": "22.802473404040406", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm" + }, + { + "duration": "13.485099101010093", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm&seek" + }, + { + "duration": "22.645516979797982", + "name": "media.desktop/video.html?src=crowd720_vp9.webm" + }, + { + "duration": "24.333887414141422", + "name": "media.desktop/video.html?src=garden2_10s.mp4" + }, + { + "duration": "14.818572914141411", + "name": "media.desktop/video.html?src=garden2_10s.mp4&seek" + }, + { + "duration": "23.54049164646464", + "name": "media.desktop/video.html?src=garden2_10s.webm" + }, + { + "duration": "13.493408368686866", + "name": "media.desktop/video.html?src=garden2_10s.webm&seek" + }, + { + "duration": "15.776904616161614", + "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek" + }, + { + "duration": "30.061125797979788", + "name": "media.desktop/video.html?src=tulip2.m4a&type=audio" + }, + { + "duration": "30.00669151515153", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio" + }, + { + "duration": "12.675141186868686", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek" + }, + { + "duration": "31.55073161616162", + "name": "media.desktop/video.html?src=tulip2.mp4" + }, + { + "duration": "32.30938069696968", + "name": "media.desktop/video.html?src=tulip2.mp4&busyjs" + }, + { + "duration": "13.369136585858588", + "name": "media.desktop/video.html?src=tulip2.mp4&seek" + }, + { + "duration": "30.045163353535344", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio" + }, + { + "duration": "12.71353242929293", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek" + }, + { + "duration": "31.964633666666654", + "name": "media.desktop/video.html?src=tulip2.vp9.webm" + }, + { + "duration": "24.18690987878788", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&background" + }, + { + "duration": "14.357744262626266", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&seek" + }, + { + "duration": "58.508562404040404", + "name": "media.desktop/video.html?src=tulip2.vp9.webm_Regular-3G" + }, + { + "duration": "30.246084636363648", + "name": "media.desktop/video.html?src=tulip2.wav&type=audio" + }, + { + "duration": "12.62153223737374", + "name": "media.desktop/video.html?src=tulip2.wav&type=audio&seek" + }, + { + "duration": "101.99415652525254", + "name": "memory.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "100.91746414141419", + "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "101.37547153535351", + "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "101.21100853535359", + "name": "memory.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "102.02062619191912", + "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "101.2974133131313", + "name": "memory.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "106.21645049494948", + "name": "memory.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "101.28184683838387", + "name": "memory.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "148.79591434343433", + "name": "memory.long_running_idle_gmail_background_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "150.3355823232323", + "name": "memory.long_running_idle_gmail_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "42.96883356565657", + "name": "octane/http://chromium.github.io/octane/index.html?auto=1" + }, + { + "duration": "60.91269919191921", + "name": "oortonline_tbmv2/http://oortonline.gl/#run" + }, + { + "duration": "48.353615365853685", + "name": "power.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "43.90662476829267", + "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "46.575129182926815", + "name": "power.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "46.37005154878048", + "name": "power.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "44.187508621951224", + "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "44.04917875609756", + "name": "power.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "49.00351828048778", + "name": "power.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "46.606815658536576", + "name": "power.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "579.322062682927", + "name": "power.desktop/abcnews" + }, + { + "duration": "43.26994304878049", + "name": "power.desktop/indiatimes" + }, + { + "duration": "45.707487109756094", + "name": "power.desktop/instagram" + }, + { + "duration": "43.885226987804884", + "name": "power.desktop/microsoft" + }, + { + "duration": "44.46774948780488", + "name": "power.desktop/sina" + }, + { + "duration": "45.40204709756097", + "name": "power.desktop/slideshare" + }, + { + "duration": "58.83220260975609", + "name": "power.desktop/uol" + }, + { + "duration": "17.910645939393937", + "name": "power.idle_platform/IdleStory_10s" + }, + { + "duration": "125.24742185858581", + "name": "power.idle_platform/IdleStory_120s" + }, + { + "duration": "64.85162331313133", + "name": "power.idle_platform/IdleStory_60s" + }, + { + "duration": "14.301643904040409", + "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" + }, + { + "duration": "18.562431767676763", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" + }, + { + "duration": "12.203331843434341", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" + }, + { + "duration": "13.106678560606056", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" + }, + { + "duration": "13.362693166666665", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" + }, + { + "duration": "12.204810161616157", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" + }, + { + "duration": "18.167166434343432", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" + }, + { + "duration": "11.820309853535353", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" + }, + { + "duration": "11.66383315151515", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" + }, + { + "duration": "12.37663909090909", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" + }, + { + "duration": "11.072287858585861", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" + }, + { + "duration": "11.076894742424248", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" + }, + { + "duration": "12.576504838383839", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" + }, + { + "duration": "19.78215411111111", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" + }, + { + "duration": "11.98439798989899", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" + }, + { + "duration": "11.594872292929292", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" + }, + { + "duration": "30.502789909090918", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" + }, + { + "duration": "14.868625570707067", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" + }, + { + "duration": "16.81503065656565", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" + }, + { + "duration": "12.89323518181818", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" + }, + { + "duration": "11.201976095959598", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" + }, + { + "duration": "23.16566851515151", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" + }, + { + "duration": "101.29806051515153", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" + }, + { + "duration": "79.55235570707073", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" + }, + { + "duration": "24.58393182828284", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" + }, + { + "duration": "7.264154475000001", + "name": "rendering.desktop/amazon_pinch" + }, + { + "duration": "24.902164", + "name": "rendering.desktop/analog_clock_svg" + }, + { + "duration": "24.338883916666664", + "name": "rendering.desktop/animometer_webgl" + }, + { + "duration": "24.4221565", + "name": "rendering.desktop/aquarium" + }, + { + "duration": "27.90489325", + "name": "rendering.desktop/aquarium_20k" + }, + { + "duration": "28.587325500000002", + "name": "rendering.desktop/background_color_animation" + }, + { + "duration": "42.582785666666666", + "name": "rendering.desktop/background_color_animation_with_gradient" + }, + { + "duration": "25.052627521739122", + "name": "rendering.desktop/balls_css_key_frame_animations" + }, + { + "duration": "25.415013782608703", + "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "29.135642956521743", + "name": "rendering.desktop/balls_css_transition_2_properties" + }, + { + "duration": "29.300298565217396", + "name": "rendering.desktop/balls_css_transition_40_properties" + }, + { + "duration": "29.50002717391305", + "name": "rendering.desktop/balls_css_transition_all_properties" + }, + { + "duration": "27.407888478260865", + "name": "rendering.desktop/balls_javascript_canvas" + }, + { + "duration": "25.039558347826087", + "name": "rendering.desktop/balls_javascript_css" + }, + { + "duration": "27.926557130434784", + "name": "rendering.desktop/balls_svg_animations" + }, + { + "duration": "22.73247008333333", + "name": "rendering.desktop/blob" + }, + { + "duration": "29.74667726262627", + "name": "rendering.desktop/blogspot" + }, + { + "duration": "7.2694394666666655", + "name": "rendering.desktop/blogspot_pinch" + }, + { + "duration": "16.373330671717163", + "name": "rendering.desktop/booking.com" + }, + { + "duration": "7.272132074999999", + "name": "rendering.desktop/booking_pinch" + }, + { + "duration": "17.20336720689655", + "name": "rendering.desktop/bouncing_balls_15" + }, + { + "duration": "17.162768137931035", + "name": "rendering.desktop/bouncing_balls_shadow" + }, + { + "duration": "18.560364344827587", + "name": "rendering.desktop/bouncing_clipped_rectangles" + }, + { + "duration": "19.116673275862066", + "name": "rendering.desktop/bouncing_gradient_circles" + }, + { + "duration": "15.141152362068967", + "name": "rendering.desktop/bouncing_png_images" + }, + { + "duration": "27.397448344827584", + "name": "rendering.desktop/bouncing_svg_images" + }, + { + "duration": "22.08328525", + "name": "rendering.desktop/canvas_05000_pixels_per_second" + }, + { + "duration": "21.500918249999998", + "name": "rendering.desktop/canvas_10000_pixels_per_second" + }, + { + "duration": "18.028259916666666", + "name": "rendering.desktop/canvas_15000_pixels_per_second" + }, + { + "duration": "16.60957833333333", + "name": "rendering.desktop/canvas_20000_pixels_per_second" + }, + { + "duration": "15.149504499999999", + "name": "rendering.desktop/canvas_30000_pixels_per_second" + }, + { + "duration": "14.185774", + "name": "rendering.desktop/canvas_40000_pixels_per_second" + }, + { + "duration": "13.665155583333332", + "name": "rendering.desktop/canvas_50000_pixels_per_second" + }, + { + "duration": "13.376906791666668", + "name": "rendering.desktop/canvas_60000_pixels_per_second" + }, + { + "duration": "13.010389000000002", + "name": "rendering.desktop/canvas_75000_pixels_per_second" + }, + { + "duration": "12.820810916666664", + "name": "rendering.desktop/canvas_90000_pixels_per_second" + }, + { + "duration": "18.047474137931037", + "name": "rendering.desktop/canvas_animation_no_clear" + }, + { + "duration": "18.201760034482756", + "name": "rendering.desktop/canvas_arcs" + }, + { + "duration": "17.632651827586212", + "name": "rendering.desktop/canvas_font_cycler" + }, + { + "duration": "17.472313275862067", + "name": "rendering.desktop/canvas_lines" + }, + { + "duration": "17.365224620689656", + "name": "rendering.desktop/canvas_to_blob" + }, + { + "duration": "12.174019583333333", + "name": "rendering.desktop/cats_unscaled" + }, + { + "duration": "11.079412208333332", + "name": "rendering.desktop/cats_viewport_width" + }, + { + "duration": "20.07520875862069", + "name": "rendering.desktop/chip_tune" + }, + { + "duration": "7.271165891666666", + "name": "rendering.desktop/cnn_pinch" + }, + { + "duration": "22.530964565217392", + "name": "rendering.desktop/compositor_heavy_animation" + }, + { + "duration": "18.923577137931034", + "name": "rendering.desktop/crafty_mind" + }, + { + "duration": "23.479116130434782", + "name": "rendering.desktop/css_animations_many_keyframes" + }, + { + "duration": "23.19218839130435", + "name": "rendering.desktop/css_animations_simultaneous_inline_style" + }, + { + "duration": "23.557168304347822", + "name": "rendering.desktop/css_animations_simultaneous_new_element" + }, + { + "duration": "23.168034652173912", + "name": "rendering.desktop/css_animations_simultaneous_style_element" + }, + { + "duration": "23.165455869565218", + "name": "rendering.desktop/css_animations_simultaneous_updating_class" + }, + { + "duration": "22.550770608695654", + "name": "rendering.desktop/css_animations_staggered_infinite_iterations" + }, + { + "duration": "25.583489043478263", + "name": "rendering.desktop/css_animations_staggered_inline_style" + }, + { + "duration": "26.346046086956523", + "name": "rendering.desktop/css_animations_staggered_new_element" + }, + { + "duration": "26.082284304347834", + "name": "rendering.desktop/css_animations_staggered_style_element" + }, + { + "duration": "25.704815913043486", + "name": "rendering.desktop/css_animations_staggered_updating_class" + }, + { + "duration": "25.87316021739131", + "name": "rendering.desktop/css_animations_triggered_inline_style" + }, + { + "duration": "26.688017739130434", + "name": "rendering.desktop/css_animations_triggered_new_element" + }, + { + "duration": "26.05142530434782", + "name": "rendering.desktop/css_animations_triggered_style_element" + }, + { + "duration": "25.94995286956522", + "name": "rendering.desktop/css_animations_triggered_updating_class" + }, + { + "duration": "23.247428782608694", + "name": "rendering.desktop/css_transitions_inline_style" + }, + { + "duration": "23.648037521739134", + "name": "rendering.desktop/css_transitions_new_element" + }, + { + "duration": "23.61172073913043", + "name": "rendering.desktop/css_transitions_staggered_inline_style" + }, + { + "duration": "24.365069521739134", + "name": "rendering.desktop/css_transitions_staggered_new_element" + }, + { + "duration": "23.97886613043478", + "name": "rendering.desktop/css_transitions_staggered_style_element" + }, + { + "duration": "23.720321521739127", + "name": "rendering.desktop/css_transitions_staggered_updating_class" + }, + { + "duration": "23.193517826086953", + "name": "rendering.desktop/css_transitions_style_element" + }, + { + "duration": "25.22031091304348", + "name": "rendering.desktop/css_transitions_triggered_inline_style" + }, + { + "duration": "25.388989173913043", + "name": "rendering.desktop/css_transitions_triggered_new_element" + }, + { + "duration": "25.302344217391305", + "name": "rendering.desktop/css_transitions_triggered_style_element" + }, + { + "duration": "25.4450827826087", + "name": "rendering.desktop/css_transitions_triggered_updating_class" + }, + { + "duration": "23.194399347826085", + "name": "rendering.desktop/css_transitions_updating_class" + }, + { + "duration": "23.706460521739128", + "name": "rendering.desktop/css_value_type_color" + }, + { + "duration": "58.958646217391305", + "name": "rendering.desktop/css_value_type_filter" + }, + { + "duration": "23.886185478260867", + "name": "rendering.desktop/css_value_type_length" + }, + { + "duration": "24.0012105652174", + "name": "rendering.desktop/css_value_type_length_complex" + }, + { + "duration": "23.846266260869562", + "name": "rendering.desktop/css_value_type_length_simple" + }, + { + "duration": "24.677800260869567", + "name": "rendering.desktop/css_value_type_path" + }, + { + "duration": "25.282105347826086", + "name": "rendering.desktop/css_value_type_shadow" + }, + { + "duration": "23.598968391304346", + "name": "rendering.desktop/css_value_type_transform_complex" + }, + { + "duration": "23.621310739130433", + "name": "rendering.desktop/css_value_type_transform_simple" + }, + { + "duration": "22.976591916666667", + "name": "rendering.desktop/dynamic_cube_map" + }, + { + "duration": "22.13357375", + "name": "rendering.desktop/earth" + }, + { + "duration": "13.857470176767686", + "name": "rendering.desktop/ebay" + }, + { + "duration": "7.288491083333334", + "name": "rendering.desktop/ebay_pinch" + }, + { + "duration": "20.61225144827586", + "name": "rendering.desktop/effect_games" + }, + { + "duration": "15.90133893434343", + "name": "rendering.desktop/espn" + }, + { + "duration": "5.839712625000001", + "name": "rendering.desktop/espn_pinch" + }, + { + "duration": "24.609623166666665", + "name": "rendering.desktop/extra_large_texture_uploads" + }, + { + "duration": "13.988888267676765", + "name": "rendering.desktop/facebook" + }, + { + "duration": "7.289959283333334", + "name": "rendering.desktop/facebook_pinch" + }, + { + "duration": "18.43552427586207", + "name": "rendering.desktop/fill_shapes" + }, + { + "duration": "27.960593583333328", + "name": "rendering.desktop/filter_terrain_svg" + }, + { + "duration": "17.21429272413793", + "name": "rendering.desktop/geo_apis" + }, + { + "duration": "22.63593935353535", + "name": "rendering.desktop/gmail" + }, + { + "duration": "29.435364960784316", + "name": "rendering.desktop/gmail_move" + }, + { + "duration": "7.292719641666667", + "name": "rendering.desktop/gmail_pinch" + }, + { + "duration": "16.57081097979798", + "name": "rendering.desktop/google_calendar" + }, + { + "duration": "7.292834741666667", + "name": "rendering.desktop/google_calendar_pinch" + }, + { + "duration": "31.61096737373737", + "name": "rendering.desktop/google_docs" + }, + { + "duration": "7.298834008333333", + "name": "rendering.desktop/google_image_pinch" + }, + { + "duration": "19.995232111111108", + "name": "rendering.desktop/google_image_search" + }, + { + "duration": "22.189201898989893", + "name": "rendering.desktop/google_plus" + }, + { + "duration": "7.289209525", + "name": "rendering.desktop/google_search_pinch" + }, + { + "duration": "13.59912961616162", + "name": "rendering.desktop/google_web_search" + }, + { + "duration": "25.804583451612906", + "name": "rendering.desktop/guimark_vector_chart" + }, + { + "duration": "19.25465893103448", + "name": "rendering.desktop/hakim" + }, + { + "duration": "34.71108777419355", + "name": "rendering.desktop/ie_chalkboard" + }, + { + "duration": "28.30232558333334", + "name": "rendering.desktop/ie_pirate_mark" + }, + { + "duration": "20.025523137931035", + "name": "rendering.desktop/jarro_doverson" + }, + { + "duration": "18.70939051724138", + "name": "rendering.desktop/kevs_3d" + }, + { + "duration": "22.494240391304352", + "name": "rendering.desktop/keyframed_animations" + }, + { + "duration": "26.71675883333333", + "name": "rendering.desktop/large_texture_uploads" + }, + { + "duration": "15.75683578282827", + "name": "rendering.desktop/linkedin" + }, + { + "duration": "7.289260225", + "name": "rendering.desktop/linkedin_pinch" + }, + { + "duration": "20.062474862068964", + "name": "rendering.desktop/man_in_blue" + }, + { + "duration": "23.82020703448276", + "name": "rendering.desktop/many_images" + }, + { + "duration": "22.33967925", + "name": "rendering.desktop/many_planets_deep" + }, + { + "duration": "20.388795624999997", + "name": "rendering.desktop/maps_move" + }, + { + "duration": "27.260813416666668", + "name": "rendering.desktop/maps_perf_test" + }, + { + "duration": "26.134631666666667", + "name": "rendering.desktop/medium_texture_uploads" + }, + { + "duration": "17.408554413793105", + "name": "rendering.desktop/megi_dish" + }, + { + "duration": "18.164378310344826", + "name": "rendering.desktop/microsoft_asteroid_belt" + }, + { + "duration": "20.610574275862067", + "name": "rendering.desktop/microsoft_fireflies" + }, + { + "duration": "18.01466968965517", + "name": "rendering.desktop/microsoft_fish_ie_tank" + }, + { + "duration": "17.779465620689656", + "name": "rendering.desktop/microsoft_snow" + }, + { + "duration": "17.267540103448276", + "name": "rendering.desktop/microsoft_speed_reading" + }, + { + "duration": "17.456595827586206", + "name": "rendering.desktop/microsoft_tweet_map" + }, + { + "duration": "21.10203896551724", + "name": "rendering.desktop/microsoft_video_city" + }, + { + "duration": "18.96197003448276", + "name": "rendering.desktop/microsoft_worker_fountains" + }, + { + "duration": "16.883376413793098", + "name": "rendering.desktop/mix_10k" + }, + { + "duration": "23.50734573913043", + "name": "rendering.desktop/mix_blend_mode_animation_difference" + }, + { + "duration": "23.53652617391304", + "name": "rendering.desktop/mix_blend_mode_animation_hue" + }, + { + "duration": "25.688299173913048", + "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "23.538139608695655", + "name": "rendering.desktop/mix_blend_mode_animation_screen" + }, + { + "duration": "26.200591193548387", + "name": "rendering.desktop/motion_mark_canvas_fill_shapes" + }, + { + "duration": "28.414078193548384", + "name": "rendering.desktop/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "38.14283627777779", + "name": "rendering.desktop/motion_mark_focus" + }, + { + "duration": "22.932087", + "name": "rendering.desktop/nvidia_vertex_buffer_object" + }, + { + "duration": "38.265995521739136", + "name": "rendering.desktop/overlay_background_color_css_transitions_page" + }, + { + "duration": "21.88183141666667", + "name": "rendering.desktop/particles" + }, + { + "duration": "21.765943636363634", + "name": "rendering.desktop/pinterest" + }, + { + "duration": "18.812053310344822", + "name": "rendering.desktop/put_get_image_data" + }, + { + "duration": "22.34836783333333", + "name": "rendering.desktop/raf" + }, + { + "duration": "22.59145225", + "name": "rendering.desktop/raf_animation" + }, + { + "duration": "21.72959825", + "name": "rendering.desktop/raf_canvas" + }, + { + "duration": "22.20173733333333", + "name": "rendering.desktop/raf_touch_animation" + }, + { + "duration": "18.443095551724134", + "name": "rendering.desktop/runway" + }, + { + "duration": "22.40511766666667", + "name": "rendering.desktop/san_angeles" + }, + { + "duration": "13.08696658333333", + "name": "rendering.desktop/second_batch_js_heavy" + }, + { + "duration": "13.077996416666664", + "name": "rendering.desktop/second_batch_js_light" + }, + { + "duration": "13.154334166666667", + "name": "rendering.desktop/second_batch_js_medium" + }, + { + "duration": "20.82019866666667", + "name": "rendering.desktop/simple_text_page" + }, + { + "duration": "15.584281208333335", + "name": "rendering.desktop/simple_touch_drag" + }, + { + "duration": "26.043173416666665", + "name": "rendering.desktop/small_texture_uploads" + }, + { + "duration": "20.02000782758621", + "name": "rendering.desktop/smash_cat" + }, + { + "duration": "16.759640362068968", + "name": "rendering.desktop/spielzeugz" + }, + { + "duration": "19.66347437931034", + "name": "rendering.desktop/stroke_shapes" + }, + { + "duration": "19.08355341666667", + "name": "rendering.desktop/sync_scroll_offset" + }, + { + "duration": "36.37271245454546", + "name": "rendering.desktop/techcrunch" + }, + { + "duration": "21.07575633333333", + "name": "rendering.desktop/text_05000_pixels_per_second" + }, + { + "duration": "20.480055416666666", + "name": "rendering.desktop/text_10000_pixels_per_second" + }, + { + "duration": "17.465087333333337", + "name": "rendering.desktop/text_15000_pixels_per_second" + }, + { + "duration": "16.216855750000004", + "name": "rendering.desktop/text_20000_pixels_per_second" + }, + { + "duration": "14.50774", + "name": "rendering.desktop/text_30000_pixels_per_second" + }, + { + "duration": "13.779991583333333", + "name": "rendering.desktop/text_40000_pixels_per_second" + }, + { + "duration": "13.367309791666663", + "name": "rendering.desktop/text_50000_pixels_per_second" + }, + { + "duration": "13.050498833333334", + "name": "rendering.desktop/text_60000_pixels_per_second" + }, + { + "duration": "12.749441916666669", + "name": "rendering.desktop/text_75000_pixels_per_second" + }, + { + "duration": "12.498258125", + "name": "rendering.desktop/text_90000_pixels_per_second" + }, + { + "duration": "26.374763583333333", + "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "24.247589083333335", + "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "20.255736583333338", + "name": "rendering.desktop/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "18.385492250000002", + "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "16.266108166666665", + "name": "rendering.desktop/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "15.400867583333337", + "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "14.773632", + "name": "rendering.desktop/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "14.258960333333334", + "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "13.902150583333333", + "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "13.571667083333333", + "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "21.193175166666666", + "name": "rendering.desktop/text_hover_05000_pixels_per_second" + }, + { + "duration": "20.179514416666667", + "name": "rendering.desktop/text_hover_10000_pixels_per_second" + }, + { + "duration": "17.39920225", + "name": "rendering.desktop/text_hover_15000_pixels_per_second" + }, + { + "duration": "15.998272791666666", + "name": "rendering.desktop/text_hover_20000_pixels_per_second" + }, + { + "duration": "14.50669225", + "name": "rendering.desktop/text_hover_30000_pixels_per_second" + }, + { + "duration": "13.625939916666667", + "name": "rendering.desktop/text_hover_40000_pixels_per_second" + }, + { + "duration": "13.112004166666667", + "name": "rendering.desktop/text_hover_50000_pixels_per_second" + }, + { + "duration": "12.857703458333333", + "name": "rendering.desktop/text_hover_60000_pixels_per_second" + }, + { + "duration": "12.580018833333334", + "name": "rendering.desktop/text_hover_75000_pixels_per_second" + }, + { + "duration": "12.296165416666666", + "name": "rendering.desktop/text_hover_90000_pixels_per_second" + }, + { + "duration": "21.160638916666667", + "name": "rendering.desktop/touch_handler_scrolling" + }, + { + "duration": "27.33336156521739", + "name": "rendering.desktop/transform_transitions" + }, + { + "duration": "22.805205347826085", + "name": "rendering.desktop/transform_transitions_js_block" + }, + { + "duration": "17.34771004040404", + "name": "rendering.desktop/twitter" + }, + { + "duration": "7.293281941666666", + "name": "rendering.desktop/twitter_pinch" + }, + { + "duration": "21.6229603030303", + "name": "rendering.desktop/weather.com" + }, + { + "duration": "7.291694258333333", + "name": "rendering.desktop/weather_pinch" + }, + { + "duration": "23.766664739130434", + "name": "rendering.desktop/web_animation_value_type_color" + }, + { + "duration": "23.627777434782605", + "name": "rendering.desktop/web_animation_value_type_length_3d" + }, + { + "duration": "23.823022565217382", + "name": "rendering.desktop/web_animation_value_type_length_complex" + }, + { + "duration": "23.68281991304347", + "name": "rendering.desktop/web_animation_value_type_length_simple" + }, + { + "duration": "24.83055195652174", + "name": "rendering.desktop/web_animation_value_type_path" + }, + { + "duration": "25.408785999999992", + "name": "rendering.desktop/web_animation_value_type_shadow" + }, + { + "duration": "23.762956782608693", + "name": "rendering.desktop/web_animation_value_type_transform_complex" + }, + { + "duration": "23.629834608695646", + "name": "rendering.desktop/web_animation_value_type_transform_simple" + }, + { + "duration": "24.248601869565217", + "name": "rendering.desktop/web_animations_many_keyframes" + }, + { + "duration": "23.64028378260869", + "name": "rendering.desktop/web_animations_set_current_time" + }, + { + "duration": "23.817112565217393", + "name": "rendering.desktop/web_animations_simultaneous" + }, + { + "duration": "25.630637565217384", + "name": "rendering.desktop/web_animations_staggered_chaining" + }, + { + "duration": "22.778821173913048", + "name": "rendering.desktop/web_animations_staggered_infinite_iterations" + }, + { + "duration": "25.543652434782608", + "name": "rendering.desktop/web_animations_staggered_triggering_page" + }, + { + "duration": "20.829626989898976", + "name": "rendering.desktop/wikipedia" + }, + { + "duration": "23.60951880808082", + "name": "rendering.desktop/wordpress" + }, + { + "duration": "14.309244984848482", + "name": "rendering.desktop/yahoo_answers" + }, + { + "duration": "21.960765838383836", + "name": "rendering.desktop/yahoo_games" + }, + { + "duration": "7.295982366666666", + "name": "rendering.desktop/yahoo_games_pinch" + }, + { + "duration": "15.772853585858584", + "name": "rendering.desktop/yahoo_news" + }, + { + "duration": "7.292448141666668", + "name": "rendering.desktop/yahoo_news_pinch" + }, + { + "duration": "17.865104070707083", + "name": "rendering.desktop/yahoo_sports" + }, + { + "duration": "7.293532641666666", + "name": "rendering.desktop/yahoo_sports_pinch" + }, + { + "duration": "21.337924020202024", + "name": "rendering.desktop/youtube" + }, + { + "duration": "7.293223916666668", + "name": "rendering.desktop/youtube_pinch" + }, + { + "duration": "23.689894000000002", + "name": "rendering.desktop/yuv_decoding" + }, + { + "duration": "17.11356319230769", + "name": "scheduler.tough_scheduling_cases/raf" + }, + { + "duration": "17.162291141414137", + "name": "scheduler.tough_scheduling_cases/raf.html" + }, + { + "duration": "17.06901642307692", + "name": "scheduler.tough_scheduling_cases/raf_animation" + }, + { + "duration": "17.117257545454546", + "name": "scheduler.tough_scheduling_cases/raf_animation.html" + }, + { + "duration": "16.971496730769232", + "name": "scheduler.tough_scheduling_cases/raf_canvas" + }, + { + "duration": "17.026943383838383", + "name": "scheduler.tough_scheduling_cases/raf_canvas.html" + }, + { + "duration": "17.062422461538464", + "name": "scheduler.tough_scheduling_cases/raf_touch_animation" + }, + { + "duration": "17.106935969696963", + "name": "scheduler.tough_scheduling_cases/raf_touch_animation.html" + }, + { + "duration": "10.958950075757583", + "name": "scheduler.tough_scheduling_cases/second_batch_js.html?heavy" + }, + { + "duration": "10.881288944444444", + "name": "scheduler.tough_scheduling_cases/second_batch_js.html?light" + }, + { + "duration": "10.960611888888888", + "name": "scheduler.tough_scheduling_cases/second_batch_js.html?medium" + }, + { + "duration": "10.911045250000003", + "name": "scheduler.tough_scheduling_cases/second_batch_js_heavy" + }, + { + "duration": "10.860169250000002", + "name": "scheduler.tough_scheduling_cases/second_batch_js_light" + }, + { + "duration": "10.922997730769229", + "name": "scheduler.tough_scheduling_cases/second_batch_js_medium" + }, + { + "duration": "20.132180307692302", + "name": "scheduler.tough_scheduling_cases/simple_text_page" + }, + { + "duration": "20.22637077777778", + "name": "scheduler.tough_scheduling_cases/simple_text_page.html" + }, + { + "duration": "12.762436", + "name": "scheduler.tough_scheduling_cases/simple_touch_drag" + }, + { + "duration": "12.79099242929293", + "name": "scheduler.tough_scheduling_cases/simple_touch_drag.html" + }, + { + "duration": "15.535082826923079", + "name": "scheduler.tough_scheduling_cases/sync_scroll_offset" + }, + { + "duration": "15.557776656565661", + "name": "scheduler.tough_scheduling_cases/sync_scroll_offset.html" + }, + { + "duration": "16.697018846153842", + "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling" + }, + { + "duration": "16.724783808080804", + "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling.html" + }, + { + "duration": "20.980810424242435", + "name": "smoothness.gpu_rasterization.tough_filters_cases/Analog_Clock_SVG" + }, + { + "duration": "20.411812020202014", + "name": "smoothness.gpu_rasterization.tough_filters_cases/Filter_Terrain_SVG" + }, + { + "duration": "22.643603414141424", + "name": "smoothness.gpu_rasterization.tough_filters_cases/IE_PirateMark" + }, + { + "duration": "24.276880040404038", + "name": "smoothness.gpu_rasterization.tough_filters_cases/MotionMark_Focus" + }, + { + "duration": "21.01526974747475", + "name": "smoothness.gpu_rasterization.tough_filters_cases/analog_clock_svg" + }, + { + "duration": "20.474046818181833", + "name": "smoothness.gpu_rasterization.tough_filters_cases/filter_terrain_svg" + }, + { + "duration": "22.6473186060606", + "name": "smoothness.gpu_rasterization.tough_filters_cases/ie_pirate_mark" + }, + { + "duration": "24.25458866666666", + "name": "smoothness.gpu_rasterization.tough_filters_cases/motion_mark_focus" + }, + { + "duration": "23.839628040404026", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" + }, + { + "duration": "30.242986141414143", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/IE_Chalkboard" + }, + { + "duration": "20.37391356565657", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" + }, + { + "duration": "20.53186624242425", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" + }, + { + "duration": "23.841815342857142", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "30.247012828571425", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "20.42814494285715", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "20.532602571428573", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "17.14247582828283", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "16.44712222222222", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "14.142111409090901", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "13.17499320707071", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "12.123563222222218", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "11.504543606060606", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "11.19560964141414", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "10.961156656565656", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "10.742628121212114", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "10.617238424242423", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "20.324441030303028", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "16.11219468686869", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "13.745499156565657", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "12.950063570707073", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "11.8738005959596", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "11.34234894444445", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "10.985086328282831", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "10.739527671717173", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "10.530375358585859", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "10.410817717171717", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "17.3357572020202", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "16.152618848484853", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "14.091429414141409", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "13.163994929292922", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "12.13170812626263", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "11.541843308080809", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "11.297391257575761", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "11.031334575757574", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "10.8650795", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "10.708554176767677", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "16.890411363636368", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "15.680348676767677", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "13.696864398989899", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "12.721156424242421", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "11.672293999999999", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "11.149589565656564", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "10.864998398989897", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "10.675917328282827", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "10.414622136363636", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "10.303022520202019", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "20.38223622535211", + "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding" + }, + { + "duration": "20.300442575757575", + "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding.html" + }, + { + "duration": "20.34958869444445", + "name": "smoothness.image_decoding_cases/yuv_decoding" + }, + { + "duration": "20.31548154545455", + "name": "smoothness.image_decoding_cases/yuv_decoding.html" + }, + { + "duration": "18.208548272727267", + "name": "smoothness.key_desktop_move_cases/Maps" + }, + { + "duration": "22.155888737373736", + "name": "smoothness.key_desktop_move_cases/gmail_move" + }, + { + "duration": "25.88235309090909", + "name": "smoothness.key_desktop_move_cases/https://mail.google.com/mail/" + }, + { + "duration": "18.08920923232323", + "name": "smoothness.key_desktop_move_cases/maps_move" + }, + { + "duration": "23.29064065656565", + "name": "smoothness.maps/maps_perf_test" + }, + { + "duration": "19.935566353535364", + "name": "smoothness.top_25_smooth/blogspot" + }, + { + "duration": "14.53010062121212", + "name": "smoothness.top_25_smooth/booking.com" + }, + { + "duration": "12.633459974747478", + "name": "smoothness.top_25_smooth/ebay" + }, + { + "duration": "14.565817873737373", + "name": "smoothness.top_25_smooth/espn" + }, + { + "duration": "12.867916570707074", + "name": "smoothness.top_25_smooth/facebook" + }, + { + "duration": "18.108835232323237", + "name": "smoothness.top_25_smooth/gmail" + }, + { + "duration": "14.997900161616165", + "name": "smoothness.top_25_smooth/google_calendar" + }, + { + "duration": "22.450074696969693", + "name": "smoothness.top_25_smooth/google_docs" + }, + { + "duration": "18.463880575757575", + "name": "smoothness.top_25_smooth/google_image_search" + }, + { + "duration": "19.735771181818176", + "name": "smoothness.top_25_smooth/google_plus" + }, + { + "duration": "12.189356141414137", + "name": "smoothness.top_25_smooth/google_web_search" + }, + { + "duration": "15.282630954545455", + "name": "smoothness.top_25_smooth/linkedin" + }, + { + "duration": "17.823285686868683", + "name": "smoothness.top_25_smooth/pinterest" + }, + { + "duration": "19.778249808080805", + "name": "smoothness.top_25_smooth/techcrunch" + }, + { + "duration": "16.54827975757576", + "name": "smoothness.top_25_smooth/twitter" + }, + { + "duration": "14.980896308080808", + "name": "smoothness.top_25_smooth/weather.com" + }, + { + "duration": "18.481315292929303", + "name": "smoothness.top_25_smooth/wikipedia" + }, + { + "duration": "18.204553020202017", + "name": "smoothness.top_25_smooth/wordpress" + }, + { + "duration": "12.868330353535356", + "name": "smoothness.top_25_smooth/yahoo_answers" + }, + { + "duration": "19.845665737373725", + "name": "smoothness.top_25_smooth/yahoo_games" + }, + { + "duration": "14.733708868686866", + "name": "smoothness.top_25_smooth/yahoo_news" + }, + { + "duration": "15.165889934343442", + "name": "smoothness.top_25_smooth/yahoo_sports" + }, + { + "duration": "17.30555339393939", + "name": "smoothness.top_25_smooth/youtube" + }, + { + "duration": "24.91775478787878", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swiffy72.html" + }, + { + "duration": "21.44169997979798", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swiffy72.html" + }, + { + "duration": "21.44199018181818", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swiffy72.html" + }, + { + "duration": "21.439509606060604", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swiffy72.html" + }, + { + "duration": "21.44348759595961", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swiffy72.html" + }, + { + "duration": "21.440095191919184", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swiffy72.html" + }, + { + "duration": "21.439790959595957", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swiffy72.html" + }, + { + "duration": "21.4542513939394", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swiffy72.html" + }, + { + "duration": "21.442790171717164", + "name": "smoothness.tough_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swiffy72.html" + }, + { + "duration": "21.443221070707075", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swiffy72.html" + }, + { + "duration": "21.438991272727268", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swiffy72.html" + }, + { + "duration": "20.903352967391296", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations" + }, + { + "duration": "21.13422652173913", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "20.9527983030303", + "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations.html" + }, + { + "duration": "21.17523481818182", + "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations_composited_transform.html" + }, + { + "duration": "22.584982413043484", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties" + }, + { + "duration": "22.017078282828283", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties.html" + }, + { + "duration": "22.70349309782608", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties" + }, + { + "duration": "22.122714454545456", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties.html" + }, + { + "duration": "22.735412978260875", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties" + }, + { + "duration": "22.11008733333334", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties.html" + }, + { + "duration": "20.57836281521739", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas" + }, + { + "duration": "20.51365773737374", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas.html" + }, + { + "duration": "20.57207391304348", + "name": "smoothness.tough_animation_cases/balls_javascript_css" + }, + { + "duration": "20.535201666666662", + "name": "smoothness.tough_animation_cases/balls_javascript_css.html" + }, + { + "duration": "24.123352188888894", + "name": "smoothness.tough_animation_cases/balls_svg_animations" + }, + { + "duration": "24.172177606060608", + "name": "smoothness.tough_animation_cases/balls_svg_animations.html" + }, + { + "duration": "19.9429135", + "name": "smoothness.tough_animation_cases/compositor_heavy_animation" + }, + { + "duration": "20.0579541919192", + "name": "smoothness.tough_animation_cases/compositor_heavy_animation.html?N=0200" + }, + { + "duration": "20.226888847826082", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes" + }, + { + "duration": "20.235628313131315", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes.html?N=0316" + }, + { + "duration": "20.521534323232324", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_new_element.html?N=0316" + }, + { + "duration": "20.24841471717172", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_style_element.html?N=0316" + }, + { + "duration": "20.259342323232325", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_class.html?N=0316" + }, + { + "duration": "20.24963306060606", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.259113847826086", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_inline_style" + }, + { + "duration": "20.526225793478268", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_new_element" + }, + { + "duration": "20.223134423913045", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_style_element" + }, + { + "duration": "20.248172315217385", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_updating_class" + }, + { + "duration": "22.274201141414135", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_new_element.html?N=0316" + }, + { + "duration": "21.82822611111111", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_style_element.html?N=0316" + }, + { + "duration": "21.7389234949495", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_class.html?N=0316" + }, + { + "duration": "21.794920868686862", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_inline_style.html?N=0316" + }, + { + "duration": "19.864148402173907", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations" + }, + { + "duration": "19.86564916161617", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations.html?N=0316" + }, + { + "duration": "21.760425304347827", + "name": "smoothness.tough_animation_cases/css_animations_staggered_inline_style" + }, + { + "duration": "22.29487861956521", + "name": "smoothness.tough_animation_cases/css_animations_staggered_new_element" + }, + { + "duration": "21.828192565217385", + "name": "smoothness.tough_animation_cases/css_animations_staggered_style_element" + }, + { + "duration": "22.310863686868686", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_new_element.html?N=0316" + }, + { + "duration": "21.192622999999994", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_style_element.html?N=0316" + }, + { + "duration": "21.814721101010097", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_class.html?N=0316" + }, + { + "duration": "21.810132363636367", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_inline_style.html?N=0316" + }, + { + "duration": "21.721159945652175", + "name": "smoothness.tough_animation_cases/css_animations_staggered_updating_class" + }, + { + "duration": "21.81260188043478", + "name": "smoothness.tough_animation_cases/css_animations_triggered_inline_style" + }, + { + "duration": "22.333697771739136", + "name": "smoothness.tough_animation_cases/css_animations_triggered_new_element" + }, + { + "duration": "21.14867769565218", + "name": "smoothness.tough_animation_cases/css_animations_triggered_style_element" + }, + { + "duration": "21.8100679673913", + "name": "smoothness.tough_animation_cases/css_animations_triggered_updating_class" + }, + { + "duration": "20.284229793478254", + "name": "smoothness.tough_animation_cases/css_transitions_inline_style" + }, + { + "duration": "20.573856326086954", + "name": "smoothness.tough_animation_cases/css_transitions_new_element" + }, + { + "duration": "20.574662070707074", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_new_element.html?N=0316" + }, + { + "duration": "20.270241636363636", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_style_element.html?N=0316" + }, + { + "duration": "20.26761302020202", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_class.html?N=0316" + }, + { + "duration": "20.280667313131314", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.72853118181818", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_new_element.html?N=0316" + }, + { + "duration": "20.497436606060607", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_style_element.html?N=0316" + }, + { + "duration": "20.47505702020202", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_class.html?N=0316" + }, + { + "duration": "20.47774307070706", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.47250620652175", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_inline_style" + }, + { + "duration": "20.753527695652178", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_new_element" + }, + { + "duration": "20.502171902173913", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_style_element" + }, + { + "duration": "21.039846626262623", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_new_element.html?N=0316" + }, + { + "duration": "20.937107606060604", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_style_element.html?N=0316" + }, + { + "duration": "21.007276595959603", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_class.html?N=0316" + }, + { + "duration": "20.972345181818184", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.468860260869565", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_updating_class" + }, + { + "duration": "20.27774765217391", + "name": "smoothness.tough_animation_cases/css_transitions_style_element" + }, + { + "duration": "20.942116934782604", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_inline_style" + }, + { + "duration": "21.016523184782606", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_new_element" + }, + { + "duration": "20.88388351086957", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_style_element" + }, + { + "duration": "21.004562402173914", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_updating_class" + }, + { + "duration": "20.274520445652175", + "name": "smoothness.tough_animation_cases/css_transitions_updating_class" + }, + { + "duration": "20.03233319565218", + "name": "smoothness.tough_animation_cases/css_value_type_color" + }, + { + "duration": "20.0444776969697", + "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=css_animations&N=0316" + }, + { + "duration": "20.04287793939394", + "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=web_animations&N=0316" + }, + { + "duration": "20.03881641304348", + "name": "smoothness.tough_animation_cases/css_value_type_filter" + }, + { + "duration": "20.0475467979798", + "name": "smoothness.tough_animation_cases/css_value_type_filter.html?api=css_animations&N=0316" + }, + { + "duration": "20.19783940217391", + "name": "smoothness.tough_animation_cases/css_value_type_length" + }, + { + "duration": "20.14742607070708", + "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=css_animations&N=0316" + }, + { + "duration": "20.197846535353527", + "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=web_animations&N=0316" + }, + { + "duration": "20.25698415217391", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex" + }, + { + "duration": "20.242464676767685", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=css_animations&N=0316" + }, + { + "duration": "20.21956780808081", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=web_animations&N=0316" + }, + { + "duration": "20.19358676086956", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple" + }, + { + "duration": "20.220522929292933", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=css_animations&N=0316" + }, + { + "duration": "20.213422222222214", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=web_animations&N=0316" + }, + { + "duration": "20.33405154347826", + "name": "smoothness.tough_animation_cases/css_value_type_path" + }, + { + "duration": "20.339338616161612", + "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=css_animations&N=0316" + }, + { + "duration": "20.358055101010116", + "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=web_animations&N=0316" + }, + { + "duration": "20.316900945652183", + "name": "smoothness.tough_animation_cases/css_value_type_shadow" + }, + { + "duration": "20.355379131313125", + "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=css_animations&N=0316" + }, + { + "duration": "20.320072212121215", + "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=web_animations&N=0316" + }, + { + "duration": "20.203790760869566", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex" + }, + { + "duration": "20.183024252525257", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=css_animations&N=0316" + }, + { + "duration": "20.171757969696966", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=web_animations&N=0316" + }, + { + "duration": "20.14948405434782", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple" + }, + { + "duration": "20.164942202020196", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=css_animations&N=0316" + }, + { + "duration": "20.170094464646468", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=web_animations&N=0316" + }, + { + "duration": "19.792354489130435", + "name": "smoothness.tough_animation_cases/keyframed_animations" + }, + { + "duration": "19.768633535353537", + "name": "smoothness.tough_animation_cases/keyframed_animations.html" + }, + { + "duration": "20.01318183695652", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference" + }, + { + "duration": "19.989626313131318", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference.html" + }, + { + "duration": "20.034511467391294", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue" + }, + { + "duration": "20.006769131313128", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue.html" + }, + { + "duration": "20.353346206521753", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "20.013782076086954", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen" + }, + { + "duration": "20.068753060606063", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen.html" + }, + { + "duration": "20.342296040404044", + "name": "smoothness.tough_animation_cases/mix_blend_mode_propagating_isolation.html" + }, + { + "duration": "24.671502505050494", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions.html" + }, + { + "duration": "24.720009978260883", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions_page" + }, + { + "duration": "19.96053470707071", + "name": "smoothness.tough_animation_cases/transform_transition_js_block.html" + }, + { + "duration": "19.895497782608697", + "name": "smoothness.tough_animation_cases/transform_transitions" + }, + { + "duration": "19.926345101010106", + "name": "smoothness.tough_animation_cases/transform_transitions.html" + }, + { + "duration": "19.937576206521744", + "name": "smoothness.tough_animation_cases/transform_transitions_js_block" + }, + { + "duration": "20.02162639130435", + "name": "smoothness.tough_animation_cases/web_animation_value_type_color" + }, + { + "duration": "20.189894630434786", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_3d" + }, + { + "duration": "20.212178913043484", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_complex" + }, + { + "duration": "20.217707576086955", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_simple" + }, + { + "duration": "20.334150456521737", + "name": "smoothness.tough_animation_cases/web_animation_value_type_path" + }, + { + "duration": "20.336345141304346", + "name": "smoothness.tough_animation_cases/web_animation_value_type_shadow" + }, + { + "duration": "20.178834760869567", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_complex" + }, + { + "duration": "20.143617010869562", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_simple" + }, + { + "duration": "20.750772728260873", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes" + }, + { + "duration": "20.746752848484846", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes.html?N=0316" + }, + { + "duration": "20.213020217391296", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time" + }, + { + "duration": "20.228195000000003", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time_in_raf.html?N=0316" + }, + { + "duration": "20.383370239130443", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous" + }, + { + "duration": "20.396083787878794", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous.html?N=0316" + }, + { + "duration": "21.663570706521735", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining" + }, + { + "duration": "21.664351161616167", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining.html?N=0316" + }, + { + "duration": "19.872156728260872", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations" + }, + { + "duration": "19.900486020202024", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations.html?N=0316" + }, + { + "duration": "21.605842272727262", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering.html?N=0316" + }, + { + "duration": "21.616151184782613", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering_page" + }, + { + "duration": "17.768415808080817", + "name": "smoothness.tough_canvas_cases/../../../chrome/test/data/perf/canvas_bench/many_images.html" + }, + { + "duration": "14.808219515625003", + "name": "smoothness.tough_canvas_cases/bouncing_balls_15" + }, + { + "duration": "15.606247119791668", + "name": "smoothness.tough_canvas_cases/bouncing_balls_shadow" + }, + { + "duration": "15.345823609375003", + "name": "smoothness.tough_canvas_cases/bouncing_clipped_rectangles" + }, + { + "duration": "15.196848192708325", + "name": "smoothness.tough_canvas_cases/bouncing_gradient_circles" + }, + { + "duration": "14.488212468749994", + "name": "smoothness.tough_canvas_cases/bouncing_png_images" + }, + { + "duration": "22.512596322916675", + "name": "smoothness.tough_canvas_cases/bouncing_svg_images" + }, + { + "duration": "14.915075906249994", + "name": "smoothness.tough_canvas_cases/canvas_animation_no_clear" + }, + { + "duration": "15.197715671875", + "name": "smoothness.tough_canvas_cases/canvas_arcs" + }, + { + "duration": "15.048356286458331", + "name": "smoothness.tough_canvas_cases/canvas_font_cycler" + }, + { + "duration": "15.018446374999995", + "name": "smoothness.tough_canvas_cases/canvas_lines" + }, + { + "duration": "14.969856312500005", + "name": "smoothness.tough_canvas_cases/canvas_to_blob" + }, + { + "duration": "14.94765499479167", + "name": "smoothness.tough_canvas_cases/chip_tune" + }, + { + "duration": "15.079996718750003", + "name": "smoothness.tough_canvas_cases/crafty_mind" + }, + { + "duration": "15.001660312500002", + "name": "smoothness.tough_canvas_cases/effect_games" + }, + { + "duration": "15.129337838541668", + "name": "smoothness.tough_canvas_cases/fill_shapes" + }, + { + "duration": "19.941869374999992", + "name": "smoothness.tough_canvas_cases/geo_apis" + }, + { + "duration": "14.783893036458332", + "name": "smoothness.tough_canvas_cases/hakim" + }, + { + "duration": "19.936262080808074", + "name": "smoothness.tough_canvas_cases/http://geoapis.appspot.com/agdnZW9hcGlzchMLEgtFeGFtcGxlQ29kZRjh1wIM" + }, + { + "duration": "14.777787121212121", + "name": "smoothness.tough_canvas_cases/http://hakim.se/experiments/html5/magnetic/02/" + }, + { + "duration": "14.869835707070706", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/TweetMap/Default.html" + }, + { + "duration": "15.08916946464647", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/VideoCity/Default.html" + }, + { + "duration": "15.166140661616158", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/WorkerFountains/Default.html" + }, + { + "duration": "15.21106178787879", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/AsteroidBelt/Default.html" + }, + { + "duration": "15.044642934343441", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html" + }, + { + "duration": "14.98181592929293", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/LetItSnow/" + }, + { + "duration": "14.805394691919195", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/SpeedReading/Default.html" + }, + { + "duration": "15.695845747474745", + "name": "smoothness.tough_canvas_cases/http://jarrodoverson.com/static/demos/particleSystem/" + }, + { + "duration": "14.764163343434348", + "name": "smoothness.tough_canvas_cases/http://mix10k.visitmix.com/Entry/Details/169" + }, + { + "duration": "14.597453297979799", + "name": "smoothness.tough_canvas_cases/http://runway.countlessprojects.com/prototype/performance_test.html" + }, + { + "duration": "14.797391656565653", + "name": "smoothness.tough_canvas_cases/http://spielzeugz.de/html5/liquid-particles.html" + }, + { + "duration": "15.041882757575753", + "name": "smoothness.tough_canvas_cases/http://themaninblue.com/experiment/AnimationBenchmark/canvas/" + }, + { + "duration": "14.954296141414146", + "name": "smoothness.tough_canvas_cases/http://www.chiptune.com/starfield/starfield.html" + }, + { + "duration": "15.066830510101008", + "name": "smoothness.tough_canvas_cases/http://www.craftymind.com/factory/guimark2/HTML5ChartingTest.html" + }, + { + "duration": "14.997454722222225", + "name": "smoothness.tough_canvas_cases/http://www.effectgames.com/demos/canvascycle/" + }, + { + "duration": "14.915380909090903", + "name": "smoothness.tough_canvas_cases/http://www.kevs3d.co.uk/dev/canvask3d/k3d_test.html" + }, + { + "duration": "14.79790344444445", + "name": "smoothness.tough_canvas_cases/http://www.megidish.net/awjs/" + }, + { + "duration": "15.165086646464646", + "name": "smoothness.tough_canvas_cases/http://www.smashcat.org/av/canvas_test/" + }, + { + "duration": "15.662225046874992", + "name": "smoothness.tough_canvas_cases/jarro_doverson" + }, + { + "duration": "14.907924354166669", + "name": "smoothness.tough_canvas_cases/kevs_3d" + }, + { + "duration": "15.052660713541663", + "name": "smoothness.tough_canvas_cases/man_in_blue" + }, + { + "duration": "17.758839052083342", + "name": "smoothness.tough_canvas_cases/many_images" + }, + { + "duration": "14.804532375000003", + "name": "smoothness.tough_canvas_cases/megi_dish" + }, + { + "duration": "15.210572541666663", + "name": "smoothness.tough_canvas_cases/microsoft_asteroid_belt" + }, + { + "duration": "15.060929411458334", + "name": "smoothness.tough_canvas_cases/microsoft_fish_ie_tank" + }, + { + "duration": "14.968275921874998", + "name": "smoothness.tough_canvas_cases/microsoft_snow" + }, + { + "duration": "14.815367156250003", + "name": "smoothness.tough_canvas_cases/microsoft_speed_reading" + }, + { + "duration": "14.867798963541665", + "name": "smoothness.tough_canvas_cases/microsoft_tweet_map" + }, + { + "duration": "15.072583161458331", + "name": "smoothness.tough_canvas_cases/microsoft_video_city" + }, + { + "duration": "15.189079479166667", + "name": "smoothness.tough_canvas_cases/microsoft_worker_fountains" + }, + { + "duration": "14.758045348958335", + "name": "smoothness.tough_canvas_cases/mix_10k" + }, + { + "duration": "15.45450038020833", + "name": "smoothness.tough_canvas_cases/put_get_image_data" + }, + { + "duration": "14.602822624999996", + "name": "smoothness.tough_canvas_cases/runway" + }, + { + "duration": "15.180839114583328", + "name": "smoothness.tough_canvas_cases/smash_cat" + }, + { + "duration": "14.80434155729167", + "name": "smoothness.tough_canvas_cases/spielzeugz" + }, + { + "duration": "15.433354427083332", + "name": "smoothness.tough_canvas_cases/stroke_shapes" + }, + { + "duration": "14.89204836363637", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-animation-no-clear.html" + }, + { + "duration": "15.076092196969698", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-font-cycler.html" + }, + { + "duration": "15.605042479797977", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=image_with_shadow&back=image" + }, + { + "duration": "14.804676792929294", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=text&back=white&ball_count=15" + }, + { + "duration": "15.012353227272724", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas_toBlob.html" + }, + { + "duration": "15.218255712121216", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_clipped_rectangles.html" + }, + { + "duration": "15.108757898989902", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_gradient_circles.html" + }, + { + "duration": "14.482349616161612", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_png_images.html" + }, + { + "duration": "22.93874121212122", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_svg_images.html" + }, + { + "duration": "15.196256954545452", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_arcs.html" + }, + { + "duration": "14.987003525252526", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_lines.html" + }, + { + "duration": "15.149658409090902", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/fill_shapes.html" + }, + { + "duration": "15.507090883838382", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/put_get_image_data.html" + }, + { + "duration": "15.355054313131316", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/stroke_shapes.html" + }, + { + "duration": "20.787400888888882", + "name": "smoothness.tough_filters_cases/Analog_Clock_SVG" + }, + { + "duration": "21.358625303030305", + "name": "smoothness.tough_filters_cases/Filter_Terrain_SVG" + }, + { + "duration": "22.650088969696974", + "name": "smoothness.tough_filters_cases/IE_PirateMark" + }, + { + "duration": "24.12011608080809", + "name": "smoothness.tough_filters_cases/MotionMark_Focus" + }, + { + "duration": "20.759375717171714", + "name": "smoothness.tough_filters_cases/analog_clock_svg" + }, + { + "duration": "21.5079272929293", + "name": "smoothness.tough_filters_cases/filter_terrain_svg" + }, + { + "duration": "22.63549702020202", + "name": "smoothness.tough_filters_cases/ie_pirate_mark" + }, + { + "duration": "24.30278835353535", + "name": "smoothness.tough_filters_cases/motion_mark_focus" + }, + { + "duration": "14.148082036764704", + "name": "smoothness.tough_image_decode_cases/cats_unscaled" + }, + { + "duration": "9.66632980147059", + "name": "smoothness.tough_image_decode_cases/cats_viewport_width" + }, + { + "duration": "14.14271379797979", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-unscaled.html" + }, + { + "duration": "9.664845964646469", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-viewport-width.html" + }, + { + "duration": "23.843851606060607", + "name": "smoothness.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" + }, + { + "duration": "30.21104044444445", + "name": "smoothness.tough_path_rendering_cases/IE_Chalkboard" + }, + { + "duration": "20.35407924242424", + "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" + }, + { + "duration": "20.534400464646456", + "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" + }, + { + "duration": "23.842813262626255", + "name": "smoothness.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "30.20381356565658", + "name": "smoothness.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "20.45524967676768", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "20.537225757575758", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "17.12932946464646", + "name": "smoothness.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "16.54627448484848", + "name": "smoothness.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "14.233739737373739", + "name": "smoothness.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "13.226690520202022", + "name": "smoothness.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "12.154711090909087", + "name": "smoothness.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "11.519699020202024", + "name": "smoothness.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "11.213924722222222", + "name": "smoothness.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "10.96577389393939", + "name": "smoothness.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "10.761736550505054", + "name": "smoothness.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "10.6190921010101", + "name": "smoothness.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "20.25141578787879", + "name": "smoothness.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "16.32589770707071", + "name": "smoothness.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "13.869050671717169", + "name": "smoothness.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "12.998929570707064", + "name": "smoothness.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "11.897682161616165", + "name": "smoothness.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "11.35695872222222", + "name": "smoothness.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "10.993125060606062", + "name": "smoothness.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "10.745017651515157", + "name": "smoothness.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "10.520924272727271", + "name": "smoothness.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "10.417352383838383", + "name": "smoothness.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "17.591325727272725", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "16.45245946464647", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "14.349151989898994", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "13.288043464646469", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "12.256571202020206", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "11.764427696969696", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "11.420043868686873", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "11.177161070707072", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "10.996843419191917", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "10.875151873737373", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "16.865849666666666", + "name": "smoothness.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "15.872487651515156", + "name": "smoothness.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "13.764416444444437", + "name": "smoothness.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "12.747078040404034", + "name": "smoothness.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "11.691188686868687", + "name": "smoothness.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "11.163073555555558", + "name": "smoothness.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "10.86681951010101", + "name": "smoothness.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "10.645596595959596", + "name": "smoothness.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "10.437779868686869", + "name": "smoothness.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "10.300580505050506", + "name": "smoothness.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "23.922379884615378", + "name": "smoothness.tough_texture_upload_cases/background_color_animation" + }, + { + "duration": "24.004332424242424", + "name": "smoothness.tough_texture_upload_cases/background_color_animation.html" + }, + { + "duration": "21.84528165384615", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient" + }, + { + "duration": "21.808753939393945", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient.html" + }, + { + "duration": "20.583305769230773", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads" + }, + { + "duration": "20.669083989898983", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads.html" + }, + { + "duration": "20.63105373076923", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads" + }, + { + "duration": "20.576341919191915", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads.html" + }, + { + "duration": "20.138191192307694", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads" + }, + { + "duration": "20.183497121212124", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads.html" + }, + { + "duration": "20.101261192307692", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads" + }, + { + "duration": "20.14211559595959", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads.html" + }, + { + "duration": "25.059494191919192", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swf.webglbeta.html" + }, + { + "duration": "21.473821010101002", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swf.webglbeta.html" + }, + { + "duration": "21.47239201010101", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swf.webglbeta.html" + }, + { + "duration": "21.47250356565657", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swf.webglbeta.html" + }, + { + "duration": "21.47336034343435", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swf.webglbeta.html" + }, + { + "duration": "21.47264306060606", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swf.webglbeta.html" + }, + { + "duration": "21.473782060606062", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swf.webglbeta.html" + }, + { + "duration": "21.487972545454543", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swf.webglbeta.html" + }, + { + "duration": "21.4743682929293", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swf.webglbeta.html" + }, + { + "duration": "21.469532737373743", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swf.webglbeta.html" + }, + { + "duration": "21.46815470707071", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swf.webglbeta.html" + }, + { + "duration": "17.314080044444434", + "name": "smoothness.tough_webgl_cases/animometer_webgl" + }, + { + "duration": "18.104231347368426", + "name": "smoothness.tough_webgl_cases/aquarium" + }, + { + "duration": "18.90497780808081", + "name": "smoothness.tough_webgl_cases/aquarium_20k" + }, + { + "duration": "17.365349442105263", + "name": "smoothness.tough_webgl_cases/blob" + }, + { + "duration": "17.34432122105263", + "name": "smoothness.tough_webgl_cases/dynamic_cube_map" + }, + { + "duration": "17.038802915789475", + "name": "smoothness.tough_webgl_cases/earth" + }, + { + "duration": "17.351708050505056", + "name": "smoothness.tough_webgl_cases/http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html" + }, + { + "duration": "18.094333434343437", + "name": "smoothness.tough_webgl_cases/http://webglsamples.org/aquarium/aquarium.html" + }, + { + "duration": "17.38370525252525", + "name": "smoothness.tough_webgl_cases/http://webglsamples.org/blob/blob.html" + }, + { + "duration": "17.336661696969692", + "name": "smoothness.tough_webgl_cases/http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html" + }, + { + "duration": "21.151986636363635", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html" + }, + { + "duration": "17.08093548484848", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html" + }, + { + "duration": "17.058114747474747", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html" + }, + { + "duration": "17.04446721212122", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html" + }, + { + "duration": "17.09087928282828", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html" + }, + { + "duration": "17.2537606", + "name": "smoothness.tough_webgl_cases/ken_russell" + }, + { + "duration": "17.088185831578954", + "name": "smoothness.tough_webgl_cases/many_planets_deep" + }, + { + "duration": "21.146107357894735", + "name": "smoothness.tough_webgl_cases/nvidia_vertex_buffer_object" + }, + { + "duration": "17.087269263157893", + "name": "smoothness.tough_webgl_cases/particles" + }, + { + "duration": "17.066962877777772", + "name": "smoothness.tough_webgl_cases/san_angeles" + }, + { + "duration": "17.037511000000002", + "name": "smoothness.tough_webgl_cases/sans_angeles" + }, + { + "duration": "36.96003363636363", + "name": "speedometer-future/http://browserbench.org/Speedometer/" + }, + { + "duration": "36.3278006060606", + "name": "speedometer/http://browserbench.org/Speedometer/" + }, + { + "duration": "67.76897649494948", + "name": "speedometer2-future/Speedometer2" + }, + { + "duration": "66.60333626262626", + "name": "speedometer2/Speedometer2" + }, + { + "duration": "76.67872569696968", + "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "121.24197360606055", + "name": "system_health.common_desktop/browse:media:imgur" + }, + { + "duration": "72.36187433333335", + "name": "system_health.common_desktop/browse:media:pinterest" + }, + { + "duration": "79.04552226262628", + "name": "system_health.common_desktop/browse:media:youtube" + }, + { + "duration": "71.28028863636361", + "name": "system_health.common_desktop/browse:news:cnn" + }, + { + "duration": "58.81745221212126", + "name": "system_health.common_desktop/browse:news:flipboard" + }, + { + "duration": "54.244679373737384", + "name": "system_health.common_desktop/browse:news:hackernews" + }, + { + "duration": "83.39761588888891", + "name": "system_health.common_desktop/browse:news:nytimes" + }, + { + "duration": "62.86913490909091", + "name": "system_health.common_desktop/browse:news:reddit" + }, + { + "duration": "52.94349540404042", + "name": "system_health.common_desktop/browse:search:google" + }, + { + "duration": "39.97517867676767", + "name": "system_health.common_desktop/browse:search:google_india" + }, + { + "duration": "75.28567430303029", + "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "88.19985842424242", + "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "52.240674424242414", + "name": "system_health.common_desktop/browse:social:twitter" + }, + { + "duration": "95.95764120833329", + "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll" + }, + { + "duration": "78.60529672727272", + "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "84.08133367676766", + "name": "system_health.common_desktop/browse:tools:earth" + }, + { + "duration": "61.130941131313136", + "name": "system_health.common_desktop/browse:tools:maps" + }, + { + "duration": "24.576643555555563", + "name": "system_health.common_desktop/browse_accessibility:tech:codesearch" + }, + { + "duration": "21.046679686868693", + "name": "system_health.common_desktop/load:chrome:blank" + }, + { + "duration": "22.145185777777776", + "name": "system_health.common_desktop/load:games:alphabetty" + }, + { + "duration": "23.67985557575758", + "name": "system_health.common_desktop/load:games:bubbles" + }, + { + "duration": "21.62803712121212", + "name": "system_health.common_desktop/load:games:lazors" + }, + { + "duration": "24.736211505050505", + "name": "system_health.common_desktop/load:games:miniclip" + }, + { + "duration": "28.03810718181818", + "name": "system_health.common_desktop/load:games:spychase" + }, + { + "duration": "27.324124717171724", + "name": "system_health.common_desktop/load:media:9gag" + }, + { + "duration": "23.557653151515158", + "name": "system_health.common_desktop/load:media:dailymotion" + }, + { + "duration": "22.531519707070714", + "name": "system_health.common_desktop/load:media:google_images" + }, + { + "duration": "27.083109656565675", + "name": "system_health.common_desktop/load:media:imgur" + }, + { + "duration": "26.858579333333324", + "name": "system_health.common_desktop/load:media:soundcloud" + }, + { + "duration": "24.62107472727273", + "name": "system_health.common_desktop/load:media:youtube" + }, + { + "duration": "22.861999878787877", + "name": "system_health.common_desktop/load:news:bbc" + }, + { + "duration": "26.990475070707063", + "name": "system_health.common_desktop/load:news:cnn" + }, + { + "duration": "23.327439313131322", + "name": "system_health.common_desktop/load:news:flipboard" + }, + { + "duration": "21.446268555555555", + "name": "system_health.common_desktop/load:news:hackernews" + }, + { + "duration": "25.535513797979785", + "name": "system_health.common_desktop/load:news:nytimes" + }, + { + "duration": "26.32688023232323", + "name": "system_health.common_desktop/load:news:qq" + }, + { + "duration": "22.280676090909086", + "name": "system_health.common_desktop/load:news:reddit" + }, + { + "duration": "22.665062434343422", + "name": "system_health.common_desktop/load:news:wikipedia" + }, + { + "duration": "23.42263766666666", + "name": "system_health.common_desktop/load:search:amazon" + }, + { + "duration": "21.886297030303016", + "name": "system_health.common_desktop/load:search:baidu" + }, + { + "duration": "23.79620345454546", + "name": "system_health.common_desktop/load:search:ebay" + }, + { + "duration": "22.07372888888889", + "name": "system_health.common_desktop/load:search:google" + }, + { + "duration": "22.996056222222222", + "name": "system_health.common_desktop/load:search:taobao" + }, + { + "duration": "21.968365333333335", + "name": "system_health.common_desktop/load:search:yahoo" + }, + { + "duration": "21.676538060606063", + "name": "system_health.common_desktop/load:search:yandex" + }, + { + "duration": "23.44005217171717", + "name": "system_health.common_desktop/load:social:instagram" + }, + { + "duration": "24.075501636363633", + "name": "system_health.common_desktop/load:social:pinterest" + }, + { + "duration": "22.94602522222222", + "name": "system_health.common_desktop/load:social:vk" + }, + { + "duration": "41.774955020202", + "name": "system_health.common_desktop/load:tools:docs" + }, + { + "duration": "25.63268093939394", + "name": "system_health.common_desktop/load:tools:drive" + }, + { + "duration": "23.87117884848485", + "name": "system_health.common_desktop/load:tools:dropbox" + }, + { + "duration": "26.97938065656564", + "name": "system_health.common_desktop/load:tools:gmail" + }, + { + "duration": "22.747195212121202", + "name": "system_health.common_desktop/load:tools:stackoverflow" + }, + { + "duration": "26.645314484848488", + "name": "system_health.common_desktop/load:tools:weather" + }, + { + "duration": "22.405156707070706", + "name": "system_health.common_desktop/load_accessibility:media:wikipedia" + }, + { + "duration": "27.137511080808075", + "name": "system_health.common_desktop/load_accessibility:shopping:amazon" + }, + { + "duration": "136.52944101010095", + "name": "system_health.common_desktop/long_running:tools:gmail-background" + }, + { + "duration": "280.19436", + "name": "system_health.common_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "133.83365631313129", + "name": "system_health.common_desktop/multitab:misc:typical24" + }, + { + "duration": "55.00632265656565", + "name": "system_health.common_desktop/play:media:soundcloud" + }, + { + "duration": "191.8392046868687", + "name": "system_health.memory_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "210.6119953434344", + "name": "system_health.memory_desktop/browse:media:imgur" + }, + { + "duration": "191.8641830707071", + "name": "system_health.memory_desktop/browse:media:pinterest" + }, + { + "duration": "188.02559612121206", + "name": "system_health.memory_desktop/browse:media:youtube" + }, + { + "duration": "133.81533107070706", + "name": "system_health.memory_desktop/browse:news:cnn" + }, + { + "duration": "148.65129583333334", + "name": "system_health.memory_desktop/browse:news:flipboard" + }, + { + "duration": "145.739194020202", + "name": "system_health.memory_desktop/browse:news:hackernews" + }, + { + "duration": "153.64492102020202", + "name": "system_health.memory_desktop/browse:news:nytimes" + }, + { + "duration": "154.46334791919193", + "name": "system_health.memory_desktop/browse:news:reddit" + }, + { + "duration": "145.23534224242422", + "name": "system_health.memory_desktop/browse:search:google" + }, + { + "duration": "111.73554273737373", + "name": "system_health.memory_desktop/browse:search:google_india" + }, + { + "duration": "191.0492484444445", + "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "194.62300178787876", + "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "140.33146165656566", + "name": "system_health.memory_desktop/browse:social:twitter" + }, + { + "duration": "189.0489345353535", + "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "162.9880749292929", + "name": "system_health.memory_desktop/browse:tools:earth" + }, + { + "duration": "154.07877327777783", + "name": "system_health.memory_desktop/browse:tools:maps" + }, + { + "duration": "67.7851621919192", + "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch" + }, + { + "duration": "58.95244601010099", + "name": "system_health.memory_desktop/load:chrome:blank" + }, + { + "duration": "60.81261883838385", + "name": "system_health.memory_desktop/load:games:alphabetty" + }, + { + "duration": "60.65667155555553", + "name": "system_health.memory_desktop/load:games:bubbles" + }, + { + "duration": "60.57881822222222", + "name": "system_health.memory_desktop/load:games:lazors" + }, + { + "duration": "62.32931465656566", + "name": "system_health.memory_desktop/load:games:miniclip" + }, + { + "duration": "72.13860814141412", + "name": "system_health.memory_desktop/load:games:spychase" + }, + { + "duration": "66.77577835353534", + "name": "system_health.memory_desktop/load:media:9gag" + }, + { + "duration": "62.80401609090909", + "name": "system_health.memory_desktop/load:media:dailymotion" + }, + { + "duration": "62.338266313131335", + "name": "system_health.memory_desktop/load:media:google_images" + }, + { + "duration": "69.14631528282827", + "name": "system_health.memory_desktop/load:media:imgur" + }, + { + "duration": "65.64129555555553", + "name": "system_health.memory_desktop/load:media:soundcloud" + }, + { + "duration": "63.5307795959596", + "name": "system_health.memory_desktop/load:media:youtube" + }, + { + "duration": "62.333623010101014", + "name": "system_health.memory_desktop/load:news:bbc" + }, + { + "duration": "66.88744265656565", + "name": "system_health.memory_desktop/load:news:cnn" + }, + { + "duration": "62.28181853535352", + "name": "system_health.memory_desktop/load:news:flipboard" + }, + { + "duration": "59.90402814141413", + "name": "system_health.memory_desktop/load:news:hackernews" + }, + { + "duration": "63.38186861616164", + "name": "system_health.memory_desktop/load:news:nytimes" + }, + { + "duration": "68.04600671717172", + "name": "system_health.memory_desktop/load:news:qq" + }, + { + "duration": "61.09901136363637", + "name": "system_health.memory_desktop/load:news:reddit" + }, + { + "duration": "63.11741076767677", + "name": "system_health.memory_desktop/load:news:wikipedia" + }, + { + "duration": "62.41451313131313", + "name": "system_health.memory_desktop/load:search:amazon" + }, + { + "duration": "60.46729978787877", + "name": "system_health.memory_desktop/load:search:baidu" + }, + { + "duration": "62.91541713131314", + "name": "system_health.memory_desktop/load:search:ebay" + }, + { + "duration": "60.497078262626275", + "name": "system_health.memory_desktop/load:search:google" + }, + { + "duration": "62.6532396868687", + "name": "system_health.memory_desktop/load:search:taobao" + }, + { + "duration": "61.46907002020204", + "name": "system_health.memory_desktop/load:search:yahoo" + }, + { + "duration": "60.23818922222223", + "name": "system_health.memory_desktop/load:search:yandex" + }, + { + "duration": "63.64444764646462", + "name": "system_health.memory_desktop/load:social:instagram" + }, + { + "duration": "65.66855831313129", + "name": "system_health.memory_desktop/load:social:pinterest" + }, + { + "duration": "63.118012222222205", + "name": "system_health.memory_desktop/load:social:vk" + }, + { + "duration": "68.36755625252526", + "name": "system_health.memory_desktop/load:tools:docs" + }, + { + "duration": "65.99812967676768", + "name": "system_health.memory_desktop/load:tools:drive" + }, + { + "duration": "62.90435249494949", + "name": "system_health.memory_desktop/load:tools:dropbox" + }, + { + "duration": "68.15091376767677", + "name": "system_health.memory_desktop/load:tools:gmail" + }, + { + "duration": "62.614085303030315", + "name": "system_health.memory_desktop/load:tools:stackoverflow" + }, + { + "duration": "65.56405229292929", + "name": "system_health.memory_desktop/load:tools:weather" + }, + { + "duration": "60.760334474747495", + "name": "system_health.memory_desktop/load_accessibility:media:wikipedia" + }, + { + "duration": "66.00557613043476", + "name": "system_health.memory_desktop/load_accessibility:shopping:amazon" + }, + { + "duration": "467.81783616161624", + "name": "system_health.memory_desktop/long_running:tools:gmail-background" + }, + { + "duration": "459.40734888888875", + "name": "system_health.memory_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "261.983623625", + "name": "system_health.memory_desktop/multitab:misc:typical24" + }, + { + "duration": "135.29524043434344", + "name": "system_health.memory_desktop/play:media:soundcloud" + }, + { + "duration": "87.18211047474745", + "name": "tab_switching.typical_25/multitab:misc:typical24" + }, + { + "duration": "29.436424080808077", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/beqojupo/1/quiet?JS_FULL_SCREEN_INVALIDATION" + }, + { + "duration": "27.00285120202021", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/covoqi/1/quiet?NEW_TILINGS" + }, + { + "duration": "24.70466486868686", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/falefice/1/quiet?CC_POSTER_CIRCLE" + }, + { + "duration": "25.67217312121212", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/giqafofe/1/quiet?JS_POSTER_CIRCLE" + }, + { + "duration": "23.32653614141415", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/jevibahi/4/quiet?JS_SCROLL_200_LAYER_GRID" + }, + { + "duration": "20.84407733333333", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/pixavefe/1/quiet?CC_SCROLL_TEXT_ONLY" + }, + { + "duration": "23.38404228282829", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/wixadinu/2/quiet?JS_SCROLL_TEXT_ONLY" + }, + { + "duration": "23.197974484848494", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/yakagevo/1/quiet?CC_SCROLL_200_LAYER_GRID" + }, + { + "duration": "19.20453112121212", + "name": "thread_times.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "18.593096131313136", + "name": "thread_times.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "15.542592833333336", + "name": "thread_times.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "14.473417191919186", + "name": "thread_times.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "13.072536196969702", + "name": "thread_times.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "12.326094494949498", + "name": "thread_times.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "11.913183409090912", + "name": "thread_times.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "11.602919267676775", + "name": "thread_times.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "11.353168611111116", + "name": "thread_times.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "11.203142469696969", + "name": "thread_times.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "21.836495343434358", + "name": "thread_times.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "17.915813656565657", + "name": "thread_times.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "15.089508323232314", + "name": "thread_times.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "14.02299726262626", + "name": "thread_times.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "12.643663434343436", + "name": "thread_times.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "11.958498550505048", + "name": "thread_times.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "11.570872989898994", + "name": "thread_times.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "11.27581008080808", + "name": "thread_times.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "10.984479207070706", + "name": "thread_times.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "10.89651223232323", + "name": "thread_times.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "21.898506151515154", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "20.112970757575763", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "16.93872719191918", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "15.363544934343437", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "13.769654909090912", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "13.15002786363636", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "12.645586803030305", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "12.173253949494956", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "11.800098732323232", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "11.618835020202019", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "18.524899404040404", + "name": "thread_times.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "17.3600461010101", + "name": "thread_times.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "15.045849540404037", + "name": "thread_times.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "13.768269156565651", + "name": "thread_times.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "12.470859030303032", + "name": "thread_times.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "11.770596242424244", + "name": "thread_times.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "11.444632065656565", + "name": "thread_times.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "11.132986176767679", + "name": "thread_times.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "10.823500212121212", + "name": "thread_times.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "10.728312459595955", + "name": "thread_times.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "11.426717964646464", + "name": "tracing.tracing_with_background_memory_infra/Facebook" + }, + { + "duration": "11.759576479797982", + "name": "tracing.tracing_with_background_memory_infra/Wikipedia" + }, + { + "duration": "10.746741919191916", + "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" + }, + { + "duration": "10.821879883838381", + "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" + }, + { + "duration": "10.634965368686867", + "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" + }, + { + "duration": "10.860240398989895", + "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" + }, + { + "duration": "12.959491989898995", + "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" + }, + { + "duration": "14.779482570707076", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "12.997584131313138", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" + }, + { + "duration": "91.06718185858585", + "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll" + }, + { + "duration": "83.76823756565662", + "name": "v8.browsing_desktop-future/browse:media:pinterest" + }, + { + "duration": "94.70160405050504", + "name": "v8.browsing_desktop-future/browse:media:youtube" + }, + { + "duration": "105.118251", + "name": "v8.browsing_desktop-future/browse:news:cnn" + }, + { + "duration": "66.99920689898994", + "name": "v8.browsing_desktop-future/browse:news:flipboard" + }, + { + "duration": "56.58013144444442", + "name": "v8.browsing_desktop-future/browse:news:hackernews" + }, + { + "duration": "114.40318043434345", + "name": "v8.browsing_desktop-future/browse:news:nytimes" + }, + { + "duration": "68.6570255858586", + "name": "v8.browsing_desktop-future/browse:news:reddit" + }, + { + "duration": "58.36616051515153", + "name": "v8.browsing_desktop-future/browse:search:google" + }, + { + "duration": "43.26653487878789", + "name": "v8.browsing_desktop-future/browse:search:google_india" + }, + { + "duration": "95.67638368686869", + "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll" + }, + { + "duration": "108.5780222121212", + "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "58.2650258989899", + "name": "v8.browsing_desktop-future/browse:social:twitter" + }, + { + "duration": "110.5314857878788", + "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll" + }, + { + "duration": "110.89615454545456", + "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "122.17866835353544", + "name": "v8.browsing_desktop-future/browse:tools:earth" + }, + { + "duration": "76.1092180909091", + "name": "v8.browsing_desktop-future/browse:tools:maps" + }, + { + "duration": "91.2406049191919", + "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "83.8131081919192", + "name": "v8.browsing_desktop/browse:media:pinterest" + }, + { + "duration": "95.19226360606056", + "name": "v8.browsing_desktop/browse:media:youtube" + }, + { + "duration": "107.43482177777778", + "name": "v8.browsing_desktop/browse:news:cnn" + }, + { + "duration": "68.07153316161616", + "name": "v8.browsing_desktop/browse:news:flipboard" + }, + { + "duration": "57.409280040404035", + "name": "v8.browsing_desktop/browse:news:hackernews" + }, + { + "duration": "117.69596455555556", + "name": "v8.browsing_desktop/browse:news:nytimes" + }, + { + "duration": "69.79222702020203", + "name": "v8.browsing_desktop/browse:news:reddit" + }, + { + "duration": "58.11876964646465", + "name": "v8.browsing_desktop/browse:search:google" + }, + { + "duration": "43.17046784848486", + "name": "v8.browsing_desktop/browse:search:google_india" + }, + { + "duration": "95.87746853535357", + "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "108.43757472727268", + "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "58.943969818181806", + "name": "v8.browsing_desktop/browse:social:twitter" + }, + { + "duration": "105.6126912", + "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll" + }, + { + "duration": "111.96815661616158", + "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "128.6828720909091", + "name": "v8.browsing_desktop/browse:tools:earth" + }, + { + "duration": "77.1648276868687", + "name": "v8.browsing_desktop/browse:tools:maps" + }, + { + "duration": "107.45361146464643", + "name": "v8.runtime_stats.top_25/AdsAMPAds" + }, + { + "duration": "33.422591555555556", + "name": "v8.runtime_stats.top_25/AdsAMPAds_cold" + }, + { + "duration": "38.47749011111111", + "name": "v8.runtime_stats.top_25/AdsAMPAds_hot" + }, + { + "duration": "35.92237083333333", + "name": "v8.runtime_stats.top_25/AdsAMPAds_warm" + }, + { + "duration": "105.03713353535356", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds" + }, + { + "duration": "32.68502711111111", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold" + }, + { + "duration": "37.50642761111111", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot" + }, + { + "duration": "35.054081666666676", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm" + }, + { + "duration": "101.16722214141411", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage" + }, + { + "duration": "31.524751666666663", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold" + }, + { + "duration": "36.03836138888889", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot" + }, + { + "duration": "33.71432811111111", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm" + }, + { + "duration": "105.14617401010103", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds" + }, + { + "duration": "32.6630115", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold" + }, + { + "duration": "37.57091044444444", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot" + }, + { + "duration": "35.06845044444444", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm" + }, + { + "duration": "102.96467109090909", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots" + }, + { + "duration": "32.12898983333333", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold" + }, + { + "duration": "36.71346511111111", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot" + }, + { + "duration": "34.33260527777778", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm" + }, + { + "duration": "101.62783042424242", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection" + }, + { + "duration": "31.596034611111108", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold" + }, + { + "duration": "36.341203777777785", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot" + }, + { + "duration": "33.99107172222222", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm" + }, + { + "duration": "103.59317928282826", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage" + }, + { + "duration": "32.262319777777776", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold" + }, + { + "duration": "37.053709055555565", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot" + }, + { + "duration": "34.55151916666668", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm" + }, + { + "duration": "102.1280164848485", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage" + }, + { + "duration": "31.804657000000006", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold" + }, + { + "duration": "36.46661900000001", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot" + }, + { + "duration": "34.22243533333334", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm" + }, + { + "duration": "153.99647467676763", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering" + }, + { + "duration": "44.283581833333336", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold" + }, + { + "duration": "70.1249183888889", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot" + }, + { + "duration": "57.042694444444436", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm" + }, + { + "duration": "119.91965323232321", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com" + }, + { + "duration": "35.73236127777778", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold" + }, + { + "duration": "44.27344133333334", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot" + }, + { + "duration": "40.380482111111114", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm" + }, + { + "duration": "103.43620889898992", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0" + }, + { + "duration": "32.06279516666667", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold" + }, + { + "duration": "37.03890961111111", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot" + }, + { + "duration": "34.650541833333335", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm" + }, + { + "duration": "108.62200721212115", + "name": "v8.runtime_stats.top_25/http://inbox.google.com" + }, + { + "duration": "33.54683505555555", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold" + }, + { + "duration": "39.01981399999999", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot" + }, + { + "duration": "36.43551527777778", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm" + }, + { + "duration": "106.96683998989903", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo" + }, + { + "duration": "33.19373933333334", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold" + }, + { + "duration": "39.35967716666667", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot" + }, + { + "duration": "36.739098111111105", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm" + }, + { + "duration": "106.87771525252523", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org" + }, + { + "duration": "32.91878244444445", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold" + }, + { + "duration": "38.29353366666666", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_hot" + }, + { + "duration": "36.00436133333333", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm" + }, + { + "duration": "101.9679467070707", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular" + }, + { + "duration": "31.636245611111107", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold" + }, + { + "duration": "36.36243422222222", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot" + }, + { + "duration": "34.17341188888888", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm" + }, + { + "duration": "101.17014238383837", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone" + }, + { + "duration": "31.443219499999998", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold" + }, + { + "duration": "36.229172222222225", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot" + }, + { + "duration": "33.76786222222222", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm" + }, + { + "duration": "101.64623023232323", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember" + }, + { + "duration": "31.539456611111106", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold" + }, + { + "duration": "36.346324277777775", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot" + }, + { + "duration": "34.13001666666667", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm" + }, + { + "duration": "101.36888077777773", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery" + }, + { + "duration": "31.577875", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold" + }, + { + "duration": "36.1620685", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot" + }, + { + "duration": "33.976599944444445", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm" + }, + { + "duration": "100.8417104141414", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla" + }, + { + "duration": "31.40643261111111", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold" + }, + { + "duration": "35.905435833333335", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot" + }, + { + "duration": "33.700589666666666", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm" + }, + { + "duration": "108.94169521212123", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io" + }, + { + "duration": "33.952969277777775", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold" + }, + { + "duration": "38.98369794444445", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot" + }, + { + "duration": "36.55015761111111", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm" + }, + { + "duration": "109.41496198989897", + "name": "v8.runtime_stats.top_25/http://weibo.com" + }, + { + "duration": "33.87589688888889", + "name": "v8.runtime_stats.top_25/http://weibo.com_cold" + }, + { + "duration": "39.288760555555555", + "name": "v8.runtime_stats.top_25/http://weibo.com_hot" + }, + { + "duration": "36.988700722222205", + "name": "v8.runtime_stats.top_25/http://weibo.com_warm" + }, + { + "duration": "105.39243727272729", + "name": "v8.runtime_stats.top_25/http://world.taobao.com" + }, + { + "duration": "32.83043338888889", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold" + }, + { + "duration": "37.890187055555565", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot" + }, + { + "duration": "35.51608772222222", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm" + }, + { + "duration": "102.93658333333335", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8" + }, + { + "duration": "31.818776666666672", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold" + }, + { + "duration": "36.99944116666667", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_hot" + }, + { + "duration": "34.270255500000005", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm" + }, + { + "duration": "103.12644498989899", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8" + }, + { + "duration": "31.989476166666666", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold" + }, + { + "duration": "36.962454111111114", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot" + }, + { + "duration": "34.5622925", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm" + }, + { + "duration": "102.05630849494946", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine" + }, + { + "duration": "31.686528611111115", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold" + }, + { + "duration": "36.54319572222223", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot" + }, + { + "duration": "34.058107888888884", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm" + }, + { + "duration": "118.10211918181813", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8" + }, + { + "duration": "35.566058388888884", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold" + }, + { + "duration": "43.487684944444446", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot" + }, + { + "duration": "39.559036888888876", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm" + }, + { + "duration": "106.62760665656566", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest" + }, + { + "duration": "33.044058722222225", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold" + }, + { + "duration": "37.993242555555554", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot" + }, + { + "duration": "35.84741527777778", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm" + }, + { + "duration": "114.27017597979794", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae" + }, + { + "duration": "35.22449038888888", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold" + }, + { + "duration": "41.47018605555556", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot" + }, + { + "duration": "38.57305388888889", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm" + }, + { + "duration": "107.35838367676767", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular" + }, + { + "duration": "32.81267016666666", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold" + }, + { + "duration": "38.89996205555555", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot" + }, + { + "duration": "36.03205955555555", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_warm" + }, + { + "duration": "229.51242425252522", + "name": "v8.runtime_stats.top_25/http://www.qq.com" + }, + { + "duration": "73.47604772222222", + "name": "v8.runtime_stats.top_25/http://www.qq.com_cold" + }, + { + "duration": "83.32599899999998", + "name": "v8.runtime_stats.top_25/http://www.qq.com_hot" + }, + { + "duration": "78.125855", + "name": "v8.runtime_stats.top_25/http://www.qq.com_warm" + }, + { + "duration": "105.30169259595954", + "name": "v8.runtime_stats.top_25/http://www.reddit.com" + }, + { + "duration": "32.56246544444444", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold" + }, + { + "duration": "37.830985055555544", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot" + }, + { + "duration": "35.400037000000005", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm" + }, + { + "duration": "108.233882989899", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13" + }, + { + "duration": "32.892807166666664", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold" + }, + { + "duration": "39.15283961111111", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot" + }, + { + "duration": "36.17598333333333", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm" + }, + { + "duration": "106.48966842424232", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill" + }, + { + "duration": "32.72999633333333", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold" + }, + { + "duration": "38.57067922222222", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot" + }, + { + "duration": "35.74365333333334", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm" + }, + { + "duration": "104.12351325252526", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp" + }, + { + "duration": "32.12021644444445", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold" + }, + { + "duration": "37.26856655555556", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot" + }, + { + "duration": "34.85376044444444", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm" + }, + { + "duration": "103.65649924242425", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8" + }, + { + "duration": "32.09436588888889", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold" + }, + { + "duration": "37.090542555555565", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot" + }, + { + "duration": "34.77428511111112", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm" + }, + { + "duration": "561.7087379797982", + "name": "v8.runtime_stats.top_25/https://adwords.google.com" + }, + { + "duration": "84.81196544444444", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold" + }, + { + "duration": "146.96248894444443", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_hot" + }, + { + "duration": "76.77790777777776", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm" + }, + { + "duration": "100.76279349494946", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3" + }, + { + "duration": "31.409606444444446", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold" + }, + { + "duration": "35.89496733333333", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot" + }, + { + "duration": "33.733494500000006", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm" + }, + { + "duration": "118.81436104040404", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit" + }, + { + "duration": "35.042715555555546", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold" + }, + { + "duration": "44.17890555555556", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot" + }, + { + "duration": "40.27547572222223", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm" + }, + { + "duration": "106.46967980808077", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira" + }, + { + "duration": "32.901984666666664", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold" + }, + { + "duration": "38.274749000000014", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot" + }, + { + "duration": "35.84974650000001", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm" + }, + { + "duration": "109.33183437373735", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8" + }, + { + "duration": "38.732060555555556", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold" + }, + { + "duration": "36.70311583333333", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot" + }, + { + "duration": "34.40973283333333", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm" + }, + { + "duration": "107.81024505050513", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/" + }, + { + "duration": "33.42385733333334", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold" + }, + { + "duration": "38.666314388888885", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot" + }, + { + "duration": "36.457009333333325", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm" + }, + { + "duration": "116.36648157575756", + "name": "v8.runtime_stats.top_25/https://www.youtube.com" + }, + { + "duration": "118.42878538383837", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg" + }, + { + "duration": "37.67086872222222", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold" + }, + { + "duration": "43.526112166666664", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot" + }, + { + "duration": "40.89483900000001", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm" + }, + { + "duration": "35.77489561111112", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold" + }, + { + "duration": "42.262929500000006", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot" + }, + { + "duration": "39.08882472222223", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm" + }, + { + "duration": "212.2152614444444", + "name": "wasm/AsmJsZenGarden" + }, + { + "duration": "42.22931960101012", + "name": "wasm/WasmSpaceBuggy" + }, + { + "duration": "102.76088237373739", + "name": "wasm/WasmStylizedRenderer" + }, + { + "duration": "91.68588509090911", + "name": "wasm/WasmSunTemple" + }, + { + "duration": "59.72995812121214", + "name": "wasm/WasmTanks" + }, + { + "duration": "100.26101248484852", + "name": "wasm/WasmZenGarden" + }, + { + "duration": "257.55736565656565", + "name": "webrtc/10s_datachannel_transfer" + }, + { + "duration": "24.080990666666665", + "name": "webrtc/canvas_capture_peer_connection" + }, + { + "duration": "33.32814349494949", + "name": "webrtc/codec_constraints_h264" + }, + { + "duration": "33.266973464646455", + "name": "webrtc/codec_constraints_vp8" + }, + { + "duration": "33.3149123939394", + "name": "webrtc/codec_constraints_vp9" + }, + { + "duration": "22.025357242424242", + "name": "webrtc/hd_local_stream_10s" + }, + { + "duration": "61.50133977777779", + "name": "webrtc/multiple_peerconnections" + }, + { + "duration": "67.75494984848487", + "name": "webrtc/pause_play_peerconnections" + } +] \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/mac1012_story_timing.json b/tools/perf/core/shard_maps/timing_data/mac1012_story_timing.json similarity index 100% rename from tools/perf/core/shard_maps/mac1012_story_timing.json rename to tools/perf/core/shard_maps/timing_data/mac1012_story_timing.json
diff --git a/tools/perf/core/shard_maps/timing_data/mac_1012_low_end_story_timing.json b/tools/perf/core/shard_maps/timing_data/mac_1012_low_end_story_timing.json new file mode 100644 index 0000000..be5a1c41 --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/mac_1012_low_end_story_timing.json
@@ -0,0 +1,6386 @@ +[ + { + "duration": "43.6661391010101", + "name": "battor.steady_state/http://www.indiatimes.com" + }, + { + "duration": "43.98705265656567", + "name": "battor.steady_state/http://www.microsoft.com" + }, + { + "duration": "46.46936337373737", + "name": "battor.steady_state/http://www.sina.com.cn" + }, + { + "duration": "49.87145609090908", + "name": "battor.steady_state/http://www.slideshare.net/patrickmeenan" + }, + { + "duration": "61.82376830303032", + "name": "battor.steady_state/http://www.uol.com.br" + }, + { + "duration": "45.292353787878774", + "name": "battor.steady_state/https://instagram.com/cnn/" + }, + { + "duration": "44.370657070707075", + "name": "battor.trivial_pages/TrivialAnimationPageSharedPageState" + }, + { + "duration": "42.70861379797979", + "name": "battor.trivial_pages/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "44.59014713131315", + "name": "battor.trivial_pages/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "43.926050191919195", + "name": "battor.trivial_pages/TrivialCanvasPageSharedPageState" + }, + { + "duration": "45.27811285858586", + "name": "battor.trivial_pages/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "42.950550252525254", + "name": "battor.trivial_pages/TrivialGifPageSharedPageState" + }, + { + "duration": "44.01780699999999", + "name": "battor.trivial_pages/TrivialScrollingPageSharedPageState" + }, + { + "duration": "44.95005123232321", + "name": "battor.trivial_pages/TrivialWebGLPageSharedPageState" + }, + { + "duration": "10.148663424242422", + "name": "blink_perf.bindings/append-child.html" + }, + { + "duration": "7.596848978787876", + "name": "blink_perf.bindings/create-element.html" + }, + { + "duration": "7.384279093939393", + "name": "blink_perf.bindings/document-implementation.html" + }, + { + "duration": "7.1013059606060605", + "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" + }, + { + "duration": "7.560870555555556", + "name": "blink_perf.bindings/first-child.html" + }, + { + "duration": "4.023517809090911", + "name": "blink_perf.bindings/gc-forest.html" + }, + { + "duration": "4.691254933333333", + "name": "blink_perf.bindings/gc-mini-tree.html" + }, + { + "duration": "19.893070797979796", + "name": "blink_perf.bindings/gc-tree.html" + }, + { + "duration": "7.0618826808080755", + "name": "blink_perf.bindings/get-attribute-rare.html" + }, + { + "duration": "6.957881701010099", + "name": "blink_perf.bindings/get-attribute.html" + }, + { + "duration": "7.336859322222223", + "name": "blink_perf.bindings/get-element-by-id.html" + }, + { + "duration": "7.183453865656564", + "name": "blink_perf.bindings/get-elements-by-tag-name.html" + }, + { + "duration": "7.4294348888888875", + "name": "blink_perf.bindings/id-getter.html" + }, + { + "duration": "7.911744422222223", + "name": "blink_perf.bindings/id-setter.html" + }, + { + "duration": "7.7830615282828255", + "name": "blink_perf.bindings/indexed-getter.html" + }, + { + "duration": "6.747527694949494", + "name": "blink_perf.bindings/insert-before.html" + }, + { + "duration": "6.9543420727272744", + "name": "blink_perf.bindings/named-property-enumerator.html" + }, + { + "duration": "28.127972898989885", + "name": "blink_perf.bindings/node-list-access.html" + }, + { + "duration": "7.609936621212115", + "name": "blink_perf.bindings/node-type.html" + }, + { + "duration": "1.7210511909090909", + "name": "blink_perf.bindings/post-message.html" + }, + { + "duration": "6.801404756565657", + "name": "blink_perf.bindings/sequence-conversion-array.html" + }, + { + "duration": "7.182448145454546", + "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" + }, + { + "duration": "1.8282438474747476", + "name": "blink_perf.bindings/serialize-array.html" + }, + { + "duration": "1.52685654040404", + "name": "blink_perf.bindings/serialize-long-string.html" + }, + { + "duration": "3.3311143202020204", + "name": "blink_perf.bindings/serialize-map.html" + }, + { + "duration": "1.4890591151515147", + "name": "blink_perf.bindings/serialize-nested-array.html" + }, + { + "duration": "7.283080685858589", + "name": "blink_perf.bindings/set-attribute-rare.html" + }, + { + "duration": "7.1892147848484855", + "name": "blink_perf.bindings/set-attribute.html" + }, + { + "duration": "7.352128130303032", + "name": "blink_perf.bindings/structured-clone-json-deserialize.html" + }, + { + "duration": "7.3576203373737314", + "name": "blink_perf.bindings/structured-clone-json-serialize.html" + }, + { + "duration": "4.810655277777779", + "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" + }, + { + "duration": "4.781798831313131", + "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" + }, + { + "duration": "7.381252325252525", + "name": "blink_perf.bindings/typed-array-construct-from-array.html" + }, + { + "duration": "7.496513234343438", + "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" + }, + { + "duration": "6.961774761616161", + "name": "blink_perf.bindings/typed-array-construct-from-typed.html" + }, + { + "duration": "8.2304176", + "name": "blink_perf.bindings/typed-array-set-from-typed.html" + }, + { + "duration": "7.515696335353536", + "name": "blink_perf.bindings/undefined-first-child.html" + }, + { + "duration": "7.208845151515151", + "name": "blink_perf.bindings/undefined-get-element-by-id.html" + }, + { + "duration": "7.499946958585862", + "name": "blink_perf.bindings/undefined-id-getter.html" + }, + { + "duration": "10.14087907070707", + "name": "blink_perf.canvas/createImageBitmapFromImageData.html" + }, + { + "duration": "4.606130679797981", + "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "10.876259803030301", + "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "1.557896893939394", + "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" + }, + { + "duration": "3.3135440676767693", + "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "2.3060901191919188", + "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "4.778475395959597", + "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "8.407366053535354", + "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" + }, + { + "duration": "7.926081783838384", + "name": "blink_perf.canvas/drawimage.html" + }, + { + "duration": "7.655262166666664", + "name": "blink_perf.canvas/getImageData.html" + }, + { + "duration": "8.062921808080809", + "name": "blink_perf.canvas/getImageDataColorManaged.html" + }, + { + "duration": "7.693949575757576", + "name": "blink_perf.canvas/putImageData.html" + }, + { + "duration": "12.97142906565657", + "name": "blink_perf.canvas/toBlob_duration.html" + }, + { + "duration": "3.0682117616161615", + "name": "blink_perf.canvas/toBlob_duration_jpeg.html" + }, + { + "duration": "3.219466946464647", + "name": "blink_perf.canvas/transferFromImageBitmap.html" + }, + { + "duration": "4.758527289898988", + "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" + }, + { + "duration": "8.427965972727277", + "name": "blink_perf.canvas/upload-video-to-sub-texture.html" + }, + { + "duration": "1.9234238747474752", + "name": "blink_perf.canvas/upload-video-to-texture.html" + }, + { + "duration": "4.490475614141412", + "name": "blink_perf.canvas/upload-webgl-to-texture.html" + }, + { + "duration": "14.549668439393951", + "name": "blink_perf.css/AttributeDescendantSelector.html" + }, + { + "duration": "7.659598530303031", + "name": "blink_perf.css/CSSPropertySetterGetter.html" + }, + { + "duration": "7.84411134646465", + "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" + }, + { + "duration": "7.609974407070707", + "name": "blink_perf.css/CSSPropertyUpdateValue.html" + }, + { + "duration": "7.8595553232323265", + "name": "blink_perf.css/ChangeStyleChildClassSelector.html" + }, + { + "duration": "7.828264167676767", + "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" + }, + { + "duration": "7.808240612121213", + "name": "blink_perf.css/ChangeStyleElementSelector.html" + }, + { + "duration": "7.806421543434343", + "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" + }, + { + "duration": "7.8424813787878795", + "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" + }, + { + "duration": "7.833361631313127", + "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" + }, + { + "duration": "7.864464558585861", + "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" + }, + { + "duration": "7.817845262626265", + "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" + }, + { + "duration": "7.828127889898988", + "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" + }, + { + "duration": "7.840952196969694", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" + }, + { + "duration": "7.836785138383841", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "9.283097813131315", + "name": "blink_perf.css/ChangeStyleShallowTree.html" + }, + { + "duration": "7.8539608757575765", + "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" + }, + { + "duration": "7.836648664646466", + "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" + }, + { + "duration": "7.865985284848484", + "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" + }, + { + "duration": "7.828635505050505", + "name": "blink_perf.css/ChangeStyleUniversalSelector.html" + }, + { + "duration": "7.837439717171718", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" + }, + { + "duration": "7.839564645454547", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "12.541123752525255", + "name": "blink_perf.css/ClassDescendantSelector.html" + }, + { + "duration": "8.687367974747476", + "name": "blink_perf.css/ClassInvalidation.html" + }, + { + "duration": "10.657590343434345", + "name": "blink_perf.css/FocusUpdate.html" + }, + { + "duration": "8.29407246060606", + "name": "blink_perf.css/LoadBootstrapBlog.html" + }, + { + "duration": "8.322901464646463", + "name": "blink_perf.css/LoadMaterializeStarterPage.html" + }, + { + "duration": "8.774356287878788", + "name": "blink_perf.css/LoadSemanticPageExample.html" + }, + { + "duration": "7.360181721212124", + "name": "blink_perf.css/PseudoClassSelectors.html" + }, + { + "duration": "8.901337171717172", + "name": "blink_perf.css/SelectorCountScaling.html" + }, + { + "duration": "12.3598793989899", + "name": "blink_perf.dom/addRange.html" + }, + { + "duration": "1.8834319222222224", + "name": "blink_perf.dom/delete-in-password-field.html" + }, + { + "duration": "8.418795355555552", + "name": "blink_perf.dom/div-editable.html" + }, + { + "duration": "1.5483544070707076", + "name": "blink_perf.dom/inner_html_with_selection.html" + }, + { + "duration": "18.134271813131317", + "name": "blink_perf.dom/long-sibling-list.html" + }, + { + "duration": "2.553973707070707", + "name": "blink_perf.dom/modify-element-classname.html" + }, + { + "duration": "2.0786437969696983", + "name": "blink_perf.dom/modify-element-id.html" + }, + { + "duration": "2.0535988222222223", + "name": "blink_perf.dom/modify-element-title.html" + }, + { + "duration": "1.818496223232323", + "name": "blink_perf.dom/move-down-with-hidden-elements.html" + }, + { + "duration": "1.7922804919191917", + "name": "blink_perf.dom/move-up-with-hidden-elements.html" + }, + { + "duration": "1.5707694737373745", + "name": "blink_perf.dom/remove_child_with_selection.html" + }, + { + "duration": "8.22373392222222", + "name": "blink_perf.dom/select-multiple-add.html" + }, + { + "duration": "7.566173876767678", + "name": "blink_perf.dom/select-single-add.html" + }, + { + "duration": "8.841083446464644", + "name": "blink_perf.dom/select-single-remove.html" + }, + { + "duration": "6.628297761616163", + "name": "blink_perf.dom/textarea-dom.html" + }, + { + "duration": "6.928146106060604", + "name": "blink_perf.dom/textarea-edit.html" + }, + { + "duration": "10.661440151515151", + "name": "blink_perf.events/EventsDispatching.html" + }, + { + "duration": "8.689588439393939", + "name": "blink_perf.events/EventsDispatchingInDeeplyNestedShadowTrees.html" + }, + { + "duration": "17.166238949494943", + "name": "blink_perf.events/EventsDispatchingInShadowTrees.html" + }, + { + "duration": "11.111363732323236", + "name": "blink_perf.events/hit-test-lots-of-layers.html" + }, + { + "duration": "19.226207353535347", + "name": "blink_perf.image_decoder/decode-gif.html" + }, + { + "duration": "10.215125803030308", + "name": "blink_perf.image_decoder/decode-jpeg.html" + }, + { + "duration": "17.062190292929298", + "name": "blink_perf.image_decoder/decode-lossless-webp.html" + }, + { + "duration": "9.096863888888889", + "name": "blink_perf.image_decoder/decode-lossy-webp.html" + }, + { + "duration": "12.911562146464648", + "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" + }, + { + "duration": "10.090027696969697", + "name": "blink_perf.image_decoder/decode-png-palette.html" + }, + { + "duration": "17.145606494949497", + "name": "blink_perf.image_decoder/decode-png.html" + }, + { + "duration": "15.681758631313132", + "name": "blink_perf.layout/ArabicLineLayout.html" + }, + { + "duration": "1.7445158989898988", + "name": "blink_perf.layout/Shapes/MultipleShapes.html" + }, + { + "duration": "7.392291857575754", + "name": "blink_perf.layout/SimpleTextPathLineLayout.html" + }, + { + "duration": "8.235598387878786", + "name": "blink_perf.layout/add-remove-inline-floats.html" + }, + { + "duration": "7.461594479797977", + "name": "blink_perf.layout/attach-inlines-2.html" + }, + { + "duration": "7.304000457575758", + "name": "blink_perf.layout/attach-inlines.html" + }, + { + "duration": "8.147071980808084", + "name": "blink_perf.layout/auto-grid-lots-of-data.html" + }, + { + "duration": "6.714710143434342", + "name": "blink_perf.layout/chapter-reflow-once-random.html" + }, + { + "duration": "14.366203520202017", + "name": "blink_perf.layout/chapter-reflow-once.html" + }, + { + "duration": "9.056534424242425", + "name": "blink_perf.layout/chapter-reflow-thrice.html" + }, + { + "duration": "10.451431095959595", + "name": "blink_perf.layout/chapter-reflow-twice.html" + }, + { + "duration": "11.827106853535355", + "name": "blink_perf.layout/chapter-reflow.html" + }, + { + "duration": "4.408673395959596", + "name": "blink_perf.layout/character_fallback.html" + }, + { + "duration": "1.667267890909091", + "name": "blink_perf.layout/character_fallback_aat.html" + }, + { + "duration": "8.514766174747473", + "name": "blink_perf.layout/fixed-grid-lots-of-data.html" + }, + { + "duration": "8.430989093939397", + "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" + }, + { + "duration": "7.454845466666668", + "name": "blink_perf.layout/flexbox-column-nowrap.html" + }, + { + "duration": "7.464023273737375", + "name": "blink_perf.layout/flexbox-column-wrap.html" + }, + { + "duration": "7.853537639393936", + "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" + }, + { + "duration": "8.44047804545454", + "name": "blink_perf.layout/flexbox-lots-of-data.html" + }, + { + "duration": "7.556251552525254", + "name": "blink_perf.layout/flexbox-row-nowrap.html" + }, + { + "duration": "7.548731399999998", + "name": "blink_perf.layout/flexbox-row-wrap.html" + }, + { + "duration": "9.285860378787877", + "name": "blink_perf.layout/flexbox-with-stretch-layout.html" + }, + { + "duration": "8.842763974747477", + "name": "blink_perf.layout/floats_100_100.html" + }, + { + "duration": "8.914536752525253", + "name": "blink_perf.layout/floats_100_100_nested.html" + }, + { + "duration": "5.977386085858583", + "name": "blink_perf.layout/floats_10_1000.html" + }, + { + "duration": "3.3650349101010084", + "name": "blink_perf.layout/floats_20_100.html" + }, + { + "duration": "3.837731064646467", + "name": "blink_perf.layout/floats_20_100_nested.html" + }, + { + "duration": "2.38193400909091", + "name": "blink_perf.layout/floats_2_100.html" + }, + { + "duration": "2.275390150505051", + "name": "blink_perf.layout/floats_2_100_nested.html" + }, + { + "duration": "4.180034596969698", + "name": "blink_perf.layout/floats_50_100.html" + }, + { + "duration": "4.357081545454547", + "name": "blink_perf.layout/floats_50_100_nested.html" + }, + { + "duration": "21.55085613131313", + "name": "blink_perf.layout/hindi-line-layout.html" + }, + { + "duration": "7.584891576767675", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" + }, + { + "duration": "7.574509049494949", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" + }, + { + "duration": "7.526296959595958", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" + }, + { + "duration": "1.5698606181818175", + "name": "blink_perf.layout/latin-complex-text.html" + }, + { + "duration": "1.9927451979797983", + "name": "blink_perf.layout/layers_overlap_2d.html" + }, + { + "duration": "2.1035831838383836", + "name": "blink_perf.layout/layers_overlap_3d.html" + }, + { + "duration": "6.455045983838387", + "name": "blink_perf.layout/line-layout-line-height.html" + }, + { + "duration": "7.401508557575755", + "name": "blink_perf.layout/line-layout-repeat-append.html" + }, + { + "duration": "7.1461393383838425", + "name": "blink_perf.layout/line-layout.html" + }, + { + "duration": "1.8034303202020203", + "name": "blink_perf.layout/long-line-nowrap-collapse.html" + }, + { + "duration": "1.8092418444444445", + "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" + }, + { + "duration": "4.528724898989898", + "name": "blink_perf.layout/long-line-nowrap.html" + }, + { + "duration": "7.484864324242423", + "name": "blink_perf.layout/multicol/deeply-nested-tables.html" + }, + { + "duration": "7.720315205050505", + "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" + }, + { + "duration": "7.163484931313132", + "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" + }, + { + "duration": "7.336633856565653", + "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" + }, + { + "duration": "7.338409953535354", + "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" + }, + { + "duration": "8.927428843434344", + "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" + }, + { + "duration": "8.941904757575758", + "name": "blink_perf.layout/multicol/tall-content-short-columns.html" + }, + { + "duration": "7.671790834343433", + "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" + }, + { + "duration": "7.766684360606063", + "name": "blink_perf.layout/nested-grid.html" + }, + { + "duration": "7.914851933333334", + "name": "blink_perf.layout/nested-percent-height-tables.html" + }, + { + "duration": "49.537120010101", + "name": "blink_perf.layout/subtree-detaching.html" + }, + { + "duration": "2.5022790121212117", + "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" + }, + { + "duration": "3.134986525252527", + "name": "blink_perf.layout/word-break-break-all.html" + }, + { + "duration": "3.125929863636365", + "name": "blink_perf.layout/word-break-break-word.html" + }, + { + "duration": "3.1299903040404033", + "name": "blink_perf.layout/word-wrap-break-word.html" + }, + { + "duration": "12.803931227272729", + "name": "blink_perf.owp_storage/blob-perf-files.html" + }, + { + "duration": "11.098859924242426", + "name": "blink_perf.owp_storage/blob-perf-ipc.html" + }, + { + "duration": "9.172777171717172", + "name": "blink_perf.owp_storage/blob-perf-shm.html" + }, + { + "duration": "11.070301853535357", + "name": "blink_perf.owp_storage/blob-perf-tiny.html" + }, + { + "duration": "10.965249373737374", + "name": "blink_perf.owp_storage/idb-load-docs.html" + }, + { + "duration": "13.593298803030297", + "name": "blink_perf.paint/appending-text.html" + }, + { + "duration": "14.816813646464643", + "name": "blink_perf.paint/color-changes.html" + }, + { + "duration": "14.205172136363638", + "name": "blink_perf.paint/complex-content-slow-scroll.html" + }, + { + "duration": "12.208303328282833", + "name": "blink_perf.paint/containment-resize.html" + }, + { + "duration": "12.959591272727275", + "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" + }, + { + "duration": "14.031624929292926", + "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" + }, + { + "duration": "11.164818767676769", + "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" + }, + { + "duration": "14.578132691919189", + "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" + }, + { + "duration": "12.073219939393944", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" + }, + { + "duration": "12.549028863636371", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" + }, + { + "duration": "10.396559676767678", + "name": "blink_perf.paint/large-table-collapsed-border-change.html" + }, + { + "duration": "12.631454333333332", + "name": "blink_perf.paint/large-table-repaint.html" + }, + { + "duration": "10.192572499999997", + "name": "blink_perf.paint/move-text-with-mask.html" + }, + { + "duration": "12.091995262626257", + "name": "blink_perf.paint/paint-offset-changes.html" + }, + { + "duration": "17.919579121212127", + "name": "blink_perf.paint/transform-changes.html" + }, + { + "duration": "10.848447883838384", + "name": "blink_perf.parser/css-parser-yui.html" + }, + { + "duration": "8.14787442929293", + "name": "blink_perf.parser/html-parser-threaded.html" + }, + { + "duration": "7.812314257575758", + "name": "blink_perf.parser/html-parser.html" + }, + { + "duration": "35.47138890909089", + "name": "blink_perf.parser/html5-full-render.html" + }, + { + "duration": "7.5349996949494935", + "name": "blink_perf.parser/iframe-append-remove.html" + }, + { + "duration": "7.644896217171715", + "name": "blink_perf.parser/innerHTML-setter-siblings.html" + }, + { + "duration": "7.892786386868688", + "name": "blink_perf.parser/innerHTML-setter.html" + }, + { + "duration": "7.679873505050504", + "name": "blink_perf.parser/query-selector-all-attribute-complex.html" + }, + { + "duration": "7.676317677777772", + "name": "blink_perf.parser/query-selector-all-attribute.html" + }, + { + "duration": "7.534242177777775", + "name": "blink_perf.parser/query-selector-all-class-deep.html" + }, + { + "duration": "8.919677383838385", + "name": "blink_perf.parser/query-selector-all-class-first.html" + }, + { + "duration": "7.756028951515151", + "name": "blink_perf.parser/query-selector-all-class-last.html" + }, + { + "duration": "7.920157168686869", + "name": "blink_perf.parser/query-selector-all-class.html" + }, + { + "duration": "7.41026381212121", + "name": "blink_perf.parser/query-selector-all-deep.html" + }, + { + "duration": "8.904829989898989", + "name": "blink_perf.parser/query-selector-all-first.html" + }, + { + "duration": "8.964712883838379", + "name": "blink_perf.parser/query-selector-all-id-deep.html" + }, + { + "duration": "8.939007308080805", + "name": "blink_perf.parser/query-selector-all-id-first.html" + }, + { + "duration": "9.137956242424243", + "name": "blink_perf.parser/query-selector-all-id-last.html" + }, + { + "duration": "8.048161337373736", + "name": "blink_perf.parser/query-selector-all-last.html" + }, + { + "duration": "7.700229644444446", + "name": "blink_perf.parser/query-selector-deep.html" + }, + { + "duration": "7.40988079393939", + "name": "blink_perf.parser/query-selector-first.html" + }, + { + "duration": "7.462205139393941", + "name": "blink_perf.parser/query-selector-id-deep.html" + }, + { + "duration": "7.864789814141413", + "name": "blink_perf.parser/query-selector-id-last.html" + }, + { + "duration": "7.794055488888891", + "name": "blink_perf.parser/query-selector-last.html" + }, + { + "duration": "7.101781085858585", + "name": "blink_perf.parser/simple-url.html" + }, + { + "duration": "7.777669150505054", + "name": "blink_perf.parser/textarea-parsing.html" + }, + { + "duration": "7.715698518181818", + "name": "blink_perf.parser/tiny-innerHTML.html" + }, + { + "duration": "8.944414070707072", + "name": "blink_perf.parser/url-parser.html" + }, + { + "duration": "7.010908567676768", + "name": "blink_perf.parser/xml-parser.html" + }, + { + "duration": "5.229385679797979", + "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" + }, + { + "duration": "1.9513474646464648", + "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" + }, + { + "duration": "2.0353443777777778", + "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" + }, + { + "duration": "1.5626493696969694", + "name": "blink_perf.shadow_dom/shadow-style-share.html" + }, + { + "duration": "1.7350881151515154", + "name": "blink_perf.shadow_dom/style-sheet-insert.html" + }, + { + "duration": "1.7626676535353532", + "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" + }, + { + "duration": "2.117463823232323", + "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" + }, + { + "duration": "3.130429943434343", + "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" + }, + { + "duration": "3.3353975242424236", + "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" + }, + { + "duration": "1.8229640444444446", + "name": "blink_perf.shadow_dom/v0-content-reprojection.html" + }, + { + "duration": "1.6319351737373728", + "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" + }, + { + "duration": "1.5866660636363632", + "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" + }, + { + "duration": "1.8355270515151514", + "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" + }, + { + "duration": "1.6076906646464653", + "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" + }, + { + "duration": "21.229140818181833", + "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" + }, + { + "duration": "1.527051152525253", + "name": "blink_perf.shadow_dom/v1-distribution.html" + }, + { + "duration": "1.496548557575758", + "name": "blink_perf.shadow_dom/v1-host-child-append.html" + }, + { + "duration": "21.156313429292936", + "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" + }, + { + "duration": "25.351490050505035", + "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" + }, + { + "duration": "1.8461250010101007", + "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" + }, + { + "duration": "1.5177992505050508", + "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" + }, + { + "duration": "1.850368215151515", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" + }, + { + "duration": "1.505538342424242", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "1.5210088737373737", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" + }, + { + "duration": "1.6138136060606052", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" + }, + { + "duration": "1.5104375292929295", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "1.533412258585858", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" + }, + { + "duration": "2.2203408595959595", + "name": "blink_perf.shadow_dom/v1-slot-append.html" + }, + { + "duration": "3.9040468393939394", + "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" + }, + { + "duration": "3.9033730212121207", + "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" + }, + { + "duration": "1.4695825555555562", + "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" + }, + { + "duration": "1.486019076767677", + "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" + }, + { + "duration": "4.634324051515152", + "name": "blink_perf.svg/AzLizardBenjiPark.html" + }, + { + "duration": "3.018247019191919", + "name": "blink_perf.svg/Bamboo.html" + }, + { + "duration": "1.865771827272727", + "name": "blink_perf.svg/Cactus.html" + }, + { + "duration": "1.8571048202020206", + "name": "blink_perf.svg/Cowboy.html" + }, + { + "duration": "3.3411480363636357", + "name": "blink_perf.svg/Cowboy_transform.html" + }, + { + "duration": "1.64636067979798", + "name": "blink_perf.svg/CrawFishGanson.html" + }, + { + "duration": "1.7727738828282815", + "name": "blink_perf.svg/Debian.html" + }, + { + "duration": "1.5892145656565655", + "name": "blink_perf.svg/DropsOnABlade.html" + }, + { + "duration": "1.6134901898989886", + "name": "blink_perf.svg/FlowerFromMyGarden.html" + }, + { + "duration": "1.7183144808080808", + "name": "blink_perf.svg/FoodLeifLodahl.html" + }, + { + "duration": "1.7344142505050515", + "name": "blink_perf.svg/France.html" + }, + { + "duration": "1.582752057575758", + "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" + }, + { + "duration": "1.8546380111111107", + "name": "blink_perf.svg/GearFlowers.html" + }, + { + "duration": "1.6726561313131305", + "name": "blink_perf.svg/HarveyRayner.html" + }, + { + "duration": "1.6200592929292936", + "name": "blink_perf.svg/HereGear.html" + }, + { + "duration": "3.3583119515151516", + "name": "blink_perf.svg/MtSaintHelens.html" + }, + { + "duration": "1.5632744989898988", + "name": "blink_perf.svg/Samurai.html" + }, + { + "duration": "32.54496394949495", + "name": "blink_perf.svg/SierpinskiCarpet.html" + }, + { + "duration": "2.3888155939393934", + "name": "blink_perf.svg/SvgCubics.html" + }, + { + "duration": "2.0324890717171713", + "name": "blink_perf.svg/SvgHitTesting.html" + }, + { + "duration": "7.977020433333332", + "name": "blink_perf.svg/SvgNestedUse.html" + }, + { + "duration": "1.7106392222222218", + "name": "blink_perf.svg/UnderTheSee.html" + }, + { + "duration": "1.9933825191919192", + "name": "blink_perf.svg/WorldIso.html" + }, + { + "duration": "3.03462813030303", + "name": "blink_perf.svg/Worldcup.html" + }, + { + "duration": "33.87866164646464", + "name": "dromaeo/http://dromaeo.com?dom-attr" + }, + { + "duration": "33.45509831313133", + "name": "dromaeo/http://dromaeo.com?dom-modify" + }, + { + "duration": "47.01777951515152", + "name": "dromaeo/http://dromaeo.com?dom-query" + }, + { + "duration": "27.821222161616163", + "name": "dromaeo/http://dromaeo.com?dom-traverse" + }, + { + "duration": "10.724593434343438", + "name": "dummy_benchmark.histogram_benchmark_1/dummy_page.html" + }, + { + "duration": "1.915362015151515", + "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" + }, + { + "duration": "1.6512138686868694", + "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" + }, + { + "duration": "202.00587818181813", + "name": "jetstream/http://browserbench.org/JetStream/" + }, + { + "duration": "27.615205979797977", + "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" + }, + { + "duration": "75.60442469696969", + "name": "loading.desktop/24h" + }, + { + "duration": "32.856305312500005", + "name": "loading.desktop/24h_cold" + }, + { + "duration": "41.63070131250001", + "name": "loading.desktop/24h_warm" + }, + { + "duration": "116.01759767676765", + "name": "loading.desktop/AirBnB" + }, + { + "duration": "46.278776125", + "name": "loading.desktop/AirBnB_cold" + }, + { + "duration": "69.2289148125", + "name": "loading.desktop/AirBnB_warm" + }, + { + "duration": "57.501516560606056", + "name": "loading.desktop/Aljayyash" + }, + { + "duration": "26.174059093750003", + "name": "loading.desktop/Aljayyash_cold" + }, + { + "duration": "31.258727843750002", + "name": "loading.desktop/Aljayyash_warm" + }, + { + "duration": "117.38057823232319", + "name": "loading.desktop/AllRecipes" + }, + { + "duration": "46.34222874999999", + "name": "loading.desktop/AllRecipes_cold" + }, + { + "duration": "70.56444350000002", + "name": "loading.desktop/AllRecipes_warm" + }, + { + "duration": "114.07276343434341", + "name": "loading.desktop/ArsTechnica" + }, + { + "duration": "43.471810000000005", + "name": "loading.desktop/ArsTechnica_cold" + }, + { + "duration": "67.45809581249998", + "name": "loading.desktop/ArsTechnica_warm" + }, + { + "duration": "58.88167199494951", + "name": "loading.desktop/Baidu" + }, + { + "duration": "26.683427562499997", + "name": "loading.desktop/Baidu_cold" + }, + { + "duration": "32.166409312499994", + "name": "loading.desktop/Baidu_warm" + }, + { + "duration": "92.87512381818186", + "name": "loading.desktop/Bhaskar" + }, + { + "duration": "38.916841437500004", + "name": "loading.desktop/Bhaskar_cold" + }, + { + "duration": "53.3565870625", + "name": "loading.desktop/Bhaskar_warm" + }, + { + "duration": "75.9826225151515", + "name": "loading.desktop/Chosun" + }, + { + "duration": "32.55569112500001", + "name": "loading.desktop/Chosun_cold" + }, + { + "duration": "42.290238625", + "name": "loading.desktop/Chosun_warm" + }, + { + "duration": "69.1993945959596", + "name": "loading.desktop/Colorado.edu" + }, + { + "duration": "30.262570343749996", + "name": "loading.desktop/Colorado.edu_cold" + }, + { + "duration": "38.617488625", + "name": "loading.desktop/Colorado.edu_warm" + }, + { + "duration": "72.89831017676768", + "name": "loading.desktop/Danawa" + }, + { + "duration": "31.1745171875", + "name": "loading.desktop/Danawa_cold" + }, + { + "duration": "41.82144353333334", + "name": "loading.desktop/Danawa_warm" + }, + { + "duration": "67.47683928787878", + "name": "loading.desktop/Daum" + }, + { + "duration": "29.559242625", + "name": "loading.desktop/Daum_cold" + }, + { + "duration": "37.324267375000005", + "name": "loading.desktop/Daum_warm" + }, + { + "duration": "79.61085833333335", + "name": "loading.desktop/Donga" + }, + { + "duration": "34.175822874999994", + "name": "loading.desktop/Donga_cold" + }, + { + "duration": "44.6568470625", + "name": "loading.desktop/Donga_warm" + }, + { + "duration": "103.63775137373737", + "name": "loading.desktop/Economist" + }, + { + "duration": "41.58170812499999", + "name": "loading.desktop/Economist_cold" + }, + { + "duration": "61.62459362500001", + "name": "loading.desktop/Economist_warm" + }, + { + "duration": "172.21169295959595", + "name": "loading.desktop/Elmundo" + }, + { + "duration": "52.898391249999996", + "name": "loading.desktop/Elmundo_cold" + }, + { + "duration": "118.21876193333333", + "name": "loading.desktop/Elmundo_warm" + }, + { + "duration": "72.12974203030305", + "name": "loading.desktop/FC2Blog" + }, + { + "duration": "31.311600156249998", + "name": "loading.desktop/FC2Blog_cold" + }, + { + "duration": "39.45254181250001", + "name": "loading.desktop/FC2Blog_warm" + }, + { + "duration": "77.68313459090905", + "name": "loading.desktop/FIFA" + }, + { + "duration": "32.7983626875", + "name": "loading.desktop/FIFA_cold" + }, + { + "duration": "44.662360750000005", + "name": "loading.desktop/FIFA_warm" + }, + { + "duration": "94.40924135858586", + "name": "loading.desktop/FarsNews" + }, + { + "duration": "53.977297875", + "name": "loading.desktop/FarsNews_cold" + }, + { + "duration": "39.192257999999995", + "name": "loading.desktop/FarsNews_warm" + }, + { + "duration": "70.86224055555556", + "name": "loading.desktop/Flickr" + }, + { + "duration": "30.5946865", + "name": "loading.desktop/Flickr_cold" + }, + { + "duration": "40.09821262499999", + "name": "loading.desktop/Flickr_warm" + }, + { + "duration": "71.46198625757577", + "name": "loading.desktop/FlipKart" + }, + { + "duration": "30.447184656250002", + "name": "loading.desktop/FlipKart_cold" + }, + { + "duration": "40.700759125", + "name": "loading.desktop/FlipKart_warm" + }, + { + "duration": "60.59077305050505", + "name": "loading.desktop/Free.fr" + }, + { + "duration": "28.408261937499997", + "name": "loading.desktop/Free.fr_cold" + }, + { + "duration": "32.416717250000005", + "name": "loading.desktop/Free.fr_warm" + }, + { + "duration": "54.656866737373754", + "name": "loading.desktop/HTML5Rocks" + }, + { + "duration": "24.968367125000004", + "name": "loading.desktop/HTML5Rocks_cold" + }, + { + "duration": "29.406475125", + "name": "loading.desktop/HTML5Rocks_warm" + }, + { + "duration": "57.64533932828283", + "name": "loading.desktop/Haraj" + }, + { + "duration": "26.150363875", + "name": "loading.desktop/Haraj_cold" + }, + { + "duration": "31.488993375", + "name": "loading.desktop/Haraj_warm" + }, + { + "duration": "75.68578872222223", + "name": "loading.desktop/HatenaBookmark" + }, + { + "duration": "33.7473341875", + "name": "loading.desktop/HatenaBookmark_cold" + }, + { + "duration": "41.623374937499996", + "name": "loading.desktop/HatenaBookmark_warm" + }, + { + "duration": "78.78197761616158", + "name": "loading.desktop/IGN" + }, + { + "duration": "33.7434599375", + "name": "loading.desktop/IGN_cold" + }, + { + "duration": "43.511117062500006", + "name": "loading.desktop/IGN_warm" + }, + { + "duration": "83.18151825252528", + "name": "loading.desktop/IMDB" + }, + { + "duration": "35.03880187499999", + "name": "loading.desktop/IMDB_cold" + }, + { + "duration": "48.27916874999999", + "name": "loading.desktop/IMDB_warm" + }, + { + "duration": "73.43916837373737", + "name": "loading.desktop/IndiaTimes" + }, + { + "duration": "31.355845437500005", + "name": "loading.desktop/IndiaTimes_cold" + }, + { + "duration": "41.8976474375", + "name": "loading.desktop/IndiaTimes_warm" + }, + { + "duration": "81.50031437373735", + "name": "loading.desktop/Kakaku" + }, + { + "duration": "34.964566125000005", + "name": "loading.desktop/Kakaku_cold" + }, + { + "duration": "46.480897312500005", + "name": "loading.desktop/Kakaku_warm" + }, + { + "duration": "126.96529990909089", + "name": "loading.desktop/Kenh14" + }, + { + "duration": "51.01960537499999", + "name": "loading.desktop/Kenh14_cold" + }, + { + "duration": "87.3103896875", + "name": "loading.desktop/Kenh14_warm" + }, + { + "duration": "70.07078602020202", + "name": "loading.desktop/Mercadolivre" + }, + { + "duration": "30.5196676875", + "name": "loading.desktop/Mercadolivre_cold" + }, + { + "duration": "38.283955875000004", + "name": "loading.desktop/Mercadolivre_warm" + }, + { + "duration": "87.96426058750001", + "name": "loading.desktop/NatGeo" + }, + { + "duration": "67.41531685353536", + "name": "loading.desktop/Naver" + }, + { + "duration": "29.319269906250003", + "name": "loading.desktop/Naver_cold" + }, + { + "duration": "36.642034187499995", + "name": "loading.desktop/Naver_warm" + }, + { + "duration": "62.72244465656564", + "name": "loading.desktop/Orange" + }, + { + "duration": "28.235387437500002", + "name": "loading.desktop/Orange_cold" + }, + { + "duration": "34.166211937499995", + "name": "loading.desktop/Orange_warm" + }, + { + "duration": "73.28814087878789", + "name": "loading.desktop/Pantip" + }, + { + "duration": "31.569637633333333", + "name": "loading.desktop/Pantip_cold" + }, + { + "duration": "42.660802374999996", + "name": "loading.desktop/Pantip_warm" + }, + { + "duration": "80.82748951515148", + "name": "loading.desktop/PremierLeague" + }, + { + "duration": "44.642295812499995", + "name": "loading.desktop/PremierLeague_cold" + }, + { + "duration": "45.614019375000005", + "name": "loading.desktop/PremierLeague_warm" + }, + { + "duration": "87.14592047474746", + "name": "loading.desktop/QQ" + }, + { + "duration": "36.716623937499996", + "name": "loading.desktop/QQ_cold" + }, + { + "duration": "49.457155625000006", + "name": "loading.desktop/QQ_warm" + }, + { + "duration": "73.92904544444441", + "name": "loading.desktop/REI" + }, + { + "duration": "32.03277078125", + "name": "loading.desktop/REI_cold" + }, + { + "duration": "41.35801018750001", + "name": "loading.desktop/REI_warm" + }, + { + "duration": "63.927265535353534", + "name": "loading.desktop/Ruten" + }, + { + "duration": "28.6662218125", + "name": "loading.desktop/Ruten_cold" + }, + { + "duration": "35.181146", + "name": "loading.desktop/Ruten_warm" + }, + { + "duration": "86.67354681818182", + "name": "loading.desktop/Sina" + }, + { + "duration": "36.0420235625", + "name": "loading.desktop/Sina_cold" + }, + { + "duration": "50.04880375", + "name": "loading.desktop/Sina_warm" + }, + { + "duration": "85.78207976767678", + "name": "loading.desktop/Taobao" + }, + { + "duration": "35.9642806875", + "name": "loading.desktop/Taobao_cold" + }, + { + "duration": "49.785105875", + "name": "loading.desktop/Taobao_warm" + }, + { + "duration": "95.06613313131318", + "name": "loading.desktop/TheOnion" + }, + { + "duration": "37.32847643750001", + "name": "loading.desktop/TheOnion_cold" + }, + { + "duration": "56.3857713125", + "name": "loading.desktop/TheOnion_warm" + }, + { + "duration": "95.38570480808076", + "name": "loading.desktop/TheVerge" + }, + { + "duration": "41.80477524999999", + "name": "loading.desktop/TheVerge_cold" + }, + { + "duration": "54.795627125", + "name": "loading.desktop/TheVerge_warm" + }, + { + "duration": "101.3383194040404", + "name": "loading.desktop/TicketMaster" + }, + { + "duration": "41.967949312500004", + "name": "loading.desktop/TicketMaster_cold" + }, + { + "duration": "58.194444250000004", + "name": "loading.desktop/TicketMaster_warm" + }, + { + "duration": "132.6968061818182", + "name": "loading.desktop/Vietnamnet" + }, + { + "duration": "56.67146499999999", + "name": "loading.desktop/Vietnamnet_cold" + }, + { + "duration": "78.4282041875", + "name": "loading.desktop/Vietnamnet_warm" + }, + { + "duration": "98.36327048484848", + "name": "loading.desktop/Vnexpress" + }, + { + "duration": "40.252280500000005", + "name": "loading.desktop/Vnexpress_cold" + }, + { + "duration": "56.53470093749999", + "name": "loading.desktop/Vnexpress_warm" + }, + { + "duration": "110.99060993939392", + "name": "loading.desktop/Walgreens" + }, + { + "duration": "43.805005375", + "name": "loading.desktop/Walgreens_cold" + }, + { + "duration": "64.5337524375", + "name": "loading.desktop/Walgreens_warm" + }, + { + "duration": "61.03997969696968", + "name": "loading.desktop/Yandex" + }, + { + "duration": "27.68493609375", + "name": "loading.desktop/Yandex_cold" + }, + { + "duration": "33.167794625", + "name": "loading.desktop/Yandex_warm" + }, + { + "duration": "90.67756061616161", + "name": "loading.desktop/amazon.co.jp" + }, + { + "duration": "37.711203187500004", + "name": "loading.desktop/amazon.co.jp_cold" + }, + { + "duration": "51.9250133125", + "name": "loading.desktop/amazon.co.jp_warm" + }, + { + "duration": "64.30381802525253", + "name": "loading.desktop/ja.wikipedia" + }, + { + "duration": "28.492517406250002", + "name": "loading.desktop/ja.wikipedia_cold" + }, + { + "duration": "35.590779312500004", + "name": "loading.desktop/ja.wikipedia_warm" + }, + { + "duration": "109.4099294444445", + "name": "loading.desktop/money.cnn" + }, + { + "duration": "44.506503124999995", + "name": "loading.desktop/money.cnn_cold" + }, + { + "duration": "63.001889062500005", + "name": "loading.desktop/money.cnn_warm" + }, + { + "duration": "67.19999635858586", + "name": "loading.desktop/ru.wikipedia" + }, + { + "duration": "30.18488053125001", + "name": "loading.desktop/ru.wikipedia_cold" + }, + { + "duration": "36.655007125", + "name": "loading.desktop/ru.wikipedia_warm" + }, + { + "duration": "107.67303961616162", + "name": "loading.desktop/uol.com.br" + }, + { + "duration": "45.0099491875", + "name": "loading.desktop/uol.com.br_cold" + }, + { + "duration": "62.54764912499999", + "name": "loading.desktop/uol.com.br_warm" + }, + { + "duration": "75.40001577777781", + "name": "loading.desktop/yahoo.co.jp" + }, + { + "duration": "33.2835993125", + "name": "loading.desktop/yahoo.co.jp_cold" + }, + { + "duration": "42.43956356249999", + "name": "loading.desktop/yahoo.co.jp_warm" + }, + { + "duration": "16.2955312979798", + "name": "media.desktop/mse.html?media=aac_audio.mp4" + }, + { + "duration": "17.098805202020202", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4" + }, + { + "duration": "17.173237313131317", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4&waitForPageLoaded=true" + }, + { + "duration": "16.113320848484847", + "name": "media.desktop/mse.html?media=h264_video.mp4" + }, + { + "duration": "22.675049222222224", + "name": "media.desktop/video.html?src=crowd.ogg&type=audio" + }, + { + "duration": "24.120887818181806", + "name": "media.desktop/video.html?src=crowd1080.mp4" + }, + { + "duration": "23.800674303030313", + "name": "media.desktop/video.html?src=crowd1080.webm" + }, + { + "duration": "22.549354505050513", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm" + }, + { + "duration": "13.736240686868689", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm&seek" + }, + { + "duration": "22.350273888888882", + "name": "media.desktop/video.html?src=crowd720_vp9.webm" + }, + { + "duration": "27.04541241414141", + "name": "media.desktop/video.html?src=garden2_10s.mp4" + }, + { + "duration": "17.537911404040408", + "name": "media.desktop/video.html?src=garden2_10s.mp4&seek" + }, + { + "duration": "23.280031545454545", + "name": "media.desktop/video.html?src=garden2_10s.webm" + }, + { + "duration": "14.63634738383839", + "name": "media.desktop/video.html?src=garden2_10s.webm&seek" + }, + { + "duration": "18.361106292929296", + "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek" + }, + { + "duration": "29.3844991111111", + "name": "media.desktop/video.html?src=tulip2.m4a&type=audio" + }, + { + "duration": "29.31587224242423", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio" + }, + { + "duration": "12.13583621717172", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek" + }, + { + "duration": "30.505155808080797", + "name": "media.desktop/video.html?src=tulip2.mp4" + }, + { + "duration": "32.492866636363644", + "name": "media.desktop/video.html?src=tulip2.mp4&busyjs" + }, + { + "duration": "13.816869999999993", + "name": "media.desktop/video.html?src=tulip2.mp4&seek" + }, + { + "duration": "29.362916111111122", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio" + }, + { + "duration": "12.272008065656562", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek" + }, + { + "duration": "30.64456865656563", + "name": "media.desktop/video.html?src=tulip2.vp9.webm" + }, + { + "duration": "24.42709850505051", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&background" + }, + { + "duration": "15.462267585858582", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&seek" + }, + { + "duration": "35.708843606060604", + "name": "media.desktop/video.html?src=tulip2.vp9.webm_Regular-3G" + }, + { + "duration": "29.60920047474747", + "name": "media.desktop/video.html?src=tulip2.wav&type=audio" + }, + { + "duration": "12.256743358585856", + "name": "media.desktop/video.html?src=tulip2.wav&type=audio&seek" + }, + { + "duration": "97.5184215454545", + "name": "memory.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "96.34955801010103", + "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "99.16925029292929", + "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "97.41132820202017", + "name": "memory.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "101.68133572727271", + "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "97.27280598989903", + "name": "memory.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "97.66094092929292", + "name": "memory.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "98.17280185858581", + "name": "memory.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "165.03149676767677", + "name": "memory.long_running_idle_gmail_background_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "163.0109597979798", + "name": "memory.long_running_idle_gmail_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "43.78769416161617", + "name": "octane/http://chromium.github.io/octane/index.html?auto=1" + }, + { + "duration": "98.8178", + "name": "oortonline_tbmv2/http://oortonline.gl/#run" + }, + { + "duration": "44.045787234567904", + "name": "power.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "42.5103696419753", + "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "44.69092227160495", + "name": "power.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "43.650710592592596", + "name": "power.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "44.92179496296296", + "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "42.614673864197535", + "name": "power.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "43.543587456790114", + "name": "power.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "44.27836032098765", + "name": "power.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "137.3265953333333", + "name": "power.desktop/abcnews" + }, + { + "duration": "43.44300643209875", + "name": "power.desktop/indiatimes" + }, + { + "duration": "44.91801472839507", + "name": "power.desktop/instagram" + }, + { + "duration": "43.69729803703703", + "name": "power.desktop/microsoft" + }, + { + "duration": "46.235510000000005", + "name": "power.desktop/sina" + }, + { + "duration": "44.70771138271605", + "name": "power.desktop/slideshare" + }, + { + "duration": "59.52244833333334", + "name": "power.desktop/uol" + }, + { + "duration": "17.96283226262626", + "name": "power.idle_platform/IdleStory_10s" + }, + { + "duration": "128.62031252525256", + "name": "power.idle_platform/IdleStory_120s" + }, + { + "duration": "68.20742490909092", + "name": "power.idle_platform/IdleStory_60s" + }, + { + "duration": "5.683754051515151", + "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" + }, + { + "duration": "12.5674783080808", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" + }, + { + "duration": "6.166994789898992", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" + }, + { + "duration": "7.91023680707071", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" + }, + { + "duration": "8.00078187070707", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" + }, + { + "duration": "6.140551643434345", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" + }, + { + "duration": "15.379261424242426", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" + }, + { + "duration": "5.607758159595959", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" + }, + { + "duration": "7.392712408080809", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" + }, + { + "duration": "6.653030256565656", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" + }, + { + "duration": "5.347353505050503", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" + }, + { + "duration": "5.48135011919192", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" + }, + { + "duration": "7.247789172727271", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" + }, + { + "duration": "13.802930328282827", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" + }, + { + "duration": "5.455447004040402", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" + }, + { + "duration": "4.749509045454545", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" + }, + { + "duration": "24.317836666666665", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" + }, + { + "duration": "11.138638434343434", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" + }, + { + "duration": "11.277634116161618", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" + }, + { + "duration": "6.940995933333333", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" + }, + { + "duration": "5.632520380808079", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" + }, + { + "duration": "17.597222999999996", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" + }, + { + "duration": "94.99384088888883", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" + }, + { + "duration": "75.89309615151511", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" + }, + { + "duration": "18.91591747474747", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" + }, + { + "duration": "22.895574600000003", + "name": "rendering.desktop/amazon_pinch" + }, + { + "duration": "26.058084402298856", + "name": "rendering.desktop/analog_clock_svg" + }, + { + "duration": "31.137996799999996", + "name": "rendering.desktop/animometer_webgl" + }, + { + "duration": "81.3670117254902", + "name": "rendering.desktop/aquarium" + }, + { + "duration": "41.101810156862754", + "name": "rendering.desktop/aquarium_20k" + }, + { + "duration": "39.949417937499994", + "name": "rendering.desktop/background_color_animation" + }, + { + "duration": "30.630462562500004", + "name": "rendering.desktop/background_color_animation_with_gradient" + }, + { + "duration": "27.663578214285714", + "name": "rendering.desktop/balls_css_key_frame_animations" + }, + { + "duration": "56.637070499999986", + "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "31.42801637142858", + "name": "rendering.desktop/balls_css_transition_2_properties" + }, + { + "duration": "31.48493187142856", + "name": "rendering.desktop/balls_css_transition_40_properties" + }, + { + "duration": "31.40346285714286", + "name": "rendering.desktop/balls_css_transition_all_properties" + }, + { + "duration": "36.40492667142856", + "name": "rendering.desktop/balls_javascript_canvas" + }, + { + "duration": "25.585698385714284", + "name": "rendering.desktop/balls_javascript_css" + }, + { + "duration": "32.72588259999999", + "name": "rendering.desktop/balls_svg_animations" + }, + { + "duration": "22.40126047058824", + "name": "rendering.desktop/blob" + }, + { + "duration": "34.23661401010101", + "name": "rendering.desktop/blogspot" + }, + { + "duration": "29.812897519999996", + "name": "rendering.desktop/blogspot_pinch" + }, + { + "duration": "17.372465328282846", + "name": "rendering.desktop/booking.com" + }, + { + "duration": "23.545154680000007", + "name": "rendering.desktop/booking_pinch" + }, + { + "duration": "17.024335993506494", + "name": "rendering.desktop/bouncing_balls_15" + }, + { + "duration": "19.095836", + "name": "rendering.desktop/bouncing_balls_shadow" + }, + { + "duration": "20.02618161038961", + "name": "rendering.desktop/bouncing_clipped_rectangles" + }, + { + "duration": "24.20816945454546", + "name": "rendering.desktop/bouncing_gradient_circles" + }, + { + "duration": "14.063737616883113", + "name": "rendering.desktop/bouncing_png_images" + }, + { + "duration": "30.700972961038953", + "name": "rendering.desktop/bouncing_svg_images" + }, + { + "duration": "21.01813906122449", + "name": "rendering.desktop/canvas_05000_pixels_per_second" + }, + { + "duration": "20.276436653061225", + "name": "rendering.desktop/canvas_10000_pixels_per_second" + }, + { + "duration": "17.204708673469387", + "name": "rendering.desktop/canvas_15000_pixels_per_second" + }, + { + "duration": "15.610566102040814", + "name": "rendering.desktop/canvas_20000_pixels_per_second" + }, + { + "duration": "14.014240102040812", + "name": "rendering.desktop/canvas_30000_pixels_per_second" + }, + { + "duration": "13.190514846938779", + "name": "rendering.desktop/canvas_40000_pixels_per_second" + }, + { + "duration": "12.771160734693876", + "name": "rendering.desktop/canvas_50000_pixels_per_second" + }, + { + "duration": "12.486312234693877", + "name": "rendering.desktop/canvas_60000_pixels_per_second" + }, + { + "duration": "12.09154987755102", + "name": "rendering.desktop/canvas_75000_pixels_per_second" + }, + { + "duration": "11.893245540816325", + "name": "rendering.desktop/canvas_90000_pixels_per_second" + }, + { + "duration": "49.0318794155844", + "name": "rendering.desktop/canvas_animation_no_clear" + }, + { + "duration": "25.966652103896106", + "name": "rendering.desktop/canvas_arcs" + }, + { + "duration": "18.05277585064935", + "name": "rendering.desktop/canvas_font_cycler" + }, + { + "duration": "18.02152905194804", + "name": "rendering.desktop/canvas_lines" + }, + { + "duration": "16.34693614935065", + "name": "rendering.desktop/canvas_to_blob" + }, + { + "duration": "11.673777918367348", + "name": "rendering.desktop/cats_unscaled" + }, + { + "duration": "9.97099144897959", + "name": "rendering.desktop/cats_viewport_width" + }, + { + "duration": "22.112816519480518", + "name": "rendering.desktop/chip_tune" + }, + { + "duration": "27.922706280000003", + "name": "rendering.desktop/cnn_pinch" + }, + { + "duration": "37.785224842857154", + "name": "rendering.desktop/compositor_heavy_animation" + }, + { + "duration": "26.85903648051948", + "name": "rendering.desktop/crafty_mind" + }, + { + "duration": "29.074787414285723", + "name": "rendering.desktop/css_animations_many_keyframes" + }, + { + "duration": "25.408756420289855", + "name": "rendering.desktop/css_animations_simultaneous_inline_style" + }, + { + "duration": "26.36176414285715", + "name": "rendering.desktop/css_animations_simultaneous_new_element" + }, + { + "duration": "25.415665285714276", + "name": "rendering.desktop/css_animations_simultaneous_style_element" + }, + { + "duration": "25.349099885714278", + "name": "rendering.desktop/css_animations_simultaneous_updating_class" + }, + { + "duration": "24.039566442857144", + "name": "rendering.desktop/css_animations_staggered_infinite_iterations" + }, + { + "duration": "29.88815355714285", + "name": "rendering.desktop/css_animations_staggered_inline_style" + }, + { + "duration": "31.461410871428573", + "name": "rendering.desktop/css_animations_staggered_new_element" + }, + { + "duration": "33.89442987142857", + "name": "rendering.desktop/css_animations_staggered_style_element" + }, + { + "duration": "30.09070734285715", + "name": "rendering.desktop/css_animations_staggered_updating_class" + }, + { + "duration": "31.783026057142855", + "name": "rendering.desktop/css_animations_triggered_inline_style" + }, + { + "duration": "36.91527595714286", + "name": "rendering.desktop/css_animations_triggered_new_element" + }, + { + "duration": "36.06971757142857", + "name": "rendering.desktop/css_animations_triggered_style_element" + }, + { + "duration": "31.7425162", + "name": "rendering.desktop/css_animations_triggered_updating_class" + }, + { + "duration": "25.47764412857143", + "name": "rendering.desktop/css_transitions_inline_style" + }, + { + "duration": "26.533578757142863", + "name": "rendering.desktop/css_transitions_new_element" + }, + { + "duration": "26.46153151428571", + "name": "rendering.desktop/css_transitions_staggered_inline_style" + }, + { + "duration": "28.79341624285715", + "name": "rendering.desktop/css_transitions_staggered_new_element" + }, + { + "duration": "27.29415148571428", + "name": "rendering.desktop/css_transitions_staggered_style_element" + }, + { + "duration": "26.5026212", + "name": "rendering.desktop/css_transitions_staggered_updating_class" + }, + { + "duration": "25.588057142857146", + "name": "rendering.desktop/css_transitions_style_element" + }, + { + "duration": "34.404055099999994", + "name": "rendering.desktop/css_transitions_triggered_inline_style" + }, + { + "duration": "34.69329479999999", + "name": "rendering.desktop/css_transitions_triggered_new_element" + }, + { + "duration": "35.06618632857143", + "name": "rendering.desktop/css_transitions_triggered_style_element" + }, + { + "duration": "35.345370514285726", + "name": "rendering.desktop/css_transitions_triggered_updating_class" + }, + { + "duration": "25.760914685714287", + "name": "rendering.desktop/css_transitions_updating_class" + }, + { + "duration": "23.012162042857142", + "name": "rendering.desktop/css_value_type_color" + }, + { + "duration": "115.53971081428574", + "name": "rendering.desktop/css_value_type_filter" + }, + { + "duration": "28.497065342857145", + "name": "rendering.desktop/css_value_type_length" + }, + { + "duration": "24.49286795714286", + "name": "rendering.desktop/css_value_type_length_complex" + }, + { + "duration": "24.137344271428564", + "name": "rendering.desktop/css_value_type_length_simple" + }, + { + "duration": "26.13071777142858", + "name": "rendering.desktop/css_value_type_path" + }, + { + "duration": "38.813390314285705", + "name": "rendering.desktop/css_value_type_shadow" + }, + { + "duration": "28.034281228571423", + "name": "rendering.desktop/css_value_type_transform_complex" + }, + { + "duration": "26.715328685714276", + "name": "rendering.desktop/css_value_type_transform_simple" + }, + { + "duration": "25.663650392156867", + "name": "rendering.desktop/dynamic_cube_map" + }, + { + "duration": "21.52960560784314", + "name": "rendering.desktop/earth" + }, + { + "duration": "15.200855580808083", + "name": "rendering.desktop/ebay" + }, + { + "duration": "28.249148019999996", + "name": "rendering.desktop/ebay_pinch" + }, + { + "duration": "21.738854545454537", + "name": "rendering.desktop/effect_games" + }, + { + "duration": "17.48168721212122", + "name": "rendering.desktop/espn" + }, + { + "duration": "27.421808679999998", + "name": "rendering.desktop/espn_pinch" + }, + { + "duration": "30.48678345833334", + "name": "rendering.desktop/extra_large_texture_uploads" + }, + { + "duration": "14.704679631313128", + "name": "rendering.desktop/facebook" + }, + { + "duration": "22.978376280000006", + "name": "rendering.desktop/facebook_pinch" + }, + { + "duration": "21.65039267532467", + "name": "rendering.desktop/fill_shapes" + }, + { + "duration": "40.531339", + "name": "rendering.desktop/filter_terrain_svg" + }, + { + "duration": "17.24568268831169", + "name": "rendering.desktop/geo_apis" + }, + { + "duration": "31.58440914141414", + "name": "rendering.desktop/gmail" + }, + { + "duration": "27.603372399999998", + "name": "rendering.desktop/gmail_pinch" + }, + { + "duration": "18.20735325252525", + "name": "rendering.desktop/google_calendar" + }, + { + "duration": "24.424085489795914", + "name": "rendering.desktop/google_calendar_pinch" + }, + { + "duration": "35.69422485858585", + "name": "rendering.desktop/google_docs" + }, + { + "duration": "24.176698795918366", + "name": "rendering.desktop/google_image_pinch" + }, + { + "duration": "22.426572919191916", + "name": "rendering.desktop/google_image_search" + }, + { + "duration": "24.924413353535364", + "name": "rendering.desktop/google_plus" + }, + { + "duration": "21.881727122448982", + "name": "rendering.desktop/google_search_pinch" + }, + { + "duration": "15.343383540404043", + "name": "rendering.desktop/google_web_search" + }, + { + "duration": "26.128881192307688", + "name": "rendering.desktop/guimark_vector_chart" + }, + { + "duration": "20.90633546052631", + "name": "rendering.desktop/hakim" + }, + { + "duration": "37.224953679487186", + "name": "rendering.desktop/ie_chalkboard" + }, + { + "duration": "27.810241543209873", + "name": "rendering.desktop/ie_pirate_mark" + }, + { + "duration": "21.194153500000002", + "name": "rendering.desktop/jarro_doverson" + }, + { + "duration": "19.484941782894747", + "name": "rendering.desktop/kevs_3d" + }, + { + "duration": "22.18765786956522", + "name": "rendering.desktop/keyframed_animations" + }, + { + "duration": "37.91653838297873", + "name": "rendering.desktop/large_texture_uploads" + }, + { + "duration": "16.292280595959596", + "name": "rendering.desktop/linkedin" + }, + { + "duration": "21.104168693877547", + "name": "rendering.desktop/linkedin_pinch" + }, + { + "duration": "23.37445077631579", + "name": "rendering.desktop/man_in_blue" + }, + { + "duration": "29.16982935526316", + "name": "rendering.desktop/many_images" + }, + { + "duration": "21.97098348", + "name": "rendering.desktop/many_planets_deep" + }, + { + "duration": "20.753177767676767", + "name": "rendering.desktop/maps_move" + }, + { + "duration": "37.910785919999995", + "name": "rendering.desktop/maps_perf_test" + }, + { + "duration": "25.341859787234046", + "name": "rendering.desktop/medium_texture_uploads" + }, + { + "duration": "19.29705230921053", + "name": "rendering.desktop/megi_dish" + }, + { + "duration": "17.976199671052633", + "name": "rendering.desktop/microsoft_asteroid_belt" + }, + { + "duration": "30.466343328947374", + "name": "rendering.desktop/microsoft_fireflies" + }, + { + "duration": "19.743317263157895", + "name": "rendering.desktop/microsoft_fish_ie_tank" + }, + { + "duration": "18.4140957368421", + "name": "rendering.desktop/microsoft_snow" + }, + { + "duration": "17.056776230263164", + "name": "rendering.desktop/microsoft_speed_reading" + }, + { + "duration": "18.333149723684215", + "name": "rendering.desktop/microsoft_tweet_map" + }, + { + "duration": "28.53533818421053", + "name": "rendering.desktop/microsoft_video_city" + }, + { + "duration": "18.969499302631586", + "name": "rendering.desktop/microsoft_worker_fountains" + }, + { + "duration": "16.72333522368422", + "name": "rendering.desktop/mix_10k" + }, + { + "duration": "24.037403956521743", + "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "43.362494043478286", + "name": "rendering.desktop/mix_blend_mode_animation_screen" + }, + { + "duration": "28.95227367532468", + "name": "rendering.desktop/motion_mark_canvas_fill_shapes" + }, + { + "duration": "28.501088090909093", + "name": "rendering.desktop/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "39.767285419753094", + "name": "rendering.desktop/motion_mark_focus" + }, + { + "duration": "23.04270188000001", + "name": "rendering.desktop/nvidia_vertex_buffer_object" + }, + { + "duration": "45.472272217391314", + "name": "rendering.desktop/overlay_background_color_css_transitions_page" + }, + { + "duration": "23.387237440000003", + "name": "rendering.desktop/particles" + }, + { + "duration": "24.24365155555556", + "name": "rendering.desktop/pinterest" + }, + { + "duration": "18.73900646052632", + "name": "rendering.desktop/put_get_image_data" + }, + { + "duration": "21.620298446808512", + "name": "rendering.desktop/raf" + }, + { + "duration": "21.713290893617028", + "name": "rendering.desktop/raf_animation" + }, + { + "duration": "20.930093000000003", + "name": "rendering.desktop/raf_canvas" + }, + { + "duration": "21.959632765957448", + "name": "rendering.desktop/raf_touch_animation" + }, + { + "duration": "19.07125531578948", + "name": "rendering.desktop/runway" + }, + { + "duration": "21.719624020000005", + "name": "rendering.desktop/san_angeles" + }, + { + "duration": "12.610798031914895", + "name": "rendering.desktop/second_batch_js_heavy" + }, + { + "duration": "12.377985042553192", + "name": "rendering.desktop/second_batch_js_light" + }, + { + "duration": "12.574104425531916", + "name": "rendering.desktop/second_batch_js_medium" + }, + { + "duration": "18.884137893617023", + "name": "rendering.desktop/simple_text_page" + }, + { + "duration": "7.737912517021274", + "name": "rendering.desktop/simple_touch_drag" + }, + { + "duration": "23.53510312765957", + "name": "rendering.desktop/small_texture_uploads" + }, + { + "duration": "23.176165078947367", + "name": "rendering.desktop/smash_cat" + }, + { + "duration": "16.77311586842105", + "name": "rendering.desktop/spielzeugz" + }, + { + "duration": "21.778771763157895", + "name": "rendering.desktop/stroke_shapes" + }, + { + "duration": "7.704584044680849", + "name": "rendering.desktop/sync_scroll_offset" + }, + { + "duration": "42.089080868686885", + "name": "rendering.desktop/techcrunch" + }, + { + "duration": "19.430712244897958", + "name": "rendering.desktop/text_05000_pixels_per_second" + }, + { + "duration": "18.757739979591832", + "name": "rendering.desktop/text_10000_pixels_per_second" + }, + { + "duration": "16.025193112244903", + "name": "rendering.desktop/text_15000_pixels_per_second" + }, + { + "duration": "14.623178326530613", + "name": "rendering.desktop/text_20000_pixels_per_second" + }, + { + "duration": "13.161729377551021", + "name": "rendering.desktop/text_30000_pixels_per_second" + }, + { + "duration": "12.428874336734692", + "name": "rendering.desktop/text_40000_pixels_per_second" + }, + { + "duration": "11.953908755102036", + "name": "rendering.desktop/text_50000_pixels_per_second" + }, + { + "duration": "11.576092714285712", + "name": "rendering.desktop/text_60000_pixels_per_second" + }, + { + "duration": "11.293752816326528", + "name": "rendering.desktop/text_75000_pixels_per_second" + }, + { + "duration": "11.065933153061223", + "name": "rendering.desktop/text_90000_pixels_per_second" + }, + { + "duration": "24.34965736734694", + "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "22.881238387755104", + "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "19.63286079591837", + "name": "rendering.desktop/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "17.90848253061224", + "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "16.09091573469388", + "name": "rendering.desktop/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "15.231959928571428", + "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "14.543279693877547", + "name": "rendering.desktop/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "14.221721683673469", + "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "13.844768193877554", + "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "13.497836357142857", + "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "19.51291426530612", + "name": "rendering.desktop/text_hover_05000_pixels_per_second" + }, + { + "duration": "18.77244724489796", + "name": "rendering.desktop/text_hover_10000_pixels_per_second" + }, + { + "duration": "16.115957755102038", + "name": "rendering.desktop/text_hover_15000_pixels_per_second" + }, + { + "duration": "14.70059171428571", + "name": "rendering.desktop/text_hover_20000_pixels_per_second" + }, + { + "duration": "13.201603499999996", + "name": "rendering.desktop/text_hover_30000_pixels_per_second" + }, + { + "duration": "12.418514234693877", + "name": "rendering.desktop/text_hover_40000_pixels_per_second" + }, + { + "duration": "12.008495734693875", + "name": "rendering.desktop/text_hover_50000_pixels_per_second" + }, + { + "duration": "11.651370724489796", + "name": "rendering.desktop/text_hover_60000_pixels_per_second" + }, + { + "duration": "11.317619469387756", + "name": "rendering.desktop/text_hover_75000_pixels_per_second" + }, + { + "duration": "11.084394000000005", + "name": "rendering.desktop/text_hover_90000_pixels_per_second" + }, + { + "duration": "18.71187182978723", + "name": "rendering.desktop/touch_handler_scrolling" + }, + { + "duration": "25.8106805942029", + "name": "rendering.desktop/transform_transitions" + }, + { + "duration": "21.55384404347825", + "name": "rendering.desktop/transform_transitions_js_block" + }, + { + "duration": "16.69549933838384", + "name": "rendering.desktop/twitter" + }, + { + "duration": "24.53129781632654", + "name": "rendering.desktop/twitter_pinch" + }, + { + "duration": "29.100658323232327", + "name": "rendering.desktop/weather.com" + }, + { + "duration": "33.27253226530612", + "name": "rendering.desktop/weather_pinch" + }, + { + "duration": "23.073251014492744", + "name": "rendering.desktop/web_animation_value_type_color" + }, + { + "duration": "27.58913828985508", + "name": "rendering.desktop/web_animation_value_type_length_3d" + }, + { + "duration": "24.233371318840575", + "name": "rendering.desktop/web_animation_value_type_length_complex" + }, + { + "duration": "24.161580956521743", + "name": "rendering.desktop/web_animation_value_type_length_simple" + }, + { + "duration": "26.25676684057973", + "name": "rendering.desktop/web_animation_value_type_path" + }, + { + "duration": "38.49380218840581", + "name": "rendering.desktop/web_animation_value_type_shadow" + }, + { + "duration": "27.685670753623185", + "name": "rendering.desktop/web_animation_value_type_transform_complex" + }, + { + "duration": "26.184169884057972", + "name": "rendering.desktop/web_animation_value_type_transform_simple" + }, + { + "duration": "30.231751884057964", + "name": "rendering.desktop/web_animations_many_keyframes" + }, + { + "duration": "24.892218000000007", + "name": "rendering.desktop/web_animations_set_current_time" + }, + { + "duration": "26.009170637681166", + "name": "rendering.desktop/web_animations_simultaneous" + }, + { + "duration": "30.356696130434774", + "name": "rendering.desktop/web_animations_staggered_chaining" + }, + { + "duration": "24.917006710144925", + "name": "rendering.desktop/web_animations_staggered_infinite_iterations" + }, + { + "duration": "32.22520573913042", + "name": "rendering.desktop/web_animations_staggered_triggering_page" + }, + { + "duration": "21.62719195959595", + "name": "rendering.desktop/wikipedia" + }, + { + "duration": "26.05996730303031", + "name": "rendering.desktop/wordpress" + }, + { + "duration": "15.363028156565655", + "name": "rendering.desktop/yahoo_answers" + }, + { + "duration": "33.18039363636363", + "name": "rendering.desktop/yahoo_games" + }, + { + "duration": "31.93056940816327", + "name": "rendering.desktop/yahoo_games_pinch" + }, + { + "duration": "23.67292702020202", + "name": "rendering.desktop/yahoo_news" + }, + { + "duration": "26.399087693877544", + "name": "rendering.desktop/yahoo_news_pinch" + }, + { + "duration": "28.100682494949506", + "name": "rendering.desktop/yahoo_sports" + }, + { + "duration": "53.16562275510202", + "name": "rendering.desktop/yahoo_sports_pinch" + }, + { + "duration": "24.551757", + "name": "rendering.desktop/youtube_pinch" + }, + { + "duration": "25.3358977173913", + "name": "rendering.desktop/yuv_decoding" + }, + { + "duration": "15.837430559701492", + "name": "scheduler.tough_scheduling_cases/raf" + }, + { + "duration": "15.886520010101014", + "name": "scheduler.tough_scheduling_cases/raf.html" + }, + { + "duration": "15.874872865671634", + "name": "scheduler.tough_scheduling_cases/raf_animation" + }, + { + "duration": "15.83117239393939", + "name": "scheduler.tough_scheduling_cases/raf_animation.html" + }, + { + "duration": "15.560130499999996", + "name": "scheduler.tough_scheduling_cases/raf_canvas" + }, + { + "duration": "15.481027499999998", + "name": "scheduler.tough_scheduling_cases/raf_canvas.html" + }, + { + "duration": "16.00982185074627", + "name": "scheduler.tough_scheduling_cases/raf_touch_animation" + }, + { + "duration": "16.055890707070716", + "name": "scheduler.tough_scheduling_cases/raf_touch_animation.html" + }, + { + "duration": "9.863540515151517", + "name": "scheduler.tough_scheduling_cases/second_batch_js.html?heavy" + }, + { + "duration": "9.637019530303027", + "name": "scheduler.tough_scheduling_cases/second_batch_js.html?light" + }, + { + "duration": "9.794869656565657", + "name": "scheduler.tough_scheduling_cases/second_batch_js.html?medium" + }, + { + "duration": "9.84464273880597", + "name": "scheduler.tough_scheduling_cases/second_batch_js_heavy" + }, + { + "duration": "9.658059567164178", + "name": "scheduler.tough_scheduling_cases/second_batch_js_light" + }, + { + "duration": "9.799067074626862", + "name": "scheduler.tough_scheduling_cases/second_batch_js_medium" + }, + { + "duration": "15.365146231343287", + "name": "scheduler.tough_scheduling_cases/simple_text_page" + }, + { + "duration": "15.352536297979796", + "name": "scheduler.tough_scheduling_cases/simple_text_page.html" + }, + { + "duration": "7.574478722388057", + "name": "scheduler.tough_scheduling_cases/simple_touch_drag" + }, + { + "duration": "7.5688877090909115", + "name": "scheduler.tough_scheduling_cases/simple_touch_drag.html" + }, + { + "duration": "7.637987070149252", + "name": "scheduler.tough_scheduling_cases/sync_scroll_offset" + }, + { + "duration": "7.612689785858583", + "name": "scheduler.tough_scheduling_cases/sync_scroll_offset.html" + }, + { + "duration": "14.878857276119406", + "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling" + }, + { + "duration": "14.836455459595964", + "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling.html" + }, + { + "duration": "14.724985292929292", + "name": "smoothness.desktop_tough_pinch_zoom_cases/Blogger" + }, + { + "duration": "15.973620166666661", + "name": "smoothness.desktop_tough_pinch_zoom_cases/ESPN" + }, + { + "duration": "14.432573601010096", + "name": "smoothness.desktop_tough_pinch_zoom_cases/Facebook" + }, + { + "duration": "14.349806030303023", + "name": "smoothness.desktop_tough_pinch_zoom_cases/LinkedIn" + }, + { + "duration": "16.785459292929296", + "name": "smoothness.desktop_tough_pinch_zoom_cases/Twitter" + }, + { + "duration": "17.162776383838388", + "name": "smoothness.desktop_tough_pinch_zoom_cases/Weather.com" + }, + { + "duration": "14.071157094117652", + "name": "smoothness.desktop_tough_pinch_zoom_cases/amazon_pinch" + }, + { + "duration": "15.117647782352943", + "name": "smoothness.desktop_tough_pinch_zoom_cases/blogspot_pinch" + }, + { + "duration": "14.894548029411764", + "name": "smoothness.desktop_tough_pinch_zoom_cases/booking_pinch" + }, + { + "duration": "16.38699145882353", + "name": "smoothness.desktop_tough_pinch_zoom_cases/cnn_pinch" + }, + { + "duration": "16.474597858823532", + "name": "smoothness.desktop_tough_pinch_zoom_cases/ebay_pinch" + }, + { + "duration": "16.081638476470587", + "name": "smoothness.desktop_tough_pinch_zoom_cases/espn_pinch" + }, + { + "duration": "14.9958313117647", + "name": "smoothness.desktop_tough_pinch_zoom_cases/facebook_pinch" + }, + { + "duration": "17.203779247058826", + "name": "smoothness.desktop_tough_pinch_zoom_cases/gmail_pinch" + }, + { + "duration": "16.4372174882353", + "name": "smoothness.desktop_tough_pinch_zoom_cases/google_calendar_pinch" + }, + { + "duration": "14.91843996470588", + "name": "smoothness.desktop_tough_pinch_zoom_cases/google_image_pinch" + }, + { + "duration": "17.353390352941183", + "name": "smoothness.desktop_tough_pinch_zoom_cases/google_search_pinch" + }, + { + "duration": "14.783702424242426", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://booking.com" + }, + { + "duration": "22.77694878787878", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://games.yahoo.com" + }, + { + "duration": "15.378625904040407", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://news.yahoo.com" + }, + { + "duration": "19.376213757575755", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://sports.yahoo.com/" + }, + { + "duration": "14.014228803030306", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.amazon.com" + }, + { + "duration": "16.314278469696966", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.cnn.com" + }, + { + "duration": "16.365593823232327", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.ebay.com" + }, + { + "duration": "16.675471070707072", + "name": "smoothness.desktop_tough_pinch_zoom_cases/http://www.youtube.com" + }, + { + "duration": "16.62530615151515", + "name": "smoothness.desktop_tough_pinch_zoom_cases/https://mail.google.com/mail/" + }, + { + "duration": "16.394249979797976", + "name": "smoothness.desktop_tough_pinch_zoom_cases/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "15.966837010101006", + "name": "smoothness.desktop_tough_pinch_zoom_cases/https://www.google.com/calendar/" + }, + { + "duration": "14.403697924242424", + "name": "smoothness.desktop_tough_pinch_zoom_cases/https://www.google.com/search?q=cats&tbm=isch" + }, + { + "duration": "13.981708794117646", + "name": "smoothness.desktop_tough_pinch_zoom_cases/linkedin_pinch" + }, + { + "duration": "16.899868400000006", + "name": "smoothness.desktop_tough_pinch_zoom_cases/twitter_pinch" + }, + { + "duration": "17.237239482352944", + "name": "smoothness.desktop_tough_pinch_zoom_cases/weather_pinch" + }, + { + "duration": "22.897598741176473", + "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_games_pinch" + }, + { + "duration": "15.57362414117647", + "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_news_pinch" + }, + { + "duration": "19.45015728235295", + "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_sports_pinch" + }, + { + "duration": "16.73117815294117", + "name": "smoothness.desktop_tough_pinch_zoom_cases/youtube_pinch" + }, + { + "duration": "19.998229767676765", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" + }, + { + "duration": "29.08948407070706", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/IE_Chalkboard" + }, + { + "duration": "20.986314353535352", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" + }, + { + "duration": "21.035225494949497", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" + }, + { + "duration": "20.03888820930233", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "29.15823700000001", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "21.10081136046513", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "20.606795534883723", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "15.649636136363634", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "14.832833398989894", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "12.763729338383841", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "11.657431045454546", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "10.562586308080803", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "10.008706621212122", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "9.73742015151515", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "9.543585570707071", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "9.30509122727273", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "9.187339530303033", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "15.862020838383831", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "14.393948101010105", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "12.251862080808076", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "11.174145787878787", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "10.138510671717171", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "9.658480939393941", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "9.286407313131312", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "9.059993752525253", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "8.83305585858586", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "8.733842015151515", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "16.855946787878782", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "15.95239503535354", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "13.752914565656566", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "12.666442242424242", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "11.544474540404043", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "11.077541232323238", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "10.682718606060604", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "10.419693934343435", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "10.242258909090907", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "10.138971353535355", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "15.112538444444445", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "14.36445145454546", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "12.286765126262624", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "11.299098732323232", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "10.12859258080808", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "9.600865580808083", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "9.2971948030303", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "9.091027984848486", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "8.85816633838384", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "8.777905797979797", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "18.46680734328358", + "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding" + }, + { + "duration": "18.601325383838383", + "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding.html" + }, + { + "duration": "18.625505089552227", + "name": "smoothness.image_decoding_cases/yuv_decoding" + }, + { + "duration": "18.681415454545455", + "name": "smoothness.image_decoding_cases/yuv_decoding.html" + }, + { + "duration": "17.38438791919192", + "name": "smoothness.key_desktop_move_cases/Maps" + }, + { + "duration": "17.751600949494957", + "name": "smoothness.key_desktop_move_cases/maps_move" + }, + { + "duration": "29.038805969696966", + "name": "smoothness.maps/maps_perf_test" + }, + { + "duration": "20.410245313131316", + "name": "smoothness.top_25_smooth/blogspot" + }, + { + "duration": "13.015650393939387", + "name": "smoothness.top_25_smooth/booking.com" + }, + { + "duration": "11.143152156565662", + "name": "smoothness.top_25_smooth/ebay" + }, + { + "duration": "14.546745479797977", + "name": "smoothness.top_25_smooth/espn" + }, + { + "duration": "11.921510106060607", + "name": "smoothness.top_25_smooth/facebook" + }, + { + "duration": "20.33296715151515", + "name": "smoothness.top_25_smooth/gmail" + }, + { + "duration": "15.017192883838387", + "name": "smoothness.top_25_smooth/google_calendar" + }, + { + "duration": "24.770689000000004", + "name": "smoothness.top_25_smooth/google_docs" + }, + { + "duration": "16.932537040404043", + "name": "smoothness.top_25_smooth/google_image_search" + }, + { + "duration": "19.32116858585859", + "name": "smoothness.top_25_smooth/google_plus" + }, + { + "duration": "10.571382590909089", + "name": "smoothness.top_25_smooth/google_web_search" + }, + { + "duration": "14.693469580808081", + "name": "smoothness.top_25_smooth/linkedin" + }, + { + "duration": "16.473759737373733", + "name": "smoothness.top_25_smooth/pinterest" + }, + { + "duration": "20.510522373737373", + "name": "smoothness.top_25_smooth/techcrunch" + }, + { + "duration": "16.383857328282822", + "name": "smoothness.top_25_smooth/twitter" + }, + { + "duration": "15.179054797979793", + "name": "smoothness.top_25_smooth/weather.com" + }, + { + "duration": "17.860649858585855", + "name": "smoothness.top_25_smooth/wikipedia" + }, + { + "duration": "17.374213313131314", + "name": "smoothness.top_25_smooth/wordpress" + }, + { + "duration": "11.854583611111108", + "name": "smoothness.top_25_smooth/yahoo_answers" + }, + { + "duration": "26.206967060606054", + "name": "smoothness.top_25_smooth/yahoo_games" + }, + { + "duration": "19.865204444444448", + "name": "smoothness.top_25_smooth/yahoo_news" + }, + { + "duration": "21.204828050505057", + "name": "smoothness.top_25_smooth/yahoo_sports" + }, + { + "duration": "19.860714686868686", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swiffy72.html" + }, + { + "duration": "19.52098885858587", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swiffy72.html" + }, + { + "duration": "19.48354504040404", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swiffy72.html" + }, + { + "duration": "19.494973242424244", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swiffy72.html" + }, + { + "duration": "19.509289969696972", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swiffy72.html" + }, + { + "duration": "19.51502955555556", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swiffy72.html" + }, + { + "duration": "19.523907080808087", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swiffy72.html" + }, + { + "duration": "19.501339343434335", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swiffy72.html" + }, + { + "duration": "19.486066747474748", + "name": "smoothness.tough_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swiffy72.html" + }, + { + "duration": "19.495633838383846", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swiffy72.html" + }, + { + "duration": "19.50801417171718", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swiffy72.html" + }, + { + "duration": "20.962679534883716", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations" + }, + { + "duration": "27.32595731395349", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "20.87869283838384", + "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations.html" + }, + { + "duration": "26.5529428989899", + "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations_composited_transform.html" + }, + { + "duration": "23.162051337209302", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties" + }, + { + "duration": "22.833466030303025", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties.html" + }, + { + "duration": "23.092460511627902", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties" + }, + { + "duration": "22.85261584848485", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties.html" + }, + { + "duration": "23.111995093023264", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties" + }, + { + "duration": "22.911775131313128", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties.html" + }, + { + "duration": "21.32021456976744", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas" + }, + { + "duration": "21.277750747474755", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas.html" + }, + { + "duration": "19.694949779069777", + "name": "smoothness.tough_animation_cases/balls_javascript_css" + }, + { + "duration": "19.62554627272728", + "name": "smoothness.tough_animation_cases/balls_javascript_css.html" + }, + { + "duration": "20.478481411764704", + "name": "smoothness.tough_animation_cases/balls_svg_animations" + }, + { + "duration": "20.47549767676768", + "name": "smoothness.tough_animation_cases/balls_svg_animations.html" + }, + { + "duration": "27.54422975", + "name": "smoothness.tough_animation_cases/compositor_heavy_animation" + }, + { + "duration": "27.760247939393953", + "name": "smoothness.tough_animation_cases/compositor_heavy_animation.html?N=0200" + }, + { + "duration": "20.573910465116285", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes" + }, + { + "duration": "20.563384646464648", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes.html?N=0316" + }, + { + "duration": "20.324860838383824", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_new_element.html?N=0316" + }, + { + "duration": "19.720987969696974", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_style_element.html?N=0316" + }, + { + "duration": "19.689582727272718", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_class.html?N=0316" + }, + { + "duration": "19.711484525252526", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_inline_style.html?N=0316" + }, + { + "duration": "19.71285170930232", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_inline_style" + }, + { + "duration": "20.342929872093027", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_new_element" + }, + { + "duration": "19.7585531511628", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_style_element" + }, + { + "duration": "19.727694337209304", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_updating_class" + }, + { + "duration": "22.864182121212128", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_new_element.html?N=0316" + }, + { + "duration": "23.210880484848495", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_style_element.html?N=0316" + }, + { + "duration": "21.764679555555563", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_class.html?N=0316" + }, + { + "duration": "21.78948646464645", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_inline_style.html?N=0316" + }, + { + "duration": "18.982972941860456", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations" + }, + { + "duration": "18.968509313131317", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations.html?N=0316" + }, + { + "duration": "21.803326174418597", + "name": "smoothness.tough_animation_cases/css_animations_staggered_inline_style" + }, + { + "duration": "22.86605011627907", + "name": "smoothness.tough_animation_cases/css_animations_staggered_new_element" + }, + { + "duration": "23.239290906976745", + "name": "smoothness.tough_animation_cases/css_animations_staggered_style_element" + }, + { + "duration": "24.88927616161616", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_new_element.html?N=0316" + }, + { + "duration": "23.607867060606058", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_style_element.html?N=0316" + }, + { + "duration": "22.43256077777777", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_class.html?N=0316" + }, + { + "duration": "22.53777740404039", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_inline_style.html?N=0316" + }, + { + "duration": "21.82210510465117", + "name": "smoothness.tough_animation_cases/css_animations_staggered_updating_class" + }, + { + "duration": "22.535126069767443", + "name": "smoothness.tough_animation_cases/css_animations_triggered_inline_style" + }, + { + "duration": "24.98671904651163", + "name": "smoothness.tough_animation_cases/css_animations_triggered_new_element" + }, + { + "duration": "23.652728918604655", + "name": "smoothness.tough_animation_cases/css_animations_triggered_style_element" + }, + { + "duration": "22.513330476744184", + "name": "smoothness.tough_animation_cases/css_animations_triggered_updating_class" + }, + { + "duration": "19.737274325581396", + "name": "smoothness.tough_animation_cases/css_transitions_inline_style" + }, + { + "duration": "21.707572581395354", + "name": "smoothness.tough_animation_cases/css_transitions_new_element" + }, + { + "duration": "20.95426896969697", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_new_element.html?N=0316" + }, + { + "duration": "19.867759646464645", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_style_element.html?N=0316" + }, + { + "duration": "19.901586707070713", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_class.html?N=0316" + }, + { + "duration": "19.725394404040404", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.89948503030304", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_new_element.html?N=0316" + }, + { + "duration": "20.337570939393938", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_style_element.html?N=0316" + }, + { + "duration": "20.19235923232323", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_class.html?N=0316" + }, + { + "duration": "20.214763313131314", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.237921872093022", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_inline_style" + }, + { + "duration": "20.96623968604651", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_new_element" + }, + { + "duration": "20.349777965116285", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_style_element" + }, + { + "duration": "23.3253635050505", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_new_element.html?N=0316" + }, + { + "duration": "23.131718232323237", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_style_element.html?N=0316" + }, + { + "duration": "23.30960224242424", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_class.html?N=0316" + }, + { + "duration": "23.368681979797973", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_inline_style.html?N=0316" + }, + { + "duration": "20.26798391860465", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_updating_class" + }, + { + "duration": "19.847692046511625", + "name": "smoothness.tough_animation_cases/css_transitions_style_element" + }, + { + "duration": "23.473373244186057", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_inline_style" + }, + { + "duration": "23.328618302325584", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_new_element" + }, + { + "duration": "23.05599722093023", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_style_element" + }, + { + "duration": "23.297456011627904", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_updating_class" + }, + { + "duration": "19.75726805813954", + "name": "smoothness.tough_animation_cases/css_transitions_updating_class" + }, + { + "duration": "18.659262941860465", + "name": "smoothness.tough_animation_cases/css_value_type_color" + }, + { + "duration": "18.655359646464646", + "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=css_animations&N=0316" + }, + { + "duration": "18.666501333333333", + "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=web_animations&N=0316" + }, + { + "duration": "26.75275359302325", + "name": "smoothness.tough_animation_cases/css_value_type_filter" + }, + { + "duration": "26.256009121212124", + "name": "smoothness.tough_animation_cases/css_value_type_filter.html?api=css_animations&N=0316" + }, + { + "duration": "20.009236930232557", + "name": "smoothness.tough_animation_cases/css_value_type_length" + }, + { + "duration": "19.866614919191928", + "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=css_animations&N=0316" + }, + { + "duration": "19.832942404040402", + "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=web_animations&N=0316" + }, + { + "duration": "19.34185159302326", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex" + }, + { + "duration": "19.410592868686873", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=css_animations&N=0316" + }, + { + "duration": "19.423863141414138", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=web_animations&N=0316" + }, + { + "duration": "19.345939779069766", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple" + }, + { + "duration": "19.395760030303038", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=css_animations&N=0316" + }, + { + "duration": "19.363993979797975", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=web_animations&N=0316" + }, + { + "duration": "19.979753127906978", + "name": "smoothness.tough_animation_cases/css_value_type_path" + }, + { + "duration": "20.080419535353542", + "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=css_animations&N=0316" + }, + { + "duration": "20.062487646464643", + "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=web_animations&N=0316" + }, + { + "duration": "26.23560455813953", + "name": "smoothness.tough_animation_cases/css_value_type_shadow" + }, + { + "duration": "26.249552626262627", + "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=css_animations&N=0316" + }, + { + "duration": "25.947424929292904", + "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=web_animations&N=0316" + }, + { + "duration": "20.30109747674417", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex" + }, + { + "duration": "20.11188296969697", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=css_animations&N=0316" + }, + { + "duration": "20.021256343434338", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=web_animations&N=0316" + }, + { + "duration": "19.635607767441865", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple" + }, + { + "duration": "19.599782929292928", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=css_animations&N=0316" + }, + { + "duration": "19.438765818181817", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=web_animations&N=0316" + }, + { + "duration": "18.764200755813956", + "name": "smoothness.tough_animation_cases/keyframed_animations" + }, + { + "duration": "22.18775632323231", + "name": "smoothness.tough_animation_cases/keyframed_animations.html" + }, + { + "duration": "18.93360777906977", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "21.194893430232558", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen" + }, + { + "duration": "21.178757494949497", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen.html" + }, + { + "duration": "18.979572727272714", + "name": "smoothness.tough_animation_cases/mix_blend_mode_propagating_isolation.html" + }, + { + "duration": "33.793385767676774", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions.html" + }, + { + "duration": "33.50944209302325", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions_page" + }, + { + "duration": "18.16388262626263", + "name": "smoothness.tough_animation_cases/transform_transition_js_block.html" + }, + { + "duration": "19.04688224418605", + "name": "smoothness.tough_animation_cases/transform_transitions" + }, + { + "duration": "19.024928070707066", + "name": "smoothness.tough_animation_cases/transform_transitions.html" + }, + { + "duration": "18.178792999999995", + "name": "smoothness.tough_animation_cases/transform_transitions_js_block" + }, + { + "duration": "18.692675825581393", + "name": "smoothness.tough_animation_cases/web_animation_value_type_color" + }, + { + "duration": "19.925567313953493", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_3d" + }, + { + "duration": "19.38041586046512", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_complex" + }, + { + "duration": "19.35285911627907", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_simple" + }, + { + "duration": "19.93855740697675", + "name": "smoothness.tough_animation_cases/web_animation_value_type_path" + }, + { + "duration": "25.809405046511614", + "name": "smoothness.tough_animation_cases/web_animation_value_type_shadow" + }, + { + "duration": "20.03560001162791", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_complex" + }, + { + "duration": "19.485457360465123", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_simple" + }, + { + "duration": "21.311230174418597", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes" + }, + { + "duration": "21.350133262626265", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes.html?N=0316" + }, + { + "duration": "19.169870593023248", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time" + }, + { + "duration": "19.137220959595968", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time_in_raf.html?N=0316" + }, + { + "duration": "19.861052430232558", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous" + }, + { + "duration": "19.852897010101003", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous.html?N=0316" + }, + { + "duration": "21.905703674418618", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining" + }, + { + "duration": "21.879003828282837", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining.html?N=0316" + }, + { + "duration": "18.924152476744187", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations" + }, + { + "duration": "18.875343828282833", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations.html?N=0316" + }, + { + "duration": "22.951247232323222", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering.html?N=0316" + }, + { + "duration": "22.780875697674414", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering_page" + }, + { + "duration": "18.32051068686869", + "name": "smoothness.tough_canvas_cases/../../../chrome/test/data/perf/canvas_bench/many_images.html" + }, + { + "duration": "13.792031727777779", + "name": "smoothness.tough_canvas_cases/bouncing_balls_15" + }, + { + "duration": "16.14567445555556", + "name": "smoothness.tough_canvas_cases/bouncing_balls_shadow" + }, + { + "duration": "15.259454655555558", + "name": "smoothness.tough_canvas_cases/bouncing_clipped_rectangles" + }, + { + "duration": "15.790189905555563", + "name": "smoothness.tough_canvas_cases/bouncing_gradient_circles" + }, + { + "duration": "12.706597688888886", + "name": "smoothness.tough_canvas_cases/bouncing_png_images" + }, + { + "duration": "23.095876411111107", + "name": "smoothness.tough_canvas_cases/bouncing_svg_images" + }, + { + "duration": "31.109256299999995", + "name": "smoothness.tough_canvas_cases/canvas_animation_no_clear" + }, + { + "duration": "15.33082041111111", + "name": "smoothness.tough_canvas_cases/canvas_arcs" + }, + { + "duration": "14.298423877777777", + "name": "smoothness.tough_canvas_cases/canvas_font_cycler" + }, + { + "duration": "14.120086655555557", + "name": "smoothness.tough_canvas_cases/canvas_lines" + }, + { + "duration": "17.68015568888889", + "name": "smoothness.tough_canvas_cases/canvas_to_blob" + }, + { + "duration": "14.217035072222219", + "name": "smoothness.tough_canvas_cases/chip_tune" + }, + { + "duration": "14.335898655555555", + "name": "smoothness.tough_canvas_cases/crafty_mind" + }, + { + "duration": "14.059335338888893", + "name": "smoothness.tough_canvas_cases/effect_games" + }, + { + "duration": "15.590460311111107", + "name": "smoothness.tough_canvas_cases/fill_shapes" + }, + { + "duration": "16.161991644444452", + "name": "smoothness.tough_canvas_cases/geo_apis" + }, + { + "duration": "13.971381422222226", + "name": "smoothness.tough_canvas_cases/hakim" + }, + { + "duration": "16.091844646464647", + "name": "smoothness.tough_canvas_cases/http://geoapis.appspot.com/agdnZW9hcGlzchMLEgtFeGFtcGxlQ29kZRjh1wIM" + }, + { + "duration": "13.962219479797977", + "name": "smoothness.tough_canvas_cases/http://hakim.se/experiments/html5/magnetic/02/" + }, + { + "duration": "14.121134338383833", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/TweetMap/Default.html" + }, + { + "duration": "16.157696707070706", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/VideoCity/Default.html" + }, + { + "duration": "13.903261631313125", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/WorkerFountains/Default.html" + }, + { + "duration": "14.161583813131312", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/AsteroidBelt/Default.html" + }, + { + "duration": "14.338037161616162", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html" + }, + { + "duration": "14.484162045454552", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/LetItSnow/" + }, + { + "duration": "13.863966146464644", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/SpeedReading/Default.html" + }, + { + "duration": "15.370578252525249", + "name": "smoothness.tough_canvas_cases/http://jarrodoverson.com/static/demos/particleSystem/" + }, + { + "duration": "13.574618752525254", + "name": "smoothness.tough_canvas_cases/http://mix10k.visitmix.com/Entry/Details/169" + }, + { + "duration": "12.997616383838388", + "name": "smoothness.tough_canvas_cases/http://runway.countlessprojects.com/prototype/performance_test.html" + }, + { + "duration": "13.663145363636367", + "name": "smoothness.tough_canvas_cases/http://spielzeugz.de/html5/liquid-particles.html" + }, + { + "duration": "14.964242388888886", + "name": "smoothness.tough_canvas_cases/http://themaninblue.com/experiment/AnimationBenchmark/canvas/" + }, + { + "duration": "14.2112550959596", + "name": "smoothness.tough_canvas_cases/http://www.chiptune.com/starfield/starfield.html" + }, + { + "duration": "14.231329686868689", + "name": "smoothness.tough_canvas_cases/http://www.craftymind.com/factory/guimark2/HTML5ChartingTest.html" + }, + { + "duration": "14.166385595959593", + "name": "smoothness.tough_canvas_cases/http://www.effectgames.com/demos/canvascycle/" + }, + { + "duration": "13.628931924242425", + "name": "smoothness.tough_canvas_cases/http://www.kevs3d.co.uk/dev/canvask3d/k3d_test.html" + }, + { + "duration": "13.991784393939387", + "name": "smoothness.tough_canvas_cases/http://www.megidish.net/awjs/" + }, + { + "duration": "15.071089414141408", + "name": "smoothness.tough_canvas_cases/http://www.smashcat.org/av/canvas_test/" + }, + { + "duration": "15.403436494444446", + "name": "smoothness.tough_canvas_cases/jarro_doverson" + }, + { + "duration": "13.659057200000001", + "name": "smoothness.tough_canvas_cases/kevs_3d" + }, + { + "duration": "15.022161194444445", + "name": "smoothness.tough_canvas_cases/man_in_blue" + }, + { + "duration": "18.548073133333336", + "name": "smoothness.tough_canvas_cases/many_images" + }, + { + "duration": "14.051014044444448", + "name": "smoothness.tough_canvas_cases/megi_dish" + }, + { + "duration": "14.140916472222223", + "name": "smoothness.tough_canvas_cases/microsoft_asteroid_belt" + }, + { + "duration": "14.41722318333333", + "name": "smoothness.tough_canvas_cases/microsoft_fish_ie_tank" + }, + { + "duration": "14.42295443888888", + "name": "smoothness.tough_canvas_cases/microsoft_snow" + }, + { + "duration": "13.838172605555554", + "name": "smoothness.tough_canvas_cases/microsoft_speed_reading" + }, + { + "duration": "14.177881027777781", + "name": "smoothness.tough_canvas_cases/microsoft_tweet_map" + }, + { + "duration": "16.286262938888886", + "name": "smoothness.tough_canvas_cases/microsoft_video_city" + }, + { + "duration": "13.92924193333334", + "name": "smoothness.tough_canvas_cases/microsoft_worker_fountains" + }, + { + "duration": "13.662684011111113", + "name": "smoothness.tough_canvas_cases/mix_10k" + }, + { + "duration": "14.830967999999997", + "name": "smoothness.tough_canvas_cases/put_get_image_data" + }, + { + "duration": "12.991132433333338", + "name": "smoothness.tough_canvas_cases/runway" + }, + { + "duration": "15.114906061111103", + "name": "smoothness.tough_canvas_cases/smash_cat" + }, + { + "duration": "13.712644577777782", + "name": "smoothness.tough_canvas_cases/spielzeugz" + }, + { + "duration": "15.543394055555561", + "name": "smoothness.tough_canvas_cases/stroke_shapes" + }, + { + "duration": "31.583535363636347", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-animation-no-clear.html" + }, + { + "duration": "14.287900595959593", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-font-cycler.html" + }, + { + "duration": "16.82439151010101", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=image_with_shadow&back=image" + }, + { + "duration": "13.873000606060609", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=text&back=white&ball_count=15" + }, + { + "duration": "17.398823111111103", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas_toBlob.html" + }, + { + "duration": "15.365882499999993", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_clipped_rectangles.html" + }, + { + "duration": "15.6233781010101", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_gradient_circles.html" + }, + { + "duration": "12.690028979797978", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_png_images.html" + }, + { + "duration": "22.91852458585858", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_svg_images.html" + }, + { + "duration": "15.088039287878793", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_arcs.html" + }, + { + "duration": "14.79445174242424", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_lines.html" + }, + { + "duration": "15.477093762626252", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/fill_shapes.html" + }, + { + "duration": "14.841632353535353", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/put_get_image_data.html" + }, + { + "duration": "15.847996469696966", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/stroke_shapes.html" + }, + { + "duration": "20.500138969696973", + "name": "smoothness.tough_filters_cases/Analog_Clock_SVG" + }, + { + "duration": "27.603352282828293", + "name": "smoothness.tough_filters_cases/Filter_Terrain_SVG" + }, + { + "duration": "21.896468010101007", + "name": "smoothness.tough_filters_cases/IE_PirateMark" + }, + { + "duration": "25.035488959595966", + "name": "smoothness.tough_filters_cases/MotionMark_Focus" + }, + { + "duration": "20.21874145744681", + "name": "smoothness.tough_filters_cases/analog_clock_svg" + }, + { + "duration": "23.4444360106383", + "name": "smoothness.tough_filters_cases/filter_terrain_svg" + }, + { + "duration": "22.627070436170225", + "name": "smoothness.tough_filters_cases/ie_pirate_mark" + }, + { + "duration": "24.57634756382979", + "name": "smoothness.tough_filters_cases/motion_mark_focus" + }, + { + "duration": "9.908318793650798", + "name": "smoothness.tough_image_decode_cases/cats_unscaled" + }, + { + "duration": "8.042179911111113", + "name": "smoothness.tough_image_decode_cases/cats_viewport_width" + }, + { + "duration": "9.892345131313135", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-unscaled.html" + }, + { + "duration": "8.000356988888887", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-viewport-width.html" + }, + { + "duration": "20.016024292929288", + "name": "smoothness.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" + }, + { + "duration": "29.14249950505051", + "name": "smoothness.tough_path_rendering_cases/IE_Chalkboard" + }, + { + "duration": "21.04810622222222", + "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" + }, + { + "duration": "21.06410487878788", + "name": "smoothness.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" + }, + { + "duration": "20.026520139784946", + "name": "smoothness.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "29.17253139784946", + "name": "smoothness.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "21.14428061290322", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "20.62537902150538", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "15.612353398989894", + "name": "smoothness.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "14.868694247474746", + "name": "smoothness.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "12.775701398989895", + "name": "smoothness.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "11.707472444444443", + "name": "smoothness.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "10.56209302020202", + "name": "smoothness.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "10.017873207070705", + "name": "smoothness.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "9.72837926767677", + "name": "smoothness.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "9.534634161616154", + "name": "smoothness.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "9.33799977777778", + "name": "smoothness.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "9.159908626262624", + "name": "smoothness.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "15.447669843434348", + "name": "smoothness.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "14.342029095959589", + "name": "smoothness.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "12.23935568181818", + "name": "smoothness.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "11.19162490909091", + "name": "smoothness.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "10.128133474747468", + "name": "smoothness.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "9.601444015151516", + "name": "smoothness.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "9.255489434343435", + "name": "smoothness.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "9.04202734848485", + "name": "smoothness.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "8.819750131313134", + "name": "smoothness.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "8.70419267171717", + "name": "smoothness.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "17.012856939393934", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "15.968591813131308", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "13.79277431313132", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "12.702014353535358", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "11.574860398989898", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "11.130132696969696", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "10.69817078282828", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "10.48167295959596", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "10.274965585858585", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "10.143086292929292", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "15.051780383838384", + "name": "smoothness.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "14.359889691919191", + "name": "smoothness.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "12.22875980808081", + "name": "smoothness.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "11.255831949494953", + "name": "smoothness.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "10.127518823232323", + "name": "smoothness.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "9.571567328282825", + "name": "smoothness.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "9.272966984848486", + "name": "smoothness.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "9.071088863636366", + "name": "smoothness.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "8.838610196969698", + "name": "smoothness.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "8.749474267676769", + "name": "smoothness.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "21.300264121212127", + "name": "smoothness.tough_texture_upload_cases/background_color_animation" + }, + { + "duration": "21.15100202020203", + "name": "smoothness.tough_texture_upload_cases/background_color_animation.html" + }, + { + "duration": "21.15658824242424", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient" + }, + { + "duration": "21.04743702020203", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient.html" + }, + { + "duration": "22.878652287878786", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads" + }, + { + "duration": "22.828518020202015", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads.html" + }, + { + "duration": "24.759831030303022", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads" + }, + { + "duration": "24.78824624242424", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads.html" + }, + { + "duration": "19.026075893939396", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads" + }, + { + "duration": "18.914718434343428", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads.html" + }, + { + "duration": "18.528773196969702", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads" + }, + { + "duration": "18.44657031313132", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads.html" + }, + { + "duration": "20.03320532323232", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swf.webglbeta.html" + }, + { + "duration": "19.51790405050505", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swf.webglbeta.html" + }, + { + "duration": "19.5420208080808", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swf.webglbeta.html" + }, + { + "duration": "19.51375883838384", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swf.webglbeta.html" + }, + { + "duration": "19.508447969696974", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swf.webglbeta.html" + }, + { + "duration": "19.508658060606063", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swf.webglbeta.html" + }, + { + "duration": "19.520531353535354", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swf.webglbeta.html" + }, + { + "duration": "19.51366749494949", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swf.webglbeta.html" + }, + { + "duration": "19.518267868686873", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swf.webglbeta.html" + }, + { + "duration": "19.518558868686878", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swf.webglbeta.html" + }, + { + "duration": "19.506783929292936", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swf.webglbeta.html" + }, + { + "duration": "19.188606178571433", + "name": "smoothness.tough_webgl_cases/animometer_webgl" + }, + { + "duration": "43.15392680898876", + "name": "smoothness.tough_webgl_cases/aquarium" + }, + { + "duration": "27.40618365656566", + "name": "smoothness.tough_webgl_cases/aquarium_20k" + }, + { + "duration": "16.489260606741574", + "name": "smoothness.tough_webgl_cases/blob" + }, + { + "duration": "17.82209193258427", + "name": "smoothness.tough_webgl_cases/dynamic_cube_map" + }, + { + "duration": "15.945875005617975", + "name": "smoothness.tough_webgl_cases/earth" + }, + { + "duration": "19.368857494949502", + "name": "smoothness.tough_webgl_cases/http://kenrussell.github.io/webgl-animometer/Animometer/tests/3d/webgl.html" + }, + { + "duration": "43.24506301010103", + "name": "smoothness.tough_webgl_cases/http://webglsamples.org/aquarium/aquarium.html" + }, + { + "duration": "16.459081303030302", + "name": "smoothness.tough_webgl_cases/http://webglsamples.org/blob/blob.html" + }, + { + "duration": "17.73937876767676", + "name": "smoothness.tough_webgl_cases/http://webglsamples.org/dynamic-cubemap/dynamic-cubemap.html" + }, + { + "duration": "17.456368272727275", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/nvidia-vertex-buffer-object/index.html" + }, + { + "duration": "15.844203202020203", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/particles/index.html" + }, + { + "duration": "15.804164621212124", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/google/san-angeles/index.html" + }, + { + "duration": "15.86392238383838", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/Earth.html" + }, + { + "duration": "15.998704055555555", + "name": "smoothness.tough_webgl_cases/http://www.khronos.org/registry/webgl/sdk/demos/webkit/ManyPlanetsDeep.html" + }, + { + "duration": "18.930291999999998", + "name": "smoothness.tough_webgl_cases/ken_russell" + }, + { + "duration": "16.025478359550558", + "name": "smoothness.tough_webgl_cases/many_planets_deep" + }, + { + "duration": "17.50457624719101", + "name": "smoothness.tough_webgl_cases/nvidia_vertex_buffer_object" + }, + { + "duration": "15.872183926966288", + "name": "smoothness.tough_webgl_cases/particles" + }, + { + "duration": "15.879125982142856", + "name": "smoothness.tough_webgl_cases/san_angeles" + }, + { + "duration": "15.778366", + "name": "smoothness.tough_webgl_cases/sans_angeles" + }, + { + "duration": "51.71318219191919", + "name": "speedometer-future/http://browserbench.org/Speedometer/" + }, + { + "duration": "51.3499789191919", + "name": "speedometer/http://browserbench.org/Speedometer/" + }, + { + "duration": "101.08983247474748", + "name": "speedometer2-future/Speedometer2" + }, + { + "duration": "101.02125446464647", + "name": "speedometer2/Speedometer2" + }, + { + "duration": "74.21738102020201", + "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "105.10118456565658", + "name": "system_health.common_desktop/browse:media:imgur" + }, + { + "duration": "73.96215073737373", + "name": "system_health.common_desktop/browse:media:pinterest" + }, + { + "duration": "79.0030654848485", + "name": "system_health.common_desktop/browse:media:youtube" + }, + { + "duration": "57.573025595959635", + "name": "system_health.common_desktop/browse:news:flipboard" + }, + { + "duration": "84.04218901010101", + "name": "system_health.common_desktop/browse:news:nytimes" + }, + { + "duration": "67.47283708080809", + "name": "system_health.common_desktop/browse:news:reddit" + }, + { + "duration": "54.39827223232323", + "name": "system_health.common_desktop/browse:search:google" + }, + { + "duration": "40.55372732323232", + "name": "system_health.common_desktop/browse:search:google_india" + }, + { + "duration": "73.28891984848488", + "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "84.08274840404037", + "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "51.84680298989898", + "name": "system_health.common_desktop/browse:social:twitter" + }, + { + "duration": "82.94642421212122", + "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll" + }, + { + "duration": "74.20295782828282", + "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "68.53827128282826", + "name": "system_health.common_desktop/browse:tools:earth" + }, + { + "duration": "24.659193373737367", + "name": "system_health.common_desktop/browse_accessibility:tech:codesearch" + }, + { + "duration": "19.94828805050505", + "name": "system_health.common_desktop/load:chrome:blank" + }, + { + "duration": "21.849206181818193", + "name": "system_health.common_desktop/load:games:alphabetty" + }, + { + "duration": "23.964063494949496", + "name": "system_health.common_desktop/load:games:bubbles" + }, + { + "duration": "20.77781455555556", + "name": "system_health.common_desktop/load:games:lazors" + }, + { + "duration": "26.0256083030303", + "name": "system_health.common_desktop/load:games:miniclip" + }, + { + "duration": "32.25965573737373", + "name": "system_health.common_desktop/load:games:spychase" + }, + { + "duration": "37.114224696969686", + "name": "system_health.common_desktop/load:media:9gag" + }, + { + "duration": "23.69402819191919", + "name": "system_health.common_desktop/load:media:dailymotion" + }, + { + "duration": "22.756269262626272", + "name": "system_health.common_desktop/load:media:google_images" + }, + { + "duration": "29.419246757575745", + "name": "system_health.common_desktop/load:media:imgur" + }, + { + "duration": "29.013816949494945", + "name": "system_health.common_desktop/load:media:soundcloud" + }, + { + "duration": "26.73633009090909", + "name": "system_health.common_desktop/load:media:youtube" + }, + { + "duration": "22.84323009090909", + "name": "system_health.common_desktop/load:news:bbc" + }, + { + "duration": "30.46802520202018", + "name": "system_health.common_desktop/load:news:cnn" + }, + { + "duration": "22.640264939393937", + "name": "system_health.common_desktop/load:news:flipboard" + }, + { + "duration": "20.573243545454538", + "name": "system_health.common_desktop/load:news:hackernews" + }, + { + "duration": "26.097383171717173", + "name": "system_health.common_desktop/load:news:nytimes" + }, + { + "duration": "32.032214686868684", + "name": "system_health.common_desktop/load:news:qq" + }, + { + "duration": "22.000196353535355", + "name": "system_health.common_desktop/load:news:reddit" + }, + { + "duration": "22.866963939393937", + "name": "system_health.common_desktop/load:news:wikipedia" + }, + { + "duration": "23.629494878787884", + "name": "system_health.common_desktop/load:search:amazon" + }, + { + "duration": "21.216467353535347", + "name": "system_health.common_desktop/load:search:baidu" + }, + { + "duration": "24.073105414141406", + "name": "system_health.common_desktop/load:search:ebay" + }, + { + "duration": "21.305037212121206", + "name": "system_health.common_desktop/load:search:google" + }, + { + "duration": "23.243321888888882", + "name": "system_health.common_desktop/load:search:taobao" + }, + { + "duration": "21.520170111111113", + "name": "system_health.common_desktop/load:search:yahoo" + }, + { + "duration": "20.936647858585854", + "name": "system_health.common_desktop/load:search:yandex" + }, + { + "duration": "23.40820267676766", + "name": "system_health.common_desktop/load:social:instagram" + }, + { + "duration": "24.833664676767672", + "name": "system_health.common_desktop/load:social:pinterest" + }, + { + "duration": "23.08751977777778", + "name": "system_health.common_desktop/load:social:vk" + }, + { + "duration": "42.85704443434343", + "name": "system_health.common_desktop/load:tools:docs" + }, + { + "duration": "32.868601727272726", + "name": "system_health.common_desktop/load:tools:drive" + }, + { + "duration": "24.40160466666666", + "name": "system_health.common_desktop/load:tools:dropbox" + }, + { + "duration": "29.76846310101011", + "name": "system_health.common_desktop/load:tools:gmail" + }, + { + "duration": "22.739073424242424", + "name": "system_health.common_desktop/load:tools:stackoverflow" + }, + { + "duration": "28.1283906969697", + "name": "system_health.common_desktop/load:tools:weather" + }, + { + "duration": "22.286265323232325", + "name": "system_health.common_desktop/load_accessibility:media:wikipedia" + }, + { + "duration": "24.665773797979803", + "name": "system_health.common_desktop/load_accessibility:shopping:amazon" + }, + { + "duration": "137.20469808080807", + "name": "system_health.common_desktop/long_running:tools:gmail-background" + }, + { + "duration": "150.50623707070707", + "name": "system_health.common_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "53.63049695959594", + "name": "system_health.common_desktop/play:media:soundcloud" + }, + { + "duration": "190.4735838686869", + "name": "system_health.memory_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "225.80312913131309", + "name": "system_health.memory_desktop/browse:media:imgur" + }, + { + "duration": "200.62537481818185", + "name": "system_health.memory_desktop/browse:media:pinterest" + }, + { + "duration": "196.3824364545455", + "name": "system_health.memory_desktop/browse:media:tumblr" + }, + { + "duration": "195.80048205050508", + "name": "system_health.memory_desktop/browse:media:youtube" + }, + { + "duration": "144.35129634343434", + "name": "system_health.memory_desktop/browse:news:flipboard" + }, + { + "duration": "174.0339022323232", + "name": "system_health.memory_desktop/browse:news:nytimes" + }, + { + "duration": "171.40606209090907", + "name": "system_health.memory_desktop/browse:news:reddit" + }, + { + "duration": "148.3942838484848", + "name": "system_health.memory_desktop/browse:search:google" + }, + { + "duration": "111.52354812121214", + "name": "system_health.memory_desktop/browse:search:google_india" + }, + { + "duration": "189.2357408282829", + "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "198.58729492929294", + "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "141.001830010101", + "name": "system_health.memory_desktop/browse:social:twitter" + }, + { + "duration": "188.24274395959594", + "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "171.00716931313133", + "name": "system_health.memory_desktop/browse:tools:earth" + }, + { + "duration": "65.50538965656567", + "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch" + }, + { + "duration": "55.214385010101", + "name": "system_health.memory_desktop/load:chrome:blank" + }, + { + "duration": "60.37590645454543", + "name": "system_health.memory_desktop/load:games:alphabetty" + }, + { + "duration": "61.28908149494949", + "name": "system_health.memory_desktop/load:games:bubbles" + }, + { + "duration": "57.76574382828284", + "name": "system_health.memory_desktop/load:games:lazors" + }, + { + "duration": "86.28620684848482", + "name": "system_health.memory_desktop/load:games:spychase" + }, + { + "duration": "88.84244619191917", + "name": "system_health.memory_desktop/load:media:9gag" + }, + { + "duration": "63.25972158585858", + "name": "system_health.memory_desktop/load:media:dailymotion" + }, + { + "duration": "62.722426060606075", + "name": "system_health.memory_desktop/load:media:google_images" + }, + { + "duration": "75.35081414141416", + "name": "system_health.memory_desktop/load:media:imgur" + }, + { + "duration": "72.3412939191919", + "name": "system_health.memory_desktop/load:media:soundcloud" + }, + { + "duration": "70.19938064646469", + "name": "system_health.memory_desktop/load:media:youtube" + }, + { + "duration": "61.68565491919193", + "name": "system_health.memory_desktop/load:news:bbc" + }, + { + "duration": "75.53185577777776", + "name": "system_health.memory_desktop/load:news:cnn" + }, + { + "duration": "61.613971414141396", + "name": "system_health.memory_desktop/load:news:flipboard" + }, + { + "duration": "57.33561733333335", + "name": "system_health.memory_desktop/load:news:hackernews" + }, + { + "duration": "66.53131263636364", + "name": "system_health.memory_desktop/load:news:nytimes" + }, + { + "duration": "76.24461327272725", + "name": "system_health.memory_desktop/load:news:qq" + }, + { + "duration": "59.892646989899", + "name": "system_health.memory_desktop/load:news:reddit" + }, + { + "duration": "63.38995116161616", + "name": "system_health.memory_desktop/load:news:wikipedia" + }, + { + "duration": "62.64726820202018", + "name": "system_health.memory_desktop/load:search:amazon" + }, + { + "duration": "57.918289797979796", + "name": "system_health.memory_desktop/load:search:baidu" + }, + { + "duration": "63.85128874747475", + "name": "system_health.memory_desktop/load:search:ebay" + }, + { + "duration": "58.26189853535353", + "name": "system_health.memory_desktop/load:search:google" + }, + { + "duration": "63.04049255555557", + "name": "system_health.memory_desktop/load:search:taobao" + }, + { + "duration": "59.89208806060607", + "name": "system_health.memory_desktop/load:search:yahoo" + }, + { + "duration": "57.99518055555555", + "name": "system_health.memory_desktop/load:search:yandex" + }, + { + "duration": "63.54271829292934", + "name": "system_health.memory_desktop/load:social:instagram" + }, + { + "duration": "68.36860803030302", + "name": "system_health.memory_desktop/load:social:pinterest" + }, + { + "duration": "63.1489709191919", + "name": "system_health.memory_desktop/load:social:vk" + }, + { + "duration": "86.5725138989899", + "name": "system_health.memory_desktop/load:tools:docs" + }, + { + "duration": "71.5068427070707", + "name": "system_health.memory_desktop/load:tools:drive" + }, + { + "duration": "64.22876029292931", + "name": "system_health.memory_desktop/load:tools:dropbox" + }, + { + "duration": "75.34411798989902", + "name": "system_health.memory_desktop/load:tools:gmail" + }, + { + "duration": "63.254995080808094", + "name": "system_health.memory_desktop/load:tools:stackoverflow" + }, + { + "duration": "70.39984565656569", + "name": "system_health.memory_desktop/load:tools:weather" + }, + { + "duration": "59.404278818181844", + "name": "system_health.memory_desktop/load_accessibility:media:wikipedia" + }, + { + "duration": "63.42855784848486", + "name": "system_health.memory_desktop/load_accessibility:shopping:amazon" + }, + { + "duration": "528.3472822222224", + "name": "system_health.memory_desktop/long_running:tools:gmail-background" + }, + { + "duration": "520.965678181818", + "name": "system_health.memory_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "140.87623044444447", + "name": "system_health.memory_desktop/play:media:soundcloud" + }, + { + "duration": "27.595814242424257", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/beqojupo/1/quiet?JS_FULL_SCREEN_INVALIDATION" + }, + { + "duration": "40.08915797979797", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/covoqi/1/quiet?NEW_TILINGS" + }, + { + "duration": "23.898729030303016", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/falefice/1/quiet?CC_POSTER_CIRCLE" + }, + { + "duration": "24.198828646464644", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/giqafofe/1/quiet?JS_POSTER_CIRCLE" + }, + { + "duration": "21.42858068686869", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/jevibahi/4/quiet?JS_SCROLL_200_LAYER_GRID" + }, + { + "duration": "16.601805444444448", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/pixavefe/1/quiet?CC_SCROLL_TEXT_ONLY" + }, + { + "duration": "21.421460323232324", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/wixadinu/2/quiet?JS_SCROLL_TEXT_ONLY" + }, + { + "duration": "21.560654020202023", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/yakagevo/1/quiet?CC_SCROLL_200_LAYER_GRID" + }, + { + "duration": "17.90811454545455", + "name": "thread_times.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "17.07772564646465", + "name": "thread_times.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "14.366818202020212", + "name": "thread_times.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "12.969394308080808", + "name": "thread_times.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "11.583513469696971", + "name": "thread_times.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "10.846139621212126", + "name": "thread_times.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "10.439990343434344", + "name": "thread_times.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "10.16669430808081", + "name": "thread_times.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "9.862698782828279", + "name": "thread_times.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "9.710107853535362", + "name": "thread_times.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "16.876347606060612", + "name": "thread_times.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "15.902621292929291", + "name": "thread_times.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "13.44537943939394", + "name": "thread_times.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "12.151542964646463", + "name": "thread_times.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "10.867435712121207", + "name": "thread_times.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "10.16818429292929", + "name": "thread_times.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "9.808423641414139", + "name": "thread_times.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "9.509624606060605", + "name": "thread_times.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "9.198776101010102", + "name": "thread_times.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "9.147169661616163", + "name": "thread_times.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "19.84128765656566", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "18.876848090909085", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "15.855905303030307", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "14.297132181818181", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "12.74545208080809", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "11.968501909090907", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "11.535511181818181", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "11.15762413131313", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "10.90123221717172", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "10.667665621212116", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "16.615205161616164", + "name": "thread_times.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "15.96110377777778", + "name": "thread_times.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "13.440401126262628", + "name": "thread_times.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "12.201363181818184", + "name": "thread_times.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "10.913321348484855", + "name": "thread_times.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "10.166222308080807", + "name": "thread_times.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "9.846915595959597", + "name": "thread_times.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "10.27534401010101", + "name": "thread_times.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "9.251813540404038", + "name": "thread_times.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "9.126280146464648", + "name": "thread_times.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "11.196568338383837", + "name": "tracing.tracing_with_background_memory_infra/Facebook" + }, + { + "duration": "11.954763479797977", + "name": "tracing.tracing_with_background_memory_infra/Wikipedia" + }, + { + "duration": "9.692951439393939", + "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" + }, + { + "duration": "9.973975530303028", + "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" + }, + { + "duration": "9.90268238888889", + "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" + }, + { + "duration": "10.078091313131313", + "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" + }, + { + "duration": "11.990719116161616", + "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" + }, + { + "duration": "10.995952969696972", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "12.131195292929297", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" + }, + { + "duration": "87.8618976060606", + "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll" + }, + { + "duration": "215.1868861616162", + "name": "v8.browsing_desktop-future/browse:media:imgur" + }, + { + "duration": "86.809618030303", + "name": "v8.browsing_desktop-future/browse:media:pinterest" + }, + { + "duration": "100.22833917171715", + "name": "v8.browsing_desktop-future/browse:media:tumblr" + }, + { + "duration": "99.98250505050505", + "name": "v8.browsing_desktop-future/browse:media:youtube" + }, + { + "duration": "117.75727122222222", + "name": "v8.browsing_desktop-future/browse:news:nytimes" + }, + { + "duration": "74.11434163636359", + "name": "v8.browsing_desktop-future/browse:news:reddit" + }, + { + "duration": "58.86159945454546", + "name": "v8.browsing_desktop-future/browse:search:google" + }, + { + "duration": "43.82200952525254", + "name": "v8.browsing_desktop-future/browse:search:google_india" + }, + { + "duration": "93.17156203030298", + "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll" + }, + { + "duration": "101.3082613131313", + "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "58.47628853535351", + "name": "v8.browsing_desktop-future/browse:social:twitter" + }, + { + "duration": "99.84641256565656", + "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll" + }, + { + "duration": "85.1057595252525", + "name": "v8.browsing_desktop-future/browse:tools:earth" + }, + { + "duration": "88.02668648484844", + "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "214.49412383838393", + "name": "v8.browsing_desktop/browse:media:imgur" + }, + { + "duration": "88.07866062626263", + "name": "v8.browsing_desktop/browse:media:pinterest" + }, + { + "duration": "100.31410509090907", + "name": "v8.browsing_desktop/browse:media:tumblr" + }, + { + "duration": "100.0013467070707", + "name": "v8.browsing_desktop/browse:media:youtube" + }, + { + "duration": "114.2160917676768", + "name": "v8.browsing_desktop/browse:news:nytimes" + }, + { + "duration": "73.88273425252528", + "name": "v8.browsing_desktop/browse:news:reddit" + }, + { + "duration": "58.9585426060606", + "name": "v8.browsing_desktop/browse:search:google" + }, + { + "duration": "43.79370435353536", + "name": "v8.browsing_desktop/browse:search:google_india" + }, + { + "duration": "93.53263752525255", + "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "102.06412236363634", + "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "58.49789095959594", + "name": "v8.browsing_desktop/browse:social:twitter" + }, + { + "duration": "99.76167164646463", + "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll" + }, + { + "duration": "84.88381477777777", + "name": "v8.browsing_desktop/browse:tools:earth" + }, + { + "duration": "105.42525107070708", + "name": "v8.runtime_stats.top_25/AdsAMPAds" + }, + { + "duration": "32.3613689375", + "name": "v8.runtime_stats.top_25/AdsAMPAds_cold" + }, + { + "duration": "37.86465756250001", + "name": "v8.runtime_stats.top_25/AdsAMPAds_hot" + }, + { + "duration": "35.12706606249999", + "name": "v8.runtime_stats.top_25/AdsAMPAds_warm" + }, + { + "duration": "104.79585111111108", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds" + }, + { + "duration": "32.05462568749999", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold" + }, + { + "duration": "37.687155687499995", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot" + }, + { + "duration": "34.918503", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm" + }, + { + "duration": "99.4467067979798", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage" + }, + { + "duration": "30.660131375000006", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold" + }, + { + "duration": "35.48460825", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot" + }, + { + "duration": "33.1277395", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm" + }, + { + "duration": "105.17052239393936", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds" + }, + { + "duration": "31.899458624999998", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold" + }, + { + "duration": "37.54818125", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot" + }, + { + "duration": "34.7258934375", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm" + }, + { + "duration": "101.85899496969695", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots" + }, + { + "duration": "31.284627812500002", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold" + }, + { + "duration": "36.497088749999996", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot" + }, + { + "duration": "33.9079394375", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm" + }, + { + "duration": "100.38645866666664", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection" + }, + { + "duration": "30.8350138125", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold" + }, + { + "duration": "35.914518124999994", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot" + }, + { + "duration": "33.408091625", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm" + }, + { + "duration": "102.78472139393942", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage" + }, + { + "duration": "31.781555749999995", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold" + }, + { + "duration": "36.82534400000001", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot" + }, + { + "duration": "34.1104801875", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm" + }, + { + "duration": "100.77215316161617", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage" + }, + { + "duration": "30.9887983125", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold" + }, + { + "duration": "36.0017199375", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot" + }, + { + "duration": "33.6320605625", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm" + }, + { + "duration": "157.71984630303027", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering" + }, + { + "duration": "41.677842999999996", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold" + }, + { + "duration": "63.501234375", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot" + }, + { + "duration": "52.61253881249999", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm" + }, + { + "duration": "127.18845860606059", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com" + }, + { + "duration": "36.809260249999994", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold" + }, + { + "duration": "47.5358140625", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot" + }, + { + "duration": "42.6513670625", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm" + }, + { + "duration": "105.27915913131312", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0" + }, + { + "duration": "31.8627548125", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold" + }, + { + "duration": "38.02352862499999", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot" + }, + { + "duration": "35.259409624999996", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm" + }, + { + "duration": "110.23557798989894", + "name": "v8.runtime_stats.top_25/http://inbox.google.com" + }, + { + "duration": "33.497688249999996", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold" + }, + { + "duration": "39.81331256250001", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot" + }, + { + "duration": "36.843645625", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm" + }, + { + "duration": "108.26803708080806", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo" + }, + { + "duration": "32.71386424999999", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold" + }, + { + "duration": "39.44714375", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot" + }, + { + "duration": "36.2430099375", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm" + }, + { + "duration": "108.98731276767684", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org" + }, + { + "duration": "32.9943606875", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold" + }, + { + "duration": "39.3480265625", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_hot" + }, + { + "duration": "36.645203374999994", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm" + }, + { + "duration": "100.65806765656568", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular" + }, + { + "duration": "30.842808125000005", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold" + }, + { + "duration": "36.2774895", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot" + }, + { + "duration": "33.53566549999999", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm" + }, + { + "duration": "99.57900854545457", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone" + }, + { + "duration": "30.597952562500005", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold" + }, + { + "duration": "35.8241015", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot" + }, + { + "duration": "33.175409375", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm" + }, + { + "duration": "100.46207480808081", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember" + }, + { + "duration": "30.798243", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold" + }, + { + "duration": "36.2570551875", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot" + }, + { + "duration": "33.439508187499996", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm" + }, + { + "duration": "100.69987864646464", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery" + }, + { + "duration": "30.688418562500004", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold" + }, + { + "duration": "35.96501574999999", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot" + }, + { + "duration": "33.370509", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm" + }, + { + "duration": "99.28432656565654", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla" + }, + { + "duration": "30.5423055", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold" + }, + { + "duration": "35.648940625", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot" + }, + { + "duration": "33.118327", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm" + }, + { + "duration": "110.06611988888888", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io" + }, + { + "duration": "33.768171187499995", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold" + }, + { + "duration": "39.547332625", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot" + }, + { + "duration": "36.785641", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm" + }, + { + "duration": "111.00046889898985", + "name": "v8.runtime_stats.top_25/http://weibo.com" + }, + { + "duration": "33.8387826875", + "name": "v8.runtime_stats.top_25/http://weibo.com_cold" + }, + { + "duration": "40.2638225", + "name": "v8.runtime_stats.top_25/http://weibo.com_hot" + }, + { + "duration": "37.438225562499994", + "name": "v8.runtime_stats.top_25/http://weibo.com_warm" + }, + { + "duration": "107.10050870707072", + "name": "v8.runtime_stats.top_25/http://world.taobao.com" + }, + { + "duration": "32.5946605", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold" + }, + { + "duration": "38.633300687500004", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot" + }, + { + "duration": "35.86382775", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm" + }, + { + "duration": "102.96239273737373", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8" + }, + { + "duration": "31.485544875", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold" + }, + { + "duration": "37.1112685", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_hot" + }, + { + "duration": "34.3937709375", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm" + }, + { + "duration": "103.2973306565657", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8" + }, + { + "duration": "31.484603625", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold" + }, + { + "duration": "37.112816624999994", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot" + }, + { + "duration": "34.539748437499995", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm" + }, + { + "duration": "100.27639798989901", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine" + }, + { + "duration": "30.849420562499997", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold" + }, + { + "duration": "35.997296625", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot" + }, + { + "duration": "33.3826581875", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm" + }, + { + "duration": "122.8309867474748", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8" + }, + { + "duration": "36.11920212500001", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold" + }, + { + "duration": "45.273973187500005", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot" + }, + { + "duration": "40.870418812500006", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm" + }, + { + "duration": "105.59890969696964", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest" + }, + { + "duration": "32.317801687499994", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold" + }, + { + "duration": "37.912067875", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot" + }, + { + "duration": "35.231450374999994", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm" + }, + { + "duration": "116.92665368686872", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae" + }, + { + "duration": "35.1462316875", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold" + }, + { + "duration": "42.41669862499999", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot" + }, + { + "duration": "39.05857525", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm" + }, + { + "duration": "110.32075702020207", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular" + }, + { + "duration": "32.8178646875", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold" + }, + { + "duration": "40.2929309375", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot" + }, + { + "duration": "36.799261812500006", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_warm" + }, + { + "duration": "208.6375192323233", + "name": "v8.runtime_stats.top_25/http://www.qq.com" + }, + { + "duration": "63.177105749999996", + "name": "v8.runtime_stats.top_25/http://www.qq.com_cold" + }, + { + "duration": "73.2095845", + "name": "v8.runtime_stats.top_25/http://www.qq.com_hot" + }, + { + "duration": "69.042374375", + "name": "v8.runtime_stats.top_25/http://www.qq.com_warm" + }, + { + "duration": "106.59135985858589", + "name": "v8.runtime_stats.top_25/http://www.reddit.com" + }, + { + "duration": "32.3142259375", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold" + }, + { + "duration": "38.5865565625", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot" + }, + { + "duration": "35.6258101875", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm" + }, + { + "duration": "110.112645989899", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13" + }, + { + "duration": "32.78762", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold" + }, + { + "duration": "40.2836145", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot" + }, + { + "duration": "36.79210168749999", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm" + }, + { + "duration": "107.67401737373741", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill" + }, + { + "duration": "32.40871518749999", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold" + }, + { + "duration": "39.09744256250001", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot" + }, + { + "duration": "35.9660205625", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm" + }, + { + "duration": "103.95426088888885", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp" + }, + { + "duration": "31.7204298125", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold" + }, + { + "duration": "37.4304935625", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot" + }, + { + "duration": "34.732399062499994", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm" + }, + { + "duration": "103.21426162626263", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8" + }, + { + "duration": "31.583455375", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold" + }, + { + "duration": "37.1586378125", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot" + }, + { + "duration": "34.456367812500005", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm" + }, + { + "duration": "144.05546103030312", + "name": "v8.runtime_stats.top_25/https://adwords.google.com" + }, + { + "duration": "42.318803875", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold" + }, + { + "duration": "58.871664", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_hot" + }, + { + "duration": "45.9320053125", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm" + }, + { + "duration": "98.95414021212119", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3" + }, + { + "duration": "30.514159312499995", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold" + }, + { + "duration": "35.38320775", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot" + }, + { + "duration": "32.997513749999996", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm" + }, + { + "duration": "130.37580495959588", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit" + }, + { + "duration": "37.029707062499995", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold" + }, + { + "duration": "49.8048411875", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot" + }, + { + "duration": "44.2939111875", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm" + }, + { + "duration": "108.38144193939398", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira" + }, + { + "duration": "32.48572525", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold" + }, + { + "duration": "39.24323975", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot" + }, + { + "duration": "36.34973993750001", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm" + }, + { + "duration": "107.01425220202024", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8" + }, + { + "duration": "36.5105860625", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold" + }, + { + "duration": "36.59405175", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot" + }, + { + "duration": "33.8803431875", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm" + }, + { + "duration": "107.52240938383835", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/" + }, + { + "duration": "32.682371437499995", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold" + }, + { + "duration": "38.450415937500004", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot" + }, + { + "duration": "36.094059062499994", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm" + }, + { + "duration": "119.47004525252527", + "name": "v8.runtime_stats.top_25/https://www.youtube.com" + }, + { + "duration": "127.65394238383834", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg" + }, + { + "duration": "38.554779125", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold" + }, + { + "duration": "46.576059625", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot" + }, + { + "duration": "42.9373434375", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm" + }, + { + "duration": "35.745785999999995", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold" + }, + { + "duration": "43.49374456250001", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot" + }, + { + "duration": "40.130444812499995", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm" + }, + { + "duration": "63.199501020202014", + "name": "wasm/WasmSpaceBuggy" + }, + { + "duration": "247.11108588888885", + "name": "wasm/WasmStylizedRenderer" + }, + { + "duration": "205.69213865656573", + "name": "wasm/WasmSunTemple" + }, + { + "duration": "79.45261455555557", + "name": "wasm/WasmTanks" + }, + { + "duration": "214.71547442424244", + "name": "wasm/WasmZenGarden" + }, + { + "duration": "60.514801474747486", + "name": "webrtc/10s_datachannel_transfer" + }, + { + "duration": "23.31349101010101", + "name": "webrtc/canvas_capture_peer_connection" + }, + { + "duration": "32.66495901010103", + "name": "webrtc/codec_constraints_h264" + }, + { + "duration": "32.672712939393925", + "name": "webrtc/codec_constraints_vp8" + }, + { + "duration": "32.646516404040426", + "name": "webrtc/codec_constraints_vp9" + }, + { + "duration": "21.437181818181823", + "name": "webrtc/hd_local_stream_10s" + }, + { + "duration": "57.51312366666665", + "name": "webrtc/multiple_peerconnections" + }, + { + "duration": "58.753257666666684", + "name": "webrtc/pause_play_peerconnections" + } +] \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/mac_1013_high_end_story_timing.json b/tools/perf/core/shard_maps/timing_data/mac_1013_high_end_story_timing.json new file mode 100644 index 0000000..5ba11ed --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/mac_1013_high_end_story_timing.json
@@ -0,0 +1,5714 @@ +[ + { + "duration": "11.818739924657532", + "name": "blink_perf.bindings/append-child.html" + }, + { + "duration": "7.136794795890411", + "name": "blink_perf.bindings/create-element.html" + }, + { + "duration": "9.186197679452055", + "name": "blink_perf.bindings/document-implementation.html" + }, + { + "duration": "9.115365327397255", + "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" + }, + { + "duration": "6.542721957534245", + "name": "blink_perf.bindings/first-child.html" + }, + { + "duration": "3.6224475205479445", + "name": "blink_perf.bindings/gc-forest.html" + }, + { + "duration": "5.297826926027398", + "name": "blink_perf.bindings/gc-mini-tree.html" + }, + { + "duration": "18.340566952054797", + "name": "blink_perf.bindings/gc-tree.html" + }, + { + "duration": "8.779208126027399", + "name": "blink_perf.bindings/get-attribute-rare.html" + }, + { + "duration": "10.81433609863014", + "name": "blink_perf.bindings/get-attribute.html" + }, + { + "duration": "8.800689178082193", + "name": "blink_perf.bindings/get-element-by-id.html" + }, + { + "duration": "6.606843067123287", + "name": "blink_perf.bindings/get-elements-by-tag-name.html" + }, + { + "duration": "12.876370061643836", + "name": "blink_perf.bindings/id-getter.html" + }, + { + "duration": "8.301190561643832", + "name": "blink_perf.bindings/id-setter.html" + }, + { + "duration": "9.473861431506855", + "name": "blink_perf.bindings/indexed-getter.html" + }, + { + "duration": "7.429849460273971", + "name": "blink_perf.bindings/insert-before.html" + }, + { + "duration": "8.664254656164383", + "name": "blink_perf.bindings/named-property-enumerator.html" + }, + { + "duration": "21.677230753424656", + "name": "blink_perf.bindings/node-list-access.html" + }, + { + "duration": "6.584422919178082", + "name": "blink_perf.bindings/node-type.html" + }, + { + "duration": "3.3527382520547953", + "name": "blink_perf.bindings/post-message.html" + }, + { + "duration": "10.039685086301368", + "name": "blink_perf.bindings/sequence-conversion-array.html" + }, + { + "duration": "7.781863782191785", + "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" + }, + { + "duration": "3.7767232575342455", + "name": "blink_perf.bindings/serialize-array.html" + }, + { + "duration": "3.8060284095890395", + "name": "blink_perf.bindings/serialize-long-string.html" + }, + { + "duration": "4.961765860273974", + "name": "blink_perf.bindings/serialize-map.html" + }, + { + "duration": "2.299283030136986", + "name": "blink_perf.bindings/serialize-nested-array.html" + }, + { + "duration": "6.706863909589042", + "name": "blink_perf.bindings/set-attribute-rare.html" + }, + { + "duration": "11.221234605479456", + "name": "blink_perf.bindings/set-attribute.html" + }, + { + "duration": "9.314013949315072", + "name": "blink_perf.bindings/structured-clone-json-deserialize.html" + }, + { + "duration": "6.2295569630137", + "name": "blink_perf.bindings/structured-clone-json-serialize.html" + }, + { + "duration": "4.853038273972602", + "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" + }, + { + "duration": "3.608133721917808", + "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" + }, + { + "duration": "9.006482863013698", + "name": "blink_perf.bindings/typed-array-construct-from-array.html" + }, + { + "duration": "9.923092850684931", + "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" + }, + { + "duration": "6.634367323287672", + "name": "blink_perf.bindings/typed-array-construct-from-typed.html" + }, + { + "duration": "9.768961436986302", + "name": "blink_perf.bindings/typed-array-set-from-typed.html" + }, + { + "duration": "9.382690123287672", + "name": "blink_perf.bindings/undefined-first-child.html" + }, + { + "duration": "7.2501395726027384", + "name": "blink_perf.bindings/undefined-get-element-by-id.html" + }, + { + "duration": "9.385877850684931", + "name": "blink_perf.bindings/undefined-id-getter.html" + }, + { + "duration": "12.513224116438355", + "name": "blink_perf.canvas/createImageBitmapFromImageData.html" + }, + { + "duration": "5.204714758904111", + "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "6.0871248863013685", + "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "3.20639952328767", + "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" + }, + { + "duration": "4.8117244780821915", + "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "8.234884761643835", + "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "3.63791219041096", + "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "7.8003987356164375", + "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" + }, + { + "duration": "10.602561427397259", + "name": "blink_perf.canvas/drawimage.html" + }, + { + "duration": "9.997502915068495", + "name": "blink_perf.canvas/getImageData.html" + }, + { + "duration": "8.709787597260275", + "name": "blink_perf.canvas/getImageDataColorManaged.html" + }, + { + "duration": "9.948881467123286", + "name": "blink_perf.canvas/putImageData.html" + }, + { + "duration": "10.262960994520547", + "name": "blink_perf.canvas/toBlob_duration.html" + }, + { + "duration": "5.324940186301369", + "name": "blink_perf.canvas/toBlob_duration_jpeg.html" + }, + { + "duration": "4.361042731506849", + "name": "blink_perf.canvas/transferFromImageBitmap.html" + }, + { + "duration": "2.6777648506849308", + "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" + }, + { + "duration": "11.30764411917808", + "name": "blink_perf.canvas/upload-video-to-sub-texture.html" + }, + { + "duration": "2.0725573205479457", + "name": "blink_perf.canvas/upload-video-to-texture.html" + }, + { + "duration": "6.639398384931506", + "name": "blink_perf.canvas/upload-webgl-to-texture.html" + }, + { + "duration": "13.424590157534249", + "name": "blink_perf.css/AttributeDescendantSelector.html" + }, + { + "duration": "10.784816439726033", + "name": "blink_perf.css/CSSPropertySetterGetter.html" + }, + { + "duration": "8.755474558904108", + "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" + }, + { + "duration": "8.443035784931505", + "name": "blink_perf.css/CSSPropertyUpdateValue.html" + }, + { + "duration": "7.115665643835618", + "name": "blink_perf.css/ChangeStyleChildClassSelector.html" + }, + { + "duration": "5.943375508219177", + "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" + }, + { + "duration": "7.583283253424659", + "name": "blink_perf.css/ChangeStyleElementSelector.html" + }, + { + "duration": "6.450295831506847", + "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" + }, + { + "duration": "6.944193708219178", + "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" + }, + { + "duration": "5.956654254794522", + "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" + }, + { + "duration": "6.976336949315067", + "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" + }, + { + "duration": "8.261007346575346", + "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" + }, + { + "duration": "9.090745783561646", + "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" + }, + { + "duration": "6.955659636986302", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" + }, + { + "duration": "9.446300352054797", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "7.135150291780823", + "name": "blink_perf.css/ChangeStyleShallowTree.html" + }, + { + "duration": "6.950407821917807", + "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" + }, + { + "duration": "6.9441587602739725", + "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" + }, + { + "duration": "8.360927958904115", + "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" + }, + { + "duration": "7.1682331082191775", + "name": "blink_perf.css/ChangeStyleUniversalSelector.html" + }, + { + "duration": "8.768457680821918", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" + }, + { + "duration": "5.958143252054795", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "12.21663043150685", + "name": "blink_perf.css/ClassDescendantSelector.html" + }, + { + "duration": "8.626893636986305", + "name": "blink_perf.css/ClassInvalidation.html" + }, + { + "duration": "13.300534623287675", + "name": "blink_perf.css/FocusUpdate.html" + }, + { + "duration": "7.445759667123288", + "name": "blink_perf.css/LoadBootstrapBlog.html" + }, + { + "duration": "6.382147886301371", + "name": "blink_perf.css/LoadMaterializeStarterPage.html" + }, + { + "duration": "8.140576869863015", + "name": "blink_perf.css/LoadSemanticPageExample.html" + }, + { + "duration": "8.008166101369863", + "name": "blink_perf.css/PseudoClassSelectors.html" + }, + { + "duration": "7.523221985915494", + "name": "blink_perf.css/SelectorCountScaling.html" + }, + { + "duration": "11.966041698630141", + "name": "blink_perf.dom/addRange.html" + }, + { + "duration": "1.4257606835616436", + "name": "blink_perf.dom/delete-in-password-field.html" + }, + { + "duration": "6.900995921917807", + "name": "blink_perf.dom/div-editable.html" + }, + { + "duration": "4.301556969178083", + "name": "blink_perf.dom/inner_html_with_selection.html" + }, + { + "duration": "18.3989815890411", + "name": "blink_perf.dom/long-sibling-list.html" + }, + { + "duration": "5.449204171232877", + "name": "blink_perf.dom/modify-element-classname.html" + }, + { + "duration": "3.600123026027397", + "name": "blink_perf.dom/modify-element-id.html" + }, + { + "duration": "5.067401561643835", + "name": "blink_perf.dom/modify-element-title.html" + }, + { + "duration": "1.429811906849315", + "name": "blink_perf.dom/move-down-with-hidden-elements.html" + }, + { + "duration": "3.965015763013696", + "name": "blink_perf.dom/move-up-with-hidden-elements.html" + }, + { + "duration": "2.6863679794520543", + "name": "blink_perf.dom/remove_child_with_selection.html" + }, + { + "duration": "9.279049124657535", + "name": "blink_perf.dom/select-multiple-add.html" + }, + { + "duration": "8.441542554794518", + "name": "blink_perf.dom/select-single-add.html" + }, + { + "duration": "10.251878058904113", + "name": "blink_perf.dom/select-single-remove.html" + }, + { + "duration": "8.720100879452055", + "name": "blink_perf.dom/textarea-dom.html" + }, + { + "duration": "10.886042956164385", + "name": "blink_perf.dom/textarea-edit.html" + }, + { + "duration": "11.871146363013693", + "name": "blink_perf.events/EventsDispatching.html" + }, + { + "duration": "9.056385516438358", + "name": "blink_perf.events/EventsDispatchingInDeeplyNestedShadowTrees.html" + }, + { + "duration": "20.333999205479454", + "name": "blink_perf.events/EventsDispatchingInShadowTrees.html" + }, + { + "duration": "10.095660869863014", + "name": "blink_perf.events/hit-test-lots-of-layers.html" + }, + { + "duration": "13.658538493150683", + "name": "blink_perf.image_decoder/decode-gif.html" + }, + { + "duration": "8.37766676986301", + "name": "blink_perf.image_decoder/decode-jpeg.html" + }, + { + "duration": "13.19407076712329", + "name": "blink_perf.image_decoder/decode-lossless-webp.html" + }, + { + "duration": "10.180930106849317", + "name": "blink_perf.image_decoder/decode-lossy-webp.html" + }, + { + "duration": "8.438795726027399", + "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" + }, + { + "duration": "10.912544868493155", + "name": "blink_perf.image_decoder/decode-png-palette.html" + }, + { + "duration": "12.366438602739725", + "name": "blink_perf.image_decoder/decode-png.html" + }, + { + "duration": "13.774554061643832", + "name": "blink_perf.layout/ArabicLineLayout.html" + }, + { + "duration": "2.2712218082191775", + "name": "blink_perf.layout/Shapes/MultipleShapes.html" + }, + { + "duration": "7.647275794520548", + "name": "blink_perf.layout/SimpleTextPathLineLayout.html" + }, + { + "duration": "7.985982069863011", + "name": "blink_perf.layout/add-remove-inline-floats.html" + }, + { + "duration": "7.07983926438356", + "name": "blink_perf.layout/attach-inlines-2.html" + }, + { + "duration": "9.472772141095886", + "name": "blink_perf.layout/attach-inlines.html" + }, + { + "duration": "8.367513902739727", + "name": "blink_perf.layout/auto-grid-lots-of-data.html" + }, + { + "duration": "6.505266005479453", + "name": "blink_perf.layout/chapter-reflow-once-random.html" + }, + { + "duration": "14.430193253424658", + "name": "blink_perf.layout/chapter-reflow-once.html" + }, + { + "duration": "7.987378742465752", + "name": "blink_perf.layout/chapter-reflow-thrice.html" + }, + { + "duration": "11.237971082191777", + "name": "blink_perf.layout/chapter-reflow-twice.html" + }, + { + "duration": "10.099002609589041", + "name": "blink_perf.layout/chapter-reflow.html" + }, + { + "duration": "4.594631012328765", + "name": "blink_perf.layout/character_fallback.html" + }, + { + "duration": "1.511573561643835", + "name": "blink_perf.layout/character_fallback_aat.html" + }, + { + "duration": "8.03569268630137", + "name": "blink_perf.layout/fixed-grid-lots-of-data.html" + }, + { + "duration": "7.915923371232876", + "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" + }, + { + "duration": "7.867396582191784", + "name": "blink_perf.layout/flexbox-column-nowrap.html" + }, + { + "duration": "9.982897835616436", + "name": "blink_perf.layout/flexbox-column-wrap.html" + }, + { + "duration": "9.852520839726028", + "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" + }, + { + "duration": "12.251899343835614", + "name": "blink_perf.layout/flexbox-lots-of-data.html" + }, + { + "duration": "6.8873459876712335", + "name": "blink_perf.layout/flexbox-row-nowrap.html" + }, + { + "duration": "8.793157447945203", + "name": "blink_perf.layout/flexbox-row-wrap.html" + }, + { + "duration": "7.835539254794521", + "name": "blink_perf.layout/flexbox-with-stretch-layout.html" + }, + { + "duration": "8.297779923287674", + "name": "blink_perf.layout/floats_100_100.html" + }, + { + "duration": "10.106003298630142", + "name": "blink_perf.layout/floats_100_100_nested.html" + }, + { + "duration": "5.821861350684929", + "name": "blink_perf.layout/floats_10_1000.html" + }, + { + "duration": "2.767667875342467", + "name": "blink_perf.layout/floats_20_100.html" + }, + { + "duration": "3.1056946027397263", + "name": "blink_perf.layout/floats_20_100_nested.html" + }, + { + "duration": "1.9162566205479448", + "name": "blink_perf.layout/floats_2_100.html" + }, + { + "duration": "6.4174873931506875", + "name": "blink_perf.layout/floats_2_100_nested.html" + }, + { + "duration": "4.395853834246576", + "name": "blink_perf.layout/floats_50_100.html" + }, + { + "duration": "5.046228528767123", + "name": "blink_perf.layout/floats_50_100_nested.html" + }, + { + "duration": "12.775103394520547", + "name": "blink_perf.layout/hindi-line-layout.html" + }, + { + "duration": "7.759642235616438", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" + }, + { + "duration": "7.894855665753424", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" + }, + { + "duration": "9.033388968493153", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" + }, + { + "duration": "8.503528632876714", + "name": "blink_perf.layout/latin-complex-text.html" + }, + { + "duration": "2.632003971232877", + "name": "blink_perf.layout/layers_overlap_2d.html" + }, + { + "duration": "1.9428931712328765", + "name": "blink_perf.layout/layers_overlap_3d.html" + }, + { + "duration": "8.274971623287671", + "name": "blink_perf.layout/line-layout-line-height.html" + }, + { + "duration": "8.948778282191784", + "name": "blink_perf.layout/line-layout-repeat-append.html" + }, + { + "duration": "9.759278849315068", + "name": "blink_perf.layout/line-layout.html" + }, + { + "duration": "1.4856752438356164", + "name": "blink_perf.layout/long-line-nowrap-collapse.html" + }, + { + "duration": "3.68752870410959", + "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" + }, + { + "duration": "4.263927365753423", + "name": "blink_perf.layout/long-line-nowrap.html" + }, + { + "duration": "8.353899687671237", + "name": "blink_perf.layout/multicol/deeply-nested-tables.html" + }, + { + "duration": "9.196089358904109", + "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" + }, + { + "duration": "8.776370606849314", + "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" + }, + { + "duration": "7.768357194520548", + "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" + }, + { + "duration": "6.788439734246574", + "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" + }, + { + "duration": "9.195974627397257", + "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" + }, + { + "duration": "7.447199983561642", + "name": "blink_perf.layout/multicol/tall-content-short-columns.html" + }, + { + "duration": "7.274469817808219", + "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" + }, + { + "duration": "9.352782987671231", + "name": "blink_perf.layout/nested-grid.html" + }, + { + "duration": "9.58687553835616", + "name": "blink_perf.layout/nested-percent-height-tables.html" + }, + { + "duration": "49.20821650684932", + "name": "blink_perf.layout/subtree-detaching.html" + }, + { + "duration": "5.641805593150685", + "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" + }, + { + "duration": "3.707415520547945", + "name": "blink_perf.layout/word-break-break-all.html" + }, + { + "duration": "3.7988386383561656", + "name": "blink_perf.layout/word-break-break-word.html" + }, + { + "duration": "2.6461177369863016", + "name": "blink_perf.layout/word-wrap-break-word.html" + }, + { + "duration": "10.22614617808219", + "name": "blink_perf.owp_storage/blob-perf-files.html" + }, + { + "duration": "7.990669769863009", + "name": "blink_perf.owp_storage/blob-perf-ipc.html" + }, + { + "duration": "8.441787826027397", + "name": "blink_perf.owp_storage/blob-perf-shm.html" + }, + { + "duration": "10.66390838356164", + "name": "blink_perf.owp_storage/blob-perf-tiny.html" + }, + { + "duration": "10.724767413698629", + "name": "blink_perf.owp_storage/idb-load-docs.html" + }, + { + "duration": "10.276734465753425", + "name": "blink_perf.paint/appending-text.html" + }, + { + "duration": "14.323663999999999", + "name": "blink_perf.paint/color-changes.html" + }, + { + "duration": "11.624718321917806", + "name": "blink_perf.paint/complex-content-slow-scroll.html" + }, + { + "duration": "9.44350856849315", + "name": "blink_perf.paint/containment-resize.html" + }, + { + "duration": "11.369633404109583", + "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" + }, + { + "duration": "12.587838226027396", + "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" + }, + { + "duration": "9.423078931506849", + "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" + }, + { + "duration": "12.03265917123288", + "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" + }, + { + "duration": "11.819530719178081", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" + }, + { + "duration": "11.483716924657525", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" + }, + { + "duration": "10.879924184931506", + "name": "blink_perf.paint/large-table-collapsed-border-change.html" + }, + { + "duration": "11.400081787671237", + "name": "blink_perf.paint/large-table-repaint.html" + }, + { + "duration": "9.500395102739724", + "name": "blink_perf.paint/move-text-with-mask.html" + }, + { + "duration": "10.512050116438353", + "name": "blink_perf.paint/paint-offset-changes.html" + }, + { + "duration": "19.99803984931507", + "name": "blink_perf.paint/transform-changes.html" + }, + { + "duration": "11.37625882191781", + "name": "blink_perf.parser/css-parser-yui.html" + }, + { + "duration": "8.704702364383559", + "name": "blink_perf.parser/html-parser-threaded.html" + }, + { + "duration": "7.49859728630137", + "name": "blink_perf.parser/html-parser.html" + }, + { + "duration": "33.51279278082191", + "name": "blink_perf.parser/html5-full-render.html" + }, + { + "duration": "7.169344794520548", + "name": "blink_perf.parser/iframe-append-remove.html" + }, + { + "duration": "7.014293304109589", + "name": "blink_perf.parser/innerHTML-setter-siblings.html" + }, + { + "duration": "6.782239920547947", + "name": "blink_perf.parser/innerHTML-setter.html" + }, + { + "duration": "10.19014021780822", + "name": "blink_perf.parser/query-selector-all-attribute-complex.html" + }, + { + "duration": "9.062107119178085", + "name": "blink_perf.parser/query-selector-all-attribute.html" + }, + { + "duration": "6.906309961643837", + "name": "blink_perf.parser/query-selector-all-class-deep.html" + }, + { + "duration": "9.719680956164387", + "name": "blink_perf.parser/query-selector-all-class-first.html" + }, + { + "duration": "7.427079135616441", + "name": "blink_perf.parser/query-selector-all-class-last.html" + }, + { + "duration": "8.33570657534247", + "name": "blink_perf.parser/query-selector-all-class.html" + }, + { + "duration": "10.225672080821917", + "name": "blink_perf.parser/query-selector-all-deep.html" + }, + { + "duration": "8.702742612328764", + "name": "blink_perf.parser/query-selector-all-first.html" + }, + { + "duration": "12.375000506849322", + "name": "blink_perf.parser/query-selector-all-id-deep.html" + }, + { + "duration": "8.045237567123285", + "name": "blink_perf.parser/query-selector-all-id-first.html" + }, + { + "duration": "8.853192828767122", + "name": "blink_perf.parser/query-selector-all-id-last.html" + }, + { + "duration": "9.17192715479452", + "name": "blink_perf.parser/query-selector-all-last.html" + }, + { + "duration": "8.331484850684932", + "name": "blink_perf.parser/query-selector-deep.html" + }, + { + "duration": "7.903753193150684", + "name": "blink_perf.parser/query-selector-first.html" + }, + { + "duration": "7.5505811506849305", + "name": "blink_perf.parser/query-selector-id-deep.html" + }, + { + "duration": "7.152519806849314", + "name": "blink_perf.parser/query-selector-id-last.html" + }, + { + "duration": "8.454993872602738", + "name": "blink_perf.parser/query-selector-last.html" + }, + { + "duration": "9.723735316438358", + "name": "blink_perf.parser/simple-url.html" + }, + { + "duration": "7.653496576712326", + "name": "blink_perf.parser/textarea-parsing.html" + }, + { + "duration": "8.234667445205478", + "name": "blink_perf.parser/tiny-innerHTML.html" + }, + { + "duration": "9.293700489041099", + "name": "blink_perf.parser/url-parser.html" + }, + { + "duration": "9.559828394520544", + "name": "blink_perf.parser/xml-parser.html" + }, + { + "duration": "4.047609517808219", + "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" + }, + { + "duration": "1.5056071780821918", + "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" + }, + { + "duration": "2.7710176890410962", + "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" + }, + { + "duration": "1.1822168606849324", + "name": "blink_perf.shadow_dom/shadow-style-share.html" + }, + { + "duration": "2.515661608219178", + "name": "blink_perf.shadow_dom/style-sheet-insert.html" + }, + { + "duration": "3.546997787671233", + "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" + }, + { + "duration": "4.988511846575341", + "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" + }, + { + "duration": "3.6077326808219183", + "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" + }, + { + "duration": "7.925114487671235", + "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" + }, + { + "duration": "2.4010541315068497", + "name": "blink_perf.shadow_dom/v0-content-reprojection.html" + }, + { + "duration": "5.728483978082192", + "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" + }, + { + "duration": "3.2158656917808224", + "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" + }, + { + "duration": "3.4054112890410964", + "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" + }, + { + "duration": "2.226309583561644", + "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" + }, + { + "duration": "11.209345376712326", + "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" + }, + { + "duration": "1.6554608402739726", + "name": "blink_perf.shadow_dom/v1-distribution.html" + }, + { + "duration": "2.6385760397260274", + "name": "blink_perf.shadow_dom/v1-host-child-append.html" + }, + { + "duration": "14.49853323972603", + "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" + }, + { + "duration": "22.754872109589048", + "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" + }, + { + "duration": "1.6425898999999995", + "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" + }, + { + "duration": "3.68605259589041", + "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" + }, + { + "duration": "6.034650261643837", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" + }, + { + "duration": "1.6455907178082185", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "1.654588336986302", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" + }, + { + "duration": "2.717607826027398", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" + }, + { + "duration": "3.7896730068493163", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "5.961685236986303", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" + }, + { + "duration": "1.6332183630136992", + "name": "blink_perf.shadow_dom/v1-slot-append.html" + }, + { + "duration": "5.855909773972603", + "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" + }, + { + "duration": "5.057975220547945", + "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" + }, + { + "duration": "2.1442707493150674", + "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" + }, + { + "duration": "3.1380149608219177", + "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" + }, + { + "duration": "5.763148102739726", + "name": "blink_perf.svg/AzLizardBenjiPark.html" + }, + { + "duration": "5.510258941095892", + "name": "blink_perf.svg/Bamboo.html" + }, + { + "duration": "3.5768422191780838", + "name": "blink_perf.svg/Cactus.html" + }, + { + "duration": "4.584267484931505", + "name": "blink_perf.svg/Cowboy.html" + }, + { + "duration": "2.995832", + "name": "blink_perf.svg/Cowboy_transform.html" + }, + { + "duration": "2.389267015068493", + "name": "blink_perf.svg/CrawFishGanson.html" + }, + { + "duration": "4.381152473972603", + "name": "blink_perf.svg/Debian.html" + }, + { + "duration": "1.2137930931506853", + "name": "blink_perf.svg/DropsOnABlade.html" + }, + { + "duration": "1.2265824479452059", + "name": "blink_perf.svg/FlowerFromMyGarden.html" + }, + { + "duration": "3.932711863013697", + "name": "blink_perf.svg/FoodLeifLodahl.html" + }, + { + "duration": "2.3842856356164384", + "name": "blink_perf.svg/France.html" + }, + { + "duration": "2.207575312328767", + "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" + }, + { + "duration": "1.4296998410958908", + "name": "blink_perf.svg/GearFlowers.html" + }, + { + "duration": "1.2861308410958907", + "name": "blink_perf.svg/HarveyRayner.html" + }, + { + "duration": "4.525691716438357", + "name": "blink_perf.svg/HereGear.html" + }, + { + "duration": "2.6572247027397253", + "name": "blink_perf.svg/MtSaintHelens.html" + }, + { + "duration": "3.681725021369862", + "name": "blink_perf.svg/Samurai.html" + }, + { + "duration": "31.431096438356153", + "name": "blink_perf.svg/SierpinskiCarpet.html" + }, + { + "duration": "5.021844179452052", + "name": "blink_perf.svg/SvgCubics.html" + }, + { + "duration": "3.0146342890410978", + "name": "blink_perf.svg/SvgHitTesting.html" + }, + { + "duration": "9.470183001369861", + "name": "blink_perf.svg/SvgNestedUse.html" + }, + { + "duration": "2.706903089041095", + "name": "blink_perf.svg/UnderTheSee.html" + }, + { + "duration": "2.498680021917808", + "name": "blink_perf.svg/WorldIso.html" + }, + { + "duration": "3.5130111904109587", + "name": "blink_perf.svg/Worldcup.html" + }, + { + "duration": "33.46763031506849", + "name": "dromaeo/http://dromaeo.com?dom-attr" + }, + { + "duration": "38.450619068493154", + "name": "dromaeo/http://dromaeo.com?dom-modify" + }, + { + "duration": "49.18381115068494", + "name": "dromaeo/http://dromaeo.com?dom-query" + }, + { + "duration": "26.983782301369864", + "name": "dromaeo/http://dromaeo.com?dom-traverse" + }, + { + "duration": "8.15092704109589", + "name": "dummy_benchmark.histogram_benchmark_1/dummy_page.html" + }, + { + "duration": "1.3508971301369863", + "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" + }, + { + "duration": "4.266124099999999", + "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" + }, + { + "duration": "187.04576671232877", + "name": "jetstream/http://browserbench.org/JetStream/" + }, + { + "duration": "23.47696831506851", + "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" + }, + { + "duration": "56.6391619537037", + "name": "loading.desktop/24h" + }, + { + "duration": "28.858528789473677", + "name": "loading.desktop/24h_cold" + }, + { + "duration": "38.911468842105265", + "name": "loading.desktop/24h_warm" + }, + { + "duration": "100.09251562962964", + "name": "loading.desktop/AirBnB" + }, + { + "duration": "37.53791484210526", + "name": "loading.desktop/AirBnB_cold" + }, + { + "duration": "57.591780105263155", + "name": "loading.desktop/AirBnB_warm" + }, + { + "duration": "46.51260297222221", + "name": "loading.desktop/Aljayyash" + }, + { + "duration": "37.270381236842105", + "name": "loading.desktop/Aljayyash_cold" + }, + { + "duration": "25.41997815789474", + "name": "loading.desktop/Aljayyash_warm" + }, + { + "duration": "85.85462735185186", + "name": "loading.desktop/AllRecipes" + }, + { + "duration": "31.71645113157894", + "name": "loading.desktop/AllRecipes_cold" + }, + { + "duration": "50.58660905263158", + "name": "loading.desktop/AllRecipes_warm" + }, + { + "duration": "106.08756672222223", + "name": "loading.desktop/ArsTechnica" + }, + { + "duration": "46.99413626315789", + "name": "loading.desktop/ArsTechnica_cold" + }, + { + "duration": "62.25106821052631", + "name": "loading.desktop/ArsTechnica_warm" + }, + { + "duration": "49.683328101851856", + "name": "loading.desktop/Baidu" + }, + { + "duration": "20.891759210526317", + "name": "loading.desktop/Baidu_cold" + }, + { + "duration": "25.867251289473685", + "name": "loading.desktop/Baidu_warm" + }, + { + "duration": "74.98162424074073", + "name": "loading.desktop/Bhaskar" + }, + { + "duration": "27.95837686842105", + "name": "loading.desktop/Bhaskar_cold" + }, + { + "duration": "50.95784915789474", + "name": "loading.desktop/Bhaskar_warm" + }, + { + "duration": "63.44838919811321", + "name": "loading.desktop/Chosun" + }, + { + "duration": "36.972482078947365", + "name": "loading.desktop/Chosun_cold" + }, + { + "duration": "36.311927184210525", + "name": "loading.desktop/Chosun_warm" + }, + { + "duration": "55.57394973148148", + "name": "loading.desktop/Colorado.edu" + }, + { + "duration": "31.481614157894736", + "name": "loading.desktop/Colorado.edu_cold" + }, + { + "duration": "30.075967499999994", + "name": "loading.desktop/Colorado.edu_warm" + }, + { + "duration": "64.64322497222223", + "name": "loading.desktop/Danawa" + }, + { + "duration": "28.318962368421055", + "name": "loading.desktop/Danawa_cold" + }, + { + "duration": "31.64931039473684", + "name": "loading.desktop/Danawa_warm" + }, + { + "duration": "55.571910592592616", + "name": "loading.desktop/Daum" + }, + { + "duration": "26.952415263157892", + "name": "loading.desktop/Daum_cold" + }, + { + "duration": "34.30148768421053", + "name": "loading.desktop/Daum_warm" + }, + { + "duration": "61.38795064814816", + "name": "loading.desktop/Donga" + }, + { + "duration": "29.10485444736842", + "name": "loading.desktop/Donga_cold" + }, + { + "duration": "33.25607536842105", + "name": "loading.desktop/Donga_warm" + }, + { + "duration": "85.32565674074075", + "name": "loading.desktop/Economist" + }, + { + "duration": "32.77259836842105", + "name": "loading.desktop/Economist_cold" + }, + { + "duration": "49.81730347368421", + "name": "loading.desktop/Economist_warm" + }, + { + "duration": "155.0341902407407", + "name": "loading.desktop/Elmundo" + }, + { + "duration": "41.61288811111112", + "name": "loading.desktop/Elmundo_cold" + }, + { + "duration": "106.75215868421054", + "name": "loading.desktop/Elmundo_warm" + }, + { + "duration": "59.629071092592596", + "name": "loading.desktop/FC2Blog" + }, + { + "duration": "37.17531886842105", + "name": "loading.desktop/FC2Blog_cold" + }, + { + "duration": "38.731308", + "name": "loading.desktop/FC2Blog_warm" + }, + { + "duration": "64.22050282407409", + "name": "loading.desktop/FIFA" + }, + { + "duration": "30.34453381578947", + "name": "loading.desktop/FIFA_cold" + }, + { + "duration": "37.01019247368422", + "name": "loading.desktop/FIFA_warm" + }, + { + "duration": "78.50880724999999", + "name": "loading.desktop/FarsNews" + }, + { + "duration": "47.73103755263158", + "name": "loading.desktop/FarsNews_cold" + }, + { + "duration": "34.77855834210526", + "name": "loading.desktop/FarsNews_warm" + }, + { + "duration": "65.0804099074074", + "name": "loading.desktop/Flickr" + }, + { + "duration": "29.214443026315788", + "name": "loading.desktop/Flickr_cold" + }, + { + "duration": "41.075292000000005", + "name": "loading.desktop/Flickr_warm" + }, + { + "duration": "62.63624121296298", + "name": "loading.desktop/FlipKart" + }, + { + "duration": "24.907210026315795", + "name": "loading.desktop/FlipKart_cold" + }, + { + "duration": "37.56769984210527", + "name": "loading.desktop/FlipKart_warm" + }, + { + "duration": "48.38522250943395", + "name": "loading.desktop/Free.fr" + }, + { + "duration": "28.726826499999998", + "name": "loading.desktop/Free.fr_cold" + }, + { + "duration": "25.963965315789476", + "name": "loading.desktop/Free.fr_warm" + }, + { + "duration": "45.254653472222216", + "name": "loading.desktop/HTML5Rocks" + }, + { + "duration": "25.263007921052633", + "name": "loading.desktop/HTML5Rocks_cold" + }, + { + "duration": "24.173279210526314", + "name": "loading.desktop/HTML5Rocks_warm" + }, + { + "duration": "50.383407009259265", + "name": "loading.desktop/Haraj" + }, + { + "duration": "20.528076", + "name": "loading.desktop/Haraj_cold" + }, + { + "duration": "25.3074457368421", + "name": "loading.desktop/Haraj_warm" + }, + { + "duration": "62.90844980555554", + "name": "loading.desktop/HatenaBookmark" + }, + { + "duration": "29.690448368421062", + "name": "loading.desktop/HatenaBookmark_cold" + }, + { + "duration": "36.356258315789475", + "name": "loading.desktop/HatenaBookmark_warm" + }, + { + "duration": "65.62800249074073", + "name": "loading.desktop/IGN" + }, + { + "duration": "29.23167915789474", + "name": "loading.desktop/IGN_cold" + }, + { + "duration": "47.785515368421045", + "name": "loading.desktop/IGN_warm" + }, + { + "duration": "65.1874733888889", + "name": "loading.desktop/IMDB" + }, + { + "duration": "35.209111578947365", + "name": "loading.desktop/IMDB_cold" + }, + { + "duration": "39.8144842631579", + "name": "loading.desktop/IMDB_warm" + }, + { + "duration": "64.91580157407407", + "name": "loading.desktop/IndiaTimes" + }, + { + "duration": "24.77707384210526", + "name": "loading.desktop/IndiaTimes_cold" + }, + { + "duration": "41.73304147368421", + "name": "loading.desktop/IndiaTimes_warm" + }, + { + "duration": "61.5734805925926", + "name": "loading.desktop/Kakaku" + }, + { + "duration": "34.934151236842105", + "name": "loading.desktop/Kakaku_cold" + }, + { + "duration": "47.54273073684211", + "name": "loading.desktop/Kakaku_warm" + }, + { + "duration": "96.92037718", + "name": "loading.desktop/Kenh14" + }, + { + "duration": "41.438873052631585", + "name": "loading.desktop/Kenh14_cold" + }, + { + "duration": "56.58975921052631", + "name": "loading.desktop/Kenh14_warm" + }, + { + "duration": "62.490112283018846", + "name": "loading.desktop/Mercadolivre" + }, + { + "duration": "24.077747657894733", + "name": "loading.desktop/Mercadolivre_cold" + }, + { + "duration": "29.94458239473684", + "name": "loading.desktop/Mercadolivre_warm" + }, + { + "duration": "56.264406055555554", + "name": "loading.desktop/Naver" + }, + { + "duration": "30.99733081578948", + "name": "loading.desktop/Naver_cold" + }, + { + "duration": "29.157256500000006", + "name": "loading.desktop/Naver_warm" + }, + { + "duration": "52.46760201851852", + "name": "loading.desktop/Orange" + }, + { + "duration": "29.836574000000006", + "name": "loading.desktop/Orange_cold" + }, + { + "duration": "26.816032894736843", + "name": "loading.desktop/Orange_warm" + }, + { + "duration": "60.271976166666676", + "name": "loading.desktop/Pantip" + }, + { + "duration": "24.56640781578947", + "name": "loading.desktop/Pantip_cold" + }, + { + "duration": "32.31617205263158", + "name": "loading.desktop/Pantip_warm" + }, + { + "duration": "66.02975487962965", + "name": "loading.desktop/PremierLeague" + }, + { + "duration": "35.00676407894737", + "name": "loading.desktop/PremierLeague_cold" + }, + { + "duration": "33.815724157894735", + "name": "loading.desktop/PremierLeague_warm" + }, + { + "duration": "76.84475220370369", + "name": "loading.desktop/QQ" + }, + { + "duration": "29.332266815789474", + "name": "loading.desktop/QQ_cold" + }, + { + "duration": "40.7749137368421", + "name": "loading.desktop/QQ_warm" + }, + { + "duration": "58.108940638888896", + "name": "loading.desktop/REI" + }, + { + "duration": "29.194772894736836", + "name": "loading.desktop/REI_cold" + }, + { + "duration": "36.580444526315794", + "name": "loading.desktop/REI_warm" + }, + { + "duration": "50.209842425925906", + "name": "loading.desktop/Ruten" + }, + { + "duration": "26.79026613157895", + "name": "loading.desktop/Ruten_cold" + }, + { + "duration": "36.350900894736846", + "name": "loading.desktop/Ruten_warm" + }, + { + "duration": "76.60619988888887", + "name": "loading.desktop/Sina" + }, + { + "duration": "28.924669684210524", + "name": "loading.desktop/Sina_cold" + }, + { + "duration": "45.19426673684212", + "name": "loading.desktop/Sina_warm" + }, + { + "duration": "71.93265721296295", + "name": "loading.desktop/Taobao" + }, + { + "duration": "45.57922463157895", + "name": "loading.desktop/Taobao_cold" + }, + { + "duration": "49.552116473684194", + "name": "loading.desktop/Taobao_warm" + }, + { + "duration": "72.21789571296296", + "name": "loading.desktop/TheOnion" + }, + { + "duration": "45.44145639473684", + "name": "loading.desktop/TheOnion_cold" + }, + { + "duration": "41.55324221052632", + "name": "loading.desktop/TheOnion_warm" + }, + { + "duration": "66.50804817592592", + "name": "loading.desktop/TheVerge" + }, + { + "duration": "31.47199944736842", + "name": "loading.desktop/TheVerge_cold" + }, + { + "duration": "35.57095368421053", + "name": "loading.desktop/TheVerge_warm" + }, + { + "duration": "74.58799517592594", + "name": "loading.desktop/TicketMaster" + }, + { + "duration": "35.37388484210527", + "name": "loading.desktop/TicketMaster_cold" + }, + { + "duration": "41.94686299999999", + "name": "loading.desktop/TicketMaster_warm" + }, + { + "duration": "97.75077353703708", + "name": "loading.desktop/Vietnamnet" + }, + { + "duration": "38.86096636842105", + "name": "loading.desktop/Vietnamnet_cold" + }, + { + "duration": "58.271567315789476", + "name": "loading.desktop/Vietnamnet_warm" + }, + { + "duration": "82.27799458333337", + "name": "loading.desktop/Vnexpress" + }, + { + "duration": "33.685208315789474", + "name": "loading.desktop/Vnexpress_cold" + }, + { + "duration": "41.81888836842105", + "name": "loading.desktop/Vnexpress_warm" + }, + { + "duration": "86.54826837962965", + "name": "loading.desktop/Walgreens" + }, + { + "duration": "40.87559889473685", + "name": "loading.desktop/Walgreens_cold" + }, + { + "duration": "62.21632731578947", + "name": "loading.desktop/Walgreens_warm" + }, + { + "duration": "54.2556340925926", + "name": "loading.desktop/Yandex" + }, + { + "duration": "21.961230842105266", + "name": "loading.desktop/Yandex_cold" + }, + { + "duration": "31.358036236842107", + "name": "loading.desktop/Yandex_warm" + }, + { + "duration": "75.34000142592592", + "name": "loading.desktop/amazon.co.jp" + }, + { + "duration": "30.49973989473684", + "name": "loading.desktop/amazon.co.jp_cold" + }, + { + "duration": "52.47237057894737", + "name": "loading.desktop/amazon.co.jp_warm" + }, + { + "duration": "58.80852688888886", + "name": "loading.desktop/ja.wikipedia" + }, + { + "duration": "24.105401342105264", + "name": "loading.desktop/ja.wikipedia_cold" + }, + { + "duration": "29.654435052631577", + "name": "loading.desktop/ja.wikipedia_warm" + }, + { + "duration": "81.63407026851854", + "name": "loading.desktop/money.cnn" + }, + { + "duration": "48.22829744736841", + "name": "loading.desktop/money.cnn_cold" + }, + { + "duration": "47.26071131578948", + "name": "loading.desktop/money.cnn_warm" + }, + { + "duration": "55.619171990740746", + "name": "loading.desktop/ru.wikipedia" + }, + { + "duration": "27.39037886842105", + "name": "loading.desktop/ru.wikipedia_cold" + }, + { + "duration": "33.79109636842106", + "name": "loading.desktop/ru.wikipedia_warm" + }, + { + "duration": "84.44235018367348", + "name": "loading.desktop/uol.com.br" + }, + { + "duration": "33.50531697058823", + "name": "loading.desktop/uol.com.br_cold" + }, + { + "duration": "50.0147677368421", + "name": "loading.desktop/uol.com.br_warm" + }, + { + "duration": "64.96711614814818", + "name": "loading.desktop/yahoo.co.jp" + }, + { + "duration": "25.38735486842105", + "name": "loading.desktop/yahoo.co.jp_cold" + }, + { + "duration": "49.58117373684211", + "name": "loading.desktop/yahoo.co.jp_warm" + }, + { + "duration": "16.739403383561644", + "name": "media.desktop/mse.html?media=aac_audio.mp4" + }, + { + "duration": "15.039296006849314", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4" + }, + { + "duration": "15.597283883561643", + "name": "media.desktop/mse.html?media=aac_audio.mp4,h264_video.mp4&waitForPageLoaded=true" + }, + { + "duration": "12.742021767123287", + "name": "media.desktop/mse.html?media=h264_video.mp4" + }, + { + "duration": "20.672199342465753", + "name": "media.desktop/video.html?src=crowd.ogg&type=audio" + }, + { + "duration": "23.736288575342464", + "name": "media.desktop/video.html?src=crowd1080.mp4" + }, + { + "duration": "22.533111602739734", + "name": "media.desktop/video.html?src=crowd1080.webm" + }, + { + "duration": "21.657831", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm" + }, + { + "duration": "11.471800821917808", + "name": "media.desktop/video.html?src=crowd1080_vp9.webm&seek" + }, + { + "duration": "21.59441626027397", + "name": "media.desktop/video.html?src=crowd720_vp9.webm" + }, + { + "duration": "23.19018673972604", + "name": "media.desktop/video.html?src=garden2_10s.mp4" + }, + { + "duration": "16.175022479452053", + "name": "media.desktop/video.html?src=garden2_10s.mp4&seek" + }, + { + "duration": "21.33998905479452", + "name": "media.desktop/video.html?src=garden2_10s.webm" + }, + { + "duration": "14.699156458904108", + "name": "media.desktop/video.html?src=garden2_10s.webm&seek" + }, + { + "duration": "15.201886294520541", + "name": "media.desktop/video.html?src=smpte_3840x2160_60fps_vp9.webm&seek" + }, + { + "duration": "26.69869206849315", + "name": "media.desktop/video.html?src=tulip2.m4a&type=audio" + }, + { + "duration": "30.287181643835627", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio" + }, + { + "duration": "11.733721712328764", + "name": "media.desktop/video.html?src=tulip2.mp3&type=audio&seek" + }, + { + "duration": "27.704583123287666", + "name": "media.desktop/video.html?src=tulip2.mp4" + }, + { + "duration": "29.754770849315058", + "name": "media.desktop/video.html?src=tulip2.mp4&busyjs" + }, + { + "duration": "11.539693143835613", + "name": "media.desktop/video.html?src=tulip2.mp4&seek" + }, + { + "duration": "27.635468493150697", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio" + }, + { + "duration": "12.493895897260266", + "name": "media.desktop/video.html?src=tulip2.ogg&type=audio&seek" + }, + { + "duration": "27.850100150684924", + "name": "media.desktop/video.html?src=tulip2.vp9.webm" + }, + { + "duration": "20.948647602739722", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&background" + }, + { + "duration": "11.829810965753426", + "name": "media.desktop/video.html?src=tulip2.vp9.webm&seek" + }, + { + "duration": "33.373566273972614", + "name": "media.desktop/video.html?src=tulip2.vp9.webm_Regular-3G" + }, + { + "duration": "29.427672931506855", + "name": "media.desktop/video.html?src=tulip2.wav&type=audio" + }, + { + "duration": "12.483313226027398", + "name": "media.desktop/video.html?src=tulip2.wav&type=audio&seek" + }, + { + "duration": "97.54892967123291", + "name": "memory.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "94.45424289041097", + "name": "memory.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "91.75267704109588", + "name": "memory.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "87.48094841095892", + "name": "memory.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "96.41006856164383", + "name": "memory.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "91.31014227397257", + "name": "memory.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "98.47061193150681", + "name": "memory.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "95.17719173972606", + "name": "memory.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "156.0718118055555", + "name": "memory.long_running_idle_gmail_background_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "150.6178481944444", + "name": "memory.long_running_idle_gmail_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "42.96792906849317", + "name": "octane/http://chromium.github.io/octane/index.html?auto=1" + }, + { + "duration": "56.201289246575335", + "name": "oortonline_tbmv2/http://oortonline.gl/#run" + }, + { + "duration": "40.2334127260274", + "name": "power.desktop/TrivialAnimationPageSharedPageState" + }, + { + "duration": "41.66211712328768", + "name": "power.desktop/TrivialBlinkingCursorPageSharedPageState" + }, + { + "duration": "40.13419012328765", + "name": "power.desktop/TrivialBlurAnimationPageSharedPageState" + }, + { + "duration": "39.72981383561644", + "name": "power.desktop/TrivialCanvasPageSharedPageState" + }, + { + "duration": "42.48820538356165", + "name": "power.desktop/TrivialFullscreenVideoPageSharedPageState" + }, + { + "duration": "40.374687945205466", + "name": "power.desktop/TrivialGifPageSharedPageState" + }, + { + "duration": "41.34333971232877", + "name": "power.desktop/TrivialScrollingPageSharedPageState" + }, + { + "duration": "41.57366641095891", + "name": "power.desktop/TrivialWebGLPageSharedPageState" + }, + { + "duration": "152.09028972602744", + "name": "power.desktop/abcnews" + }, + { + "duration": "42.76588210958904", + "name": "power.desktop/indiatimes" + }, + { + "duration": "45.48478842465754", + "name": "power.desktop/instagram" + }, + { + "duration": "39.79197743835617", + "name": "power.desktop/microsoft" + }, + { + "duration": "42.10106816438357", + "name": "power.desktop/sina" + }, + { + "duration": "40.90004658904109", + "name": "power.desktop/slideshare" + }, + { + "duration": "52.79290531506848", + "name": "power.desktop/uol" + }, + { + "duration": "16.177477410958904", + "name": "power.idle_platform/IdleStory_10s" + }, + { + "duration": "126.77476550684928", + "name": "power.idle_platform/IdleStory_120s" + }, + { + "duration": "66.38237771232875", + "name": "power.idle_platform/IdleStory_60s" + }, + { + "duration": "5.893456357534246", + "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" + }, + { + "duration": "8.316188897260272", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" + }, + { + "duration": "7.292987806849314", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" + }, + { + "duration": "7.942345052054789", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" + }, + { + "duration": "8.926683720547947", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" + }, + { + "duration": "8.149239442465754", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" + }, + { + "duration": "12.607602979452054", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" + }, + { + "duration": "5.782919145205478", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" + }, + { + "duration": "12.681553993150683", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" + }, + { + "duration": "8.90563007808219", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" + }, + { + "duration": "7.667620254794522", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" + }, + { + "duration": "15.901710636986301", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" + }, + { + "duration": "7.778144060273971", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" + }, + { + "duration": "11.926357554794523", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" + }, + { + "duration": "6.0240057712328765", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" + }, + { + "duration": "11.776369815068495", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" + }, + { + "duration": "25.287334452054782", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" + }, + { + "duration": "9.744278684931507", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" + }, + { + "duration": "12.284237664383555", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" + }, + { + "duration": "7.624342999999997", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" + }, + { + "duration": "4.677941642465753", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" + }, + { + "duration": "17.913214356164378", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" + }, + { + "duration": "97.09109243835614", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" + }, + { + "duration": "75.7653895890411", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" + }, + { + "duration": "17.88292382191781", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" + }, + { + "duration": "18.967923421875003", + "name": "rendering.desktop/amazon_pinch" + }, + { + "duration": "24.98929441095891", + "name": "rendering.desktop/analog_clock_svg" + }, + { + "duration": "27.582899492063483", + "name": "rendering.desktop/animometer_webgl" + }, + { + "duration": "23.767901890624998", + "name": "rendering.desktop/aquarium" + }, + { + "duration": "28.073151640624985", + "name": "rendering.desktop/aquarium_20k" + }, + { + "duration": "26.186043583333337", + "name": "rendering.desktop/background_color_animation" + }, + { + "duration": "34.41917126666667", + "name": "rendering.desktop/background_color_animation_with_gradient" + }, + { + "duration": "24.9141171617647", + "name": "rendering.desktop/balls_css_key_frame_animations" + }, + { + "duration": "41.826988279411765", + "name": "rendering.desktop/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "28.046235750000008", + "name": "rendering.desktop/balls_css_transition_2_properties" + }, + { + "duration": "28.62471864705882", + "name": "rendering.desktop/balls_css_transition_40_properties" + }, + { + "duration": "31.662632147058822", + "name": "rendering.desktop/balls_css_transition_all_properties" + }, + { + "duration": "25.329358161764716", + "name": "rendering.desktop/balls_javascript_canvas" + }, + { + "duration": "24.604830455882354", + "name": "rendering.desktop/balls_javascript_css" + }, + { + "duration": "28.134080880597022", + "name": "rendering.desktop/balls_svg_animations" + }, + { + "duration": "21.706011546874993", + "name": "rendering.desktop/blob" + }, + { + "duration": "31.745510514705884", + "name": "rendering.desktop/blogspot" + }, + { + "duration": "26.38882540625", + "name": "rendering.desktop/blogspot_pinch" + }, + { + "duration": "17.17113044117647", + "name": "rendering.desktop/booking.com" + }, + { + "duration": "20.6293434375", + "name": "rendering.desktop/booking_pinch" + }, + { + "duration": "15.007149772058828", + "name": "rendering.desktop/bouncing_balls_15" + }, + { + "duration": "18.374217066176467", + "name": "rendering.desktop/bouncing_balls_shadow" + }, + { + "duration": "16.20409127205883", + "name": "rendering.desktop/bouncing_clipped_rectangles" + }, + { + "duration": "18.98352482352941", + "name": "rendering.desktop/bouncing_gradient_circles" + }, + { + "duration": "14.93148516176471", + "name": "rendering.desktop/bouncing_png_images" + }, + { + "duration": "25.849614294117647", + "name": "rendering.desktop/bouncing_svg_images" + }, + { + "duration": "18.260751161290315", + "name": "rendering.desktop/canvas_05000_pixels_per_second" + }, + { + "duration": "18.034073629032257", + "name": "rendering.desktop/canvas_10000_pixels_per_second" + }, + { + "duration": "15.442614395161291", + "name": "rendering.desktop/canvas_15000_pixels_per_second" + }, + { + "duration": "15.81817474193548", + "name": "rendering.desktop/canvas_20000_pixels_per_second" + }, + { + "duration": "13.75665470967742", + "name": "rendering.desktop/canvas_30000_pixels_per_second" + }, + { + "duration": "11.66109846774194", + "name": "rendering.desktop/canvas_40000_pixels_per_second" + }, + { + "duration": "11.206391903225814", + "name": "rendering.desktop/canvas_50000_pixels_per_second" + }, + { + "duration": "9.739545", + "name": "rendering.desktop/canvas_60000_pixels_per_second" + }, + { + "duration": "10.807468935483874", + "name": "rendering.desktop/canvas_75000_pixels_per_second" + }, + { + "duration": "9.841998830645164", + "name": "rendering.desktop/canvas_90000_pixels_per_second" + }, + { + "duration": "16.13801770588235", + "name": "rendering.desktop/canvas_animation_no_clear" + }, + { + "duration": "17.40298589705882", + "name": "rendering.desktop/canvas_arcs" + }, + { + "duration": "15.648261558823533", + "name": "rendering.desktop/canvas_font_cycler" + }, + { + "duration": "15.017224720588231", + "name": "rendering.desktop/canvas_lines" + }, + { + "duration": "14.03121963235294", + "name": "rendering.desktop/canvas_to_blob" + }, + { + "duration": "9.063174725806451", + "name": "rendering.desktop/cats_unscaled" + }, + { + "duration": "9.026541748387098", + "name": "rendering.desktop/cats_viewport_width" + }, + { + "duration": "19.39111619117648", + "name": "rendering.desktop/chip_tune" + }, + { + "duration": "26.439289609375006", + "name": "rendering.desktop/cnn_pinch" + }, + { + "duration": "25.52567286764705", + "name": "rendering.desktop/compositor_heavy_animation" + }, + { + "duration": "24.974764691176475", + "name": "rendering.desktop/crafty_mind" + }, + { + "duration": "23.172230088235295", + "name": "rendering.desktop/css_animations_many_keyframes" + }, + { + "duration": "25.53550163235294", + "name": "rendering.desktop/css_animations_simultaneous_inline_style" + }, + { + "duration": "23.163983676470583", + "name": "rendering.desktop/css_animations_simultaneous_new_element" + }, + { + "duration": "24.123270691176472", + "name": "rendering.desktop/css_animations_simultaneous_style_element" + }, + { + "duration": "23.551700544117647", + "name": "rendering.desktop/css_animations_simultaneous_updating_class" + }, + { + "duration": "24.35052098529412", + "name": "rendering.desktop/css_animations_staggered_infinite_iterations" + }, + { + "duration": "26.451037794117653", + "name": "rendering.desktop/css_animations_staggered_inline_style" + }, + { + "duration": "29.223572088235297", + "name": "rendering.desktop/css_animations_staggered_new_element" + }, + { + "duration": "25.0904811764706", + "name": "rendering.desktop/css_animations_staggered_style_element" + }, + { + "duration": "24.630690823529413", + "name": "rendering.desktop/css_animations_staggered_updating_class" + }, + { + "duration": "27.016715602941172", + "name": "rendering.desktop/css_animations_triggered_inline_style" + }, + { + "duration": "26.822815823529407", + "name": "rendering.desktop/css_animations_triggered_new_element" + }, + { + "duration": "26.747446588235295", + "name": "rendering.desktop/css_animations_triggered_style_element" + }, + { + "duration": "24.018403676470587", + "name": "rendering.desktop/css_animations_triggered_updating_class" + }, + { + "duration": "22.576493014705882", + "name": "rendering.desktop/css_transitions_inline_style" + }, + { + "duration": "24.246541308823527", + "name": "rendering.desktop/css_transitions_new_element" + }, + { + "duration": "27.983775985294123", + "name": "rendering.desktop/css_transitions_staggered_inline_style" + }, + { + "duration": "23.523289161764705", + "name": "rendering.desktop/css_transitions_staggered_new_element" + }, + { + "duration": "22.68247920588236", + "name": "rendering.desktop/css_transitions_staggered_style_element" + }, + { + "duration": "22.255567632352943", + "name": "rendering.desktop/css_transitions_staggered_updating_class" + }, + { + "duration": "21.59878764705882", + "name": "rendering.desktop/css_transitions_style_element" + }, + { + "duration": "24.995135147058814", + "name": "rendering.desktop/css_transitions_triggered_inline_style" + }, + { + "duration": "24.856633014705874", + "name": "rendering.desktop/css_transitions_triggered_new_element" + }, + { + "duration": "25.442509397058828", + "name": "rendering.desktop/css_transitions_triggered_style_element" + }, + { + "duration": "26.890156117647063", + "name": "rendering.desktop/css_transitions_triggered_updating_class" + }, + { + "duration": "21.83583701470589", + "name": "rendering.desktop/css_transitions_updating_class" + }, + { + "duration": "21.254037500000006", + "name": "rendering.desktop/css_value_type_color" + }, + { + "duration": "107.09072576470591", + "name": "rendering.desktop/css_value_type_filter" + }, + { + "duration": "23.06271502941176", + "name": "rendering.desktop/css_value_type_length" + }, + { + "duration": "22.23014279411765", + "name": "rendering.desktop/css_value_type_length_complex" + }, + { + "duration": "24.66195879411765", + "name": "rendering.desktop/css_value_type_length_simple" + }, + { + "duration": "24.900661676470587", + "name": "rendering.desktop/css_value_type_path" + }, + { + "duration": "26.498790794117646", + "name": "rendering.desktop/css_value_type_shadow" + }, + { + "duration": "22.46777016176471", + "name": "rendering.desktop/css_value_type_transform_complex" + }, + { + "duration": "22.101426044117634", + "name": "rendering.desktop/css_value_type_transform_simple" + }, + { + "duration": "24.0701635625", + "name": "rendering.desktop/dynamic_cube_map" + }, + { + "duration": "19.316628359375", + "name": "rendering.desktop/earth" + }, + { + "duration": "15.137348617647062", + "name": "rendering.desktop/ebay" + }, + { + "duration": "25.00582825", + "name": "rendering.desktop/ebay_pinch" + }, + { + "duration": "19.47253523529412", + "name": "rendering.desktop/effect_games" + }, + { + "duration": "15.380016749999996", + "name": "rendering.desktop/espn" + }, + { + "duration": "21.960228296874998", + "name": "rendering.desktop/espn_pinch" + }, + { + "duration": "21.84442941666666", + "name": "rendering.desktop/extra_large_texture_uploads" + }, + { + "duration": "14.342044301470585", + "name": "rendering.desktop/facebook" + }, + { + "duration": "19.0624370625", + "name": "rendering.desktop/facebook_pinch" + }, + { + "duration": "18.827863544117644", + "name": "rendering.desktop/fill_shapes" + }, + { + "duration": "27.775222088235292", + "name": "rendering.desktop/filter_terrain_svg" + }, + { + "duration": "15.511360279411763", + "name": "rendering.desktop/geo_apis" + }, + { + "duration": "24.78247989552239", + "name": "rendering.desktop/gmail" + }, + { + "duration": "26.95436825000001", + "name": "rendering.desktop/gmail_pinch" + }, + { + "duration": "16.877087902985075", + "name": "rendering.desktop/google_calendar" + }, + { + "duration": "26.201189920634917", + "name": "rendering.desktop/google_calendar_pinch" + }, + { + "duration": "40.97514788059702", + "name": "rendering.desktop/google_docs" + }, + { + "duration": "25.290082269841278", + "name": "rendering.desktop/google_image_pinch" + }, + { + "duration": "19.947835283582084", + "name": "rendering.desktop/google_image_search" + }, + { + "duration": "22.063423910447764", + "name": "rendering.desktop/google_plus" + }, + { + "duration": "22.11162376190477", + "name": "rendering.desktop/google_search_pinch" + }, + { + "duration": "16.474777805970152", + "name": "rendering.desktop/google_web_search" + }, + { + "duration": "25.15735895588236", + "name": "rendering.desktop/guimark_vector_chart" + }, + { + "duration": "17.56429170149254", + "name": "rendering.desktop/hakim" + }, + { + "duration": "46.43986861764705", + "name": "rendering.desktop/ie_chalkboard" + }, + { + "duration": "26.251670626865675", + "name": "rendering.desktop/ie_pirate_mark" + }, + { + "duration": "19.84928165671642", + "name": "rendering.desktop/jarro_doverson" + }, + { + "duration": "20.75123000000001", + "name": "rendering.desktop/kevs_3d" + }, + { + "duration": "21.128942044776114", + "name": "rendering.desktop/keyframed_animations" + }, + { + "duration": "24.89761730508475", + "name": "rendering.desktop/large_texture_uploads" + }, + { + "duration": "15.09024961940298", + "name": "rendering.desktop/linkedin" + }, + { + "duration": "19.843143190476184", + "name": "rendering.desktop/linkedin_pinch" + }, + { + "duration": "22.771603268656715", + "name": "rendering.desktop/man_in_blue" + }, + { + "duration": "21.24024667164179", + "name": "rendering.desktop/many_images" + }, + { + "duration": "18.9055656031746", + "name": "rendering.desktop/many_planets_deep" + }, + { + "duration": "20.187275119402976", + "name": "rendering.desktop/maps_move" + }, + { + "duration": "38.77616374603173", + "name": "rendering.desktop/maps_perf_test" + }, + { + "duration": "23.9652963220339", + "name": "rendering.desktop/medium_texture_uploads" + }, + { + "duration": "18.141060134328363", + "name": "rendering.desktop/megi_dish" + }, + { + "duration": "15.064855738805965", + "name": "rendering.desktop/microsoft_asteroid_belt" + }, + { + "duration": "21.07428311940299", + "name": "rendering.desktop/microsoft_fireflies" + }, + { + "duration": "16.428895022388055", + "name": "rendering.desktop/microsoft_fish_ie_tank" + }, + { + "duration": "15.100451298507465", + "name": "rendering.desktop/microsoft_snow" + }, + { + "duration": "17.90939319402985", + "name": "rendering.desktop/microsoft_speed_reading" + }, + { + "duration": "18.35342429850747", + "name": "rendering.desktop/microsoft_tweet_map" + }, + { + "duration": "19.952141358208962", + "name": "rendering.desktop/microsoft_video_city" + }, + { + "duration": "15.644546798507463", + "name": "rendering.desktop/microsoft_worker_fountains" + }, + { + "duration": "17.486086708955224", + "name": "rendering.desktop/mix_10k" + }, + { + "duration": "20.50498634328358", + "name": "rendering.desktop/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "31.5638538358209", + "name": "rendering.desktop/mix_blend_mode_animation_screen" + }, + { + "duration": "27.337463776119403", + "name": "rendering.desktop/motion_mark_canvas_fill_shapes" + }, + { + "duration": "29.037087656716423", + "name": "rendering.desktop/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "49.96691916417912", + "name": "rendering.desktop/motion_mark_focus" + }, + { + "duration": "19.773375301587308", + "name": "rendering.desktop/nvidia_vertex_buffer_object" + }, + { + "duration": "31.110200089552237", + "name": "rendering.desktop/overlay_background_color_css_transitions_page" + }, + { + "duration": "21.9686716031746", + "name": "rendering.desktop/particles" + }, + { + "duration": "24.11522888059702", + "name": "rendering.desktop/pinterest" + }, + { + "duration": "15.729993820895523", + "name": "rendering.desktop/put_get_image_data" + }, + { + "duration": "20.868402694915254", + "name": "rendering.desktop/raf" + }, + { + "duration": "22.417678203389823", + "name": "rendering.desktop/raf_animation" + }, + { + "duration": "18.767447186440677", + "name": "rendering.desktop/raf_canvas" + }, + { + "duration": "21.846471627118643", + "name": "rendering.desktop/raf_touch_animation" + }, + { + "duration": "17.548323597014925", + "name": "rendering.desktop/runway" + }, + { + "duration": "18.395900222222227", + "name": "rendering.desktop/san_angeles" + }, + { + "duration": "14.071587669491525", + "name": "rendering.desktop/second_batch_js_heavy" + }, + { + "duration": "10.950686796610169", + "name": "rendering.desktop/second_batch_js_light" + }, + { + "duration": "12.82231373728814", + "name": "rendering.desktop/second_batch_js_medium" + }, + { + "duration": "18.736659033898306", + "name": "rendering.desktop/simple_text_page" + }, + { + "duration": "8.274178127118645", + "name": "rendering.desktop/simple_touch_drag" + }, + { + "duration": "22.080583491525424", + "name": "rendering.desktop/small_texture_uploads" + }, + { + "duration": "19.749534940298506", + "name": "rendering.desktop/smash_cat" + }, + { + "duration": "17.91654312686567", + "name": "rendering.desktop/spielzeugz" + }, + { + "duration": "17.344314253731344", + "name": "rendering.desktop/stroke_shapes" + }, + { + "duration": "7.106705296610167", + "name": "rendering.desktop/sync_scroll_offset" + }, + { + "duration": "41.077832582089556", + "name": "rendering.desktop/techcrunch" + }, + { + "duration": "19.550903935483877", + "name": "rendering.desktop/text_05000_pixels_per_second" + }, + { + "duration": "16.963722217741932", + "name": "rendering.desktop/text_10000_pixels_per_second" + }, + { + "duration": "16.55353704032258", + "name": "rendering.desktop/text_15000_pixels_per_second" + }, + { + "duration": "13.126007201612902", + "name": "rendering.desktop/text_20000_pixels_per_second" + }, + { + "duration": "10.507778064516135", + "name": "rendering.desktop/text_30000_pixels_per_second" + }, + { + "duration": "11.010823290322584", + "name": "rendering.desktop/text_40000_pixels_per_second" + }, + { + "duration": "9.397248330645159", + "name": "rendering.desktop/text_50000_pixels_per_second" + }, + { + "duration": "13.64603141935484", + "name": "rendering.desktop/text_60000_pixels_per_second" + }, + { + "duration": "10.576501798387099", + "name": "rendering.desktop/text_75000_pixels_per_second" + }, + { + "duration": "9.825719612903228", + "name": "rendering.desktop/text_90000_pixels_per_second" + }, + { + "duration": "18.285848516129033", + "name": "rendering.desktop/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "20.528896645161282", + "name": "rendering.desktop/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "15.786341508064522", + "name": "rendering.desktop/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "12.891561491935482", + "name": "rendering.desktop/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "13.150242564516132", + "name": "rendering.desktop/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "12.181126024193551", + "name": "rendering.desktop/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "12.215100645161286", + "name": "rendering.desktop/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "10.282548048387097", + "name": "rendering.desktop/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "10.230255790322582", + "name": "rendering.desktop/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "10.970899145161294", + "name": "rendering.desktop/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "20.35412932258064", + "name": "rendering.desktop/text_hover_05000_pixels_per_second" + }, + { + "duration": "17.10770621774194", + "name": "rendering.desktop/text_hover_10000_pixels_per_second" + }, + { + "duration": "17.326049572580647", + "name": "rendering.desktop/text_hover_15000_pixels_per_second" + }, + { + "duration": "17.3132999516129", + "name": "rendering.desktop/text_hover_20000_pixels_per_second" + }, + { + "duration": "11.731901024193554", + "name": "rendering.desktop/text_hover_30000_pixels_per_second" + }, + { + "duration": "12.727196080645161", + "name": "rendering.desktop/text_hover_40000_pixels_per_second" + }, + { + "duration": "12.133435330645161", + "name": "rendering.desktop/text_hover_50000_pixels_per_second" + }, + { + "duration": "12.242080790322584", + "name": "rendering.desktop/text_hover_60000_pixels_per_second" + }, + { + "duration": "10.256705798387095", + "name": "rendering.desktop/text_hover_75000_pixels_per_second" + }, + { + "duration": "10.411020758064511", + "name": "rendering.desktop/text_hover_90000_pixels_per_second" + }, + { + "duration": "17.474349627118645", + "name": "rendering.desktop/touch_handler_scrolling" + }, + { + "duration": "24.85471952238806", + "name": "rendering.desktop/transform_transitions" + }, + { + "duration": "23.740839373134325", + "name": "rendering.desktop/transform_transitions_js_block" + }, + { + "duration": "15.901544253731345", + "name": "rendering.desktop/twitter" + }, + { + "duration": "22.517163650793645", + "name": "rendering.desktop/twitter_pinch" + }, + { + "duration": "25.754113671641786", + "name": "rendering.desktop/weather.com" + }, + { + "duration": "28.862745523809526", + "name": "rendering.desktop/weather_pinch" + }, + { + "duration": "24.80329225373134", + "name": "rendering.desktop/web_animation_value_type_color" + }, + { + "duration": "22.558721835820897", + "name": "rendering.desktop/web_animation_value_type_length_3d" + }, + { + "duration": "24.037716925373136", + "name": "rendering.desktop/web_animation_value_type_length_complex" + }, + { + "duration": "25.2360288358209", + "name": "rendering.desktop/web_animation_value_type_length_simple" + }, + { + "duration": "25.15114741791045", + "name": "rendering.desktop/web_animation_value_type_path" + }, + { + "duration": "27.00127526865672", + "name": "rendering.desktop/web_animation_value_type_shadow" + }, + { + "duration": "25.97161565671642", + "name": "rendering.desktop/web_animation_value_type_transform_complex" + }, + { + "duration": "23.769677940298518", + "name": "rendering.desktop/web_animation_value_type_transform_simple" + }, + { + "duration": "24.00223482089552", + "name": "rendering.desktop/web_animations_many_keyframes" + }, + { + "duration": "22.009725134328352", + "name": "rendering.desktop/web_animations_set_current_time" + }, + { + "duration": "24.12459855223881", + "name": "rendering.desktop/web_animations_simultaneous" + }, + { + "duration": "26.48872080597014", + "name": "rendering.desktop/web_animations_staggered_chaining" + }, + { + "duration": "23.398568895522388", + "name": "rendering.desktop/web_animations_staggered_infinite_iterations" + }, + { + "duration": "23.91236410447762", + "name": "rendering.desktop/web_animations_staggered_triggering_page" + }, + { + "duration": "19.583916074626856", + "name": "rendering.desktop/wikipedia" + }, + { + "duration": "25.530206626865667", + "name": "rendering.desktop/wordpress" + }, + { + "duration": "14.129066910447762", + "name": "rendering.desktop/yahoo_answers" + }, + { + "duration": "30.342648507462687", + "name": "rendering.desktop/yahoo_games" + }, + { + "duration": "29.27623861904761", + "name": "rendering.desktop/yahoo_games_pinch" + }, + { + "duration": "22.006136186567158", + "name": "rendering.desktop/yahoo_news" + }, + { + "duration": "24.04535752380953", + "name": "rendering.desktop/yahoo_news_pinch" + }, + { + "duration": "25.698185865671647", + "name": "rendering.desktop/yahoo_sports" + }, + { + "duration": "51.192510661290314", + "name": "rendering.desktop/yahoo_sports_pinch" + }, + { + "duration": "23.06653179365079", + "name": "rendering.desktop/youtube_pinch" + }, + { + "duration": "19.61993046551724", + "name": "rendering.desktop/yuv_decoding" + }, + { + "duration": "15.985618506849315", + "name": "scheduler.tough_scheduling_cases/raf" + }, + { + "duration": "14.937646849315069", + "name": "scheduler.tough_scheduling_cases/raf_animation" + }, + { + "duration": "14.442984732876717", + "name": "scheduler.tough_scheduling_cases/raf_canvas" + }, + { + "duration": "17.103021130136984", + "name": "scheduler.tough_scheduling_cases/raf_touch_animation" + }, + { + "duration": "11.842825247945207", + "name": "scheduler.tough_scheduling_cases/second_batch_js_heavy" + }, + { + "duration": "12.093884039726028", + "name": "scheduler.tough_scheduling_cases/second_batch_js_light" + }, + { + "duration": "10.378937823287673", + "name": "scheduler.tough_scheduling_cases/second_batch_js_medium" + }, + { + "duration": "15.294895582191781", + "name": "scheduler.tough_scheduling_cases/simple_text_page" + }, + { + "duration": "7.732125693150686", + "name": "scheduler.tough_scheduling_cases/simple_touch_drag" + }, + { + "duration": "6.7473099301369865", + "name": "scheduler.tough_scheduling_cases/sync_scroll_offset" + }, + { + "duration": "14.034105972602736", + "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling" + }, + { + "duration": "15.620805595890406", + "name": "smoothness.desktop_tough_pinch_zoom_cases/amazon_pinch" + }, + { + "duration": "12.508736636986303", + "name": "smoothness.desktop_tough_pinch_zoom_cases/blogspot_pinch" + }, + { + "duration": "12.403586376712333", + "name": "smoothness.desktop_tough_pinch_zoom_cases/booking_pinch" + }, + { + "duration": "13.516477499999999", + "name": "smoothness.desktop_tough_pinch_zoom_cases/cnn_pinch" + }, + { + "duration": "14.73946375342466", + "name": "smoothness.desktop_tough_pinch_zoom_cases/ebay_pinch" + }, + { + "duration": "12.790500164383557", + "name": "smoothness.desktop_tough_pinch_zoom_cases/espn_pinch" + }, + { + "duration": "13.468336047945206", + "name": "smoothness.desktop_tough_pinch_zoom_cases/facebook_pinch" + }, + { + "duration": "16.865283", + "name": "smoothness.desktop_tough_pinch_zoom_cases/gmail_pinch" + }, + { + "duration": "16.54229441780822", + "name": "smoothness.desktop_tough_pinch_zoom_cases/google_calendar_pinch" + }, + { + "duration": "12.578945602739728", + "name": "smoothness.desktop_tough_pinch_zoom_cases/google_image_pinch" + }, + { + "duration": "14.374866739726027", + "name": "smoothness.desktop_tough_pinch_zoom_cases/google_search_pinch" + }, + { + "duration": "12.370353465753425", + "name": "smoothness.desktop_tough_pinch_zoom_cases/linkedin_pinch" + }, + { + "duration": "19.988088369863007", + "name": "smoothness.desktop_tough_pinch_zoom_cases/twitter_pinch" + }, + { + "duration": "14.766401787671239", + "name": "smoothness.desktop_tough_pinch_zoom_cases/weather_pinch" + }, + { + "duration": "18.223720609589048", + "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_games_pinch" + }, + { + "duration": "16.610033513698628", + "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_news_pinch" + }, + { + "duration": "15.976279575342467", + "name": "smoothness.desktop_tough_pinch_zoom_cases/yahoo_sports_pinch" + }, + { + "duration": "15.409834493150683", + "name": "smoothness.desktop_tough_pinch_zoom_cases/youtube_pinch" + }, + { + "duration": "19.25039023287671", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "28.72173991780822", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "19.17539410958904", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "17.370184849315066", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "13.809015171232875", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "13.983321684931505", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "12.980996780821918", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "13.689096794520546", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "11.773689883561644", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "9.743446447945209", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "8.904964267123287", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "8.7169216", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "12.173254546575343", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "8.421728115068492", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "13.46015660273973", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "13.33080647260274", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "10.276571273972603", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "10.41766473287671", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "8.208193321917806", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "9.986384336986305", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "8.396944947945201", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "12.122975197260276", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "8.906234634246577", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "8.05383658493151", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "16.709785376712325", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "15.991065863013695", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "10.714721061643838", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "12.042690465753427", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "10.750858917808213", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "8.096480230136988", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "9.991396146575342", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "9.581202809589042", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "7.398864143835617", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "8.809170417808218", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "13.078786561643833", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "13.360653849315069", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "10.293348212328766", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "10.404924479452056", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "8.246636595890408", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "8.676591712328763", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "9.69460228356164", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "11.823542454794516", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "9.276941660273966", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "8.226098426027397", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "19.54041439041096", + "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding" + }, + { + "duration": "17.27143334246576", + "name": "smoothness.image_decoding_cases/yuv_decoding" + }, + { + "duration": "16.314043232876713", + "name": "smoothness.key_desktop_move_cases/maps_move" + }, + { + "duration": "28.24766335616438", + "name": "smoothness.maps/maps_perf_test" + }, + { + "duration": "18.484065123287664", + "name": "smoothness.top_25_smooth/blogspot" + }, + { + "duration": "11.207659335616444", + "name": "smoothness.top_25_smooth/booking.com" + }, + { + "duration": "9.026013047945206", + "name": "smoothness.top_25_smooth/ebay" + }, + { + "duration": "12.83877454109589", + "name": "smoothness.top_25_smooth/espn" + }, + { + "duration": "11.099625924657534", + "name": "smoothness.top_25_smooth/facebook" + }, + { + "duration": "15.059020089041091", + "name": "smoothness.top_25_smooth/gmail" + }, + { + "duration": "14.97050699315068", + "name": "smoothness.top_25_smooth/google_calendar" + }, + { + "duration": "21.93044204109589", + "name": "smoothness.top_25_smooth/google_docs" + }, + { + "duration": "15.736408828767125", + "name": "smoothness.top_25_smooth/google_image_search" + }, + { + "duration": "17.374388623287675", + "name": "smoothness.top_25_smooth/google_plus" + }, + { + "duration": "9.278916034246578", + "name": "smoothness.top_25_smooth/google_web_search" + }, + { + "duration": "13.188028794520548", + "name": "smoothness.top_25_smooth/linkedin" + }, + { + "duration": "16.73115115753425", + "name": "smoothness.top_25_smooth/pinterest" + }, + { + "duration": "17.93485449315068", + "name": "smoothness.top_25_smooth/techcrunch" + }, + { + "duration": "15.119675739726018", + "name": "smoothness.top_25_smooth/twitter" + }, + { + "duration": "13.3670407739726", + "name": "smoothness.top_25_smooth/weather.com" + }, + { + "duration": "17.74449011643835", + "name": "smoothness.top_25_smooth/wikipedia" + }, + { + "duration": "14.692571760273971", + "name": "smoothness.top_25_smooth/wordpress" + }, + { + "duration": "11.616272486301368", + "name": "smoothness.top_25_smooth/yahoo_answers" + }, + { + "duration": "23.457156726027392", + "name": "smoothness.top_25_smooth/yahoo_games" + }, + { + "duration": "20.64155332876712", + "name": "smoothness.top_25_smooth/yahoo_news" + }, + { + "duration": "21.261323917808227", + "name": "smoothness.top_25_smooth/yahoo_sports" + }, + { + "duration": "18.52618280821918", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swiffy72.html" + }, + { + "duration": "17.732153383561645", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swiffy72.html" + }, + { + "duration": "18.2217648630137", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swiffy72.html" + }, + { + "duration": "17.715894013698637", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swiffy72.html" + }, + { + "duration": "21.241386671232874", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swiffy72.html" + }, + { + "duration": "17.718225479452048", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swiffy72.html" + }, + { + "duration": "21.35501490410959", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swiffy72.html" + }, + { + "duration": "18.721730849315065", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swiffy72.html" + }, + { + "duration": "19.886435726027393", + "name": "smoothness.tough_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swiffy72.html" + }, + { + "duration": "20.86196669863014", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swiffy72.html" + }, + { + "duration": "19.852980808219183", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swiffy72.html" + }, + { + "duration": "17.498506835616443", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations" + }, + { + "duration": "20.164956917808215", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations_composited_transform" + }, + { + "duration": "19.993394945205473", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties" + }, + { + "duration": "19.798016767123297", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties" + }, + { + "duration": "23.235349", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties" + }, + { + "duration": "19.355557123287667", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas" + }, + { + "duration": "17.56111745205479", + "name": "smoothness.tough_animation_cases/balls_javascript_css" + }, + { + "duration": "19.108917591549293", + "name": "smoothness.tough_animation_cases/balls_svg_animations" + }, + { + "duration": "17.29016287671232", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes" + }, + { + "duration": "17.13844620547945", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_inline_style" + }, + { + "duration": "17.551172246575337", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_new_element" + }, + { + "duration": "21.00632867123288", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_style_element" + }, + { + "duration": "20.99063234246576", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_updating_class" + }, + { + "duration": "17.79777612328767", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations" + }, + { + "duration": "19.540555753424655", + "name": "smoothness.tough_animation_cases/css_animations_staggered_inline_style" + }, + { + "duration": "20.121880534246582", + "name": "smoothness.tough_animation_cases/css_animations_staggered_new_element" + }, + { + "duration": "19.490715328767124", + "name": "smoothness.tough_animation_cases/css_animations_staggered_style_element" + }, + { + "duration": "19.548983178082196", + "name": "smoothness.tough_animation_cases/css_animations_staggered_updating_class" + }, + { + "duration": "22.52023684931507", + "name": "smoothness.tough_animation_cases/css_animations_triggered_inline_style" + }, + { + "duration": "21.19575176712329", + "name": "smoothness.tough_animation_cases/css_animations_triggered_new_element" + }, + { + "duration": "22.26645064383562", + "name": "smoothness.tough_animation_cases/css_animations_triggered_style_element" + }, + { + "duration": "20.798161109589042", + "name": "smoothness.tough_animation_cases/css_animations_triggered_updating_class" + }, + { + "duration": "20.62125495890411", + "name": "smoothness.tough_animation_cases/css_transitions_inline_style" + }, + { + "duration": "19.416163547945207", + "name": "smoothness.tough_animation_cases/css_transitions_new_element" + }, + { + "duration": "19.042267342465752", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_inline_style" + }, + { + "duration": "17.91841401369863", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_new_element" + }, + { + "duration": "17.404807191780822", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_style_element" + }, + { + "duration": "20.867830041095885", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_updating_class" + }, + { + "duration": "17.47179539726027", + "name": "smoothness.tough_animation_cases/css_transitions_style_element" + }, + { + "duration": "21.964384808219172", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_inline_style" + }, + { + "duration": "18.92529621917808", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_new_element" + }, + { + "duration": "19.20443080821918", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_style_element" + }, + { + "duration": "18.545258465753417", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_updating_class" + }, + { + "duration": "19.296294465753427", + "name": "smoothness.tough_animation_cases/css_transitions_updating_class" + }, + { + "duration": "17.65182749315068", + "name": "smoothness.tough_animation_cases/css_value_type_color" + }, + { + "duration": "20.80904667123288", + "name": "smoothness.tough_animation_cases/css_value_type_filter" + }, + { + "duration": "21.97118361643836", + "name": "smoothness.tough_animation_cases/css_value_type_length" + }, + { + "duration": "19.09872805479452", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex" + }, + { + "duration": "20.292643205479447", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple" + }, + { + "duration": "19.210497205479456", + "name": "smoothness.tough_animation_cases/css_value_type_path" + }, + { + "duration": "17.44162679452055", + "name": "smoothness.tough_animation_cases/css_value_type_shadow" + }, + { + "duration": "18.35319", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex" + }, + { + "duration": "19.333460164383567", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple" + }, + { + "duration": "19.00922030136986", + "name": "smoothness.tough_animation_cases/keyframed_animations" + }, + { + "duration": "17.69520550684932", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "20.036600616438356", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen" + }, + { + "duration": "25.16430769863014", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions_page" + }, + { + "duration": "20.1534382739726", + "name": "smoothness.tough_animation_cases/transform_transitions" + }, + { + "duration": "16.761293904109586", + "name": "smoothness.tough_animation_cases/transform_transitions_js_block" + }, + { + "duration": "17.96827528767124", + "name": "smoothness.tough_animation_cases/web_animation_value_type_color" + }, + { + "duration": "22.017368643835617", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_3d" + }, + { + "duration": "16.804350068493154", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_complex" + }, + { + "duration": "20.577859424657536", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_simple" + }, + { + "duration": "18.065531657534237", + "name": "smoothness.tough_animation_cases/web_animation_value_type_path" + }, + { + "duration": "18.643993534246576", + "name": "smoothness.tough_animation_cases/web_animation_value_type_shadow" + }, + { + "duration": "18.71122136986301", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_complex" + }, + { + "duration": "16.67253719178082", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_simple" + }, + { + "duration": "18.99194038356164", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes" + }, + { + "duration": "17.691931534246574", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time" + }, + { + "duration": "21.43276443835617", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous" + }, + { + "duration": "21.56992776712329", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining" + }, + { + "duration": "22.639225821917815", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations" + }, + { + "duration": "22.00179778082192", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering_page" + }, + { + "duration": "15.179979842465755", + "name": "smoothness.tough_canvas_cases/bouncing_balls_15" + }, + { + "duration": "13.69123910273972", + "name": "smoothness.tough_canvas_cases/bouncing_balls_shadow" + }, + { + "duration": "13.719774383561644", + "name": "smoothness.tough_canvas_cases/bouncing_clipped_rectangles" + }, + { + "duration": "13.969427746575342", + "name": "smoothness.tough_canvas_cases/bouncing_gradient_circles" + }, + { + "duration": "11.075461116438358", + "name": "smoothness.tough_canvas_cases/bouncing_png_images" + }, + { + "duration": "21.593373575342465", + "name": "smoothness.tough_canvas_cases/bouncing_svg_images" + }, + { + "duration": "16.14170227397261", + "name": "smoothness.tough_canvas_cases/canvas_animation_no_clear" + }, + { + "duration": "13.067293294520548", + "name": "smoothness.tough_canvas_cases/canvas_arcs" + }, + { + "duration": "14.021752835616436", + "name": "smoothness.tough_canvas_cases/canvas_font_cycler" + }, + { + "duration": "12.583570452054799", + "name": "smoothness.tough_canvas_cases/canvas_lines" + }, + { + "duration": "11.448396746575343", + "name": "smoothness.tough_canvas_cases/canvas_to_blob" + }, + { + "duration": "11.75445212328767", + "name": "smoothness.tough_canvas_cases/chip_tune" + }, + { + "duration": "13.210731739726029", + "name": "smoothness.tough_canvas_cases/crafty_mind" + }, + { + "duration": "12.751474479452055", + "name": "smoothness.tough_canvas_cases/effect_games" + }, + { + "duration": "15.118380952054796", + "name": "smoothness.tough_canvas_cases/fill_shapes" + }, + { + "duration": "13.552988349315063", + "name": "smoothness.tough_canvas_cases/geo_apis" + }, + { + "duration": "11.794617815068493", + "name": "smoothness.tough_canvas_cases/hakim" + }, + { + "duration": "13.118308719178081", + "name": "smoothness.tough_canvas_cases/jarro_doverson" + }, + { + "duration": "12.496935828767125", + "name": "smoothness.tough_canvas_cases/kevs_3d" + }, + { + "duration": "12.215102739726028", + "name": "smoothness.tough_canvas_cases/man_in_blue" + }, + { + "duration": "14.337996287671237", + "name": "smoothness.tough_canvas_cases/many_images" + }, + { + "duration": "13.258885335616437", + "name": "smoothness.tough_canvas_cases/megi_dish" + }, + { + "duration": "13.891591589041095", + "name": "smoothness.tough_canvas_cases/microsoft_asteroid_belt" + }, + { + "duration": "16.269696191780824", + "name": "smoothness.tough_canvas_cases/microsoft_fish_ie_tank" + }, + { + "duration": "12.69691223972603", + "name": "smoothness.tough_canvas_cases/microsoft_snow" + }, + { + "duration": "14.548914780821919", + "name": "smoothness.tough_canvas_cases/microsoft_speed_reading" + }, + { + "duration": "15.414335417808218", + "name": "smoothness.tough_canvas_cases/microsoft_tweet_map" + }, + { + "duration": "14.85258497945205", + "name": "smoothness.tough_canvas_cases/microsoft_video_city" + }, + { + "duration": "11.524330342465754", + "name": "smoothness.tough_canvas_cases/microsoft_worker_fountains" + }, + { + "duration": "13.164825472602736", + "name": "smoothness.tough_canvas_cases/mix_10k" + }, + { + "duration": "11.96618197260274", + "name": "smoothness.tough_canvas_cases/put_get_image_data" + }, + { + "duration": "11.601486335616435", + "name": "smoothness.tough_canvas_cases/runway" + }, + { + "duration": "13.603335178082192", + "name": "smoothness.tough_canvas_cases/smash_cat" + }, + { + "duration": "15.659002547945205", + "name": "smoothness.tough_canvas_cases/spielzeugz" + }, + { + "duration": "13.344602881944446", + "name": "smoothness.tough_canvas_cases/stroke_shapes" + }, + { + "duration": "18.405259356164382", + "name": "smoothness.tough_filters_cases/analog_clock_svg" + }, + { + "duration": "18.014576561643835", + "name": "smoothness.tough_filters_cases/filter_terrain_svg" + }, + { + "duration": "20.07298971232877", + "name": "smoothness.tough_filters_cases/ie_pirate_mark" + }, + { + "duration": "23.397180972602737", + "name": "smoothness.tough_filters_cases/motion_mark_focus" + }, + { + "duration": "9.268259288235297", + "name": "smoothness.tough_image_decode_cases/cats_unscaled" + }, + { + "duration": "6.165992505882351", + "name": "smoothness.tough_image_decode_cases/cats_viewport_width" + }, + { + "duration": "7.61652866", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-unscaled.html" + }, + { + "duration": "6.1178912", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-viewport-width.html" + }, + { + "duration": "17.228463356164383", + "name": "smoothness.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "30.354970917808227", + "name": "smoothness.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "17.530782178082195", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "18.27555121917808", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "15.154242410958908", + "name": "smoothness.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "15.965371404109588", + "name": "smoothness.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "11.161083993150683", + "name": "smoothness.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "9.717753123287672", + "name": "smoothness.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "9.845528636986298", + "name": "smoothness.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "8.577294843835617", + "name": "smoothness.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "7.7566390027397265", + "name": "smoothness.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "7.579983453424657", + "name": "smoothness.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "10.386237168493153", + "name": "smoothness.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "7.257675987671235", + "name": "smoothness.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "13.527562198630134", + "name": "smoothness.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "12.359944739726027", + "name": "smoothness.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "10.748867890410963", + "name": "smoothness.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "9.254257075342464", + "name": "smoothness.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "11.188400993150685", + "name": "smoothness.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "9.870649034246576", + "name": "smoothness.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "7.403490634246576", + "name": "smoothness.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "7.165395932876713", + "name": "smoothness.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "8.165633802739725", + "name": "smoothness.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "7.807332958904112", + "name": "smoothness.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "13.632178547945204", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "14.88159942465753", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "13.401691808219171", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "11.687085671232877", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "10.257323034246577", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "9.221758375342466", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "11.296392120547944", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "8.0667606369863", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "7.599711469863014", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "7.259324486301368", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "15.043986678082192", + "name": "smoothness.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "14.649457815068498", + "name": "smoothness.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "11.65167691780822", + "name": "smoothness.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "12.999451705479455", + "name": "smoothness.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "9.432989472602742", + "name": "smoothness.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "8.818601760273973", + "name": "smoothness.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "10.033440469863011", + "name": "smoothness.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "7.1920083452054815", + "name": "smoothness.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "8.642500286301367", + "name": "smoothness.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "8.579043626027397", + "name": "smoothness.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "18.58421148611111", + "name": "smoothness.tough_texture_upload_cases/background_color_animation" + }, + { + "duration": "17.63941", + "name": "smoothness.tough_texture_upload_cases/background_color_animation.html" + }, + { + "duration": "22.597990375000006", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient" + }, + { + "duration": "19.604694", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient.html" + }, + { + "duration": "18.683746999999997", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads" + }, + { + "duration": "17.578182", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads.html" + }, + { + "duration": "19.44157794444445", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads" + }, + { + "duration": "17.164251", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads.html" + }, + { + "duration": "18.247597611111104", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads" + }, + { + "duration": "17.051828", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads.html" + }, + { + "duration": "19.444590888888897", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads" + }, + { + "duration": "16.956322", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads.html" + }, + { + "duration": "18.17762246575342", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swf.webglbeta.html" + }, + { + "duration": "18.720486767123287", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swf.webglbeta.html" + }, + { + "duration": "18.734950945205476", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swf.webglbeta.html" + }, + { + "duration": "17.710286589041097", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swf.webglbeta.html" + }, + { + "duration": "18.73524328767124", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swf.webglbeta.html" + }, + { + "duration": "19.108536328767126", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swf.webglbeta.html" + }, + { + "duration": "18.942720328767123", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swf.webglbeta.html" + }, + { + "duration": "21.736767027397264", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swf.webglbeta.html" + }, + { + "duration": "17.71880806849315", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swf.webglbeta.html" + }, + { + "duration": "19.879191849315074", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swf.webglbeta.html" + }, + { + "duration": "20.88997679452055", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swf.webglbeta.html" + }, + { + "duration": "21.525679458904097", + "name": "smoothness.tough_webgl_cases/animometer_webgl" + }, + { + "duration": "17.374263253424655", + "name": "smoothness.tough_webgl_cases/aquarium" + }, + { + "duration": "18.492769109589034", + "name": "smoothness.tough_webgl_cases/aquarium_20k" + }, + { + "duration": "17.22617716438356", + "name": "smoothness.tough_webgl_cases/blob" + }, + { + "duration": "15.889114506849316", + "name": "smoothness.tough_webgl_cases/dynamic_cube_map" + }, + { + "duration": "15.15303147260274", + "name": "smoothness.tough_webgl_cases/earth" + }, + { + "duration": "14.329694547945206", + "name": "smoothness.tough_webgl_cases/many_planets_deep" + }, + { + "duration": "17.652159520547944", + "name": "smoothness.tough_webgl_cases/nvidia_vertex_buffer_object" + }, + { + "duration": "15.82272856164384", + "name": "smoothness.tough_webgl_cases/particles" + }, + { + "duration": "14.349852493150683", + "name": "smoothness.tough_webgl_cases/san_angeles" + }, + { + "duration": "38.47897528767123", + "name": "speedometer-future/http://browserbench.org/Speedometer/" + }, + { + "duration": "37.57165004109588", + "name": "speedometer/http://browserbench.org/Speedometer/" + }, + { + "duration": "78.36980279452055", + "name": "speedometer2-future/Speedometer2" + }, + { + "duration": "76.73593767123288", + "name": "speedometer2/Speedometer2" + }, + { + "duration": "69.34050180555558", + "name": "system_health.common_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "93.76798767123287", + "name": "system_health.common_desktop/browse:media:imgur" + }, + { + "duration": "69.27903081944443", + "name": "system_health.common_desktop/browse:media:pinterest" + }, + { + "duration": "73.260524875", + "name": "system_health.common_desktop/browse:media:youtube" + }, + { + "duration": "52.06577428767123", + "name": "system_health.common_desktop/browse:news:flipboard" + }, + { + "duration": "72.38396320833334", + "name": "system_health.common_desktop/browse:news:nytimes" + }, + { + "duration": "57.55161048611113", + "name": "system_health.common_desktop/browse:news:reddit" + }, + { + "duration": "50.47894858904111", + "name": "system_health.common_desktop/browse:search:google" + }, + { + "duration": "38.58408119178081", + "name": "system_health.common_desktop/browse:search:google_india" + }, + { + "duration": "66.96221878082194", + "name": "system_health.common_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "77.20290166666666", + "name": "system_health.common_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "48.305157529411765", + "name": "system_health.common_desktop/browse:social:twitter" + }, + { + "duration": "74.14317761111111", + "name": "system_health.common_desktop/browse:social:twitter_infinite_scroll" + }, + { + "duration": "69.04346332876712", + "name": "system_health.common_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "63.45872945205482", + "name": "system_health.common_desktop/browse:tools:earth" + }, + { + "duration": "22.339546109589048", + "name": "system_health.common_desktop/browse_accessibility:tech:codesearch" + }, + { + "duration": "17.505816164383557", + "name": "system_health.common_desktop/load:chrome:blank" + }, + { + "duration": "20.843600273972605", + "name": "system_health.common_desktop/load:games:alphabetty" + }, + { + "duration": "21.064450616438354", + "name": "system_health.common_desktop/load:games:bubbles" + }, + { + "duration": "19.136390777777777", + "name": "system_health.common_desktop/load:games:lazors" + }, + { + "duration": "23.20395370833333", + "name": "system_health.common_desktop/load:games:miniclip" + }, + { + "duration": "29.583901972222222", + "name": "system_health.common_desktop/load:games:spychase" + }, + { + "duration": "31.44212773972603", + "name": "system_health.common_desktop/load:media:9gag" + }, + { + "duration": "20.2060014109589", + "name": "system_health.common_desktop/load:media:dailymotion" + }, + { + "duration": "20.65618183333333", + "name": "system_health.common_desktop/load:media:google_images" + }, + { + "duration": "25.25843876388889", + "name": "system_health.common_desktop/load:media:imgur" + }, + { + "duration": "25.738030874999993", + "name": "system_health.common_desktop/load:media:soundcloud" + }, + { + "duration": "23.419813736111106", + "name": "system_health.common_desktop/load:media:youtube" + }, + { + "duration": "23.118470753424656", + "name": "system_health.common_desktop/load:news:bbc" + }, + { + "duration": "25.39283820547945", + "name": "system_health.common_desktop/load:news:cnn" + }, + { + "duration": "19.633756930555553", + "name": "system_health.common_desktop/load:news:flipboard" + }, + { + "duration": "18.01251175", + "name": "system_health.common_desktop/load:news:hackernews" + }, + { + "duration": "22.893915722222218", + "name": "system_health.common_desktop/load:news:nytimes" + }, + { + "duration": "26.783083458333337", + "name": "system_health.common_desktop/load:news:qq" + }, + { + "duration": "18.904982541666676", + "name": "system_health.common_desktop/load:news:reddit" + }, + { + "duration": "20.247278625000007", + "name": "system_health.common_desktop/load:news:wikipedia" + }, + { + "duration": "21.06683317808219", + "name": "system_health.common_desktop/load:search:amazon" + }, + { + "duration": "23.85269801369862", + "name": "system_health.common_desktop/load:search:baidu" + }, + { + "duration": "21.79381754166666", + "name": "system_health.common_desktop/load:search:ebay" + }, + { + "duration": "18.55551956944445", + "name": "system_health.common_desktop/load:search:google" + }, + { + "duration": "23.659109361111106", + "name": "system_health.common_desktop/load:search:taobao" + }, + { + "duration": "19.00629723611111", + "name": "system_health.common_desktop/load:search:yahoo" + }, + { + "duration": "18.15183669444444", + "name": "system_health.common_desktop/load:search:yandex" + }, + { + "duration": "20.629509958333337", + "name": "system_health.common_desktop/load:social:instagram" + }, + { + "duration": "23.32825672222222", + "name": "system_health.common_desktop/load:social:pinterest" + }, + { + "duration": "19.775715722222216", + "name": "system_health.common_desktop/load:social:vk" + }, + { + "duration": "29.95386687671233", + "name": "system_health.common_desktop/load:tools:docs" + }, + { + "duration": "29.654869875", + "name": "system_health.common_desktop/load:tools:drive" + }, + { + "duration": "22.07794720833333", + "name": "system_health.common_desktop/load:tools:dropbox" + }, + { + "duration": "25.59759145833334", + "name": "system_health.common_desktop/load:tools:gmail" + }, + { + "duration": "19.46394273611111", + "name": "system_health.common_desktop/load:tools:stackoverflow" + }, + { + "duration": "24.35875713888889", + "name": "system_health.common_desktop/load:tools:weather" + }, + { + "duration": "20.149916150684934", + "name": "system_health.common_desktop/load_accessibility:media:wikipedia" + }, + { + "duration": "21.882727191780823", + "name": "system_health.common_desktop/load_accessibility:shopping:amazon" + }, + { + "duration": "134.80394847222226", + "name": "system_health.common_desktop/long_running:tools:gmail-background" + }, + { + "duration": "132.64207625000003", + "name": "system_health.common_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "48.76794620833335", + "name": "system_health.common_desktop/play:media:soundcloud" + }, + { + "duration": "185.80219331428563", + "name": "system_health.memory_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "215.7146929863013", + "name": "system_health.memory_desktop/browse:media:imgur" + }, + { + "duration": "193.13559024999995", + "name": "system_health.memory_desktop/browse:media:pinterest" + }, + { + "duration": "178.59057495714296", + "name": "system_health.memory_desktop/browse:media:tumblr" + }, + { + "duration": "187.204380625", + "name": "system_health.memory_desktop/browse:media:youtube" + }, + { + "duration": "137.47706461643838", + "name": "system_health.memory_desktop/browse:news:flipboard" + }, + { + "duration": "152.89185762499997", + "name": "system_health.memory_desktop/browse:news:nytimes" + }, + { + "duration": "155.79519658333336", + "name": "system_health.memory_desktop/browse:news:reddit" + }, + { + "duration": "146.399033630137", + "name": "system_health.memory_desktop/browse:search:google" + }, + { + "duration": "112.70699720547944", + "name": "system_health.memory_desktop/browse:search:google_india" + }, + { + "duration": "185.70944961643835", + "name": "system_health.memory_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "189.96085134722227", + "name": "system_health.memory_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "133.55173651470594", + "name": "system_health.memory_desktop/browse:social:twitter" + }, + { + "duration": "181.4047127260274", + "name": "system_health.memory_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "157.6207351805556", + "name": "system_health.memory_desktop/browse:tools:earth" + }, + { + "duration": "61.63939647945207", + "name": "system_health.memory_desktop/browse_accessibility:tech:codesearch" + }, + { + "duration": "52.88427282191783", + "name": "system_health.memory_desktop/load:chrome:blank" + }, + { + "duration": "54.595721712328775", + "name": "system_health.memory_desktop/load:games:alphabetty" + }, + { + "duration": "59.90283964383561", + "name": "system_health.memory_desktop/load:games:bubbles" + }, + { + "duration": "55.77841325000001", + "name": "system_health.memory_desktop/load:games:lazors" + }, + { + "duration": "79.68772651388889", + "name": "system_health.memory_desktop/load:games:spychase" + }, + { + "duration": "75.01118064383562", + "name": "system_health.memory_desktop/load:media:9gag" + }, + { + "duration": "59.107485520547954", + "name": "system_health.memory_desktop/load:media:dailymotion" + }, + { + "duration": "55.10195708333333", + "name": "system_health.memory_desktop/load:media:google_images" + }, + { + "duration": "64.77413752777778", + "name": "system_health.memory_desktop/load:media:imgur" + }, + { + "duration": "61.41981463888889", + "name": "system_health.memory_desktop/load:media:soundcloud" + }, + { + "duration": "61.10776193055554", + "name": "system_health.memory_desktop/load:media:youtube" + }, + { + "duration": "58.46220026027395", + "name": "system_health.memory_desktop/load:news:bbc" + }, + { + "duration": "66.949968369863", + "name": "system_health.memory_desktop/load:news:cnn" + }, + { + "duration": "56.81215059722221", + "name": "system_health.memory_desktop/load:news:flipboard" + }, + { + "duration": "50.20194797222222", + "name": "system_health.memory_desktop/load:news:hackernews" + }, + { + "duration": "58.035780416666675", + "name": "system_health.memory_desktop/load:news:nytimes" + }, + { + "duration": "63.084513750000006", + "name": "system_health.memory_desktop/load:news:qq" + }, + { + "duration": "52.98420123611109", + "name": "system_health.memory_desktop/load:news:reddit" + }, + { + "duration": "61.11708379166665", + "name": "system_health.memory_desktop/load:news:wikipedia" + }, + { + "duration": "59.132972643835636", + "name": "system_health.memory_desktop/load:search:amazon" + }, + { + "duration": "55.88787584931507", + "name": "system_health.memory_desktop/load:search:baidu" + }, + { + "duration": "58.644579375", + "name": "system_health.memory_desktop/load:search:ebay" + }, + { + "duration": "51.156243861111115", + "name": "system_health.memory_desktop/load:search:google" + }, + { + "duration": "63.94547284722221", + "name": "system_health.memory_desktop/load:search:taobao" + }, + { + "duration": "54.106676458333325", + "name": "system_health.memory_desktop/load:search:yahoo" + }, + { + "duration": "55.00452163888889", + "name": "system_health.memory_desktop/load:search:yandex" + }, + { + "duration": "58.978531833333335", + "name": "system_health.memory_desktop/load:social:instagram" + }, + { + "duration": "60.75821354166666", + "name": "system_health.memory_desktop/load:social:pinterest" + }, + { + "duration": "55.31784262500001", + "name": "system_health.memory_desktop/load:social:vk" + }, + { + "duration": "66.56340610958902", + "name": "system_health.memory_desktop/load:tools:docs" + }, + { + "duration": "68.41478441666669", + "name": "system_health.memory_desktop/load:tools:drive" + }, + { + "duration": "56.68383001388888", + "name": "system_health.memory_desktop/load:tools:dropbox" + }, + { + "duration": "67.34051461111113", + "name": "system_health.memory_desktop/load:tools:gmail" + }, + { + "duration": "56.79476643055556", + "name": "system_health.memory_desktop/load:tools:stackoverflow" + }, + { + "duration": "63.96385234722223", + "name": "system_health.memory_desktop/load:tools:weather" + }, + { + "duration": "58.13311245205476", + "name": "system_health.memory_desktop/load_accessibility:media:wikipedia" + }, + { + "duration": "61.068566575342466", + "name": "system_health.memory_desktop/load_accessibility:shopping:amazon" + }, + { + "duration": "487.55009194444443", + "name": "system_health.memory_desktop/long_running:tools:gmail-background" + }, + { + "duration": "476.2796013888889", + "name": "system_health.memory_desktop/long_running:tools:gmail-foreground" + }, + { + "duration": "133.13049214285718", + "name": "system_health.memory_desktop/play:media:soundcloud" + }, + { + "duration": "23.451595945205483", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/beqojupo/1/quiet?JS_FULL_SCREEN_INVALIDATION" + }, + { + "duration": "27.192552356164388", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/covoqi/1/quiet?NEW_TILINGS" + }, + { + "duration": "22.65394341095891", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/falefice/1/quiet?CC_POSTER_CIRCLE" + }, + { + "duration": "24.450542835616428", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/giqafofe/1/quiet?JS_POSTER_CIRCLE" + }, + { + "duration": "20.72141745205479", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/jevibahi/4/quiet?JS_SCROLL_200_LAYER_GRID" + }, + { + "duration": "14.469634280821918", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/pixavefe/1/quiet?CC_SCROLL_TEXT_ONLY" + }, + { + "duration": "20.63733387671232", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/wixadinu/2/quiet?JS_SCROLL_TEXT_ONLY" + }, + { + "duration": "20.86242389041095", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/yakagevo/1/quiet?CC_SCROLL_200_LAYER_GRID" + }, + { + "duration": "15.445837047945204", + "name": "thread_times.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "15.732960246575344", + "name": "thread_times.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "14.183141931506846", + "name": "thread_times.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "12.212735582191785", + "name": "thread_times.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "10.401445479452056", + "name": "thread_times.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "10.899599253424658", + "name": "thread_times.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "9.838147979452051", + "name": "thread_times.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "10.616491079452057", + "name": "thread_times.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "9.465796390410958", + "name": "thread_times.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "8.808804863013698", + "name": "thread_times.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "17.571111520547944", + "name": "thread_times.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "16.752115671232875", + "name": "thread_times.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "13.430715986301367", + "name": "thread_times.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "11.712758000000001", + "name": "thread_times.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "12.12791415753425", + "name": "thread_times.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "9.168106102739728", + "name": "thread_times.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "11.82966038493151", + "name": "thread_times.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "9.203738323287668", + "name": "thread_times.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "7.293322787671235", + "name": "thread_times.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "7.227781365753423", + "name": "thread_times.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "16.892435273972605", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "18.49081350684931", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "13.50925708219178", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "12.166828869863016", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "13.473389760273973", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "12.741055356164384", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "9.066518582191781", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "11.922067102739724", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "11.597128012328763", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "12.204507617808215", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "15.567539815068498", + "name": "thread_times.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "14.217616260273967", + "name": "thread_times.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "16.43162201369863", + "name": "thread_times.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "10.088974363013698", + "name": "thread_times.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "9.352262397260276", + "name": "thread_times.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "8.191344587671233", + "name": "thread_times.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "11.900450480821915", + "name": "thread_times.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "8.751869160273973", + "name": "thread_times.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "9.62579818630137", + "name": "thread_times.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "7.209824753424658", + "name": "thread_times.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "9.26413833287671", + "name": "tracing.tracing_with_background_memory_infra/Facebook" + }, + { + "duration": "11.155407232876708", + "name": "tracing.tracing_with_background_memory_infra/Wikipedia" + }, + { + "duration": "8.262333816438353", + "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" + }, + { + "duration": "8.564078598630141", + "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" + }, + { + "duration": "10.739383032876715", + "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" + }, + { + "duration": "9.633146735616437", + "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" + }, + { + "duration": "9.67670566438356", + "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" + }, + { + "duration": "8.346547150684929", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "11.202741383561644", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" + }, + { + "duration": "76.21038683561645", + "name": "v8.browsing_desktop-future/browse:media:flickr_infinite_scroll" + }, + { + "duration": "230.36743246575338", + "name": "v8.browsing_desktop-future/browse:media:imgur" + }, + { + "duration": "78.97338695833334", + "name": "v8.browsing_desktop-future/browse:media:pinterest" + }, + { + "duration": "79.66654465277779", + "name": "v8.browsing_desktop-future/browse:media:tumblr" + }, + { + "duration": "90.79296933333337", + "name": "v8.browsing_desktop-future/browse:media:youtube" + }, + { + "duration": "105.8635319041096", + "name": "v8.browsing_desktop-future/browse:news:nytimes" + }, + { + "duration": "62.360663777777795", + "name": "v8.browsing_desktop-future/browse:news:reddit" + }, + { + "duration": "55.27395361643836", + "name": "v8.browsing_desktop-future/browse:search:google" + }, + { + "duration": "41.0872964520548", + "name": "v8.browsing_desktop-future/browse:search:google_india" + }, + { + "duration": "84.2196948082192", + "name": "v8.browsing_desktop-future/browse:social:facebook_infinite_scroll" + }, + { + "duration": "89.79446818055555", + "name": "v8.browsing_desktop-future/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "53.938408617647056", + "name": "v8.browsing_desktop-future/browse:social:twitter" + }, + { + "duration": "89.26578229166665", + "name": "v8.browsing_desktop-future/browse:social:twitter_infinite_scroll" + }, + { + "duration": "87.77256469863013", + "name": "v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "81.49074573972602", + "name": "v8.browsing_desktop-future/browse:tools:earth" + }, + { + "duration": "76.14261578082191", + "name": "v8.browsing_desktop/browse:media:flickr_infinite_scroll" + }, + { + "duration": "236.76272904109592", + "name": "v8.browsing_desktop/browse:media:imgur" + }, + { + "duration": "79.43770286111109", + "name": "v8.browsing_desktop/browse:media:pinterest" + }, + { + "duration": "79.35654497183101", + "name": "v8.browsing_desktop/browse:media:tumblr" + }, + { + "duration": "93.67745129166666", + "name": "v8.browsing_desktop/browse:media:youtube" + }, + { + "duration": "104.42180135616437", + "name": "v8.browsing_desktop/browse:news:nytimes" + }, + { + "duration": "63.23690854166667", + "name": "v8.browsing_desktop/browse:news:reddit" + }, + { + "duration": "54.13783615068493", + "name": "v8.browsing_desktop/browse:search:google" + }, + { + "duration": "41.02245257534248", + "name": "v8.browsing_desktop/browse:search:google_india" + }, + { + "duration": "82.42677384931507", + "name": "v8.browsing_desktop/browse:social:facebook_infinite_scroll" + }, + { + "duration": "87.79610133333337", + "name": "v8.browsing_desktop/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "56.54388275", + "name": "v8.browsing_desktop/browse:social:twitter" + }, + { + "duration": "88.48854490277778", + "name": "v8.browsing_desktop/browse:social:twitter_infinite_scroll" + }, + { + "duration": "86.03782353424654", + "name": "v8.browsing_desktop/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "80.48632424657538", + "name": "v8.browsing_desktop/browse:tools:earth" + }, + { + "duration": "97.44461675925926", + "name": "v8.runtime_stats.top_25/AdsAMPAds" + }, + { + "duration": "29.267572473684208", + "name": "v8.runtime_stats.top_25/AdsAMPAds_cold" + }, + { + "duration": "34.6511557368421", + "name": "v8.runtime_stats.top_25/AdsAMPAds_hot" + }, + { + "duration": "32.0368394736842", + "name": "v8.runtime_stats.top_25/AdsAMPAds_warm" + }, + { + "duration": "96.57568972222225", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds" + }, + { + "duration": "29.009471578947366", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_cold" + }, + { + "duration": "36.215973947368425", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_hot" + }, + { + "duration": "31.662197842105265", + "name": "v8.runtime_stats.top_25/AdsAdSenseAsyncAds_warm" + }, + { + "duration": "94.02323725925929", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage" + }, + { + "duration": "28.184388315789473", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_cold" + }, + { + "duration": "33.054997842105266", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_hot" + }, + { + "duration": "30.5743672631579", + "name": "v8.runtime_stats.top_25/AdsAsyncAdSenseImage_warm" + }, + { + "duration": "99.41455674074075", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds" + }, + { + "duration": "28.917874894736848", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_cold" + }, + { + "duration": "34.29731884210526", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_hot" + }, + { + "duration": "31.609223842105262", + "name": "v8.runtime_stats.top_25/AdsDoubleClickAsyncAds_warm" + }, + { + "duration": "94.68574355555555", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots" + }, + { + "duration": "28.50237994736842", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_cold" + }, + { + "duration": "33.53731526315789", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_hot" + }, + { + "duration": "31.01728936842105", + "name": "v8.runtime_stats.top_25/AdsMultipleAdSlots_warm" + }, + { + "duration": "94.45871933333336", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection" + }, + { + "duration": "28.403662631578946", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_cold" + }, + { + "duration": "33.56843547368421", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_hot" + }, + { + "duration": "30.91538126315789", + "name": "v8.runtime_stats.top_25/AdsOnScreenDetection_warm" + }, + { + "duration": "96.15036057407407", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage" + }, + { + "duration": "29.03299442105263", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_cold" + }, + { + "duration": "34.16445321052632", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_hot" + }, + { + "duration": "35.792547684210525", + "name": "v8.runtime_stats.top_25/AdsSyncAdSenseImage_warm" + }, + { + "duration": "92.99409540740743", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage" + }, + { + "duration": "28.445429999999998", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_cold" + }, + { + "duration": "33.457543", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_hot" + }, + { + "duration": "31.026918789473683", + "name": "v8.runtime_stats.top_25/AdsSyncLoadAsyncRenderAdSenseImage_warm" + }, + { + "duration": "145.19326024074073", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering" + }, + { + "duration": "37.71213142105264", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_cold" + }, + { + "duration": "64.42161884210526", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_hot" + }, + { + "duration": "48.38575757894737", + "name": "v8.runtime_stats.top_25/AdsViewOptimizedRendering_warm" + }, + { + "duration": "115.12607012962962", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com" + }, + { + "duration": "32.350507052631585", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_cold" + }, + { + "duration": "40.952788631578954", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_hot" + }, + { + "duration": "36.93840094736842", + "name": "v8.runtime_stats.top_25/http://edition.cnn.com_warm" + }, + { + "duration": "97.45163540740742", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0" + }, + { + "duration": "29.10016994736842", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_cold" + }, + { + "duration": "34.86480868421052", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_hot" + }, + { + "duration": "32.10901821052632", + "name": "v8.runtime_stats.top_25/http://hi.wikipedia.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0_warm" + }, + { + "duration": "98.00556133333333", + "name": "v8.runtime_stats.top_25/http://inbox.google.com" + }, + { + "duration": "29.615338842105267", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_cold" + }, + { + "duration": "35.61687010526316", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_hot" + }, + { + "duration": "32.69217621052631", + "name": "v8.runtime_stats.top_25/http://inbox.google.com_warm" + }, + { + "duration": "99.59791559259256", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo" + }, + { + "duration": "29.751567473684208", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_cold" + }, + { + "duration": "35.51616805263158", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_hot" + }, + { + "duration": "32.6305885263158", + "name": "v8.runtime_stats.top_25/http://maps.google.co.jp/maps/search/restaurant+tokyo_warm" + }, + { + "duration": "103.1903537962963", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org" + }, + { + "duration": "29.797558052631576", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_cold" + }, + { + "duration": "35.7810947368421", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_hot" + }, + { + "duration": "34.981471052631576", + "name": "v8.runtime_stats.top_25/http://meta.discourse.org_warm" + }, + { + "duration": "92.62132640740741", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular" + }, + { + "duration": "28.565621210526317", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_cold" + }, + { + "duration": "33.32486105263158", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_hot" + }, + { + "duration": "30.86898042105263", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?angular_warm" + }, + { + "duration": "93.51758583333331", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone" + }, + { + "duration": "32.6202002631579", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_cold" + }, + { + "duration": "33.21410621052632", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_hot" + }, + { + "duration": "30.635655842105262", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?backbone_warm" + }, + { + "duration": "93.20506703703707", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember" + }, + { + "duration": "28.43123742105263", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_cold" + }, + { + "duration": "33.853000421052634", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_hot" + }, + { + "duration": "31.030877263157898", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?ember_warm" + }, + { + "duration": "93.72250838888887", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery" + }, + { + "duration": "28.185416052631574", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_cold" + }, + { + "duration": "33.4274707368421", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_hot" + }, + { + "duration": "30.77939963157895", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?jquery_warm" + }, + { + "duration": "96.11384249999999", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla" + }, + { + "duration": "28.05969321052632", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_cold" + }, + { + "duration": "32.98529136842105", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_hot" + }, + { + "duration": "30.460573263157897", + "name": "v8.runtime_stats.top_25/http://pollouer.muc/Speedometer/CustomRunner.html?vanilla_warm" + }, + { + "duration": "99.56703835185188", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io" + }, + { + "duration": "33.98408468421053", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_cold" + }, + { + "duration": "35.16003331578948", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_hot" + }, + { + "duration": "32.530788421052634", + "name": "v8.runtime_stats.top_25/http://reddit.musicplayer.io_warm" + }, + { + "duration": "100.1175709259259", + "name": "v8.runtime_stats.top_25/http://weibo.com" + }, + { + "duration": "30.24600652631579", + "name": "v8.runtime_stats.top_25/http://weibo.com_cold" + }, + { + "duration": "45.211986947368416", + "name": "v8.runtime_stats.top_25/http://weibo.com_hot" + }, + { + "duration": "33.14649989473684", + "name": "v8.runtime_stats.top_25/http://weibo.com_warm" + }, + { + "duration": "100.09074233333334", + "name": "v8.runtime_stats.top_25/http://world.taobao.com" + }, + { + "duration": "30.159789473684206", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_cold" + }, + { + "duration": "37.36616215789473", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_hot" + }, + { + "duration": "32.86240757894737", + "name": "v8.runtime_stats.top_25/http://world.taobao.com_warm" + }, + { + "duration": "94.58865459259262", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8" + }, + { + "duration": "28.799594000000003", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_cold" + }, + { + "duration": "34.289730999999996", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_hot" + }, + { + "duration": "31.494878157894732", + "name": "v8.runtime_stats.top_25/http://www.amazon.com/s/?field-keywords=v8_warm" + }, + { + "duration": "94.70830353703704", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8" + }, + { + "duration": "28.741287052631577", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_cold" + }, + { + "duration": "34.299809315789474", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_hot" + }, + { + "duration": "31.61964294736842", + "name": "v8.runtime_stats.top_25/http://www.baidu.com/s?wd=v8_warm" + }, + { + "duration": "94.70015935185187", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine" + }, + { + "duration": "28.565385210526312", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_cold" + }, + { + "duration": "33.557864421052635", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_hot" + }, + { + "duration": "31.034997263157894", + "name": "v8.runtime_stats.top_25/http://www.bing.com/search?q=v8+engine_warm" + }, + { + "duration": "110.3579250185185", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8" + }, + { + "duration": "31.93020178947369", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_cold" + }, + { + "duration": "39.55386215789475", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_hot" + }, + { + "duration": "35.86958984210525", + "name": "v8.runtime_stats.top_25/http://www.ebay.fr/sch/i.html?_nkw=v8_warm" + }, + { + "duration": "95.53472173584902", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest" + }, + { + "duration": "29.13549221052632", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_cold" + }, + { + "duration": "34.53108557894737", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_hot" + }, + { + "duration": "31.829741210526315", + "name": "v8.runtime_stats.top_25/http://www.instagram.com/archdigest_warm" + }, + { + "duration": "104.51082511111115", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae" + }, + { + "duration": "30.85192463157894", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_cold" + }, + { + "duration": "37.55497010526316", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_hot" + }, + { + "duration": "34.45464889473685", + "name": "v8.runtime_stats.top_25/http://www.msn.com/ar-ae_warm" + }, + { + "duration": "99.17256839622637", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular" + }, + { + "duration": "29.599635421052636", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_cold" + }, + { + "duration": "36.35620315789475", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_hot" + }, + { + "duration": "33.22907942105263", + "name": "v8.runtime_stats.top_25/http://www.pinterest.com/categories/popular_warm" + }, + { + "duration": "173.08388633333337", + "name": "v8.runtime_stats.top_25/http://www.qq.com" + }, + { + "duration": "49.934584631578936", + "name": "v8.runtime_stats.top_25/http://www.qq.com_cold" + }, + { + "duration": "62.45580878947368", + "name": "v8.runtime_stats.top_25/http://www.qq.com_hot" + }, + { + "duration": "56.517666631578955", + "name": "v8.runtime_stats.top_25/http://www.qq.com_warm" + }, + { + "duration": "98.15656146296294", + "name": "v8.runtime_stats.top_25/http://www.reddit.com" + }, + { + "duration": "29.236867578947365", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_cold" + }, + { + "duration": "35.063674631578955", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_hot" + }, + { + "duration": "32.09633842105263", + "name": "v8.runtime_stats.top_25/http://www.reddit.com_warm" + }, + { + "duration": "100.21501711111112", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13" + }, + { + "duration": "30.308992736842104", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_cold" + }, + { + "duration": "36.48274394736842", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_hot" + }, + { + "duration": "33.33023884210527", + "name": "v8.runtime_stats.top_25/http://www.twitter.com/taylorswift13_warm" + }, + { + "duration": "97.3398860925926", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill" + }, + { + "duration": "29.412345578947363", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_cold" + }, + { + "duration": "35.3629782631579", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_hot" + }, + { + "duration": "32.468240526315796", + "name": "v8.runtime_stats.top_25/http://www.wikiwand.com/en/hill_warm" + }, + { + "duration": "95.60201094444446", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp" + }, + { + "duration": "28.88857547368421", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_cold" + }, + { + "duration": "34.71587931578947", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_hot" + }, + { + "duration": "32.04229263157894", + "name": "v8.runtime_stats.top_25/http://www.yahoo.co.jp_warm" + }, + { + "duration": "94.21384525925924", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8" + }, + { + "duration": "28.82109905263157", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_cold" + }, + { + "duration": "34.04240752631579", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_hot" + }, + { + "duration": "31.338715210526317", + "name": "v8.runtime_stats.top_25/http://yandex.ru/search/?text=v8_warm" + }, + { + "duration": "128.75563351851852", + "name": "v8.runtime_stats.top_25/https://adwords.google.com" + }, + { + "duration": "40.904357789473686", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_cold" + }, + { + "duration": "51.603766315789485", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_hot" + }, + { + "duration": "46.815455526315795", + "name": "v8.runtime_stats.top_25/https://adwords.google.com_warm" + }, + { + "duration": "93.19438212962966", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3" + }, + { + "duration": "28.043998894736845", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_cold" + }, + { + "duration": "33.007792736842106", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_hot" + }, + { + "duration": "30.476763842105267", + "name": "v8.runtime_stats.top_25/https://cdn.ampproject.org/c/www.bbc.co.uk/news/amp/37344292#log=3_warm" + }, + { + "duration": "116.03884512962966", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit" + }, + { + "duration": "32.453897052631575", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_cold" + }, + { + "duration": "44.1713364736842", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_hot" + }, + { + "duration": "38.64499563157895", + "name": "v8.runtime_stats.top_25/https://en.wikipedia.org/w/index.php?title=Barack_Obama&veaction=edit_warm" + }, + { + "duration": "98.6047494074074", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira" + }, + { + "duration": "29.43539884210527", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_cold" + }, + { + "duration": "35.808878210526316", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_hot" + }, + { + "duration": "32.94899336842106", + "name": "v8.runtime_stats.top_25/https://www.facebook.com/shakira_warm" + }, + { + "duration": "98.34304025925928", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8" + }, + { + "duration": "32.97071989473684", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_cold" + }, + { + "duration": "34.01239968421052", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_hot" + }, + { + "duration": "33.18376047368421", + "name": "v8.runtime_stats.top_25/https://www.google.de/search?q=v8_warm" + }, + { + "duration": "98.59957279629627", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/" + }, + { + "duration": "29.473000526315786", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_cold" + }, + { + "duration": "35.150516210526305", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_hot" + }, + { + "duration": "32.64482573684211", + "name": "v8.runtime_stats.top_25/https://www.linkedin.com/m/_warm" + }, + { + "duration": "105.75343544444443", + "name": "v8.runtime_stats.top_25/https://www.youtube.com" + }, + { + "duration": "108.62802733333332", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg" + }, + { + "duration": "32.30704710526316", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_cold" + }, + { + "duration": "39.18499563157895", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_hot" + }, + { + "duration": "42.47819057894737", + "name": "v8.runtime_stats.top_25/https://www.youtube.com/watch?v=_kZsOISarzg_warm" + }, + { + "duration": "31.244955421052634", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_cold" + }, + { + "duration": "38.028330578947376", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_hot" + }, + { + "duration": "34.97789468421053", + "name": "v8.runtime_stats.top_25/https://www.youtube.com_warm" + }, + { + "duration": "48.36129686301369", + "name": "wasm/WasmSpaceBuggy" + }, + { + "duration": "176.5221580547945", + "name": "wasm/WasmStylizedRenderer" + }, + { + "duration": "165.6652937671233", + "name": "wasm/WasmSunTemple" + }, + { + "duration": "62.5666303082192", + "name": "wasm/WasmTanks" + }, + { + "duration": "188.6219836438356", + "name": "wasm/WasmZenGarden" + }, + { + "duration": "60.144765575342454", + "name": "webrtc/10s_datachannel_transfer" + }, + { + "duration": "21.98497989041096", + "name": "webrtc/canvas_capture_peer_connection" + }, + { + "duration": "30.041330150684935", + "name": "webrtc/codec_constraints_h264" + }, + { + "duration": "30.516320082191783", + "name": "webrtc/codec_constraints_vp8" + }, + { + "duration": "32.823379630136984", + "name": "webrtc/codec_constraints_vp9" + }, + { + "duration": "21.885638876712328", + "name": "webrtc/hd_local_stream_10s" + }, + { + "duration": "45.48216710958905", + "name": "webrtc/multiple_peerconnections" + }, + { + "duration": "48.437940794520564", + "name": "webrtc/pause_play_peerconnections" + } +] \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/pixel2_story_timing.json b/tools/perf/core/shard_maps/timing_data/pixel2_story_timing.json new file mode 100644 index 0000000..93f0097 --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/pixel2_story_timing.json
@@ -0,0 +1,7190 @@ +[ + { + "duration": "13.587834459595967", + "name": "blink_perf.bindings/append-child.html" + }, + { + "duration": "11.239760772727273", + "name": "blink_perf.bindings/create-element.html" + }, + { + "duration": "10.513632752525254", + "name": "blink_perf.bindings/document-implementation.html" + }, + { + "duration": "10.551911207070708", + "name": "blink_perf.bindings/dom-attribute-on-prototoype.html" + }, + { + "duration": "10.931322707070706", + "name": "blink_perf.bindings/first-child.html" + }, + { + "duration": "9.23210519191919", + "name": "blink_perf.bindings/gc-forest.html" + }, + { + "duration": "11.045180338383839", + "name": "blink_perf.bindings/gc-mini-tree.html" + }, + { + "duration": "23.378834999999995", + "name": "blink_perf.bindings/gc-tree.html" + }, + { + "duration": "10.512732318181815", + "name": "blink_perf.bindings/get-attribute-rare.html" + }, + { + "duration": "10.587690656565657", + "name": "blink_perf.bindings/get-attribute.html" + }, + { + "duration": "10.47878205050505", + "name": "blink_perf.bindings/get-element-by-id.html" + }, + { + "duration": "10.406168404040406", + "name": "blink_perf.bindings/get-elements-by-tag-name.html" + }, + { + "duration": "10.74813076767677", + "name": "blink_perf.bindings/id-getter.html" + }, + { + "duration": "10.317548954545456", + "name": "blink_perf.bindings/id-setter.html" + }, + { + "duration": "11.335273121212122", + "name": "blink_perf.bindings/indexed-getter.html" + }, + { + "duration": "10.637710944444445", + "name": "blink_perf.bindings/insert-before.html" + }, + { + "duration": "11.303045530303036", + "name": "blink_perf.bindings/named-property-enumerator.html" + }, + { + "duration": "24.28999279797978", + "name": "blink_perf.bindings/node-list-access.html" + }, + { + "duration": "10.139387459595964", + "name": "blink_perf.bindings/node-type.html" + }, + { + "duration": "5.555044205050507", + "name": "blink_perf.bindings/post-message.html" + }, + { + "duration": "11.060310050505048", + "name": "blink_perf.bindings/sequence-conversion-array.html" + }, + { + "duration": "10.545383222222227", + "name": "blink_perf.bindings/sequence-conversion-custom-iterator.html" + }, + { + "duration": "5.280190547474746", + "name": "blink_perf.bindings/serialize-array.html" + }, + { + "duration": "4.688366777777778", + "name": "blink_perf.bindings/serialize-long-string.html" + }, + { + "duration": "7.858090982828284", + "name": "blink_perf.bindings/serialize-map.html" + }, + { + "duration": "4.677039381818182", + "name": "blink_perf.bindings/serialize-nested-array.html" + }, + { + "duration": "10.418247141414142", + "name": "blink_perf.bindings/set-attribute-rare.html" + }, + { + "duration": "10.441846237373738", + "name": "blink_perf.bindings/set-attribute.html" + }, + { + "duration": "16.636086989899", + "name": "blink_perf.bindings/structured-clone-json-deserialize.html" + }, + { + "duration": "19.868374999999993", + "name": "blink_perf.bindings/structured-clone-json-serialize.html" + }, + { + "duration": "7.604728265656568", + "name": "blink_perf.bindings/structured-clone-long-string-deserialize.html" + }, + { + "duration": "7.652917726262627", + "name": "blink_perf.bindings/structured-clone-long-string-serialize.html" + }, + { + "duration": "11.006937772727271", + "name": "blink_perf.bindings/typed-array-construct-from-array.html" + }, + { + "duration": "10.509213696969693", + "name": "blink_perf.bindings/typed-array-construct-from-same-type.html" + }, + { + "duration": "10.426587333333336", + "name": "blink_perf.bindings/typed-array-construct-from-typed.html" + }, + { + "duration": "10.290047454545457", + "name": "blink_perf.bindings/typed-array-set-from-typed.html" + }, + { + "duration": "10.85639308080808", + "name": "blink_perf.bindings/undefined-first-child.html" + }, + { + "duration": "10.454334262626265", + "name": "blink_perf.bindings/undefined-get-element-by-id.html" + }, + { + "duration": "10.928417515151517", + "name": "blink_perf.bindings/undefined-id-getter.html" + }, + { + "duration": "14.261299287878785", + "name": "blink_perf.canvas/createImageBitmapFromImageData.html" + }, + { + "duration": "6.163865483838386", + "name": "blink_perf.canvas/draw-dynamic-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "11.50101952020202", + "name": "blink_perf.canvas/draw-dynamic-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "7.985047120202021", + "name": "blink_perf.canvas/draw-hw-accelerated-canvas-2d-to-sw-canvas-2d.html" + }, + { + "duration": "5.540703202020201", + "name": "blink_perf.canvas/draw-static-canvas-2d-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "5.5437108626262654", + "name": "blink_perf.canvas/draw-static-webgl-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "6.375386761616162", + "name": "blink_perf.canvas/draw-video-to-hw-accelerated-canvas-2d.html" + }, + { + "duration": "11.201917313131316", + "name": "blink_perf.canvas/drawimage-not-pixelaligned.html" + }, + { + "duration": "10.790304272727276", + "name": "blink_perf.canvas/drawimage.html" + }, + { + "duration": "10.964088464646464", + "name": "blink_perf.canvas/getImageData.html" + }, + { + "duration": "11.512311712121218", + "name": "blink_perf.canvas/getImageDataColorManaged.html" + }, + { + "duration": "10.6518346969697", + "name": "blink_perf.canvas/putImageData.html" + }, + { + "duration": "9.449902575757578", + "name": "blink_perf.canvas/toBlob_duration.html" + }, + { + "duration": "7.626968607070708", + "name": "blink_perf.canvas/toBlob_duration_jpeg.html" + }, + { + "duration": "4.919188773737375", + "name": "blink_perf.canvas/transferFromImageBitmap.html" + }, + { + "duration": "7.665410551515155", + "name": "blink_perf.canvas/upload-canvas-2d-to-texture.html" + }, + { + "duration": "11.812558378787879", + "name": "blink_perf.canvas/upload-video-to-sub-texture.html" + }, + { + "duration": "5.227142781818179", + "name": "blink_perf.canvas/upload-video-to-texture.html" + }, + { + "duration": "5.794870611111111", + "name": "blink_perf.canvas/upload-webgl-to-texture.html" + }, + { + "duration": "18.521025863636353", + "name": "blink_perf.css/AttributeDescendantSelector.html" + }, + { + "duration": "11.221627323232319", + "name": "blink_perf.css/CSSPropertySetterGetter.html" + }, + { + "duration": "11.396442313131308", + "name": "blink_perf.css/CSSPropertySetterGetterMethods.html" + }, + { + "duration": "10.91281670707071", + "name": "blink_perf.css/CSSPropertyUpdateValue.html" + }, + { + "duration": "8.941856525252529", + "name": "blink_perf.css/ChangeStyleChildClassSelector.html" + }, + { + "duration": "8.949699303030306", + "name": "blink_perf.css/ChangeStyleChildElementSelectors.html" + }, + { + "duration": "8.935473520202024", + "name": "blink_perf.css/ChangeStyleElementSelector.html" + }, + { + "duration": "8.974114702020204", + "name": "blink_perf.css/ChangeStyleGrandChildElementSelector.html" + }, + { + "duration": "9.015964196969696", + "name": "blink_perf.css/ChangeStyleMultipleClassSelector.html" + }, + { + "duration": "8.985837772727272", + "name": "blink_perf.css/ChangeStyleMultipleQualifiedDataAttributesWithValuesSelector.html" + }, + { + "duration": "9.00448770707071", + "name": "blink_perf.css/ChangeStyleNestedPseudoSelector.html" + }, + { + "duration": "8.92012490909091", + "name": "blink_perf.css/ChangeStylePairOfNthChildSelector.html" + }, + { + "duration": "8.954875803030305", + "name": "blink_perf.css/ChangeStylePartialAttributeMatchingSelector.html" + }, + { + "duration": "8.964201434343432", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeSelector.html" + }, + { + "duration": "9.059024328282831", + "name": "blink_perf.css/ChangeStyleQualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "12.217594186868688", + "name": "blink_perf.css/ChangeStyleShallowTree.html" + }, + { + "duration": "8.97889354040404", + "name": "blink_perf.css/ChangeStyleSingleClassSelector.html" + }, + { + "duration": "9.011338863636357", + "name": "blink_perf.css/ChangeStyleSingleNthChildSelector.html" + }, + { + "duration": "8.98512898989899", + "name": "blink_perf.css/ChangeStyleSinglePseudoSelector.html" + }, + { + "duration": "8.994865939393941", + "name": "blink_perf.css/ChangeStyleUniversalSelector.html" + }, + { + "duration": "9.002904818181822", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeSelector.html" + }, + { + "duration": "9.058298247474747", + "name": "blink_perf.css/ChangeStyleUnqualifiedDataAttributeWithValueSelector.html" + }, + { + "duration": "14.897091777777783", + "name": "blink_perf.css/ClassDescendantSelector.html" + }, + { + "duration": "17.425745151515148", + "name": "blink_perf.css/ClassInvalidation.html" + }, + { + "duration": "14.821260959595966", + "name": "blink_perf.css/FocusUpdate.html" + }, + { + "duration": "9.408519186868688", + "name": "blink_perf.css/LoadBootstrapBlog.html" + }, + { + "duration": "9.493451419191919", + "name": "blink_perf.css/LoadMaterializeStarterPage.html" + }, + { + "duration": "10.104893717171716", + "name": "blink_perf.css/LoadSemanticPageExample.html" + }, + { + "duration": "11.404276474747473", + "name": "blink_perf.css/PseudoClassSelectors.html" + }, + { + "duration": "11.191480434343436", + "name": "blink_perf.css/SelectorCountScaling.html" + }, + { + "duration": "15.021564171717177", + "name": "blink_perf.dom/addRange.html" + }, + { + "duration": "5.192004298989899", + "name": "blink_perf.dom/delete-in-password-field.html" + }, + { + "duration": "12.986810651515146", + "name": "blink_perf.dom/div-editable.html" + }, + { + "duration": "4.725931592929295", + "name": "blink_perf.dom/inner_html_with_selection.html" + }, + { + "duration": "18.564719050505037", + "name": "blink_perf.dom/long-sibling-list.html" + }, + { + "duration": "7.644268638383838", + "name": "blink_perf.dom/modify-element-classname.html" + }, + { + "duration": "6.274162549494948", + "name": "blink_perf.dom/modify-element-id.html" + }, + { + "duration": "6.19380707070707", + "name": "blink_perf.dom/modify-element-title.html" + }, + { + "duration": "5.033993405050505", + "name": "blink_perf.dom/move-down-with-hidden-elements.html" + }, + { + "duration": "5.012133815151517", + "name": "blink_perf.dom/move-up-with-hidden-elements.html" + }, + { + "duration": "4.748340553535356", + "name": "blink_perf.dom/remove_child_with_selection.html" + }, + { + "duration": "11.165564272727275", + "name": "blink_perf.dom/select-multiple-add.html" + }, + { + "duration": "10.74407486363636", + "name": "blink_perf.dom/select-single-add.html" + }, + { + "duration": "10.823724530303025", + "name": "blink_perf.dom/select-single-remove.html" + }, + { + "duration": "10.757548297979797", + "name": "blink_perf.dom/textarea-dom.html" + }, + { + "duration": "9.943094131313135", + "name": "blink_perf.dom/textarea-edit.html" + }, + { + "duration": "24.11383234343434", + "name": "blink_perf.events/EventsDispatching.html" + }, + { + "duration": "11.818728691919198", + "name": "blink_perf.events/EventsDispatchingInDeeplyNestedShadowTrees.html" + }, + { + "duration": "25.892323040404037", + "name": "blink_perf.events/EventsDispatchingInShadowTrees.html" + }, + { + "duration": "23.09532269696969", + "name": "blink_perf.events/hit-test-lots-of-layers.html" + }, + { + "duration": "55.58050931818183", + "name": "blink_perf.image_decoder/decode-gif.html" + }, + { + "duration": "19.149345666666665", + "name": "blink_perf.image_decoder/decode-jpeg.html" + }, + { + "duration": "54.18863983333335", + "name": "blink_perf.image_decoder/decode-lossless-webp.html" + }, + { + "duration": "11.636440454545449", + "name": "blink_perf.image_decoder/decode-lossy-webp.html" + }, + { + "duration": "34.48308398484848", + "name": "blink_perf.image_decoder/decode-png-palette-opaque.html" + }, + { + "duration": "18.372660090909093", + "name": "blink_perf.image_decoder/decode-png-palette.html" + }, + { + "duration": "58.33097940909092", + "name": "blink_perf.image_decoder/decode-png.html" + }, + { + "duration": "19.64777596212121", + "name": "blink_perf.layout/ArabicLineLayout.html" + }, + { + "duration": "4.963213977272727", + "name": "blink_perf.layout/Shapes/MultipleShapes.html" + }, + { + "duration": "10.629994174242427", + "name": "blink_perf.layout/SimpleTextPathLineLayout.html" + }, + { + "duration": "10.580794931818179", + "name": "blink_perf.layout/add-remove-inline-floats.html" + }, + { + "duration": "10.86555746969697", + "name": "blink_perf.layout/attach-inlines-2.html" + }, + { + "duration": "10.70388356818182", + "name": "blink_perf.layout/attach-inlines.html" + }, + { + "duration": "11.384574628787883", + "name": "blink_perf.layout/auto-grid-lots-of-data.html" + }, + { + "duration": "9.985921151515152", + "name": "blink_perf.layout/chapter-reflow-once-random.html" + }, + { + "duration": "13.104293401515154", + "name": "blink_perf.layout/chapter-reflow-once.html" + }, + { + "duration": "10.895307537878786", + "name": "blink_perf.layout/chapter-reflow-thrice.html" + }, + { + "duration": "11.537742757575751", + "name": "blink_perf.layout/chapter-reflow-twice.html" + }, + { + "duration": "10.986350462121209", + "name": "blink_perf.layout/chapter-reflow.html" + }, + { + "duration": "6.242879622727272", + "name": "blink_perf.layout/character_fallback.html" + }, + { + "duration": "5.1468045818181825", + "name": "blink_perf.layout/character_fallback_aat.html" + }, + { + "duration": "11.507334712121212", + "name": "blink_perf.layout/fixed-grid-lots-of-data.html" + }, + { + "duration": "11.540611484848487", + "name": "blink_perf.layout/fixed-grid-lots-of-stretched-data.html" + }, + { + "duration": "10.91110896969697", + "name": "blink_perf.layout/flexbox-column-nowrap.html" + }, + { + "duration": "10.928411007575756", + "name": "blink_perf.layout/flexbox-column-wrap.html" + }, + { + "duration": "11.296202196969697", + "name": "blink_perf.layout/flexbox-deeply-nested-column-flow.html" + }, + { + "duration": "10.989775083333337", + "name": "blink_perf.layout/flexbox-lots-of-data.html" + }, + { + "duration": "10.897983439393943", + "name": "blink_perf.layout/flexbox-row-nowrap.html" + }, + { + "duration": "10.888513310606058", + "name": "blink_perf.layout/flexbox-row-wrap.html" + }, + { + "duration": "10.582628280303027", + "name": "blink_perf.layout/flexbox-with-stretch-layout.html" + }, + { + "duration": "19.5401828939394", + "name": "blink_perf.layout/floats_100_100.html" + }, + { + "duration": "19.716073242424248", + "name": "blink_perf.layout/floats_100_100_nested.html" + }, + { + "duration": "12.971180174242427", + "name": "blink_perf.layout/floats_10_1000.html" + }, + { + "duration": "8.408518916666665", + "name": "blink_perf.layout/floats_20_100.html" + }, + { + "duration": "9.570559174242424", + "name": "blink_perf.layout/floats_20_100_nested.html" + }, + { + "duration": "6.523278657575755", + "name": "blink_perf.layout/floats_2_100.html" + }, + { + "duration": "6.705957857575757", + "name": "blink_perf.layout/floats_2_100_nested.html" + }, + { + "duration": "10.033174446969694", + "name": "blink_perf.layout/floats_50_100.html" + }, + { + "duration": "10.537865871212121", + "name": "blink_perf.layout/floats_50_100_nested.html" + }, + { + "duration": "10.527109765151517", + "name": "blink_perf.layout/hindi-line-layout.html" + }, + { + "duration": "16.95332476515152", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans-wider-than-table.html" + }, + { + "duration": "15.619114992424244", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-colspans.html" + }, + { + "duration": "15.528479863636365", + "name": "blink_perf.layout/large-table-with-collapsed-borders-and-no-colspans.html" + }, + { + "duration": "4.95043504090909", + "name": "blink_perf.layout/latin-complex-text.html" + }, + { + "duration": "6.4742363939393925", + "name": "blink_perf.layout/layers_overlap_2d.html" + }, + { + "duration": "6.280976427272727", + "name": "blink_perf.layout/layers_overlap_3d.html" + }, + { + "duration": "16.543198378787878", + "name": "blink_perf.layout/line-layout-line-height.html" + }, + { + "duration": "10.257071500000004", + "name": "blink_perf.layout/line-layout-repeat-append.html" + }, + { + "duration": "10.273773606060605", + "name": "blink_perf.layout/line-layout.html" + }, + { + "duration": "5.165620595454546", + "name": "blink_perf.layout/long-line-nowrap-collapse.html" + }, + { + "duration": "5.157440471212122", + "name": "blink_perf.layout/long-line-nowrap-spans-collapse.html" + }, + { + "duration": "8.964580810606058", + "name": "blink_perf.layout/long-line-nowrap.html" + }, + { + "duration": "11.047249181818179", + "name": "blink_perf.layout/multicol/deeply-nested-tables.html" + }, + { + "duration": "10.702090075757575", + "name": "blink_perf.layout/multicol/fixed-height-with-spanner-and-nested-tables.html" + }, + { + "duration": "10.124141803030303", + "name": "blink_perf.layout/multicol/lots-of-text-autofill.html" + }, + { + "duration": "10.580219833333327", + "name": "blink_perf.layout/multicol/lots-of-text-balanced-orphans-widows.html" + }, + { + "duration": "10.573649484848485", + "name": "blink_perf.layout/multicol/lots-of-text-balanced.html" + }, + { + "duration": "10.959451446969696", + "name": "blink_perf.layout/multicol/tall-content-short-columns-realistic.html" + }, + { + "duration": "10.973848098484845", + "name": "blink_perf.layout/multicol/tall-content-short-columns.html" + }, + { + "duration": "10.867170484848486", + "name": "blink_perf.layout/nested-blocks-with-percent-height-and-max-height.html" + }, + { + "duration": "11.053059439393936", + "name": "blink_perf.layout/nested-grid.html" + }, + { + "duration": "10.52026517424242", + "name": "blink_perf.layout/nested-percent-height-tables.html" + }, + { + "duration": "89.81718410606062", + "name": "blink_perf.layout/subtree-detaching.html" + }, + { + "duration": "6.711940390909089", + "name": "blink_perf.layout/vertical-japanese-kokoro-insert.html" + }, + { + "duration": "8.342441642424241", + "name": "blink_perf.layout/word-break-break-all.html" + }, + { + "duration": "8.331014356060606", + "name": "blink_perf.layout/word-break-break-word.html" + }, + { + "duration": "8.352563537878785", + "name": "blink_perf.layout/word-wrap-break-word.html" + }, + { + "duration": "16.583152613636365", + "name": "blink_perf.owp_storage/blob-perf-files.html" + }, + { + "duration": "13.628787333333333", + "name": "blink_perf.owp_storage/blob-perf-ipc.html" + }, + { + "duration": "12.571781136363635", + "name": "blink_perf.owp_storage/blob-perf-shm.html" + }, + { + "duration": "13.711734340909091", + "name": "blink_perf.owp_storage/blob-perf-tiny.html" + }, + { + "duration": "13.842072219696966", + "name": "blink_perf.owp_storage/idb-load-docs.html" + }, + { + "duration": "18.452908878787873", + "name": "blink_perf.paint/appending-text.html" + }, + { + "duration": "20.14564872727273", + "name": "blink_perf.paint/color-changes.html" + }, + { + "duration": "17.033366530303027", + "name": "blink_perf.paint/complex-content-slow-scroll.html" + }, + { + "duration": "18.775548151515153", + "name": "blink_perf.paint/containment-resize.html" + }, + { + "duration": "17.199244500000002", + "name": "blink_perf.paint/fixed-and-many-layers-scroll.html" + }, + { + "duration": "20.08668865151515", + "name": "blink_perf.paint/large-table-background-change-with-invisible-collapsed-borders.html" + }, + { + "duration": "16.149292757575758", + "name": "blink_perf.paint/large-table-background-change-with-visible-collapsed-borders.html" + }, + { + "duration": "21.706926530303026", + "name": "blink_perf.paint/large-table-background-change-with-zero-width-collapsed-borders.html" + }, + { + "duration": "16.502104393939394", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-backgrounds.html" + }, + { + "duration": "19.82705331818182", + "name": "blink_perf.paint/large-table-collapsed-border-change-with-text.html" + }, + { + "duration": "14.36117256060606", + "name": "blink_perf.paint/large-table-collapsed-border-change.html" + }, + { + "duration": "19.598705924242427", + "name": "blink_perf.paint/large-table-repaint.html" + }, + { + "duration": "13.82645940151515", + "name": "blink_perf.paint/move-text-with-mask.html" + }, + { + "duration": "17.178388666666667", + "name": "blink_perf.paint/paint-offset-changes.html" + }, + { + "duration": "20.38152256060606", + "name": "blink_perf.paint/transform-changes.html" + }, + { + "duration": "16.07976775", + "name": "blink_perf.parser/css-parser-yui.html" + }, + { + "duration": "17.386472863636357", + "name": "blink_perf.parser/html-parser-threaded.html" + }, + { + "duration": "21.853963757575755", + "name": "blink_perf.parser/html-parser.html" + }, + { + "duration": "69.56353942424242", + "name": "blink_perf.parser/html5-full-render.html" + }, + { + "duration": "10.662754901515152", + "name": "blink_perf.parser/iframe-append-remove.html" + }, + { + "duration": "10.90224443181818", + "name": "blink_perf.parser/innerHTML-setter-siblings.html" + }, + { + "duration": "10.681960166666665", + "name": "blink_perf.parser/innerHTML-setter.html" + }, + { + "duration": "10.807314674242424", + "name": "blink_perf.parser/query-selector-all-attribute-complex.html" + }, + { + "duration": "10.831925674242424", + "name": "blink_perf.parser/query-selector-all-attribute.html" + }, + { + "duration": "11.105091795454543", + "name": "blink_perf.parser/query-selector-all-class-deep.html" + }, + { + "duration": "11.797537386363635", + "name": "blink_perf.parser/query-selector-all-class-first.html" + }, + { + "duration": "13.218019272727274", + "name": "blink_perf.parser/query-selector-all-class-last.html" + }, + { + "duration": "10.716051863636366", + "name": "blink_perf.parser/query-selector-all-class.html" + }, + { + "duration": "11.206347242424238", + "name": "blink_perf.parser/query-selector-all-deep.html" + }, + { + "duration": "11.634603977272725", + "name": "blink_perf.parser/query-selector-all-first.html" + }, + { + "duration": "12.293061818181819", + "name": "blink_perf.parser/query-selector-all-id-deep.html" + }, + { + "duration": "11.763428234848478", + "name": "blink_perf.parser/query-selector-all-id-first.html" + }, + { + "duration": "12.396185719696971", + "name": "blink_perf.parser/query-selector-all-id-last.html" + }, + { + "duration": "11.12444765909091", + "name": "blink_perf.parser/query-selector-all-last.html" + }, + { + "duration": "11.03489540909091", + "name": "blink_perf.parser/query-selector-deep.html" + }, + { + "duration": "11.344192545454547", + "name": "blink_perf.parser/query-selector-first.html" + }, + { + "duration": "10.857783719696972", + "name": "blink_perf.parser/query-selector-id-deep.html" + }, + { + "duration": "11.300387401515152", + "name": "blink_perf.parser/query-selector-id-last.html" + }, + { + "duration": "11.262282765151513", + "name": "blink_perf.parser/query-selector-last.html" + }, + { + "duration": "9.764694454545452", + "name": "blink_perf.parser/simple-url.html" + }, + { + "duration": "11.125969931818183", + "name": "blink_perf.parser/textarea-parsing.html" + }, + { + "duration": "9.993226863636364", + "name": "blink_perf.parser/tiny-innerHTML.html" + }, + { + "duration": "12.57480140151515", + "name": "blink_perf.parser/url-parser.html" + }, + { + "duration": "10.966182545454545", + "name": "blink_perf.parser/xml-parser.html" + }, + { + "duration": "11.11586863939394", + "name": "blink_perf.shadow_dom/shadow-style-share-attr-selectors.html" + }, + { + "duration": "5.6611273136363645", + "name": "blink_perf.shadow_dom/shadow-style-share-media-query.html" + }, + { + "duration": "5.653598109090908", + "name": "blink_perf.shadow_dom/shadow-style-share-with-distribution.html" + }, + { + "duration": "4.90269429848485", + "name": "blink_perf.shadow_dom/shadow-style-share.html" + }, + { + "duration": "5.130607460606059", + "name": "blink_perf.shadow_dom/style-sheet-insert.html" + }, + { + "duration": "5.361778798484848", + "name": "blink_perf.shadow_dom/v0-changing-classname-with-shadow-dom.html" + }, + { + "duration": "6.855338153030303", + "name": "blink_perf.shadow_dom/v0-changing-classname-without-shadow-dom.html" + }, + { + "duration": "10.22941062121212", + "name": "blink_perf.shadow_dom/v0-changing-select-with-shadow-dom.html" + }, + { + "duration": "12.30337158333333", + "name": "blink_perf.shadow_dom/v0-changing-select-without-shadow-dom.html" + }, + { + "duration": "5.288898934848485", + "name": "blink_perf.shadow_dom/v0-content-reprojection.html" + }, + { + "duration": "5.001495753030303", + "name": "blink_perf.shadow_dom/v0-large-distribution-without-layout.html" + }, + { + "duration": "4.958998028787877", + "name": "blink_perf.shadow_dom/v0-multiple-insertion-points.html" + }, + { + "duration": "5.261190475757573", + "name": "blink_perf.shadow_dom/v0-shadow-reprojection.html" + }, + { + "duration": "5.059986127272727", + "name": "blink_perf.shadow_dom/v0-small-distribution-with-layout.html" + }, + { + "duration": "23.265520636363636", + "name": "blink_perf.shadow_dom/v1-distribution-disconnected-and-reconnected.html" + }, + { + "duration": "4.782141246969698", + "name": "blink_perf.shadow_dom/v1-distribution.html" + }, + { + "duration": "5.256581668181816", + "name": "blink_perf.shadow_dom/v1-host-child-append.html" + }, + { + "duration": "23.354278651515155", + "name": "blink_perf.shadow_dom/v1-large-deep-distribution.html" + }, + { + "duration": "54.05395863636365", + "name": "blink_perf.shadow_dom/v1-large-deep-layout.html" + }, + { + "duration": "4.712703980303029", + "name": "blink_perf.shadow_dom/v1-large-shallow-distribution.html" + }, + { + "duration": "4.862228392424241", + "name": "blink_perf.shadow_dom/v1-large-shallow-layout.html" + }, + { + "duration": "5.543714574242425", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-re-layout.html" + }, + { + "duration": "4.813201033333331", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "4.849370819696972", + "name": "blink_perf.shadow_dom/v1-mutate-deep-tree-then-slot-flatten.html" + }, + { + "duration": "5.04153889393939", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-re-layout.html" + }, + { + "duration": "4.808243568181816", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-assigned-nodes.html" + }, + { + "duration": "4.877508533333333", + "name": "blink_perf.shadow_dom/v1-mutate-shallow-tree-then-slot-flatten.html" + }, + { + "duration": "4.734194792424241", + "name": "blink_perf.shadow_dom/v1-slot-append.html" + }, + { + "duration": "6.771816106060607", + "name": "blink_perf.shadow_dom/v1-small-deep-distribution.html" + }, + { + "duration": "6.786325333333333", + "name": "blink_perf.shadow_dom/v1-small-deep-layout.html" + }, + { + "duration": "4.745192875757579", + "name": "blink_perf.shadow_dom/v1-small-shallow-distribution.html" + }, + { + "duration": "4.73679453787879", + "name": "blink_perf.shadow_dom/v1-small-shallow-layout.html" + }, + { + "duration": "10.15372015454545", + "name": "blink_perf.svg/AzLizardBenjiPark.html" + }, + { + "duration": "7.90432928030303", + "name": "blink_perf.svg/Bamboo.html" + }, + { + "duration": "5.4649278712121205", + "name": "blink_perf.svg/Cactus.html" + }, + { + "duration": "5.489333209090909", + "name": "blink_perf.svg/Cowboy.html" + }, + { + "duration": "6.030909733333334", + "name": "blink_perf.svg/Cowboy_transform.html" + }, + { + "duration": "5.087424456060604", + "name": "blink_perf.svg/CrawFishGanson.html" + }, + { + "duration": "5.210256219696969", + "name": "blink_perf.svg/Debian.html" + }, + { + "duration": "4.973094025757578", + "name": "blink_perf.svg/DropsOnABlade.html" + }, + { + "duration": "5.004054616666668", + "name": "blink_perf.svg/FlowerFromMyGarden.html" + }, + { + "duration": "5.298171553030302", + "name": "blink_perf.svg/FoodLeifLodahl.html" + }, + { + "duration": "5.208752695454547", + "name": "blink_perf.svg/France.html" + }, + { + "duration": "5.050560446969697", + "name": "blink_perf.svg/FrancoBolloGnomeEzechi.html" + }, + { + "duration": "5.50171499242424", + "name": "blink_perf.svg/GearFlowers.html" + }, + { + "duration": "5.1581381318181805", + "name": "blink_perf.svg/HarveyRayner.html" + }, + { + "duration": "5.019907843939395", + "name": "blink_perf.svg/HereGear.html" + }, + { + "duration": "8.52206115151515", + "name": "blink_perf.svg/MtSaintHelens.html" + }, + { + "duration": "4.89660365757576", + "name": "blink_perf.svg/Samurai.html" + }, + { + "duration": "66.42898866666665", + "name": "blink_perf.svg/SierpinskiCarpet.html" + }, + { + "duration": "5.87822677878788", + "name": "blink_perf.svg/SvgCubics.html" + }, + { + "duration": "6.239055715151516", + "name": "blink_perf.svg/SvgHitTesting.html" + }, + { + "duration": "12.367562378787877", + "name": "blink_perf.svg/SvgNestedUse.html" + }, + { + "duration": "5.184255339393942", + "name": "blink_perf.svg/UnderTheSee.html" + }, + { + "duration": "6.130055104545458", + "name": "blink_perf.svg/WorldIso.html" + }, + { + "duration": "7.972588556060606", + "name": "blink_perf.svg/Worldcup.html" + }, + { + "duration": "39.69682522727274", + "name": "dromaeo/http://dromaeo.com?dom-attr" + }, + { + "duration": "35.98756934848485", + "name": "dromaeo/http://dromaeo.com?dom-modify" + }, + { + "duration": "50.600674757575746", + "name": "dromaeo/http://dromaeo.com?dom-query" + }, + { + "duration": "30.81567275757576", + "name": "dromaeo/http://dromaeo.com?dom-traverse" + }, + { + "duration": "17.253589454545455", + "name": "dummy_benchmark.histogram_benchmark_1/dummy_page.html" + }, + { + "duration": "9.67037065909091", + "name": "dummy_benchmark.noisy_benchmark_1/dummy_page.html" + }, + { + "duration": "9.073332128787877", + "name": "dummy_benchmark.stable_benchmark_1/dummy_page.html" + }, + { + "duration": "278.7251378461538", + "name": "jetstream/http://browserbench.org/JetStream/" + }, + { + "duration": "56.53709648484848", + "name": "kraken/http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html" + }, + { + "duration": "107.52323303846157", + "name": "loading.mobile/58Pic" + }, + { + "duration": "100.05581913333332", + "name": "loading.mobile/58Pic_3g" + }, + { + "duration": "167.60022638461533", + "name": "loading.mobile/Amazon" + }, + { + "duration": "167.85247126666667", + "name": "loading.mobile/Amazon_3g" + }, + { + "duration": "163.1113446461538", + "name": "loading.mobile/BOLNoticias" + }, + { + "duration": "155.50695833333333", + "name": "loading.mobile/BOLNoticias_3g" + }, + { + "duration": "122.19372130769231", + "name": "loading.mobile/Baidu" + }, + { + "duration": "112.25818993333334", + "name": "loading.mobile/Baidu_3g" + }, + { + "duration": "213.45433889230767", + "name": "loading.mobile/Bradesco" + }, + { + "duration": "223.47369220000002", + "name": "loading.mobile/Bradesco_3g" + }, + { + "duration": "146.79930493846152", + "name": "loading.mobile/Dailymotion" + }, + { + "duration": "137.0027515333333", + "name": "loading.mobile/Dailymotion_3g" + }, + { + "duration": "177.88518243076928", + "name": "loading.mobile/Dawn" + }, + { + "duration": "165.98744533333334", + "name": "loading.mobile/Dawn_3g" + }, + { + "duration": "313.36554194999997", + "name": "loading.mobile/DevOpera" + }, + { + "duration": "30.505520733333324", + "name": "loading.mobile/DevOpera_cold" + }, + { + "duration": "100.40028113333334", + "name": "loading.mobile/DevOpera_cold_3g" + }, + { + "duration": "44.41601073333333", + "name": "loading.mobile/DevOpera_hot" + }, + { + "duration": "52.763043333333336", + "name": "loading.mobile/DevOpera_hot_3g" + }, + { + "duration": "37.16069986666666", + "name": "loading.mobile/DevOpera_warm" + }, + { + "duration": "44.68267719999999", + "name": "loading.mobile/DevOpera_warm_3g" + }, + { + "duration": "205.1364055538461", + "name": "loading.mobile/Dramaq" + }, + { + "duration": "209.21178546666667", + "name": "loading.mobile/Dramaq_3g" + }, + { + "duration": "116.40636109230768", + "name": "loading.mobile/EnquiryIndianRail" + }, + { + "duration": "107.71191486666666", + "name": "loading.mobile/EnquiryIndianRail_3g" + }, + { + "duration": "135.2013001384615", + "name": "loading.mobile/Facebook" + }, + { + "duration": "121.79421633333332", + "name": "loading.mobile/Facebook_3g" + }, + { + "duration": "396.71720212", + "name": "loading.mobile/FlipBoard" + }, + { + "duration": "32.7583266", + "name": "loading.mobile/FlipBoard_cold" + }, + { + "duration": "134.86177593333332", + "name": "loading.mobile/FlipBoard_cold_3g" + }, + { + "duration": "52.17803086666666", + "name": "loading.mobile/FlipBoard_hot" + }, + { + "duration": "65.38209073333333", + "name": "loading.mobile/FlipBoard_hot_3g" + }, + { + "duration": "41.94588233333332", + "name": "loading.mobile/FlipBoard_warm" + }, + { + "duration": "66.95657353333333", + "name": "loading.mobile/FlipBoard_warm_3g" + }, + { + "duration": "410.6971056800001", + "name": "loading.mobile/FlipKart" + }, + { + "duration": "39.56136826666666", + "name": "loading.mobile/FlipKart_cold" + }, + { + "duration": "129.94245399999997", + "name": "loading.mobile/FlipKart_cold_3g" + }, + { + "duration": "61.97186093333333", + "name": "loading.mobile/FlipKart_hot" + }, + { + "duration": "68.49379706666667", + "name": "loading.mobile/FlipKart_hot_3g" + }, + { + "duration": "49.4746306", + "name": "loading.mobile/FlipKart_warm" + }, + { + "duration": "56.40376766666666", + "name": "loading.mobile/FlipKart_warm_3g" + }, + { + "duration": "135.95217075384616", + "name": "loading.mobile/FranceTVInfo" + }, + { + "duration": "127.35940079999997", + "name": "loading.mobile/FranceTVInfo_3g" + }, + { + "duration": "172.8278667333333", + "name": "loading.mobile/G1_3g" + }, + { + "duration": "324.2226966", + "name": "loading.mobile/GSShop" + }, + { + "duration": "354.436104", + "name": "loading.mobile/GSShop_3g" + }, + { + "duration": "116.25108245384618", + "name": "loading.mobile/GoogleBrazil" + }, + { + "duration": "109.3250758", + "name": "loading.mobile/GoogleBrazil_3g" + }, + { + "duration": "111.73103581538464", + "name": "loading.mobile/GoogleIndia" + }, + { + "duration": "96.936955", + "name": "loading.mobile/GoogleIndia_3g" + }, + { + "duration": "106.83934045384613", + "name": "loading.mobile/GoogleIndonesia" + }, + { + "duration": "97.90354180000001", + "name": "loading.mobile/GoogleIndonesia_3g" + }, + { + "duration": "142.3462195076923", + "name": "loading.mobile/GoogleRedirectToGoogleJapan" + }, + { + "duration": "138.24982219999998", + "name": "loading.mobile/GoogleRedirectToGoogleJapan_3g" + }, + { + "duration": "165.1557994153846", + "name": "loading.mobile/Hongkiat" + }, + { + "duration": "167.02218606666665", + "name": "loading.mobile/Hongkiat_3g" + }, + { + "duration": "187.4672539230769", + "name": "loading.mobile/KapanLagi" + }, + { + "duration": "184.01562186666663", + "name": "loading.mobile/KapanLagi_3g" + }, + { + "duration": "234.05339158461538", + "name": "loading.mobile/Kaskus" + }, + { + "duration": "226.97062653333333", + "name": "loading.mobile/Kaskus_3g" + }, + { + "duration": "165.51583686153845", + "name": "loading.mobile/LocalMoxie" + }, + { + "duration": "167.51700340000005", + "name": "loading.mobile/LocalMoxie_3g" + }, + { + "duration": "91.88295398461538", + "name": "loading.mobile/Locanto" + }, + { + "duration": "80.34943026666669", + "name": "loading.mobile/Locanto_3g" + }, + { + "duration": "176.03035696923075", + "name": "loading.mobile/OLX" + }, + { + "duration": "175.40800073333332", + "name": "loading.mobile/OLX_3g" + }, + { + "duration": "120.53497514062502", + "name": "loading.mobile/QQNews" + }, + { + "duration": "111.25076513333333", + "name": "loading.mobile/QQNews_3g" + }, + { + "duration": "164.9188812769232", + "name": "loading.mobile/SlideShare" + }, + { + "duration": "166.61505866666664", + "name": "loading.mobile/SlideShare_3g" + }, + { + "duration": "259.37265744000007", + "name": "loading.mobile/Suumo" + }, + { + "duration": "28.880256933333335", + "name": "loading.mobile/Suumo_cold" + }, + { + "duration": "56.68194999999999", + "name": "loading.mobile/Suumo_cold_3g" + }, + { + "duration": "39.46534646666667", + "name": "loading.mobile/Suumo_hot" + }, + { + "duration": "51.51235079999999", + "name": "loading.mobile/Suumo_hot_3g" + }, + { + "duration": "34.15940153333333", + "name": "loading.mobile/Suumo_warm" + }, + { + "duration": "45.89467766666667", + "name": "loading.mobile/Suumo_warm_3g" + }, + { + "duration": "228.9731369846154", + "name": "loading.mobile/Thairath" + }, + { + "duration": "242.46081586666665", + "name": "loading.mobile/Thairath_3g" + }, + { + "duration": "206.2408761230769", + "name": "loading.mobile/TheStar" + }, + { + "duration": "197.96474146666665", + "name": "loading.mobile/TheStar_3g" + }, + { + "duration": "181.3499239846154", + "name": "loading.mobile/TribunNews" + }, + { + "duration": "171.7631786666667", + "name": "loading.mobile/TribunNews_3g" + }, + { + "duration": "134.26954559230768", + "name": "loading.mobile/Twitter" + }, + { + "duration": "127.48345793333334", + "name": "loading.mobile/Twitter_3g" + }, + { + "duration": "325.2927588299999", + "name": "loading.mobile/VoiceMemos" + }, + { + "duration": "30.396680333333332", + "name": "loading.mobile/VoiceMemos_cold" + }, + { + "duration": "105.01340840000003", + "name": "loading.mobile/VoiceMemos_cold_3g" + }, + { + "duration": "44.113669066666674", + "name": "loading.mobile/VoiceMemos_hot" + }, + { + "duration": "55.35937126666668", + "name": "loading.mobile/VoiceMemos_hot_3g" + }, + { + "duration": "36.93952906666666", + "name": "loading.mobile/VoiceMemos_warm" + }, + { + "duration": "47.824252200000004", + "name": "loading.mobile/VoiceMemos_warm_3g" + }, + { + "duration": "124.7222270923077", + "name": "loading.mobile/Wikipedia" + }, + { + "duration": "120.58657446666666", + "name": "loading.mobile/Wikipedia_3g" + }, + { + "duration": "160.604162765625", + "name": "loading.mobile/YahooNews" + }, + { + "duration": "148.68260180000001", + "name": "loading.mobile/YahooNews_3g" + }, + { + "duration": "135.5393666153846", + "name": "loading.mobile/Youtube" + }, + { + "duration": "132.32437006666666", + "name": "loading.mobile/Youtube_3g" + }, + { + "duration": "21.24939717171718", + "name": "media.mobile/mse.html?media=aac_audio.mp4" + }, + { + "duration": "26.03683221212121", + "name": "media.mobile/mse.html?media=aac_audio.mp4,h264_video.mp4" + }, + { + "duration": "26.213318828282823", + "name": "media.mobile/mse.html?media=aac_audio.mp4,h264_video.mp4&waitForPageLoaded=true" + }, + { + "duration": "25.25627998989899", + "name": "media.mobile/mse.html?media=h264_video.mp4" + }, + { + "duration": "34.82783053535353", + "name": "media.mobile/video.html?src=crowd.ogg&type=audio" + }, + { + "duration": "32.279935878787875", + "name": "media.mobile/video.html?src=crowd1080_vp9.webm" + }, + { + "duration": "19.281950464646467", + "name": "media.mobile/video.html?src=crowd1080_vp9.webm&seek" + }, + { + "duration": "31.10666787878789", + "name": "media.mobile/video.html?src=crowd720_vp9.webm" + }, + { + "duration": "33.848842010101016", + "name": "media.mobile/video.html?src=tulip2.m4a&type=audio" + }, + { + "duration": "33.78299957575758", + "name": "media.mobile/video.html?src=tulip2.mp3&type=audio" + }, + { + "duration": "14.087182712121217", + "name": "media.mobile/video.html?src=tulip2.mp3&type=audio&seek" + }, + { + "duration": "43.87389878787881", + "name": "media.mobile/video.html?src=tulip2.mp4" + }, + { + "duration": "43.81735842424245", + "name": "media.mobile/video.html?src=tulip2.mp4&busyjs" + }, + { + "duration": "16.790740762626264", + "name": "media.mobile/video.html?src=tulip2.mp4&seek" + }, + { + "duration": "34.09435347474748", + "name": "media.mobile/video.html?src=tulip2.ogg&type=audio" + }, + { + "duration": "14.2713458989899", + "name": "media.mobile/video.html?src=tulip2.ogg&type=audio&seek" + }, + { + "duration": "44.32619838383837", + "name": "media.mobile/video.html?src=tulip2.vp9.webm" + }, + { + "duration": "27.980532454545454", + "name": "media.mobile/video.html?src=tulip2.vp9.webm&background" + }, + { + "duration": "18.740082393939396", + "name": "media.mobile/video.html?src=tulip2.vp9.webm&seek" + }, + { + "duration": "69.04647203030301", + "name": "media.mobile/video.html?src=tulip2.vp9.webm_Regular-3G" + }, + { + "duration": "35.64098121212122", + "name": "media.mobile/video.html?src=tulip2.wav&type=audio" + }, + { + "duration": "15.105394449494952", + "name": "media.mobile/video.html?src=tulip2.wav&type=audio&seek" + }, + { + "duration": "313.13759565656574", + "name": "memory.long_running_idle_gmail_background_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "263.0782863636363", + "name": "memory.long_running_idle_gmail_tbmv2/https://mail.google.com/mail/" + }, + { + "duration": "95.39291023232323", + "name": "memory.top_10_mobile/after_http_en_m_wikipedia_org_wiki_Science" + }, + { + "duration": "92.56024308080808", + "name": "memory.top_10_mobile/after_http_m_intl_taobao_com_group_purchase_html" + }, + { + "duration": "94.59132239393936", + "name": "memory.top_10_mobile/after_http_m_youtube_com_results_q_science" + }, + { + "duration": "94.0484232121212", + "name": "memory.top_10_mobile/after_http_search_yahoo_com_search__ylt_p_google" + }, + { + "duration": "94.66216905050506", + "name": "memory.top_10_mobile/after_http_www_amazon_com_gp_aw_s_k_nexus" + }, + { + "duration": "93.96992194949492", + "name": "memory.top_10_mobile/after_http_www_baidu_com_s_word_google" + }, + { + "duration": "93.44764560606058", + "name": "memory.top_10_mobile/after_http_yandex_ru_touchsearch_text_science" + }, + { + "duration": "94.74681208080806", + "name": "memory.top_10_mobile/after_https_m_facebook_com_rihanna" + }, + { + "duration": "93.63647751487876", + "name": "memory.top_10_mobile/after_https_mobile_twitter_com_justinbieber_skip_interstitial_true" + }, + { + "duration": "95.51037868686869", + "name": "memory.top_10_mobile/after_https_www_google_co_uk_hl_en_q_science" + }, + { + "duration": "106.27090719191922", + "name": "memory.top_10_mobile/http_en_m_wikipedia_org_wiki_Science" + }, + { + "duration": "103.0880054545455", + "name": "memory.top_10_mobile/http_m_intl_taobao_com_group_purchase_html" + }, + { + "duration": "105.25786681818181", + "name": "memory.top_10_mobile/http_m_youtube_com_results_q_science" + }, + { + "duration": "103.25233905050504", + "name": "memory.top_10_mobile/http_search_yahoo_com_search__ylt_p_google" + }, + { + "duration": "103.99477319191917", + "name": "memory.top_10_mobile/http_www_amazon_com_gp_aw_s_k_nexus" + }, + { + "duration": "105.59880055555556", + "name": "memory.top_10_mobile/http_www_baidu_com_s_word_google" + }, + { + "duration": "103.90586176767677", + "name": "memory.top_10_mobile/http_yandex_ru_touchsearch_text_science" + }, + { + "duration": "104.51037772727273", + "name": "memory.top_10_mobile/https_m_facebook_com_rihanna" + }, + { + "duration": "103.8921435555555", + "name": "memory.top_10_mobile/https_mobile_twitter_com_justinbieber_skip_interstitial_true" + }, + { + "duration": "110.4933926161616", + "name": "memory.top_10_mobile/https_www_google_co_uk_hl_en_q_science" + }, + { + "duration": "57.676217898989904", + "name": "octane/http://chromium.github.io/octane/index.html?auto=1" + }, + { + "duration": "17.790955383333333", + "name": "oortonline_tbmv2/http://oortonline.gl/#run" + }, + { + "duration": "26.585783399999993", + "name": "power.idle_platform/IdleStory_10s" + }, + { + "duration": "137.1103418333333", + "name": "power.idle_platform/IdleStory_120s" + }, + { + "duration": "76.24031506666662", + "name": "power.idle_platform/IdleStory_60s" + }, + { + "duration": "62.6399386", + "name": "power.typical_10_mobile/http://de.m.wikipedia.org/wiki/K%C3%B6lner_Dom" + }, + { + "duration": "64.39047839999999", + "name": "power.typical_10_mobile/http://m.chiebukuro.yahoo.co.jp/detail/q10136829180" + }, + { + "duration": "57.245820466666686", + "name": "power.typical_10_mobile/http://m.ebay.com/itm/351157205404" + }, + { + "duration": "65.23663941666668", + "name": "power.typical_10_mobile/http://m.facebook.com/barackobama" + }, + { + "duration": "62.4100658", + "name": "power.typical_10_mobile/http://m.huffpost.com/us/entry/6004486" + }, + { + "duration": "62.212606083333334", + "name": "power.typical_10_mobile/http://m.ynet.co.il" + }, + { + "duration": "62.68811421666666", + "name": "power.typical_10_mobile/http://siriuslymeg.tumblr.com/" + }, + { + "duration": "57.50153171666667", + "name": "power.typical_10_mobile/http://wapbaike.baidu.com/" + }, + { + "duration": "58.97407369999999", + "name": "power.typical_10_mobile/http://www.cnn.com/2014/03/31/showbiz/tv/himym-finale/index.html" + }, + { + "duration": "63.66980021666666", + "name": "power.typical_10_mobile/http://www.rg.ru/2014/10/21/cska-site.html" + }, + { + "duration": "62.37853528333333", + "name": "power.typical_10_mobile/https://en.wikipedia.org/wiki/File:Rotating_earth_(large).gif" + }, + { + "duration": "13.255696093220335", + "name": "rasterize_and_record_micro.partial_invalidation/800_relpos_divs.html" + }, + { + "duration": "19.50659640000001", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/amazon.html" + }, + { + "duration": "11.106294258333337", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/blogger.html" + }, + { + "duration": "14.895659566666668", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/booking.html" + }, + { + "duration": "14.157721599999995", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/cnn.html" + }, + { + "duration": "9.645622133333337", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/ebay.html" + }, + { + "duration": "24.03670534999999", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/espn.html" + }, + { + "duration": "12.601975141666667", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/facebook.html" + }, + { + "duration": "21.210229733333325", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/gmail.html" + }, + { + "duration": "17.8354892", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/google.html" + }, + { + "duration": "15.042138266666672", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googlecalendar.html" + }, + { + "duration": "19.209764999999997", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googledocs.html" + }, + { + "duration": "16.098406208333333", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleimagesearch.html" + }, + { + "duration": "21.713479950000004", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/googleplus.html" + }, + { + "duration": "11.98567595833333", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/linkedin.html" + }, + { + "duration": "9.01860170833333", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/pinterest.html" + }, + { + "duration": "29.298682099999997", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/techcrunch.html" + }, + { + "duration": "20.98417083333333", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/twitter.html" + }, + { + "duration": "14.852985850000001", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/weather.html" + }, + { + "duration": "11.922956708333329", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/wordpress.html" + }, + { + "duration": "11.525540524999998", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahooanswers.html" + }, + { + "duration": "28.58345276666667", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoogames.html" + }, + { + "duration": "112.9260113833333", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html" + }, + { + "duration": "85.72044521666668", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/yahoosports.html" + }, + { + "duration": "29.213187016666655", + "name": "rasterize_and_record_micro.top_25/file://static_top_25/youtube.html" + }, + { + "duration": "29.341133315789467", + "name": "rendering.mobile/amazon_pinch" + }, + { + "duration": "26.054161105263162", + "name": "rendering.mobile/amazon_pinch_desktop_gpu_raster" + }, + { + "duration": "25.99429996491227", + "name": "rendering.mobile/analog_clock_svg" + }, + { + "duration": "29.347947263157884", + "name": "rendering.mobile/androidpolice_mobile" + }, + { + "duration": "26.784817175438604", + "name": "rendering.mobile/androidpolice_mobile_sync_scroll" + }, + { + "duration": "5.789607577083334", + "name": "rendering.mobile/animometer_webgl" + }, + { + "duration": "5.263783063265305", + "name": "rendering.mobile/aquarium" + }, + { + "duration": "38.12127053061224", + "name": "rendering.mobile/background_color_animation" + }, + { + "duration": "27.543808551020412", + "name": "rendering.mobile/background_color_animation_with_gradient" + }, + { + "duration": "19.11436661538461", + "name": "rendering.mobile/baidu_mobile" + }, + { + "duration": "17.533078961538468", + "name": "rendering.mobile/baidu_mobile_sync_scroll" + }, + { + "duration": "26.33392405769231", + "name": "rendering.mobile/balls_css_key_frame_animations" + }, + { + "duration": "29.511901923076927", + "name": "rendering.mobile/balls_css_transition_2_properties" + }, + { + "duration": "29.662963538461536", + "name": "rendering.mobile/balls_css_transition_40_properties" + }, + { + "duration": "29.595483499999997", + "name": "rendering.mobile/balls_css_transition_all_properties" + }, + { + "duration": "29.36249467307693", + "name": "rendering.mobile/balls_javascript_canvas" + }, + { + "duration": "29.094791038461537", + "name": "rendering.mobile/balls_javascript_css" + }, + { + "duration": "35.82739665384614", + "name": "rendering.mobile/balls_svg_animations" + }, + { + "duration": "36.06161625", + "name": "rendering.mobile/basic_stream" + }, + { + "duration": "22.92474157692307", + "name": "rendering.mobile/bing_mobile" + }, + { + "duration": "19.364980663461544", + "name": "rendering.mobile/bing_mobile_sync_scroll" + }, + { + "duration": "9.050939483673469", + "name": "rendering.mobile/blob" + }, + { + "duration": "38.10789823076924", + "name": "rendering.mobile/blogspot" + }, + { + "duration": "36.52867684615384", + "name": "rendering.mobile/blogspot_desktop_gpu_raster" + }, + { + "duration": "18.339349346153845", + "name": "rendering.mobile/blogspot_mobile" + }, + { + "duration": "16.875009788461533", + "name": "rendering.mobile/blogspot_mobile_sync_scroll" + }, + { + "duration": "39.9163040576923", + "name": "rendering.mobile/boingboing_mobile" + }, + { + "duration": "27.020806153846145", + "name": "rendering.mobile/booking.com" + }, + { + "duration": "25.03820176923076", + "name": "rendering.mobile/booking.com_desktop_gpu_raster" + }, + { + "duration": "18.99673567307693", + "name": "rendering.mobile/booking.com_mobile" + }, + { + "duration": "20.16257765384615", + "name": "rendering.mobile/booking.com_mobile_sync_scroll" + }, + { + "duration": "32.48449505263157", + "name": "rendering.mobile/booking_pinch" + }, + { + "duration": "29.438815052631586", + "name": "rendering.mobile/booking_pinch_desktop_gpu_raster" + }, + { + "duration": "21.655240461538476", + "name": "rendering.mobile/bouncing_balls_15" + }, + { + "duration": "20.108891999999994", + "name": "rendering.mobile/bouncing_balls_shadow" + }, + { + "duration": "20.029719096153844", + "name": "rendering.mobile/bouncing_clipped_rectangles" + }, + { + "duration": "21.08235580769231", + "name": "rendering.mobile/bouncing_gradient_circles" + }, + { + "duration": "17.23781751923077", + "name": "rendering.mobile/bouncing_png_images" + }, + { + "duration": "28.91448932692308", + "name": "rendering.mobile/bouncing_svg_images" + }, + { + "duration": "27.072729212765957", + "name": "rendering.mobile/canvas_05000_pixels_per_second" + }, + { + "duration": "27.006038404255314", + "name": "rendering.mobile/canvas_05000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.397579787234037", + "name": "rendering.mobile/canvas_10000_pixels_per_second" + }, + { + "duration": "26.821318085106377", + "name": "rendering.mobile/canvas_10000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.60649959574468", + "name": "rendering.mobile/canvas_15000_pixels_per_second" + }, + { + "duration": "27.081017680851065", + "name": "rendering.mobile/canvas_15000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.917157702127653", + "name": "rendering.mobile/canvas_20000_pixels_per_second" + }, + { + "duration": "27.19769036170213", + "name": "rendering.mobile/canvas_20000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "28.000487382978733", + "name": "rendering.mobile/canvas_30000_pixels_per_second" + }, + { + "duration": "27.39826714893617", + "name": "rendering.mobile/canvas_30000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "26.040289723404253", + "name": "rendering.mobile/canvas_40000_pixels_per_second" + }, + { + "duration": "25.127854063829787", + "name": "rendering.mobile/canvas_40000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "23.769509148936173", + "name": "rendering.mobile/canvas_50000_pixels_per_second" + }, + { + "duration": "23.037095063829785", + "name": "rendering.mobile/canvas_50000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "22.36634774468086", + "name": "rendering.mobile/canvas_60000_pixels_per_second" + }, + { + "duration": "21.282437765957447", + "name": "rendering.mobile/canvas_60000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "21.102009574468084", + "name": "rendering.mobile/canvas_75000_pixels_per_second" + }, + { + "duration": "19.991859702127655", + "name": "rendering.mobile/canvas_75000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "19.59968059574468", + "name": "rendering.mobile/canvas_90000_pixels_per_second" + }, + { + "duration": "18.724215148936167", + "name": "rendering.mobile/canvas_90000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "22.665043211538457", + "name": "rendering.mobile/canvas_animation_no_clear" + }, + { + "duration": "20.004008923076924", + "name": "rendering.mobile/canvas_arcs" + }, + { + "duration": "19.293225596153846", + "name": "rendering.mobile/canvas_font_cycler" + }, + { + "duration": "19.717842923076926", + "name": "rendering.mobile/canvas_lines" + }, + { + "duration": "21.068836134615385", + "name": "rendering.mobile/canvas_to_blob" + }, + { + "duration": "28.634411230769235", + "name": "rendering.mobile/capitolvolkswagen_mobile" + }, + { + "duration": "27.89577171153847", + "name": "rendering.mobile/capitolvolkswagen_mobile_sync_scroll" + }, + { + "duration": "22.20602420454546", + "name": "rendering.mobile/card_expansion" + }, + { + "duration": "24.270744568181826", + "name": "rendering.mobile/card_expansion_animated" + }, + { + "duration": "23.783354977272733", + "name": "rendering.mobile/card_expansion_images_text" + }, + { + "duration": "21.67107145454546", + "name": "rendering.mobile/card_flying" + }, + { + "duration": "14.112007053191492", + "name": "rendering.mobile/cats_unscaled" + }, + { + "duration": "13.057023691489356", + "name": "rendering.mobile/cats_viewport_width" + }, + { + "duration": "24.80217840384616", + "name": "rendering.mobile/chip_tune" + }, + { + "duration": "45.16864417307693", + "name": "rendering.mobile/cnn_article_mobile" + }, + { + "duration": "44.43502398076925", + "name": "rendering.mobile/cnn_article_mobile_sync_scroll" + }, + { + "duration": "21.052123038461538", + "name": "rendering.mobile/cnn_mobile" + }, + { + "duration": "21.35466438461539", + "name": "rendering.mobile/cnn_mobile_sync_scroll" + }, + { + "duration": "39.44312235555555", + "name": "rendering.mobile/cnn_pathological" + }, + { + "duration": "38.93837584210526", + "name": "rendering.mobile/cnn_pinch" + }, + { + "duration": "37.80607400000001", + "name": "rendering.mobile/cnn_pinch_desktop_gpu_raster" + }, + { + "duration": "29.57825884615384", + "name": "rendering.mobile/compositor_heavy_animation" + }, + { + "duration": "22.743929886363638", + "name": "rendering.mobile/coordinated_animation" + }, + { + "duration": "26.348093365384617", + "name": "rendering.mobile/crafty_mind" + }, + { + "duration": "28.8859227254902", + "name": "rendering.mobile/css_animations_many_keyframes" + }, + { + "duration": "27.852970647058818", + "name": "rendering.mobile/css_animations_simultaneous_inline_style" + }, + { + "duration": "28.577126196078428", + "name": "rendering.mobile/css_animations_simultaneous_new_element" + }, + { + "duration": "27.70570245098039", + "name": "rendering.mobile/css_animations_simultaneous_style_element" + }, + { + "duration": "34.880054", + "name": "rendering.mobile/css_animations_simultaneous_updating_class" + }, + { + "duration": "26.37174911764706", + "name": "rendering.mobile/css_animations_staggered_infinite_iterations" + }, + { + "duration": "30.593213352941184", + "name": "rendering.mobile/css_animations_staggered_inline_style" + }, + { + "duration": "31.59856996078432", + "name": "rendering.mobile/css_animations_staggered_new_element" + }, + { + "duration": "62.4097879215686", + "name": "rendering.mobile/css_animations_staggered_style_element" + }, + { + "duration": "48.35077492156863", + "name": "rendering.mobile/css_animations_staggered_updating_class" + }, + { + "duration": "58.57746405882355", + "name": "rendering.mobile/css_animations_triggered_inline_style" + }, + { + "duration": "49.00698280392157", + "name": "rendering.mobile/css_animations_triggered_new_element" + }, + { + "duration": "89.23013015686276", + "name": "rendering.mobile/css_animations_triggered_style_element" + }, + { + "duration": "62.35913450980394", + "name": "rendering.mobile/css_animations_triggered_updating_class" + }, + { + "duration": "56.83898917647059", + "name": "rendering.mobile/css_transitions_inline_style" + }, + { + "duration": "46.702051647058816", + "name": "rendering.mobile/css_transitions_new_element" + }, + { + "duration": "39.39574711764706", + "name": "rendering.mobile/css_transitions_staggered_inline_style" + }, + { + "duration": "28.938629745098048", + "name": "rendering.mobile/css_transitions_staggered_new_element" + }, + { + "duration": "39.834643431372555", + "name": "rendering.mobile/css_transitions_staggered_style_element" + }, + { + "duration": "46.25937050980392", + "name": "rendering.mobile/css_transitions_staggered_updating_class" + }, + { + "duration": "39.04988656862745", + "name": "rendering.mobile/css_transitions_style_element" + }, + { + "duration": "29.638031901960787", + "name": "rendering.mobile/css_transitions_triggered_inline_style" + }, + { + "duration": "32.94149964705881", + "name": "rendering.mobile/css_transitions_triggered_new_element" + }, + { + "duration": "50.93289684313722", + "name": "rendering.mobile/css_transitions_triggered_style_element" + }, + { + "duration": "86.36406637254902", + "name": "rendering.mobile/css_transitions_triggered_updating_class" + }, + { + "duration": "74.41728568627452", + "name": "rendering.mobile/css_transitions_updating_class" + }, + { + "duration": "65.3003653137255", + "name": "rendering.mobile/css_value_type_color" + }, + { + "duration": "95.2882173137255", + "name": "rendering.mobile/css_value_type_filter" + }, + { + "duration": "42.54464109803922", + "name": "rendering.mobile/css_value_type_length" + }, + { + "duration": "312.9624935882353", + "name": "rendering.mobile/css_value_type_length_complex" + }, + { + "duration": "29.799692980392155", + "name": "rendering.mobile/css_value_type_length_simple" + }, + { + "duration": "41.55756037254903", + "name": "rendering.mobile/css_value_type_path" + }, + { + "duration": "56.018719411764714", + "name": "rendering.mobile/css_value_type_shadow" + }, + { + "duration": "49.159544627450984", + "name": "rendering.mobile/css_value_type_transform_complex" + }, + { + "duration": "91.97470168627453", + "name": "rendering.mobile/css_value_type_transform_simple" + }, + { + "duration": "103.99900092156862", + "name": "rendering.mobile/cuteoverload_mobile" + }, + { + "duration": "69.52930352941175", + "name": "rendering.mobile/deviantart_mobile" + }, + { + "duration": "34.253059529411765", + "name": "rendering.mobile/deviantart_mobile_sync_scroll" + }, + { + "duration": "5.727505841666669", + "name": "rendering.mobile/dynamic_cube_map" + }, + { + "duration": "5.756727175000001", + "name": "rendering.mobile/earth" + }, + { + "duration": "19.097833647058824", + "name": "rendering.mobile/ebay" + }, + { + "duration": "17.46403050980392", + "name": "rendering.mobile/ebay_desktop_gpu_raster" + }, + { + "duration": "24.7893034117647", + "name": "rendering.mobile/ebay_mobile" + }, + { + "duration": "23.730393901960788", + "name": "rendering.mobile/ebay_mobile_sync_scroll" + }, + { + "duration": "32.782306421052624", + "name": "rendering.mobile/ebay_pinch" + }, + { + "duration": "31.169536789473682", + "name": "rendering.mobile/ebay_pinch_desktop_gpu_raster" + }, + { + "duration": "39.7939034", + "name": "rendering.mobile/ebay_scroll" + }, + { + "duration": "25.995283450980388", + "name": "rendering.mobile/effect_games" + }, + { + "duration": "16.48990105882353", + "name": "rendering.mobile/espn" + }, + { + "duration": "14.723379882352944", + "name": "rendering.mobile/espn_desktop_gpu_raster" + }, + { + "duration": "31.37457115909092", + "name": "rendering.mobile/espn_pathological" + }, + { + "duration": "37.27421952631579", + "name": "rendering.mobile/espn_pinch" + }, + { + "duration": "36.618955578947364", + "name": "rendering.mobile/espn_pinch_desktop_gpu_raster" + }, + { + "duration": "26.20366414583334", + "name": "rendering.mobile/extra_large_texture_uploads" + }, + { + "duration": "28.336947372549016", + "name": "rendering.mobile/facebook" + }, + { + "duration": "28.340273764705884", + "name": "rendering.mobile/facebook_desktop_gpu_raster" + }, + { + "duration": "23.06542843137255", + "name": "rendering.mobile/facebook_mobile" + }, + { + "duration": "23.437752019607842", + "name": "rendering.mobile/facebook_mobile_sync_scroll" + }, + { + "duration": "29.869838368421053", + "name": "rendering.mobile/facebook_pinch" + }, + { + "duration": "26.997607421052642", + "name": "rendering.mobile/facebook_pinch_desktop_gpu_raster" + }, + { + "duration": "20.636915647058824", + "name": "rendering.mobile/fill_shapes" + }, + { + "duration": "26.264729235294116", + "name": "rendering.mobile/filter_terrain_svg" + }, + { + "duration": "36.097841", + "name": "rendering.mobile/flickr_scroll" + }, + { + "duration": "22.28931472727273", + "name": "rendering.mobile/font_wipe" + }, + { + "duration": "20.006805529411757", + "name": "rendering.mobile/geo_apis" + }, + { + "duration": "35.30246139215687", + "name": "rendering.mobile/gmail" + }, + { + "duration": "35.01093390196079", + "name": "rendering.mobile/gmail_desktop_gpu_raster" + }, + { + "duration": "39.7940074736842", + "name": "rendering.mobile/gmail_pinch" + }, + { + "duration": "36.09664731578946", + "name": "rendering.mobile/gmail_pinch_desktop_gpu_raster" + }, + { + "duration": "28.382879215686273", + "name": "rendering.mobile/google_calendar" + }, + { + "duration": "27.911785274509803", + "name": "rendering.mobile/google_calendar_desktop_gpu_raster" + }, + { + "duration": "33.246936842105264", + "name": "rendering.mobile/google_calendar_pinch" + }, + { + "duration": "30.351618315789473", + "name": "rendering.mobile/google_calendar_pinch_desktop_gpu_raster" + }, + { + "duration": "49.629602019607844", + "name": "rendering.mobile/google_docs" + }, + { + "duration": "50.03094049019606", + "name": "rendering.mobile/google_docs_desktop_gpu_raster" + }, + { + "duration": "33.84461336842106", + "name": "rendering.mobile/google_image_pinch" + }, + { + "duration": "30.827028157894734", + "name": "rendering.mobile/google_image_pinch_desktop_gpu_raster" + }, + { + "duration": "36.53977588235295", + "name": "rendering.mobile/google_image_search" + }, + { + "duration": "35.945629705882354", + "name": "rendering.mobile/google_image_search_desktop_gpu_raster" + }, + { + "duration": "26.36629375", + "name": "rendering.mobile/google_news_ios" + }, + { + "duration": "32.51577392156864", + "name": "rendering.mobile/google_news_mobile" + }, + { + "duration": "31.875256058823524", + "name": "rendering.mobile/google_news_mobile_sync_scroll" + }, + { + "duration": "42.13466994117646", + "name": "rendering.mobile/google_plus" + }, + { + "duration": "42.25526937254901", + "name": "rendering.mobile/google_plus_desktop_gpu_raster" + }, + { + "duration": "27.080830686274503", + "name": "rendering.mobile/google_plus_mobile" + }, + { + "duration": "26.284100647058825", + "name": "rendering.mobile/google_plus_mobile_sync_scroll" + }, + { + "duration": "28.81550836842105", + "name": "rendering.mobile/google_search_pinch" + }, + { + "duration": "26.24149342105264", + "name": "rendering.mobile/google_search_pinch_desktop_gpu_raster" + }, + { + "duration": "19.073119392156865", + "name": "rendering.mobile/google_web_search" + }, + { + "duration": "17.341037480392156", + "name": "rendering.mobile/google_web_search_desktop_gpu_raster" + }, + { + "duration": "19.949745431372552", + "name": "rendering.mobile/google_web_search_mobile" + }, + { + "duration": "18.878674196078432", + "name": "rendering.mobile/google_web_search_mobile_sync_scroll" + }, + { + "duration": "22.140670901960792", + "name": "rendering.mobile/gsp.ro_mobile" + }, + { + "duration": "20.770584627450976", + "name": "rendering.mobile/gsp.ro_mobile_sync_scroll" + }, + { + "duration": "25.15886615909091", + "name": "rendering.mobile/guardian_pathological" + }, + { + "duration": "33.64647917647059", + "name": "rendering.mobile/guimark_vector_chart" + }, + { + "duration": "22.404259", + "name": "rendering.mobile/gws_boogie_expansion" + }, + { + "duration": "22.82478286363636", + "name": "rendering.mobile/gws_google_expansion" + }, + { + "duration": "23.573140039215684", + "name": "rendering.mobile/hakim" + }, + { + "duration": "23.67961047727272", + "name": "rendering.mobile/horizontal_vertical_expansion" + }, + { + "duration": "40.20451971153846", + "name": "rendering.mobile/ie_chalkboard" + }, + { + "duration": "37.40646729411764", + "name": "rendering.mobile/ie_pirate_mark" + }, + { + "duration": "34.56065447727272", + "name": "rendering.mobile/infinite_scrolling" + }, + { + "duration": "25.087927882352936", + "name": "rendering.mobile/jarro_doverson" + }, + { + "duration": "25.72107784313726", + "name": "rendering.mobile/kevs_3d" + }, + { + "duration": "27.672757176470583", + "name": "rendering.mobile/keyframed_animations" + }, + { + "duration": "27.27932883333334", + "name": "rendering.mobile/large_texture_uploads" + }, + { + "duration": "38.64680811363636", + "name": "rendering.mobile/latimes_pathological" + }, + { + "duration": "21.519666823529416", + "name": "rendering.mobile/linkedin" + }, + { + "duration": "19.588728901960785", + "name": "rendering.mobile/linkedin_desktop_gpu_raster" + }, + { + "duration": "23.789640333333338", + "name": "rendering.mobile/linkedin_mobile" + }, + { + "duration": "24.039456725490197", + "name": "rendering.mobile/linkedin_mobile_sync_scroll" + }, + { + "duration": "31.232848886363623", + "name": "rendering.mobile/linkedin_pathological" + }, + { + "duration": "29.03943236842105", + "name": "rendering.mobile/linkedin_pinch" + }, + { + "duration": "26.51477815789474", + "name": "rendering.mobile/linkedin_pinch_desktop_gpu_raster" + }, + { + "duration": "19.159037045454546", + "name": "rendering.mobile/list_animation_simple" + }, + { + "duration": "33.570327704545456", + "name": "rendering.mobile/list_recycle_transform" + }, + { + "duration": "24.95482347058823", + "name": "rendering.mobile/man_in_blue" + }, + { + "duration": "34.02968207843137", + "name": "rendering.mobile/many_images" + }, + { + "duration": "5.782965824999999", + "name": "rendering.mobile/many_planets_deep" + }, + { + "duration": "45.03647960416666", + "name": "rendering.mobile/maps_perf_test" + }, + { + "duration": "23.74194879545455", + "name": "rendering.mobile/mask_transition_animation" + }, + { + "duration": "22.41856390909091", + "name": "rendering.mobile/masonry" + }, + { + "duration": "30.51278116666667", + "name": "rendering.mobile/medium_texture_uploads" + }, + { + "duration": "22.695113607843144", + "name": "rendering.mobile/megi_dish" + }, + { + "duration": "25.943913156862738", + "name": "rendering.mobile/microsoft_asteroid_belt" + }, + { + "duration": "22.455089882352937", + "name": "rendering.mobile/microsoft_fireflies" + }, + { + "duration": "23.54788215686274", + "name": "rendering.mobile/microsoft_fish_ie_tank" + }, + { + "duration": "23.493530450980394", + "name": "rendering.mobile/microsoft_snow" + }, + { + "duration": "23.219627117647057", + "name": "rendering.mobile/microsoft_speed_reading" + }, + { + "duration": "23.499787274509803", + "name": "rendering.mobile/microsoft_tweet_map" + }, + { + "duration": "31.540959156862744", + "name": "rendering.mobile/microsoft_video_city" + }, + { + "duration": "22.5547732745098", + "name": "rendering.mobile/microsoft_worker_fountains" + }, + { + "duration": "21.640479843137257", + "name": "rendering.mobile/mix_10k" + }, + { + "duration": "30.384050117647053", + "name": "rendering.mobile/mix_blend_mode_animation_difference" + }, + { + "duration": "26.928567196078436", + "name": "rendering.mobile/mix_blend_mode_animation_hue" + }, + { + "duration": "35.021297156862744", + "name": "rendering.mobile/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "30.09406009803922", + "name": "rendering.mobile/mix_blend_mode_animation_screen" + }, + { + "duration": "16.961271019607846", + "name": "rendering.mobile/mlb_mobile" + }, + { + "duration": "16.818421470588234", + "name": "rendering.mobile/mlb_mobile_sync_scroll" + }, + { + "duration": "19.65778802272727", + "name": "rendering.mobile/mobile_news_sandbox" + }, + { + "duration": "32.061840843137254", + "name": "rendering.mobile/motion_mark_canvas_fill_shapes" + }, + { + "duration": "33.59855758823529", + "name": "rendering.mobile/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "90.84168896078432", + "name": "rendering.mobile/motion_mark_focus" + }, + { + "duration": "5.838184987500001", + "name": "rendering.mobile/nvidia_vertex_buffer_object" + }, + { + "duration": "39.17759592", + "name": "rendering.mobile/nyc_gov_scroll" + }, + { + "duration": "90.55883611764708", + "name": "rendering.mobile/nytimes_mobile" + }, + { + "duration": "36.87142461999999", + "name": "rendering.mobile/nytimes_scroll" + }, + { + "duration": "43.029484215686274", + "name": "rendering.mobile/overlay_background_color_css_transitions_page" + }, + { + "duration": "24.978122318181818", + "name": "rendering.mobile/parallax_effect" + }, + { + "duration": "5.729800233333333", + "name": "rendering.mobile/particles" + }, + { + "duration": "35.96384186363637", + "name": "rendering.mobile/pbs_pathological" + }, + { + "duration": "18.698105659090917", + "name": "rendering.mobile/physical_simulation" + }, + { + "duration": "34.868267882352946", + "name": "rendering.mobile/pinterest" + }, + { + "duration": "35.50329182352941", + "name": "rendering.mobile/pinterest_mobile" + }, + { + "duration": "35.755550529411764", + "name": "rendering.mobile/pinterest_mobile_sync_scroll" + }, + { + "duration": "19.942987352941177", + "name": "rendering.mobile/put_get_image_data" + }, + { + "duration": "27.471840680851074", + "name": "rendering.mobile/raf" + }, + { + "duration": "27.10564119148935", + "name": "rendering.mobile/raf_animation" + }, + { + "duration": "26.623981", + "name": "rendering.mobile/raf_canvas" + }, + { + "duration": "27.818764765957443", + "name": "rendering.mobile/raf_touch_animation" + }, + { + "duration": "37.62733470454546", + "name": "rendering.mobile/recode_pathological" + }, + { + "duration": "31.272377620000007", + "name": "rendering.mobile/reddit_mobile" + }, + { + "duration": "23.60933108", + "name": "rendering.mobile/runway" + }, + { + "duration": "5.779116644680851", + "name": "rendering.mobile/san_angeles" + }, + { + "duration": "23.33717570212767", + "name": "rendering.mobile/second_batch_js_heavy" + }, + { + "duration": "19.00569394680851", + "name": "rendering.mobile/second_batch_js_light" + }, + { + "duration": "19.227557914893612", + "name": "rendering.mobile/second_batch_js_medium" + }, + { + "duration": "25.762527740000007", + "name": "rendering.mobile/sfgate_mobile" + }, + { + "duration": "24.90392328", + "name": "rendering.mobile/sfgate_mobile_sync_scroll" + }, + { + "duration": "33.32818961363636", + "name": "rendering.mobile/silk_finance" + }, + { + "duration": "27.714919085106377", + "name": "rendering.mobile/simple_text_page" + }, + { + "duration": "20.273325297872343", + "name": "rendering.mobile/simple_touch_drag" + }, + { + "duration": "30.410717419999997", + "name": "rendering.mobile/slashdot_mobile" + }, + { + "duration": "19.92312593181818", + "name": "rendering.mobile/slide_drawer" + }, + { + "duration": "31.247145595744673", + "name": "rendering.mobile/small_texture_uploads" + }, + { + "duration": "27.84613124", + "name": "rendering.mobile/smash_cat" + }, + { + "duration": "21.271625399999998", + "name": "rendering.mobile/spielzeugz" + }, + { + "duration": "21.500537977272725", + "name": "rendering.mobile/sticky_using_webkit" + }, + { + "duration": "37.67723186363636", + "name": "rendering.mobile/stress_hidey_bars" + }, + { + "duration": "21.773221379999995", + "name": "rendering.mobile/stroke_shapes" + }, + { + "duration": "35.17739097727272", + "name": "rendering.mobile/svg_icon_raster" + }, + { + "duration": "15.973672056818184", + "name": "rendering.mobile/swipe_action" + }, + { + "duration": "22.639817386363635", + "name": "rendering.mobile/swipe_to_dismiss" + }, + { + "duration": "28.249280021276597", + "name": "rendering.mobile/sync_scroll_offset" + }, + { + "duration": "52.06401728571429", + "name": "rendering.mobile/techcrunch" + }, + { + "duration": "50.450015729166644", + "name": "rendering.mobile/techcrunch_desktop_gpu_raster" + }, + { + "duration": "22.023380520000003", + "name": "rendering.mobile/techcrunch_mobile" + }, + { + "duration": "20.880047679999997", + "name": "rendering.mobile/techcrunch_mobile_sync_scroll" + }, + { + "duration": "28.75954887234042", + "name": "rendering.mobile/text_05000_pixels_per_second" + }, + { + "duration": "27.917519063829786", + "name": "rendering.mobile/text_05000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "29.96455504255319", + "name": "rendering.mobile/text_10000_pixels_per_second" + }, + { + "duration": "28.7507625106383", + "name": "rendering.mobile/text_10000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "30.368394659574463", + "name": "rendering.mobile/text_15000_pixels_per_second" + }, + { + "duration": "29.043803765957442", + "name": "rendering.mobile/text_15000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "30.981438489361697", + "name": "rendering.mobile/text_20000_pixels_per_second" + }, + { + "duration": "29.57334987234043", + "name": "rendering.mobile/text_20000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "31.613731702127648", + "name": "rendering.mobile/text_30000_pixels_per_second" + }, + { + "duration": "30.03895289361703", + "name": "rendering.mobile/text_30000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "28.9882345319149", + "name": "rendering.mobile/text_40000_pixels_per_second" + }, + { + "duration": "27.152157127659567", + "name": "rendering.mobile/text_40000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "25.801533914893618", + "name": "rendering.mobile/text_50000_pixels_per_second" + }, + { + "duration": "24.43239946808511", + "name": "rendering.mobile/text_50000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "23.962020787234046", + "name": "rendering.mobile/text_60000_pixels_per_second" + }, + { + "duration": "22.54777455319149", + "name": "rendering.mobile/text_60000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "22.579263042553183", + "name": "rendering.mobile/text_75000_pixels_per_second" + }, + { + "duration": "21.360744446808507", + "name": "rendering.mobile/text_75000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "21.25218210638298", + "name": "rendering.mobile/text_90000_pixels_per_second" + }, + { + "duration": "19.872735212765953", + "name": "rendering.mobile/text_90000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.340021510638298", + "name": "rendering.mobile/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "25.27512465957447", + "name": "rendering.mobile/text_constant_full_page_raster_05000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.401923127659572", + "name": "rendering.mobile/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "25.572935531914897", + "name": "rendering.mobile/text_constant_full_page_raster_10000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.913665765957443", + "name": "rendering.mobile/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "25.751572255319147", + "name": "rendering.mobile/text_constant_full_page_raster_15000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "28.251759170212765", + "name": "rendering.mobile/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "25.982612297872336", + "name": "rendering.mobile/text_constant_full_page_raster_20000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "28.41671306382979", + "name": "rendering.mobile/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "26.191134659574477", + "name": "rendering.mobile/text_constant_full_page_raster_30000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "27.21561491489361", + "name": "rendering.mobile/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "25.19680744680851", + "name": "rendering.mobile/text_constant_full_page_raster_40000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "24.514229957446815", + "name": "rendering.mobile/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "22.684990957446807", + "name": "rendering.mobile/text_constant_full_page_raster_50000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "26.40954712765958", + "name": "rendering.mobile/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "20.9911140212766", + "name": "rendering.mobile/text_constant_full_page_raster_60000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "20.235782361702128", + "name": "rendering.mobile/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "22.946062893617018", + "name": "rendering.mobile/text_constant_full_page_raster_75000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "19.06416429787234", + "name": "rendering.mobile/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "18.120105276595744", + "name": "rendering.mobile/text_constant_full_page_raster_90000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "20.434260999999996", + "name": "rendering.mobile/text_hover_05000_pixels_per_second" + }, + { + "duration": "20.451995744680847", + "name": "rendering.mobile/text_hover_05000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "20.338325744680848", + "name": "rendering.mobile/text_hover_10000_pixels_per_second" + }, + { + "duration": "20.36557768085106", + "name": "rendering.mobile/text_hover_10000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "20.42906182978724", + "name": "rendering.mobile/text_hover_15000_pixels_per_second" + }, + { + "duration": "20.225606999999993", + "name": "rendering.mobile/text_hover_15000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "20.514491638297866", + "name": "rendering.mobile/text_hover_20000_pixels_per_second" + }, + { + "duration": "20.15768878723404", + "name": "rendering.mobile/text_hover_20000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "20.371316680851066", + "name": "rendering.mobile/text_hover_30000_pixels_per_second" + }, + { + "duration": "20.351732659574466", + "name": "rendering.mobile/text_hover_30000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "19.09484661702128", + "name": "rendering.mobile/text_hover_40000_pixels_per_second" + }, + { + "duration": "19.063366063829786", + "name": "rendering.mobile/text_hover_40000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "17.82487268085107", + "name": "rendering.mobile/text_hover_50000_pixels_per_second" + }, + { + "duration": "17.649837170212766", + "name": "rendering.mobile/text_hover_50000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "17.016724255319147", + "name": "rendering.mobile/text_hover_60000_pixels_per_second" + }, + { + "duration": "17.045624085106386", + "name": "rendering.mobile/text_hover_60000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "16.325106170212766", + "name": "rendering.mobile/text_hover_75000_pixels_per_second" + }, + { + "duration": "16.15029017021277", + "name": "rendering.mobile/text_hover_75000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "15.717707478723403", + "name": "rendering.mobile/text_hover_90000_pixels_per_second" + }, + { + "duration": "15.656940042553193", + "name": "rendering.mobile/text_hover_90000_pixels_per_second_desktop_gpu_raster" + }, + { + "duration": "35.984204260000006", + "name": "rendering.mobile/theverge_article_mobile" + }, + { + "duration": "35.29241742", + "name": "rendering.mobile/theverge_article_mobile_sync_scroll" + }, + { + "duration": "22.780288679999998", + "name": "rendering.mobile/theverge_mobile" + }, + { + "duration": "22.930250240000007", + "name": "rendering.mobile/theverge_mobile_sync_scroll" + }, + { + "duration": "26.544942022727277", + "name": "rendering.mobile/toggle_drawer" + }, + { + "duration": "28.50480059574467", + "name": "rendering.mobile/touch_handler_scrolling" + }, + { + "duration": "31.102286799999987", + "name": "rendering.mobile/transform_transitions" + }, + { + "duration": "30.33988155999999", + "name": "rendering.mobile/transform_transitions_js_block" + }, + { + "duration": "25.10539366", + "name": "rendering.mobile/twitter" + }, + { + "duration": "22.97974698", + "name": "rendering.mobile/twitter_desktop_gpu_raster" + }, + { + "duration": "33.890595166666664", + "name": "rendering.mobile/twitter_pinch" + }, + { + "duration": "30.604881777777777", + "name": "rendering.mobile/twitter_pinch_desktop_gpu_raster" + }, + { + "duration": "24.859755818181824", + "name": "rendering.mobile/update_history_state" + }, + { + "duration": "38.74125613999998", + "name": "rendering.mobile/usatoday_mobile" + }, + { + "duration": "36.088973460000005", + "name": "rendering.mobile/usatoday_mobile_sync_scroll" + }, + { + "duration": "24.87695840909091", + "name": "rendering.mobile/vertical_expansion" + }, + { + "duration": "30.792588680851072", + "name": "rendering.mobile/weather.com" + }, + { + "duration": "29.552285306122453", + "name": "rendering.mobile/weather.com_desktop_gpu_raster" + }, + { + "duration": "44.86782222222221", + "name": "rendering.mobile/weather_pinch" + }, + { + "duration": "41.68619666666667", + "name": "rendering.mobile/weather_pinch_desktop_gpu_raster" + }, + { + "duration": "29.660354239999993", + "name": "rendering.mobile/web_animation_value_type_color" + }, + { + "duration": "28.24523242", + "name": "rendering.mobile/web_animation_value_type_length_3d" + }, + { + "duration": "29.10765554000001", + "name": "rendering.mobile/web_animation_value_type_length_complex" + }, + { + "duration": "29.656485439999987", + "name": "rendering.mobile/web_animation_value_type_length_simple" + }, + { + "duration": "30.431331280000006", + "name": "rendering.mobile/web_animation_value_type_path" + }, + { + "duration": "27.317870739999993", + "name": "rendering.mobile/web_animation_value_type_shadow" + }, + { + "duration": "27.893964299999997", + "name": "rendering.mobile/web_animation_value_type_transform_complex" + }, + { + "duration": "28.27138308", + "name": "rendering.mobile/web_animation_value_type_transform_simple" + }, + { + "duration": "30.748335559999997", + "name": "rendering.mobile/web_animations_many_keyframes" + }, + { + "duration": "28.603182979999993", + "name": "rendering.mobile/web_animations_set_current_time" + }, + { + "duration": "29.049554059999995", + "name": "rendering.mobile/web_animations_simultaneous" + }, + { + "duration": "30.535248719999995", + "name": "rendering.mobile/web_animations_staggered_chaining" + }, + { + "duration": "27.133919939999995", + "name": "rendering.mobile/web_animations_staggered_infinite_iterations" + }, + { + "duration": "30.750542699999997", + "name": "rendering.mobile/web_animations_staggered_triggering_page" + }, + { + "duration": "33.813109419999996", + "name": "rendering.mobile/wikipedia" + }, + { + "duration": "26.058306960000003", + "name": "rendering.mobile/wikipedia_delayed_scroll_start" + }, + { + "duration": "26.299913619999998", + "name": "rendering.mobile/wikipedia_delayed_scroll_start_sync_scroll" + }, + { + "duration": "33.68655296", + "name": "rendering.mobile/wikipedia_desktop_gpu_raster" + }, + { + "duration": "25.97258190000001", + "name": "rendering.mobile/wikipedia_mobile" + }, + { + "duration": "26.32137323999999", + "name": "rendering.mobile/wikipedia_mobile_sync_scroll" + }, + { + "duration": "40.7665784", + "name": "rendering.mobile/wordpress" + }, + { + "duration": "38.93617841999999", + "name": "rendering.mobile/wordpress_desktop_gpu_raster" + }, + { + "duration": "37.86740561999999", + "name": "rendering.mobile/wordpress_mobile" + }, + { + "duration": "37.38060232000001", + "name": "rendering.mobile/wordpress_mobile_sync_scroll" + }, + { + "duration": "37.94390764", + "name": "rendering.mobile/worldjournal_mobile" + }, + { + "duration": "38.35215835999999", + "name": "rendering.mobile/worldjournal_mobile_sync_scroll" + }, + { + "duration": "37.79652136363636", + "name": "rendering.mobile/wow_wiki_pathological" + }, + { + "duration": "46.97339012244899", + "name": "rendering.mobile/wowwiki_mobile" + }, + { + "duration": "46.21493371428571", + "name": "rendering.mobile/wowwiki_mobile_sync_scroll" + }, + { + "duration": "22.069057200000003", + "name": "rendering.mobile/wsj_mobile" + }, + { + "duration": "20.5240269", + "name": "rendering.mobile/wsj_mobile_sync_scroll" + }, + { + "duration": "22.098378679999996", + "name": "rendering.mobile/yahoo_answers" + }, + { + "duration": "20.501370100000003", + "name": "rendering.mobile/yahoo_answers_desktop_gpu_raster" + }, + { + "duration": "24.801385820000004", + "name": "rendering.mobile/yahoo_answers_mobile" + }, + { + "duration": "26.4597648", + "name": "rendering.mobile/yahoo_answers_mobile_sync_scroll" + }, + { + "duration": "34.70652144", + "name": "rendering.mobile/yahoo_games" + }, + { + "duration": "34.24327786", + "name": "rendering.mobile/yahoo_games_desktop_gpu_raster" + }, + { + "duration": "39.32545022222222", + "name": "rendering.mobile/yahoo_games_pinch" + }, + { + "duration": "36.93065950000001", + "name": "rendering.mobile/yahoo_games_pinch_desktop_gpu_raster" + }, + { + "duration": "26.889744900000004", + "name": "rendering.mobile/yahoo_news" + }, + { + "duration": "25.210249879999996", + "name": "rendering.mobile/yahoo_news_desktop_gpu_raster" + }, + { + "duration": "25.62603016000001", + "name": "rendering.mobile/yahoo_news_mobile" + }, + { + "duration": "24.540794199999997", + "name": "rendering.mobile/yahoo_news_mobile_sync_scroll" + }, + { + "duration": "38.6499435", + "name": "rendering.mobile/yahoo_news_pinch" + }, + { + "duration": "35.24173011111111", + "name": "rendering.mobile/yahoo_news_pinch_desktop_gpu_raster" + }, + { + "duration": "27.506845780000003", + "name": "rendering.mobile/yahoo_sports" + }, + { + "duration": "26.549425460000002", + "name": "rendering.mobile/yahoo_sports_desktop_gpu_raster" + }, + { + "duration": "33.326363318181805", + "name": "rendering.mobile/yahoo_sports_pathological" + }, + { + "duration": "55.777929111111106", + "name": "rendering.mobile/yahoo_sports_pinch" + }, + { + "duration": "52.34752677777778", + "name": "rendering.mobile/yahoo_sports_pinch_desktop_gpu_raster" + }, + { + "duration": "30.54288938888889", + "name": "rendering.mobile/youtube" + }, + { + "duration": "30.332753904761915", + "name": "rendering.mobile/youtube_desktop_gpu_raster" + }, + { + "duration": "17.257728", + "name": "rendering.mobile/youtube_mobile" + }, + { + "duration": "15.70759307", + "name": "rendering.mobile/youtube_mobile_sync_scroll" + }, + { + "duration": "34.53229438888889", + "name": "rendering.mobile/youtube_pinch" + }, + { + "duration": "32.239342444444446", + "name": "rendering.mobile/youtube_pinch_desktop_gpu_raster" + }, + { + "duration": "28.479548808510636", + "name": "rendering.mobile/yuv_decoding" + }, + { + "duration": "29.71611604255319", + "name": "rendering.mobile/yuv_decoding_gpu_rasterization_and_decoding" + }, + { + "duration": "32.35079602272726", + "name": "rendering.mobile/zdnet_pathological" + }, + { + "duration": "22.948478863636357", + "name": "rendering.mobile/zoom_in_animation" + }, + { + "duration": "18.799325103275866", + "name": "scheduler.tough_scheduling_cases/raf" + }, + { + "duration": "19.206051087719295", + "name": "scheduler.tough_scheduling_cases/raf_animation" + }, + { + "duration": "18.377707333333333", + "name": "scheduler.tough_scheduling_cases/raf_canvas" + }, + { + "duration": "19.20640322807018", + "name": "scheduler.tough_scheduling_cases/raf_touch_animation" + }, + { + "duration": "11.874989918181816", + "name": "scheduler.tough_scheduling_cases/second_batch_js_heavy" + }, + { + "duration": "11.683113199999998", + "name": "scheduler.tough_scheduling_cases/second_batch_js_light" + }, + { + "duration": "11.851276027272727", + "name": "scheduler.tough_scheduling_cases/second_batch_js_medium" + }, + { + "duration": "29.872416683333324", + "name": "scheduler.tough_scheduling_cases/simple_text_page" + }, + { + "duration": "14.140314789473683", + "name": "scheduler.tough_scheduling_cases/simple_touch_drag" + }, + { + "duration": "18.88684450909091", + "name": "scheduler.tough_scheduling_cases/sync_scroll_offset" + }, + { + "duration": "19.297371916666673", + "name": "scheduler.tough_scheduling_cases/touch_handler_scrolling" + }, + { + "duration": "14.938089", + "name": "smoothness.gpu_rasterization.polymer/core_scroll_header_panel" + }, + { + "duration": "18.91615", + "name": "smoothness.gpu_rasterization.polymer/paper_button" + }, + { + "duration": "27.555199", + "name": "smoothness.gpu_rasterization.polymer/paper_calculator" + }, + { + "duration": "23.664267", + "name": "smoothness.gpu_rasterization.polymer/paper_checkbox" + }, + { + "duration": "18.841707", + "name": "smoothness.gpu_rasterization.polymer/paper_fab" + }, + { + "duration": "43.18708", + "name": "smoothness.gpu_rasterization.polymer/paper_icon_button" + }, + { + "duration": "20.55393", + "name": "smoothness.gpu_rasterization.polymer/paper_shadow" + }, + { + "duration": "56.13814", + "name": "smoothness.gpu_rasterization.polymer/paper_tabs" + }, + { + "duration": "14.650763", + "name": "smoothness.gpu_rasterization.polymer/paper_toggle_button" + }, + { + "duration": "24.81473103030303", + "name": "smoothness.gpu_rasterization.top_25_smooth/blogspot" + }, + { + "duration": "17.69833766666667", + "name": "smoothness.gpu_rasterization.top_25_smooth/booking.com" + }, + { + "duration": "13.284247050505044", + "name": "smoothness.gpu_rasterization.top_25_smooth/ebay" + }, + { + "duration": "16.260108803030313", + "name": "smoothness.gpu_rasterization.top_25_smooth/espn" + }, + { + "duration": "19.716015373737374", + "name": "smoothness.gpu_rasterization.top_25_smooth/facebook" + }, + { + "duration": "30.54843738383838", + "name": "smoothness.gpu_rasterization.top_25_smooth/gmail" + }, + { + "duration": "18.927520373737373", + "name": "smoothness.gpu_rasterization.top_25_smooth/google_calendar" + }, + { + "duration": "28.270295404040414", + "name": "smoothness.gpu_rasterization.top_25_smooth/google_docs" + }, + { + "duration": "21.80036748484849", + "name": "smoothness.gpu_rasterization.top_25_smooth/google_image_search" + }, + { + "duration": "26.115059040404045", + "name": "smoothness.gpu_rasterization.top_25_smooth/google_plus" + }, + { + "duration": "13.011311494949497", + "name": "smoothness.gpu_rasterization.top_25_smooth/google_web_search" + }, + { + "duration": "16.765825737373728", + "name": "smoothness.gpu_rasterization.top_25_smooth/linkedin" + }, + { + "duration": "24.87675916161616", + "name": "smoothness.gpu_rasterization.top_25_smooth/techcrunch" + }, + { + "duration": "19.43501411111111", + "name": "smoothness.gpu_rasterization.top_25_smooth/twitter" + }, + { + "duration": "16.953301833333327", + "name": "smoothness.gpu_rasterization.top_25_smooth/weather.com" + }, + { + "duration": "23.511424575757577", + "name": "smoothness.gpu_rasterization.top_25_smooth/wikipedia" + }, + { + "duration": "22.052779939393943", + "name": "smoothness.gpu_rasterization.top_25_smooth/wordpress" + }, + { + "duration": "15.078567", + "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_answers" + }, + { + "duration": "24.296289060606057", + "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_games" + }, + { + "duration": "18.020234747474742", + "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_news" + }, + { + "duration": "18.094719636363642", + "name": "smoothness.gpu_rasterization.top_25_smooth/yahoo_sports" + }, + { + "duration": "19.296133989898998", + "name": "smoothness.gpu_rasterization.top_25_smooth/youtube" + }, + { + "duration": "22.071408696969684", + "name": "smoothness.gpu_rasterization.tough_filters_cases/Analog_Clock_SVG" + }, + { + "duration": "22.246296454545455", + "name": "smoothness.gpu_rasterization.tough_filters_cases/Filter_Terrain_SVG" + }, + { + "duration": "24.591974010101023", + "name": "smoothness.gpu_rasterization.tough_filters_cases/IE_PirateMark" + }, + { + "duration": "26.023366161616153", + "name": "smoothness.gpu_rasterization.tough_filters_cases/MotionMark_Focus" + }, + { + "duration": "21.864080090909095", + "name": "smoothness.gpu_rasterization.tough_filters_cases/analog_clock_svg" + }, + { + "duration": "22.275277202020206", + "name": "smoothness.gpu_rasterization.tough_filters_cases/filter_terrain_svg" + }, + { + "duration": "24.57534975757575", + "name": "smoothness.gpu_rasterization.tough_filters_cases/ie_pirate_mark" + }, + { + "duration": "26.052543727272727", + "name": "smoothness.gpu_rasterization.tough_filters_cases/motion_mark_focus" + }, + { + "duration": "26.766590575757576", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/GUIMark_Vector_Chart_Test" + }, + { + "duration": "33.42531311111112", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/IE_Chalkboard" + }, + { + "duration": "21.027038525252525", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Fill_Shapes" + }, + { + "duration": "21.222493080808086", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/MotionMark_Canvas_Stroke_Shapes" + }, + { + "duration": "26.922234545454554", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "33.29083424242425", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "20.898740303030305", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "21.072023646464643", + "name": "smoothness.gpu_rasterization.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "20.457519626262627", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Blogger" + }, + { + "duration": "20.234898565656568", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/ESPN" + }, + { + "duration": "17.716905282828282", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Facebook" + }, + { + "duration": "17.521131757575752", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/LinkedIn" + }, + { + "duration": "19.673153646464645", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Twitter" + }, + { + "duration": "23.46269215151515", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/Weather.com" + }, + { + "duration": "17.135128101010096", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/amazon_pinch" + }, + { + "duration": "20.052489999999985", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/blogspot_pinch" + }, + { + "duration": "18.50391045454545", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/booking_pinch" + }, + { + "duration": "20.944398686868684", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/cnn_pinch" + }, + { + "duration": "18.376026101010098", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/ebay_pinch" + }, + { + "duration": "20.068561888888887", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/espn_pinch" + }, + { + "duration": "17.35824208050505", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/facebook_pinch" + }, + { + "duration": "21.377881696969705", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/gmail_pinch" + }, + { + "duration": "20.00883534343434", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/google_calendar_pinch" + }, + { + "duration": "18.033614686868678", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/google_image_pinch" + }, + { + "duration": "23.226142202020192", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/google_search_pinch" + }, + { + "duration": "18.611691414141408", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://booking.com" + }, + { + "duration": "24.200457676767673", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://games.yahoo.com" + }, + { + "duration": "21.442634242424248", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://news.yahoo.com" + }, + { + "duration": "23.978675454545474", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://sports.yahoo.com/" + }, + { + "duration": "17.163681292929297", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.amazon.com" + }, + { + "duration": "21.11834083838384", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.cnn.com" + }, + { + "duration": "18.500673303030307", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.ebay.com" + }, + { + "duration": "20.12547411111111", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/http://www.youtube.com" + }, + { + "duration": "21.599045060606063", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://mail.google.com/mail/" + }, + { + "duration": "23.52236257575757", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "20.186037191919194", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://www.google.com/calendar/" + }, + { + "duration": "18.223816474747473", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/https://www.google.com/search?q=cats&tbm=isch" + }, + { + "duration": "17.155473969696963", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/linkedin_pinch" + }, + { + "duration": "19.42624984848485", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/twitter_pinch" + }, + { + "duration": "23.373945161616167", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/weather_pinch" + }, + { + "duration": "24.168533020202016", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/yahoo_games_pinch" + }, + { + "duration": "21.526567000000007", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/yahoo_news_pinch" + }, + { + "duration": "23.818035292929284", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/yahoo_sports_pinch" + }, + { + "duration": "19.822346323232324", + "name": "smoothness.gpu_rasterization.tough_pinch_zoom_cases/youtube_pinch" + }, + { + "duration": "18.507448818181825", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "18.646058151515152", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "18.67110256565657", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "18.686313020202018", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "18.720366909090913", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "17.362337030303028", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "16.141212919191922", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "15.0306944090909", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "14.287694404040403", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "13.50915887878788", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "29.52484534343435", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "19.545956444444453", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "19.334000777777785", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "19.40894502020201", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "19.360452080808074", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "17.8572618989899", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "16.496166333333328", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "15.449881121212119", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "14.503100601010102", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "13.804428499999998", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "18.274340212121217", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "18.259447555555553", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "18.33203639393939", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "18.336211111111112", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "18.339763494949494", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "17.88479071717172", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "16.365232181818183", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "15.383536575757578", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "14.37222653030303", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "13.85775982323233", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "18.05117803030303", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "18.44442062626263", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "18.491643818181817", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "18.44029223232323", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "18.4738447979798", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "17.093403171717178", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "15.773262585858587", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "14.913316646464654", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "14.102246196969702", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "13.437218060606059", + "name": "smoothness.gpu_rasterization.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "26.569065852459005", + "name": "smoothness.gpu_rasterization_and_decoding.image_decoding_cases/yuv_decoding" + }, + { + "duration": "26.629028147540986", + "name": "smoothness.image_decoding_cases/yuv_decoding" + }, + { + "duration": "16.53914413636364", + "name": "smoothness.key_mobile_sites_smooth/androidpolice" + }, + { + "duration": "13.291175718181815", + "name": "smoothness.key_mobile_sites_smooth/baidu" + }, + { + "duration": "12.237363636363638", + "name": "smoothness.key_mobile_sites_smooth/bing" + }, + { + "duration": "14.365715415254241", + "name": "smoothness.key_mobile_sites_smooth/blogspot" + }, + { + "duration": "24.812816169491523", + "name": "smoothness.key_mobile_sites_smooth/boingboing" + }, + { + "duration": "12.958837654545453", + "name": "smoothness.key_mobile_sites_smooth/booking.com" + }, + { + "duration": "24.33851395", + "name": "smoothness.key_mobile_sites_smooth/capitolvolkswagen" + }, + { + "duration": "15.18539076363636", + "name": "smoothness.key_mobile_sites_smooth/cnn" + }, + { + "duration": "30.0165683220339", + "name": "smoothness.key_mobile_sites_smooth/cnn_article" + }, + { + "duration": "23.590496254237287", + "name": "smoothness.key_mobile_sites_smooth/cuteoverload" + }, + { + "duration": "21.357222400000005", + "name": "smoothness.key_mobile_sites_smooth/deviantart" + }, + { + "duration": "15.89577759090909", + "name": "smoothness.key_mobile_sites_smooth/ebay" + }, + { + "duration": "15.979215499999999", + "name": "smoothness.key_mobile_sites_smooth/facebook" + }, + { + "duration": "21.41754853333333", + "name": "smoothness.key_mobile_sites_smooth/google_news" + }, + { + "duration": "17.745036381818185", + "name": "smoothness.key_mobile_sites_smooth/google_plus" + }, + { + "duration": "13.544446727272723", + "name": "smoothness.key_mobile_sites_smooth/google_web_search" + }, + { + "duration": "14.588915345454541", + "name": "smoothness.key_mobile_sites_smooth/gsp.ro" + }, + { + "duration": "16.675895533333332", + "name": "smoothness.key_mobile_sites_smooth/linkedin" + }, + { + "duration": "12.726080918181815", + "name": "smoothness.key_mobile_sites_smooth/mlb" + }, + { + "duration": "17.255912881355933", + "name": "smoothness.key_mobile_sites_smooth/nytimes" + }, + { + "duration": "21.782283267857142", + "name": "smoothness.key_mobile_sites_smooth/pinterest" + }, + { + "duration": "20.882384271186442", + "name": "smoothness.key_mobile_sites_smooth/reddit" + }, + { + "duration": "17.950470527272728", + "name": "smoothness.key_mobile_sites_smooth/sfgate" + }, + { + "duration": "19.428483915254244", + "name": "smoothness.key_mobile_sites_smooth/slashdot" + }, + { + "duration": "14.26479439090909", + "name": "smoothness.key_mobile_sites_smooth/techcrunch" + }, + { + "duration": "15.692550409090913", + "name": "smoothness.key_mobile_sites_smooth/theverge" + }, + { + "duration": "22.655533066666667", + "name": "smoothness.key_mobile_sites_smooth/theverge_article" + }, + { + "duration": "21.96348992592593", + "name": "smoothness.key_mobile_sites_smooth/usatoday" + }, + { + "duration": "18.137424877192977", + "name": "smoothness.key_mobile_sites_smooth/wikipedia" + }, + { + "duration": "18.142369593220337", + "name": "smoothness.key_mobile_sites_smooth/wikipedia_delayed_scroll_start" + }, + { + "duration": "21.20393466101695", + "name": "smoothness.key_mobile_sites_smooth/wordpress" + }, + { + "duration": "19.768529454545455", + "name": "smoothness.key_mobile_sites_smooth/worldjournal" + }, + { + "duration": "27.002991305084752", + "name": "smoothness.key_mobile_sites_smooth/wowwiki" + }, + { + "duration": "14.532464472727272", + "name": "smoothness.key_mobile_sites_smooth/wsj" + }, + { + "duration": "17.25935281666667", + "name": "smoothness.key_mobile_sites_smooth/yahoo_answers" + }, + { + "duration": "16.786935727272727", + "name": "smoothness.key_mobile_sites_smooth/yahoo_news" + }, + { + "duration": "13.40610516666667", + "name": "smoothness.key_mobile_sites_smooth/youtube" + }, + { + "duration": "25.359990737704916", + "name": "smoothness.key_silk_cases/basic_stream" + }, + { + "duration": "16.37147265573771", + "name": "smoothness.key_silk_cases/card_expansion" + }, + { + "duration": "17.447161639344266", + "name": "smoothness.key_silk_cases/card_expansion_animated" + }, + { + "duration": "17.716525114754095", + "name": "smoothness.key_silk_cases/card_expansion_images_text" + }, + { + "duration": "16.31518052459017", + "name": "smoothness.key_silk_cases/card_flying" + }, + { + "duration": "17.861628114754097", + "name": "smoothness.key_silk_cases/coordinated_animation" + }, + { + "duration": "17.843532426229512", + "name": "smoothness.key_silk_cases/font_wipe" + }, + { + "duration": "18.894321262295083", + "name": "smoothness.key_silk_cases/google_news_ios" + }, + { + "duration": "18.105140180327872", + "name": "smoothness.key_silk_cases/gws_boogie_expansion" + }, + { + "duration": "18.616162852459027", + "name": "smoothness.key_silk_cases/gws_google_expansion" + }, + { + "duration": "17.38313752459016", + "name": "smoothness.key_silk_cases/horizontal_vertical_expansion" + }, + { + "duration": "22.869229426229506", + "name": "smoothness.key_silk_cases/infinite_scrolling" + }, + { + "duration": "14.918027991803275", + "name": "smoothness.key_silk_cases/list_animation_simple" + }, + { + "duration": "26.942414672131147", + "name": "smoothness.key_silk_cases/list_recycle_transform" + }, + { + "duration": "16.686518245901638", + "name": "smoothness.key_silk_cases/mask_transition_animation" + }, + { + "duration": "16.928695688524595", + "name": "smoothness.key_silk_cases/masonry" + }, + { + "duration": "15.259632737704917", + "name": "smoothness.key_silk_cases/mobile_news_sandbox" + }, + { + "duration": "17.517494147540983", + "name": "smoothness.key_silk_cases/parallax_effect" + }, + { + "duration": "14.755297639344262", + "name": "smoothness.key_silk_cases/physical_simulation" + }, + { + "duration": "24.119664426229516", + "name": "smoothness.key_silk_cases/silk_finance" + }, + { + "duration": "15.970722868852462", + "name": "smoothness.key_silk_cases/sticky_using_webkit" + }, + { + "duration": "26.26587440983606", + "name": "smoothness.key_silk_cases/stress_hidey_bars" + }, + { + "duration": "25.750074213114747", + "name": "smoothness.key_silk_cases/svg_icon_raster" + }, + { + "duration": "12.902936049180326", + "name": "smoothness.key_silk_cases/swipe_action" + }, + { + "duration": "16.33346949180328", + "name": "smoothness.key_silk_cases/swipe_to_dismiss" + }, + { + "duration": "20.306419754098368", + "name": "smoothness.key_silk_cases/toggle_drawer" + }, + { + "duration": "18.311884672131153", + "name": "smoothness.key_silk_cases/update_history_state" + }, + { + "duration": "17.131549540983606", + "name": "smoothness.key_silk_cases/vertical_expansion" + }, + { + "duration": "16.476652081967217", + "name": "smoothness.key_silk_cases/zoom_in_animation" + }, + { + "duration": "28.821596590163935", + "name": "smoothness.maps/maps_perf_test" + }, + { + "duration": "28.674610918032776", + "name": "smoothness.pathological_mobile_sites/cnn_pathological" + }, + { + "duration": "20.24299862295082", + "name": "smoothness.pathological_mobile_sites/espn_pathological" + }, + { + "duration": "17.557712475409833", + "name": "smoothness.pathological_mobile_sites/guardian_pathological" + }, + { + "duration": "34.125893313131314", + "name": "smoothness.pathological_mobile_sites/http://edition.cnn.com" + }, + { + "duration": "21.165496929292935", + "name": "smoothness.pathological_mobile_sites/http://m.espn.go.com/nhl/rankings" + }, + { + "duration": "24.303929666666658", + "name": "smoothness.pathological_mobile_sites/http://recode.net" + }, + { + "duration": "23.769852070707078", + "name": "smoothness.pathological_mobile_sites/http://sports.yahoo.com/" + }, + { + "duration": "23.95460922222222", + "name": "smoothness.pathological_mobile_sites/http://www.latimes.com" + }, + { + "duration": "23.24269973737373", + "name": "smoothness.pathological_mobile_sites/http://www.pbs.org/newshour/bb/much-really-cost-live-city-like-seattle/#the-rundown" + }, + { + "duration": "18.307695060606054", + "name": "smoothness.pathological_mobile_sites/http://www.theguardian.com/politics/2015/mar/09/ed-balls-tory-spending-plans-nhs-charging" + }, + { + "duration": "24.52768088888889", + "name": "smoothness.pathological_mobile_sites/http://www.wowwiki.com/World_of_Warcraft:_Mists_of_Pandaria" + }, + { + "duration": "21.474880676767675", + "name": "smoothness.pathological_mobile_sites/http://www.zdnet.com" + }, + { + "duration": "21.462242555555555", + "name": "smoothness.pathological_mobile_sites/https://www.linkedin.com/in/linustorvalds" + }, + { + "duration": "23.825132131147544", + "name": "smoothness.pathological_mobile_sites/latimes_pathological" + }, + { + "duration": "20.733113622950818", + "name": "smoothness.pathological_mobile_sites/linkedin_pathological" + }, + { + "duration": "22.28273478688524", + "name": "smoothness.pathological_mobile_sites/pbs_pathological" + }, + { + "duration": "23.086000836065573", + "name": "smoothness.pathological_mobile_sites/recode_pathological" + }, + { + "duration": "23.744039098360652", + "name": "smoothness.pathological_mobile_sites/wow_wiki_pathological" + }, + { + "duration": "22.60097137704919", + "name": "smoothness.pathological_mobile_sites/yahoo_sports_pathological" + }, + { + "duration": "20.430695229508185", + "name": "smoothness.pathological_mobile_sites/zdnet_pathological" + }, + { + "duration": "31.095673180327864", + "name": "smoothness.simple_mobile_sites/ebay_scroll" + }, + { + "duration": "25.098881000000002", + "name": "smoothness.simple_mobile_sites/flickr_scroll" + }, + { + "duration": "26.060939696969683", + "name": "smoothness.simple_mobile_sites/http://m.nytimes.com/" + }, + { + "duration": "31.32089277777777", + "name": "smoothness.simple_mobile_sites/http://www.ebay.co.uk/" + }, + { + "duration": "26.259290949494947", + "name": "smoothness.simple_mobile_sites/http://www.nyc.gov" + }, + { + "duration": "25.429110333333316", + "name": "smoothness.simple_mobile_sites/https://www.flickr.com/" + }, + { + "duration": "26.21302401639344", + "name": "smoothness.simple_mobile_sites/nyc_gov_scroll" + }, + { + "duration": "25.879720360655746", + "name": "smoothness.simple_mobile_sites/nytimes_scroll" + }, + { + "duration": "12.30919037878788", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/amazon" + }, + { + "duration": "17.553353626262624", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/androidpolice" + }, + { + "duration": "13.419487333333336", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/baidu" + }, + { + "duration": "12.35000406565657", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/bing" + }, + { + "duration": "14.588684181818179", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/blogspot" + }, + { + "duration": "26.629666191919195", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/boingboing" + }, + { + "duration": "12.98962581313131", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/booking.com" + }, + { + "duration": "25.129272292929294", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/capitolvolkswagen" + }, + { + "duration": "15.469489843434344", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/cnn" + }, + { + "duration": "32.38077446464647", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/cnn_article" + }, + { + "duration": "25.60486985858586", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/cuteoverload" + }, + { + "duration": "21.313415727272734", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/deviantart" + }, + { + "duration": "16.256086060606055", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/ebay" + }, + { + "duration": "23.20500197979798", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/espn" + }, + { + "duration": "16.32861003030304", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/facebook" + }, + { + "duration": "14.802518469696972", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/forecast.io" + }, + { + "duration": "21.317157606060597", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/google_news" + }, + { + "duration": "19.805972242424232", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/google_plus" + }, + { + "duration": "13.828701045454547", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/google_web_search" + }, + { + "duration": "14.843548909090911", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/gsp.ro" + }, + { + "duration": "17.13667131313131", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/linkedin" + }, + { + "duration": "12.860879126262624", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/mlb" + }, + { + "duration": "17.460176787878783", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/nytimes" + }, + { + "duration": "22.94758834343435", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/pinterest" + }, + { + "duration": "20.98797042424242", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/reddit" + }, + { + "duration": "18.45800221212121", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/sfgate" + }, + { + "duration": "19.94021547474747", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/slashdot" + }, + { + "duration": "14.559818661616161", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/techcrunch" + }, + { + "duration": "16.004070919191925", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/theverge" + }, + { + "duration": "22.836122060606062", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/theverge_article" + }, + { + "duration": "13.172477782828281", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/twitter" + }, + { + "duration": "21.683123101010096", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/usatoday" + }, + { + "duration": "18.283508696969697", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wikipedia" + }, + { + "duration": "18.263198434343437", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wikipedia_delayed_scroll_start" + }, + { + "duration": "21.93877677777777", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wordpress" + }, + { + "duration": "20.825173404040413", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/worldjournal" + }, + { + "duration": "27.130637929292934", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wowwiki" + }, + { + "duration": "14.661252787878787", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/wsj" + }, + { + "duration": "18.171624353535357", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/yahoo_answers" + }, + { + "duration": "17.091449030303032", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/yahoo_news" + }, + { + "duration": "13.579494898989902", + "name": "smoothness.sync_scroll.key_mobile_sites_smooth/youtube" + }, + { + "duration": "25.046911303030296", + "name": "smoothness.top_25_smooth/blogspot" + }, + { + "duration": "17.37225661616163", + "name": "smoothness.top_25_smooth/booking.com" + }, + { + "duration": "12.80938446464646", + "name": "smoothness.top_25_smooth/ebay" + }, + { + "duration": "15.779602202020206", + "name": "smoothness.top_25_smooth/espn" + }, + { + "duration": "20.048795929292922", + "name": "smoothness.top_25_smooth/facebook" + }, + { + "duration": "24.951335727272728", + "name": "smoothness.top_25_smooth/gmail" + }, + { + "duration": "18.869747686868696", + "name": "smoothness.top_25_smooth/google_calendar" + }, + { + "duration": "28.923561282828267", + "name": "smoothness.top_25_smooth/google_docs" + }, + { + "duration": "22.120960626262626", + "name": "smoothness.top_25_smooth/google_image_search" + }, + { + "duration": "26.418621020202036", + "name": "smoothness.top_25_smooth/google_plus" + }, + { + "duration": "13.20374604040404", + "name": "smoothness.top_25_smooth/google_web_search" + }, + { + "duration": "16.266582000000003", + "name": "smoothness.top_25_smooth/linkedin" + }, + { + "duration": "21.153775717171715", + "name": "smoothness.top_25_smooth/pinterest" + }, + { + "duration": "24.788411272727274", + "name": "smoothness.top_25_smooth/techcrunch" + }, + { + "duration": "18.91154121212121", + "name": "smoothness.top_25_smooth/twitter" + }, + { + "duration": "16.4054206919192", + "name": "smoothness.top_25_smooth/weather.com" + }, + { + "duration": "23.213889505050503", + "name": "smoothness.top_25_smooth/wikipedia" + }, + { + "duration": "22.27848776767677", + "name": "smoothness.top_25_smooth/wordpress" + }, + { + "duration": "14.596352338383838", + "name": "smoothness.top_25_smooth/yahoo_answers" + }, + { + "duration": "24.10144237373737", + "name": "smoothness.top_25_smooth/yahoo_games" + }, + { + "duration": "17.48463835353535", + "name": "smoothness.top_25_smooth/yahoo_news" + }, + { + "duration": "17.747225151515146", + "name": "smoothness.top_25_smooth/yahoo_sports" + }, + { + "duration": "19.60449215151515", + "name": "smoothness.top_25_smooth/youtube" + }, + { + "duration": "27.04536781818182", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swiffy72.html" + }, + { + "duration": "22.456082111111108", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swiffy72.html" + }, + { + "duration": "22.534815787878802", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swiffy72.html" + }, + { + "duration": "22.52919038383839", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swiffy72.html" + }, + { + "duration": "22.43159716161616", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swiffy72.html" + }, + { + "duration": "22.454406262626275", + "name": "smoothness.tough_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swiffy72.html" + }, + { + "duration": "22.426331535353533", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swiffy72.html" + }, + { + "duration": "22.458929676767674", + "name": "smoothness.tough_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swiffy72.html" + }, + { + "duration": "22.401501545454547", + "name": "smoothness.tough_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swiffy72.html" + }, + { + "duration": "22.406789909090914", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swiffy72.html" + }, + { + "duration": "22.549943171717167", + "name": "smoothness.tough_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swiffy72.html" + }, + { + "duration": "21.923174557377042", + "name": "smoothness.tough_animation_cases/balls_css_key_frame_animations" + }, + { + "duration": "21.85514444444445", + "name": "smoothness.tough_animation_cases/balls_css_keyframe_animations.html" + }, + { + "duration": "22.44665429508197", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties" + }, + { + "duration": "22.286494262626267", + "name": "smoothness.tough_animation_cases/balls_css_transition_2_properties.html" + }, + { + "duration": "22.57624036065575", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties" + }, + { + "duration": "22.297481767676768", + "name": "smoothness.tough_animation_cases/balls_css_transition_40_properties.html" + }, + { + "duration": "22.488254622950816", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties" + }, + { + "duration": "22.225520010101018", + "name": "smoothness.tough_animation_cases/balls_css_transition_all_properties.html" + }, + { + "duration": "20.932041327868856", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas" + }, + { + "duration": "20.892632616161613", + "name": "smoothness.tough_animation_cases/balls_javascript_canvas.html" + }, + { + "duration": "21.126268836065574", + "name": "smoothness.tough_animation_cases/balls_javascript_css" + }, + { + "duration": "20.999826545454553", + "name": "smoothness.tough_animation_cases/balls_javascript_css.html" + }, + { + "duration": "26.701714885245888", + "name": "smoothness.tough_animation_cases/balls_svg_animations" + }, + { + "duration": "26.597550686868686", + "name": "smoothness.tough_animation_cases/balls_svg_animations.html" + }, + { + "duration": "21.343014101010095", + "name": "smoothness.tough_animation_cases/compositor_heavy_animation.html?N=0200" + }, + { + "duration": "22.020698459016398", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes" + }, + { + "duration": "22.083971262626275", + "name": "smoothness.tough_animation_cases/css_animations_many_keyframes.html?N=0316" + }, + { + "duration": "22.952134747474748", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_new_element.html?N=0316" + }, + { + "duration": "22.359438050505048", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_inserting_style_element.html?N=0316" + }, + { + "duration": "22.42862556565656", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_class.html?N=0316" + }, + { + "duration": "22.33996149494949", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_by_updating_inline_style.html?N=0316" + }, + { + "duration": "22.232475754098363", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_inline_style" + }, + { + "duration": "22.707320868852456", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_new_element" + }, + { + "duration": "22.16799822950819", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_style_element" + }, + { + "duration": "22.176333786885248", + "name": "smoothness.tough_animation_cases/css_animations_simultaneous_updating_class" + }, + { + "duration": "24.100041747474748", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_new_element.html?N=0316" + }, + { + "duration": "23.35224656565657", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_inserting_style_element.html?N=0316" + }, + { + "duration": "23.59784304040403", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_class.html?N=0316" + }, + { + "duration": "23.550403656565656", + "name": "smoothness.tough_animation_cases/css_animations_staggered_chaining_by_updating_inline_style.html?N=0316" + }, + { + "duration": "21.300982606557373", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations" + }, + { + "duration": "21.352403010101003", + "name": "smoothness.tough_animation_cases/css_animations_staggered_infinite_iterations.html?N=0316" + }, + { + "duration": "23.610044540983605", + "name": "smoothness.tough_animation_cases/css_animations_staggered_inline_style" + }, + { + "duration": "24.273761786885252", + "name": "smoothness.tough_animation_cases/css_animations_staggered_new_element" + }, + { + "duration": "23.5560451147541", + "name": "smoothness.tough_animation_cases/css_animations_staggered_style_element" + }, + { + "duration": "23.93363522222221", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_new_element.html?N=0316" + }, + { + "duration": "22.201258151515145", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_inserting_style_element.html?N=0316" + }, + { + "duration": "23.34559153535355", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_class.html?N=0316" + }, + { + "duration": "23.310823323232324", + "name": "smoothness.tough_animation_cases/css_animations_staggered_triggering_by_updating_inline_style.html?N=0316" + }, + { + "duration": "23.575668704918037", + "name": "smoothness.tough_animation_cases/css_animations_staggered_updating_class" + }, + { + "duration": "23.453082032786885", + "name": "smoothness.tough_animation_cases/css_animations_triggered_inline_style" + }, + { + "duration": "24.093794278688524", + "name": "smoothness.tough_animation_cases/css_animations_triggered_new_element" + }, + { + "duration": "22.332709983606552", + "name": "smoothness.tough_animation_cases/css_animations_triggered_style_element" + }, + { + "duration": "23.37103018032786", + "name": "smoothness.tough_animation_cases/css_animations_triggered_updating_class" + }, + { + "duration": "22.533571852459012", + "name": "smoothness.tough_animation_cases/css_transitions_inline_style" + }, + { + "duration": "23.259156983606555", + "name": "smoothness.tough_animation_cases/css_transitions_new_element" + }, + { + "duration": "23.372676656565666", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_new_element.html?N=0316" + }, + { + "duration": "22.69614324242424", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_inserting_style_element.html?N=0316" + }, + { + "duration": "22.715541161616162", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_class.html?N=0316" + }, + { + "duration": "22.561160545454534", + "name": "smoothness.tough_animation_cases/css_transitions_simultaneous_by_updating_inline_style.html?N=0316" + }, + { + "duration": "22.355516030303033", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_new_element.html?N=0316" + }, + { + "duration": "22.712755676767678", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_inserting_style_element.html?N=0316" + }, + { + "duration": "22.83893402020201", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_class.html?N=0316" + }, + { + "duration": "22.80539458585859", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_chaining_by_updating_inline_style.html?N=0316" + }, + { + "duration": "22.765675655737706", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_inline_style" + }, + { + "duration": "22.564853245901634", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_new_element" + }, + { + "duration": "22.75068975409835", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_style_element" + }, + { + "duration": "22.41470508080808", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_new_element.html?N=0316" + }, + { + "duration": "22.35842371717172", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_inserting_style_element.html?N=0316" + }, + { + "duration": "22.550059090909095", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_class.html?N=0316" + }, + { + "duration": "22.49970381818182", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_triggering_by_updating_inline_style.html?N=0316" + }, + { + "duration": "22.78685416393442", + "name": "smoothness.tough_animation_cases/css_transitions_staggered_updating_class" + }, + { + "duration": "22.64483332786886", + "name": "smoothness.tough_animation_cases/css_transitions_style_element" + }, + { + "duration": "22.651829590163928", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_inline_style" + }, + { + "duration": "22.432310721311477", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_new_element" + }, + { + "duration": "22.505301868852452", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_style_element" + }, + { + "duration": "22.76856439344262", + "name": "smoothness.tough_animation_cases/css_transitions_triggered_updating_class" + }, + { + "duration": "22.64673163934427", + "name": "smoothness.tough_animation_cases/css_transitions_updating_class" + }, + { + "duration": "21.704338229508192", + "name": "smoothness.tough_animation_cases/css_value_type_color" + }, + { + "duration": "21.591275212121204", + "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=css_animations&N=0316" + }, + { + "duration": "21.58429938383838", + "name": "smoothness.tough_animation_cases/css_value_type_color.html?api=web_animations&N=0316" + }, + { + "duration": "21.25076870491803", + "name": "smoothness.tough_animation_cases/css_value_type_filter" + }, + { + "duration": "21.213075878787883", + "name": "smoothness.tough_animation_cases/css_value_type_filter.html?api=css_animations&N=0316" + }, + { + "duration": "21.47085027868853", + "name": "smoothness.tough_animation_cases/css_value_type_length" + }, + { + "duration": "21.28950224242425", + "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=css_animations&N=0316" + }, + { + "duration": "21.378793010101017", + "name": "smoothness.tough_animation_cases/css_value_type_length_3d.html?api=web_animations&N=0316" + }, + { + "duration": "21.81602663934426", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex" + }, + { + "duration": "21.741128161616164", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=css_animations&N=0316" + }, + { + "duration": "21.800361777777773", + "name": "smoothness.tough_animation_cases/css_value_type_length_complex.html?api=web_animations&N=0316" + }, + { + "duration": "21.80552524590165", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple" + }, + { + "duration": "21.814812707070704", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=css_animations&N=0316" + }, + { + "duration": "21.76607248484849", + "name": "smoothness.tough_animation_cases/css_value_type_length_simple.html?api=web_animations&N=0316" + }, + { + "duration": "21.843382000000002", + "name": "smoothness.tough_animation_cases/css_value_type_path" + }, + { + "duration": "21.668360090909086", + "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=css_animations&N=0316" + }, + { + "duration": "21.68115701010101", + "name": "smoothness.tough_animation_cases/css_value_type_path.html?api=web_animations&N=0316" + }, + { + "duration": "21.093255442622944", + "name": "smoothness.tough_animation_cases/css_value_type_shadow" + }, + { + "duration": "20.95892668686868", + "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=css_animations&N=0316" + }, + { + "duration": "20.898138292929293", + "name": "smoothness.tough_animation_cases/css_value_type_shadow.html?api=web_animations&N=0316" + }, + { + "duration": "21.37288601639345", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex" + }, + { + "duration": "21.297352010101005", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=css_animations&N=0316" + }, + { + "duration": "21.361086353535356", + "name": "smoothness.tough_animation_cases/css_value_type_transform_complex.html?api=web_animations&N=0316" + }, + { + "duration": "21.49146072131148", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple" + }, + { + "duration": "21.48650625252525", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=css_animations&N=0316" + }, + { + "duration": "21.542096949494955", + "name": "smoothness.tough_animation_cases/css_value_type_transform_simple.html?api=web_animations&N=0316" + }, + { + "duration": "21.179604016393437", + "name": "smoothness.tough_animation_cases/keyframed_animations" + }, + { + "duration": "21.16444153535355", + "name": "smoothness.tough_animation_cases/keyframed_animations.html" + }, + { + "duration": "21.068441163934427", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference" + }, + { + "duration": "20.978088626262632", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_difference.html" + }, + { + "duration": "21.02356952459016", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue" + }, + { + "duration": "21.0166183030303", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_hue.html" + }, + { + "duration": "21.983963295081967", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_propagating_isolation" + }, + { + "duration": "20.83310868852459", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen" + }, + { + "duration": "20.870298393939397", + "name": "smoothness.tough_animation_cases/mix_blend_mode_animation_screen.html" + }, + { + "duration": "21.98198574747475", + "name": "smoothness.tough_animation_cases/mix_blend_mode_propagating_isolation.html" + }, + { + "duration": "27.327474363636362", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions.html" + }, + { + "duration": "27.89716124590164", + "name": "smoothness.tough_animation_cases/overlay_background_color_css_transitions_page" + }, + { + "duration": "21.987142080808084", + "name": "smoothness.tough_animation_cases/transform_transition_js_block.html" + }, + { + "duration": "20.940191786885247", + "name": "smoothness.tough_animation_cases/transform_transitions" + }, + { + "duration": "20.9394409090909", + "name": "smoothness.tough_animation_cases/transform_transitions.html" + }, + { + "duration": "21.949484999999996", + "name": "smoothness.tough_animation_cases/transform_transitions_js_block" + }, + { + "duration": "21.567496622950816", + "name": "smoothness.tough_animation_cases/web_animation_value_type_color" + }, + { + "duration": "21.487963852459007", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_3d" + }, + { + "duration": "21.7911168852459", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_complex" + }, + { + "duration": "21.813014000000003", + "name": "smoothness.tough_animation_cases/web_animation_value_type_length_simple" + }, + { + "duration": "21.780180508196732", + "name": "smoothness.tough_animation_cases/web_animation_value_type_path" + }, + { + "duration": "21.0838273114754", + "name": "smoothness.tough_animation_cases/web_animation_value_type_shadow" + }, + { + "duration": "21.444138983606557", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_complex" + }, + { + "duration": "21.748571262295087", + "name": "smoothness.tough_animation_cases/web_animation_value_type_transform_simple" + }, + { + "duration": "23.66700586885245", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes" + }, + { + "duration": "23.78068638383839", + "name": "smoothness.tough_animation_cases/web_animations_many_keyframes.html?N=0316" + }, + { + "duration": "21.543867918032785", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time" + }, + { + "duration": "21.60836641414143", + "name": "smoothness.tough_animation_cases/web_animations_set_current_time_in_raf.html?N=0316" + }, + { + "duration": "22.524585508196722", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous" + }, + { + "duration": "22.720181323232318", + "name": "smoothness.tough_animation_cases/web_animations_simultaneous.html?N=0316" + }, + { + "duration": "23.505437098360655", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining" + }, + { + "duration": "23.353811707070708", + "name": "smoothness.tough_animation_cases/web_animations_staggered_chaining.html?N=0316" + }, + { + "duration": "21.386591688524586", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations" + }, + { + "duration": "21.399232565656565", + "name": "smoothness.tough_animation_cases/web_animations_staggered_infinite_iterations.html?N=0316" + }, + { + "duration": "23.24874341414142", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering.html?N=0316" + }, + { + "duration": "23.409907245901646", + "name": "smoothness.tough_animation_cases/web_animations_staggered_triggering_page" + }, + { + "duration": "22.018705404040404", + "name": "smoothness.tough_canvas_cases/../../../chrome/test/data/perf/canvas_bench/many_images.html" + }, + { + "duration": "16.105503581967213", + "name": "smoothness.tough_canvas_cases/bouncing_balls_15" + }, + { + "duration": "17.28932118032787", + "name": "smoothness.tough_canvas_cases/bouncing_balls_shadow" + }, + { + "duration": "16.051860098360653", + "name": "smoothness.tough_canvas_cases/bouncing_clipped_rectangles" + }, + { + "duration": "15.649400016393441", + "name": "smoothness.tough_canvas_cases/bouncing_gradient_circles" + }, + { + "duration": "15.525153090163935", + "name": "smoothness.tough_canvas_cases/bouncing_png_images" + }, + { + "duration": "22.835854540983604", + "name": "smoothness.tough_canvas_cases/bouncing_svg_images" + }, + { + "duration": "15.895966147540987", + "name": "smoothness.tough_canvas_cases/canvas_animation_no_clear" + }, + { + "duration": "15.80449435245902", + "name": "smoothness.tough_canvas_cases/canvas_arcs" + }, + { + "duration": "15.616654877049179", + "name": "smoothness.tough_canvas_cases/canvas_font_cycler" + }, + { + "duration": "15.735745081967213", + "name": "smoothness.tough_canvas_cases/canvas_lines" + }, + { + "duration": "15.936453622950818", + "name": "smoothness.tough_canvas_cases/canvas_to_blob" + }, + { + "duration": "16.138249836065572", + "name": "smoothness.tough_canvas_cases/chip_tune" + }, + { + "duration": "16.349343655737705", + "name": "smoothness.tough_canvas_cases/crafty_mind" + }, + { + "duration": "16.084336631147544", + "name": "smoothness.tough_canvas_cases/effect_games" + }, + { + "duration": "15.630610270491806", + "name": "smoothness.tough_canvas_cases/fill_shapes" + }, + { + "duration": "22.03807560655738", + "name": "smoothness.tough_canvas_cases/geo_apis" + }, + { + "duration": "16.11863257377049", + "name": "smoothness.tough_canvas_cases/hakim" + }, + { + "duration": "22.211645585858573", + "name": "smoothness.tough_canvas_cases/http://geoapis.appspot.com/agdnZW9hcGlzchMLEgtFeGFtcGxlQ29kZRjh1wIM" + }, + { + "duration": "16.232983545454555", + "name": "smoothness.tough_canvas_cases/http://hakim.se/experiments/html5/magnetic/02/" + }, + { + "duration": "16.39818360606061", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/TweetMap/Default.html" + }, + { + "duration": "16.47651023232323", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/VideoCity/Default.html" + }, + { + "duration": "15.828248590909089", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Graphics/WorkerFountains/Default.html" + }, + { + "duration": "17.71002109090909", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/AsteroidBelt/Default.html" + }, + { + "duration": "16.561532848484845", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html" + }, + { + "duration": "16.286886555555554", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/LetItSnow/" + }, + { + "duration": "16.001509656565656", + "name": "smoothness.tough_canvas_cases/http://ie.microsoft.com/testdrive/Performance/SpeedReading/Default.html" + }, + { + "duration": "16.98685219191919", + "name": "smoothness.tough_canvas_cases/http://jarrodoverson.com/static/demos/particleSystem/" + }, + { + "duration": "16.067574818181814", + "name": "smoothness.tough_canvas_cases/http://mix10k.visitmix.com/Entry/Details/169" + }, + { + "duration": "15.701819767676767", + "name": "smoothness.tough_canvas_cases/http://runway.countlessprojects.com/prototype/performance_test.html" + }, + { + "duration": "15.878640116161616", + "name": "smoothness.tough_canvas_cases/http://spielzeugz.de/html5/liquid-particles.html" + }, + { + "duration": "15.970756161616164", + "name": "smoothness.tough_canvas_cases/http://themaninblue.com/experiment/AnimationBenchmark/canvas/" + }, + { + "duration": "16.159435075757578", + "name": "smoothness.tough_canvas_cases/http://www.chiptune.com/starfield/starfield.html" + }, + { + "duration": "16.334891929292922", + "name": "smoothness.tough_canvas_cases/http://www.craftymind.com/factory/guimark2/HTML5ChartingTest.html" + }, + { + "duration": "16.157329565656564", + "name": "smoothness.tough_canvas_cases/http://www.effectgames.com/demos/canvascycle/" + }, + { + "duration": "16.281470419191916", + "name": "smoothness.tough_canvas_cases/http://www.kevs3d.co.uk/dev/canvask3d/k3d_test.html" + }, + { + "duration": "15.856684000000003", + "name": "smoothness.tough_canvas_cases/http://www.megidish.net/awjs/" + }, + { + "duration": "16.354321050505053", + "name": "smoothness.tough_canvas_cases/http://www.smashcat.org/av/canvas_test/" + }, + { + "duration": "16.985144721311467", + "name": "smoothness.tough_canvas_cases/jarro_doverson" + }, + { + "duration": "16.234797221311467", + "name": "smoothness.tough_canvas_cases/kevs_3d" + }, + { + "duration": "15.973522327868858", + "name": "smoothness.tough_canvas_cases/man_in_blue" + }, + { + "duration": "22.102537081967213", + "name": "smoothness.tough_canvas_cases/many_images" + }, + { + "duration": "15.95385218032787", + "name": "smoothness.tough_canvas_cases/megi_dish" + }, + { + "duration": "17.711289098360652", + "name": "smoothness.tough_canvas_cases/microsoft_asteroid_belt" + }, + { + "duration": "16.493513803278685", + "name": "smoothness.tough_canvas_cases/microsoft_fish_ie_tank" + }, + { + "duration": "16.268253278688523", + "name": "smoothness.tough_canvas_cases/microsoft_snow" + }, + { + "duration": "15.853337098360658", + "name": "smoothness.tough_canvas_cases/microsoft_speed_reading" + }, + { + "duration": "16.289367631147538", + "name": "smoothness.tough_canvas_cases/microsoft_tweet_map" + }, + { + "duration": "16.35075617213115", + "name": "smoothness.tough_canvas_cases/microsoft_video_city" + }, + { + "duration": "15.776083418032787", + "name": "smoothness.tough_canvas_cases/microsoft_worker_fountains" + }, + { + "duration": "16.115658991803276", + "name": "smoothness.tough_canvas_cases/mix_10k" + }, + { + "duration": "15.817121426229507", + "name": "smoothness.tough_canvas_cases/put_get_image_data" + }, + { + "duration": "15.825464983606556", + "name": "smoothness.tough_canvas_cases/runway" + }, + { + "duration": "16.180551254098365", + "name": "smoothness.tough_canvas_cases/smash_cat" + }, + { + "duration": "15.689207368852458", + "name": "smoothness.tough_canvas_cases/spielzeugz" + }, + { + "duration": "16.113895852459013", + "name": "smoothness.tough_canvas_cases/stroke_shapes" + }, + { + "duration": "16.10038631313131", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-animation-no-clear.html" + }, + { + "duration": "15.780741131313123", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas-font-cycler.html" + }, + { + "duration": "17.43734721212121", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=image_with_shadow&back=image" + }, + { + "duration": "16.112110808080804", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas2d_balls_common/bouncing_balls.html?ball=text&back=white&ball_count=15" + }, + { + "duration": "15.964707287878785", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/canvas_toBlob.html" + }, + { + "duration": "16.146996626262617", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_clipped_rectangles.html" + }, + { + "duration": "15.85691740909091", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_gradient_circles.html" + }, + { + "duration": "15.618912782828282", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_png_images.html" + }, + { + "duration": "23.098944424242422", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/bouncing_svg_images.html" + }, + { + "duration": "15.89293042424242", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_arcs.html" + }, + { + "duration": "15.847867282828279", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/canvas_lines.html" + }, + { + "duration": "15.873840070707063", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/fill_shapes.html" + }, + { + "duration": "15.870807106060607", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/put_get_image_data.html" + }, + { + "duration": "16.11391834343435", + "name": "smoothness.tough_canvas_cases/tough_canvas_cases/rendering_throughput/stroke_shapes.html" + }, + { + "duration": "21.345023229508197", + "name": "smoothness.tough_filters_cases/analog_clock_svg" + }, + { + "duration": "21.162696704918034", + "name": "smoothness.tough_filters_cases/filter_terrain_svg" + }, + { + "duration": "24.441053295081964", + "name": "smoothness.tough_filters_cases/ie_pirate_mark" + }, + { + "duration": "25.979630672131137", + "name": "smoothness.tough_filters_cases/motion_mark_focus" + }, + { + "duration": "16.190615245762718", + "name": "smoothness.tough_image_decode_cases/cats_unscaled" + }, + { + "duration": "10.54116988135593", + "name": "smoothness.tough_image_decode_cases/cats_viewport_width" + }, + { + "duration": "16.296360999999997", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-unscaled.html" + }, + { + "duration": "10.575817", + "name": "smoothness.tough_image_decode_cases/http://localhost:9000/cats-viewport-width.html" + }, + { + "duration": "26.831801852459034", + "name": "smoothness.tough_path_rendering_cases/guimark_vector_chart" + }, + { + "duration": "31.684677295081965", + "name": "smoothness.tough_path_rendering_cases/ie_chalkboard" + }, + { + "duration": "20.92570716393442", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_fill_shapes" + }, + { + "duration": "21.056270688524588", + "name": "smoothness.tough_path_rendering_cases/motion_mark_canvas_stroke_shapes" + }, + { + "duration": "17.146070540983605", + "name": "smoothness.tough_pinch_zoom_cases/amazon_pinch" + }, + { + "duration": "19.850274710526318", + "name": "smoothness.tough_pinch_zoom_cases/blogspot_pinch" + }, + { + "duration": "18.49401318032787", + "name": "smoothness.tough_pinch_zoom_cases/booking_pinch" + }, + { + "duration": "21.084434262295087", + "name": "smoothness.tough_pinch_zoom_cases/cnn_pinch" + }, + { + "duration": "18.379349803278693", + "name": "smoothness.tough_pinch_zoom_cases/ebay_pinch" + }, + { + "duration": "20.200942409836053", + "name": "smoothness.tough_pinch_zoom_cases/espn_pinch" + }, + { + "duration": "17.63264106557377", + "name": "smoothness.tough_pinch_zoom_cases/facebook_pinch" + }, + { + "duration": "21.4984471147541", + "name": "smoothness.tough_pinch_zoom_cases/gmail_pinch" + }, + { + "duration": "20.04281475409835", + "name": "smoothness.tough_pinch_zoom_cases/google_calendar_pinch" + }, + { + "duration": "18.136763098360667", + "name": "smoothness.tough_pinch_zoom_cases/google_image_pinch" + }, + { + "duration": "23.29388478688525", + "name": "smoothness.tough_pinch_zoom_cases/google_search_pinch" + }, + { + "duration": "17.182486180327864", + "name": "smoothness.tough_pinch_zoom_cases/linkedin_pinch" + }, + { + "duration": "19.469438524590164", + "name": "smoothness.tough_pinch_zoom_cases/twitter_pinch" + }, + { + "duration": "23.2429231147541", + "name": "smoothness.tough_pinch_zoom_cases/weather_pinch" + }, + { + "duration": "23.956703868852465", + "name": "smoothness.tough_pinch_zoom_cases/yahoo_games_pinch" + }, + { + "duration": "21.698386409836072", + "name": "smoothness.tough_pinch_zoom_cases/yahoo_news_pinch" + }, + { + "duration": "24.05364109836066", + "name": "smoothness.tough_pinch_zoom_cases/yahoo_sports_pinch" + }, + { + "duration": "19.869200295081964", + "name": "smoothness.tough_pinch_zoom_cases/youtube_pinch" + }, + { + "duration": "18.847303540983606", + "name": "smoothness.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "18.966237606557375", + "name": "smoothness.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "18.829337442622954", + "name": "smoothness.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "18.8945316557377", + "name": "smoothness.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "18.831891114754093", + "name": "smoothness.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "22.047175098360658", + "name": "smoothness.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "16.157517475409836", + "name": "smoothness.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "15.142000122950817", + "name": "smoothness.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "14.368170516393441", + "name": "smoothness.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "13.655936918032785", + "name": "smoothness.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "24.06814372131148", + "name": "smoothness.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "19.860441967213116", + "name": "smoothness.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "19.96723924590164", + "name": "smoothness.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "19.933946262295077", + "name": "smoothness.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "19.913688163934424", + "name": "smoothness.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "18.18256631147541", + "name": "smoothness.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "16.56473468852459", + "name": "smoothness.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "15.486981516393447", + "name": "smoothness.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "14.515805024590163", + "name": "smoothness.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "13.883499098360659", + "name": "smoothness.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "18.36990908196722", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "18.42711316393443", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "18.318384360655735", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "18.366071901639344", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "18.465494442622962", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "17.83910228333333", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "16.4680272295082", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "15.51992467213115", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "14.494020770491804", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "13.936371377049179", + "name": "smoothness.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "17.633219672131148", + "name": "smoothness.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "17.790567606557378", + "name": "smoothness.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "17.757097770491804", + "name": "smoothness.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "17.85748234426229", + "name": "smoothness.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "17.76425598360656", + "name": "smoothness.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "16.546033532786886", + "name": "smoothness.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "15.175983098360652", + "name": "smoothness.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "14.473115811475411", + "name": "smoothness.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "13.628749483606551", + "name": "smoothness.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "13.192075713114756", + "name": "smoothness.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "27.354231813559316", + "name": "smoothness.tough_texture_upload_cases/background_color_animation" + }, + { + "duration": "21.746200068965514", + "name": "smoothness.tough_texture_upload_cases/background_color_animation_with_gradient" + }, + { + "duration": "21.782055120689655", + "name": "smoothness.tough_texture_upload_cases/extra_large_texture_uploads" + }, + { + "duration": "21.037732224137937", + "name": "smoothness.tough_texture_upload_cases/large_texture_uploads" + }, + { + "duration": "21.57695798275862", + "name": "smoothness.tough_texture_upload_cases/medium_texture_uploads" + }, + { + "duration": "21.706344499999997", + "name": "smoothness.tough_texture_upload_cases/small_texture_uploads" + }, + { + "duration": "27.06156842622951", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgICQ15a9NxDIARjIASgBMghBC1XuTk8ezw.swf.webglbeta.html" + }, + { + "duration": "22.392097396551723", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgIDQ2Pb-MxCsAhj6ASgBMgi5DLoSO0gPbQ.swf.webglbeta.html" + }, + { + "duration": "22.42507820689655", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCN39CopQEQoAEY2AQoATIID59gK5hjjIg.swf.webglbeta.html" + }, + { + "duration": "22.395451568965512", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgKCNj4HgyAEQeBjYBCgBMgjQpPkOjyWNdw.1.swf.webglbeta.html" + }, + { + "duration": "22.401603122807018", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CICAgMDOrcnRGRB4GNgEKAEyCP_ZBSfwUFsj.swf.webglbeta.html" + }, + { + "duration": "22.390622849999996", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/CNP2xe_LmqPEKBCsAhj6ASgBMggnyMqth81h8Q.swf.webglbeta.html" + }, + { + "duration": "22.38537755932203", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CICAgMDO7Ye9-gEQ2AUYWigBMgjZxDii6aoK9w.swf.webglbeta.html" + }, + { + "duration": "22.38091410526316", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/clip-paths-CILZhLqO_-27bxB4GNgEKAEyCC46kMLBXnMT.swf.webglbeta.html" + }, + { + "duration": "22.393001050847456", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/filters-CNLa0t2T47qJ_wEQoAEY2AQoATIIFaIdc7VMBr4.swf.webglbeta.html" + }, + { + "duration": "22.443340288135595", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CICAgMDO7cfIzwEQ1AMYPCgBMghqY8tqyRCArQ.swf.webglbeta.html" + }, + { + "duration": "22.47187273333334", + "name": "smoothness.tough_webgl_ad_cases/http://localhost:8000/shapes-CK7ptO3F8bi2KxDQAhiYAigBMgij6QBQtD2gyA.swf.webglbeta.html" + }, + { + "duration": "4.368507578688524", + "name": "smoothness.tough_webgl_cases/animometer_webgl" + }, + { + "duration": "4.3792165770491795", + "name": "smoothness.tough_webgl_cases/aquarium" + }, + { + "duration": "4.382426836065574", + "name": "smoothness.tough_webgl_cases/aquarium_20k" + }, + { + "duration": "4.3809500852459005", + "name": "smoothness.tough_webgl_cases/blob" + }, + { + "duration": "4.374934229508197", + "name": "smoothness.tough_webgl_cases/dynamic_cube_map" + }, + { + "duration": "4.394998470491803", + "name": "smoothness.tough_webgl_cases/earth" + }, + { + "duration": "4.366718270491802", + "name": "smoothness.tough_webgl_cases/many_planets_deep" + }, + { + "duration": "9.553684991803278", + "name": "smoothness.tough_webgl_cases/nvidia_vertex_buffer_object" + }, + { + "duration": "4.373657596721311", + "name": "smoothness.tough_webgl_cases/particles" + }, + { + "duration": "4.3852163", + "name": "smoothness.tough_webgl_cases/san_angeles" + }, + { + "duration": "34.003356393442616", + "name": "speedometer-future/http://browserbench.org/Speedometer/" + }, + { + "duration": "33.654974033333325", + "name": "speedometer/http://browserbench.org/Speedometer/" + }, + { + "duration": "58.918045393442625", + "name": "speedometer2-future/Speedometer2" + }, + { + "duration": "57.894307721311485", + "name": "speedometer2/Speedometer2" + }, + { + "duration": "149.79887113114754", + "name": "start_with_url.cold.startup_pages/about:blank" + }, + { + "duration": "147.23244632786884", + "name": "start_with_url.cold.startup_pages/http://bbc.co.uk" + }, + { + "duration": "319.07762895081964", + "name": "start_with_url.warm.startup_pages/about:blank" + }, + { + "duration": "322.5786071311477", + "name": "start_with_url.warm.startup_pages/http://bbc.co.uk" + }, + { + "duration": "24.974968999999994", + "name": "system_health.common_mobile/background:media:imgur" + }, + { + "duration": "25.595931166666666", + "name": "system_health.common_mobile/background:search:google" + }, + { + "duration": "36.92547301639344", + "name": "system_health.common_mobile/background:social:facebook" + }, + { + "duration": "38.616953366666664", + "name": "system_health.common_mobile/background:tools:gmail" + }, + { + "duration": "94.44720266666668", + "name": "system_health.common_mobile/browse:chrome:newtab" + }, + { + "duration": "34.010893499999995", + "name": "system_health.common_mobile/browse:chrome:omnibox" + }, + { + "duration": "102.79069728333334", + "name": "system_health.common_mobile/browse:media:facebook_photos" + }, + { + "duration": "64.71095096666664", + "name": "system_health.common_mobile/browse:media:flickr_infinite_scroll" + }, + { + "duration": "96.16659753333337", + "name": "system_health.common_mobile/browse:media:imgur" + }, + { + "duration": "118.95419955000001", + "name": "system_health.common_mobile/browse:media:youtube" + }, + { + "duration": "118.12141295", + "name": "system_health.common_mobile/browse:news:cnn" + }, + { + "duration": "75.36605991666667", + "name": "system_health.common_mobile/browse:news:cricbuzz" + }, + { + "duration": "70.0767844", + "name": "system_health.common_mobile/browse:news:qq" + }, + { + "duration": "62.60237110000002", + "name": "system_health.common_mobile/browse:news:reddit" + }, + { + "duration": "70.11665231666669", + "name": "system_health.common_mobile/browse:news:washingtonpost" + }, + { + "duration": "91.54142686666663", + "name": "system_health.common_mobile/browse:shopping:amazon" + }, + { + "duration": "86.33546050000001", + "name": "system_health.common_mobile/browse:shopping:avito" + }, + { + "duration": "44.1969528", + "name": "system_health.common_mobile/browse:shopping:lazada" + }, + { + "duration": "90.92550580000002", + "name": "system_health.common_mobile/browse:social:facebook" + }, + { + "duration": "248.16756949999998", + "name": "system_health.common_mobile/browse:social:facebook_infinite_scroll" + }, + { + "duration": "112.03981985", + "name": "system_health.common_mobile/browse:social:instagram" + }, + { + "duration": "110.19963486666671", + "name": "system_health.common_mobile/browse:social:pinterest_infinite_scroll" + }, + { + "duration": "137.20686766666668", + "name": "system_health.common_mobile/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "67.09152128333332", + "name": "system_health.common_mobile/browse:social:twitter" + }, + { + "duration": "94.99666576666665", + "name": "system_health.common_mobile/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "58.435897266666665", + "name": "system_health.common_mobile/browse:tools:maps" + }, + { + "duration": "21.540348583333333", + "name": "system_health.common_mobile/load:chrome:blank" + }, + { + "duration": "27.254568100000007", + "name": "system_health.common_mobile/load:games:bubbles" + }, + { + "duration": "21.926923833333337", + "name": "system_health.common_mobile/load:games:lazors" + }, + { + "duration": "25.923831266666657", + "name": "system_health.common_mobile/load:media:dailymotion" + }, + { + "duration": "24.881356949999997", + "name": "system_health.common_mobile/load:media:facebook_photos" + }, + { + "duration": "24.242558449999997", + "name": "system_health.common_mobile/load:media:google_images" + }, + { + "duration": "25.042856083333337", + "name": "system_health.common_mobile/load:media:imgur" + }, + { + "duration": "24.18735763333334", + "name": "system_health.common_mobile/load:media:soundcloud" + }, + { + "duration": "24.020248750000004", + "name": "system_health.common_mobile/load:media:youtube" + }, + { + "duration": "38.90185256666667", + "name": "system_health.common_mobile/load:news:cnn" + }, + { + "duration": "29.061695499999995", + "name": "system_health.common_mobile/load:news:irctc" + }, + { + "duration": "28.09110954999999", + "name": "system_health.common_mobile/load:news:nytimes" + }, + { + "duration": "24.00289666666666", + "name": "system_health.common_mobile/load:news:qq" + }, + { + "duration": "24.346915949999996", + "name": "system_health.common_mobile/load:news:reddit" + }, + { + "duration": "27.996436616666657", + "name": "system_health.common_mobile/load:news:washingtonpost" + }, + { + "duration": "24.291215083333334", + "name": "system_health.common_mobile/load:news:wikipedia" + }, + { + "duration": "23.708367866666663", + "name": "system_health.common_mobile/load:search:baidu" + }, + { + "duration": "25.024297316666665", + "name": "system_health.common_mobile/load:search:ebay" + }, + { + "duration": "22.7154981", + "name": "system_health.common_mobile/load:search:google" + }, + { + "duration": "24.73392836666667", + "name": "system_health.common_mobile/load:search:taobao" + }, + { + "duration": "22.765068466666662", + "name": "system_health.common_mobile/load:search:yahoo" + }, + { + "duration": "23.097653766666667", + "name": "system_health.common_mobile/load:search:yandex" + }, + { + "duration": "23.656330433333334", + "name": "system_health.common_mobile/load:social:twitter" + }, + { + "duration": "22.963096716666666", + "name": "system_health.common_mobile/load:tools:docs" + }, + { + "duration": "29.37227408333334", + "name": "system_health.common_mobile/load:tools:drive" + }, + { + "duration": "26.37017631666668", + "name": "system_health.common_mobile/load:tools:dropbox" + }, + { + "duration": "24.112650999999993", + "name": "system_health.common_mobile/load:tools:stackoverflow" + }, + { + "duration": "29.871860683333338", + "name": "system_health.common_mobile/load:tools:weather" + }, + { + "duration": "137.63500200000001", + "name": "system_health.common_mobile/long_running:tools:gmail-background" + }, + { + "duration": "135.997162", + "name": "system_health.common_mobile/long_running:tools:gmail-foreground" + }, + { + "duration": "69.03044967213118", + "name": "system_health.memory_mobile/background:media:imgur" + }, + { + "duration": "71.42083867213114", + "name": "system_health.memory_mobile/background:search:google" + }, + { + "duration": "74.95382201639342", + "name": "system_health.memory_mobile/background:social:facebook" + }, + { + "duration": "88.00619837704916", + "name": "system_health.memory_mobile/background:tools:gmail" + }, + { + "duration": "228.70283788333327", + "name": "system_health.memory_mobile/browse:chrome:newtab" + }, + { + "duration": "90.45646471666669", + "name": "system_health.memory_mobile/browse:chrome:omnibox" + }, + { + "duration": "220.74425631147543", + "name": "system_health.memory_mobile/browse:media:facebook_photos" + }, + { + "duration": "133.66095613333337", + "name": "system_health.memory_mobile/browse:media:flickr_infinite_scroll" + }, + { + "duration": "206.38325358333324", + "name": "system_health.memory_mobile/browse:media:imgur" + }, + { + "duration": "240.9389626166667", + "name": "system_health.memory_mobile/browse:media:youtube" + }, + { + "duration": "168.6971696885246", + "name": "system_health.memory_mobile/browse:news:cnn" + }, + { + "duration": "149.61992381967212", + "name": "system_health.memory_mobile/browse:news:cricbuzz" + }, + { + "duration": "143.87965306666663", + "name": "system_health.memory_mobile/browse:news:qq" + }, + { + "duration": "144.53127243333333", + "name": "system_health.memory_mobile/browse:news:reddit" + }, + { + "duration": "140.8670915333333", + "name": "system_health.memory_mobile/browse:news:washingtonpost" + }, + { + "duration": "151.60782647540987", + "name": "system_health.memory_mobile/browse:shopping:amazon" + }, + { + "duration": "158.2903343389831", + "name": "system_health.memory_mobile/browse:shopping:avito" + }, + { + "duration": "92.204626852459", + "name": "system_health.memory_mobile/browse:shopping:lazada" + }, + { + "duration": "179.06597370491806", + "name": "system_health.memory_mobile/browse:social:facebook" + }, + { + "duration": "230.48076523333341", + "name": "system_health.memory_mobile/browse:social:facebook_infinite_scroll" + }, + { + "duration": "253.41301766666678", + "name": "system_health.memory_mobile/browse:social:instagram" + }, + { + "duration": "209.26540096666662", + "name": "system_health.memory_mobile/browse:social:pinterest_infinite_scroll" + }, + { + "duration": "208.02696093333333", + "name": "system_health.memory_mobile/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "143.8900781", + "name": "system_health.memory_mobile/browse:social:twitter" + }, + { + "duration": "166.71923127868848", + "name": "system_health.memory_mobile/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "130.56581421666667", + "name": "system_health.memory_mobile/browse:tools:maps" + }, + { + "duration": "72.90530713114755", + "name": "system_health.memory_mobile/load:chrome:blank" + }, + { + "duration": "64.62599843333332", + "name": "system_health.memory_mobile/load:games:bubbles" + }, + { + "duration": "65.29436446666668", + "name": "system_health.memory_mobile/load:games:lazors" + }, + { + "duration": "79.31413863333334", + "name": "system_health.memory_mobile/load:games:spychase" + }, + { + "duration": "71.02942026666668", + "name": "system_health.memory_mobile/load:media:dailymotion" + }, + { + "duration": "68.52481141666667", + "name": "system_health.memory_mobile/load:media:facebook_photos" + }, + { + "duration": "67.78902611666666", + "name": "system_health.memory_mobile/load:media:google_images" + }, + { + "duration": "66.746272", + "name": "system_health.memory_mobile/load:media:imgur" + }, + { + "duration": "67.90991743333333", + "name": "system_health.memory_mobile/load:media:soundcloud" + }, + { + "duration": "68.60652006666668", + "name": "system_health.memory_mobile/load:media:youtube" + }, + { + "duration": "81.14658734999998", + "name": "system_health.memory_mobile/load:news:cnn" + }, + { + "duration": "67.90061683333334", + "name": "system_health.memory_mobile/load:news:irctc" + }, + { + "duration": "71.87558824999999", + "name": "system_health.memory_mobile/load:news:nytimes" + }, + { + "duration": "67.39154025", + "name": "system_health.memory_mobile/load:news:qq" + }, + { + "duration": "68.88368848333333", + "name": "system_health.memory_mobile/load:news:reddit" + }, + { + "duration": "69.72707446666668", + "name": "system_health.memory_mobile/load:news:washingtonpost" + }, + { + "duration": "69.26048315000001", + "name": "system_health.memory_mobile/load:news:wikipedia" + }, + { + "duration": "67.42002770000002", + "name": "system_health.memory_mobile/load:search:baidu" + }, + { + "duration": "66.47678118333333", + "name": "system_health.memory_mobile/load:search:ebay" + }, + { + "duration": "65.79356139999999", + "name": "system_health.memory_mobile/load:search:google" + }, + { + "duration": "67.67027786666667", + "name": "system_health.memory_mobile/load:search:taobao" + }, + { + "duration": "66.84180556666665", + "name": "system_health.memory_mobile/load:search:yahoo" + }, + { + "duration": "66.70497881666667", + "name": "system_health.memory_mobile/load:search:yandex" + }, + { + "duration": "66.95931826666667", + "name": "system_health.memory_mobile/load:social:twitter" + }, + { + "duration": "67.10365841666666", + "name": "system_health.memory_mobile/load:tools:docs" + }, + { + "duration": "70.41736001666668", + "name": "system_health.memory_mobile/load:tools:drive" + }, + { + "duration": "69.28514498333334", + "name": "system_health.memory_mobile/load:tools:dropbox" + }, + { + "duration": "68.54638874999999", + "name": "system_health.memory_mobile/load:tools:stackoverflow" + }, + { + "duration": "73.36293383333333", + "name": "system_health.memory_mobile/load:tools:weather" + }, + { + "duration": "882.0575373333334", + "name": "system_health.memory_mobile/long_running:tools:gmail-background" + }, + { + "duration": "743.9074793333333", + "name": "system_health.memory_mobile/long_running:tools:gmail-foreground" + }, + { + "duration": "35.79984774747476", + "name": "thread_times.key_idle_power_cases/animated-gif.html" + }, + { + "duration": "42.88722106060608", + "name": "thread_times.key_idle_power_cases/blank.html" + }, + { + "duration": "37.08725779797979", + "name": "thread_times.key_idle_power_cases/css-animation.html" + }, + { + "duration": "40.58842495959595", + "name": "thread_times.key_idle_power_cases/request-animation-frame.html" + }, + { + "duration": "37.88519412121212", + "name": "thread_times.key_idle_power_cases/set-timeout.html" + }, + { + "duration": "107.98949859595956", + "name": "thread_times.key_idle_power_cases/set-timeout.html (Long Idle)" + }, + { + "duration": "34.3025540909091", + "name": "thread_times.key_mobile_sites_smooth/boingboing" + }, + { + "duration": "32.76085289898991", + "name": "thread_times.key_mobile_sites_smooth/cuteoverload" + }, + { + "duration": "33.86383571717172", + "name": "thread_times.key_mobile_sites_smooth/nytimes" + }, + { + "duration": "26.162444696969708", + "name": "thread_times.key_mobile_sites_smooth/reddit" + }, + { + "duration": "24.492774050505044", + "name": "thread_times.key_mobile_sites_smooth/slashdot" + }, + { + "duration": "27.06468106060606", + "name": "thread_times.key_noop_cases/no_op_raf.html" + }, + { + "duration": "18.66574421212121", + "name": "thread_times.key_noop_cases/no_op_scroll.html" + }, + { + "duration": "16.409880343434345", + "name": "thread_times.key_noop_cases/no_op_settimeout.html" + }, + { + "duration": "21.924679494949487", + "name": "thread_times.key_noop_cases/no_op_touch_handler.html" + }, + { + "duration": "17.999973836065575", + "name": "thread_times.key_silk_cases/card_expansion" + }, + { + "duration": "19.75223260655737", + "name": "thread_times.key_silk_cases/card_expansion_animated" + }, + { + "duration": "19.472481147540986", + "name": "thread_times.key_silk_cases/card_expansion_images_text" + }, + { + "duration": "18.078055622950817", + "name": "thread_times.key_silk_cases/card_flying" + }, + { + "duration": "18.715183967213108", + "name": "thread_times.key_silk_cases/coordinated_animation" + }, + { + "duration": "17.75132306557377", + "name": "thread_times.key_silk_cases/font_wipe" + }, + { + "duration": "17.744295808080818", + "name": "thread_times.key_silk_cases/font_wipe.html" + }, + { + "duration": "21.50892396721312", + "name": "thread_times.key_silk_cases/google_news_ios" + }, + { + "duration": "18.357626032786882", + "name": "thread_times.key_silk_cases/gws_boogie_expansion" + }, + { + "duration": "18.89722509836066", + "name": "thread_times.key_silk_cases/gws_google_expansion" + }, + { + "duration": "19.210452278688518", + "name": "thread_times.key_silk_cases/horizontal_vertical_expansion" + }, + { + "duration": "32.41806385858585", + "name": "thread_times.key_silk_cases/http://groupcloned.com/test/plain/list-recycle-transform.html" + }, + { + "duration": "17.064412313131317", + "name": "thread_times.key_silk_cases/http://groupcloned.com/test/plain/sticky-using-webkit-backface-visibility.html" + }, + { + "duration": "14.458769035353551", + "name": "thread_times.key_silk_cases/http://jsbin.com/UVIgUTa/38/quiet" + }, + { + "duration": "18.46020021212122", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/3yDKh/15/show/" + }, + { + "duration": "18.0857585959596", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/3yDKh/16/show/" + }, + { + "duration": "18.66951686868687", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/R8DX9/4/show/" + }, + { + "duration": "19.552565777777783", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/TLXLu/3/show/" + }, + { + "duration": "19.542680515151517", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/bNp2h/3/show/" + }, + { + "duration": "20.312292262626265", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/cKB9D/7/show/" + }, + { + "duration": "20.243373202020205", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/jx5De/14/show/" + }, + { + "duration": "18.522802545454542", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/rF9Gh/7/show/" + }, + { + "duration": "18.74329997979798", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/ugkd4/10/show/" + }, + { + "duration": "20.58765239393939", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/vBQHH/11/show/" + }, + { + "duration": "18.32988457575758", + "name": "thread_times.key_silk_cases/http://jsfiddle.net/xLuvC/1/show/" + }, + { + "duration": "21.54538492929293", + "name": "thread_times.key_silk_cases/http://mobile-news.sandbox.google.com/news/pt0?scroll" + }, + { + "duration": "15.727110186868687", + "name": "thread_times.key_silk_cases/http://mobile-news.sandbox.google.com/news/pt0?swipe" + }, + { + "duration": "30.1632374040404", + "name": "thread_times.key_silk_cases/http://wiltzius.github.io/shape-shifter/" + }, + { + "duration": "18.845124777777773", + "name": "thread_times.key_silk_cases/http://www.google.com/#q=google" + }, + { + "duration": "18.277203818181828", + "name": "thread_times.key_silk_cases/https://www.google.com/search?hl=en&q=define%3Aboogie" + }, + { + "duration": "33.10727125252527", + "name": "thread_times.key_silk_cases/inbox_app.html?stress_hidey_bars" + }, + { + "duration": "22.397924252525254", + "name": "thread_times.key_silk_cases/inbox_app.html?toggle_drawer" + }, + { + "duration": "28.995927524590165", + "name": "thread_times.key_silk_cases/infinite_scrolling" + }, + { + "duration": "29.16774575757576", + "name": "thread_times.key_silk_cases/infinite_scrolling.html" + }, + { + "duration": "15.610924926229501", + "name": "thread_times.key_silk_cases/list_animation_simple" + }, + { + "duration": "15.846582843434346", + "name": "thread_times.key_silk_cases/list_animation_simple.html" + }, + { + "duration": "32.40474127868853", + "name": "thread_times.key_silk_cases/list_recycle_transform" + }, + { + "duration": "19.10130004918033", + "name": "thread_times.key_silk_cases/mask_transition_animation" + }, + { + "duration": "15.877968327868858", + "name": "thread_times.key_silk_cases/mobile_news_sandbox" + }, + { + "duration": "20.373808196721313", + "name": "thread_times.key_silk_cases/parallax_effect" + }, + { + "duration": "14.504173442622951", + "name": "thread_times.key_silk_cases/physical_simulation" + }, + { + "duration": "20.409190313131322", + "name": "thread_times.key_silk_cases/pushState.html" + }, + { + "duration": "29.045594967213116", + "name": "thread_times.key_silk_cases/silk_finance" + }, + { + "duration": "29.623334151515152", + "name": "thread_times.key_silk_cases/silk_finance.html" + }, + { + "duration": "16.9895437704918", + "name": "thread_times.key_silk_cases/sticky_using_webkit" + }, + { + "duration": "32.90224080327868", + "name": "thread_times.key_silk_cases/stress_hidey_bars" + }, + { + "duration": "30.270459868852456", + "name": "thread_times.key_silk_cases/svg_icon_raster" + }, + { + "duration": "18.311246688524587", + "name": "thread_times.key_silk_cases/swipe_to_dismiss" + }, + { + "duration": "22.519694803278693", + "name": "thread_times.key_silk_cases/toggle_drawer" + }, + { + "duration": "20.24437518032787", + "name": "thread_times.key_silk_cases/update_history_state" + }, + { + "duration": "20.346623163934428", + "name": "thread_times.key_silk_cases/vertical_expansion" + }, + { + "duration": "18.589314819672136", + "name": "thread_times.key_silk_cases/zoom_in_animation" + }, + { + "duration": "39.29848354545454", + "name": "thread_times.simple_mobile_sites/ebay_scroll" + }, + { + "duration": "30.682887343434345", + "name": "thread_times.simple_mobile_sites/flickr_scroll" + }, + { + "duration": "31.54496540404039", + "name": "thread_times.simple_mobile_sites/http://m.nytimes.com/" + }, + { + "duration": "39.561392040404044", + "name": "thread_times.simple_mobile_sites/http://www.ebay.co.uk/" + }, + { + "duration": "33.5069418282828", + "name": "thread_times.simple_mobile_sites/http://www.nyc.gov" + }, + { + "duration": "30.465235626262622", + "name": "thread_times.simple_mobile_sites/https://www.flickr.com/" + }, + { + "duration": "33.76200130303029", + "name": "thread_times.simple_mobile_sites/nyc_gov_scroll" + }, + { + "duration": "31.59959693939394", + "name": "thread_times.simple_mobile_sites/nytimes_scroll" + }, + { + "duration": "35.56198336065574", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/beqojupo/1/quiet?JS_FULL_SCREEN_INVALIDATION" + }, + { + "duration": "32.15435601639345", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/covoqi/1/quiet?NEW_TILINGS" + }, + { + "duration": "27.013010245901647", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/falefice/1/quiet?CC_POSTER_CIRCLE" + }, + { + "duration": "29.97447018032787", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/giqafofe/1/quiet?JS_POSTER_CIRCLE" + }, + { + "duration": "29.44411008196722", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/jevibahi/4/quiet?JS_SCROLL_200_LAYER_GRID" + }, + { + "duration": "33.50462498360656", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/pixavefe/1/quiet?CC_SCROLL_TEXT_ONLY" + }, + { + "duration": "29.37349708196722", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/wixadinu/2/quiet?JS_SCROLL_TEXT_ONLY" + }, + { + "duration": "28.84416409836066", + "name": "thread_times.tough_compositor_cases/http://jsbin.com/yakagevo/1/quiet?CC_SCROLL_200_LAYER_GRID" + }, + { + "duration": "27.928630836065576", + "name": "thread_times.tough_scrolling_cases/canvas_05000_pixels_per_second" + }, + { + "duration": "40.19413134426229", + "name": "thread_times.tough_scrolling_cases/canvas_10000_pixels_per_second" + }, + { + "duration": "25.449655737704912", + "name": "thread_times.tough_scrolling_cases/canvas_15000_pixels_per_second" + }, + { + "duration": "22.69886003278689", + "name": "thread_times.tough_scrolling_cases/canvas_20000_pixels_per_second" + }, + { + "duration": "22.775494590163934", + "name": "thread_times.tough_scrolling_cases/canvas_30000_pixels_per_second" + }, + { + "duration": "21.000251540983612", + "name": "thread_times.tough_scrolling_cases/canvas_40000_pixels_per_second" + }, + { + "duration": "19.20413249180328", + "name": "thread_times.tough_scrolling_cases/canvas_50000_pixels_per_second" + }, + { + "duration": "17.739757278688526", + "name": "thread_times.tough_scrolling_cases/canvas_60000_pixels_per_second" + }, + { + "duration": "16.590688901639343", + "name": "thread_times.tough_scrolling_cases/canvas_75000_pixels_per_second" + }, + { + "duration": "15.686084057377043", + "name": "thread_times.tough_scrolling_cases/canvas_90000_pixels_per_second" + }, + { + "duration": "28.419994983606554", + "name": "thread_times.tough_scrolling_cases/text_05000_pixels_per_second" + }, + { + "duration": "24.994728508196726", + "name": "thread_times.tough_scrolling_cases/text_10000_pixels_per_second" + }, + { + "duration": "25.455224770491803", + "name": "thread_times.tough_scrolling_cases/text_15000_pixels_per_second" + }, + { + "duration": "25.8692473442623", + "name": "thread_times.tough_scrolling_cases/text_20000_pixels_per_second" + }, + { + "duration": "26.452714475409838", + "name": "thread_times.tough_scrolling_cases/text_30000_pixels_per_second" + }, + { + "duration": "23.857618131147536", + "name": "thread_times.tough_scrolling_cases/text_40000_pixels_per_second" + }, + { + "duration": "20.83381818032787", + "name": "thread_times.tough_scrolling_cases/text_50000_pixels_per_second" + }, + { + "duration": "19.254617180327866", + "name": "thread_times.tough_scrolling_cases/text_60000_pixels_per_second" + }, + { + "duration": "18.028861098360657", + "name": "thread_times.tough_scrolling_cases/text_75000_pixels_per_second" + }, + { + "duration": "16.625232409836066", + "name": "thread_times.tough_scrolling_cases/text_90000_pixels_per_second" + }, + { + "duration": "22.362297688524592", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_05000_pixels_per_second" + }, + { + "duration": "22.801194196721312", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_10000_pixels_per_second" + }, + { + "duration": "23.058994983606556", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_15000_pixels_per_second" + }, + { + "duration": "23.348151688524588", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_20000_pixels_per_second" + }, + { + "duration": "23.440361967213118", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_30000_pixels_per_second" + }, + { + "duration": "22.339080442622947", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_40000_pixels_per_second" + }, + { + "duration": "19.80756396721312", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_50000_pixels_per_second" + }, + { + "duration": "17.981644180327873", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_60000_pixels_per_second" + }, + { + "duration": "16.309696885245902", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_75000_pixels_per_second" + }, + { + "duration": "15.18703783606557", + "name": "thread_times.tough_scrolling_cases/text_constant_full_page_raster_90000_pixels_per_second" + }, + { + "duration": "17.909988754098357", + "name": "thread_times.tough_scrolling_cases/text_hover_05000_pixels_per_second" + }, + { + "duration": "18.327462081967216", + "name": "thread_times.tough_scrolling_cases/text_hover_10000_pixels_per_second" + }, + { + "duration": "18.443906344262295", + "name": "thread_times.tough_scrolling_cases/text_hover_15000_pixels_per_second" + }, + { + "duration": "18.556158868852464", + "name": "thread_times.tough_scrolling_cases/text_hover_20000_pixels_per_second" + }, + { + "duration": "18.743114557377048", + "name": "thread_times.tough_scrolling_cases/text_hover_30000_pixels_per_second" + }, + { + "duration": "17.228211786885243", + "name": "thread_times.tough_scrolling_cases/text_hover_40000_pixels_per_second" + }, + { + "duration": "15.593335721311469", + "name": "thread_times.tough_scrolling_cases/text_hover_50000_pixels_per_second" + }, + { + "duration": "14.843192024590161", + "name": "thread_times.tough_scrolling_cases/text_hover_60000_pixels_per_second" + }, + { + "duration": "13.919484139344265", + "name": "thread_times.tough_scrolling_cases/text_hover_75000_pixels_per_second" + }, + { + "duration": "13.259781483606556", + "name": "thread_times.tough_scrolling_cases/text_hover_90000_pixels_per_second" + }, + { + "duration": "11.62648680327869", + "name": "tracing.tracing_with_background_memory_infra/Facebook" + }, + { + "duration": "12.268152721311475", + "name": "tracing.tracing_with_background_memory_infra/Wikipedia" + }, + { + "duration": "10.378211418032787", + "name": "tracing.tracing_with_background_memory_infra/http://www.amazon.com" + }, + { + "duration": "10.544552270491808", + "name": "tracing.tracing_with_background_memory_infra/http://www.ask.com/" + }, + { + "duration": "10.287894295081967", + "name": "tracing.tracing_with_background_memory_infra/http://www.bing.com/" + }, + { + "duration": "10.545187467213117", + "name": "tracing.tracing_with_background_memory_infra/http://www.yahoo.com/" + }, + { + "duration": "13.037905959016394", + "name": "tracing.tracing_with_background_memory_infra/http://www.youtube.com" + }, + { + "duration": "16.039089139344263", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/#hl=en&q=barack+obama" + }, + { + "duration": "13.429725614754101", + "name": "tracing.tracing_with_background_memory_infra/https://www.google.com/calendar/" + }, + { + "duration": "105.41662453333336", + "name": "v8.browsing_mobile-future/browse:chrome:newtab" + }, + { + "duration": "38.94349348333334", + "name": "v8.browsing_mobile-future/browse:chrome:omnibox" + }, + { + "duration": "123.86885229508202", + "name": "v8.browsing_mobile-future/browse:media:facebook_photos" + }, + { + "duration": "78.73990490000003", + "name": "v8.browsing_mobile-future/browse:media:flickr_infinite_scroll" + }, + { + "duration": "123.45371616666667", + "name": "v8.browsing_mobile-future/browse:media:imgur" + }, + { + "duration": "134.32480450000006", + "name": "v8.browsing_mobile-future/browse:media:youtube" + }, + { + "duration": "178.66558918032794", + "name": "v8.browsing_mobile-future/browse:news:cnn" + }, + { + "duration": "96.6198143833333", + "name": "v8.browsing_mobile-future/browse:news:cricbuzz" + }, + { + "duration": "82.94377130508472", + "name": "v8.browsing_mobile-future/browse:news:qq" + }, + { + "duration": "73.82486696666668", + "name": "v8.browsing_mobile-future/browse:news:reddit" + }, + { + "duration": "88.8525413", + "name": "v8.browsing_mobile-future/browse:news:washingtonpost" + }, + { + "duration": "126.61729618032788", + "name": "v8.browsing_mobile-future/browse:shopping:amazon" + }, + { + "duration": "112.14767894999997", + "name": "v8.browsing_mobile-future/browse:shopping:avito" + }, + { + "duration": "53.97795329508197", + "name": "v8.browsing_mobile-future/browse:shopping:lazada" + }, + { + "duration": "116.932776147541", + "name": "v8.browsing_mobile-future/browse:social:facebook" + }, + { + "duration": "346.3331828333333", + "name": "v8.browsing_mobile-future/browse:social:facebook_infinite_scroll" + }, + { + "duration": "137.20034833333338", + "name": "v8.browsing_mobile-future/browse:social:instagram" + }, + { + "duration": "147.67553700000005", + "name": "v8.browsing_mobile-future/browse:social:pinterest_infinite_scroll" + }, + { + "duration": "168.0231745", + "name": "v8.browsing_mobile-future/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "77.82194965000004", + "name": "v8.browsing_mobile-future/browse:social:twitter" + }, + { + "duration": "123.03254488524593", + "name": "v8.browsing_mobile-future/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "76.34013451666665", + "name": "v8.browsing_mobile-future/browse:tools:maps" + }, + { + "duration": "105.47530078947368", + "name": "v8.browsing_mobile/browse:chrome:newtab" + }, + { + "duration": "38.530946767857145", + "name": "v8.browsing_mobile/browse:chrome:omnibox" + }, + { + "duration": "124.42940463934427", + "name": "v8.browsing_mobile/browse:media:facebook_photos" + }, + { + "duration": "78.50806563793105", + "name": "v8.browsing_mobile/browse:media:flickr_infinite_scroll" + }, + { + "duration": "123.84028077586207", + "name": "v8.browsing_mobile/browse:media:imgur" + }, + { + "duration": "132.47249980392155", + "name": "v8.browsing_mobile/browse:media:youtube" + }, + { + "duration": "179.8774849180328", + "name": "v8.browsing_mobile/browse:news:cnn" + }, + { + "duration": "93.89134496610167", + "name": "v8.browsing_mobile/browse:news:cricbuzz" + }, + { + "duration": "82.70660055357145", + "name": "v8.browsing_mobile/browse:news:qq" + }, + { + "duration": "73.51167000000001", + "name": "v8.browsing_mobile/browse:news:reddit" + }, + { + "duration": "88.70962062745097", + "name": "v8.browsing_mobile/browse:news:washingtonpost" + }, + { + "duration": "123.76626196721311", + "name": "v8.browsing_mobile/browse:shopping:amazon" + }, + { + "duration": "112.45641118032789", + "name": "v8.browsing_mobile/browse:shopping:avito" + }, + { + "duration": "54.440948147540965", + "name": "v8.browsing_mobile/browse:shopping:lazada" + }, + { + "duration": "117.23906829508196", + "name": "v8.browsing_mobile/browse:social:facebook" + }, + { + "duration": "347.31532147540975", + "name": "v8.browsing_mobile/browse:social:facebook_infinite_scroll" + }, + { + "duration": "135.43384913793105", + "name": "v8.browsing_mobile/browse:social:instagram" + }, + { + "duration": "147.1208457142857", + "name": "v8.browsing_mobile/browse:social:pinterest_infinite_scroll" + }, + { + "duration": "167.05851574074075", + "name": "v8.browsing_mobile/browse:social:tumblr_infinite_scroll" + }, + { + "duration": "77.42943426923078", + "name": "v8.browsing_mobile/browse:social:twitter" + }, + { + "duration": "122.23090967213116", + "name": "v8.browsing_mobile/browse:tech:discourse_infinite_scroll" + }, + { + "duration": "76.53326107017546", + "name": "v8.browsing_mobile/browse:tools:maps" + }, + { + "duration": "27.498429590163944", + "name": "wasm/AsmJsZenGarden" + }, + { + "duration": "64.15932316393443", + "name": "wasm/WasmSpaceBuggy" + }, + { + "duration": "27.54625806557376", + "name": "wasm/WasmStylizedRenderer" + }, + { + "duration": "27.556006065573772", + "name": "wasm/WasmSunTemple" + }, + { + "duration": "48.98831089344265", + "name": "wasm/WasmTanks" + }, + { + "duration": "27.51685060655738", + "name": "wasm/WasmZenGarden" + }, + { + "duration": "21.52393575409837", + "name": "webrtc/10s_datachannel_transfer" + }, + { + "duration": "27.097270950819677", + "name": "webrtc/canvas_capture_peer_connection" + }, + { + "duration": "37.32259072131148", + "name": "webrtc/codec_constraints_h264" + }, + { + "duration": "37.41315247540984", + "name": "webrtc/codec_constraints_vp8" + }, + { + "duration": "37.29322452459017", + "name": "webrtc/codec_constraints_vp9" + }, + { + "duration": "23.59042208196722", + "name": "webrtc/hd_local_stream_10s" + }, + { + "duration": "44.92994696721313", + "name": "webrtc/multiple_peerconnections" + }, + { + "duration": "67.37556847540985", + "name": "webrtc/pause_play_peerconnections" + } +] \ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/pixel2_webview_story_timing.json b/tools/perf/core/shard_maps/timing_data/pixel2_webview_story_timing.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/tools/perf/core/shard_maps/timing_data/pixel2_webview_story_timing.json
@@ -0,0 +1 @@ +[] \ No newline at end of file
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index fcac6c51..beda6274 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -424,9 +424,11 @@ [ Mac ] v8.browsing_desktop/browse:news:cnn [ Skip ] crbug.com/798465 [ Mac ] v8.browsing_desktop/browse:news:flipboard [ Skip ] crbug.com/798465 [ Win ] v8.browsing_desktop/browse:news:flipboard [ Skip ] +crbug.com/854203 [ Win ] v8.browsing_desktop-future/browse:news:nytimes [ Skip ] crbug.com/813165 [ Win ] v8.browsing_desktop/browse:media:flickr_infinite_scroll [ Skip ] crbug.com/805934 [ Mac_10.12 ] v8.browsing_desktop/browse:tech:discourse_infinite_scroll [ Skip ] crbug.com/839470 [ Win ] v8.browsing_desktop/browse:social:twitter_infinite_scroll [ Skip ] +crbug.com/854239 [ Linux ] v8.browsing_desktop/browse:social:twitter_infinite_scroll [ Skip ] # Benchmark: v8.browsing_desktop-future crbug.com/773084 [ Mac ] v8.browsing_desktop-future/browse:tools:maps [ Skip ] @@ -440,6 +442,7 @@ crbug.com/676336 [ Win ] v8.browsing_desktop-future/browse:media:flickr_infinite_scroll [ Skip ] crbug.com/805934 [ Mac_10.12 ] v8.browsing_desktop-future/browse:tech:discourse_infinite_scroll [ Skip ] crbug.com/839470 [ Win ] v8.browsing_desktop-future/browse:social:twitter_infinite_scroll [ Skip ] +crbug.com/854239 [ Linux ] v8.browsing_desktop-future/browse:social:twitter_infinite_scroll [ Skip ] # Benchmark: v8.browsing_mobile crbug.com/714650 [ Android ] v8.browsing_mobile/browse:news:globo [ Skip ]
diff --git a/tools/perf/page_sets/data/intl_ar_fa_he.json b/tools/perf/page_sets/data/intl_ar_fa_he.json index e244088c..7c46512 100644 --- a/tools/perf/page_sets/data/intl_ar_fa_he.json +++ b/tools/perf/page_sets/data/intl_ar_fa_he.json
@@ -1,36 +1,54 @@ { "archives": { - "http://farsnews.com/": { + "http://farsnews.com/_cold": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://msn.co.il/": { + }, + "http://farsnews.com/_warm": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.aljayyash.net/": { + }, + "http://msn.co.il/_cold": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.google.com.sa/": { + }, + "http://msn.co.il/_warm": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.islamweb.net/": { + }, + "http://www.aljayyash.net/_cold": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.kooora.com/default.aspx": { + }, + "http://www.aljayyash.net/_warm": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.masrawy.com/": { + }, + "http://www.google.com.sa/_cold": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.startimes.com/f.aspx": { + }, + "http://www.google.com.sa/_warm": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://www.walla.co.il/": { + }, + "http://www.islamweb.net/_cold": { "DEFAULT": "intl_ar_fa_he_000.wprgo" - }, - "http://ynet.co.il/": { + }, + "http://www.islamweb.net/_warm": { + "DEFAULT": "intl_ar_fa_he_000.wprgo" + }, + "http://www.masrawy.com/_cold": { + "DEFAULT": "intl_ar_fa_he_000.wprgo" + }, + "http://www.masrawy.com/_warm": { + "DEFAULT": "intl_ar_fa_he_000.wprgo" + }, + "http://www.startimes.com/f.aspx_cold": { + "DEFAULT": "intl_ar_fa_he_000.wprgo" + }, + "http://www.startimes.com/f.aspx_warm": { + "DEFAULT": "intl_ar_fa_he_000.wprgo" + }, + "http://ynet.co.il/_cold": { + "DEFAULT": "intl_ar_fa_he_000.wprgo" + }, + "http://ynet.co.il/_warm": { "DEFAULT": "intl_ar_fa_he_000.wprgo" } - }, - "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + }, + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", "platform_specific": true } \ No newline at end of file
diff --git a/tools/perf/page_sets/data/intl_es_fr_pt-BR.json b/tools/perf/page_sets/data/intl_es_fr_pt-BR.json index 0a0ee05ae..13a79550 100644 --- a/tools/perf/page_sets/data/intl_es_fr_pt-BR.json +++ b/tools/perf/page_sets/data/intl_es_fr_pt-BR.json
@@ -1,36 +1,66 @@ { "archives": { - "http://elmundo.es/": { + "http://elmundo.es/_cold": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://produto.mercadolivre.com.br/MLB-468424957-pelicula-protetora-smartphone-h5500-e-h5300-43-frete-free-_JM": { + }, + "http://elmundo.es/_warm": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://terra.es/": { + }, + "http://produto.mercadolivre.com.br/MLB-468424957-pelicula-protetora-smartphone-h5500-e-h5300-43-frete-free-_JM_cold": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.ebay.es/sch/i.html?_sacat=382&_trkparms=clkid%3D6548971389060485883&_qi=RTM1381637": { + }, + "http://produto.mercadolivre.com.br/MLB-468424957-pelicula-protetora-smartphone-h5500-e-h5300-43-frete-free-_JM_warm": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.eltiempo.es/talavera-de-la-reina.html": { + }, + "http://terra.es/_cold": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.free.fr/adsl/index.html": { + }, + "http://terra.es/_warm": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.leboncoin.fr/annonces/offres/limousin/": { + }, + "http://www.ebay.es/sch/i.html?_sacat=382&_trkparms=clkid%3D6548971389060485883&_qi=RTM1381637_cold": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.orange.fr/": { + }, + "http://www.ebay.es/sch/i.html?_sacat=382&_trkparms=clkid%3D6548971389060485883&_qi=RTM1381637_warm": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.uol.com.br/": { + }, + "http://www.eltiempo.es/talavera-de-la-reina.html_cold": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" - }, - "http://www.voila.fr/": { + }, + "http://www.eltiempo.es/talavera-de-la-reina.html_warm": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.free.fr/adsl/index.html_cold": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.free.fr/adsl/index.html_warm": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.leboncoin.fr/annonces/offres/limousin/_cold": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.leboncoin.fr/annonces/offres/limousin/_warm": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.orange.fr/_cold": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.orange.fr/_warm": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.uol.com.br/_cold": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.uol.com.br/_warm": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.voila.fr/_cold": { + "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" + }, + "http://www.voila.fr/_warm": { "DEFAULT": "intl_es_fr_pt-BR_000.wprgo" } - }, - "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + }, + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", "platform_specific": true } \ No newline at end of file
diff --git a/tools/perf/page_sets/data/intl_hi_ru.json b/tools/perf/page_sets/data/intl_hi_ru.json index b3a2a8d..4523d32 100644 --- a/tools/perf/page_sets/data/intl_hi_ru.json +++ b/tools/perf/page_sets/data/intl_hi_ru.json
@@ -1,39 +1,72 @@ { "archives": { - "http://apeha.ru/": { + "http://apeha.ru/_cold": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://hindi.oneindia.in/": { + }, + "http://apeha.ru/_warm": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://hindi.webdunia.com/": { + }, + "http://hindi.oneindia.in/_cold": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://narod.yandex.ru/": { + }, + "http://hindi.oneindia.in/_warm": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://news.google.co.in/nwshp?tab=in&hl=hi": { + }, + "http://hindi.webdunia.com/_cold": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://photofile.ru/": { + }, + "http://hindi.webdunia.com/_warm": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://ru.wikipedia.org/": { + }, + "http://narod.yandex.ru/_cold": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://rutracker.org/forum/index.php": { + }, + "http://narod.yandex.ru/_warm": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://www.indiatimes.com/": { + }, + "http://news.google.co.in/nwshp?tab=in&hl=hi_cold": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://www.rambler.ru/": { + }, + "http://news.google.co.in/nwshp?tab=in&hl=hi_warm": { "DEFAULT": "intl_hi_ru_000.wprgo" - }, - "http://yandex.ru/yandsearch?lr=102567&text=%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0": { + }, + "http://photofile.ru/_cold": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://photofile.ru/_warm": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://ru.wikipedia.org/_cold": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://ru.wikipedia.org/_warm": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://rutracker.org/forum/index.php_cold": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://rutracker.org/forum/index.php_warm": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://www.indiatimes.com/_cold": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://www.indiatimes.com/_warm": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://www.rambler.ru/_cold": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://www.rambler.ru/_warm": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://yandex.ru/yandsearch?lr=102567&text=%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0_cold": { + "DEFAULT": "intl_hi_ru_000.wprgo" + }, + "http://yandex.ru/yandsearch?lr=102567&text=%D0%9F%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0_warm": { "DEFAULT": "intl_hi_ru_000.wprgo" } - }, - "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + }, + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", "platform_specific": true } \ No newline at end of file
diff --git a/tools/perf/page_sets/data/intl_ja_zh.json b/tools/perf/page_sets/data/intl_ja_zh.json index 1423955..eb407c2 100644 --- a/tools/perf/page_sets/data/intl_ja_zh.json +++ b/tools/perf/page_sets/data/intl_ja_zh.json
@@ -1,63 +1,120 @@ { "archives": { - "http://2ch.net/": { + "http://2ch.net/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://cn.yahoo.com/": { + }, + "http://2ch.net/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://dtiblog.com/": { + }, + "http://cn.yahoo.com/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://fc2.com/ja/": { + }, + "http://cn.yahoo.com/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://goo.ne.jp/": { + }, + "http://dtiblog.com/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://hatena.ne.jp/": { + }, + "http://dtiblog.com/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://jugem.jp/": { + }, + "http://fc2.com/ja/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://kakaku.com/": { + }, + "http://fc2.com/ja/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://mixi.jp/": { + }, + "http://goo.ne.jp/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://ruten.com.tw/": { + }, + "http://goo.ne.jp/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://udn.com/NEWS/mainpage.shtml": { + }, + "http://hatena.ne.jp/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.amazon.co.jp": { + }, + "http://hatena.ne.jp/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.baidu.com/s?wd=%D0%C2%20%CE%C5": { + }, + "http://jugem.jp/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.google.com.hk/#q=%E9%82%84%E6%8F%90%E4%BE%9B&fp=c44d333e710cb480": { + }, + "http://jugem.jp/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.qq.com/": { + }, + "http://kakaku.com/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.sina.com.cn/": { + }, + "http://kakaku.com/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.taobao.com/index_global.php": { + }, + "http://mixi.jp/_cold": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://www.yahoo.co.jp/": { + }, + "http://mixi.jp/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" - }, - "http://zol.com.cn/": { + }, + "http://ruten.com.tw/_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://ruten.com.tw/_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://udn.com/NEWS/mainpage.shtml_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://udn.com/NEWS/mainpage.shtml_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.amazon.co.jp_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.amazon.co.jp_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.baidu.com/s?wd=%D0%C2%20%CE%C5_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.baidu.com/s?wd=%D0%C2%20%CE%C5_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.google.com.hk/#q=%E9%82%84%E6%8F%90%E4%BE%9B&fp=c44d333e710cb480_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.google.com.hk/#q=%E9%82%84%E6%8F%90%E4%BE%9B&fp=c44d333e710cb480_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.qq.com/_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.qq.com/_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.sina.com.cn/_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.sina.com.cn/_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.taobao.com/index_global.php_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.taobao.com/index_global.php_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.yahoo.co.jp/_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://www.yahoo.co.jp/_warm": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://zol.com.cn/_cold": { + "DEFAULT": "intl_ja_zh_000.wprgo" + }, + "http://zol.com.cn/_warm": { "DEFAULT": "intl_ja_zh_000.wprgo" } - }, - "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + }, + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", "platform_specific": true } \ No newline at end of file
diff --git a/tools/perf/page_sets/data/intl_ko_th_vi.json b/tools/perf/page_sets/data/intl_ko_th_vi.json index 0637114..c0b2ff4 100644 --- a/tools/perf/page_sets/data/intl_ko_th_vi.json +++ b/tools/perf/page_sets/data/intl_ko_th_vi.json
@@ -1,45 +1,72 @@ { "archives": { - "http://kenh14.vn/home.chn": { + "http://kenh14.vn/home.chn_cold": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://news.zing.vn/the-gioi/ba-dam-thep-margaret-thatcher-qua-doi/a312895.html#home_noibat1": { + }, + "http://kenh14.vn/home.chn_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://pantip.com/": { + }, + "http://pantip.com/_cold": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://thaimisc.com/": { + }, + "http://pantip.com/_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://us.24h.com.vn/": { + }, + "http://thaimisc.com/_cold": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://vietnamnet.vn/": { + }, + "http://thaimisc.com/_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://vnexpress.net/": { + }, + "http://us.24h.com.vn/_cold": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://www.chosun.com/": { + }, + "http://us.24h.com.vn/_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://www.danawa.com/": { + }, + "http://vietnamnet.vn/_cold": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://www.daum.net/": { + }, + "http://vietnamnet.vn/_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://www.donga.com/": { + }, + "http://vnexpress.net/_cold": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://www.naver.com/": { + }, + "http://vnexpress.net/_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" - }, - "http://www.sanook.com/": { + }, + "http://www.chosun.com/_cold": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.chosun.com/_warm": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.danawa.com/_cold": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.danawa.com/_warm": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.daum.net/_cold": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.daum.net/_warm": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.donga.com/_cold": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.donga.com/_warm": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.naver.com/_cold": { + "DEFAULT": "intl_ko_th_vi_000.wprgo" + }, + "http://www.naver.com/_warm": { "DEFAULT": "intl_ko_th_vi_000.wprgo" } - }, - "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + }, + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", "platform_specific": true } \ No newline at end of file
diff --git a/tools/perf/page_sets/data/typical_25.json b/tools/perf/page_sets/data/typical_25.json index af604461..52e9a08 100644 --- a/tools/perf/page_sets/data/typical_25.json +++ b/tools/perf/page_sets/data/typical_25.json
@@ -1,81 +1,150 @@ { "archives": { - "http://allrecipes.com/Recipe/Pull-Apart-Hot-Cross-Buns/Detail.aspx": { + "http://allrecipes.com/Recipe/Pull-Apart-Hot-Cross-Buns/Detail.aspx_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://arstechnica.com/": { + }, + "http://allrecipes.com/Recipe/Pull-Apart-Hot-Cross-Buns/Detail.aspx_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://colorado.edu": { + }, + "http://arstechnica.com/_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://gawker.com/5939683/based-on-a-true-story-is-a-rotten-lie-i-hope-you-never-believe": { + }, + "http://arstechnica.com/_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://money.cnn.com/": { + }, + "http://colorado.edu_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://premierleague.com": { + }, + "http://colorado.edu_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://walgreens.com": { + }, + "http://gawker.com/5939683/based-on-a-true-story-is-a-rotten-lie-i-hope-you-never-believe_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.airbnb.com/": { + }, + "http://gawker.com/5939683/based-on-a-true-story-is-a-rotten-lie-i-hope-you-never-believe_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.barnesandnoble.com/u/books-bestselling-books/379003057/": { + }, + "http://money.cnn.com/_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.economist.com/news/science-and-technology/21573529-small-models-cosmic-phenomena-are-shedding-light-real-thing-how-build": { + }, + "http://money.cnn.com/_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.fda.gov": { + }, + "http://premierleague.com_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.fifa.com/": { + }, + "http://premierleague.com_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.flickr.com/search/?q=monkeys&f=hp": { + }, + "http://walgreens.com_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.gamestop.com/ps3": { + }, + "http://walgreens.com_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.html5rocks.com/en/": { + }, + "http://www.airbnb.com/_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.ign.com/": { + }, + "http://www.airbnb.com/_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.imdb.com/title/tt0910970/": { + }, + "http://www.economist.com/news/science-and-technology/21573529-small-models-cosmic-phenomena-are-shedding-light-real-thing-how-build_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.mlb.com/": { + }, + "http://www.economist.com/news/science-and-technology/21573529-small-models-cosmic-phenomena-are-shedding-light-real-thing-how-build_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.nationalgeographic.com/": { + }, + "http://www.fda.gov_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.nick.com/games": { + }, + "http://www.fda.gov_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.osubeavers.com/": { + }, + "http://www.fifa.com/_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.rei.com/": { + }, + "http://www.fifa.com/_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.theonion.com": { + }, + "http://www.flickr.com/search/?q=monkeys&f=hp_cold": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.theverge.com/2013/3/5/4061684/inside-ted-the-smartest-bubble-in-the-world": { + }, + "http://www.flickr.com/search/?q=monkeys&f=hp_warm": { "DEFAULT": "typical_25_002.wprgo" - }, - "http://www.ticketmaster.com/JAY-Z-and-Justin-Timberlake-tickets/artist/1837448?brand=none&tm_link=tm_homeA_rc_name2": { + }, + "http://www.gamestop.com/ps3_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.gamestop.com/ps3_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.html5rocks.com/en/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.html5rocks.com/en/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.ign.com/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.ign.com/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.imdb.com/title/tt0910970/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.imdb.com/title/tt0910970/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.mlb.com/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.mlb.com/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.nationalgeographic.com/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.nationalgeographic.com/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.nick.com/games_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.nick.com/games_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.osubeavers.com/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.osubeavers.com/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.rei.com/_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.rei.com/_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.theonion.com_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.theonion.com_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.theverge.com/2013/3/5/4061684/inside-ted-the-smartest-bubble-in-the-world_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.theverge.com/2013/3/5/4061684/inside-ted-the-smartest-bubble-in-the-world_warm": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.ticketmaster.com/JAY-Z-and-Justin-Timberlake-tickets/artist/1837448?brand=none&tm_link=tm_homeA_rc_name2_cold": { + "DEFAULT": "typical_25_002.wprgo" + }, + "http://www.ticketmaster.com/JAY-Z-and-Justin-Timberlake-tickets/artist/1837448?brand=none&tm_link=tm_homeA_rc_name2_warm": { "DEFAULT": "typical_25_002.wprgo" } - }, - "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", + }, + "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.", "platform_specific": true } \ No newline at end of file
diff --git a/tools/perf/page_sets/intl_ar_fa_he.py b/tools/perf/page_sets/intl_ar_fa_he.py index c329157..894e856 100644 --- a/tools/perf/page_sets/intl_ar_fa_he.py +++ b/tools/perf/page_sets/intl_ar_fa_he.py
@@ -11,18 +11,26 @@ class IntlArFaHePage(page_cycler_story.PageCyclerStory): def __init__(self, url, page_set, cache_temperature=None): + if cache_temperature == cache_temperature_module.COLD: + temp_suffix = '_cold' + elif cache_temperature == cache_temperature_module.WARM: + temp_suffix = '_warm' + else: + raise NotImplementedError + super(IntlArFaHePage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState, cache_temperature=cache_temperature, - name=url) + name=url + temp_suffix) class IntlArFaHePageSet(story.StorySet): """ Popular pages in right-to-left languages Arabic, Farsi and Hebrew. """ - def __init__(self, cache_temperatures=None): + def __init__(self, cache_temperatures=(cache_temperature_module.COLD, + cache_temperature_module.WARM)): super(IntlArFaHePageSet, self).__init__( archive_data_file='data/intl_ar_fa_he.json', cloud_storage_bucket=story.PARTNER_BUCKET)
diff --git a/tools/perf/page_sets/intl_es_fr_pt-BR.py b/tools/perf/page_sets/intl_es_fr_pt-BR.py index 753e296..b1baf135 100644 --- a/tools/perf/page_sets/intl_es_fr_pt-BR.py +++ b/tools/perf/page_sets/intl_es_fr_pt-BR.py
@@ -11,11 +11,18 @@ class IntlEsFrPtBrPage(page_cycler_story.PageCyclerStory): def __init__(self, url, page_set, cache_temperature=None): + if cache_temperature == cache_temperature_module.COLD: + temp_suffix = '_cold' + elif cache_temperature == cache_temperature_module.WARM: + temp_suffix = '_warm' + else: + raise NotImplementedError + super(IntlEsFrPtBrPage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState, cache_temperature=cache_temperature, - name=url) + name=url + temp_suffix) class IntlEsFrPtBrPageSet(story.StorySet): @@ -24,7 +31,8 @@ Popular pages in Romance languages Spanish, French and Brazilian Portuguese. """ - def __init__(self, cache_temperatures=None): + def __init__(self, cache_temperatures=(cache_temperature_module.COLD, + cache_temperature_module.WARM)): super(IntlEsFrPtBrPageSet, self).__init__( archive_data_file='data/intl_es_fr_pt-BR.json', cloud_storage_bucket=story.PARTNER_BUCKET)
diff --git a/tools/perf/page_sets/intl_hi_ru.py b/tools/perf/page_sets/intl_hi_ru.py index fd40173..e333d15b 100644 --- a/tools/perf/page_sets/intl_hi_ru.py +++ b/tools/perf/page_sets/intl_hi_ru.py
@@ -11,18 +11,26 @@ class IntlHiRuPage(page_cycler_story.PageCyclerStory): def __init__(self, url, page_set, cache_temperature=None): + if cache_temperature == cache_temperature_module.COLD: + temp_suffix = '_cold' + elif cache_temperature == cache_temperature_module.WARM: + temp_suffix = '_warm' + else: + raise NotImplementedError + super(IntlHiRuPage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState, cache_temperature=cache_temperature, - name=url) + name=url+temp_suffix) class IntlHiRuPageSet(story.StorySet): """ Popular pages in Hindi and Russian. """ - def __init__(self, cache_temperatures=None): + def __init__(self, cache_temperatures=(cache_temperature_module.COLD, + cache_temperature_module.WARM)): super(IntlHiRuPageSet, self).__init__( archive_data_file='data/intl_hi_ru.json', cloud_storage_bucket=story.PARTNER_BUCKET)
diff --git a/tools/perf/page_sets/intl_ja_zh.py b/tools/perf/page_sets/intl_ja_zh.py index b5439795..3a6aae22 100644 --- a/tools/perf/page_sets/intl_ja_zh.py +++ b/tools/perf/page_sets/intl_ja_zh.py
@@ -11,18 +11,26 @@ class IntlJaZhPage(page_cycler_story.PageCyclerStory): def __init__(self, url, page_set, cache_temperature=None): + if cache_temperature == cache_temperature_module.COLD: + temp_suffix = '_cold' + elif cache_temperature == cache_temperature_module.WARM: + temp_suffix = '_warm' + else: + raise NotImplementedError + super(IntlJaZhPage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState, cache_temperature=cache_temperature, - name=url) + name=url+temp_suffix) class IntlJaZhPageSet(story.StorySet): """ Popular pages in Japanese and Chinese. """ - def __init__(self, cache_temperatures=None): + def __init__(self, cache_temperatures=(cache_temperature_module.COLD, + cache_temperature_module.WARM)): super(IntlJaZhPageSet, self).__init__( archive_data_file='data/intl_ja_zh.json', cloud_storage_bucket=story.PARTNER_BUCKET)
diff --git a/tools/perf/page_sets/intl_ko_th_vi.py b/tools/perf/page_sets/intl_ko_th_vi.py index 928b7245c..d02c5dc8 100644 --- a/tools/perf/page_sets/intl_ko_th_vi.py +++ b/tools/perf/page_sets/intl_ko_th_vi.py
@@ -11,18 +11,26 @@ class IntlKoThViPage(page_cycler_story.PageCyclerStory): def __init__(self, url, page_set, cache_temperature=None): + if cache_temperature == cache_temperature_module.COLD: + temp_suffix = '_cold' + elif cache_temperature == cache_temperature_module.WARM: + temp_suffix = '_warm' + else: + raise NotImplementedError + super(IntlKoThViPage, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState, cache_temperature=cache_temperature, - name=url) + name=url+temp_suffix) class IntlKoThViPageSet(story.StorySet): """ Popular pages in Korean, Thai and Vietnamese. """ - def __init__(self, cache_temperatures=None): + def __init__(self, cache_temperatures=(cache_temperature_module.COLD, + cache_temperature_module.WARM)): super(IntlKoThViPageSet, self).__init__( archive_data_file='data/intl_ko_th_vi.json', cloud_storage_bucket=story.PARTNER_BUCKET)
diff --git a/tools/perf/page_sets/typical_25.py b/tools/perf/page_sets/typical_25.py index 71bb21d..5977a41 100644 --- a/tools/perf/page_sets/typical_25.py +++ b/tools/perf/page_sets/typical_25.py
@@ -10,33 +10,34 @@ class Typical25Page(page_module.Page): - def __init__(self, url, page_set, run_no_page_interactions, + def __init__(self, url, page_set, shared_page_state_class=shared_page_state.SharedDesktopPageState, cache_temperature=None): + if cache_temperature == cache_temperature_module.COLD: + temp_suffix = '_cold' + elif cache_temperature == cache_temperature_module.WARM: + temp_suffix = '_warm' + else: + raise NotImplementedError super(Typical25Page, self).__init__( url=url, page_set=page_set, shared_page_state_class=shared_page_state_class, - cache_temperature=cache_temperature, name=url) + cache_temperature=cache_temperature, name=url + temp_suffix) if cache_temperature != cache_temperature_module.ANY: self.grouping_keys['cache_temperature'] = cache_temperature - self._run_no_page_interactions = run_no_page_interactions def RunPageInteractions(self, action_runner): - if self._run_no_page_interactions: - action_runner.WaitForJavaScriptCondition( - 'performance.timing.loadEventStart > 0') - return - with action_runner.CreateGestureInteraction('ScrollAction'): - action_runner.ScrollPage() + action_runner.WaitForJavaScriptCondition( + 'performance.timing.loadEventStart > 0') + return class Typical25PageSet(story.StorySet): """ Pages designed to represent the median, not highly optimized web """ - def __init__(self, run_no_page_interactions=False, - page_class=Typical25Page, - cache_temperatures=None): + def __init__(self, cache_temperatures=(cache_temperature_module.COLD, + cache_temperature_module.WARM)): super(Typical25PageSet, self).__init__( archive_data_file='data/typical_25.json', cloud_storage_bucket=story.PARTNER_BUCKET) @@ -83,5 +84,4 @@ for url in urls_list: for temp in cache_temperatures: - self.AddStory(page_class( - url, self, run_no_page_interactions, cache_temperature=temp)) + self.AddStory(Typical25Page(url, self, cache_temperature=temp))
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index 8257076..6e5af07 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -341,6 +341,7 @@ for benchmark_name, directories in benchmark_directory_map.iteritems(): if not benchmark_enabled_map[benchmark_name]: continue + upload_begin_time = time.time() # There are potentially multiple directores with results, re-write and # merge them if necessary results_filename = None @@ -361,6 +362,9 @@ build_properties, oauth_file, tmpfile_dir, logdog_dict, ('.reference' in benchmark_name)) upload_failure = upload_failure or upload_fail + upload_end_time = time.time() + print_duration(('%s upload time' % (benchmark_name)), + upload_begin_time, upload_end_time) logdog_file_name = _generate_unique_logdog_filename('Results_Dashboard_') logdog_stream = logdog_helper.text(logdog_file_name, @@ -370,13 +374,13 @@ if upload_failure: logdog_label += ' Upload Failure' extra_links[logdog_label] = logdog_stream + end_time = time.time() + print_duration('Uploading results to perf dashboard', begin_time, end_time) if upload_failure: return 1 return 0 finally: shutil.rmtree(tmpfile_dir) - end_time = time.time() - print_duration('Uploading results to perf dashboard', begin_time, end_time) def _upload_and_write_perf_data_to_logfile(benchmark_name, results_file,
diff --git a/ui/android/java/res/values-v17/styles.xml b/ui/android/java/res/values-v17/styles.xml index 64359238..13117f03 100644 --- a/ui/android/java/res/values-v17/styles.xml +++ b/ui/android/java/res/values-v17/styles.xml
@@ -118,8 +118,12 @@ <item name="android:textColor">@android:color/white</item> <item name="android:textSize">@dimen/headline_size_medium</item> </style> + <style name="WhiteHeadlineIncognito" tools:ignore="UnusedResources"> + <item name="android:textColor">@color/modern_grey_300</item> + <item name="android:textSize">@dimen/headline_size_large</item> + </style> <style name="WhiteBodyIncognito" tools:ignore="UnusedResources"> - <item name="android:textColor">@color/white_alpha_70</item> + <item name="android:textColor">@color/modern_grey_400</item> <item name="android:textSize">@dimen/text_size_medium</item> </style> <style name="WhiteBody" tools:ignore="UnusedResources"> @@ -142,7 +146,7 @@ <!-- Blue Text Styles --> <style name="BlueButtonText1" parent="RobotoMediumStyle" tools:ignore="UnusedResources"> - <item name="android:textColor">@color/google_blue_300</item> + <item name="android:textColor">@color/modern_blue_300</item> <item name="android:textSize">@dimen/text_size_medium</item> </style> <style name="BlueButtonText2" parent="RobotoMediumStyle" tools:ignore="UnusedResources">
diff --git a/ui/android/java/res/values/colors.xml b/ui/android/java/res/values/colors.xml index a6560ce..a37f440 100644 --- a/ui/android/java/res/values/colors.xml +++ b/ui/android/java/res/values/colors.xml
@@ -9,10 +9,12 @@ <color name="black_alpha_38">#61000000</color> <color name="black_alpha_54">#8A000000</color> <color name="black_alpha_87">#DE000000</color> - <color name="white_alpha_70">#B3FFFFFF</color> - <color name="google_blue_300" tools:ignore="UnusedResources">#7BAAF7</color> - <color name="google_blue_500" tools:ignore="UnusedResources">#4285F4</color> + <color name="white_alpha_70" tools:ignore="UnusedResources">#B3FFFFFF</color> + <color name="google_blue_500">#4285F4</color> <color name="google_blue_700">#3367D6</color> + <color name="modern_blue_300" tools:ignore="UnusedResources">#8AB4F8</color> + <color name="modern_grey_300">#DADCE0</color> + <color name="modern_grey_400">#BDC1C6</color> <color name="dropdown_divider_color">#E5E5E5</color> <color name="dropdown_dark_divider_color">#C0C0C0</color>
diff --git a/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java b/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java index 3f8b6ed1f..bcea2256 100644 --- a/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java +++ b/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java
@@ -45,10 +45,6 @@ private void doInBackgroundImpl() { final File outputDir = getOutputDir(); - if (!outputDir.exists() && !outputDir.mkdirs()) { - throw new RuntimeException(); - } - // Use a suffix for extracted files in order to guarantee that the version of the file // on disk matches up with the version of the APK. String extractSuffix = BuildInfo.getInstance().extractedFileSuffix; @@ -67,6 +63,12 @@ // A missing file means Chrome has updated. Delete stale files first. deleteFiles(existingFileNames); + outputDir.mkdirs(); + if (!outputDir.exists()) { + // Return value of mkdirs() sometimes incorrect? https://crbug.com/849550 + throw new RuntimeException(); + } + AssetManager assetManager = ContextUtils.getApplicationAssets(); byte[] buffer = new byte[BUFFER_SIZE]; for (String assetPath : mAssetsToExtract) {
diff --git a/ui/events/event_target.cc b/ui/events/event_target.cc index bbd1422..431a66a6 100644 --- a/ui/events/event_target.cc +++ b/ui/events/event_target.cc
@@ -28,26 +28,10 @@ PrioritizedHandler prioritized = PrioritizedHandler(); prioritized.handler = handler; prioritized.priority = priority; - EventHandlerPriorityList::iterator it; - switch (priority) { - case Priority::kDefault: - pre_target_list_.push_back(prioritized); - return; - case Priority::kSystem: - // Find the beginning of the kSystem part of the list and prepend - // this new handler to that section. - // TODO(katie): We are adding this to the front of the list because - // previously the function PrependPreTargetHandler added items to the - // front in this way. See if we can simply put each item in the list and - // sort, or insert each item the same way, in a later change. - it = std::lower_bound(pre_target_list_.begin(), pre_target_list_.end(), - prioritized); - pre_target_list_.insert(it, prioritized); - return; - case Priority::kAccessibility: - pre_target_list_.insert(pre_target_list_.begin(), prioritized); - return; - } + if (priority == Priority::kDefault) + pre_target_list_.push_back(prioritized); + else + pre_target_list_.insert(pre_target_list_.begin(), prioritized); } void EventTarget::RemovePreTargetHandler(EventHandler* handler) { @@ -85,21 +69,24 @@ return original_target_handler; } -// TODO(katie): trigger all kAccessibility handlers in the tree first, -// then kSystem and finally kDefault, rather than doing each set per -// parent level. void EventTarget::GetPreTargetHandlers(EventHandlerList* list) { EventTarget* target = this; + EventHandlerPriorityList temp; while (target) { - EventHandlerPriorityList::reverse_iterator it, rend; - for (it = target->pre_target_list_.rbegin(), - rend = target->pre_target_list_.rend(); - it != rend; - ++it) { - list->insert(list->begin(), it->handler); - } + // Build a composite list of EventHandlers from targets. + temp.insert(temp.begin(), target->pre_target_list_.begin(), + target->pre_target_list_.end()); target = target->GetParentTarget(); } + + // Sort the list, keeping relative order, but making sure the + // accessibility handlers always go first before system, which will + // go before default, at all levels of EventTarget. + std::stable_sort(temp.begin(), temp.end()); + + // Add the sorted handlers to the result list, in order. + for (size_t i = 0; i < temp.size(); ++i) + list->insert(list->end(), temp[i].handler); } void EventTarget::GetPostTargetHandlers(EventHandlerList* list) {
diff --git a/ui/events/event_target_unittest.cc b/ui/events/event_target_unittest.cc index 4b98d5d..200c2db 100644 --- a/ui/events/event_target_unittest.cc +++ b/ui/events/event_target_unittest.cc
@@ -76,27 +76,89 @@ // Adding a new system or accessibility handler will insert it before others // of its type. Adding a new default handler puts it at the end of the list, - // but this will change in a later patch set. + // for historical reasons. Re-arranging default handlers causes test failures + // in many unittests and may also cause real-life bugs, so for now default + // still is at the end of the list. target.AddPreTargetHandler(&system_handler_3, EventTarget::Priority::kSystem); - target.AddPreTargetHandler(&default_handler_2, + target.AddPreTargetHandler(&default_handler_1, EventTarget::Priority::kDefault); target.AddPreTargetHandler(&system_handler_2, EventTarget::Priority::kSystem); target.AddPreTargetHandler(&a11y_handler_2, EventTarget::Priority::kAccessibility); target.AddPreTargetHandler(&system_handler_1, EventTarget::Priority::kSystem); - target.AddPreTargetHandler(&default_handler_1, + target.AddPreTargetHandler(&default_handler_2, EventTarget::Priority::kDefault); target.AddPreTargetHandler(&a11y_handler_1, EventTarget::Priority::kAccessibility); list = test_api.GetPreTargetHandlers(); + ASSERT_EQ(7u, list.size()); EXPECT_EQ(list[0], &a11y_handler_1); EXPECT_EQ(list[1], &a11y_handler_2); EXPECT_EQ(list[2], &system_handler_1); EXPECT_EQ(list[3], &system_handler_2); EXPECT_EQ(list[4], &system_handler_3); - EXPECT_EQ(list[5], &default_handler_2); + EXPECT_EQ(list[5], &default_handler_1); + EXPECT_EQ(list[6], &default_handler_2); +} + +TEST(EventTargetTest, HandlerOrderingAcrossEventTargets) { + // Child needs to be a unique pointer so that TestEventTarget::AddChild works. + std::unique_ptr<test::TestEventTarget> child = + std::make_unique<test::TestEventTarget>(); + test::TestEventTarget parent; + test::TestEventHandler default_handler_1; + test::TestEventHandler default_handler_2; + test::TestEventHandler default_handler_3; + test::TestEventHandler system_handler_1; + test::TestEventHandler system_handler_2; + test::TestEventHandler system_handler_3; + test::TestEventHandler a11y_handler_1; + test::TestEventHandler a11y_handler_2; + test::TestEventHandler a11y_handler_3; + + // Parent handlers should be called before children handlers. + parent.AddPreTargetHandler(&default_handler_1, + EventTarget::Priority::kDefault); + parent.AddPreTargetHandler(&system_handler_2, EventTarget::Priority::kSystem); + parent.AddPreTargetHandler(&a11y_handler_2, + EventTarget::Priority::kAccessibility); + + child->AddPreTargetHandler(&default_handler_3, + EventTarget::Priority::kDefault); + child->AddPreTargetHandler(&a11y_handler_3, + EventTarget::Priority::kAccessibility); + child->AddPreTargetHandler(&system_handler_3, EventTarget::Priority::kSystem); + + parent.AddPreTargetHandler(&system_handler_1, EventTarget::Priority::kSystem); + parent.AddPreTargetHandler(&default_handler_2, + EventTarget::Priority::kDefault); + parent.AddPreTargetHandler(&a11y_handler_1, + EventTarget::Priority::kAccessibility); + + // Connect the parent and child in a EventTargetTestAPI. + EventTargetTestApi test_api(child.get()); + parent.AddChild(std::move(child)); + + EventHandlerList list; + list = test_api.GetPreTargetHandlers(); + + ASSERT_EQ(9u, list.size()); + // Parent handlers are called before child handlers, so a11y_handler_1 and + // 2 should be called before a11y_handler3, and similarly all the system and + // default handlers added to the parent should be called before those added + // to the child. + // In addition, all a11y handlers should be called before all system handlers, + // which should be called before all default handlers. + EXPECT_EQ(list[0], &a11y_handler_1); + EXPECT_EQ(list[1], &a11y_handler_2); + EXPECT_EQ(list[2], &a11y_handler_3); + EXPECT_EQ(list[3], &system_handler_1); + EXPECT_EQ(list[4], &system_handler_2); + EXPECT_EQ(list[5], &system_handler_3); EXPECT_EQ(list[6], &default_handler_1); + EXPECT_EQ(list[7], &default_handler_2); + EXPECT_EQ(list[8], &default_handler_3); } } // namespace
diff --git a/ui/events/test/test_event_handler.h b/ui/events/test/test_event_handler.h index dcb5baf..4989603 100644 --- a/ui/events/test/test_event_handler.h +++ b/ui/events/test/test_event_handler.h
@@ -38,6 +38,7 @@ void set_handler_name(const std::string& handler_name) { handler_name_ = handler_name; } + const std::string& handler_name() const { return handler_name_; } // EventHandler overrides: void OnKeyEvent(KeyEvent* event) override;
diff --git a/ui/gfx/shadow_value.cc b/ui/gfx/shadow_value.cc index b248765..70de16f 100644 --- a/ui/gfx/shadow_value.cc +++ b/ui/gfx/shadow_value.cc
@@ -77,6 +77,12 @@ // Refresh uses hand-tweaked shadows corresponding to a small set of // elevations. Use the Refresh spec and designer input to add missing shadow // values. + + // To match the CSS notion of blur (spread outside the bounding box) to the + // Skia notion of blur (spread outside and inside the bounding box), we have + // to double the designer-provided blur values. + const int kBlurCorrection = 2; + switch (elevation) { case 3: { ShadowValue key = {gfx::Vector2d(0, 1), 12, @@ -85,6 +91,13 @@ SkColorSetA(shadow_base_color, 0x40)}; return {key, ambient}; } + case 16: { + gfx::ShadowValue key = {gfx::Vector2d(0, 0), kBlurCorrection * 16, + SkColorSetA(shadow_base_color, 0x1a)}; + gfx::ShadowValue ambient = {gfx::Vector2d(0, 12), kBlurCorrection * 16, + SkColorSetA(shadow_base_color, 0x3d)}; + return {key, ambient}; + } default: // This surface has not been updated for Refresh. Fall back to the // deprecated style.
diff --git a/ui/ozone/platform/scenic/BUILD.gn b/ui/ozone/platform/scenic/BUILD.gn index 1dd6dff..8884e59 100644 --- a/ui/ozone/platform/scenic/BUILD.gn +++ b/ui/ozone/platform/scenic/BUILD.gn
@@ -33,6 +33,7 @@ "//third_party/fuchsia-sdk:views_v1_token", "//ui/base", "//ui/display/manager", + "//ui/events:dom_keycode_converter", "//ui/events/ozone:events_ozone_layout", "//ui/gfx/geometry", "//ui/ozone:ozone_base",
diff --git a/ui/ozone/platform/wayland/wayland_pointer_unittest.cc b/ui/ozone/platform/wayland/wayland_pointer_unittest.cc index 0f8d3de..173bae76 100644 --- a/ui/ozone/platform/wayland/wayland_pointer_unittest.cc +++ b/ui/ozone/platform/wayland/wayland_pointer_unittest.cc
@@ -50,7 +50,7 @@ .WillOnce(SaveArg<0>(&other_widget)); PlatformWindowInitProperties properties; properties.bounds = gfx::Rect(0, 0, 10, 10); - properties.type = PlatformWindowType::PLATFORM_WINDOW_TYPE_WINDOW; + properties.type = PlatformWindowType::kWindow; ASSERT_TRUE(other_window.Initialize(std::move(properties))); ASSERT_NE(other_widget, gfx::kNullAcceleratedWidget);
diff --git a/ui/ozone/platform/wayland/wayland_test.cc b/ui/ozone/platform/wayland/wayland_test.cc index f6a626e..00aaae83 100644 --- a/ui/ozone/platform/wayland/wayland_test.cc +++ b/ui/ozone/platform/wayland/wayland_test.cc
@@ -41,7 +41,7 @@ .WillOnce(SaveArg<0>(&widget_)); PlatformWindowInitProperties properties; properties.bounds = gfx::Rect(0, 0, 800, 600); - properties.type = PlatformWindowType::PLATFORM_WINDOW_TYPE_WINDOW; + properties.type = PlatformWindowType::kWindow; ASSERT_TRUE(window_->Initialize(std::move(properties))); ASSERT_NE(widget_, gfx::kNullAcceleratedWidget);
diff --git a/ui/ozone/platform/wayland/wayland_window.cc b/ui/ozone/platform/wayland/wayland_window.cc index a2e1582..bc3b231 100644 --- a/ui/ozone/platform/wayland/wayland_window.cc +++ b/ui/ozone/platform/wayland/wayland_window.cc
@@ -110,19 +110,16 @@ ui::PlatformWindowType ui_window_type = properties.type; switch (ui_window_type) { - case ui::PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU: - case ui::PlatformWindowType::PLATFORM_WINDOW_TYPE_POPUP: + case ui::PlatformWindowType::kMenu: + case ui::PlatformWindowType::kPopup: // TODO(msisov, jkim): Handle notification windows, which are marked // as popup windows as well. Those are the windows that do not have // parents and pop up when the browser receives a notification. CreateXdgPopup(); break; - case ui::PlatformWindowType::PLATFORM_WINDOW_TYPE_WINDOW: + case ui::PlatformWindowType::kWindow: CreateXdgSurface(); break; - default: - NOTREACHED() << "Not supported window type: type=" << ui_window_type; - break; } connection_->ScheduleFlush();
diff --git a/ui/ozone/platform/wayland/wayland_window_unittest.cc b/ui/ozone/platform/wayland/wayland_window_unittest.cc index 79612731..87b2a1b 100644 --- a/ui/ozone/platform/wayland/wayland_window_unittest.cc +++ b/ui/ozone/platform/wayland/wayland_window_unittest.cc
@@ -483,8 +483,8 @@ EXPECT_CALL(menu_window_delegate, OnAcceleratedWidgetDestroyed()).Times(1); std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams( - PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU, widget_, - gfx::Rect(0, 0, 10, 10), &menu_window_delegate); + PlatformWindowType::kMenu, widget_, gfx::Rect(0, 0, 10, 10), + &menu_window_delegate); Sync(); } @@ -496,8 +496,8 @@ .WillOnce(SaveArg<0>(&menu_window_widget)); std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams( - PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU, widget_, - gfx::Rect(0, 0, 10, 10), &menu_window_delegate); + PlatformWindowType::kMenu, widget_, gfx::Rect(0, 0, 10, 10), + &menu_window_delegate); ASSERT_NE(menu_window_widget, gfx::kNullAcceleratedWidget); Sync(); @@ -505,7 +505,7 @@ MockPlatformWindowDelegate nested_menu_window_delegate; std::unique_ptr<WaylandWindow> nested_menu_window = CreateWaylandWindowWithParams( - PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU, menu_window_widget, + PlatformWindowType::kMenu, menu_window_widget, gfx::Rect(20, 0, 10, 10), &nested_menu_window_delegate); Sync(); @@ -514,8 +514,8 @@ TEST_P(WaylandWindowTest, CanDispatchEventToMenuWindowNonNested) { MockPlatformWindowDelegate menu_window_delegate; std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams( - PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU, widget_, - gfx::Rect(0, 0, 10, 10), &menu_window_delegate); + PlatformWindowType::kMenu, widget_, gfx::Rect(0, 0, 10, 10), + &menu_window_delegate); wl_seat_send_capabilities(server_.seat()->resource(), WL_SEAT_CAPABILITY_POINTER); @@ -539,15 +539,15 @@ .WillOnce(SaveArg<0>(&menu_window_widget)); std::unique_ptr<WaylandWindow> menu_window = CreateWaylandWindowWithParams( - PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU, widget_, - gfx::Rect(0, 0, 10, 10), &menu_window_delegate); + PlatformWindowType::kMenu, widget_, gfx::Rect(0, 0, 10, 10), + &menu_window_delegate); Sync(); MockPlatformWindowDelegate nested_menu_window_delegate; std::unique_ptr<WaylandWindow> nested_menu_window = CreateWaylandWindowWithParams( - PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU, menu_window_widget, + PlatformWindowType::kMenu, menu_window_widget, gfx::Rect(20, 0, 10, 10), &nested_menu_window_delegate); Sync();
diff --git a/ui/platform_window/platform_window_init_properties.h b/ui/platform_window/platform_window_init_properties.h index eae71198..40c5fed 100644 --- a/ui/platform_window/platform_window_init_properties.h +++ b/ui/platform_window/platform_window_init_properties.h
@@ -17,10 +17,10 @@ namespace ui { -enum PlatformWindowType { - PLATFORM_WINDOW_TYPE_WINDOW, - PLATFORM_WINDOW_TYPE_POPUP, - PLATFORM_WINDOW_TYPE_MENU, +enum class PlatformWindowType { + kWindow, + kPopup, + kMenu, }; // Initial properties which are passed to PlatformWindow to be initialized @@ -32,7 +32,7 @@ ~PlatformWindowInitProperties(); // Tells desired PlatformWindow type. It can be popup, menu or anything else. - PlatformWindowType type = PlatformWindowType::PLATFORM_WINDOW_TYPE_WINDOW; + PlatformWindowType type = PlatformWindowType::kWindow; // Sets the desired initial bounds. Can be empty. gfx::Rect bounds; // Tells PlatformWindow which native widget its parent holds. It is usually
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc index d2b1a70..7925285 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -27,15 +27,15 @@ switch (params.type) { case Widget::InitParams::TYPE_WINDOW: - properties.type = ui::PlatformWindowType::PLATFORM_WINDOW_TYPE_WINDOW; + properties.type = ui::PlatformWindowType::kWindow; break; case Widget::InitParams::TYPE_MENU: - properties.type = ui::PlatformWindowType::PLATFORM_WINDOW_TYPE_MENU; + properties.type = ui::PlatformWindowType::kMenu; break; default: - properties.type = ui::PlatformWindowType::PLATFORM_WINDOW_TYPE_POPUP; + properties.type = ui::PlatformWindowType::kPopup; break; }
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index bf4b1d07f..a3b72c4 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -830,6 +830,7 @@ base::i18n::AdjustStringForLocaleDirection(&window_title); if (!native_widget_->SetWindowTitle(window_title)) return; + non_client_view_->UpdateWindowTitle(); // If the non-client view is rendering its own title, it'll need to relayout @@ -995,7 +996,8 @@ void Widget::OnSizeConstraintsChanged() { native_widget_->OnSizeConstraintsChanged(); - non_client_view_->SizeConstraintsChanged(); + if (non_client_view_) + non_client_view_->SizeConstraintsChanged(); } void Widget::OnOwnerClosing() {}
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc index 8e298d2f..b1dfc75 100644 --- a/ui/views/widget/widget_unittest.cc +++ b/ui/views/widget/widget_unittest.cc
@@ -2235,6 +2235,14 @@ widget->Init(params); } +TEST_F(WidgetTest, NoCrashOnResizeConstraintsWindowTitleOnPopup) { + std::unique_ptr<Widget> widget(new Widget); + Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + widget->Init(params); + widget->OnSizeConstraintsChanged(); +} + // Tests that we do not crash when a Widget is destroyed before it finishes // processing of pending input events in the message loop. TEST_F(WidgetTest, NoCrashOnWidgetDeleteWithPendingEvents) {
diff --git a/ui/views/win/pen_event_processor.cc b/ui/views/win/pen_event_processor.cc index f8097cd6..73129d85 100644 --- a/ui/views/win/pen_event_processor.cc +++ b/ui/views/win/pen_event_processor.cc
@@ -18,12 +18,6 @@ if (pointer_info.pointerFlags & POINTER_FLAG_SECONDBUTTON) flags |= ui::EF_RIGHT_MOUSE_BUTTON; - if (message == WM_POINTERUP) { - if (pointer_info.ButtonChangeType == POINTER_CHANGE_SECONDBUTTON_UP) - flags |= ui::EF_RIGHT_MOUSE_BUTTON; - else - flags |= ui::EF_LEFT_MOUSE_BUTTON; - } return flags; } @@ -121,10 +115,13 @@ break; case WM_POINTERUP: event_type = ui::ET_MOUSE_RELEASED; - if (pointer_info.ButtonChangeType == POINTER_CHANGE_FIRSTBUTTON_UP) + if (pointer_info.ButtonChangeType == POINTER_CHANGE_FIRSTBUTTON_UP) { + flag |= ui::EF_LEFT_MOUSE_BUTTON; changed_flag = ui::EF_LEFT_MOUSE_BUTTON; - else + } else { + flag |= ui::EF_RIGHT_MOUSE_BUTTON; changed_flag = ui::EF_RIGHT_MOUSE_BUTTON; + } id_generator_->ReleaseNumber(pointer_id); click_count = 1; if (!sent_mouse_down_)
diff --git a/ui/views/win/pen_event_processor_unittest.cc b/ui/views/win/pen_event_processor_unittest.cc index 614e2e7..1fa9319 100644 --- a/ui/views/win/pen_event_processor_unittest.cc +++ b/ui/views/win/pen_event_processor_unittest.cc
@@ -164,4 +164,67 @@ EXPECT_EQ(nullptr, event.get()); } +TEST(PenProcessorTest, TouchFlagDMEnabled) { + ui::SequentialIDGenerator id_generator(0); + PenEventProcessor processor(&id_generator, + /*direct_manipulation_enabled*/ true); + + POINTER_PEN_INFO pen_info; + memset(&pen_info, 0, sizeof(POINTER_PEN_INFO)); + gfx::Point point(100, 100); + + pen_info.pointerInfo.pointerFlags = + POINTER_FLAG_INCONTACT | POINTER_FLAG_FIRSTBUTTON; + pen_info.pointerInfo.ButtonChangeType = POINTER_CHANGE_FIRSTBUTTON_DOWN; + + std::unique_ptr<ui::Event> event = + processor.GenerateEvent(WM_POINTERDOWN, 0, pen_info, point); + ASSERT_TRUE(event); + ASSERT_TRUE(event->IsTouchEvent()); + EXPECT_EQ(ui::ET_TOUCH_PRESSED, event->AsTouchEvent()->type()); + EXPECT_TRUE(event->flags() & ui::EF_LEFT_MOUSE_BUTTON); + + pen_info.pointerInfo.pointerFlags = POINTER_FLAG_UP; + pen_info.pointerInfo.ButtonChangeType = POINTER_CHANGE_FIRSTBUTTON_UP; + + event = processor.GenerateEvent(WM_POINTERUP, 0, pen_info, point); + ASSERT_TRUE(event); + ASSERT_TRUE(event->IsTouchEvent()); + EXPECT_EQ(ui::ET_TOUCH_RELEASED, event->AsTouchEvent()->type()); + EXPECT_FALSE(event->flags() & ui::EF_LEFT_MOUSE_BUTTON); +} + +TEST(PenProcessorTest, MouseFlagDMEnabled) { + ui::SequentialIDGenerator id_generator(0); + PenEventProcessor processor(&id_generator, + /*direct_manipulation_enabled*/ true); + + POINTER_PEN_INFO pen_info; + memset(&pen_info, 0, sizeof(POINTER_PEN_INFO)); + gfx::Point point(100, 100); + + pen_info.pointerInfo.pointerFlags = POINTER_FLAG_FIRSTBUTTON; + pen_info.pointerInfo.ButtonChangeType = POINTER_CHANGE_FIRSTBUTTON_DOWN; + + std::unique_ptr<ui::Event> event = + processor.GenerateEvent(WM_POINTERDOWN, 0, pen_info, point); + ASSERT_TRUE(event); + ASSERT_TRUE(event->IsMouseEvent()); + EXPECT_EQ(ui::ET_MOUSE_PRESSED, event->AsMouseEvent()->type()); + EXPECT_TRUE(event->flags() & ui::EF_LEFT_MOUSE_BUTTON); + EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, + event->AsMouseEvent()->changed_button_flags()); + + pen_info.pointerInfo.pointerFlags = POINTER_FLAG_NONE; + pen_info.pointerInfo.ButtonChangeType = POINTER_CHANGE_FIRSTBUTTON_UP; + + event = processor.GenerateEvent(WM_POINTERUP, 0, pen_info, point); + ASSERT_TRUE(event); + ASSERT_TRUE(event->IsMouseEvent()); + EXPECT_EQ(ui::ET_MOUSE_RELEASED, event->AsMouseEvent()->type()); + EXPECT_TRUE(event->flags() & ui::EF_LEFT_MOUSE_BUTTON); + EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, + event->AsMouseEvent()->changed_button_flags()); +} + } // namespace views