diff --git a/BUILD.gn b/BUILD.gn index f0c7533..ecbaef1 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -1057,7 +1057,6 @@ "//cc:cc_perftests", "//chrome/test:load_library_perf_tests", "//chrome/test:performance_test_suite", - "//chrome/test:telemetry_perf_tests", "//chrome/test:telemetry_perf_tests_without_chrome", "//components/tracing:tracing_perftests", "//gpu:command_buffer_perftests",
diff --git a/DEPS b/DEPS index f23a29d..b84bbaa 100644 --- a/DEPS +++ b/DEPS
@@ -109,7 +109,7 @@ # 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': 'a7788c48cc8143a4cfe35f8f993c6cbde5f7adbe', + 'v8_revision': '27f6e148f57f2eedca6dd785658303b43b76512f', # 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': '8fbd9d96e68b5a74a49737c8a8549cbe9d556fc9', + 'angle_revision': 'd7890bca9b35d6b0839ace3f77f02233f15c566c', # 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': 'ee7c8c3f37698651ae57e2aea979b3dba1c8b39a', + 'pdfium_revision': '245c7310a74e1ed81c885b3404a8cedf0c58f4b8', # 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. @@ -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': '27380b171e3fd0073d475e0fb628fe8850571d06', + 'catapult_revision': 'f6618d3f745e3b136bf21c352feb5e7c23b46bc7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -913,7 +913,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '68eaa07bdfa03c38a6ec74091382829097d3f68e', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '5f2d58f235b1409db411fc9c4e68c0d391ef6861', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1035,7 +1035,7 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a5c263cc63ffc2cc189b5214074c8792067c1853', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1208cbb3ec07c6740fd2f651169fafff94e1e041', + Var('webrtc_git') + '/src.git' + '@' + '7219d053d56aaa24e43a6c5fe1344e5488d53b0f', 'src/third_party/xdg-utils': { 'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc index 33ed26a..712f0748 100644 --- a/android_webview/browser/aw_browser_main_parts.cc +++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -80,7 +80,6 @@ DCHECK(!main_message_loop_.get()); if (!base::MessageLoopCurrent::IsSet()) main_message_loop_.reset(new base::MessageLoopForUI); - base::MessageLoopCurrentForUI::Get()->Start(); return service_manager::RESULT_CODE_NORMAL_EXIT; }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index ac56057..a60551b 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -18,6 +18,9 @@ assert(use_aura) assert(enable_hidpi) +# Chromebooks use ozone/DRM. linux-chromeos uses ozone/X11. +assert(use_ozone) + component("ash") { sources = [ "accelerators/accelerator_commands.cc", @@ -1693,6 +1696,7 @@ "app_menu/notification_menu_controller_unittest.cc", "app_menu/notification_menu_view_unittest.cc", "assistant/assistant_controller_unittest.cc", + "assistant/util/deep_link_util_unittest.cc", "autoclick/autoclick_unittest.cc", "cursor_unittest.cc", "detachable_base/detachable_base_handler_unittest.cc",
diff --git a/ash/DEPS b/ash/DEPS index b232945..ec6fc9f2 100644 --- a/ash/DEPS +++ b/ash/DEPS
@@ -92,10 +92,6 @@ # InputMethodManager lives in the browser process. Use ImeController. "-ui/base/ime/chromeos/input_method_manager.h" - # Ozone does not run in process in mus/mash. - "-ui/events/ozone", - "-ui/ozone", - # ui/events/devices is tied with ozone, which is controlled by mus, and # shouldn't be used by ash. "-ui/events/devices",
diff --git a/ash/assistant/assistant_controller.cc b/ash/assistant/assistant_controller.cc index f942b39..70422abd 100644 --- a/ash/assistant/assistant_controller.cc +++ b/ash/assistant/assistant_controller.cc
@@ -118,12 +118,13 @@ assistant_ui_controller_->SetAssistantInteractionController( assistant_interaction_controller_.get()); - // Observe HighlighterController for region selections. + assistant_ui_controller_->AddModelObserver(this); Shell::Get()->highlighter_controller()->AddObserver(this); } AssistantController::~AssistantController() { Shell::Get()->highlighter_controller()->RemoveObserver(this); + assistant_ui_controller_->RemoveModelObserver(this); // Explicitly clean up the circular dependency in the sub-controllers. assistant_interaction_controller_->SetAssistantUiController(nullptr); @@ -256,10 +257,27 @@ assistant_image_downloader_->Download(account_id, url, std::move(callback)); } +void AssistantController::OnUiVisibilityChanged(bool visible, + AssistantSource source) { + // We don't initiate a contextual query for caching if the UI is being hidden. + if (!visible) + return; + + // We don't initiate a contextual query for caching if we are using stylus + // input modality because we will do so on metalayer session complete. + if (assistant_interaction_controller_->model()->input_modality() == + InputModality::kStylus) { + return; + } + + // TODO(dmblack): Activate the Assistant UI when the callback is run. + assistant_->RequestScreenContext(gfx::Rect(), base::DoNothing()); +} + void AssistantController::OnHighlighterSelectionRecognized( const gfx::Rect& rect) { - // TODO(muyuanli): Request screen context for |rect|. - NOTIMPLEMENTED(); + // TODO(dmblack): Activate the Assistant UI when the callback is run. + assistant_->RequestScreenContext(rect, base::DoNothing()); } void AssistantController::OnOpenUrlFromTab(const GURL& url) {
diff --git a/ash/assistant/assistant_controller.h b/ash/assistant/assistant_controller.h index bed802e..c3c3050 100644 --- a/ash/assistant/assistant_controller.h +++ b/ash/assistant/assistant_controller.h
@@ -10,6 +10,7 @@ #include <vector> #include "ash/ash_export.h" +#include "ash/assistant/model/assistant_ui_model_observer.h" #include "ash/highlighter/highlighter_controller.h" #include "ash/public/interfaces/assistant_controller.mojom.h" #include "ash/public/interfaces/assistant_image_downloader.mojom.h" @@ -37,6 +38,7 @@ class ASH_EXPORT AssistantController : public mojom::AssistantController, + public AssistantUiModelObserver, public HighlighterController::Observer, public mojom::ManagedWebContentsOpenUrlDelegate { public: @@ -85,6 +87,9 @@ void RequestScreenshot(const gfx::Rect& rect, RequestScreenshotCallback callback) override; + // AssistantUiModelObserver: + void OnUiVisibilityChanged(bool visible, AssistantSource source) override; + // HighlighterController::Observer: void OnHighlighterSelectionRecognized(const gfx::Rect& rect) override;
diff --git a/ash/assistant/assistant_ui_controller.cc b/ash/assistant/assistant_ui_controller.cc index 57ac281..f1611808 100644 --- a/ash/assistant/assistant_ui_controller.cc +++ b/ash/assistant/assistant_ui_controller.cc
@@ -199,6 +199,8 @@ container_view_->GetWidget()->AddObserver(this); } + // TODO(dmblack): Initially show UI as inactive and only activate after the + // screen context has been sent to the server. container_view_->GetWidget()->Show(); assistant_ui_model_.SetVisible(true, source); }
diff --git a/ash/assistant/util/deep_link_util.cc b/ash/assistant/util/deep_link_util.cc index bc1bcc3a..ee44928 100644 --- a/ash/assistant/util/deep_link_util.cc +++ b/ash/assistant/util/deep_link_util.cc
@@ -4,6 +4,8 @@ #include "ash/assistant/util/deep_link_util.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "url/gurl.h" namespace ash { @@ -12,10 +14,22 @@ namespace { -constexpr char kAssistantSettingsSpec[] = "googleassistant://settings"; +constexpr char kAssistantOnboardingPrefix[] = "googleassistant://onboarding"; +constexpr char kAssistantRemindersPrefix[] = "googleassistant://reminders"; +constexpr char kAssistantSettingsPrefix[] = "googleassistant://settings"; + +// TODO(dmblack): Wire up actual Assistant Reminders URL. +constexpr char kAssistantRemindersWebUrl[] = R"(data:text/html, + <html> + <body style="padding:32px;"> + <h3>Assistant Reminders</h3> + <p>Coming Soon! :)</p> + </body> + </html> +)"; // TODO(dmblack): Wire up actual Assistant Settings URL. -constexpr char kAssistantSettingsWebUiUrl[] = R"(data:text/html, +constexpr char kAssistantSettingsWebUrl[] = R"(data:text/html, <html> <body style="padding:32px;"> <h3>Assistant Settings</h3> @@ -27,30 +41,74 @@ } // namespace bool IsDeepLinkUrl(const GURL& url) { - return IsAssistantSettingsDeepLink(url); + return IsAssistantOnboardingDeepLink(url) || + IsAssistantRemindersDeepLink(url) || IsAssistantSettingsDeepLink(url); +} + +bool IsAssistantOnboardingDeepLink(const GURL& url) { + return base::StartsWith(url.spec(), kAssistantOnboardingPrefix, + base::CompareCase::SENSITIVE); +} + +bool IsAssistantRemindersDeepLink(const GURL& url) { + return base::StartsWith(url.spec(), kAssistantRemindersPrefix, + base::CompareCase::SENSITIVE); } GURL CreateAssistantSettingsDeepLink() { - return GURL(kAssistantSettingsSpec); + return GURL(kAssistantSettingsPrefix); } bool IsAssistantSettingsDeepLink(const GURL& url) { - return url.spec() == kAssistantSettingsSpec; + return base::StartsWith(url.spec(), kAssistantSettingsPrefix, + base::CompareCase::SENSITIVE); } base::Optional<GURL> GetWebUrl(const GURL& deep_link) { if (!IsWebDeepLink(deep_link)) return base::nullopt; + if (IsAssistantRemindersDeepLink(deep_link)) + return GURL(kAssistantRemindersWebUrl); + if (IsAssistantSettingsDeepLink(deep_link)) - return GURL(kAssistantSettingsWebUiUrl); + return GURL(kAssistantSettingsWebUrl); NOTIMPLEMENTED(); return base::nullopt; } bool IsWebDeepLink(const GURL& url) { - return IsAssistantSettingsDeepLink(url); + return IsAssistantRemindersDeepLink(url) || IsAssistantSettingsDeepLink(url); +} + +bool ParseDeepLinkParams(const GURL& deep_link, + std::map<std::string, std::string>& params) { + if (!IsDeepLinkUrl(deep_link)) + return false; + + // If the deep link does not have a query then there are no key-value pairs to + // be parsed. We still return true in this case because omission of parameters + // in a deep link does not cause a parse attempt to fail. + if (!deep_link.has_query()) + return true; + + // Key-value pairs are '&' delimited and the keys/values are '=' delimited. + // Example: "googleassistant://onboarding?k1=v1&k2=v2". + base::StringPairs pairs; + if (!base::SplitStringIntoKeyValuePairs(deep_link.query(), '=', '&', + &pairs)) { + return false; + } + + // Insert the parsed values into the caller provided map of |params|. + for (std::pair<std::string, std::string>& pair : pairs) { + if (params.count(pair.first) > 0) { + params[pair.first] = pair.second; + } + } + + return true; } } // namespace util
diff --git a/ash/assistant/util/deep_link_util.h b/ash/assistant/util/deep_link_util.h index 03407ce..734710b 100644 --- a/ash/assistant/util/deep_link_util.h +++ b/ash/assistant/util/deep_link_util.h
@@ -5,6 +5,10 @@ #ifndef ASH_ASSISTANT_UTIL_DEEP_LINK_UTIL_H_ #define ASH_ASSISTANT_UTIL_DEEP_LINK_UTIL_H_ +#include <map> +#include <string> + +#include "ash/ash_export.h" #include "base/optional.h" class GURL; @@ -14,22 +18,39 @@ namespace util { // Returns true if the specified |url| is a deep link, false otherwise. -bool IsDeepLinkUrl(const GURL& url); +ASH_EXPORT bool IsDeepLinkUrl(const GURL& url); + +// Returns true if the specified |url| is an Assistant onboarding deep link, +// false otherwise. +ASH_EXPORT bool IsAssistantOnboardingDeepLink(const GURL& url); + +// Returns true if the specified |url| is an Assistant reminders deep link, +// false otherwise. +ASH_EXPORT bool IsAssistantRemindersDeepLink(const GURL& url); // Returns a deep link to top level Assistant Settings. -GURL CreateAssistantSettingsDeepLink(); +ASH_EXPORT GURL CreateAssistantSettingsDeepLink(); // Returns true if the specified |url| is an Assistant Settings deep link, false // otherwise. -bool IsAssistantSettingsDeepLink(const GURL& url); +ASH_EXPORT bool IsAssistantSettingsDeepLink(const GURL& url); // Returns the web URL for the specified |deep_link|. A return value will only // be present if |deep_link| is a web deep link as identified by the // IsWebDeepLink(GURL) API. -base::Optional<GURL> GetWebUrl(const GURL& deep_link); +ASH_EXPORT base::Optional<GURL> GetWebUrl(const GURL& deep_link); // Returns true if the specified |url| is a web deep link, false otherwise. -bool IsWebDeepLink(const GURL& url); +ASH_EXPORT bool IsWebDeepLink(const GURL& url); + +// Parses the specified |deep_link| for the values corresponding to the keys in +// |params|. If a value for a key in |params| is found, it is inserted into the +// map. If not, the existing value in the map is untouched, so it is recommended +// to initiate the map with default values prior to utilizing this API. The +// return value is true if the deep link was successfully parse, false +// otherwise. +ASH_EXPORT bool ParseDeepLinkParams(const GURL& deep_link, + std::map<std::string, std::string>& params); } // namespace util } // namespace assistant
diff --git a/ash/assistant/util/deep_link_util_unittest.cc b/ash/assistant/util/deep_link_util_unittest.cc new file mode 100644 index 0000000..3cddcfa --- /dev/null +++ b/ash/assistant/util/deep_link_util_unittest.cc
@@ -0,0 +1,285 @@ +// 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/assistant/util/deep_link_util.h" + +#include <map> +#include <string> + +#include "ash/test/ash_test_base.h" +#include "base/macros.h" +#include "url/gurl.h" + +namespace ash { + +using namespace assistant::util; + +class DeepLinkUnitTest : public AshTestBase { + protected: + DeepLinkUnitTest() = default; + ~DeepLinkUnitTest() override = default; + + void SetUp() override { AshTestBase::SetUp(); } + + private: + DISALLOW_COPY_AND_ASSIGN(DeepLinkUnitTest); +}; + +TEST_F(DeepLinkUnitTest, IsDeepLink) { + auto AssertDeepLinkUrl = [](const GURL& url) { + ASSERT_TRUE(IsDeepLinkUrl(url)); + }; + + auto AssertNotDeepLinkUrl = [](const GURL& url) { + ASSERT_FALSE(IsDeepLinkUrl(url)); + }; + + // OK: Supported deep links. + AssertDeepLinkUrl(GURL("googleassistant://onboarding")); + AssertDeepLinkUrl(GURL("googleassistant://onboarding?param=true")); + AssertDeepLinkUrl(GURL("googleassistant://reminders")); + AssertDeepLinkUrl(GURL("googleassistant://reminders?param=true")); + AssertDeepLinkUrl(GURL("googleassistant://settings")); + AssertDeepLinkUrl(GURL("googleassistant://settings?param=true")); + + // FAIL: Deep links are case sensitive. + AssertNotDeepLinkUrl(GURL("GOOGLEASSISTANT://ONBOARDING")); + AssertNotDeepLinkUrl(GURL("GOOGLEASSISTANT://REMINDERS")); + AssertNotDeepLinkUrl(GURL("GOOGLEASSISTANT://SETTINGS")); + + // FAIL: Unsupported deep links. + AssertNotDeepLinkUrl(GURL("googleassistant://")); + AssertNotDeepLinkUrl(GURL("googleassistant://unsupported")); + + // FAIL: Non-deep link URLs. + AssertNotDeepLinkUrl(GURL()); + AssertNotDeepLinkUrl(GURL("https://www.google.com/")); +} + +TEST_F(DeepLinkUnitTest, IsAssistantOnboardingDeepLink) { + auto AssertOnboardingDeepLink = [](const GURL& url) { + ASSERT_TRUE(IsAssistantOnboardingDeepLink(url)); + }; + + auto AssertNotOnboardingDeepLink = [](const GURL& url) { + ASSERT_FALSE(IsAssistantOnboardingDeepLink(url)); + }; + + // OK: Supported Assistant onboarding deep links. + AssertOnboardingDeepLink(GURL("googleassistant://onboarding")); + AssertOnboardingDeepLink(GURL("googleassistant://onboarding?param=true")); + + // FAIL: Deep links are case sensitive. + AssertNotOnboardingDeepLink(GURL("GOOGLEASSISTANT://ONBOARDING")); + + // FAIL: Non-Assistant onboarding deep links. + AssertNotOnboardingDeepLink(GURL("googleassistant://reminders")); + AssertNotOnboardingDeepLink(GURL("googleassistant://reminders?param=true")); + AssertNotOnboardingDeepLink(GURL("googleassistant://settings")); + AssertNotOnboardingDeepLink(GURL("googleassistant://settings?param=true")); + + // FAIL: Non-deep link URLs. + AssertNotOnboardingDeepLink(GURL()); + AssertNotOnboardingDeepLink(GURL("https://www.google.com/")); +} + +TEST_F(DeepLinkUnitTest, IsAssistantRemindersDeepLink) { + auto AssertRemindersDeepLink = [](const GURL& url) { + ASSERT_TRUE(IsAssistantRemindersDeepLink(url)); + }; + + auto AssertNotRemindersDeepLink = [](const GURL& url) { + ASSERT_FALSE(IsAssistantRemindersDeepLink(url)); + }; + + // OK: Supported Assistant reminders deep links. + AssertRemindersDeepLink(GURL("googleassistant://reminders")); + AssertRemindersDeepLink(GURL("googleassistant://reminders?param=true")); + + // FAIL: Deep links are case sensitive. + AssertNotRemindersDeepLink(GURL("GOOGLEASSISTANT://REMINDERS")); + + // FAIL: Non-Assistant reminders deep links. + AssertNotRemindersDeepLink(GURL("googleassistant://onboarding")); + AssertNotRemindersDeepLink(GURL("googleassistant://onboarding?param=true")); + AssertNotRemindersDeepLink(GURL("googleassistant://settings")); + AssertNotRemindersDeepLink(GURL("googleassistant://settings?param=true")); + + // FAIL: Non-deep link URLs. + AssertNotRemindersDeepLink(GURL()); + AssertNotRemindersDeepLink(GURL("https://www.google.com/")); +} + +TEST_F(DeepLinkUnitTest, CreateAssistantSettingsDeepLink) { + ASSERT_EQ(GURL("googleassistant://settings"), + CreateAssistantSettingsDeepLink()); +} + +TEST_F(DeepLinkUnitTest, IsAssistantSettingsDeepLink) { + auto AssertSettingsDeepLink = [](const GURL& url) { + ASSERT_TRUE(IsAssistantSettingsDeepLink(url)); + }; + + auto AssertNotSettingsDeepLink = [](const GURL& url) { + ASSERT_FALSE(IsAssistantSettingsDeepLink(url)); + }; + + // OK: Supported Assistant Settings deep links. + AssertSettingsDeepLink(GURL("googleassistant://settings")); + AssertSettingsDeepLink(GURL("googleassistant://settings?param=true")); + + // FAIL: Deep links are case sensitive. + AssertNotSettingsDeepLink(GURL("GOOGLEASSISTANT://SETTINGS")); + + // FAIL: Non-Assistant Settings deep links. + AssertNotSettingsDeepLink(GURL("googleassistant://onboarding")); + AssertNotSettingsDeepLink(GURL("googleassistant://onboarding?param=true")); + AssertNotSettingsDeepLink(GURL("googleassistant://reminders")); + AssertNotSettingsDeepLink(GURL("googleassistant://reminders?param=true")); + + // FAIL: Non-deep link URLs. + AssertNotSettingsDeepLink(GURL()); + AssertNotSettingsDeepLink(GURL("https://www.google.com/")); +} + +// TODO(dmblack): Assert actual web URLs when available. +TEST_F(DeepLinkUnitTest, GetWebUrl) { + auto AssertWebUrlPresent = [](const GURL& url) { + ASSERT_TRUE(GetWebUrl(url).has_value()); + }; + + auto AssertWebUrlAbsent = [](const GURL& url) { + ASSERT_FALSE(GetWebUrl(url).has_value()); + }; + + // OK: Supported web deep links. + AssertWebUrlPresent(GURL("googleassistant://reminders")); + AssertWebUrlPresent(GURL("googleassistant://reminders?param=true")); + AssertWebUrlPresent(GURL("googleassistant://settings")); + AssertWebUrlPresent(GURL("googleassistant://settings?param=true")); + + // FAIL: Deep links are case sensitive. + AssertWebUrlAbsent(GURL("GOOGLEASSISTANT://REMINDERS")); + AssertWebUrlAbsent(GURL("GOOGLEASSISTANT://SETTINGS")); + + // FAIL: Non-web deep links. + AssertWebUrlAbsent(GURL("googleassistant://onboarding")); + AssertWebUrlAbsent(GURL("googleassistant://onboarding?param=true")); + + // FAIL: Non-deep link URLS. + AssertWebUrlAbsent(GURL()); + AssertWebUrlAbsent(GURL("https://www.google.com/")); +} + +TEST_F(DeepLinkUnitTest, IsWebDeepLink) { + auto AssertWebDeepLink = [](const GURL& url) { + ASSERT_TRUE(IsWebDeepLink(url)); + }; + + auto AssertNotWebDeepLink = [](const GURL& url) { + ASSERT_FALSE(IsWebDeepLink(url)); + }; + + // OK: Supported web deep links. + AssertWebDeepLink(GURL("googleassistant://reminders")); + AssertWebDeepLink(GURL("googleassistant://reminders?param=true")); + AssertWebDeepLink(GURL("googleassistant://settings")); + AssertWebDeepLink(GURL("googleassistant://settings?param=true")); + + // FAIL: Deep links are case sensitive. + AssertNotWebDeepLink(GURL("GOOGLEASSISTANT://REMINDERS")); + AssertNotWebDeepLink(GURL("GOOGLEASSISTANT://SETTINGS")); + + // FAIL: Non-web deep links. + AssertNotWebDeepLink(GURL("googleassistant://onboarding")); + AssertNotWebDeepLink(GURL("googleassistant://onboarding?param=true")); + + // FAIL: Non-deep link URLs. + AssertNotWebDeepLink(GURL()); + AssertNotWebDeepLink(GURL("https://www.google.com/")); +} + +TEST_F(DeepLinkUnitTest, ParseDeepLinkParams) { + auto AssertParamsParsed = [](const GURL& deep_link, + std::map<std::string, std::string>& params) { + ASSERT_TRUE(ParseDeepLinkParams(deep_link, params)); + }; + + auto AssertParamsNotParsed = [](const GURL& deep_link, + std::map<std::string, std::string>& params) { + ASSERT_FALSE(ParseDeepLinkParams(deep_link, params)); + }; + + std::map<std::string, std::string> params; + + auto ResetParams = [¶ms]() { + params["k1"] = "default"; + params["k2"] = "default"; + }; + + ResetParams(); + + // OK: All parameters present. + AssertParamsParsed(GURL("googleassistant://onboarding?k1=v1&k2=v2"), params); + ASSERT_EQ("v1", params["k1"]); + ASSERT_EQ("v2", params["k2"]); + + ResetParams(); + + // OK: Some parameters present. + AssertParamsParsed(GURL("googleassistant://onboarding?k1=v1"), params); + ASSERT_EQ("v1", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // OK: Unknown parameters present. + AssertParamsParsed(GURL("googleassistant://onboarding?k1=v1&k3=v3"), params); + ASSERT_EQ("v1", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // OK: No parameters present. + AssertParamsParsed(GURL("googleassistant://onboarding"), params); + ASSERT_EQ("default", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // OK: Parameters are case sensitive. + AssertParamsParsed(GURL("googleassistant://onboarding?K1=v1"), params); + ASSERT_EQ("default", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // FAIL: Deep links are case sensitive. + AssertParamsNotParsed(GURL("GOOGLEASSISTANT://ONBOARDING?k1=v1"), params); + ASSERT_EQ("default", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // FAIL: Malformed parameters. + AssertParamsNotParsed(GURL("googleassistant://onboarding?k1="), params); + ASSERT_EQ("default", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // FAIL: Non-deep link URLs. + AssertParamsNotParsed(GURL("https://www.google.com/search?q=query"), params); + ASSERT_EQ("default", params["k1"]); + ASSERT_EQ("default", params["k2"]); + + ResetParams(); + + // FAIL: Empty URLs. + AssertParamsNotParsed(GURL(), params); + ASSERT_EQ("default", params["k1"]); + ASSERT_EQ("default", params["k2"]); +} + +} // namespace ash
diff --git a/ash/content/content_gpu_interface_provider.cc b/ash/content/content_gpu_interface_provider.cc index 9289274..3d3fde1 100644 --- a/ash/content/content_gpu_interface_provider.cc +++ b/ash/content/content_gpu_interface_provider.cc
@@ -79,4 +79,12 @@ gpu_task_runner); } +void ContentGpuInterfaceProvider::RegisterOzoneGpuInterfaces( + service_manager::BinderRegistryWithArgs< + const service_manager::BindSourceInfo&>* registry) { + // Registers the gpu-related interfaces needed by Ozone. + // TODO(rjkroege): Adjust when Ozone/DRM/Mojo is complete. + NOTIMPLEMENTED(); +} + } // namespace ash
diff --git a/ash/content/content_gpu_interface_provider.h b/ash/content/content_gpu_interface_provider.h index 9585e5a..275267b 100644 --- a/ash/content/content_gpu_interface_provider.h +++ b/ash/content/content_gpu_interface_provider.h
@@ -5,9 +5,6 @@ #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" @@ -26,6 +23,9 @@ // ui::ws2::GpuInterfaceProvider: void RegisterGpuInterfaces( service_manager::BinderRegistry* registry) override; + void RegisterOzoneGpuInterfaces( + service_manager::BinderRegistryWithArgs< + const service_manager::BindSourceInfo&>* registry) override; private: class InterfaceBinderImpl;
diff --git a/ash/display/display_color_manager.cc b/ash/display/display_color_manager.cc index a9f0398..219941e 100644 --- a/ash/display/display_color_manager.cc +++ b/ash/display/display_color_manager.cc
@@ -6,9 +6,9 @@ #include <utility> -#include "ash/public/cpp/config.h" #include "ash/shell.h" #include "base/bind.h" +#include "base/feature_list.h" #include "base/files/file_util.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" @@ -19,6 +19,7 @@ #include "base/threading/thread_restrictions.h" #include "components/quirks/quirks_manager.h" #include "third_party/qcms/src/qcms.h" +#include "ui/base/ui_base_features.h" #include "ui/display/display.h" #include "ui/display/types/display_constants.h" #include "ui/display/types/display_snapshot.h" @@ -326,8 +327,11 @@ // TODO: enable QuirksManager for mash. http://crbug.com/728748. Some tests // don't create the Shell when running this code, hence the // Shell::HasInstance() conditional. - if (Shell::HasInstance() && Shell::GetAshConfig() == Config::MASH) + if (Shell::HasInstance() && + (base::FeatureList::IsEnabled(::features::kMash) || + base::FeatureList::IsEnabled(::features::kOopAsh))) { return false; + } const bool valid_product_code = display->product_code() != display::DisplaySnapshot::kInvalidProductCode;
diff --git a/ash/manifest.json b/ash/manifest.json index b89b7ab..db6b5c3 100644 --- a/ash/manifest.json +++ b/ash/manifest.json
@@ -71,7 +71,12 @@ "multidevice_setup": [ "multidevice_setup" ], "quick_launch_app": [ "mash:launchable" ], "service_manager": [ "service_manager:singleton" ], - "ui": [ "display_dev", "window_manager", "video_detector" ], + "ui": [ + "display_dev", + "ozone", + "video_detector", + "window_manager" + ], "data_decoder": [ "image_decoder" ] } }
diff --git a/ash/wm/tablet_mode/tablet_mode_browser_window_drag_controller.cc b/ash/wm/tablet_mode/tablet_mode_browser_window_drag_controller.cc index e7d8d5c8..f194be99 100644 --- a/ash/wm/tablet_mode/tablet_mode_browser_window_drag_controller.cc +++ b/ash/wm/tablet_mode/tablet_mode_browser_window_drag_controller.cc
@@ -38,6 +38,12 @@ constexpr int kScrimTransitionInMs = 250; constexpr int kScrimRoundRectRadiusDp = 4; +// The threshold to compute the vertical distance to create/reset the scrim. The +// scrim is placed below the current dragged window. This value is smaller than +// kIndicatorsThreshouldRatio to prevent the dragged window to merge back to +// its source window during its source window's animation. +constexpr float kScrimResetThresholdRatio = 0.05; + // Returns the window selector if overview mode is active, otherwise returns // nullptr. WindowSelector* GetWindowSelector() { @@ -63,6 +69,15 @@ return widget; } +// When the dragged window is dragged past this value, a transparent scrim will +// be created to place below the current dragged window to prevent the dragged +// window to merge into any browser window beneath it and when it's dragged back +// toward the top of the screen, the scrim will be destroyed. +int GetScrimVerticalThreshold(const gfx::Rect& work_area_bounds) { + return work_area_bounds.y() + + work_area_bounds.height() * kScrimResetThresholdRatio; +} + } // namespace TabletModeBrowserWindowDragController::TabletModeBrowserWindowDragController( @@ -226,9 +241,7 @@ const gfx::Rect work_area_bounds = display::Screen::GetScreen() ->GetDisplayNearestWindow(GetTarget()) .work_area(); - if (location_in_screen.y() < - TabletModeWindowDragDelegate::GetIndicatorsVerticalThreshold( - work_area_bounds)) { + if (location_in_screen.y() < GetScrimVerticalThreshold(work_area_bounds)) { // Remove |scrim_| entirely so that the dragged window can be merged back // to the source window when the dragged window is dragged back toward the // top area of the screen.
diff --git a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.h b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.h index a1acf1e6..32a1b1c5 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.h +++ b/ash/wm/tablet_mode/tablet_mode_window_drag_delegate.h
@@ -32,8 +32,8 @@ // will show up. static int GetIndicatorsVerticalThreshold(const gfx::Rect& work_area_bounds); - // When the dragged window is dragged past this value, a scrim will show up, - // indicating the dragged window will be maximized after releasing. + // When the dragged window is dragged past this value, a blured scrim will + // show up, indicating the dragged window will be maximized after releasing. static int GetMaximizeVerticalThreshold(const gfx::Rect& work_area_bounds); // Called when a browser/app window start/end being dragging around.
diff --git a/ash/ws/ash_gpu_interface_provider.cc b/ash/ws/ash_gpu_interface_provider.cc index dd2b311..e715099 100644 --- a/ash/ws/ash_gpu_interface_provider.cc +++ b/ash/ws/ash_gpu_interface_provider.cc
@@ -9,6 +9,7 @@ #include "services/service_manager/public/cpp/bind_source_info.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "services/ui/gpu_host/gpu_host.h" +#include "ui/ozone/public/ozone_platform.h" namespace ash { @@ -35,6 +36,12 @@ &AshGpuInterfaceProvider::BindGpuRequest, base::Unretained(this))); } +void AshGpuInterfaceProvider::RegisterOzoneGpuInterfaces( + service_manager::BinderRegistryWithArgs< + const service_manager::BindSourceInfo&>* registry) { + ui::OzonePlatform::GetInstance()->AddInterfaces(registry); +} + void AshGpuInterfaceProvider::BindArcRequest(ui::mojom::ArcRequest request) { gpu_host_->AddArc(std::move(request)); }
diff --git a/ash/ws/ash_gpu_interface_provider.h b/ash/ws/ash_gpu_interface_provider.h index 0d1d0637..f20dff1 100644 --- a/ash/ws/ash_gpu_interface_provider.h +++ b/ash/ws/ash_gpu_interface_provider.h
@@ -33,6 +33,9 @@ // ui::ws2::GpuInterfaceProvider: void RegisterGpuInterfaces( service_manager::BinderRegistry* registry) override; + void RegisterOzoneGpuInterfaces( + service_manager::BinderRegistryWithArgs< + const service_manager::BindSourceInfo&>* registry) override; private: void BindArcRequest(ui::mojom::ArcRequest request);
diff --git a/base/android/java_handler_thread.cc b/base/android/java_handler_thread.cc index 3b3f3b6..8147764f 100644 --- a/base/android/java_handler_thread.cc +++ b/base/android/java_handler_thread.cc
@@ -64,7 +64,7 @@ jlong event) { // TYPE_JAVA to get the Android java style message loop. message_loop_ = new base::MessageLoop(base::MessageLoop::TYPE_JAVA); - StartMessageLoop(); + Init(); reinterpret_cast<base::WaitableEvent*>(event)->Signal(); } @@ -79,11 +79,6 @@ CleanUp(); } -void JavaHandlerThread::StartMessageLoop() { - static_cast<MessageLoopForUI*>(message_loop_)->Start(); - Init(); -} - void JavaHandlerThread::StopMessageLoop() { base::RunLoop::QuitCurrentWhenIdleDeprecated(); }
diff --git a/base/android/java_handler_thread.h b/base/android/java_handler_thread.h index df90f66..24c7d2e 100644 --- a/base/android/java_handler_thread.h +++ b/base/android/java_handler_thread.h
@@ -54,7 +54,6 @@ void StopThread(JNIEnv* env, const JavaParamRef<jobject>& obj); void OnLooperStopped(JNIEnv* env, const JavaParamRef<jobject>& obj); - virtual void StartMessageLoop(); virtual void StopMessageLoop(); void StopMessageLoopForTesting();
diff --git a/base/debug/alias.cc b/base/debug/alias.cc index 6b0caaa..ebc8b5a4 100644 --- a/base/debug/alias.cc +++ b/base/debug/alias.cc
@@ -10,6 +10,8 @@ #if defined(COMPILER_MSVC) #pragma optimize("", off) +#elif defined(__clang__) +#pragma clang optimize off #endif void Alias(const void* var) { @@ -17,6 +19,8 @@ #if defined(COMPILER_MSVC) #pragma optimize("", on) +#elif defined(__clang__) +#pragma clang optimize on #endif } // namespace debug
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc index f4cd32c..0ad28fa 100644 --- a/base/message_loop/message_loop.cc +++ b/base/message_loop/message_loop.cc
@@ -263,6 +263,12 @@ &sequence_local_storage_map_); RunLoop::RegisterDelegateForCurrentThread(this); + +#if defined(OS_ANDROID) + // On Android, attach to the native loop when there is one. + if (type_ == TYPE_UI || type_ == TYPE_JAVA) + static_cast<MessagePumpForUI*>(pump_.get())->Attach(this); +#endif } std::string MessageLoop::GetThreadName() const { @@ -596,11 +602,6 @@ #endif // defined(OS_IOS) #if defined(OS_ANDROID) -void MessageLoopForUI::Start() { - // No Histogram support for UI message loop as it is managed by Java side - static_cast<MessagePumpForUI*>(pump_.get())->Start(this); -} - void MessageLoopForUI::Abort() { static_cast<MessagePumpForUI*>(pump_.get())->Abort(); }
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h index a1c5c40..64838a9 100644 --- a/base/message_loop/message_loop.h +++ b/base/message_loop/message_loop.h
@@ -363,11 +363,6 @@ #endif #if defined(OS_ANDROID) - // On Android, the UI message loop is handled by Java side. So Run() should - // never be called. Instead use Start(), which will forward all the native UI - // events to the Java message loop. - void Start(); - // In Android there are cases where we want to abort immediately without // calling Quit(), in these cases we call Abort(). void Abort();
diff --git a/base/message_loop/message_loop_current.cc b/base/message_loop/message_loop_current.cc index 5554e9f..4959b70 100644 --- a/base/message_loop/message_loop_current.cc +++ b/base/message_loop/message_loop_current.cc
@@ -168,10 +168,6 @@ #endif // defined(OS_IOS) #if defined(OS_ANDROID) -void MessageLoopCurrentForUI::Start() { - static_cast<MessageLoopForUI*>(current_)->Start(); -} - void MessageLoopCurrentForUI::Abort() { static_cast<MessageLoopForUI*>(current_)->Abort(); }
diff --git a/base/message_loop/message_loop_current.h b/base/message_loop/message_loop_current.h index 9e19a78..61d1607 100644 --- a/base/message_loop/message_loop_current.h +++ b/base/message_loop/message_loop_current.h
@@ -225,12 +225,6 @@ #endif #if defined(OS_ANDROID) - // Forwards to MessageLoopForUI::Start(). - // TODO(https://crbug.com/825327): Plumb the actual MessageLoopForUI* to - // callers and remove ability to access this method from - // MessageLoopCurrentForUI. - void Start(); - // Forwards to MessageLoopForUI::Abort(). // TODO(https://crbug.com/825327): Plumb the actual MessageLoopForUI* to // callers and remove ability to access this method from
diff --git a/base/message_loop/message_pump_android.cc b/base/message_loop/message_pump_android.cc index 8c5bb57..5f8981d 100644 --- a/base/message_loop/message_pump_android.cc +++ b/base/message_loop/message_pump_android.cc
@@ -80,7 +80,7 @@ " test_stub_android.h"; } -void MessagePumpForUI::Start(Delegate* delegate) { +void MessagePumpForUI::Attach(Delegate* delegate) { DCHECK(!quit_); delegate_ = delegate; run_loop_ = std::make_unique<RunLoop>();
diff --git a/base/message_loop/message_pump_android.h b/base/message_loop/message_pump_android.h index d09fdde..21f0315 100644 --- a/base/message_loop/message_pump_android.h +++ b/base/message_loop/message_pump_android.h
@@ -36,7 +36,9 @@ void ScheduleWork() override; void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override; - virtual void Start(Delegate* delegate); + // Attaches |delegate| to this native MessagePump. |delegate| will from then + // on be invoked by the native loop to process application tasks. + virtual void Attach(Delegate* delegate); // We call Abort when there is a pending JNI exception, meaning that the // current thread will crash when we return to Java.
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc index 2876f419..4e788b78 100644 --- a/base/process/process_util_unittest.cc +++ b/base/process/process_util_unittest.cc
@@ -45,17 +45,19 @@ #if defined(OS_POSIX) #include <sys/resource.h> #endif -#if defined(OS_POSIX) || defined(OS_FUCHSIA) +#if defined(OS_POSIX) #include <dlfcn.h> #include <errno.h> -#include <fcntl.h> #include <sched.h> #include <signal.h> -#include <sys/socket.h> -#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #endif +#if defined(OS_POSIX) || defined(OS_FUCHSIA) +#include <fcntl.h> +#include <sys/socket.h> +#include <sys/types.h> +#endif #if defined(OS_WIN) #include <windows.h> #endif @@ -74,6 +76,7 @@ #include "base/base_paths_fuchsia.h" #include "base/files/scoped_temp_dir.h" #include "base/fuchsia/file_utils.h" +#include "base/fuchsia/fuchsia_logging.h" #endif namespace base { @@ -84,7 +87,7 @@ const char kSignalFileKill[] = "KilledChildProcess.die"; const char kTestHelper[] = "test_child_process"; -#if defined(OS_POSIX) || defined(OS_FUCHSIA) +#if defined(OS_POSIX) const char kSignalFileTerm[] = "TerminatedChildProcess.die"; #endif @@ -538,7 +541,7 @@ MULTIPROCESS_TEST_MAIN(CrashingChildProcess) { WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileCrash).c_str()); -#if defined(OS_POSIX) || defined(OS_FUCHSIA) +#if defined(OS_POSIX) // Have to disable to signal handler for segv so we can get a crash // instead of an abnormal termination through the crash dump handler. ::signal(SIGSEGV, SIG_DFL); @@ -578,7 +581,7 @@ #if defined(OS_WIN) EXPECT_EQ(static_cast<int>(0xc0000005), exit_code); -#elif defined(OS_POSIX) || defined(OS_FUCHSIA) +#elif defined(OS_POSIX) int signaled = WIFSIGNALED(exit_code); EXPECT_NE(0, signaled); int signal = WTERMSIG(exit_code); @@ -597,14 +600,16 @@ // Kill ourselves. HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, ::GetCurrentProcessId()); ::TerminateProcess(handle, kExpectedKilledExitCode); -#elif defined(OS_POSIX) || defined(OS_FUCHSIA) +#elif defined(OS_POSIX) // Send a SIGKILL to this process, just like the OOM killer would. ::kill(getpid(), SIGKILL); +#elif defined(OS_FUCHSIA) + zx_task_kill(zx_process_self()); #endif return 1; } -#if defined(OS_POSIX) || defined(OS_FUCHSIA) +#if defined(OS_POSIX) MULTIPROCESS_TEST_MAIN(TerminatedChildProcess) { WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileTerm).c_str()); // Send a SIGTERM to this process. @@ -644,7 +649,7 @@ #if defined(OS_WIN) EXPECT_EQ(kExpectedKilledExitCode, exit_code); -#elif defined(OS_POSIX) || defined(OS_FUCHSIA) +#elif defined(OS_POSIX) int signaled = WIFSIGNALED(exit_code); EXPECT_NE(0, signaled); int signal = WTERMSIG(exit_code);
diff --git a/base/test/test_support_android.cc b/base/test/test_support_android.cc index 33a6628..411ccf02 100644 --- a/base/test/test_support_android.cc +++ b/base/test/test_support_android.cc
@@ -75,10 +75,10 @@ class MessagePumpForUIStub : public base::MessagePumpForUI { ~MessagePumpForUIStub() override {} - void Start(base::MessagePump::Delegate* delegate) override { - NOTREACHED() << "The Start() method shouldn't be called in test, using" - " Run() method should be used."; - } + // In tests, there isn't a native thread, as such RunLoop::Run() should be + // used to run the loop instead of attaching and delegating to the native + // loop. As such, this override ignores the Attach() request. + void Attach(base::MessagePump::Delegate* delegate) override {} void Run(base::MessagePump::Delegate* delegate) override { // The following was based on message_pump_glib.cc, except we're using a
diff --git a/chrome/android/java/res/xml/contextual_suggestions_preferences.xml b/chrome/android/java/res/xml/contextual_suggestions_preferences.xml index d60a4d51..4297d2e 100644 --- a/chrome/android/java/res/xml/contextual_suggestions_preferences.xml +++ b/chrome/android/java/res/xml/contextual_suggestions_preferences.xml
@@ -14,7 +14,7 @@ app:drawDivider="true" /> <org.chromium.chrome.browser.preferences.TextMessagePreference - android:title="@string/contextual_suggestions_description" /> + android:key="contextual_suggestions_description" /> <org.chromium.chrome.browser.preferences.TextMessagePreference android:key="contextual_suggestions_message" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 189caed..c2fd9712 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -162,7 +162,7 @@ public static final String CCT_PARALLEL_REQUEST = "CCTParallelRequest"; public static final String CCT_POST_MESSAGE_API = "CCTPostMessageAPI"; public static final String CCT_REDIRECT_PRECONNECT = "CCTRedirectPreconnect"; - public static final String CHROME_DUPLEX = "ChromeDuplex"; + public static final String CHROME_DUET = "ChromeDuet"; // TODO(mdjones): Remove CHROME_HOME_SWIPE_VELOCITY_FEATURE or rename. public static final String CHROME_HOME_SWIPE_VELOCITY_FEATURE = "ChromeHomeSwipeLogicVelocity"; public static final String CHROME_MEMEX = "ChromeMemex"; @@ -221,6 +221,7 @@ public static final String MATERIAL_DESIGN_INCOGNITO_NTP = "MaterialDesignIncognitoNTP"; public static final String MODAL_PERMISSION_PROMPTS = "ModalPermissionPrompts"; public static final String MODAL_PERMISSION_DIALOG_VIEW = "ModalPermissionDialogView"; + public static final String NEW_CONTACTS_PICKER = "NewContactsPicker"; public static final String NEW_PHOTO_PICKER = "NewPhotoPicker"; public static final String NO_CREDIT_CARD_ABORT = "NoCreditCardAbort"; @@ -263,7 +264,6 @@ public static final String VIDEO_PERSISTENCE = "VideoPersistence"; public static final String UNIFIED_CONSENT = "UnifiedConsent"; public static final String VR_BROWSING_FEEDBACK = "VrBrowsingFeedback"; - public static final String VR_BROWSING_IN_CUSTOM_TAB = "VrBrowsingInCustomTab"; public static final String VR_BROWSING_NATIVE_ANDROID_UI = "VrBrowsingNativeAndroidUi"; public static final String WEB_AUTH = "WebAuthentication"; public static final String WEB_PAYMENTS = "WebPayments"; @@ -274,7 +274,6 @@ "ReturnGooglePayInBasicCard"; public static final String WEB_PAYMENTS_SINGLE_APP_UI_SKIP = "WebPaymentsSingleAppUiSkip"; public static final String WEBVR_AUTOPRESENT_FROM_INTENT = "WebVrAutopresentFromIntent"; - public static final String WEBVR_CARDBOARD_SUPPORT = "WebVrCardboardSupport"; private static native boolean nativeIsInitialized(); private static native boolean nativeIsEnabled(String featureName);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/OWNERS index 311827f..e80e4240 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/OWNERS +++ b/chrome/android/java/src/org/chromium/chrome/browser/OWNERS
@@ -1,3 +1,4 @@ +per-file ChromeApplication.java=agrieve@chromium.org per-file ShortcutHelper.java=dominickn@chromium.org per-file SingleTabActivity.java=dominickn@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java index 27149eb..94cc600 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimation.java
@@ -119,8 +119,8 @@ * @param object object to find animations to be aborted. If null, matches all the animations. * @param property property to find animations to be aborted. */ - public <V extends Enum<?>> void cancel(T object, V property) { - for (int i = mAnimations.size() - 1; i >= 0; i--) { + public void cancel(T object, int property) { + for (int i = mAnimations.size() - 1; i >= 0; i--) { Animation<T> animation = mAnimations.get(i); if ((object == null || animation.getAnimatedObject() == object) && animation.checkProperty(property)) { @@ -171,9 +171,7 @@ finished &= mAnimations.get(i).finished(); } - if (finished) { - updateAndFinish(); - } + if (finished) updateAndFinish(); return false; } @@ -181,14 +179,10 @@ * @return Whether or not this ChromeAnimation is finished animating. */ public boolean finished() { - if (mFinishCalled.get()) { - return true; - } + if (mFinishCalled.get()) return true; for (int i = 0; i < mAnimations.size(); ++i) { - if (!mAnimations.get(i).finished()) { - return false; - } + if (!mAnimations.get(i).finished()) return false; } return true; @@ -324,9 +318,7 @@ // Bound our time here so that our scale never goes above 1.0. mCurrentTime = Math.min(mCurrentTime, mDuration + mStartDelay); - if (mDelayStartValue && mCurrentTime < mStartDelay) { - return; - } + if (mDelayStartValue && mCurrentTime < mStartDelay) return; // Figure out the relative fraction of time we need to animate. long relativeTime = MathUtils.clamp(mCurrentTime - mStartDelay, 0, mDuration); @@ -363,7 +355,7 @@ /** * Checks if the given property is being animated. */ - public <V extends Enum<?>> boolean checkProperty(V prop) { + public boolean checkProperty(int prop) { return true; } @@ -384,36 +376,29 @@ /** * Provides a interface for updating animatible properties. - * - * @param <T> The {@link Enum} of animatable properties. */ - public static interface Animatable<T extends Enum<?>> { - + public static interface Animatable { /** * Updates an animatable property. * * @param prop The property to update * @param val The new value */ - public void setProperty(T prop, float val); + public void setProperty(int prop, float val); /** * Notifies that the animation for a certain property has finished. * * @param prop The property that has finished animating. */ - public void onPropertyAnimationFinished(T prop); + public void onPropertyAnimationFinished(int prop); } /** * An animation that can be applied to {@link ChromeAnimation.Animatable} objects. - * - * @param <V> The type of {@link ChromeAnimation.Animatable} object to animate. */ - public static class AnimatableAnimation<V extends Enum<?>> extends - Animation<Animatable<V>> { - - private final V mProperty; + public static class AnimatableAnimation extends Animation<Animatable> { + private final int mProperty; /** * @param animatable The object being animated @@ -424,7 +409,7 @@ * @param startTime The time at which this animation should start. * @param interpolator The interpolator to use for the animation */ - public AnimatableAnimation(Animatable<V> animatable, V property, float start, float end, + public AnimatableAnimation(Animatable animatable, int property, float start, float end, long duration, long startTime, Interpolator interpolator) { super(animatable, start, end, duration, startTime, interpolator); mProperty = property; @@ -444,7 +429,6 @@ * Helper method to add an {@link ChromeAnimation.AnimatableAnimation} * to a {@link ChromeAnimation} * - * @param <T> The Enum type of the Property being used * @param set The set to add the animation to * @param object The object being animated * @param prop The property being animated @@ -453,9 +437,8 @@ * @param duration The duration of the animation in ms * @param startTime The start time in ms */ - public static <T extends Enum<?>> void addAnimation(ChromeAnimation<Animatable<?>> set, - Animatable<T> object, T prop, float start, float end, long duration, - long startTime) { + public static void addAnimation(ChromeAnimation<Animatable> set, Animatable object, + int prop, float start, float end, long duration, long startTime) { addAnimation(set, object, prop, start, end, duration, startTime, false); } @@ -463,7 +446,6 @@ * Helper method to add an {@link ChromeAnimation.AnimatableAnimation} * to a {@link ChromeAnimation} * - * @param <T> The Enum type of the Property being used * @param set The set to add the animation to * @param object The object being animated * @param prop The property being animated @@ -474,8 +456,8 @@ * @param setStartValueAfterStartDelay See * {@link ChromeAnimation.Animation#setStartValueAfterStartDelay(boolean)} */ - public static <T extends Enum<?>> void addAnimation(ChromeAnimation<Animatable<?>> set, - Animatable<T> object, T prop, float start, float end, long duration, long startTime, + public static void addAnimation(ChromeAnimation<Animatable> set, Animatable object, + int prop, float start, float end, long duration, long startTime, boolean setStartValueAfterStartDelay) { addAnimation(set, object, prop, start, end, duration, startTime, setStartValueAfterStartDelay, getDecelerateInterpolator()); @@ -485,7 +467,6 @@ * Helper method to add an {@link ChromeAnimation.AnimatableAnimation} * to a {@link ChromeAnimation} * - * @param <T> The Enum type of the Property being used * @param set The set to add the animation to * @param object The object being animated * @param prop The property being animated @@ -497,19 +478,18 @@ * {@link ChromeAnimation.Animation#setStartValueAfterStartDelay(boolean)} * @param interpolator The interpolator to use for the animation */ - public static <T extends Enum<?>> void addAnimation(ChromeAnimation<Animatable<?>> set, - Animatable<T> object, T prop, float start, float end, long duration, long startTime, + public static void addAnimation(ChromeAnimation<Animatable> set, Animatable object, + int prop, float start, float end, long duration, long startTime, boolean setStartValueAfterStartDelay, Interpolator interpolator) { if (duration <= 0) return; - Animation<Animatable<?>> animation = createAnimation(object, prop, start, end, - duration, startTime, setStartValueAfterStartDelay, interpolator); + Animation<Animatable> animation = createAnimation(object, prop, start, end, duration, + startTime, setStartValueAfterStartDelay, interpolator); set.add(animation); } /** * Helper method to create an {@link ChromeAnimation.AnimatableAnimation} * - * @param <T> The Enum type of the Property being used * @param object The object being animated * @param prop The property being animated * @param start The starting value of the animation @@ -520,11 +500,11 @@ * {@link ChromeAnimation.Animation#setStartValueAfterStartDelay(boolean)} * @param interpolator The interpolator to use for the animation */ - public static <T extends Enum<?>> Animation<Animatable<?>> createAnimation( - Animatable<T> object, T prop, float start, float end, long duration, - long startTime, boolean setStartValueAfterStartDelay, Interpolator interpolator) { - Animation<Animatable<?>> animation = new AnimatableAnimation(object, prop, start, end, - duration, startTime, interpolator); + public static Animation<Animatable> createAnimation(Animatable object, int prop, + float start, float end, long duration, long startTime, + boolean setStartValueAfterStartDelay, Interpolator interpolator) { + Animation<Animatable> animation = new AnimatableAnimation( + object, prop, start, end, duration, startTime, interpolator); animation.setStartValueAfterStartDelay(setStartValueAfterStartDelay); return animation; } @@ -533,7 +513,7 @@ * Checks if the given property is being animated. */ @Override - public <V extends Enum<?>> boolean checkProperty(V prop) { + public boolean checkProperty(int prop) { return mProperty == prop; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java index 6ca0343..e4b62a7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
@@ -49,10 +49,10 @@ /** * The orientation of the device. */ - public interface Orientation { - public static final int UNSET = 0; - public static final int PORTRAIT = 1; - public static final int LANDSCAPE = 2; + public @interface Orientation { + int UNSET = 0; + int PORTRAIT = 1; + int LANDSCAPE = 2; } /** The possible variations of the visible viewport that different layouts may need. */ @@ -96,7 +96,7 @@ protected TabModelSelector mTabModelSelector; protected TabContentManager mTabContentManager; - private ChromeAnimation<Animatable<?>> mLayoutAnimations; + private ChromeAnimation<Animatable> mLayoutAnimations; // Tablet tab strip managers. private final List<SceneOverlay> mSceneOverlays = new ArrayList<SceneOverlay>(); @@ -891,8 +891,8 @@ * .AnimatableAnimation} and adds it to the animation. * Automatically sets the start value at the beginning of the animation. */ - protected <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, float start, - float end, long duration, long startTime) { + protected void addToAnimation( + Animatable object, int prop, float start, float end, long duration, long startTime) { addToAnimation(object, prop, start, end, duration, startTime, false); } @@ -900,8 +900,8 @@ * Creates an {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation * .AnimatableAnimation} and it to the animation. Uses a deceleration interpolator by default. */ - protected <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, float start, - float end, long duration, long startTime, boolean setStartValueAfterDelay) { + protected void addToAnimation(Animatable object, int prop, float start, float end, + long duration, long startTime, boolean setStartValueAfterDelay) { addToAnimation(object, prop, start, end, duration, startTime, setStartValueAfterDelay, ChromeAnimation.getDecelerateInterpolator()); } @@ -921,11 +921,11 @@ * @param setStartValueAfterDelay See {@link Animation#setStartValueAfterStartDelay(boolean)} * @param interpolator The interpolator to use for the animation */ - protected <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, float start, - float end, long duration, long startTime, boolean setStartValueAfterDelay, + protected void addToAnimation(Animatable object, int prop, float start, float end, + long duration, long startTime, boolean setStartValueAfterDelay, Interpolator interpolator) { - ChromeAnimation.Animation<Animatable<?>> component = createAnimation(object, prop, start, - end, duration, startTime, setStartValueAfterDelay, interpolator); + ChromeAnimation.Animation<Animatable> component = createAnimation(object, prop, start, end, + duration, startTime, setStartValueAfterDelay, interpolator); addToAnimation(component); } @@ -933,10 +933,10 @@ * Appends an Animation to the current animation set and starts it immediately. If the set is * already finished or doesn't exist, the animation set is also started. */ - protected void addToAnimation(ChromeAnimation.Animation<Animatable<?>> component) { + protected void addToAnimation(ChromeAnimation.Animation<Animatable> component) { if (mLayoutAnimations == null || mLayoutAnimations.finished()) { onAnimationStarted(); - mLayoutAnimations = new ChromeAnimation<Animatable<?>>(); + mLayoutAnimations = new ChromeAnimation<Animatable>(); mLayoutAnimations.start(); } component.start(); @@ -949,10 +949,8 @@ * @param object The object being animated. * @param prop The property to search for. */ - protected <T extends Enum<?>> void cancelAnimation(Animatable<T> object, T prop) { - if (mLayoutAnimations != null) { - mLayoutAnimations.cancel(object, prop); - } + protected void cancelAnimation(Animatable object, int prop) { + if (mLayoutAnimations != null) mLayoutAnimations.cancel(object, prop); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/LayoutTab.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/LayoutTab.java index 49fa59d..556da592 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/LayoutTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/LayoutTab.java
@@ -8,6 +8,7 @@ import android.content.res.Resources; import android.graphics.Color; import android.graphics.RectF; +import android.support.annotation.IntDef; import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.animation.FloatProperty; @@ -15,32 +16,41 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.MathUtils; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * {@link LayoutTab} is used to keep track of a thumbnail's bitmap and position and to * draw itself onto the GL canvas at the desired Y Offset. */ -public class LayoutTab implements ChromeAnimation.Animatable<LayoutTab.Property> { +public class LayoutTab implements ChromeAnimation.Animatable { /** * Properties that can be animated by using a * {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable}. */ - public enum Property { - BORDER_ALPHA, - BORDER_SCALE, - ALPHA, - SATURATION, - STATIC_TO_VIEW_BLEND, - SCALE, - TILTX, - TILTY, - X, - Y, - MAX_CONTENT_WIDTH, - MAX_CONTENT_HEIGHT, - TOOLBAR_ALPHA, - DECORATION_ALPHA, - TOOLBAR_Y_OFFSET, - SIDE_BORDER_SCALE, + @IntDef({Property.BORDER_ALPHA, Property.BORDER_SCALE, Property.ALPHA, Property.SATURATION, + Property.STATIC_TO_VIEW_BLEND, Property.SCALE, Property.TILTX, Property.TILTY, + Property.X, Property.Y, Property.MAX_CONTENT_WIDTH, Property.MAX_CONTENT_HEIGHT, + Property.TOOLBAR_ALPHA, Property.DECORATION_ALPHA, Property.TOOLBAR_Y_OFFSET, + Property.SIDE_BORDER_SCALE}) + @Retention(RetentionPolicy.SOURCE) + public @interface Property { + int BORDER_ALPHA = 0; + int BORDER_SCALE = 1; + int ALPHA = 2; + int SATURATION = 3; + int STATIC_TO_VIEW_BLEND = 4; + int SCALE = 5; + int TILTX = 6; + int TILTY = 7; + int X = 8; + int Y = 9; + int MAX_CONTENT_WIDTH = 10; + int MAX_CONTENT_HEIGHT = 11; + int TOOLBAR_ALPHA = 12; + int DECORATION_ALPHA = 13; + int TOOLBAR_Y_OFFSET = 14; + int SIDE_BORDER_SCALE = 15; } public static final float ALPHA_THRESHOLD = 1.0f / 255.0f; @@ -116,7 +126,7 @@ private boolean mInitFromHostCalled; /** The animation set specific to this LayoutTab. */ - private ChromeAnimation<ChromeAnimation.Animatable<?>> mCurrentAnimations; + private ChromeAnimation<ChromeAnimation.Animatable> mCurrentAnimations; private int mInitialThemeColor; private int mFinalThemeColor; @@ -930,61 +940,61 @@ * @param val The value to set it to */ @Override - public void setProperty(Property prop, float val) { + public void setProperty(@Property int prop, float val) { switch (prop) { - case BORDER_ALPHA: + case Property.BORDER_ALPHA: setBorderAlpha(val); break; - case BORDER_SCALE: + case Property.BORDER_SCALE: setBorderScale(val); break; - case ALPHA: + case Property.ALPHA: setAlpha(val); break; - case SATURATION: + case Property.SATURATION: setSaturation(val); break; - case STATIC_TO_VIEW_BLEND: + case Property.STATIC_TO_VIEW_BLEND: setStaticToViewBlend(val); break; - case SCALE: + case Property.SCALE: setScale(val); break; - case TILTX: + case Property.TILTX: setTiltX(val, mTiltXPivotOffset); break; - case TILTY: + case Property.TILTY: setTiltY(val, mTiltYPivotOffset); break; - case X: + case Property.X: setX(val); break; - case Y: + case Property.Y: setY(val); break; - case MAX_CONTENT_WIDTH: + case Property.MAX_CONTENT_WIDTH: setMaxContentWidth(val); break; - case MAX_CONTENT_HEIGHT: + case Property.MAX_CONTENT_HEIGHT: setMaxContentHeight(val); break; - case TOOLBAR_ALPHA: + case Property.TOOLBAR_ALPHA: setToolbarAlpha(val); break; - case DECORATION_ALPHA: + case Property.DECORATION_ALPHA: setDecorationAlpha(val); break; - case TOOLBAR_Y_OFFSET: + case Property.TOOLBAR_Y_OFFSET: setToolbarYOffset(val); break; - case SIDE_BORDER_SCALE: + case Property.SIDE_BORDER_SCALE: setSideBorderScale(val); break; } } @Override - public void onPropertyAnimationFinished(Property prop) { + public void onPropertyAnimationFinished(@Property int prop) { if (mCurrentAnimations != null && mCurrentAnimations.finished()) { mCurrentAnimations = null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayout.java index 6aa5729..5d50055 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayout.java
@@ -120,8 +120,8 @@ NonOverlappingStack oldStack = (NonOverlappingStack) mStacks.get( toIncognitoTabModel ? NORMAL_STACK_INDEX : INCOGNITO_STACK_INDEX); oldStack.runSwitchAwayAnimation(toIncognitoTabModel - ? NonOverlappingStack.SWITCH_DIRECTION_LEFT - : NonOverlappingStack.SWITCH_DIRECTION_RIGHT); + ? NonOverlappingStack.SwitchDirection.LEFT + : NonOverlappingStack.SwitchDirection.RIGHT); } else { flingStacks(toIncognitoTabModel ? INCOGNITO_STACK_INDEX : NORMAL_STACK_INDEX); mFlingFromModelChange = true; @@ -134,8 +134,8 @@ mRenderedScrollOffset = -newStackIndex; NonOverlappingStack newStack = (NonOverlappingStack) mStacks.get(newStackIndex); newStack.runSwitchToAnimation(newStackIndex == INCOGNITO_STACK_INDEX - ? NonOverlappingStack.SWITCH_DIRECTION_LEFT - : NonOverlappingStack.SWITCH_DIRECTION_RIGHT); + ? NonOverlappingStack.SwitchDirection.LEFT + : NonOverlappingStack.SwitchDirection.RIGHT); } @Override @@ -184,9 +184,9 @@ protected @SwipeMode int computeInputMode(long time, float x, float y, float dx, float dy) { // If this experiment flag is enabled, we add an incognito toggle button to the toolbar, and // disable swiping between the stacks. - if (isHorizontalTabSwitcherFlagEnabled()) return SWIPE_MODE_SEND_TO_STACK; + if (isHorizontalTabSwitcherFlagEnabled()) return SwipeMode.SEND_TO_STACK; - if (mStacks.size() == 2 && !mStacks.get(1).isDisplayable()) return SWIPE_MODE_SEND_TO_STACK; + if (mStacks.size() == 2 && !mStacks.get(1).isDisplayable()) return SwipeMode.SEND_TO_STACK; return super.computeInputMode(time, x, y, dx, dy); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java index adcfe9e9..268fbe9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/StackLayoutBase.java
@@ -56,27 +56,30 @@ /** * Base class for layouts that show one or more stacks of tabs. */ -public abstract class StackLayoutBase - extends Layout implements Animatable<StackLayoutBase.Property> { - public enum Property { - INNER_MARGIN_PERCENT, - STACK_SNAP, - STACK_OFFSET_Y_PERCENT, +public abstract class StackLayoutBase extends Layout implements Animatable { + @IntDef({Property.INNER_MARGIN_PERCENT, Property.STACK_SNAP, Property.STACK_OFFSET_Y_PERCENT}) + @Retention(RetentionPolicy.SOURCE) + public @interface Property { + int INNER_MARGIN_PERCENT = 0; + int STACK_SNAP = 1; + int STACK_OFFSET_Y_PERCENT = 2; } - @IntDef({DRAG_DIRECTION_NONE, DRAG_DIRECTION_HORIZONTAL, DRAG_DIRECTION_VERTICAL}) + @IntDef({DragDirection.NONE, DragDirection.HORIZONTAL, DragDirection.VERTICAL}) @Retention(RetentionPolicy.SOURCE) - public @interface DragDirection {} - private static final int DRAG_DIRECTION_NONE = 0; - private static final int DRAG_DIRECTION_HORIZONTAL = 1; - private static final int DRAG_DIRECTION_VERTICAL = 2; + public @interface DragDirection { + int NONE = 0; + int HORIZONTAL = 1; + int VERTICAL = 2; + } - @IntDef({SWIPE_MODE_NONE, SWIPE_MODE_SEND_TO_STACK, SWIPE_MODE_SWITCH_STACK}) + @IntDef({SwipeMode.NONE, SwipeMode.SEND_TO_STACK, SwipeMode.SWITCH_STACK}) @Retention(RetentionPolicy.SOURCE) - public @interface SwipeMode {} - protected static final int SWIPE_MODE_NONE = 0; - protected static final int SWIPE_MODE_SEND_TO_STACK = 1; - protected static final int SWIPE_MODE_SWITCH_STACK = 2; + public @interface SwipeMode { + int NONE = 0; + int SEND_TO_STACK = 1; + int SWITCH_STACK = 2; + } protected static final int INVALID_STACK_INDEX = -1; @@ -134,10 +137,10 @@ private float mStackOffsetYPercent; @DragDirection - private int mDragDirection = DRAG_DIRECTION_NONE; + private int mDragDirection = DragDirection.NONE; @SwipeMode - private int mInputMode = SWIPE_MODE_NONE; + private int mInputMode = SwipeMode.NONE; private float mLastOnDownX; private float mLastOnDownY; private long mLastOnDownTimeStamp; @@ -188,7 +191,7 @@ @Override public void onDown(float x, float y, boolean fromMouse, int buttons) { long time = time(); - mDragDirection = DRAG_DIRECTION_NONE; + mDragDirection = DragDirection.NONE; mLastOnDownX = x; mLastOnDownY = y; mLastOnDownTimeStamp = time; @@ -213,19 +216,19 @@ float amountY = dy; mInputMode = computeInputMode(time, x, y, amountX, amountY); - if (mDragDirection == DRAG_DIRECTION_HORIZONTAL) amountY = 0; - if (mDragDirection == DRAG_DIRECTION_VERTICAL) amountX = 0; + if (mDragDirection == DragDirection.HORIZONTAL) amountY = 0; + if (mDragDirection == DragDirection.VERTICAL) amountX = 0; - if (oldInputMode == SWIPE_MODE_SEND_TO_STACK && mInputMode == SWIPE_MODE_SWITCH_STACK) { + if (oldInputMode == SwipeMode.SEND_TO_STACK && mInputMode == SwipeMode.SWITCH_STACK) { mStacks.get(getTabStackIndex()).onUpOrCancel(time); - } else if (oldInputMode == SWIPE_MODE_SWITCH_STACK - && mInputMode == SWIPE_MODE_SEND_TO_STACK) { + } else if (oldInputMode == SwipeMode.SWITCH_STACK + && mInputMode == SwipeMode.SEND_TO_STACK) { onUpOrCancel(time); } - if (mInputMode == SWIPE_MODE_SEND_TO_STACK) { + if (mInputMode == SwipeMode.SEND_TO_STACK) { mStacks.get(getTabStackIndex()).drag(time, x, y, amountX, amountY); - } else if (mInputMode == SWIPE_MODE_SWITCH_STACK) { + } else if (mInputMode == SwipeMode.SWITCH_STACK) { scrollStacks(isUsingHorizontalLayout() ? amountY : amountX); } } @@ -257,14 +260,14 @@ float vx = velocityX; float vy = velocityY; - if (mInputMode == SWIPE_MODE_NONE) { + if (mInputMode == SwipeMode.NONE) { mInputMode = computeInputMode( time, x, y, vx * SWITCH_STACK_FLING_DT, vy * SWITCH_STACK_FLING_DT); } - if (mInputMode == SWIPE_MODE_SEND_TO_STACK) { + if (mInputMode == SwipeMode.SEND_TO_STACK) { mStacks.get(getTabStackIndex()).fling(time, x, y, vx, vy); - } else if (mInputMode == SWIPE_MODE_SWITCH_STACK) { + } else if (mInputMode == SwipeMode.SWITCH_STACK) { final float velocity = isUsingHorizontalLayout() ? vy : vx; final float origin = isUsingHorizontalLayout() ? y : x; final float max = isUsingHorizontalLayout() ? getHeight() : getWidth(); @@ -307,7 +310,7 @@ mClicked = false; finishScrollStacks(); mStacks.get(getTabStackIndex()).onUpOrCancel(time); - mInputMode = SWIPE_MODE_NONE; + mInputMode = SwipeMode.NONE; } private long time() { @@ -867,8 +870,8 @@ * @return The input mode to select. */ protected @SwipeMode int computeInputMode(long time, float x, float y, float dx, float dy) { - if (mStacks.size() == 0) return SWIPE_MODE_NONE; - if (mStacks.size() == 1) return SWIPE_MODE_SEND_TO_STACK; + if (mStacks.size() == 0) return SwipeMode.NONE; + if (mStacks.size() == 1) return SwipeMode.SEND_TO_STACK; int currentIndex = getTabStackIndex(); @@ -876,16 +879,16 @@ // next touch down. The deltas here are already verified by StackLayoutGestureHandler as // being above some threshold so that we know we're handling a drag or fling and not a long // press. - if (mDragDirection == DRAG_DIRECTION_NONE) { + if (mDragDirection == DragDirection.NONE) { if (Math.abs(dx) > Math.abs(dy)) { - mDragDirection = DRAG_DIRECTION_HORIZONTAL; + mDragDirection = DragDirection.HORIZONTAL; } else { - mDragDirection = DRAG_DIRECTION_VERTICAL; + mDragDirection = DragDirection.VERTICAL; } } - if ((mDragDirection == DRAG_DIRECTION_VERTICAL) ^ isUsingHorizontalLayout()) { - return SWIPE_MODE_SEND_TO_STACK; + if ((mDragDirection == DragDirection.VERTICAL) ^ isUsingHorizontalLayout()) { + return SwipeMode.SEND_TO_STACK; } float relativeX = mLastOnDownX - (x + dx); @@ -909,10 +912,10 @@ if ((onLeftmostStack && switchDelta < 0) || (onRightmostStack && switchDelta > 0)) { // Dragging in a direction the stack cannot switch. Pass the drag to the Stack, which // will treat it as intending to discard a tab. - return SWIPE_MODE_SEND_TO_STACK; + return SwipeMode.SEND_TO_STACK; } else { // Interpret the drag as intending to switch between tab stacks. - return SWIPE_MODE_SWITCH_STACK; + return SwipeMode.SWITCH_STACK; } } @@ -1471,23 +1474,23 @@ * @param p New value of the property */ @Override - public void setProperty(Property prop, float p) { + public void setProperty(@Property int prop, float p) { switch (prop) { - case STACK_SNAP: + case Property.STACK_SNAP: mRenderedScrollOffset = p; mScrollIndexOffset = p; break; - case INNER_MARGIN_PERCENT: + case Property.INNER_MARGIN_PERCENT: mInnerMarginPercent = p; break; - case STACK_OFFSET_Y_PERCENT: + case Property.STACK_OFFSET_Y_PERCENT: mStackOffsetYPercent = p; break; } } @Override - public void onPropertyAnimationFinished(Property prop) {} + public void onPropertyAnimationFinished(@Property int prop) {} /** * Called by the stacks whenever they start an animation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java index e377cd18..7101db0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/NonOverlappingStack.java
@@ -24,11 +24,12 @@ * The non-overlapping tab stack we use when the HorizontalTabSwitcherAndroid flag is enabled. */ public class NonOverlappingStack extends Stack { - @IntDef({SWITCH_DIRECTION_LEFT, SWITCH_DIRECTION_RIGHT}) + @IntDef({SwitchDirection.LEFT, SwitchDirection.RIGHT}) @Retention(RetentionPolicy.SOURCE) - public @interface SwitchDirection {} - public static final int SWITCH_DIRECTION_LEFT = 0; - public static final int SWITCH_DIRECTION_RIGHT = 1; + public @interface SwitchDirection { + int LEFT = 0; + int RIGHT = 1; + } /** * The scale the tabs should be shown at when there's exactly one tab open. @@ -411,7 +412,7 @@ StackTab tab = mStackTabs[i]; float endOffset; - if (direction == SWITCH_DIRECTION_LEFT) { + if (direction == SwitchDirection.LEFT) { endOffset = -SWITCH_ANIMATION_SPACING_MULTIPLE * mSpacing + tab.getScrollOffset(); } else { endOffset = SWITCH_ANIMATION_SPACING_MULTIPLE * mSpacing + tab.getScrollOffset(); @@ -465,7 +466,7 @@ StackTab tab = mStackTabs[i]; float startOffset; - if (direction == SWITCH_DIRECTION_LEFT) { + if (direction == SwitchDirection.LEFT) { startOffset = SWITCH_ANIMATION_SPACING_MULTIPLE * mSpacing + tab.getScrollOffset(); } else { startOffset = -SWITCH_ANIMATION_SPACING_MULTIPLE * mSpacing + tab.getScrollOffset();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java index b7fe58b..4d8b203 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/Stack.java
@@ -37,8 +37,12 @@ * * @VisibleForTesting */ -public abstract class Stack implements ChromeAnimation.Animatable<Stack.Property> { - enum Property { SCROLL_OFFSET } +public abstract class Stack implements ChromeAnimation.Animatable { + @IntDef({Property.SCROLL_OFFSET}) + @Retention(RetentionPolicy.SOURCE) + public @interface Property { + int SCROLL_OFFSET = 0; + } public static final int MAX_NUMBER_OF_STACKED_TABS_TOP = 3; public static final int MAX_NUMBER_OF_STACKED_TABS_BOTTOM = 3; @@ -2137,10 +2141,10 @@ } @Override - public void setProperty(Property prop, float val) { + public void setProperty(@Property int prop, float val) { if (prop == Property.SCROLL_OFFSET) setScrollTarget(val, true); } @Override - public void onPropertyAnimationFinished(Property prop) {} + public void onPropertyAnimationFinished(@Property int prop) {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java index 69b02af..09c51b0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimation.java
@@ -5,10 +5,6 @@ package org.chromium.chrome.browser.compositor.layouts.phone.stack; import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.addAnimation; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.MAX_CONTENT_HEIGHT; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.DISCARD_AMOUNT; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.SCALE; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.SCROLL_OFFSET; import android.support.annotation.IntDef; import android.view.animation.Interpolator; @@ -169,51 +165,39 @@ */ public ChromeAnimation<?> createAnimatorSetForType(@OverviewAnimationType int type, Stack stack, StackTab[] tabs, int focusIndex, int sourceIndex, int spacing, float discardRange) { - ChromeAnimation<?> set = null; - - if (tabs != null) { - switch (type) { - case OverviewAnimationType.ENTER_STACK: - set = createEnterStackAnimatorSet(tabs, focusIndex, spacing); - break; - case OverviewAnimationType.TAB_FOCUSED: - set = createTabFocusedAnimatorSet(tabs, focusIndex, spacing); - break; - case OverviewAnimationType.VIEW_MORE: - set = createViewMoreAnimatorSet(tabs, sourceIndex); - break; - case OverviewAnimationType.REACH_TOP: - set = createReachTopAnimatorSet(tabs); - break; - case OverviewAnimationType.DISCARD: - // Purposeful fall through - case OverviewAnimationType.DISCARD_ALL: - // Purposeful fall through - case OverviewAnimationType.UNDISCARD: - set = createUpdateDiscardAnimatorSet(stack, tabs, spacing, discardRange); - break; - case OverviewAnimationType.NEW_TAB_OPENED: - set = createNewTabOpenedAnimatorSet(tabs, focusIndex, discardRange); - break; - case OverviewAnimationType.START_PINCH: - set = createStartPinchAnimatorSet(tabs); - break; - case OverviewAnimationType.FULL_ROLL: - set = createFullRollAnimatorSet(tabs); - break; - case OverviewAnimationType.NONE: - break; - } + if (tabs == null) return null; + switch (type) { + case OverviewAnimationType.ENTER_STACK: + return createEnterStackAnimatorSet(tabs, focusIndex, spacing); + case OverviewAnimationType.TAB_FOCUSED: + return createTabFocusedAnimatorSet(tabs, focusIndex, spacing); + case OverviewAnimationType.VIEW_MORE: + return createViewMoreAnimatorSet(tabs, sourceIndex); + case OverviewAnimationType.REACH_TOP: + return createReachTopAnimatorSet(tabs); + case OverviewAnimationType.DISCARD: + // Purposeful fall through + case OverviewAnimationType.DISCARD_ALL: + // Purposeful fall through + case OverviewAnimationType.UNDISCARD: + return createUpdateDiscardAnimatorSet(stack, tabs, spacing, discardRange); + case OverviewAnimationType.NEW_TAB_OPENED: + return createNewTabOpenedAnimatorSet(tabs, focusIndex, discardRange); + case OverviewAnimationType.START_PINCH: + return createStartPinchAnimatorSet(tabs); + case OverviewAnimationType.FULL_ROLL: + return createFullRollAnimatorSet(tabs); + default: + return null; } - return set; } protected abstract float getScreenSizeInScrollDirection(); protected abstract float getScreenPositionInScrollDirection(StackTab tab); - protected abstract void addTiltScrollAnimation(ChromeAnimation<Animatable<?>> set, - LayoutTab tab, float end, int duration, int startTime); + protected abstract void addTiltScrollAnimation( + ChromeAnimation<Animatable> set, LayoutTab tab, float end, int duration, int startTime); // If this flag is enabled, we're using the non-overlapping tab switcher. protected boolean isHorizontalTabSwitcherFlagEnabled() { @@ -288,7 +272,7 @@ */ protected ChromeAnimation<?> createUpdateDiscardAnimatorSet( Stack stack, StackTab[] tabs, int spacing, float discardRange) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); int dyingTabsCount = 0; int firstDyingTabIndex = -1; @@ -327,17 +311,17 @@ float s = Math.copySign(1.0f, discard); long duration = (long) (DISCARD_ANIMATION_DURATION * (1.0f - Math.abs(discard / discardRange))); - addAnimation(set, tab, DISCARD_AMOUNT, discard, discardRange * s, duration, 0, - false, interpolator); + addAnimation(set, tab, StackTab.Property.DISCARD_AMOUNT, discard, discardRange * s, + duration, 0, false, interpolator); } else { if (tab.getDiscardAmount() != 0.f) { - addAnimation(set, tab, DISCARD_AMOUNT, tab.getDiscardAmount(), 0.0f, - UNDISCARD_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.DISCARD_AMOUNT, tab.getDiscardAmount(), + 0.0f, UNDISCARD_ANIMATION_DURATION, 0); } - addAnimation(set, tab, SCALE, tab.getScale(), mStack.getScaleAmount(), - DISCARD_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.SCALE, tab.getScale(), + mStack.getScaleAmount(), DISCARD_ANIMATION_DURATION, 0); - addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.MAX_CONTENT_HEIGHT, tab.getLayoutTab().getMaxContentHeight(), mStack.getMaxTabHeight(), DISCARD_ANIMATION_DURATION, 0); @@ -352,8 +336,8 @@ } else { float start = tab.getScrollOffset(); if (start != newScrollOffset) { - addAnimation(set, tab, SCROLL_OFFSET, start, newScrollOffset, - TAB_REORDER_DURATION, 0); + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, start, + newScrollOffset, TAB_REORDER_DURATION, 0); } } newIndex++; @@ -417,7 +401,7 @@ */ protected ChromeAnimation<?> createNewTabOpenedAnimatorSet( StackTab[] tabs, int focusIndex, float discardRange) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<>(); for (int i = 0; i < tabs.length; i++) { addAnimation(set, tabs[i], StackTab.Property.SCROLL_OFFSET, tabs[i].getScrollOffset(), @@ -437,7 +421,7 @@ * create the appropriate animation. */ protected ChromeAnimation<?> createStartPinchAnimatorSet(StackTab[] tabs) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); for (int i = 0; i < tabs.length; ++i) { addTiltScrollAnimation( @@ -456,7 +440,7 @@ * appropriate animation. */ protected ChromeAnimation<?> createFullRollAnimatorSet(StackTab[] tabs) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); for (int i = 0; i < tabs.length; ++i) { LayoutTab layoutTab = tabs[i].getLayoutTab();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java index ba9507a..a1b2e06 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationLandscape.java
@@ -5,18 +5,6 @@ package org.chromium.chrome.browser.compositor.layouts.phone.stack; import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.addAnimation; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.MAX_CONTENT_HEIGHT; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.SATURATION; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.SIDE_BORDER_SCALE; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.TILTY; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.TOOLBAR_ALPHA; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.TOOLBAR_Y_OFFSET; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.DISCARD_AMOUNT; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.SCALE; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.SCROLL_OFFSET; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.X_IN_STACK_INFLUENCE; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.X_IN_STACK_OFFSET; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.Y_IN_STACK_INFLUENCE; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable; @@ -38,7 +26,7 @@ @Override protected ChromeAnimation<?> createEnterStackAnimatorSet( StackTab[] tabs, int focusIndex, int spacing) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); final float initialScrollOffset = mStack.screenToScroll(0); for (int i = 0; i < tabs.length; ++i) { @@ -52,30 +40,30 @@ final float scrollOffset = mStack.screenToScroll(i * spacing); - addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.MAX_CONTENT_HEIGHT, tab.getLayoutTab().getUnclampedOriginalContentHeight(), mStack.getMaxTabHeight(), ENTER_STACK_ANIMATION_DURATION, 0); if (i < focusIndex) { - addAnimation(set, tab, SCROLL_OFFSET, initialScrollOffset, scrollOffset, - ENTER_STACK_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, initialScrollOffset, + scrollOffset, ENTER_STACK_ANIMATION_DURATION, 0); } else if (i > focusIndex) { tab.setScrollOffset(scrollOffset); - addAnimation(set, tab, X_IN_STACK_OFFSET, + addAnimation(set, tab, StackTab.Property.X_IN_STACK_OFFSET, (mWidth > mHeight && LocalizationUtils.isLayoutRtl()) ? -mWidth : mWidth, 0.0f, ENTER_STACK_ANIMATION_DURATION, 0); } else { tab.setScrollOffset(scrollOffset); - addAnimation(set, tab, X_IN_STACK_INFLUENCE, 0.0f, 1.0f, + addAnimation(set, tab, StackTab.Property.X_IN_STACK_INFLUENCE, 0.0f, 1.0f, ENTER_STACK_BORDER_ALPHA_DURATION, 0); - addAnimation(set, tab, SCALE, 1.0f, mStack.getScaleAmount(), + addAnimation(set, tab, StackTab.Property.SCALE, 1.0f, mStack.getScaleAmount(), ENTER_STACK_BORDER_ALPHA_DURATION, 0); - addAnimation(set, tab.getLayoutTab(), TOOLBAR_ALPHA, 1.f, 0.f, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_ALPHA, 1.f, 0.f, ENTER_STACK_TOOLBAR_ALPHA_DURATION, ENTER_STACK_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), TOOLBAR_Y_OFFSET, 0.f, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_Y_OFFSET, 0.f, getToolbarOffsetToLineUpWithBorder(), ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), SIDE_BORDER_SCALE, 0.f, 1.f, - ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.SIDE_BORDER_SCALE, 0.f, + 1.f, ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); } } @@ -85,18 +73,18 @@ @Override protected ChromeAnimation<?> createTabFocusedAnimatorSet( StackTab[] tabs, int focusIndex, int spacing) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); for (int i = 0; i < tabs.length; ++i) { StackTab tab = tabs[i]; LayoutTab layoutTab = tab.getLayoutTab(); addTiltScrollAnimation(set, layoutTab, 0.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); - addAnimation(set, tab, DISCARD_AMOUNT, tab.getDiscardAmount(), 0.0f, + addAnimation(set, tab, StackTab.Property.DISCARD_AMOUNT, tab.getDiscardAmount(), 0.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); if (i < focusIndex) { // For tabs left of the focused tab move them left to 0. - addAnimation(set, tab, SCROLL_OFFSET, tab.getScrollOffset(), + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, tab.getScrollOffset(), Math.max(0.0f, tab.getScrollOffset() - mWidth - spacing), TAB_FOCUSED_ANIMATION_DURATION, 0); } else if (i > focusIndex) { @@ -108,7 +96,7 @@ : mWidth - coveringTabPosition; float clampedDistanceToBorder = MathUtils.clamp(distanceToBorder, 0, mWidth); float delay = TAB_FOCUSED_MAX_DELAY * clampedDistanceToBorder / mWidth; - addAnimation(set, tab, X_IN_STACK_OFFSET, tab.getXInStackOffset(), + addAnimation(set, tab, StackTab.Property.X_IN_STACK_OFFSET, tab.getXInStackOffset(), tab.getXInStackOffset() + (LocalizationUtils.isLayoutRtl() ? -mWidth : mWidth), (TAB_FOCUSED_ANIMATION_DURATION - (long) delay), (long) delay); @@ -123,34 +111,35 @@ layoutTab.setBorderScale(1.f); if (!isHorizontalTabSwitcherFlagEnabled()) { - addAnimation(set, tab, SCROLL_OFFSET, tab.getScrollOffset(), + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, tab.getScrollOffset(), mStack.screenToScroll(0), TAB_FOCUSED_ANIMATION_DURATION, 0); } - addAnimation( - set, tab, SCALE, tab.getScale(), 1.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); - addAnimation(set, tab, X_IN_STACK_INFLUENCE, tab.getXInStackInfluence(), 0.0f, + addAnimation(set, tab, StackTab.Property.SCALE, tab.getScale(), 1.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); - addAnimation(set, tab, Y_IN_STACK_INFLUENCE, tab.getYInStackInfluence(), 0.0f, - TAB_FOCUSED_Y_STACK_DURATION, 0); + addAnimation(set, tab, StackTab.Property.X_IN_STACK_INFLUENCE, + tab.getXInStackInfluence(), 0.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.Y_IN_STACK_INFLUENCE, + tab.getYInStackInfluence(), 0.0f, TAB_FOCUSED_Y_STACK_DURATION, 0); - addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.MAX_CONTENT_HEIGHT, tab.getLayoutTab().getMaxContentHeight(), tab.getLayoutTab().getUnclampedOriginalContentHeight(), TAB_FOCUSED_ANIMATION_DURATION, 0); tab.setYOutOfStack(getStaticTabPosition()); if (layoutTab.shouldStall()) { - addAnimation(set, layoutTab, SATURATION, 1.0f, 0.0f, + addAnimation(set, layoutTab, LayoutTab.Property.SATURATION, 1.0f, 0.0f, TAB_FOCUSED_BORDER_ALPHA_DURATION, TAB_FOCUSED_BORDER_ALPHA_DELAY); } - addAnimation(set, tab.getLayoutTab(), TOOLBAR_ALPHA, layoutTab.getToolbarAlpha(), - 1.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), TOOLBAR_Y_OFFSET, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_ALPHA, + layoutTab.getToolbarAlpha(), 1.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, + TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_Y_OFFSET, getToolbarOffsetToLineUpWithBorder(), 0.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), SIDE_BORDER_SCALE, 1.f, 0.f, - TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.SIDE_BORDER_SCALE, 1.f, + 0.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); } } @@ -159,7 +148,7 @@ @Override protected ChromeAnimation<?> createViewMoreAnimatorSet(StackTab[] tabs, int selectedIndex) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); if (selectedIndex + 1 >= tabs.length) return set; @@ -169,7 +158,7 @@ * VIEW_MORE_SIZE_RATIO); offset = Math.max(VIEW_MORE_MIN_SIZE, offset); for (int i = selectedIndex + 1; i < tabs.length; ++i) { - addAnimation(set, tabs[i], SCROLL_OFFSET, tabs[i].getScrollOffset(), + addAnimation(set, tabs[i], StackTab.Property.SCROLL_OFFSET, tabs[i].getScrollOffset(), tabs[i].getScrollOffset() + offset, VIEW_MORE_ANIMATION_DURATION, 0); } @@ -178,14 +167,14 @@ @Override protected ChromeAnimation<?> createReachTopAnimatorSet(StackTab[] tabs) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); float screenTarget = 0.0f; for (int i = 0; i < tabs.length; ++i) { if (screenTarget >= tabs[i].getLayoutTab().getX()) { break; } - addAnimation(set, tabs[i], SCROLL_OFFSET, tabs[i].getScrollOffset(), + addAnimation(set, tabs[i], StackTab.Property.SCROLL_OFFSET, tabs[i].getScrollOffset(), mStack.screenToScroll(screenTarget), REACH_TOP_ANIMATION_DURATION, 0); screenTarget += tabs[i].getLayoutTab().getScaledContentWidth(); } @@ -210,9 +199,9 @@ } @Override - protected void addTiltScrollAnimation(ChromeAnimation<Animatable<?>> set, LayoutTab tab, - float end, int duration, int startTime) { - addAnimation(set, tab, TILTY, tab.getTiltY(), end, duration, startTime); + protected void addTiltScrollAnimation(ChromeAnimation<Animatable> set, LayoutTab tab, float end, + int duration, int startTime) { + addAnimation(set, tab, LayoutTab.Property.TILTY, tab.getTiltY(), end, duration, startTime); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java index 7c6d964..cd22ab2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackAnimationPortrait.java
@@ -5,17 +5,6 @@ package org.chromium.chrome.browser.compositor.layouts.phone.stack; import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.addAnimation; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.MAX_CONTENT_HEIGHT; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.SATURATION; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.SIDE_BORDER_SCALE; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.TILTX; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.TOOLBAR_ALPHA; -import static org.chromium.chrome.browser.compositor.layouts.components.LayoutTab.Property.TOOLBAR_Y_OFFSET; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.DISCARD_AMOUNT; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.SCALE; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.SCROLL_OFFSET; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.Y_IN_STACK_INFLUENCE; -import static org.chromium.chrome.browser.compositor.layouts.phone.stack.StackTab.Property.Y_IN_STACK_OFFSET; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation; import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable; @@ -37,7 +26,7 @@ @Override protected ChromeAnimation<?> createEnterStackAnimatorSet( StackTab[] tabs, int focusIndex, int spacing) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); final float initialScrollOffset = mStack.screenToScroll(0); float trailingScrollOffset = 0.f; @@ -63,31 +52,31 @@ if (i < focusIndex) { tab.getLayoutTab().setMaxContentHeight(mStack.getMaxTabHeight()); - addAnimation(set, tab, SCROLL_OFFSET, initialScrollOffset, scrollOffset, - ENTER_STACK_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, initialScrollOffset, + scrollOffset, ENTER_STACK_ANIMATION_DURATION, 0); } else if (i > focusIndex) { tab.getLayoutTab().setMaxContentHeight(mStack.getMaxTabHeight()); tab.setScrollOffset(scrollOffset + trailingScrollOffset); - addAnimation( - set, tab, Y_IN_STACK_OFFSET, mHeight, 0, ENTER_STACK_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.Y_IN_STACK_OFFSET, mHeight, 0, + ENTER_STACK_ANIMATION_DURATION, 0); } else { tab.setScrollOffset(scrollOffset); - addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.MAX_CONTENT_HEIGHT, tab.getLayoutTab().getUnclampedOriginalContentHeight(), mStack.getMaxTabHeight(), ENTER_STACK_ANIMATION_DURATION, ENTER_STACK_RESIZE_DELAY); - addAnimation(set, tab, Y_IN_STACK_INFLUENCE, 0.0f, 1.0f, + addAnimation(set, tab, StackTab.Property.Y_IN_STACK_INFLUENCE, 0.0f, 1.0f, ENTER_STACK_BORDER_ALPHA_DURATION, 0); - addAnimation(set, tab, SCALE, 1.0f, mStack.getScaleAmount(), + addAnimation(set, tab, StackTab.Property.SCALE, 1.0f, mStack.getScaleAmount(), ENTER_STACK_BORDER_ALPHA_DURATION, 0); - addAnimation(set, tab.getLayoutTab(), TOOLBAR_ALPHA, 1.f, 0.f, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_ALPHA, 1.f, 0.f, ENTER_STACK_BORDER_ALPHA_DURATION, ENTER_STACK_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), TOOLBAR_Y_OFFSET, 0.f, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_Y_OFFSET, 0.f, getToolbarOffsetToLineUpWithBorder(), ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), SIDE_BORDER_SCALE, 0.f, 1.f, - ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.SIDE_BORDER_SCALE, 0.f, + 1.f, ENTER_STACK_BORDER_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); tab.setYOutOfStack(getStaticTabPosition()); } @@ -99,18 +88,19 @@ @Override protected ChromeAnimation<?> createTabFocusedAnimatorSet( StackTab[] tabs, int focusIndex, int spacing) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); for (int i = 0; i < tabs.length; ++i) { StackTab tab = tabs[i]; LayoutTab layoutTab = tab.getLayoutTab(); - addTiltScrollAnimation(set, layoutTab, 0.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); - addAnimation(set, tab, DISCARD_AMOUNT, tab.getDiscardAmount(), 0.0f, + addTiltScrollAnimation( + set, layoutTab, 0.0f, StackAnimation.TAB_FOCUSED_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.DISCARD_AMOUNT, tab.getDiscardAmount(), 0.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); if (i < focusIndex) { // For tabs above the focused tab move them up to 0. - addAnimation(set, tab, SCROLL_OFFSET, tab.getScrollOffset(), + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, tab.getScrollOffset(), tab.getScrollOffset() - mHeight - spacing, TAB_FOCUSED_ANIMATION_DURATION, 0); } else if (i > focusIndex) { @@ -119,7 +109,7 @@ float coveringTabPosition = layoutTab.getY(); float distanceToBorder = MathUtils.clamp(mHeight - coveringTabPosition, 0, mHeight); float delay = TAB_FOCUSED_MAX_DELAY * distanceToBorder / mHeight; - addAnimation(set, tab, Y_IN_STACK_OFFSET, tab.getYInStackOffset(), + addAnimation(set, tab, StackTab.Property.Y_IN_STACK_OFFSET, tab.getYInStackOffset(), tab.getYInStackOffset() + mHeight, (TAB_FOCUSED_ANIMATION_DURATION - (long) delay), (long) delay); } else { @@ -131,29 +121,30 @@ tab.setYOutOfStack(0.0f); layoutTab.setBorderScale(1.f); - addAnimation(set, tab, SCROLL_OFFSET, tab.getScrollOffset(), + addAnimation(set, tab, StackTab.Property.SCROLL_OFFSET, tab.getScrollOffset(), Math.max(0.0f, tab.getScrollOffset() - mWidth - spacing), TAB_FOCUSED_ANIMATION_DURATION, 0); - addAnimation( - set, tab, SCALE, tab.getScale(), 1.0f, TAB_FOCUSED_ANIMATION_DURATION, 0); - addAnimation(set, tab, Y_IN_STACK_INFLUENCE, tab.getYInStackInfluence(), 0.0f, - TAB_FOCUSED_Y_STACK_DURATION, 0); - addAnimation(set, tab.getLayoutTab(), MAX_CONTENT_HEIGHT, + addAnimation(set, tab, StackTab.Property.SCALE, tab.getScale(), 1.0f, + TAB_FOCUSED_ANIMATION_DURATION, 0); + addAnimation(set, tab, StackTab.Property.Y_IN_STACK_INFLUENCE, + tab.getYInStackInfluence(), 0.0f, TAB_FOCUSED_Y_STACK_DURATION, 0); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.MAX_CONTENT_HEIGHT, tab.getLayoutTab().getMaxContentHeight(), tab.getLayoutTab().getUnclampedOriginalContentHeight(), TAB_FOCUSED_ANIMATION_DURATION, 0); tab.setYOutOfStack(getStaticTabPosition()); if (layoutTab.shouldStall()) { - addAnimation(set, layoutTab, SATURATION, 1.0f, 0.0f, + addAnimation(set, layoutTab, LayoutTab.Property.SATURATION, 1.0f, 0.0f, TAB_FOCUSED_BORDER_ALPHA_DURATION, TAB_FOCUSED_BORDER_ALPHA_DELAY); } - addAnimation(set, tab.getLayoutTab(), TOOLBAR_ALPHA, layoutTab.getToolbarAlpha(), - 1.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), TOOLBAR_Y_OFFSET, + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_ALPHA, + layoutTab.getToolbarAlpha(), 1.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, + TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.TOOLBAR_Y_OFFSET, getToolbarOffsetToLineUpWithBorder(), 0.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); - addAnimation(set, tab.getLayoutTab(), SIDE_BORDER_SCALE, 1.f, 0.f, - TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); + addAnimation(set, tab.getLayoutTab(), LayoutTab.Property.SIDE_BORDER_SCALE, 1.f, + 0.f, TAB_FOCUSED_TOOLBAR_ALPHA_DURATION, TAB_FOCUSED_TOOLBAR_ALPHA_DELAY); } } @@ -162,7 +153,7 @@ @Override protected ChromeAnimation<?> createViewMoreAnimatorSet(StackTab[] tabs, int selectedIndex) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); if (selectedIndex + 1 >= tabs.length) return set; @@ -172,7 +163,7 @@ * VIEW_MORE_SIZE_RATIO); offset = Math.max(VIEW_MORE_MIN_SIZE, offset); for (int i = selectedIndex + 1; i < tabs.length; ++i) { - addAnimation(set, tabs[i], SCROLL_OFFSET, tabs[i].getScrollOffset(), + addAnimation(set, tabs[i], StackTab.Property.SCROLL_OFFSET, tabs[i].getScrollOffset(), tabs[i].getScrollOffset() + offset, VIEW_MORE_ANIMATION_DURATION, 0); } @@ -181,14 +172,14 @@ @Override protected ChromeAnimation<?> createReachTopAnimatorSet(StackTab[] tabs) { - ChromeAnimation<Animatable<?>> set = new ChromeAnimation<Animatable<?>>(); + ChromeAnimation<Animatable> set = new ChromeAnimation<Animatable>(); float screenTarget = 0.0f; for (int i = 0; i < tabs.length; ++i) { if (screenTarget >= tabs[i].getLayoutTab().getY()) { break; } - addAnimation(set, tabs[i], SCROLL_OFFSET, tabs[i].getScrollOffset(), + addAnimation(set, tabs[i], StackTab.Property.SCROLL_OFFSET, tabs[i].getScrollOffset(), mStack.screenToScroll(screenTarget), REACH_TOP_ANIMATION_DURATION, 0); screenTarget += tabs[i].getLayoutTab().getScaledContentHeight(); } @@ -208,9 +199,9 @@ } @Override - protected void addTiltScrollAnimation(ChromeAnimation<Animatable<?>> set, LayoutTab tab, - float end, int duration, int startTime) { - addAnimation(set, tab, TILTX, tab.getTiltX(), end, duration, startTime); + protected void addTiltScrollAnimation(ChromeAnimation<Animatable> set, LayoutTab tab, float end, + int duration, int startTime) { + addAnimation(set, tab, LayoutTab.Property.TILTX, tab.getTiltX(), end, duration, startTime); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackTab.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackTab.java index f53c7e0..1631104 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/stack/StackTab.java
@@ -6,6 +6,7 @@ import android.content.Context; import android.content.res.Resources; +import android.support.annotation.IntDef; import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.animation.FloatProperty; @@ -13,27 +14,34 @@ import org.chromium.chrome.browser.compositor.layouts.Layout.Orientation; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * StackTab is used to keep track of a thumbnail's bitmap and position and to * draw itself onto the GL canvas at the desired Y Offset. * @VisibleForTesting */ -public class StackTab implements ChromeAnimation.Animatable<StackTab.Property> { +public class StackTab implements ChromeAnimation.Animatable { /** * Properties that can be animated by using a * {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable}. */ - enum Property { - SCALE, - SCROLL_OFFSET, - ALPHA, - X_IN_STACK_INFLUENCE, - X_IN_STACK_OFFSET, - X_OUT_OF_STACK, - Y_IN_STACK_INFLUENCE, - Y_IN_STACK_OFFSET, - Y_OUT_OF_STACK, - DISCARD_AMOUNT + @IntDef({Property.SCALE, Property.SCROLL_OFFSET, Property.ALPHA, Property.X_IN_STACK_INFLUENCE, + Property.X_IN_STACK_OFFSET, Property.X_OUT_OF_STACK, Property.Y_IN_STACK_INFLUENCE, + Property.Y_IN_STACK_OFFSET, Property.Y_OUT_OF_STACK, Property.DISCARD_AMOUNT}) + @Retention(RetentionPolicy.SOURCE) + public @interface Property { + int SCALE = 0; + int SCROLL_OFFSET = 1; + int ALPHA = 2; + int X_IN_STACK_INFLUENCE = 3; + int X_IN_STACK_OFFSET = 4; + int X_OUT_OF_STACK = 5; + int Y_IN_STACK_INFLUENCE = 6; + int Y_IN_STACK_OFFSET = 7; + int Y_OUT_OF_STACK = 8; + int DISCARD_AMOUNT = 9; } // Cached values from values/dimens.xml @@ -458,41 +466,41 @@ * @param val The value to set it to */ @Override - public void setProperty(Property prop, float val) { + public void setProperty(@Property int prop, float val) { switch (prop) { - case SCALE: + case Property.SCALE: setScale(val); break; - case SCROLL_OFFSET: + case Property.SCROLL_OFFSET: setScrollOffset(val); break; - case ALPHA: + case Property.ALPHA: setAlpha(val); break; - case X_IN_STACK_INFLUENCE: + case Property.X_IN_STACK_INFLUENCE: setXInStackInfluence(val); break; - case X_IN_STACK_OFFSET: + case Property.X_IN_STACK_OFFSET: setXInStackOffset(val); break; - case X_OUT_OF_STACK: + case Property.X_OUT_OF_STACK: setXOutOfStack(val); break; - case Y_IN_STACK_INFLUENCE: + case Property.Y_IN_STACK_INFLUENCE: setYInStackInfluence(val); break; - case Y_IN_STACK_OFFSET: + case Property.Y_IN_STACK_OFFSET: setYInStackOffset(val); break; - case Y_OUT_OF_STACK: + case Property.Y_OUT_OF_STACK: setYOutOfStack(val); break; - case DISCARD_AMOUNT: + case Property.DISCARD_AMOUNT: setDiscardAmount(val); break; } } @Override - public void onPropertyAnimationFinished(Property prop) {} + public void onPropertyAnimationFinished(@Property int prop) {} }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitor.java b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitor.java index e13f313..4beca6a5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitor.java
@@ -18,8 +18,6 @@ import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.ProfileSyncService.SyncStateChangedListener; import org.chromium.chrome.browser.util.AccessibilityUtil; -import org.chromium.components.sync.ModelType; -import org.chromium.components.sync.UploadState; /** * A monitor that is responsible for detecting changes to conditions required for contextual @@ -94,13 +92,11 @@ public static boolean getSettingsEnabled() { if (sSettingsEnabledForTesting) return true; - ProfileSyncService service = ProfileSyncService.get(); - - boolean isUploadToGoogleActive = - service.getUploadToGoogleState(ModelType.HISTORY_DELETE_DIRECTIVES) - == UploadState.ACTIVE; boolean isAccessibilityEnabled = AccessibilityUtil.isAccessibilityEnabled(); - return isUploadToGoogleActive && isDSEConditionMet() && !isAccessibilityEnabled + // TODO(twellington): Update to also accept personalized activity collection + // ("Activity and interactions"). + return ProfileSyncService.get().isUrlKeyedAnonymizedDataCollectionEnabled() + && isDSEConditionMet() && !isAccessibilityEnabled && !ContextualSuggestionsBridge.isDisabledByEnterprisePolicy(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java index 851962c..3dfb300 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
@@ -392,8 +392,8 @@ boolean canResolveActivity = resolvingInfos.size() > 0; String packageName = ContextUtils.getApplicationContext().getPackageName(); - // check whether the intent can be resolved. If not, we will see - // whether we can download it from the Market. + // Check whether the intent can be resolved. If not, we will see whether we can download it + // from the Market. if (!canResolveActivity) { if (hasBrowserFallbackUrl) { return clobberCurrentTabWithFallbackUrl(browserFallbackUrl, params); @@ -529,10 +529,19 @@ intent.removeExtra(InstantAppsHandler.IS_GOOGLE_SEARCH_REFERRER); } - try { - if (params.isIncognito() && !mDelegate.willChromeHandleIntent(intent)) { - // This intent may leave Chrome. Warn the user that incognito does not carry over - // to apps out side of Chrome. + boolean deviceCanHandleIntent = deviceCanHandleIntent(intent); + if (params.isIncognito() && !mDelegate.willChromeHandleIntent(intent)) { + // Assume the browser can handle it if there's no activity for this intent. + if (!deviceCanHandleIntent) { + if (DEBUG) { + Log.i(TAG, "NO_OVERRIDE: Not showing alert dialog with no handler for intent"); + } + return OverrideUrlLoadingResult.NO_OVERRIDE; + } + + // This intent may leave Chrome. Warn the user that incognito does not carry over + // to apps out side of Chrome. + try { if (!mDelegate.startIncognitoIntent(intent, params.getReferrerUrl(), hasBrowserFallbackUrl ? browserFallbackUrl : null, params.getTab(), params.shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent(), @@ -540,67 +549,73 @@ if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Failed to show incognito alert dialog."); return OverrideUrlLoadingResult.NO_OVERRIDE; } - if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_ASYNC_ACTION: Incognito navigation out"); - return OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION; - } - - // Some third-party app launched Chrome with an intent, and the URL got redirected. The - // user has explicitly chosen Chrome over other intent handlers, so stay in Chrome - // unless there was a new intent handler after redirection or Chrome cannot handle it - // any more. - // Custom tabs are an exception to this rule, since at no point, the user sees an intent - // picker and "picking Chrome" is handled inside the support library. - if (params.getRedirectHandler() != null && incomingIntentRedirect) { - if (!isExternalProtocol && !params.getRedirectHandler().isFromCustomTabIntent() - && !params.getRedirectHandler().hasNewResolver(intent)) { - if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Custom tab redirect no handled"); - return OverrideUrlLoadingResult.NO_OVERRIDE; - } - } - - // The intent can be used to launch Chrome itself, record the user - // gesture here so that it can be used later. - if (params.hasUserGesture()) { - IntentWithGesturesHandler.getInstance().onNewIntentWithGesture(intent); - } - - // If the only specialized intent handler is a WebAPK, set the intent's package to - // launch the WebAPK without showing the intent picker. - String targetWebApkPackageName = mDelegate.findWebApkPackageName(resolvingInfos); - - // We can't rely on this falling through to startActivityIfNeeded and behaving - // correctly for WebAPKs. This is because the target of the intent is the WebApk's main - // activity but that's just a bouncer which will redirect to WebApkActivity in chrome. - // To avoid bouncing indefinitely, don't override the navigation if we are currently - // showing the WebApk |params.webApkPackageName()| that we will redirect to. - if (targetWebApkPackageName != null - && targetWebApkPackageName.equals(params.nativeClientPackageName())) { - if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Navigation in WebApk"); + } catch (ActivityNotFoundException e) { + // The activity that we thought was going to handle the intent no longer exists, + // so catch the exception and assume Chrome can handle it. + Log.i(TAG, "NO_OVERRIDE: Not showing alert dialog with no handler for intent"); return OverrideUrlLoadingResult.NO_OVERRIDE; } + if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_ASYNC_ACTION: Incognito navigation out"); + return OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION; + } - if (targetWebApkPackageName != null - && mDelegate.countSpecializedHandlers(resolvingInfos) == 1) { - intent.setPackage(targetWebApkPackageName); - } - - // http://crbug.com/831806 : Stay in the CCT if the CCT is opened by WebAPK and the url - // is within the WebAPK scope. - if (shouldStayInWebappCCT(params, resolvingInfos)) { - if (DEBUG) - Log.i(TAG, "NO_OVERRIDE: Navigation in CCT within scope of parent webapp."); + // Some third-party app launched Chrome with an intent, and the URL got redirected. The + // user has explicitly chosen Chrome over other intent handlers, so stay in Chrome + // unless there was a new intent handler after redirection or Chrome cannot handle it + // any more. + // Custom tabs are an exception to this rule, since at no point, the user sees an intent + // picker and "picking Chrome" is handled inside the support library. + if (params.getRedirectHandler() != null && incomingIntentRedirect) { + if (!isExternalProtocol && !params.getRedirectHandler().isFromCustomTabIntent() + && !params.getRedirectHandler().hasNewResolver(intent)) { + if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Custom tab redirect no handled"); return OverrideUrlLoadingResult.NO_OVERRIDE; } + } - if (mDelegate.startActivityIfNeeded(intent, shouldProxyForInstantApps)) { + // The intent can be used to launch Chrome itself, record the user + // gesture here so that it can be used later. + if (params.hasUserGesture()) { + IntentWithGesturesHandler.getInstance().onNewIntentWithGesture(intent); + } + + // If the only specialized intent handler is a WebAPK, set the intent's package to + // launch the WebAPK without showing the intent picker. + String targetWebApkPackageName = mDelegate.findWebApkPackageName(resolvingInfos); + + // We can't rely on this falling through to startActivityIfNeeded and behaving + // correctly for WebAPKs. This is because the target of the intent is the WebApk's main + // activity but that's just a bouncer which will redirect to WebApkActivity in chrome. + // To avoid bouncing indefinitely, don't override the navigation if we are currently + // showing the WebApk |params.webApkPackageName()| that we will redirect to. + if (targetWebApkPackageName != null + && targetWebApkPackageName.equals(params.nativeClientPackageName())) { + if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Navigation in WebApk"); + return OverrideUrlLoadingResult.NO_OVERRIDE; + } + + if (targetWebApkPackageName != null + && mDelegate.countSpecializedHandlers(resolvingInfos) == 1) { + intent.setPackage(targetWebApkPackageName); + } + + // http://crbug.com/831806 : Stay in the CCT if the CCT is opened by WebAPK and the url + // is within the WebAPK scope. + if (shouldStayInWebappCCT(params, resolvingInfos)) { + if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Navigation in CCT within scope of parent webapp."); + return OverrideUrlLoadingResult.NO_OVERRIDE; + } + + try { + if (deviceCanHandleIntent + && mDelegate.startActivityIfNeeded(intent, shouldProxyForInstantApps)) { + // Assume the browser can handle it if there's no activity for this intent. if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_EXTERNAL_INTENT: startActivityIfNeeded"); return OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT; } - + } catch (ActivityNotFoundException e) { + if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Activity not found."); return OverrideUrlLoadingResult.NO_OVERRIDE; - } catch (ActivityNotFoundException ex) { - // Ignore the error. If no application can handle the URL, - // assume the browser can handle it. } return OverrideUrlLoadingResult.NO_OVERRIDE; @@ -612,40 +627,41 @@ */ private @OverrideUrlLoadingResult int sendIntentToMarket( String packageName, String marketReferrer, ExternalNavigationParams params) { - try { - Uri marketUri = new Uri.Builder() - .scheme("market") - .authority("details") - .appendQueryParameter(PLAY_PACKAGE_PARAM, packageName) - .appendQueryParameter(PLAY_REFERRER_PARAM, Uri.decode(marketReferrer)) - .build(); - Intent intent = new Intent(Intent.ACTION_VIEW, marketUri); - intent.addCategory(Intent.CATEGORY_BROWSABLE); - intent.setPackage("com.android.vending"); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - if (params.getReferrerUrl() != null) { - intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse(params.getReferrerUrl())); - } - if (params.isIncognito()) { - if (!mDelegate.startIncognitoIntent(intent, params.getReferrerUrl(), null, - params.getTab(), - params.shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent(), - false)) { - if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Failed to show incognito alert dialog."); - return OverrideUrlLoadingResult.NO_OVERRIDE; - } - if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_ASYNC_ACTION: Incognito intent to Play Store"); - return OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION; - } else { - mDelegate.startActivity(intent, false); - if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_EXTERNAL_INTENT: Intent to Play Store"); - return OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT; - } - } catch (ActivityNotFoundException ex) { - // ignore the error on devices that does not have Play Store installed. - if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Play Store not installed"); + Uri marketUri = + new Uri.Builder() + .scheme("market") + .authority("details") + .appendQueryParameter(PLAY_PACKAGE_PARAM, packageName) + .appendQueryParameter(PLAY_REFERRER_PARAM, Uri.decode(marketReferrer)) + .build(); + Intent intent = new Intent(Intent.ACTION_VIEW, marketUri); + intent.addCategory(Intent.CATEGORY_BROWSABLE); + intent.setPackage("com.android.vending"); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (params.getReferrerUrl() != null) { + intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse(params.getReferrerUrl())); + } + + if (!deviceCanHandleIntent(intent)) { + // Exit early if the Play Store isn't available. (https://crbug.com/820709) + if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Play Store not installed."); return OverrideUrlLoadingResult.NO_OVERRIDE; } + + if (params.isIncognito()) { + if (!mDelegate.startIncognitoIntent(intent, params.getReferrerUrl(), null, + params.getTab(), + params.shouldCloseContentsOnOverrideUrlLoadingAndLaunchIntent(), false)) { + if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Failed to show incognito alert dialog."); + return OverrideUrlLoadingResult.NO_OVERRIDE; + } + if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_ASYNC_ACTION: Incognito intent to Play Store."); + return OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION; + } else { + mDelegate.startActivity(intent, false); + if (DEBUG) Log.i(TAG, "OVERRIDE_WITH_EXTERNAL_INTENT: Intent to Play Store."); + return OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT; + } } /** @@ -764,4 +780,12 @@ .size() > 0; } + + /** + * Returns whether or not there's an activity available to handle the intent. + */ + private boolean deviceCanHandleIntent(Intent intent) { + List<ResolveInfo> resolveInfos = mDelegate.queryIntentActivities(intent); + return resolveInfos != null && resolveInfos.size() > 0; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index 7d215fb3..696384b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -79,9 +79,11 @@ import org.chromium.content_public.common.ContentSwitches; import org.chromium.printing.PrintDocumentAdapterWrapper; import org.chromium.printing.PrintingControllerImpl; +import org.chromium.ui.ContactsPickerListener; import org.chromium.ui.PhotoPickerListener; import org.chromium.ui.UiUtils; import org.chromium.ui.base.SelectFileDialog; +import org.chromium.ui.widget.Toast; import java.io.File; import java.util.ArrayList; @@ -229,6 +231,19 @@ }); } + if (ChromeFeatureList.isEnabled(ChromeFeatureList.NEW_CONTACTS_PICKER)) { + UiUtils.setContactsPickerDelegate(new UiUtils.ContactsPickerDelegate() { + @Override + public void showContactsPicker( + Context context, ContactsPickerListener listener, boolean allowMultiple) { + Toast.makeText(context, "Not implemented!", Toast.LENGTH_SHORT).show(); + } + + @Override + public void onContactsPickerDismissed() {} + }); + } + SearchWidgetProvider.initialize(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java index e66335e3..1c95ba66 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaButtonReceiver.java
@@ -24,6 +24,11 @@ @Override public void onReceive(Context context, Intent intent) { + if (intent == null || !Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()) + || !intent.hasExtra(Intent.EXTRA_KEY_EVENT)) { + Log.i(TAG, "Received unsupported intent: " + intent); + } + intent.setClass(context, getServiceClass()); Log.i(TAG, "Receive broadcast message, starting foreground service"); AppHooks.get().startForegroundService(intent);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialog.java index edbd9b9..c0f7f30 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialog.java
@@ -55,13 +55,13 @@ // PhotoPickerListener: @Override - public void onPickerUserAction(Action action, String[] photos) { + public void onPhotoPickerUserAction(Action action, String[] photos) { mExternalIntentSelected = false; if (action == Action.LAUNCH_GALLERY || action == Action.LAUNCH_CAMERA) { mExternalIntentSelected = true; } - mListener.onPickerUserAction(action, photos); + mListener.onPhotoPickerUserAction(action, photos); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java index 2c1118e..5c9b363 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java
@@ -424,7 +424,7 @@ * @param umaId The UMA value to record with the action. */ private void executeAction(PhotoPickerListener.Action action, String[] photos, int umaId) { - mListener.onPickerUserAction(action, photos); + mListener.onPhotoPickerUserAction(action, photos); mDialog.dismiss(); UiUtils.onPhotoPickerDismissed(); recordFinalUmaStats(umaId);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ContextualSuggestionsPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ContextualSuggestionsPreference.java index 6f5c16bd..12f03859 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ContextualSuggestionsPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ContextualSuggestionsPreference.java
@@ -10,16 +10,21 @@ import android.preference.PreferenceFragment; import android.support.annotation.Nullable; import android.text.SpannableString; +import android.text.style.ImageSpan; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.contextual_suggestions.ContextualSuggestionsBridge; import org.chromium.chrome.browser.contextual_suggestions.EnabledStateMonitor; import org.chromium.chrome.browser.signin.AccountSigninActivity; import org.chromium.chrome.browser.signin.SigninAccessPoint; +import org.chromium.chrome.browser.signin.SigninActivity; +import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.ui.SyncCustomizationFragment; import org.chromium.chrome.browser.util.IntentUtils; +import org.chromium.chrome.browser.widget.TintedDrawable; import org.chromium.components.signin.ChromeSigninController; import org.chromium.ui.text.NoUnderlineClickableSpan; import org.chromium.ui.text.SpanApplier; @@ -30,6 +35,8 @@ public class ContextualSuggestionsPreference extends PreferenceFragment implements EnabledStateMonitor.Observer { static final String PREF_CONTEXTUAL_SUGGESTIONS_SWITCH = "contextual_suggestions_switch"; + private static final String PREF_CONTEXTUAL_SUGGESTIONS_DESCRIPTION = + "contextual_suggestions_description"; private static final String PREF_CONTEXTUAL_SUGGESTIONS_MESSAGE = "contextual_suggestions_message"; @@ -73,23 +80,61 @@ /** Helper method to initialize the switch preference and the message preference. */ private void initialize() { + Context context = getActivity(); final TextMessagePreference message = (TextMessagePreference) findPreference(PREF_CONTEXTUAL_SUGGESTIONS_MESSAGE); - final NoUnderlineClickableSpan span = new NoUnderlineClickableSpan((widget) -> { - Context context = getActivity(); - if (ChromeSigninController.get().isSignedIn()) { - Intent intent = PreferencesLauncher.createIntentForSettingsPage( - context, SyncCustomizationFragment.class.getName()); - IntentUtils.safeStartActivity(context, intent); - } else { - startActivity(AccountSigninActivity.createIntentForDefaultSigninFlow( - context, SigninAccessPoint.SETTINGS, false)); - } - }); - final SpannableString spannable = SpanApplier.applySpans( - getResources().getString(R.string.contextual_suggestions_message), - new SpanApplier.SpanInfo("<link>", "</link>", span)); - message.setTitle(spannable); + + // Show a message prompting the user to turn on required settings. If unified consent is + // enabled, and the proper settings are already enabled, show nothing. + boolean isUnifiedConsentEnabled = + ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT); + if (!isUnifiedConsentEnabled + || !ProfileSyncService.get().isUrlKeyedAnonymizedDataCollectionEnabled()) { + final NoUnderlineClickableSpan span = new NoUnderlineClickableSpan((widget) -> { + if (isUnifiedConsentEnabled) { + if (ChromeSigninController.get().isSignedIn()) { + Intent intent = PreferencesLauncher.createIntentForSettingsPage( + context, SyncAndServicesPreferences.class.getName()); + IntentUtils.safeStartActivity(context, intent); + } else { + startActivity(SigninActivity.createIntentForPromoChooseAccountFlow( + context, SigninAccessPoint.SETTINGS, null)); + } + } else { + if (ChromeSigninController.get().isSignedIn()) { + Intent intent = PreferencesLauncher.createIntentForSettingsPage( + context, SyncCustomizationFragment.class.getName()); + IntentUtils.safeStartActivity(context, intent); + } else { + startActivity(AccountSigninActivity.createIntentForDefaultSigninFlow( + context, SigninAccessPoint.SETTINGS, false)); + } + } + }); + final SpannableString spannable = SpanApplier.applySpans( + getResources().getString(isUnifiedConsentEnabled + ? R.string.contextual_suggestions_message_unified_consent + : R.string.contextual_suggestions_message), + new SpanApplier.SpanInfo("<link>", "</link>", span)); + message.setTitle(spannable); + } + + final TextMessagePreference description = + (TextMessagePreference) findPreference(PREF_CONTEXTUAL_SUGGESTIONS_DESCRIPTION); + if (ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_BUTTON)) { + TintedDrawable drawable = TintedDrawable.constructTintedDrawable( + context, R.drawable.btn_star_filled, R.color.default_icon_color); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + final ImageSpan imageSpan = new ImageSpan(drawable); + final SpannableString imageSpannable = SpanApplier.applySpans( + getResources().getString( + R.string.contextual_suggestions_description_toolbar_button), + new SpanApplier.SpanInfo("<icon>", "</icon>", imageSpan)); + description.setTitle(imageSpannable); + } else { + description.setTitle( + getResources().getString(R.string.contextual_suggestions_description)); + } updateSwitch(); mSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java index e80300fe..bb20398 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java
@@ -12,7 +12,6 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.components.sync.ModelType; import org.chromium.components.sync.PassphraseType; -import org.chromium.components.sync.UploadState; import java.util.HashSet; import java.util.List; @@ -404,12 +403,10 @@ } /** - * @return Whether {@code modelType} is being uploaded to Google. This is useful for features - * that depend on user consent for uploading data (e.g. history) to Google. + * @return Whether URL-keyed anonymized data collection is enabled for the current profile. */ - @UploadState - public int getUploadToGoogleState(@ModelType int modelType) { - return nativeGetUploadToGoogleState(mNativeProfileSyncServiceAndroid, modelType); + public boolean isUrlKeyedAnonymizedDataCollectionEnabled() { + return nativeIsUrlKeyedAnonymizedDataCollectionEnabled(mNativeProfileSyncServiceAndroid); } /** @@ -578,8 +575,8 @@ private native boolean nativeIsSyncActive(long nativeProfileSyncServiceAndroid); private native boolean nativeHasKeepEverythingSynced(long nativeProfileSyncServiceAndroid); private native boolean nativeHasUnrecoverableError(long nativeProfileSyncServiceAndroid); - private native int nativeGetUploadToGoogleState( - long nativeProfileSyncServiceAndroid, int modelType); + private native boolean nativeIsUrlKeyedAnonymizedDataCollectionEnabled( + long nativeProfileSyncServiceAndroid); private native boolean nativeIsPassphrasePrompted(long nativeProfileSyncServiceAndroid); private native void nativeSetPassphrasePrompted(long nativeProfileSyncServiceAndroid, boolean prompted);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 17174a86..70dded223 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -1223,6 +1223,7 @@ long elapsedTime = SystemClock.elapsedRealtime() - activityCreationTimeMs; if (elapsedTime < RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS) { ThreadUtils.postOnUiThreadDelayed(() -> { + if (mActivity.isActivityFinishing()) return; onDeferredStartup(activityCreationTimeMs, activityName); }, RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS - elapsedTime); return;
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 f7960e8..29548c9 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
@@ -2771,7 +2771,11 @@ mExperimentalButton.setContentDescription( getContext().getResources().getString(contentDescriptionResId)); mExperimentalButton.setTint(mUseLightToolbarDrawables ? mLightModeTint : mDarkModeTint); - mExperimentalButton.setVisibility(View.VISIBLE); + if (mTabSwitcherState == STATIC_TAB) { + mExperimentalButton.setVisibility(View.VISIBLE); + } else { + mExperimentalButton.setVisibility(View.INVISIBLE); + } if (mLayoutUpdateHost != null) mLayoutUpdateHost.requestUpdate(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java index 29f55548..e58c3597 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
@@ -248,7 +248,7 @@ */ public static void cacheBottomToolbarEnabled() { ChromePreferenceManager.getInstance().setBottomToolbarEnabled( - ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_DUPLEX)); + ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_DUET)); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java index 4c461c0..94cb388 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java
@@ -332,6 +332,18 @@ return true; } + /** + * @param url An HTTP or HTTPS URL. + * @return The URL without path and query. + */ + public static String stripPath(String url) { + assert isHttpOrHttps(url); + Uri parsed = Uri.parse(url); + + return parsed.getScheme() + "://" + ((parsed.getHost() != null) ? parsed.getHost() : "") + + ((parsed.getPort() != -1) ? (":" + parsed.getPort()) : ""); + } + private static native boolean nativeIsDownloadable(String url); private static native boolean nativeIsValidForIntentFallbackNavigation(String url); private static native boolean nativeIsAcceptedScheme(String url);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java index 973ed85..e5e1eb8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrCoreVersionCheckerImpl.java
@@ -13,7 +13,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.PackageUtils; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.vr_shell.VrCoreInfo.GvrVersion; /** @@ -22,21 +21,10 @@ public class VrCoreVersionCheckerImpl implements VrCoreVersionChecker { private static final String TAG = "VrCoreVersionChecker"; - private static final String MIN_SDK_VERSION_PARAM_NAME = "min_sdk_version"; + private static final int MIN_SDK_VERSION = Build.VERSION_CODES.KITKAT; public VrCoreInfo getVrCoreInfo() { - int minSdkVersion = Build.VERSION_CODES.KITKAT; - // Supported Build version is determined by the webvr cardboard support feature. - // Default is KITKAT unless specified via server side finch config. - // Note that this may be called before native initialization, in which case the callsite - // must be aware that we're using the lowest supported build version and not the one that's - // set in the origin trial. - if (ChromeFeatureList.isInitialized()) { - minSdkVersion = ChromeFeatureList.getFieldTrialParamByFeatureAsInt( - ChromeFeatureList.WEBVR_CARDBOARD_SUPPORT, MIN_SDK_VERSION_PARAM_NAME, - Build.VERSION_CODES.KITKAT); - } - if (Build.VERSION.SDK_INT < minSdkVersion) { + if (Build.VERSION.SDK_INT < MIN_SDK_VERSION) { return new VrCoreInfo(null, VrCoreCompatibility.VR_NOT_SUPPORTED); } try {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java index f397048..1ff49fb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShell.java
@@ -15,7 +15,7 @@ /** * Performs native VrShell initialization. */ - void initializeNative(boolean forWebVr, boolean inCct, boolean isStandaloneVrDevice); + void initializeNative(boolean forWebVr, boolean isStandaloneVrDevice); /** * Pauses VrShell.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java index 80c8a6a..87d5114 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellDelegate.java
@@ -171,8 +171,6 @@ // headset on, but we haven't switched into VR mode yet. // See further documentation here: https://developers.google.com/vr/daydream/guides/vr-entry private boolean mDonSucceeded; - // Best effort whether or not the system was in VR when Chrome launched. - private Boolean mInVrAtChromeLaunch; private boolean mShowingDaydreamDoff; private boolean mShowingExitVrPrompt; private boolean mDoffOptional; @@ -183,7 +181,6 @@ private Boolean mShowVrServicesUpdatePrompt; private boolean mShowingDoffForGvrUpdate; private boolean mExitedDueToUnsupportedMode; - private boolean mExitingCct; private boolean mPaused; private boolean mStopped; private boolean mVisible; @@ -299,7 +296,6 @@ sInstance.mActivateFromHeadsetInsertion = sInstance.mMaybeActivateAfterHeadsetInsertion; if (sInstance.mPaused) { - if (sInstance.mInVrAtChromeLaunch == null) sInstance.mInVrAtChromeLaunch = false; if (activity instanceof ChromeTabbedActivity) { // We can special case singleInstance activities like CTA to avoid having to use // moveTaskToFront. Using moveTaskToFront prevents us from disabling window @@ -324,7 +320,6 @@ .moveTaskToFront(activity.getTaskId(), 0, options); } } else { - if (sInstance.mInVrAtChromeLaunch == null) sInstance.mInVrAtChromeLaunch = true; // If a WebVR app calls requestPresent in response to the displayactivate event // after the DON flow completes, the DON flow is skipped, meaning our app won't be // paused when daydream fires our BroadcastReceiver, so onResume won't be called. @@ -630,9 +625,6 @@ public static boolean activitySupportsVrBrowsing(Activity activity) { if (activity instanceof ChromeTabbedActivity) return true; - if (activity instanceof CustomTabActivity) { - return ChromeFeatureList.isEnabled(ChromeFeatureList.VR_BROWSING_IN_CUSTOM_TAB); - } return false; } @@ -1258,8 +1250,7 @@ if (!sRegisteredVrAssetsComponent) { registerVrAssetsComponentIfDaydreamUser(isDaydreamCurrentViewer()); } - mVrShell.initializeNative(webVrMode, mActivity instanceof CustomTabActivity, - getVrClassesWrapper().bootsToVr()); + mVrShell.initializeNative(webVrMode, getVrClassesWrapper().bootsToVr()); mVrShell.setWebVrModeEnabled(webVrMode); // We're entering VR, but not in WebVr mode. @@ -1301,7 +1292,6 @@ private void onVrIntent() { if (USE_HIDE_ANIMATION) mNeedsAnimationCancel = true; - mInVrAtChromeLaunch = true; assert !mInternalIntentUsedToStartVr; nativeRecordVrStartAction(mNativeVrShellDelegate, VrStartAction.INTENT_LAUNCH); @@ -1313,7 +1303,6 @@ // it's a reasonable assumption. mDonSucceeded = true; mEnterVrOnStartup = true; - mInVrAtChromeLaunch = true; nativeRecordVrStartAction(mNativeVrShellDelegate, VrStartAction.INTENT_LAUNCH); } @@ -1327,7 +1316,6 @@ // We assume that the user is already in VR mode when launched for auto-presentation. mDonSucceeded = true; - mInVrAtChromeLaunch = true; nativeRecordVrStartAction(mNativeVrShellDelegate, VrStartAction.DEEP_LINKED_APP); } @@ -1832,11 +1820,9 @@ } if (success) { - shutdownVr(true /* disableVrMode */, !mExitingCct /* stayingInChrome */); - if (mExitingCct) ((CustomTabActivity) mActivity).finishAndClose(false); + shutdownVr(true /* disableVrMode */, true /* stayingInChrome */); } - mExitingCct = false; callOnExitVrRequestListener(success); mShowingDoffForGvrUpdate = false; } @@ -1957,15 +1943,6 @@ } } - /* package */ void exitCctFromUi() { - CustomTabActivity customTabActivity = (CustomTabActivity) mActivity; - if (!isDaydreamCurrentViewer() || (mInVrAtChromeLaunch != null && mInVrAtChromeLaunch)) { - customTabActivity.finishAndClose(false); - return; - } - if (showDoff(true /* optional */)) mExitingCct = true; - } - /** * Returns the callback for the user-triggered close button to exit VR mode. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java index c239bc11..6424c93 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -340,7 +340,7 @@ @Override @TargetApi(Build.VERSION_CODES.N) - public void initializeNative(boolean forWebVr, boolean inCct, boolean isStandaloneVrDevice) { + public void initializeNative(boolean forWebVr, boolean isStandaloneVrDevice) { Tab tab = mActivity.getActivityTab(); if (mActivity.isInOverviewMode() || tab == null) { launchNTP(); @@ -383,7 +383,7 @@ || mActivity.getWindowAndroid().canRequestPermission( android.Manifest.permission.RECORD_AUDIO); boolean supportsRecognition = FeatureUtilities.isRecognitionIntentPresent(mActivity, false); - mNativeVrShell = nativeInit(mDelegate, forWebVr, inCct, !mVrBrowsingEnabled, + mNativeVrShell = nativeInit(mDelegate, forWebVr, !mVrBrowsingEnabled, hasOrCanRequestAudioPermission && supportsRecognition, getGvrApi().getNativeGvrContext(), mReprojectedRendering, displayWidthMeters, displayHeightMeters, dm.widthPixels, dm.heightPixels, pauseContent, lowDensity, @@ -577,12 +577,6 @@ }, UiUnsupportedMode.NEEDS_KEYBOARD_UPDATE); } - // Exits CCT, returning to the app that opened it. - @CalledByNative - public void exitCct() { - mDelegate.exitCctFromUi(); - } - // Close the current hosted Dialog in VR @CalledByNative public void closeCurrentDialog() { @@ -1253,7 +1247,7 @@ mUiActivityResultCallback = null; } - private native long nativeInit(VrShellDelegate delegate, boolean forWebVR, boolean inCct, + private native long nativeInit(VrShellDelegate delegate, boolean forWebVR, boolean browsingDisabled, boolean hasOrCanRequestAudioPermission, long gvrApi, boolean reprojectedRendering, float displayWidthMeters, float displayHeightMeters, int displayWidthPixels, int displayHeightPixels, boolean pauseContent,
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 746480e..1c7779de 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -585,10 +585,16 @@ Suggest related pages </message> <message name="IDS_CONTEXTUAL_SUGGESTIONS_DESCRIPTION" desc="Description of contextual suggestions, which tells the user what contextual suggestions does."> - When you scroll up, show quick links to related pages. + When you scroll up, show quick links to related pages. The URLs of pages you visit are sent to Google. + </message> + <message name="IDS_CONTEXTUAL_SUGGESTIONS_DESCRIPTION_TOOLBAR_BUTTON" desc="Description of contextual suggestions, which tells the user that when they tap the ‘More like this’ button they will be shown links to pages related to their current page. An icon will be inserted into the string after ‘More like this’. Please ensure ‘More like this’ in this message matches the ‘More like this’ toolbar button."> + When you tap More like this <ph name="ICON"><icon> </icon></ph> in the address bar, show quick links to related pages. The URLs of pages you visit are sent to Google. </message> <message name="IDS_CONTEXTUAL_SUGGESTIONS_MESSAGE" desc="Message of contextual suggestions settings, which tells the user how to opt in contextual suggestions."> - This feature uses <ph name="BEGIN_LINK"><link></ph>sync<ph name="END_LINK"></link></ph>. The URLs of pages you visit are sent to Google. + This feature uses <ph name="BEGIN_LINK"><link></ph>sync<ph name="END_LINK"></link></ph>. + </message> + <message name="IDS_CONTEXTUAL_SUGGESTIONS_MESSAGE_UNIFIED_CONSENT" desc="Message of contextual suggestions settings, which tells the user how to opt in contextual suggestions. Please ensure ‘Activity and interactions’ in this message matches the ‘Activity and interactions’ in sync settings."> + To use this feature, turn on <ph name="BEGIN_LINK"><link></ph>Activity and interactions<ph name="END_LINK"></link></ph>. </message> <!-- Homepage preferences -->
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java index 1633244..34ac90b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java
@@ -7,6 +7,7 @@ import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.createAnimation; import android.os.SystemClock; +import android.support.annotation.IntDef; import android.support.test.filters.SmallTest; import org.junit.Assert; @@ -18,20 +19,25 @@ import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * Unit tests for {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation}. */ @RunWith(ChromeJUnit4ClassRunner.class) -public class ChromeAnimationTest implements Animatable<ChromeAnimationTest.Property> { - protected enum Property { - FAST_ANIMATION, - SLOW_ANIMATION +public class ChromeAnimationTest implements Animatable { + @IntDef({Property.FAST_ANIMATION, Property.SLOW_ANIMATION}) + @Retention(RetentionPolicy.SOURCE) + public @interface Property { + int FAST_ANIMATION = 0; + int SLOW_ANIMATION = 1; } private static final long FAST_DURATION = 100; private static final long SLOW_DURATION = 1000; - private ChromeAnimation<Animatable<?>> mAnimations; + private ChromeAnimation<Animatable> mAnimations; private boolean mHasFinishedFastAnimation; private boolean mHasFinishedSlowAnimation; @@ -43,10 +49,10 @@ } @Override - public void setProperty(Property prop, float val) {} + public void setProperty(@Property int prop, float val) {} @Override - public void onPropertyAnimationFinished(Property prop) { + public void onPropertyAnimationFinished(@Property int prop) { if (prop == Property.FAST_ANIMATION) { mHasFinishedFastAnimation = true; } else if (prop == Property.SLOW_ANIMATION) { @@ -67,11 +73,10 @@ * @param duration The duration of the animation in ms * @param startTime The start time in ms */ - private <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop, - float start, float end, long duration, long startTime) { - ChromeAnimation.Animation<Animatable<?>> component = createAnimation( - object, prop, start, end, duration, startTime, false, - ChromeAnimation.getDecelerateInterpolator()); + private void addToAnimation( + Animatable object, int prop, float start, float end, long duration, long startTime) { + ChromeAnimation.Animation<Animatable> component = createAnimation(object, prop, start, end, + duration, startTime, false, ChromeAnimation.getDecelerateInterpolator()); addToAnimation(component); } @@ -79,7 +84,7 @@ * Appends an Animation to the current animation set and starts it immediately. If the set is * already finished or doesn't exist, the animation set is also started. */ - private void addToAnimation(ChromeAnimation.Animation<Animatable<?>> component) { + private void addToAnimation(ChromeAnimation.Animation<Animatable> component) { if (mAnimations == null || mAnimations.finished()) { mAnimations = new ChromeAnimation<>(); mAnimations.start();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsTest.java index 2b6645fc4..cfb22e4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/ContextualSuggestionsTest.java
@@ -73,6 +73,7 @@ import org.chromium.chrome.test.util.browser.RecyclerViewTestUtils; import org.chromium.chrome.test.util.browser.compositor.layouts.DisableChromeAnimations; import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.content.browser.test.util.Criteria; import org.chromium.content.browser.test.util.CriteriaHelper; import org.chromium.content.browser.test.util.TestWebContentsObserver; import org.chromium.content_public.browser.GestureListenerManager; @@ -798,6 +799,47 @@ () -> { return toolbarButton.getVisibility() == View.VISIBLE; }); } + @Test + @MediumTest + @Feature({"ContextualSuggestions"}) + @EnableFeatures(ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_BUTTON) + @DisableFeatures(ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_BOTTOM_SHEET) + public void testToolbarButton_ResponseInTabSwitcher() throws Exception { + View toolbarButton = getToolbarButton(); + + assertEquals( + "Toolbar button should be visible", View.VISIBLE, toolbarButton.getVisibility()); + + // Simulate suggestions being cleared. + ThreadUtils.runOnUiThreadBlocking(() -> mMediator.clearState()); + assertEquals("Toolbar button should be gone", View.GONE, toolbarButton.getVisibility()); + assertEquals("Suggestions should be cleared", 0, mModel.getClusterList().getItemCount()); + + // Enter tab switcher. + ThreadUtils.runOnUiThreadBlocking( + () -> { mActivityTestRule.getActivity().getLayoutManager().showOverview(false); }); + + // Simulate a new suggestions request. + ThreadUtils.runOnUiThreadBlocking( + () -> mMediator.requestSuggestions("https://www.google.com")); + CriteriaHelper.pollUiThread(new Criteria() { + @Override + public boolean isSatisfied() { + return mModel.getClusterList().getItemCount() + == FakeContextualSuggestionsSource.TOTAL_ITEM_COUNT; + } + }); + + assertEquals("Toolbar button should be invisible", View.INVISIBLE, + toolbarButton.getVisibility()); + + ThreadUtils.runOnUiThreadBlocking( + () -> { mActivityTestRule.getActivity().getLayoutManager().hideOverview(false); }); + + assertEquals( + "Toolbar button should be visible", View.VISIBLE, toolbarButton.getVisibility()); + } + private void forceShowSuggestions() throws InterruptedException, TimeoutException { assertEquals("Model has incorrect number of items.", (int) FakeContextualSuggestionsSource.TOTAL_ITEM_COUNT,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitorTest.java index d2695be..c55175f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextual_suggestions/EnabledStateMonitorTest.java
@@ -25,8 +25,6 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.ChromeModernDesign; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; -import org.chromium.components.sync.ModelType; -import org.chromium.components.sync.UploadState; import org.chromium.policy.test.annotations.Policies; import org.chromium.ui.test.util.UiRestriction; @@ -52,9 +50,8 @@ } @Override - @UploadState - public int getUploadToGoogleState(@ModelType int modelType) { - return UploadState.ACTIVE; + public boolean isUrlKeyedAnonymizedDataCollectionEnabled() { + return true; } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java index 8d5e1d7..62a1240 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
@@ -880,7 +880,7 @@ // IMDB app isn't installed. mDelegate.setCanResolveActivityForExternalSchemes(false); - // Will be redirected market since package is given. + // Will be redirected to market since package is given. checkUrl(INTENT_URL_WITH_JAVASCRIPT_FALLBACK_URL) .withReferrer(SEARCH_RESULT_URL_FOR_TOM_HANKS) .withIsIncognito(true) @@ -1408,6 +1408,48 @@ START_OTHER_ACTIVITY); } + @Test + @SmallTest + public void testMarketIntent_MarketInstalled() { + checkUrl("market://1234") + .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, + START_OTHER_ACTIVITY); + + Assert.assertNotNull(mDelegate.startActivityIntent); + Assert.assertTrue(mDelegate.startActivityIntent.getScheme().startsWith("market")); + } + + @Test + @SmallTest + public void testMarketIntent_MarketNotInstalled() { + mDelegate.setCanResolveActivityForMarket(false); + checkUrl("market://1234").expecting(OverrideUrlLoadingResult.NO_OVERRIDE, IGNORE); + + Assert.assertNull(mDelegate.startActivityIntent); + } + + @Test + @SmallTest + public void testMarketIntent_ShowDialogIncognitoMarketInstalled() { + checkUrl("market://1234") + .withIsIncognito(true) + .expecting(OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION, + START_INCOGNITO | START_OTHER_ACTIVITY); + + Assert.assertTrue(mDelegate.startIncognitoIntentCalled); + } + + @Test + @SmallTest + public void testMarketIntent_DontShowDialogIncognitoMarketNotInstalled() { + mDelegate.setCanResolveActivityForMarket(false); + checkUrl("market://1234") + .withIsIncognito(true) + .expecting(OverrideUrlLoadingResult.NO_OVERRIDE, IGNORE); + + Assert.assertFalse(mDelegate.startIncognitoIntentCalled); + } + private static ResolveInfo newResolveInfo(String packageName) { ActivityInfo ai = new ActivityInfo(); ai.packageName = packageName; @@ -1480,7 +1522,15 @@ list.add(newResolveInfo(intentActivity.packageName())); } } - if (list.isEmpty() && mCanResolveActivityForExternalSchemes) { + if (!list.isEmpty()) return list; + + String schemeString = intent.getData().getScheme(); + boolean isMarketScheme = schemeString != null && schemeString.startsWith("market"); + if (mCanResolveActivityForMarket && isMarketScheme) { + list.add(newResolveInfo("market")); + return list; + } + if (mCanResolveActivityForExternalSchemes && !isMarketScheme) { list.add(newResolveInfo(intent.getData().getScheme())); } return list; @@ -1643,6 +1693,10 @@ mCanResolveActivityForExternalSchemes = value; } + public void setCanResolveActivityForMarket(boolean value) { + mCanResolveActivityForMarket = value; + } + public String getNewUrlAfterClobbering() { return mNewUrlAfterClobbering; } @@ -1685,6 +1739,7 @@ private ArrayList<IntentActivity> mIntentActivities = new ArrayList<IntentActivity>(); private boolean mCanResolveActivityForExternalSchemes = true; + private boolean mCanResolveActivityForMarket = true; private String mNewUrlAfterClobbering; private String mReferrerUrlForClobbering; private boolean mCanHandleWithInstantApp;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java index c33f785..134146d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
@@ -99,7 +99,7 @@ // PhotoPickerDialog.PhotoPickerListener: @Override - public void onPickerUserAction(Action action, String[] photos) { + public void onPhotoPickerUserAction(Action action, String[] photos) { mLastActionRecorded = action; mLastSelectedPhotos = photos != null ? photos.clone() : null; if (mLastSelectedPhotos != null) Arrays.sort(mLastSelectedPhotos);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java index 2d0be7f4..b533de1a 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
@@ -97,7 +97,7 @@ @Config(manifest = Config.NONE, shadows = {CustomShadowAsyncTask.class}) @DisableFeatures({ChromeFeatureList.CONTENT_SUGGESTIONS_SCROLL_TO_LOAD, ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER, - ChromeFeatureList.SIMPLIFIED_NTP, ChromeFeatureList.CHROME_DUPLEX}) + ChromeFeatureList.SIMPLIFIED_NTP, ChromeFeatureList.CHROME_DUET}) public class NewTabPageAdapterTest { @Rule public DisableHistogramsRule mDisableHistogramsRule = new DisableHistogramsRule();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/util/UrlUtilitiesUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/util/UrlUtilitiesUnitTest.java index 4ba55e3..7b4106ff 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/util/UrlUtilitiesUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/util/UrlUtilitiesUnitTest.java
@@ -114,4 +114,14 @@ + "component=wump.noodle/Crumpet;i.pumpkinCount%%3D=42;" + "S.goat=⋚end")); } + + @Test + public void testStripPath() throws InterruptedException { + Assert.assertEquals("https://example.com:9000", + UrlUtilities.stripPath("https://user:pass@example.com:9000/path/#extra")); + Assert.assertEquals("http://awesome.example.com", + UrlUtilities.stripPath("http://awesome.example.com/?query")); + Assert.assertEquals("http://localhost", UrlUtilities.stripPath("http://localhost/")); + Assert.assertEquals("http://", UrlUtilities.stripPath("http:")); + } }
diff --git a/chrome/android/profiles/chrome-profile-3309-text.prof b/chrome/android/profiles/chrome-profile-3309-text.prof deleted file mode 120000 index c3b5d37..0000000 --- a/chrome/android/profiles/chrome-profile-3309-text.prof +++ /dev/null
@@ -1 +0,0 @@ -../../../../.cipd/pkgs/0/_current/chrome-profile-3309-text.prof \ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index f34c102..4e74c53 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -1813,6 +1813,12 @@ <message name="IDS_OOBE_EULA_ACCEPT_AND_CONTINUE_BUTTON_TEXT" desc="Label on a button on the Title of Terms of Service OOBE screen to accept EULA and continue."> Accept and continue </message> + <message name="IDS_OOBE_DEMO_SETUP_PREFERENCES_SCREEN_TITLE" desc="The title of the dialog that allows to choose demo setup preferences."> + Choose your demo preferences + </message> + <message name="IDS_OOBE_DEMO_SETUP_PREFERENCES_SCREEN_NEXT_BUTTON_LABEL" desc="The label of the button that is shown on preferences screen and that confirms chosen configuration and shows next demo setup screen."> + OK + </message> <message name="IDS_OOBE_DEMO_SETUP_PROGRESS_SCREEN_TITLE" desc="The title of the dialog that is shown when demo mode setup is in progress."> Starting demo mode </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index f4a3344e..4ea2f1e 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -627,8 +627,8 @@ "io_thread.h", "language/chrome_language_detection_tab_helper.cc", "language/chrome_language_detection_tab_helper.h", - "language/language_model_factory.cc", - "language/language_model_factory.h", + "language/language_model_manager_factory.cc", + "language/language_model_manager_factory.h", "language/url_language_histogram_factory.cc", "language/url_language_histogram_factory.h", "lifetime/application_lifetime.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index ee5f7d6d..189b25b 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1274,6 +1274,9 @@ {"enable-osk-overscroll", flag_descriptions::kEnableOskOverscrollName, flag_descriptions::kEnableOskOverscrollDescription, kOsAndroid, SINGLE_VALUE_TYPE(switches::kEnableOSKOverscroll)}, + {"enable-new-contacts-picker", flag_descriptions::kNewContactsPickerName, + flag_descriptions::kNewContactsPickerDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kNewContactsPicker)}, {"enable-new-photo-picker", flag_descriptions::kNewPhotoPickerName, flag_descriptions::kNewPhotoPickerDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kNewPhotoPicker)}, @@ -1896,9 +1899,9 @@ MULTI_VALUE_TYPE(kReaderModeHeuristicsChoices)}, #endif // OS_ANDROID #if defined(OS_ANDROID) - {"enable-chrome-duplex", flag_descriptions::kChromeDuplexName, - flag_descriptions::kChromeDuplexDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kChromeDuplexFeature)}, + {"enable-chrome-duet", flag_descriptions::kChromeDuetName, + flag_descriptions::kChromeDuetDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kChromeDuetFeature)}, {"chrome-home-swipe-logic", flag_descriptions::kChromeHomeSwipeLogicName, flag_descriptions::kChromeHomeSwipeLogicDescription, kOsAndroid, MULTI_VALUE_TYPE(kChromeHomeSwipeLogicChoices)}, @@ -2245,21 +2248,11 @@ FEATURE_WITH_PARAMS_VALUE_TYPE(features::kWebXrRenderPath, kWebXrRenderPathVariations, "WebXrRenderPath")}, - {"vr-web-input-editing", flag_descriptions::kVrWebInputEditingName, - flag_descriptions::kVrWebInputEditingDescription, kOsAndroid, - FEATURE_VALUE_TYPE(features::kVrWebInputEditing)}, - {"vr-browsing-experimental-features", - flag_descriptions::kVrBrowsingExperimentalFeaturesName, - flag_descriptions::kVrBrowsingExperimentalFeaturesDescription, kOsAndroid, - FEATURE_VALUE_TYPE(features::kVrBrowsingExperimentalFeatures)}, {"vr-browsing-experimental-rendering", flag_descriptions::kVrBrowsingExperimentalRenderingName, flag_descriptions::kVrBrowsingExperimentalRenderingDescription, kOsAndroid, FEATURE_VALUE_TYPE(features::kVrBrowsingExperimentalRendering)}, // TODO(crbug.com/731802): Only these should be #if defined(OS_ANDROID). - {"vr-browsing-in-custom-tab", flag_descriptions::kVrBrowsingInCustomTabName, - flag_descriptions::kVrBrowsingInCustomTabDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kVrBrowsingInCustomTab)}, {"vr-browsing-tabs-view", flag_descriptions::kVrBrowsingTabsViewName, flag_descriptions::kVrBrowsingTabsViewDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kVrBrowsingTabsView)},
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 96a525a..a97066ea 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -77,7 +77,7 @@ &kCCTParallelRequest, &kCCTPostMessageAPI, &kCCTRedirectPreconnect, - &kChromeDuplexFeature, + &kChromeDuetFeature, &kChromeHomeSwipeLogic, &kChromeHomeSwipeLogicVelocity, &kChromeSmartSelection, @@ -105,6 +105,7 @@ &kImprovedA2HS, &kLanguagesPreference, &kModalPermissionDialogView, + &kNewContactsPicker, &kNewPhotoPicker, &kNoCreditCardAbort, &kNTPButton, @@ -130,14 +131,12 @@ &kTrustedWebActivity, &kVideoPersistence, &kVrBrowsingFeedback, - &kVrBrowsingInCustomTab, &kVrBrowsingNativeAndroidUi, &payments::features::kReturnGooglePayInBasicCard, &payments::features::kWebPaymentsMethodSectionOrderV2, &payments::features::kWebPaymentsModifiers, &payments::features::kWebPaymentsSingleAppUiSkip, &kWebVrAutopresentFromIntent, - &kWebVrCardboardSupport, &media::kCafMediaRouterImpl, &ntp_snippets::kArticleSuggestionsExpandableHeader, &ntp_snippets::kIncreasedVisibility, @@ -208,8 +207,8 @@ const base::Feature kCCTRedirectPreconnect{"CCTRedirectPreconnect", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kChromeDuplexFeature{"ChromeDuplex", - base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kChromeDuetFeature{"ChromeDuet", + base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kChromeHomeSwipeLogic{"ChromeHomeSwipeLogic", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -303,6 +302,9 @@ const base::Feature kSearchEnginePromoNewDevice{ "SearchEnginePromo.NewDevice", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kNewContactsPicker{"NewContactsPicker", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kNewPhotoPicker{"NewPhotoPicker", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -377,9 +379,6 @@ const base::Feature kVrBrowsingFeedback{"VrBrowsingFeedback", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kVrBrowsingInCustomTab{"VrBrowsingInCustomTab", - base::FEATURE_DISABLED_BY_DEFAULT}; - const base::Feature kVrBrowsingNativeAndroidUi{ "VrBrowsingNativeAndroidUi", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -389,9 +388,6 @@ const base::Feature kWebVrAutopresentFromIntent{ "WebVrAutopresentFromIntent", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kWebVrCardboardSupport{"WebVrCardboardSupport", - base::FEATURE_ENABLED_BY_DEFAULT}; - static jboolean JNI_ChromeFeatureList_IsInitialized( JNIEnv* env, const JavaParamRef<jclass>& clazz) {
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index 7d4ee14a..5fc5905 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -24,7 +24,7 @@ extern const base::Feature kCCTParallelRequest; extern const base::Feature kCCTPostMessageAPI; extern const base::Feature kCCTRedirectPreconnect; -extern const base::Feature kChromeDuplexFeature; +extern const base::Feature kChromeDuetFeature; extern const base::Feature kChromeHomeSwipeLogic; extern const base::Feature kChromeHomeSwipeLogicVelocity; extern const base::Feature kChromeMemexFeature; @@ -54,6 +54,7 @@ extern const base::Feature kModalPermissionDialogView; extern const base::Feature kSearchEnginePromoExistingDevice; extern const base::Feature kSearchEnginePromoNewDevice; +extern const base::Feature kNewContactsPicker; extern const base::Feature kNewPhotoPicker; extern const base::Feature kNoCreditCardAbort; extern const base::Feature kNTPButton; @@ -79,11 +80,9 @@ extern const base::Feature kUserMediaScreenCapturing; extern const base::Feature kVideoPersistence; extern const base::Feature kVrBrowsingFeedback; -extern const base::Feature kVrBrowsingInCustomTab; extern const base::Feature kVrBrowsingNativeAndroidUi; extern const base::Feature kVrBrowsingTabsView; extern const base::Feature kWebVrAutopresentFromIntent; -extern const base::Feature kWebVrCardboardSupport; } // namespace android } // namespace chrome
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc index bd8c68e..a021858 100644 --- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc +++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/android/contextualsearch/contextual_search_field_trial.h" #include "chrome/browser/android/contextualsearch/resolved_search_term.h" #include "chrome/browser/android/proto/client_discourse_context.pb.h" -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/sync/profile_sync_service_factory.h" @@ -25,6 +25,7 @@ #include "chrome/common/pref_names.h" #include "components/browser_sync/profile_sync_service.h" #include "components/language/core/browser/language_model.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/prefs/pref_service.h" #include "components/search_engines/template_url_service.h" #include "components/variations/net/variations_http_headers.h" @@ -394,7 +395,8 @@ Profile* profile = ProfileManager::GetActiveUserProfile(); PrefService* pref_service = profile->GetPrefs(); language::LanguageModel* language_model = - LanguageModelFactory::GetForBrowserContext(profile); + LanguageModelManagerFactory::GetForBrowserContext(profile) + ->GetDefaultModel(); std::string result = TranslateService::GetTargetLanguage(pref_service, language_model); DCHECK(!result.empty());
diff --git a/chrome/browser/android/vr/vr_controller.cc b/chrome/browser/android/vr/vr_controller.cc index 58c3e75..97febf54 100644 --- a/chrome/browser/android/vr/vr_controller.cc +++ b/chrome/browser/android/vr/vr_controller.cc
@@ -26,6 +26,10 @@ constexpr float kFadeDistanceFromFace = 0.34f; constexpr float kDeltaAlpha = 3.0f; +// Small deadzone for testing that prevents the controller's head offset from +// being updated every frame on 3DOF devices. +constexpr float kHeadOffsetDeadzone = 0.0005f; + void ClampTouchpadPosition(gfx::Vector2dF* position) { position->set_x(base::ClampToRange(position->x(), 0.0f, 1.0f)); position->set_y(base::ClampToRange(position->y(), 0.0f, 1.0f)); @@ -294,12 +298,25 @@ return controller_state_->GetConnectionState() == gvr::kControllerConnected; } +void VrController::EnableDeadzoneForTesting() { + enable_deadzone_ = true; +} + void VrController::UpdateState(const gfx::Transform& head_pose) { gfx::Transform inv_pose; if (head_pose.GetInverse(&inv_pose)) { auto current_head_offset = gfx::Point3F(); inv_pose.TransformPoint(¤t_head_offset); - head_offset_ = current_head_offset; + // TODO(https://crbug.com/861807): Remove this once the controller can be + // dirty without necessarily affecting quiescence. + if (enable_deadzone_) { + if (head_offset_.SquaredDistanceTo(current_head_offset) > + kHeadOffsetDeadzone) { + head_offset_ = current_head_offset; + } + } else { + head_offset_ = current_head_offset; + } } gvr::Mat4f gvr_head_pose;
diff --git a/chrome/browser/android/vr/vr_controller.h b/chrome/browser/android/vr/vr_controller.h index 6146347b..6f94494 100644 --- a/chrome/browser/android/vr/vr_controller.h +++ b/chrome/browser/android/vr/vr_controller.h
@@ -78,6 +78,7 @@ bool ButtonState(gvr::ControllerButton button) const; bool IsConnected(); + void EnableDeadzoneForTesting(); // PlatformController bool IsButtonDown(PlatformController::ButtonType type) const override; @@ -136,6 +137,8 @@ float alpha_value_ = 1.0f; + bool enable_deadzone_ = false; + DISALLOW_COPY_AND_ASSIGN(VrController); };
diff --git a/chrome/browser/android/vr/vr_gl_thread.cc b/chrome/browser/android/vr/vr_gl_thread.cc index 8aa5e00..34284499 100644 --- a/chrome/browser/android/vr/vr_gl_thread.cc +++ b/chrome/browser/android/vr/vr_gl_thread.cc
@@ -312,12 +312,6 @@ FROM_HERE, base::BindOnce(&VrShell::OpenFeedback, weak_vr_shell_)); } -void VrGLThread::ExitCct() { - DCHECK(OnGlThread()); - main_thread_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&VrShell::ExitCct, weak_vr_shell_)); -} - void VrGLThread::CloseHostedDialog() { DCHECK(OnGlThread()); main_thread_task_runner_->PostTask(
diff --git a/chrome/browser/android/vr/vr_gl_thread.h b/chrome/browser/android/vr/vr_gl_thread.h index b7faebd1..127aef7 100644 --- a/chrome/browser/android/vr/vr_gl_thread.h +++ b/chrome/browser/android/vr/vr_gl_thread.h
@@ -104,7 +104,6 @@ void CloseAllTabs() override; void CloseAllIncognitoTabs() override; void OpenFeedback() override; - void ExitCct() override; void CloseHostedDialog() override; void OnUnsupportedMode(UiUnsupportedMode mode) override; void OnExitVrPromptResult(ExitVrPromptChoice choice,
diff --git a/chrome/browser/android/vr/vr_shell.cc b/chrome/browser/android/vr/vr_shell.cc index 44e90db..4f6f99da 100644 --- a/chrome/browser/android/vr/vr_shell.cc +++ b/chrome/browser/android/vr/vr_shell.cc
@@ -422,11 +422,6 @@ Java_VrShellImpl_openFeedback(env, j_vr_shell_); } -void VrShell::ExitCct() { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_VrShellImpl_exitCct(env, j_vr_shell_); -} - void VrShell::CloseHostedDialog() { JNIEnv* env = base::android::AttachCurrentThread(); Java_VrShellImpl_closeCurrentDialog(env, j_vr_shell_); @@ -1335,7 +1330,6 @@ const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& delegate, jboolean for_web_vr, - jboolean in_cct, jboolean browsing_disabled, jboolean has_or_can_request_audio_permission, jlong gvr_api, @@ -1349,7 +1343,6 @@ jboolean is_standalone_vr_device) { UiInitialState ui_initial_state; ui_initial_state.browsing_disabled = browsing_disabled; - ui_initial_state.in_cct = in_cct; ui_initial_state.in_web_vr = for_web_vr; ui_initial_state.has_or_can_request_audio_permission = has_or_can_request_audio_permission;
diff --git a/chrome/browser/android/vr/vr_shell.h b/chrome/browser/android/vr/vr_shell.h index 0ff7b61..1efb08d 100644 --- a/chrome/browser/android/vr/vr_shell.h +++ b/chrome/browser/android/vr/vr_shell.h
@@ -142,7 +142,6 @@ void CloseAllTabs(); void CloseAllIncognitoTabs(); void OpenFeedback(); - void ExitCct(); void CloseHostedDialog(); void ToggleCardboardGamepad(bool enabled); void ToggleGvrGamepad(bool enabled);
diff --git a/chrome/browser/android/vr/vr_shell_gl.cc b/chrome/browser/android/vr/vr_shell_gl.cc index 374729f..5fcb6614 100644 --- a/chrome/browser/android/vr/vr_shell_gl.cc +++ b/chrome/browser/android/vr/vr_shell_gl.cc
@@ -2588,6 +2588,12 @@ ui_test_state_ = std::make_unique<UiTestState>(); ui_test_state_->quiescence_timeout_ms = base::TimeDelta::FromMilliseconds(ui_expectation.quiescence_timeout_ms); + // The controller is pretty much perpetually dirty due to noise, even during + // tests, so we need to apply a deadzone to it. We can't apply this deadzone + // all the time since it results in grid-like pointer movement. + // TODO(https://crbug.com/861807): Remove this workaround once the controller + // can be dirty with affecting quiescence. + controller_->EnableDeadzoneForTesting(); } void VrShellGl::PerformControllerActionForTesting(
diff --git a/chrome/browser/background/background_application_list_model_unittest.cc b/chrome/browser/background/background_application_list_model_unittest.cc index e0e068f3..b3816d8 100644 --- a/chrome/browser/background/background_application_list_model_unittest.cc +++ b/chrome/browser/background/background_application_list_model_unittest.cc
@@ -127,8 +127,8 @@ scoped_refptr<Extension> temporary = CreateExtension(GenerateUniqueExtensionName(), true); extensions::PermissionsUpdater(service->profile()) - .AddPermissions(extension, - temporary->permissions_data()->active_permissions()); + .AddPermissionsForTesting( + *extension, temporary->permissions_data()->active_permissions()); } void RemoveBackgroundPermission(extensions::ExtensionService* service,
diff --git a/chrome/browser/chrome_browser_main_android.cc b/chrome/browser/chrome_browser_main_android.cc index a71265dc..6f63f97 100644 --- a/chrome/browser/chrome_browser_main_android.cc +++ b/chrome/browser/chrome_browser_main_android.cc
@@ -104,8 +104,8 @@ // Android specific MessageLoop. DCHECK(!main_message_loop_.get()); - // Create and start the MessageLoop if doesn't yet exist. - // This is a critical point in the startup process. + // Create the MessageLoop if doesn't yet exist (and bind it to the native Java + // loop). This is a critical point in the startup process. { TRACE_EVENT0("startup", "ChromeBrowserMainPartsAndroid::PreEarlyInitialization:CreateUiMsgLoop"); @@ -113,12 +113,6 @@ main_message_loop_ = std::make_unique<base::MessageLoopForUI>(); } - { - TRACE_EVENT0("startup", - "ChromeBrowserMainPartsAndroid::PreEarlyInitialization:StartUiMsgLoop"); - base::MessageLoopCurrentForUI::Get()->Start(); - } - // In order for SetLoadSecondaryLocalePaks() to work ResourceBundle must // not have been created yet. DCHECK(!ui::ResourceBundle::HasSharedInstance());
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 4fe1c95..9e20a27 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1036,6 +1036,10 @@ "login/screens/controller_pairing_screen_view.cc", "login/screens/controller_pairing_screen_view.h", "login/screens/core_oobe_view.h", + "login/screens/demo_preferences_screen.cc", + "login/screens/demo_preferences_screen.h", + "login/screens/demo_preferences_screen_view.cc", + "login/screens/demo_preferences_screen_view.h", "login/screens/demo_setup_screen.cc", "login/screens/demo_setup_screen.h", "login/screens/demo_setup_screen_view.cc",
diff --git a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc index 5df1f46..0a657c3 100644 --- a/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc +++ b/chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.cc
@@ -478,7 +478,6 @@ ArcBluetoothBridge::ArcBluetoothBridge(content::BrowserContext* context, ArcBridgeService* bridge_service) : arc_bridge_service_(bridge_service), weak_factory_(this) { - arc_bridge_service_->bluetooth()->SetHost(this); arc_bridge_service_->bluetooth()->AddObserver(this); app_observer_ = std::make_unique< @@ -520,6 +519,12 @@ if (!bluetooth_adapter_->HasObserver(this)) bluetooth_adapter_->AddObserver(this); + + // Once the bluetooth adapter is ready, we can now signal the container that + // the interface is ready to be interacted with. This avoids races in most + // methods, since it's undesirable to implement a retry mechanism for the + // cases when an inbound method is called and the adapter is not ready yet. + arc_bridge_service_->bluetooth()->SetHost(this); } void ArcBluetoothBridge::OnConnectionReady() {
diff --git a/chrome/browser/chromeos/login/oobe_screen.cc b/chrome/browser/chromeos/login/oobe_screen.cc index cb32c20a..e0bc132 100644 --- a/chrome/browser/chromeos/login/oobe_screen.cc +++ b/chrome/browser/chromeos/login/oobe_screen.cc
@@ -57,6 +57,7 @@ "test:nowindow", // SCREEN_TEST_NO_WINDOW "sync-consent", // SCREEN_SYNC_CONSENT "demo-setup", // SCREEN_OOBE_DEMO_SETUP + "demo-preferences", // SCREEN_OOBE_DEMO_PREFERENCES "recommend-apps", // SCREEN_RECOMMEND_APPS "unknown", // SCREEN_UNKNOWN };
diff --git a/chrome/browser/chromeos/login/oobe_screen.h b/chrome/browser/chromeos/login/oobe_screen.h index fc74346..73c64afd 100644 --- a/chrome/browser/chromeos/login/oobe_screen.h +++ b/chrome/browser/chromeos/login/oobe_screen.h
@@ -59,6 +59,7 @@ SCREEN_SYNC_CONSENT, SCREEN_OOBE_DEMO_SETUP, + SCREEN_OOBE_DEMO_PREFERENCES, SCREEN_RECOMMEND_APPS,
diff --git a/chrome/browser/chromeos/login/screens/demo_preferences_screen.cc b/chrome/browser/chromeos/login/screens/demo_preferences_screen.cc new file mode 100644 index 0000000..a0cae79 --- /dev/null +++ b/chrome/browser/chromeos/login/screens/demo_preferences_screen.cc
@@ -0,0 +1,58 @@ +// 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/screens/demo_preferences_screen.h" + +#include "base/logging.h" +#include "chrome/browser/chromeos/login/screens/base_screen_delegate.h" +#include "chrome/browser/chromeos/login/screens/demo_preferences_screen_view.h" + +namespace chromeos { + +constexpr char kUserActionContinue[] = "continue-setup"; +constexpr char kUserActionClose[] = "close-setup"; + +DemoPreferencesScreen::DemoPreferencesScreen( + BaseScreenDelegate* base_screen_delegate, + DemoPreferencesScreenView* view) + : BaseScreen(base_screen_delegate, + OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES), + view_(view) { + DCHECK(view_); + view_->Bind(this); +} + +DemoPreferencesScreen::~DemoPreferencesScreen() { + if (view_) + view_->Bind(nullptr); +} + +void DemoPreferencesScreen::Show() { + if (view_) + view_->Show(); +} + +void DemoPreferencesScreen::Hide() { + if (view_) + view_->Hide(); +} + +void DemoPreferencesScreen::OnUserAction(const std::string& action_id) { + if (action_id == kUserActionContinue) { + // TODO(agawronska): Add continue action. + NOTIMPLEMENTED(); + } else if (action_id == kUserActionClose) { + // TODO(agawronska): Add close action. + NOTIMPLEMENTED(); + } else { + BaseScreen::OnUserAction(action_id); + } +} + +void DemoPreferencesScreen::OnViewDestroyed(DemoPreferencesScreenView* view) { + if (view_ == view) + view_ = nullptr; +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/demo_preferences_screen.h b/chrome/browser/chromeos/login/screens/demo_preferences_screen.h new file mode 100644 index 0000000..e4826ea --- /dev/null +++ b/chrome/browser/chromeos/login/screens/demo_preferences_screen.h
@@ -0,0 +1,41 @@ +// 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_SCREENS_DEMO_PREFERENCES_SCREEN_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_PREFERENCES_SCREEN_H_ + +#include "base/macros.h" +#include "chrome/browser/chromeos/login/screens/base_screen.h" + +namespace chromeos { + +class BaseScreenDelegate; +class DemoPreferencesScreenView; + +// Controls demo mode preferences. The screen can be shown during OOBE. It +// allows user to choose preferences for retail demo mode. +class DemoPreferencesScreen : public BaseScreen { + public: + DemoPreferencesScreen(BaseScreenDelegate* base_screen_delegate, + DemoPreferencesScreenView* view); + ~DemoPreferencesScreen() override; + + // BaseScreen: + void Show() override; + void Hide() override; + void OnUserAction(const std::string& action_id) override; + + // Called when view is being destroyed. If Screen is destroyed earlier + // then it has to call Bind(nullptr). + void OnViewDestroyed(DemoPreferencesScreenView* view); + + private: + DemoPreferencesScreenView* view_; + + DISALLOW_COPY_AND_ASSIGN(DemoPreferencesScreen); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_PREFERENCES_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/screens/demo_preferences_screen_view.cc b/chrome/browser/chromeos/login/screens/demo_preferences_screen_view.cc new file mode 100644 index 0000000..7943f9d --- /dev/null +++ b/chrome/browser/chromeos/login/screens/demo_preferences_screen_view.cc
@@ -0,0 +1,11 @@ +// 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/screens/demo_preferences_screen_view.h" + +namespace chromeos { + +DemoPreferencesScreenView::~DemoPreferencesScreenView() = default; + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/demo_preferences_screen_view.h b/chrome/browser/chromeos/login/screens/demo_preferences_screen_view.h new file mode 100644 index 0000000..90f9719 --- /dev/null +++ b/chrome/browser/chromeos/login/screens/demo_preferences_screen_view.h
@@ -0,0 +1,34 @@ +// 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_SCREENS_DEMO_PREFERENCES_SCREEN_VIEW_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_PREFERENCES_SCREEN_VIEW_H_ + +#include "chrome/browser/chromeos/login/oobe_screen.h" + +namespace chromeos { + +class DemoPreferencesScreen; + +// Interface of the demo mode preferences screen view. +class DemoPreferencesScreenView { + public: + constexpr static OobeScreen kScreenId = + OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES; + + virtual ~DemoPreferencesScreenView(); + + // Shows the contents of the screen. + virtual void Show() = 0; + + // Hides the contents of the screen. + virtual void Hide() = 0; + + // Sets view and screen. + virtual void Bind(DemoPreferencesScreen* screen) = 0; +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_PREFERENCES_SCREEN_VIEW_H_
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 7b34418f..742f478 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -38,6 +38,7 @@ #include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/login/hwid_checker.h" #include "chrome/browser/chromeos/login/screens/arc_terms_of_service_screen.h" +#include "chrome/browser/chromeos/login/screens/demo_preferences_screen.h" #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h" #include "chrome/browser/chromeos/login/screens/device_disabled_screen.h" #include "chrome/browser/chromeos/login/screens/enable_debugging_screen.h" @@ -395,6 +396,9 @@ } else if (screen == OobeScreen::SCREEN_OOBE_DEMO_SETUP) { return new chromeos::DemoSetupScreen(this, oobe_ui_->GetDemoSetupScreenView()); + } else if (screen == OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES) { + return new chromeos::DemoPreferencesScreen( + this, oobe_ui_->GetDemoPreferencesScreenView()); } else if (screen == OobeScreen::SCREEN_OOBE_ENABLE_DEBUGGING) { return new EnableDebuggingScreen(this, oobe_ui_->GetEnableDebuggingScreenView()); @@ -538,6 +542,12 @@ StartEnrollmentScreen(false); } +void WizardController::ShowDemoModePreferencesScreen() { + VLOG(1) << "Showing demo mode preferences screen."; + UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES); + SetCurrentScreen(GetScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES)); +} + void WizardController::ShowDemoModeSetupScreen() { VLOG(1) << "Showing demo mode setup screen."; UpdateStatusAreaVisibilityForScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP); @@ -1209,6 +1219,8 @@ ShowEnrollmentScreen(); } else if (screen == OobeScreen::SCREEN_OOBE_DEMO_SETUP) { ShowDemoModeSetupScreen(); + } else if (screen == OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES) { + ShowDemoModePreferencesScreen(); } else if (screen == OobeScreen::SCREEN_TERMS_OF_SERVICE) { ShowTermsOfServiceScreen(); } else if (screen == OobeScreen::SCREEN_SYNC_CONSENT) {
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h index 5d5a102..de9eda0 100644 --- a/chrome/browser/chromeos/login/wizard_controller.h +++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -144,6 +144,7 @@ void ShowEulaScreen(); void ShowEnrollmentScreen(); void ShowDemoModeSetupScreen(); + void ShowDemoModePreferencesScreen(); void ShowResetScreen(); void ShowKioskAutolaunchScreen(); void ShowEnableDebuggingScreen();
diff --git a/chrome/browser/domain_reliability/OWNERS b/chrome/browser/domain_reliability/OWNERS index e4636cb..fbb1c69 100644 --- a/chrome/browser/domain_reliability/OWNERS +++ b/chrome/browser/domain_reliability/OWNERS
@@ -1,5 +1,4 @@ davidben@chromium.org mmenke@chromium.org -juliatuttle@chromium.org # COMPONENT: Internals>Network
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc index 22c00c0..0a2368e6 100644 --- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc +++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -24,7 +24,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate.h" #include "chrome/browser/extensions/api/language_settings_private/language_settings_private_delegate_factory.h" -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/spellchecker/spellcheck_factory.h" #include "chrome/browser/spellchecker/spellcheck_service.h" @@ -32,7 +32,7 @@ #include "chrome/browser/translate/translate_service.h" #include "chrome/common/extensions/api/language_settings_private.h" #include "chrome/common/pref_names.h" -#include "components/language/core/browser/language_model.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/language/core/common/locale_util.h" #include "components/spellcheck/common/spellcheck_common.h" #include "components/translate/core/browser/translate_download_manager.h" @@ -531,7 +531,8 @@ LanguageSettingsPrivateGetTranslateTargetLanguageFunction::Run() { Profile* profile = chrome_details_.GetProfile(); language::LanguageModel* language_model = - LanguageModelFactory::GetForBrowserContext(profile); + LanguageModelManagerFactory::GetForBrowserContext(profile) + ->GetDefaultModel(); return RespondNow(OneArgument( std::make_unique<base::Value>(TranslateService::GetTargetLanguage( profile->GetPrefs(), language_model))));
diff --git a/chrome/browser/extensions/api/permissions/permissions_api.cc b/chrome/browser/extensions/api/permissions/permissions_api.cc index 1e86446..f471d5a 100644 --- a/chrome/browser/extensions/api/permissions/permissions_api.cc +++ b/chrome/browser/extensions/api/permissions/permissions_api.cc
@@ -122,8 +122,8 @@ *permissions, extension()->permissions_data()->active_permissions()); PermissionsUpdater(browser_context()) - .RemovePermissions(extension(), *permissions, - PermissionsUpdater::REMOVE_SOFT); + .RevokeOptionalPermissions(*extension(), *permissions, + PermissionsUpdater::REMOVE_SOFT); return RespondNow( ArgumentList(api::permissions::Remove::Results::Create(true))); } @@ -197,7 +197,8 @@ ->GetGrantedPermissions(extension()->id()); if (granted.get() && granted->Contains(*requested_permissions_)) { PermissionsUpdater perms_updater(browser_context()); - perms_updater.AddPermissions(extension(), *requested_permissions_); + perms_updater.GrantOptionalPermissions(*extension(), + *requested_permissions_); return RespondNow( ArgumentList(api::permissions::Request::Results::Create(true))); } @@ -255,7 +256,8 @@ bool granted = result == ExtensionInstallPrompt::Result::ACCEPTED; if (granted) { PermissionsUpdater perms_updater(browser_context()); - perms_updater.AddPermissions(extension(), *requested_permissions_); + perms_updater.GrantOptionalPermissions(*extension(), + *requested_permissions_); } Respond(ArgumentList(api::permissions::Request::Results::Create(granted)));
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index b6c651f..d7879c6 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -619,7 +619,8 @@ const PermissionSet& all_optional_permissions = PermissionsParser::GetOptionalPermissions(extension); PermissionsUpdater perms_updater(profile()); - perms_updater.AddPermissions(extension, all_optional_permissions); + perms_updater.GrantOptionalPermissions(*extension, + all_optional_permissions); } testing::AssertionResult IsBlocked(const std::string& id) {
diff --git a/chrome/browser/extensions/permission_messages_unittest.cc b/chrome/browser/extensions/permission_messages_unittest.cc index 8701323..2ef1f6d 100644 --- a/chrome/browser/extensions/permission_messages_unittest.cc +++ b/chrome/browser/extensions/permission_messages_unittest.cc
@@ -80,8 +80,8 @@ void GrantOptionalPermissions() { PermissionsUpdater perms_updater(env_.profile()); - perms_updater.AddPermissions( - app_.get(), PermissionsParser::GetOptionalPermissions(app_.get())); + perms_updater.GrantOptionalPermissions( + *app_, PermissionsParser::GetOptionalPermissions(app_.get())); } std::vector<base::string16> active_permissions() {
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc index 261f16ba..00e1732 100644 --- a/chrome/browser/extensions/permissions_updater.cc +++ b/chrome/browser/extensions/permissions_updater.cc
@@ -93,65 +93,72 @@ g_delegate = delegate; } -void PermissionsUpdater::AddPermissions(const Extension* extension, - const PermissionSet& permissions) { - const PermissionSet& active = - extension->permissions_data()->active_permissions(); - std::unique_ptr<const PermissionSet> total = - PermissionSet::CreateUnion(active, permissions); - std::unique_ptr<const PermissionSet> added = - PermissionSet::CreateDifference(*total, active); +void PermissionsUpdater::GrantOptionalPermissions( + const Extension& extension, + const PermissionSet& permissions) { + // TODO(devlin): Ideally, we'd have this CHECK in place, but unit tests are + // currently violating it. + // CHECK(PermissionsParser::GetOptionalPermissions(&extension).Contains( + // permissions)) + // << "Cannot add optional permissions that are not " + // << "specified in the manifest."; - std::unique_ptr<const PermissionSet> new_withheld = - PermissionSet::CreateDifference( - extension->permissions_data()->withheld_permissions(), permissions); - SetPermissions(extension, std::move(total), std::move(new_withheld)); - - // Update the granted permissions so we don't auto-disable the extension. - GrantActivePermissions(extension); - - // Also add the new permissions to the set of runtime granted permissions. - // Note: we only add the permissions that were added here, as opposed to - // GrantActivePermissions(), which grants all active permissions. - ExtensionPrefs::Get(browser_context_) - ->AddRuntimeGrantedPermissions(extension->id(), permissions); - - NotifyPermissionsUpdated(ADDED, extension, *added); + // Granted optional permissions are stored in both the granted permissions (so + // we don't later disable the extension when we check the active permissions + // against the granted set to determine if there's a permissions increase) and + // the granted runtime permissions (so they don't get withheld with runtime + // host permissions enabled). + constexpr int permissions_store_mask = + kGrantedPermissions | kRuntimeGrantedPermissions; + AddPermissionsImpl(extension, permissions, permissions_store_mask); } -void PermissionsUpdater::RemovePermissions(const Extension* extension, - const PermissionSet& to_remove, - RemoveType remove_type) { - // We should only be revoking revokable permissions. - CHECK(GetRevokablePermissions(extension)->Contains(to_remove)); +void PermissionsUpdater::GrantRuntimePermissions( + const Extension& extension, + const PermissionSet& permissions) { + CHECK(extension.permissions_data()->withheld_permissions().Contains( + permissions)) + << "Cannot add runtime granted permissions that were not withheld."; - const PermissionSet& active = - extension->permissions_data()->active_permissions(); - std::unique_ptr<const PermissionSet> remaining = - PermissionSet::CreateDifference(active, to_remove); + // Adding runtime granted permissions does not add permissions to the + // granted permissions store, so that behavior taken with the runtime host + // permissions feature is confined to when the experiment is enabled. + constexpr int permissions_store_mask = kRuntimeGrantedPermissions; + AddPermissionsImpl(extension, permissions, permissions_store_mask); +} - // Move any granted permissions that were in the withheld set back to the - // withheld set so they can be added back later. - // Any revoked permission that isn't from the optional permissions can only - // be a withheld permission. - std::unique_ptr<const PermissionSet> removed_withheld = - PermissionSet::CreateDifference( - to_remove, PermissionsParser::GetOptionalPermissions(extension)); - std::unique_ptr<const PermissionSet> withheld = PermissionSet::CreateUnion( - *removed_withheld, extension->permissions_data()->withheld_permissions()); +void PermissionsUpdater::RevokeOptionalPermissions( + const Extension& extension, + const PermissionSet& permissions, + RemoveType remove_type) { + // TODO(devlin): Ideally, we'd have this CHECK in place, but unit tests are + // currently violating it. + // CHECK(PermissionsParser::GetOptionalPermissions(&extension).Contains( + // permissions)) + // << "Cannot remove optional permissions that are not " + // << "specified in the manifest."; - SetPermissions(extension, std::move(remaining), std::move(withheld)); + // Revoked optional permissions are removed from granted and runtime-granted + // permissions only if the user, and not the extension, removed them. This + // allows the extension to add them again without prompting the user. + int permissions_store_mask = kNone; + if (remove_type == REMOVE_HARD) + permissions_store_mask = kGrantedPermissions | kRuntimeGrantedPermissions; + RemovePermissionsImpl(extension, permissions, permissions_store_mask); +} - // We might not want to revoke the granted permissions because the extension, - // not the user, removed the permissions. This allows the extension to add - // them again without prompting the user. - if (remove_type == REMOVE_HARD) { - ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context_); - prefs->RemoveGrantedPermissions(extension->id(), to_remove); - prefs->RemoveRuntimeGrantedPermissions(extension->id(), to_remove); - } +void PermissionsUpdater::RevokeRuntimePermissions( + const Extension& extension, + const PermissionSet& permissions) { + CHECK(GetRevokablePermissions(&extension)->Contains(permissions)) + << "Cannot remove non-revokable permissions."; - NotifyPermissionsUpdated(REMOVED, extension, to_remove); + // Removing runtime-granted permissions does not remove permissions from + // the granted permissions store. This is done to ensure behavior taken with + // the runtime host permissions feature is confined to when the experiment is + // enabled. + constexpr int permissions_store_mask = kRuntimeGrantedPermissions; + RemovePermissionsImpl(extension, permissions, permissions_store_mask); } void PermissionsUpdater::SetPolicyHostRestrictions( @@ -273,6 +280,12 @@ std::move(withheld_permissions)); } +void PermissionsUpdater::AddPermissionsForTesting( + const Extension& extension, + const PermissionSet& permissions) { + AddPermissionsImpl(extension, permissions, kNone); +} + void PermissionsUpdater::SetPermissions( const Extension* extension, std::unique_ptr<const PermissionSet> active, @@ -401,4 +414,68 @@ } } +void PermissionsUpdater::AddPermissionsImpl(const Extension& extension, + const PermissionSet& permissions, + int permissions_store_mask) { + const PermissionSet& active = + extension.permissions_data()->active_permissions(); + std::unique_ptr<const PermissionSet> total = + PermissionSet::CreateUnion(active, permissions); + std::unique_ptr<const PermissionSet> added = + PermissionSet::CreateDifference(*total, active); + + std::unique_ptr<const PermissionSet> new_withheld = + PermissionSet::CreateDifference( + extension.permissions_data()->withheld_permissions(), permissions); + SetPermissions(&extension, std::move(total), std::move(new_withheld)); + + if ((permissions_store_mask & kGrantedPermissions) != 0) { + // TODO(devlin): Could we only grant |permissions|, rather than all those + // in the active permissions? In theory, all other active permissions have + // already been granted. + GrantActivePermissions(&extension); + } + + if ((permissions_store_mask & kRuntimeGrantedPermissions) != 0) { + ExtensionPrefs::Get(browser_context_) + ->AddRuntimeGrantedPermissions(extension.id(), permissions); + } + + NotifyPermissionsUpdated(ADDED, &extension, *added); +} + +void PermissionsUpdater::RemovePermissionsImpl(const Extension& extension, + const PermissionSet& to_remove, + int permissions_store_mask) { + const PermissionSet& active = + extension.permissions_data()->active_permissions(); + std::unique_ptr<const PermissionSet> remaining = + PermissionSet::CreateDifference(active, to_remove); + + // Move any granted permissions that were in the withheld set back to the + // withheld set so they can be added back later. + // Any revoked permission that isn't from the optional permissions can only + // be a withheld permission. + // TODO(devlin): This won't work well when an extension specifies a permission + // as both optional and required. + std::unique_ptr<const PermissionSet> removed_withheld = + PermissionSet::CreateDifference( + to_remove, PermissionsParser::GetOptionalPermissions(&extension)); + std::unique_ptr<const PermissionSet> withheld = PermissionSet::CreateUnion( + *removed_withheld, extension.permissions_data()->withheld_permissions()); + + SetPermissions(&extension, std::move(remaining), std::move(withheld)); + + ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context_); + // NOTE: Currently, this code path is only reached in unit tests. See comment + // above REMOVE_HARD in the header file. + if ((permissions_store_mask & kGrantedPermissions) != 0) + prefs->RemoveGrantedPermissions(extension.id(), to_remove); + + if ((permissions_store_mask & kRuntimeGrantedPermissions) != 0) + prefs->RemoveRuntimeGrantedPermissions(extension.id(), to_remove); + + NotifyPermissionsUpdated(REMOVED, &extension, to_remove); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/permissions_updater.h b/chrome/browser/extensions/permissions_updater.h index 70f75e1d..765599644 100644 --- a/chrome/browser/extensions/permissions_updater.h +++ b/chrome/browser/extensions/permissions_updater.h
@@ -42,7 +42,17 @@ }; enum RemoveType { + // Permissions will be removed from the active set of permissions, but not + // the stored granted permissions. This allows the extension to re-add the + // permissions without further prompting. REMOVE_SOFT, + // Permissions will be removed from the active set of permissions and the + // stored granted permissions. The extension will need to re-prompt the + // user to re-add the permissions. + // TODO(devlin): REMOVE_HARD is only exercised in unit tests, but we have + // the desire to be able to able to surface revoking optional permissions to + // the user. We should either a) pursue it in earnest or b) remove support + // (and potentially add it back at a later date). REMOVE_HARD, }; @@ -57,28 +67,41 @@ // |delegate| is a singleton instance and is leaked. static void SetPlatformDelegate(Delegate* delegate); - // Adds the set of |permissions| to the |extension|'s active permission set - // and sends the relevant messages and notifications. This method assumes the - // user has already been prompted, if necessary, for the extra permissions. - // NOTE: This should only be used for granting permissions that were approved - // at runtime, such as from the permissions API or runtime host permissions. - void AddPermissions(const Extension* extension, - const PermissionSet& permissions); + // Grants |permissions| that were defined as optional in the manifest to + // |extension|, updating the active permission set and notifying any + // observers. This method assumes the user has already been prompted, if + // necessary, for the extra permissions. + // NOTE: This should only be used for granting permissions defined in the + // extension's optional permissions set through the permissions API. + void GrantOptionalPermissions(const Extension& extension, + const PermissionSet& permissions); - // Removes the set of |permissions| from the |extension|'s active permission - // set and sends the relevant messages and notifications. - // If |remove_type| is REMOVE_HARD, this removes the permissions from the - // granted permissions in the prefs (meaning that the extension would have - // to prompt the user again for permission). - // You should use REMOVE_HARD to ensure the extension cannot silently regain - // the permission, which is the case when the permission is removed by the - // user. If it's the extension itself removing the permission, it is safe to - // use REMOVE_SOFT. - // NOTE: This should only be used for removing permissions at runtime, such - // as through the permissions API or runtime host permissions. - void RemovePermissions(const Extension* extension, - const PermissionSet& permissions, - RemoveType remove_type); + // Grants |permissions| that were withheld at installation and granted at + // runtime to |extension|, updating the active permission set and notifying + // any observers. + // NOTE: This should only be used for granting permissions through the runtime + // host permissions feature. + void GrantRuntimePermissions(const Extension& extension, + const PermissionSet& permissions); + + // Removes |permissions| that were defined as optional in the manifest from + // the |extension|, updating the active permission set and notifying any + // observers. |remove_type| specifies whether the permissions should be + // revoked from the preferences, thus requiring the extension to re-prompt + // the user if it wants to add them back. + // NOTE: This should only be used for removing permissions defined in the + // extension's optional permissions set through the permissions API. + void RevokeOptionalPermissions(const Extension& extension, + const PermissionSet& permissions, + RemoveType remove_type); + + // Removes |permissions| that were withheld at installation and granted at + // runtime from |extension|, updating the active permission set and notifying + // any observers. + // NOTE: This should only be used for removing permissions through the runtime + // host permissions feature. + void RevokeRuntimePermissions(const Extension& extension, + const PermissionSet& permissions); // Removes the |permissions| from |extension| and makes no effort to determine // if doing so is safe in the slightlest. This method shouldn't be used, @@ -114,6 +137,13 @@ // required by the extension. void InitializePermissions(const Extension* extension); + // Adds |permissions| to |extension| without doing any validation or + // persisting values in prefs. + // TODO(devlin): We shouldn't need this, even for tests. Tests shouldn't be + // testing behavior that is impossible in production. + void AddPermissionsForTesting(const Extension& extension, + const PermissionSet& permissions); + private: enum EventType { ADDED, @@ -121,6 +151,13 @@ POLICY, }; + // A bit mask of the permission set to be updated in ExtensionPrefs. + enum PermissionsStore { + kNone = 0, + kGrantedPermissions = 1 << 0, + kRuntimeGrantedPermissions = 1 << 1, + }; + // Sets the |extension|'s active permissions to |active| and records the // change in the prefs. If |withheld| is non-null, also sets the extension's // withheld permissions to |withheld|. Otherwise, |withheld| permissions are @@ -152,6 +189,18 @@ const URLPatternSet& default_runtime_blocked_hosts, const URLPatternSet& default_runtime_allowed_hosts); + // Adds the given |permissions| to |extension|. Updates the preferences + // according to |permission_store_mask|. + void AddPermissionsImpl(const Extension& extension, + const PermissionSet& permissions, + int permission_store_mask); + + // Removes the given |permissions| to |extension|. Updates the preferences + // according to |permission_store_mask|. + void RemovePermissionsImpl(const Extension& extension, + const PermissionSet& permissions, + int permission_store_mask); + // The associated BrowserContext. content::BrowserContext* browser_context_;
diff --git a/chrome/browser/extensions/permissions_updater_unittest.cc b/chrome/browser/extensions/permissions_updater_unittest.cc index e725c11..07036db 100644 --- a/chrome/browser/extensions/permissions_updater_unittest.cc +++ b/chrome/browser/extensions/permissions_updater_unittest.cc
@@ -160,7 +160,7 @@ // Test that the PermissionUpdater can correctly add and remove active // permissions. This tests all of PermissionsUpdater's public methods because // GrantActivePermissions and SetPermissions are used by AddPermissions. -TEST_F(PermissionsUpdaterTest, AddAndRemovePermissions) { +TEST_F(PermissionsUpdaterTest, GrantAndRevokeOptionalPermissions) { InitializeEmptyExtensionService(); // Load the test extension. @@ -197,7 +197,8 @@ scriptable_hosts); PermissionsUpdaterListener listener; - PermissionsUpdater(profile_.get()).AddPermissions(extension.get(), delta); + PermissionsUpdater(profile_.get()) + .GrantOptionalPermissions(*extension, delta); listener.Wait(); @@ -223,36 +224,37 @@ } { - // In the second part of the test, we'll remove the permissions that we - // just added except for 'notifications'. - apis.erase(APIPermission::kNotifications); - PermissionSet delta(apis, empty_manifest_permissions, hosts, - scriptable_hosts); + // In the second part of the test, we'll remove the permissions that we + // just added except for 'notifications'. + apis.erase(APIPermission::kNotifications); + PermissionSet delta(apis, empty_manifest_permissions, hosts, + scriptable_hosts); - PermissionsUpdaterListener listener; - PermissionsUpdater(profile_.get()) - .RemovePermissions(extension.get(), delta, - PermissionsUpdater::REMOVE_SOFT); - listener.Wait(); + PermissionsUpdaterListener listener; + PermissionsUpdater(profile_.get()) + .RevokeOptionalPermissions(*extension, delta, + PermissionsUpdater::REMOVE_SOFT); + listener.Wait(); - // Verify that the notification was correct. - ASSERT_TRUE(listener.received_notification()); - ASSERT_EQ(extension.get(), listener.extension()); - ASSERT_EQ(UpdatedExtensionPermissionsInfo::REMOVED, listener.reason()); - ASSERT_EQ(delta, *listener.permissions()); + // Verify that the notification was correct. + ASSERT_TRUE(listener.received_notification()); + ASSERT_EQ(extension.get(), listener.extension()); + ASSERT_EQ(UpdatedExtensionPermissionsInfo::REMOVED, listener.reason()); + ASSERT_EQ(delta, *listener.permissions()); - // Make sure the extension's active permissions reflect the change. - active_permissions = - PermissionSet::CreateDifference(*active_permissions, delta); - ASSERT_EQ(*active_permissions, - extension->permissions_data()->active_permissions()); + // Make sure the extension's active permissions reflect the change. + active_permissions = + PermissionSet::CreateDifference(*active_permissions, delta); + ASSERT_EQ(*active_permissions, + extension->permissions_data()->active_permissions()); - // Verify that the extension prefs hold the new active permissions and the - // same granted permissions. - ASSERT_EQ(*active_permissions, *prefs->GetActivePermissions(extension->id())); + // Verify that the extension prefs hold the new active permissions and the + // same granted permissions. + ASSERT_EQ(*active_permissions, + *prefs->GetActivePermissions(extension->id())); - ASSERT_EQ(*granted_permissions, - *prefs->GetGrantedPermissions(extension->id())); + ASSERT_EQ(*granted_permissions, + *prefs->GetGrantedPermissions(extension->id())); } } @@ -291,8 +293,8 @@ EXPECT_TRUE(updater.GetRevokablePermissions(extension.get())->IsEmpty()); // Add the optional "cookies" permission. - updater.AddPermissions(extension.get(), - *api_permission_set(APIPermission::kCookie)); + updater.GrantOptionalPermissions( + *extension, *api_permission_set(APIPermission::kCookie)); const PermissionsData* permissions = extension->permissions_data(); // The extension should have the permission in its active permissions and // its granted permissions (stored in prefs). And, the permission should @@ -305,8 +307,8 @@ ->HasAPIPermission(APIPermission::kCookie)); // Repeat with "tabs". - updater.AddPermissions(extension.get(), - *api_permission_set(APIPermission::kTab)); + updater.GrantOptionalPermissions(*extension, + *api_permission_set(APIPermission::kTab)); EXPECT_TRUE(permissions->HasAPIPermission(APIPermission::kTab)); granted_permissions = prefs->GetGrantedPermissions(extension->id()); EXPECT_TRUE(granted_permissions->HasAPIPermission(APIPermission::kTab)); @@ -316,9 +318,9 @@ // Remove the "tabs" permission. The extension should no longer have it // in its active or granted permissions, and it shouldn't be revokable. // The extension should still have the "cookies" permission. - updater.RemovePermissions(extension.get(), - *api_permission_set(APIPermission::kTab), - PermissionsUpdater::REMOVE_HARD); + updater.RevokeOptionalPermissions(*extension, + *api_permission_set(APIPermission::kTab), + PermissionsUpdater::REMOVE_HARD); EXPECT_FALSE(permissions->HasAPIPermission(APIPermission::kTab)); granted_permissions = prefs->GetGrantedPermissions(extension->id()); EXPECT_FALSE(granted_permissions->HasAPIPermission(APIPermission::kTab)); @@ -457,7 +459,8 @@ PermissionsUpdater::SetPlatformDelegate(nullptr); } -TEST_F(PermissionsUpdaterTest, UpdatingRuntimeGrantedPermissions) { +TEST_F(PermissionsUpdaterTest, + UpdatingRuntimeGrantedPermissionsWithOptionalPermissions) { InitializeEmptyExtensionService(); scoped_refptr<const Extension> extension = @@ -468,40 +471,103 @@ PermissionsUpdater updater(profile()); updater.InitializePermissions(extension.get()); + // Grant the active permissions, as if the extension had just been installed. + updater.GrantActivePermissions(extension.get()); ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); - // Initially, there should be no runtime-granted permissions. + // Initially, there should be no runtime-granted permissions or granted + // permissions. EXPECT_TRUE(prefs->GetRuntimeGrantedPermissions(extension->id())->IsEmpty()); + EXPECT_TRUE(prefs->GetGrantedPermissions(extension->id())->IsEmpty()); APIPermissionSet apis; apis.insert(APIPermission::kTab); PermissionSet optional_permissions(apis, ManifestPermissionSet(), URLPatternSet(), URLPatternSet()); - // Granting permissions should update runtime-granted permissions. - updater.AddPermissions(extension.get(), optional_permissions); + // Granting permissions should update both runtime-granted permissions and + // granted permissions. + updater.GrantOptionalPermissions(*extension, optional_permissions); EXPECT_EQ(optional_permissions, *prefs->GetRuntimeGrantedPermissions(extension->id())); + EXPECT_EQ(optional_permissions, + *prefs->GetGrantedPermissions(extension->id())); // Removing permissions with REMOVE_SOFT should not remove the permission - // from runtime-granted permissions; this happens when the extension opts - // into lower privilege. - updater.RemovePermissions(extension.get(), optional_permissions, - PermissionsUpdater::REMOVE_SOFT); + // from runtime-granted permissions or granted permissions; this happens when + // the extension opts into lower privilege. + updater.RevokeOptionalPermissions(*extension, optional_permissions, + PermissionsUpdater::REMOVE_SOFT); EXPECT_EQ(optional_permissions, *prefs->GetRuntimeGrantedPermissions(extension->id())); + EXPECT_EQ(optional_permissions, + *prefs->GetGrantedPermissions(extension->id())); // Removing permissions with REMOVE_HARD should remove the permission from - // runtime granted permissions; this happens when the user chooses to revoke - // the permission. + // runtime-granted and granted permissions; this happens when the user chooses + // to revoke the permission. // Note: we need to add back the permission first, so it shows up as a // revokable permission. // TODO(devlin): Inactive, but granted, permissions should be revokable. - updater.AddPermissions(extension.get(), optional_permissions); - updater.RemovePermissions(extension.get(), optional_permissions, - PermissionsUpdater::REMOVE_HARD); + updater.GrantOptionalPermissions(*extension, optional_permissions); + updater.RevokeOptionalPermissions(*extension, optional_permissions, + PermissionsUpdater::REMOVE_HARD); EXPECT_TRUE(prefs->GetRuntimeGrantedPermissions(extension->id())->IsEmpty()); + EXPECT_TRUE(prefs->GetGrantedPermissions(extension->id())->IsEmpty()); +} + +TEST_F(PermissionsUpdaterTest, + UpdatingRuntimeGrantedPermissionsWithRuntimePermissions) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(features::kRuntimeHostPermissions); + + InitializeEmptyExtensionService(); + + scoped_refptr<const Extension> extension = + ExtensionBuilder("extension").AddPermission("*://*/*").Build(); + + PermissionsUpdater updater(profile()); + updater.InitializePermissions(extension.get()); + // Grant the active permissions, as if the extension had just been installed. + updater.GrantActivePermissions(extension.get()); + ScriptingPermissionsModifier(profile(), extension) + .SetWithholdHostPermissions(true); + + ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); + + // Initially, there should be no runtime-granted permissions. + EXPECT_TRUE(prefs->GetRuntimeGrantedPermissions(extension->id())->IsEmpty()); + std::unique_ptr<const PermissionSet> initial_granted_permissions = + prefs->GetGrantedPermissions(extension->id()); + // Granted permissions should contain the required permissions from the + // extension. + EXPECT_TRUE(initial_granted_permissions->explicit_hosts().ContainsPattern( + URLPattern(Extension::kValidHostPermissionSchemes, "*://*/*"))); + + URLPatternSet explicit_hosts({URLPattern( + Extension::kValidHostPermissionSchemes, "https://example.com/*")}); + PermissionSet runtime_granted_permissions(APIPermissionSet(), + ManifestPermissionSet(), + explicit_hosts, URLPatternSet()); + + // Granting runtime-granted permissions should update the runtime granted + // permissions store in preferences, but *not* granted permissions in + // preferences. + updater.GrantRuntimePermissions(*extension, runtime_granted_permissions); + EXPECT_EQ(runtime_granted_permissions, + *prefs->GetRuntimeGrantedPermissions(extension->id())); + EXPECT_EQ(*initial_granted_permissions, + *prefs->GetGrantedPermissions(extension->id())); + + // Removing runtime-granted permissions should not remove the permission + // from runtime-granted permissions; granted permissions should remain + // unchanged. + updater.RevokeRuntimePermissions(*extension, runtime_granted_permissions); + + EXPECT_TRUE(prefs->GetRuntimeGrantedPermissions(extension->id())->IsEmpty()); + EXPECT_EQ(*initial_granted_permissions, + *prefs->GetGrantedPermissions(extension->id())); } TEST_F(PermissionsUpdaterTest, RevokingPermissionsWithRuntimeHostPermissions) { @@ -551,7 +617,7 @@ URLPatternSet()); // Give the extension access to the test site. Now, the test site permission // should be revokable. - updater.AddPermissions(extension.get(), permission_set); + updater.GrantRuntimePermissions(*extension, permission_set); EXPECT_TRUE(extension->permissions_data() ->active_permissions() .HasExplicitAccessToOrigin(kOrigin)); @@ -560,8 +626,8 @@ // Revoke the test site permission. The extension should no longer have // access to test site, and the revokable permissions should be empty. - updater.RemovePermissions(extension.get(), permission_set, - PermissionsUpdater::REMOVE_HARD); + updater.RevokeOptionalPermissions(*extension, permission_set, + PermissionsUpdater::REMOVE_HARD); EXPECT_FALSE(extension->permissions_data() ->active_permissions() .HasExplicitAccessToOrigin(kOrigin));
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc index d8ff8d6..5e6cebd 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -219,9 +219,10 @@ } PermissionsUpdater(browser_context_) - .AddPermissions(extension_.get(), - PermissionSet(APIPermissionSet(), ManifestPermissionSet(), - new_explicit_hosts, new_scriptable_hosts)); + .GrantRuntimePermissions( + *extension_, + PermissionSet(APIPermissionSet(), ManifestPermissionSet(), + new_explicit_hosts, new_scriptable_hosts)); } bool ScriptingPermissionsModifier::HasGrantedHostPermission( @@ -254,11 +255,10 @@ scriptable_hosts.AddOrigin(UserScript::ValidUserScriptSchemes(), origin); PermissionsUpdater(browser_context_) - .RemovePermissions( - extension_.get(), + .RevokeRuntimePermissions( + *extension_, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), - explicit_hosts, scriptable_hosts), - PermissionsUpdater::REMOVE_HARD); + explicit_hosts, scriptable_hosts)); } // static @@ -318,7 +318,7 @@ withheld.explicit_hosts(), withheld.scriptable_hosts()); PermissionsUpdater(browser_context_) - .AddPermissions(extension_.get(), permissions); + .GrantRuntimePermissions(*extension_, permissions); } void ScriptingPermissionsModifier::WithholdHostPermissions() { @@ -327,8 +327,7 @@ // introduce another enum to PermissionsModifier for removing only from // runtime granted permissions. PermissionsUpdater(browser_context_) - .RemovePermissions(extension_.get(), *GetRevokablePermissions(), - PermissionsUpdater::REMOVE_HARD); + .RevokeRuntimePermissions(*extension_, *GetRevokablePermissions()); } } // namespace extensions
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 492ffca1..a4cb5a8b 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2093,9 +2093,9 @@ const char kCCTModuleDescription[] = "Enables a dynamically loaded module in Chrome Custom Tabs, on Android."; -const char kChromeDuplexName[] = "Chrome Duplex"; -const char kChromeDuplexDescription[] = - "Enables Chrome Duplex, split toolbar Chrome Home, on Android."; +const char kChromeDuetName[] = "Chrome Duet"; +const char kChromeDuetDescription[] = + "Enables Chrome Duet, split toolbar Chrome Home, on Android."; const char kChromeHomeSwipeLogicName[] = "Chrome Home Swipe Logic"; const char kChromeHomeSwipeLogicDescription[] = @@ -2365,6 +2365,10 @@ const char kModalPermissionPromptsDescription[] = "Whether to use permission dialogs in place of permission infobars."; +const char kNewContactsPickerName[] = "Enable new contacts picker"; +const char kNewContactsPickerDescription[] = + "Activates the new picker for selecting contacts."; + const char kNewPhotoPickerName[] = "Enable new Photopicker"; const char kNewPhotoPickerDescription[] = "Activates the new picker for selecting photos."; @@ -3371,25 +3375,12 @@ #if defined(OS_ANDROID) -const char kVrWebInputEditingName[] = "VR browsing web input editing"; -const char kVrWebInputEditingDescription[] = - "Allow editing web input fields while in VR mode."; - -const char kVrBrowsingExperimentalFeaturesName[] = - "VR browsing experimental features"; -const char kVrBrowsingExperimentalFeaturesDescription[] = - "Experimental VR browsing features that are under development."; - const char kVrBrowsingExperimentalRenderingName[] = "VR browsing experimental rendering features"; const char kVrBrowsingExperimentalRenderingDescription[] = "Experimental rendering features for VR browsing (e.g. power-saving " "rendering modes)."; -const char kVrBrowsingInCustomTabName[] = "VR browsing in Custom Tabs"; -const char kVrBrowsingInCustomTabDescription[] = - "Allow browsing within a VR headset while in a Custom Tab."; - const char kWebVrAutopresentFromIntentName[] = "WebVR auto presentation from intents"; const char kWebVrAutopresentFromIntentDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 96278ad..c527361 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1275,8 +1275,8 @@ extern const char kCCTModuleName[]; extern const char kCCTModuleDescription[]; -extern const char kChromeDuplexName[]; -extern const char kChromeDuplexDescription[]; +extern const char kChromeDuetName[]; +extern const char kChromeDuetDescription[]; extern const char kChromeHomeSwipeLogicName[]; extern const char kChromeHomeSwipeLogicDescription[]; @@ -1436,6 +1436,9 @@ extern const char kModalPermissionPromptsName[]; extern const char kModalPermissionPromptsDescription[]; +extern const char kNewContactsPickerName[]; +extern const char kNewContactsPickerDescription[]; + extern const char kNewPhotoPickerName[]; extern const char kNewPhotoPickerDescription[]; @@ -2076,18 +2079,9 @@ #if defined(OS_ANDROID) -extern const char kVrWebInputEditingName[]; -extern const char kVrWebInputEditingDescription[]; - -extern const char kVrBrowsingExperimentalFeaturesName[]; -extern const char kVrBrowsingExperimentalFeaturesDescription[]; - extern const char kVrBrowsingExperimentalRenderingName[]; extern const char kVrBrowsingExperimentalRenderingDescription[]; -extern const char kVrBrowsingInCustomTabName[]; -extern const char kVrBrowsingInCustomTabDescription[]; - extern const char kWebVrAutopresentFromIntentName[]; extern const char kWebVrAutopresentFromIntentDescription[];
diff --git a/chrome/browser/language/language_model_factory.cc b/chrome/browser/language/language_model_manager_factory.cc similarity index 65% rename from chrome/browser/language/language_model_factory.cc rename to chrome/browser/language/language_model_manager_factory.cc index e1f30553..fc76f7f 100644 --- a/chrome/browser/language/language_model_factory.cc +++ b/chrome/browser/language/language_model_manager_factory.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "base/feature_list.h" #include "chrome/browser/browser_process.h" @@ -15,59 +15,73 @@ #include "components/language/content/browser/geo_language_provider.h" #include "components/language/core/browser/baseline_language_model.h" #include "components/language/core/browser/heuristic_language_model.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/language/core/browser/pref_names.h" #include "components/language/core/common/language_experiments.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -// static -LanguageModelFactory* LanguageModelFactory::GetInstance() { - return base::Singleton<LanguageModelFactory>::get(); -} +namespace { -// static -language::LanguageModel* LanguageModelFactory::GetForBrowserContext( - content::BrowserContext* const browser_context) { - return static_cast<language::LanguageModel*>( - GetInstance()->GetServiceForBrowserContext(browser_context, true)); -} - -LanguageModelFactory::LanguageModelFactory() - : BrowserContextKeyedServiceFactory( - "LanguageModel", - BrowserContextDependencyManager::GetInstance()) {} - -LanguageModelFactory::~LanguageModelFactory() {} - -KeyedService* LanguageModelFactory::BuildServiceInstanceFor( - content::BrowserContext* const browser_context) const { +std::unique_ptr<language::LanguageModel> BuildDefaultLanguageModelFor( + Profile* const profile) { language::OverrideLanguageModel override_model_mode = language::GetOverrideLanguageModel(); - Profile* const profile = Profile::FromBrowserContext(browser_context); if (override_model_mode == language::OverrideLanguageModel::HEURISTIC) { - return new language::HeuristicLanguageModel( + return std::make_unique<language::HeuristicLanguageModel>( profile->GetPrefs(), g_browser_process->GetApplicationLocale(), prefs::kAcceptLanguages, language::prefs::kUserLanguageProfile); } if (override_model_mode == language::OverrideLanguageModel::GEO) { - return new language::GeoLanguageModel( + return std::make_unique<language::GeoLanguageModel>( language::GeoLanguageProvider::GetInstance()); } - return new language::BaselineLanguageModel( + return std::make_unique<language::BaselineLanguageModel>( profile->GetPrefs(), g_browser_process->GetApplicationLocale(), prefs::kAcceptLanguages); } -content::BrowserContext* LanguageModelFactory::GetBrowserContextToUse( +} // namespace + +// static +LanguageModelManagerFactory* LanguageModelManagerFactory::GetInstance() { + return base::Singleton<LanguageModelManagerFactory>::get(); +} + +// static +language::LanguageModelManager* +LanguageModelManagerFactory::GetForBrowserContext( + content::BrowserContext* const browser_context) { + return static_cast<language::LanguageModelManager*>( + GetInstance()->GetServiceForBrowserContext(browser_context, true)); +} + +LanguageModelManagerFactory::LanguageModelManagerFactory() + : BrowserContextKeyedServiceFactory( + "LanguageModelManager", + BrowserContextDependencyManager::GetInstance()) {} + +LanguageModelManagerFactory::~LanguageModelManagerFactory() {} + +KeyedService* LanguageModelManagerFactory::BuildServiceInstanceFor( + content::BrowserContext* const browser_context) const { + Profile* const profile = Profile::FromBrowserContext(browser_context); + language::LanguageModelManager* manager = new language::LanguageModelManager( + profile->GetPrefs(), g_browser_process->GetApplicationLocale()); + manager->SetDefaultModel(BuildDefaultLanguageModelFor(profile)); + return manager; +} + +content::BrowserContext* LanguageModelManagerFactory::GetBrowserContextToUse( content::BrowserContext* context) const { // Use the original profile's language model even in Incognito mode. return chrome::GetBrowserContextRedirectedInIncognito(context); } -void LanguageModelFactory::RegisterProfilePrefs( +void LanguageModelManagerFactory::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* const registry) { if (base::FeatureList::IsEnabled(language::kUseHeuristicLanguageModel)) { registry->RegisterDictionaryPref(
diff --git a/chrome/browser/language/language_model_factory.h b/chrome/browser/language/language_model_manager_factory.h similarity index 60% rename from chrome/browser/language/language_model_factory.h rename to chrome/browser/language/language_model_manager_factory.h index 8366397d5..27d08f9e 100644 --- a/chrome/browser/language/language_model_factory.h +++ b/chrome/browser/language/language_model_manager_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_FACTORY_H_ -#define CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_FACTORY_H_ +#ifndef CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_MANAGER_FACTORY_H_ +#define CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_MANAGER_FACTORY_H_ #include "base/macros.h" #include "base/memory/singleton.h" @@ -14,7 +14,7 @@ } namespace language { -class LanguageModel; +class LanguageModelManager; } namespace user_prefs { @@ -23,17 +23,17 @@ // Manages the language model for each profile. The particular language model // provided depends on feature flags. -class LanguageModelFactory : public BrowserContextKeyedServiceFactory { +class LanguageModelManagerFactory : public BrowserContextKeyedServiceFactory { public: - static LanguageModelFactory* GetInstance(); - static language::LanguageModel* GetForBrowserContext( + static LanguageModelManagerFactory* GetInstance(); + static language::LanguageModelManager* GetForBrowserContext( content::BrowserContext* browser_context); private: - friend struct base::DefaultSingletonTraits<LanguageModelFactory>; + friend struct base::DefaultSingletonTraits<LanguageModelManagerFactory>; - LanguageModelFactory(); - ~LanguageModelFactory() override; + LanguageModelManagerFactory(); + ~LanguageModelManagerFactory() override; // BrowserContextKeyedServiceFactory overrides. KeyedService* BuildServiceInstanceFor( @@ -43,7 +43,7 @@ void RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) override; - DISALLOW_COPY_AND_ASSIGN(LanguageModelFactory); + DISALLOW_COPY_AND_ASSIGN(LanguageModelManagerFactory); }; -#endif // CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_FACTORY_H_ +#endif // CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_MANAGER_FACTORY_H_
diff --git a/chrome/browser/language/language_model_factory_unittest.cc b/chrome/browser/language/language_model_manager_factory_unittest.cc similarity index 62% rename from chrome/browser/language/language_model_factory_unittest.cc rename to chrome/browser/language/language_model_manager_factory_unittest.cc index 46c2e35..69f12a1 100644 --- a/chrome/browser/language/language_model_factory_unittest.cc +++ b/chrome/browser/language/language_model_manager_factory_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/test_browser_thread_bundle.h" @@ -13,15 +13,16 @@ using testing::Not; // Check that Incognito language modeling is inherited from the user's profile. -TEST(LanguageModelFactoryTest, SharedWithIncognito) { +TEST(LanguageModelManagerFactoryTest, SharedWithIncognito) { content::TestBrowserThreadBundle thread_bundle; TestingProfile profile; - const language::LanguageModel* const model = - LanguageModelFactory::GetForBrowserContext(&profile); - EXPECT_THAT(model, Not(IsNull())); + const language::LanguageModelManager* const manager = + LanguageModelManagerFactory::GetForBrowserContext(&profile); + EXPECT_THAT(manager, Not(IsNull())); Profile* const incognito = profile.GetOffTheRecordProfile(); ASSERT_THAT(incognito, Not(IsNull())); - EXPECT_THAT(LanguageModelFactory::GetForBrowserContext(incognito), Eq(model)); + EXPECT_THAT(LanguageModelManagerFactory::GetForBrowserContext(incognito), + Eq(manager)); }
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc index f2a58fdc..9c14fd4 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -1895,19 +1895,14 @@ IN_PROC_BROWSER_TEST_F(SessionRestorePageLoadMetricsBrowserTest, RestoreForeignTab) { - sessions::SerializedNavigationEntry nav = - sessions::SerializedNavigationEntryTestHelper::CreateNavigation( - GetTestURL().spec(), "one"); - - // Set up the restore data. - sync_pb::SessionTab sync_data; - sync_data.set_tab_visual_index(0); - sync_data.set_current_navigation_index(1); - sync_data.set_pinned(false); - sync_data.add_navigation()->CopyFrom(nav.ToSyncData()); - sessions::SessionTab tab; - tab.SetFromSyncData(sync_data, base::Time::Now()); + tab.tab_visual_index = 0; + tab.current_navigation_index = 1; + tab.navigations.push_back( + sessions::SerializedNavigationEntryTestHelper::CreateNavigation( + GetTestURL().spec(), "one")); + tab.navigations.back().set_encoded_page_state(""); + ASSERT_EQ(1, browser()->tab_strip_model()->count()); // Restore in the current tab. @@ -1960,37 +1955,32 @@ RestoreForeignSession) { Profile* profile = browser()->profile(); - sessions::SerializedNavigationEntry nav1 = - sessions::SerializedNavigationEntryTestHelper::CreateNavigation( - GetTestURL().spec(), "one"); - sessions::SerializedNavigationEntry nav2 = - sessions::SerializedNavigationEntryTestHelper::CreateNavigation( - GetTestURL2().spec(), "two"); - // Set up the restore data: one window with two tabs. std::vector<const sessions::SessionWindow*> session; sessions::SessionWindow window; - auto tab1 = std::make_unique<sessions::SessionTab>(); { - sync_pb::SessionTab sync_data; - sync_data.set_tab_visual_index(0); - sync_data.set_current_navigation_index(0); - sync_data.set_pinned(true); - sync_data.add_navigation()->CopyFrom(nav1.ToSyncData()); - tab1->SetFromSyncData(sync_data, base::Time::Now()); + auto tab1 = std::make_unique<sessions::SessionTab>(); + tab1->tab_visual_index = 0; + tab1->current_navigation_index = 0; + tab1->pinned = true; + tab1->navigations.push_back( + sessions::SerializedNavigationEntryTestHelper::CreateNavigation( + GetTestURL().spec(), "one")); + tab1->navigations.back().set_encoded_page_state(""); + window.tabs.push_back(std::move(tab1)); } - window.tabs.push_back(std::move(tab1)); - auto tab2 = std::make_unique<sessions::SessionTab>(); { - sync_pb::SessionTab sync_data; - sync_data.set_tab_visual_index(1); - sync_data.set_current_navigation_index(0); - sync_data.set_pinned(false); - sync_data.add_navigation()->CopyFrom(nav2.ToSyncData()); - tab2->SetFromSyncData(sync_data, base::Time::Now()); + auto tab2 = std::make_unique<sessions::SessionTab>(); + tab2->tab_visual_index = 1; + tab2->current_navigation_index = 0; + tab2->pinned = false; + tab2->navigations.push_back( + sessions::SerializedNavigationEntryTestHelper::CreateNavigation( + GetTestURL2().spec(), "two")); + tab2->navigations.back().set_encoded_page_state(""); + window.tabs.push_back(std::move(tab2)); } - window.tabs.push_back(std::move(tab2)); // Restore the session window with 2 tabs. session.push_back(static_cast<const sessions::SessionWindow*>(&window));
diff --git a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc index 69d2186..1a4574f6 100644 --- a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc +++ b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
@@ -12,6 +12,7 @@ #include <utility> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/command_line.h" #include "base/files/scoped_temp_dir.h" #include "base/message_loop/message_loop.h" @@ -122,15 +123,15 @@ TestServiceProcess() { } ~TestServiceProcess() override {} - bool Initialize(base::MessageLoopForUI* message_loop, - ServiceProcessState* state); + bool Initialize(base::OnceClosure quit_closure, + std::unique_ptr<ServiceProcessState> state); }; -bool TestServiceProcess::Initialize(base::MessageLoopForUI* message_loop, - ServiceProcessState* state) { - main_message_loop_ = message_loop; - - service_process_state_.reset(state); +bool TestServiceProcess::Initialize( + base::OnceClosure quit_closure, + std::unique_ptr<ServiceProcessState> state) { + quit_closure_ = std::move(quit_closure); + service_process_state_ = std::move(state); base::Thread::Options options(base::MessageLoop::TYPE_IO, 0); io_thread_.reset(new base::Thread("TestServiceProcess_IO")); @@ -190,6 +191,7 @@ CHECK(!user_data_dir.empty()); CHECK(test_launcher_utils::OverrideUserDataDir(user_data_dir)); + base::RunLoop run_loop; #if defined(OS_MACOSX) if (!command_line->HasSwitch(kTestExecutablePath)) return kMissingSwitch; @@ -197,11 +199,10 @@ command_line->GetSwitchValuePath(kTestExecutablePath); EXPECT_FALSE(executable_path.empty()); MockLaunchd mock_launchd(executable_path, main_message_loop.task_runner(), - true, true); + run_loop.QuitClosure(), true, true); Launchd::ScopedInstance use_mock(&mock_launchd); #endif - ServiceProcessState* state(new ServiceProcessState); bool service_process_state_initialized = state->Initialize(); EXPECT_TRUE(service_process_state_initialized); @@ -213,7 +214,8 @@ // Takes ownership of the pointer, but we can use it since we have the same // lifetime. - EXPECT_TRUE(service_process.Initialize(&main_message_loop, state)); + EXPECT_TRUE(service_process.Initialize(run_loop.QuitClosure(), + base::WrapUnique(state))); // Needed for IPC. mojo::core::Init(); @@ -255,7 +257,7 @@ service_process.io_task_runner(), base::ThreadTaskRunnerHandle::Get()); - base::RunLoop().Run(); + run_loop.Run(); if (!Mock::VerifyAndClearExpectations(&server)) return kExpectationsNotMet; if (!g_good_shutdown) @@ -388,8 +390,9 @@ EXPECT_TRUE(MockLaunchd::MakeABundle(temp_dir_.GetPath(), "CloudPrintProxyTest", &bundle_path_, &executable_path_)); - mock_launchd_.reset(new MockLaunchd( - executable_path_, base::ThreadTaskRunnerHandle::Get(), true, false)); + mock_launchd_.reset(new MockLaunchd(executable_path_, + base::ThreadTaskRunnerHandle::Get(), + base::DoNothing(), true, false)); scoped_launchd_instance_.reset( new Launchd::ScopedInstance(mock_launchd_.get())); #endif
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 92548ae..1e9e4365b 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -33,7 +33,7 @@ #include "chrome/browser/google/google_url_tracker_factory.h" #include "chrome/browser/history/history_service_factory.h" #include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/browser/language/url_language_histogram_factory.h" #include "chrome/browser/media/media_engagement_service.h" #include "chrome/browser/media/media_engagement_service_factory.h" @@ -291,7 +291,7 @@ ->SetUIDelegateFactory(std::move(networking_private_ui_delegate_factory)); #endif #endif - LanguageModelFactory::GetInstance(); + LanguageModelManagerFactory::GetInstance(); #if !defined(OS_ANDROID) LoginUIServiceFactory::GetInstance(); #endif
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 23e7c12..f12dfb4 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -32,7 +32,7 @@ #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/download/download_stats.h" #include "chrome/browser/extensions/extension_util.h" -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/browser/media/router/media_router_dialog_controller.h" #include "chrome/browser/media/router/media_router_feature.h" #include "chrome/browser/media/router/media_router_metrics.h" @@ -81,6 +81,7 @@ #include "components/download/public/common/download_url_parameters.h" #include "components/google/core/browser/google_util.h" #include "components/guest_view/browser/guest_view_base.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/omnibox/browser/autocomplete_classifier.h" #include "components/omnibox/browser/autocomplete_match.h" #include "components/password_manager/core/browser/password_manager_util.h" @@ -946,7 +947,8 @@ std::unique_ptr<translate::TranslatePrefs> prefs( ChromeTranslateClient::CreateTranslatePrefs(GetPrefs(browser_context_))); language::LanguageModel* language_model = - LanguageModelFactory::GetForBrowserContext(browser_context_); + LanguageModelManagerFactory::GetForBrowserContext(browser_context_) + ->GetDefaultModel(); return translate::TranslateManager::GetTargetLanguage(prefs.get(), language_model); } @@ -1291,7 +1293,8 @@ GetPrefs(browser_context_))); if (prefs->IsTranslateAllowedByPolicy()) { language::LanguageModel* language_model = - LanguageModelFactory::GetForBrowserContext(browser_context_); + LanguageModelManagerFactory::GetForBrowserContext(browser_context_) + ->GetDefaultModel(); std::string locale = translate::TranslateManager::GetTargetLanguage( prefs.get(), language_model); base::string16 language =
diff --git a/chrome/browser/resource_coordinator/decision_details.cc b/chrome/browser/resource_coordinator/decision_details.cc index 2feba654..0c563bee 100644 --- a/chrome/browser/resource_coordinator/decision_details.cc +++ b/chrome/browser/resource_coordinator/decision_details.cc
@@ -32,6 +32,7 @@ "Tab is currently using WebSockets", "Tab is currently using WebUSB", "Tab is currently visible", + "Tab is currently using DevTools", }; static_assert(base::size(kDecisionFailureReasonStrings) == static_cast<size_t>(DecisionFailureReason::MAX), @@ -122,6 +123,9 @@ case DecisionFailureReason::LIVE_STATE_VISIBLE: ukm->SetFailureLiveStateVisible(1); break; + case DecisionFailureReason::LIVE_STATE_DEVTOOLS_OPEN: + ukm->SetFailureLiveStateDevToolsOpen(1); + break; case DecisionFailureReason::MAX: break; }
diff --git a/chrome/browser/resource_coordinator/decision_details.h b/chrome/browser/resource_coordinator/decision_details.h index 393c5b5..10614ca 100644 --- a/chrome/browser/resource_coordinator/decision_details.h +++ b/chrome/browser/resource_coordinator/decision_details.h
@@ -68,6 +68,8 @@ LIVE_STATE_USING_WEB_USB, // The tab is opted out of the intervention as it is currently visible. LIVE_STATE_VISIBLE, + // The tab is opted out of the intervention as it's currently using DevTools. + LIVE_STATE_DEVTOOLS_OPEN, // This must remain last. MAX, };
diff --git a/chrome/browser/resource_coordinator/decision_details_unittest.cc b/chrome/browser/resource_coordinator/decision_details_unittest.cc index a9135f2..4b55ca7 100644 --- a/chrome/browser/resource_coordinator/decision_details_unittest.cc +++ b/chrome/browser/resource_coordinator/decision_details_unittest.cc
@@ -201,6 +201,8 @@ EXPECT_FALSE( details.AddReason(DecisionFailureReason::LIVE_STATE_USING_WEB_USB)); EXPECT_FALSE(details.AddReason(DecisionFailureReason::LIVE_STATE_VISIBLE)); + EXPECT_FALSE( + details.AddReason(DecisionFailureReason::LIVE_STATE_DEVTOOLS_OPEN)); EXPECT_TRUE(details.AddReason( DecisionSuccessReason::LIFECYCLES_FEATURE_POLICY_OPT_IN)); @@ -250,6 +252,8 @@ entry, ukm_builder.kFailureLiveStateUsingWebUSBName, 1); ukm_recorder.ExpectEntryMetric(entry, ukm_builder.kFailureLiveStateVisibleName, 1); + ukm_recorder.ExpectEntryMetric( + entry, ukm_builder.kFailureLiveStateDevToolsOpenName, 1); EXPECT_FALSE(ukm_recorder.EntryHasMetric( entry, ukm_builder.kSuccessLifecyclesFeaturePolicyOptInName)); EXPECT_FALSE(ukm_recorder.EntryHasMetric(
diff --git a/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc b/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc index 119ff87b..9abb49c 100644 --- a/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc +++ b/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.cc
@@ -137,6 +137,13 @@ DCHECK(!db_) << "Database already open"; base::AssertBlockingAllowed(); + // Report the on disk size of the database if it already exists. + if (base::DirectoryExists(db_path_)) { + int64_t db_ondisk_size_in_bytes = base::ComputeDirectorySize(db_path_); + UMA_HISTOGRAM_MEMORY_KB("ResourceCoordinator.LocalDB.OnDiskSize", + db_ondisk_size_in_bytes / 1024); + } + leveldb_env::Options options; options.create_if_missing = true; leveldb::Status status =
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc index fefc9c2..293e08f 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
@@ -12,6 +12,7 @@ #include "base/metrics/histogram_macros.h" #include "base/optional.h" #include "base/process/process_metrics.h" +#include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" #include "chrome/browser/profiles/profile.h" @@ -425,21 +426,11 @@ return false; } - // We deliberately run through all of the logic without early termination. - // This ensures that the decision details lists all possible reasons that the - // transition can be denied. - if (GetWebContents()->GetVisibility() == content::Visibility::VISIBLE) decision_details->AddReason(DecisionFailureReason::LIVE_STATE_VISIBLE); - // Do not freeze tabs that are casting/mirroring/playing audio. - IsMediaTabImpl(decision_details); - - // Consult the local database to see if this tab could try to communicate with - // the user while in background (don't check for the visibility here as - // there's already a check for that above). - CheckIfTabCanCommunicateWithUserWhileInBackground(GetWebContents(), - decision_details); + CheckIfTabIsUsedInBackground(decision_details, + false /* urgent_intervention */); if (decision_details->reasons().empty()) { decision_details->AddReason( @@ -518,9 +509,6 @@ if (GetWebContents()->GetPageImportanceSignals().had_form_interaction) decision_details->AddReason(DecisionFailureReason::LIVE_STATE_FORM_ENTRY); - // Do not discard tabs that are casting/mirroring/playing audio. - IsMediaTabImpl(decision_details); - // Do not discard PDFs as they might contain entry that is not saved and they // don't remember their scrolling positions. See crbug.com/547286 and // crbug.com/65244. @@ -534,13 +522,8 @@ DecisionFailureReason::LIVE_STATE_EXTENSION_DISALLOWED); } - // Consult the local database to see if this tab could try to communicate with - // the user while in background (don't check for the visibility here as - // there's already a check for that above). - if (reason != DiscardReason::kUrgent) { - CheckIfTabCanCommunicateWithUserWhileInBackground(GetWebContents(), - decision_details); - } + CheckIfTabIsUsedInBackground(decision_details, + reason == DiscardReason::kUrgent); if (decision_details->reasons().empty()) { decision_details->AddReason( @@ -817,4 +800,32 @@ OnLifecycleUnitVisibilityChanged(visibility); } +void TabLifecycleUnitSource::TabLifecycleUnit::CheckIfTabIsUsedInBackground( + DecisionDetails* decision_details, + bool urgent_intervention) const { + DCHECK(decision_details); + + // We deliberately run through all of the logic without early termination. + // This ensures that the decision details lists all possible reasons that the + // transition can be denied. + + // Do not freeze tabs that are casting/mirroring/playing audio. + IsMediaTabImpl(decision_details); + + // Consult the local database to see if this tab could try to communicate with + // the user while in background (don't check for the visibility here as + // there's already a check for that above). Skip this test if this is an + // urgent intervention. + if (!urgent_intervention) { + CheckIfTabCanCommunicateWithUserWhileInBackground(GetWebContents(), + decision_details); + } + + // Do not freeze tabs that are currently using DevTools. + if (DevToolsWindow::GetInstanceForInspectedWebContents(GetWebContents())) { + decision_details->AddReason( + DecisionFailureReason::LIVE_STATE_DEVTOOLS_OPEN); + } +} + } // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.h b/chrome/browser/resource_coordinator/tab_lifecycle_unit.h index 58180ff..01aca6c 100644 --- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.h +++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.h
@@ -144,7 +144,13 @@ void DidStartLoading() override; void OnVisibilityChanged(content::Visibility visibility) override; - bool CanReloadBloatedTab(); + // Indicates if freezing or discarding this tab would be noticeable by the + // user even if it isn't brought back to the foreground. Populates + // |decision_details| with full details. |urgent_intervention| indicates if + // this is for an urgent intervention, in which case some heuristics will be + // skipped. + void CheckIfTabIsUsedInBackground(DecisionDetails* decision_details, + bool urgent_intervention) const; // List of observers to notify when the discarded state or the auto- // discardable state of this tab changes.
diff --git a/chrome/browser/resource_coordinator/tab_manager.h b/chrome/browser/resource_coordinator/tab_manager.h index 8208320..58fcdeb 100644 --- a/chrome/browser/resource_coordinator/tab_manager.h +++ b/chrome/browser/resource_coordinator/tab_manager.h
@@ -217,6 +217,7 @@ ProactiveFastShutdownWithBeforeunloadHandler); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ProactiveFastShutdownWithUnloadHandler); + FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ProtectDevToolsTabsFromDiscarding); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ProtectPDFPages); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ProtectRecentlyUsedTabs); FRIEND_TEST_ALL_PREFIXES(TabManagerTest, ProtectVideoTabs);
diff --git a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc index b4c44ebc..51175f0 100644 --- a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/test/simple_test_tick_clock.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/devtools/devtools_window_testing.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" #include "chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.h" @@ -605,6 +606,42 @@ EXPECT_TRUE(tab_manager()->DiscardTabImpl(DiscardReason::kProactive)); } +// Makes sure that tabs using DevTools are protected from discarding. +IN_PROC_BROWSER_TEST_F(TabManagerTest, ProtectDevToolsTabsFromDiscarding) { + // Get two tabs open, the second one being the foreground tab. + GURL test_page(ui_test_utils::GetTestUrl( + base::FilePath(), base::FilePath(FILE_PATH_LITERAL("simple.html")))); + ui_test_utils::NavigateToURL(browser(), test_page); + // Open a DevTools window for the first. + DevToolsWindow* devtool = DevToolsWindowTesting::OpenDevToolsWindowSync( + GetWebContentsAt(0), true /* is_docked */); + EXPECT_TRUE(devtool); + + GURL url2(chrome::kChromeUIAboutURL); + ui_test_utils::NavigateToURLWithDisposition( + browser(), GURL(chrome::kChromeUIAboutURL), + WindowOpenDisposition::NEW_FOREGROUND_TAB, + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + + // No discarding should be possible as the only background tab is currently + // using DevTools. + EXPECT_FALSE(tab_manager()->DiscardTabImpl(DiscardReason::kProactive)); + + // Close the DevTools window and repeat the test, this time use a non-docked + // window. + DevToolsWindowTesting::CloseDevToolsWindowSync(devtool); + devtool = DevToolsWindowTesting::OpenDevToolsWindowSync( + GetWebContentsAt(0), false /* is_docked */); + EXPECT_TRUE(devtool); + EXPECT_FALSE(tab_manager()->DiscardTabImpl(DiscardReason::kProactive)); + + // TODO(sebmarchand): Also ensure that the tab can't be frozen. + + // Close the DevTools window, ensure that the tab can be discarded. + DevToolsWindowTesting::CloseDevToolsWindowSync(devtool); + EXPECT_TRUE(tab_manager()->DiscardTabImpl(DiscardReason::kProactive)); +} + IN_PROC_BROWSER_TEST_F(TabManagerTest, CanPurgeBackgroundedRenderer) { // Open 2 tabs, the second one being in the background. ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js index 11b99c6..a9c840bf 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/automation_predicate.js
@@ -609,4 +609,16 @@ return node.role == Role.MATH || !!node.htmlAttributes['data-mathml']; }; +/** + * Matches against editable nodes, that should not be treated in the usual + * fashion. + * Instead, only output the contents around the selection in braille. + * @param {!AutomationNode} node + * @return {boolean} + */ +AutomationPredicate.shouldOnlyOutputSelectionChangeInBraille = function(node) { + return node.state[State.RICHLY_EDITABLE] && node.state[State.FOCUSED] && + node.role == Role.LOG; +}; + }); // goog.scope
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs index 45d15694..26279ec81 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -1363,6 +1363,7 @@ // Flaky. See http://crbug.com/857382. TEST_F('BackgroundTest', 'DISABLED_TextSelectionAndLiveRegion', function() { + DesktopAutomationHandler.announceActions = true; var mockFeedback = this.createMockFeedback(); this.runWithLoadedTree(function(root) {/*! <div><input value="test" type="text"></input></div>
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js index c1c6737..f96cb057 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/command_handler.js
@@ -1010,6 +1010,11 @@ chrome.automation.Restriction.READ_ONLY) return true; + // Skips customized keys if they get suppressed in speech. + if (AutomationPredicate.shouldOnlyOutputSelectionChangeInBraille( + textEditHandler.node)) + return true; + var isMultiline = AutomationPredicate.multiline(current.start.node); switch (command) { case 'previousCharacter':
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js index e2a94c42..8ddb5612 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/cursors.js
@@ -466,25 +466,28 @@ } break; } else if ( - newNode.role != RoleType.TEXT_FIELD && newNode.role != RoleType.INLINE_TEXT_BOX && - newNode.children[newIndex]) { + !newNode.state[StateType.EDITABLE] && newNode.children[newIndex]) { // Valid node offset. newNode = newNode.children[newIndex]; newIndex = 0; } else { // This offset is a text offset into the descendant visible // text. Approximate this by indexing into the inline text boxes. - var lines = newNode.findAll({role: RoleType.INLINE_TEXT_BOX}); + var lines = this.getAllLeaves_(newNode); if (!lines.length) break; var targetLine, targetIndex = 0; for (var i = 0, line, cur = 0; line = lines[i]; i++) { - cur += line.name.length; + var lineLength = line.name ? line.name.length : 1; + cur += lineLength; if (cur > newIndex) { targetLine = line; - targetIndex = newIndex - (cur - line.name.length); + if (!line.name) + targetIndex = cursors.NODE_INDEX; + else + targetIndex = newIndex - (cur - lineLength); break; } } @@ -492,7 +495,8 @@ // If we got here, that means the index is actually beyond the total // length of text. Just get the last line. targetLine = lines[lines.length - 1]; - targetIndex = targetLine.name.length; + targetIndex = + targetLine ? targetLine.name.length : cursors.NODE_INDEX; } newNode = targetLine; newIndex = targetIndex; @@ -509,6 +513,24 @@ */ isValid: function() { return this.node != null; + }, + + /** + * @private + * @param {!AutomationNode} node + * @return {!Array<!AutomationNode>} + */ + getAllLeaves_: function(node) { + var ret = []; + if (!node.firstChild) { + ret.push(node); + return ret; + } + + for (var i = 0; i < node.children.length; i++) + ret = ret.concat(this.getAllLeaves_(node.children[i])); + + return ret; } };
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js index eb1fbd2..ddd2ef9 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing.js
@@ -309,7 +309,10 @@ // During continuous read, skip speech (which gets handled in // CommandHandler). We use the speech end callback to trigger additional // speech. - if (ChromeVoxState.isReadingContinuously) { + // Also, skip speech based on the predicate. + if (ChromeVoxState.isReadingContinuously || + AutomationPredicate.shouldOnlyOutputSelectionChangeInBraille( + this.node_)) { this.brailleCurrentRichLine_(); this.updateIntraLineState_(cur); return;
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs index 7ade063d..6ecad019 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/editing_test.extjs
@@ -428,11 +428,12 @@ // no role). .expectSpeech('dog', 'Image', ' is a ', 'cat', 'Image', ' test') .expectBraille('dog img is a cat img test') + .clearPendingOutput() .call(moveByChar) .expectSpeech('dog', 'Image') - .expectBraille(lineText, {startIndex: 3, endIndex: 3}) + .expectBraille(lineOnDogText, {startIndex: 1, endIndex: 1}) .call(moveByChar) - .expectSpeech('i') + .expectSpeech('og ') .expectBraille(lineText, {startIndex: 4, endIndex: 4}) .call(moveByChar) .expectSpeech('s')
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html index 5905ba7..6448b98 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.html +++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.html
@@ -38,6 +38,7 @@ <include src="enrollment_license_card.html"> <include src="sync_consent.html"> <include src="demo_setup.html"> +<include src="demo_preferences.html"> <include src="recommend_apps.html"> <script src="chrome://oobe/custom_elements.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js index 4b00c7a..38f85db 100644 --- a/chrome/browser/resources/chromeos/login/custom_elements_oobe.js +++ b/chrome/browser/resources/chromeos/login/custom_elements_oobe.js
@@ -49,4 +49,5 @@ // <include src="enrollment_license_card.js"> // <include src="sync_consent.js"> // <include src="demo_setup.js"> +// <include src="demo_preferences.js"> // <include src="recommend_apps.js">
diff --git a/chrome/browser/resources/chromeos/login/demo_preferences.css b/chrome/browser/resources/chromeos/login/demo_preferences.css new file mode 100644 index 0000000..1148cf1 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/demo_preferences.css
@@ -0,0 +1,22 @@ +/* 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. */ + +:root { + --oobe-dialog-list-item-border: 1px solid rgba(0, 0, 0, 0.06); +} + +.language-selection-entry { + border-top: var(--oobe-dialog-list-item-border); + height: 44px; + padding: 0 10px; +} + +.language-selection-entry:last-of-type { + border-bottom: var(--oobe-dialog-list-item-border); +} + +.language-selection-title { + color: rgba(0, 0, 0, 0.87); + font: 13px Roboto, sans-serif; +}
diff --git a/chrome/browser/resources/chromeos/login/demo_preferences.html b/chrome/browser/resources/chromeos/login/demo_preferences.html new file mode 100644 index 0000000..207cc3c2 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/demo_preferences.html
@@ -0,0 +1,75 @@ +<link rel="import" href="chrome://resources/html/i18n_behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> + +<iron-iconset-svg name="demo-preferences-32" size="32"> + <svg> + <defs> + <g id="gear" fill="none" fill-rule="evenodd"> + <path d="M-3-3h32v32H-3z"></path> + <path fill="#1A73E8" fill-rule="nonzero" d="M22.52 14.248c.048-.4.08-.816.08-1.248 0-.432-.032-.848-.096-1.248l2.704-2.112a.661.661 0 0 0 .16-.816l-2.56-4.432a.65.65 0 0 0-.784-.288l-3.184 1.28a9.374 9.374 0 0 0-2.16-1.248L16.2.744A.639.639 0 0 0 15.56.2h-5.12a.623.623 0 0 0-.624.544l-.48 3.392a9.625 9.625 0 0 0-2.16 1.248l-3.184-1.28a.633.633 0 0 0-.784.288L.648 8.824a.62.62 0 0 0 .16.816l2.704 2.112c-.064.4-.112.832-.112 1.248 0 .416.032.848.096 1.248L.792 16.36a.661.661 0 0 0-.16.816l2.56 4.432a.65.65 0 0 0 .784.288l3.184-1.28a9.374 9.374 0 0 0 2.16 1.248l.48 3.392a.65.65 0 0 0 .64.544h5.12c.32 0 .592-.224.624-.544l.48-3.392a9.625 9.625 0 0 0 2.16-1.248l3.184 1.28c.288.112.624 0 .784-.288l2.56-4.432a.62.62 0 0 0-.16-.816l-2.672-2.112zM13 17.8c-2.64 0-4.8-2.16-4.8-4.8 0-2.64 2.16-4.8 4.8-4.8 2.64 0 4.8 2.16 4.8 4.8 0 2.64-2.16 4.8-4.8 4.8z"></path> + </g> + </defs> + </svg> +</iron-iconset-svg> + +<iron-iconset-svg name="demo-preferences-64" size="64"> + <svg> + <defs> + <g id="gear" fill="none" fill-rule="evenodd"> + <path d="M0 0h64v64H0z"></path> + <path fill="#1A73E8" fill-rule="nonzero" d="M51.04 34.496c.096-.8.16-1.632.16-2.496 0-.864-.064-1.696-.192-2.496l5.408-4.224c.48-.384.608-1.088.32-1.632l-5.12-8.864c-.32-.576-.992-.768-1.568-.576l-6.368 2.56c-1.344-1.024-2.752-1.856-4.32-2.496l-.96-6.784A1.277 1.277 0 0 0 37.12 6.4H26.88c-.64 0-1.152.448-1.248 1.088l-.96 6.784c-1.568.64-3.008 1.504-4.32 2.496l-6.368-2.56a1.265 1.265 0 0 0-1.568.576l-5.12 8.864c-.32.576-.192 1.248.32 1.632l5.408 4.224c-.128.8-.224 1.664-.224 2.496 0 .832.064 1.696.192 2.496L7.584 38.72c-.48.384-.608 1.088-.32 1.632l5.12 8.864c.32.576.992.768 1.568.576l6.368-2.56c1.344 1.024 2.752 1.856 4.32 2.496l.96 6.784c.128.64.64 1.088 1.28 1.088h10.24c.64 0 1.184-.448 1.248-1.088l.96-6.784c1.568-.64 3.008-1.504 4.32-2.496l6.368 2.56c.576.224 1.248 0 1.568-.576l5.12-8.864c.32-.576.192-1.248-.32-1.632l-5.344-4.224zM32 41.6c-5.28 0-9.6-4.32-9.6-9.6 0-5.28 4.32-9.6 9.6-9.6 5.28 0 9.6 4.32 9.6 9.6 0 5.28-4.32 9.6-9.6 9.6z"></path> + </g> + </defs> + </svg> +</iron-iconset-svg> + +<dom-module id="demo-preferences-md"> + <template> + <link rel="stylesheet" href="demo_preferences.css"> + <link rel="stylesheet" href="oobe_flex_layout.css"> + <oobe-dialog role="dialog" has-buttons + aria-label$="[[i18nDynamic(locale, 'demoPreferencesScreenTitle')]]"> + <hd-iron-icon slot="oobe-icon" + icon1x="demo-preferences-32:gear" icon2x="demo-preferences-64:gear"> + </hd-iron-icon> + <h1 slot="title"> + [[i18nDynamic(locale, 'demoPreferencesScreenTitle')]] + </h1> + <div slot="footer" class="layout vertical"> + <div id="languageDropdownContainer" class="flex layout center horizontal + justified language-selection-entry"> + <div class="language-selection-title layout vertical + center-justified"> + [[i18nDynamic(locale, 'languageDropdownTitle')]] + </div> + <oobe-i18n-dropdown id="languageSelect" items="[[languages]]" + label-for-aria="[[i18nDynamic(locale, 'languageDropdownLabel')]]" + on-select-item="onLanguageSelected_" class="focus-on-show"> + </oobe-i18n-dropdown> + </div> + <div id="keyboardDropdownContainer" class="flex layout center horizontal + justified language-selection-entry"> + <div class="language-selection-title layout vertical + center-justified"> + [[i18nDynamic(locale, 'keyboardDropdownTitle')]] + </div> + <oobe-i18n-dropdown id="keyboardSelect" items="[[keyboards]]" + label-for-aria="[[i18nDynamic(locale, 'keyboardDropdownLabel')]]" + on-select-item="onKeyboardSelected_"> + </oobe-i18n-dropdown> + </div> + </div> + <div slot="bottom-buttons" class="layout horizontal justified"> + <oobe-back-button inverse on-tap="onBackClicked_"> + </oobe-back-button> + <oobe-text-button inverse on-tap="onNextClicked_"> + <div> + [[i18nDynamic(locale, 'demoPreferencesNextButtonLabel')]] + </div> + </oobe-text-button> + </div> + </oobe-dialog> + </template> +</dom-module> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/demo_preferences.js b/chrome/browser/resources/chromeos/login/demo_preferences.js new file mode 100644 index 0000000..ca1b2809 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/demo_preferences.js
@@ -0,0 +1,156 @@ +// 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. + +Polymer({ + is: 'demo-preferences-md', + + behaviors: [I18nBehavior, OobeDialogHostBehavior], + + properties: { + /** Currently selected system language (display name). */ + currentLanguage: { + type: String, + value: '', + }, + + /** Currently selected input method (display name). */ + currentKeyboard: { + type: String, + value: '', + }, + + /** + * List of languages for language selector dropdown. + * @type {!Array<!OobeTypes.LanguageDsc>} + */ + languages: { + type: Array, + observer: 'onLanguagesChanged_', + }, + + /** + * List of keyboards for keyboard selector dropdown. + * @type {!Array<!OobeTypes.IMEDsc>} + */ + keyboards: { + type: Array, + observer: 'onKeyboardsChanged_', + }, + }, + + /** @override */ + ready: function() { + this.i18nUpdateLocale(); + + assert(loadTimeData); + var languageList = loadTimeData.getValue('languageList'); + this.setLanguageList_(languageList); + + var inputMethodsList = loadTimeData.getValue('inputMethodsList'); + this.setInputMethods_(inputMethodsList); + }, + + /** Called after resources are updated. */ + updateLocalizedContent: function() { + this.i18nUpdateLocale(); + }, + + /** + * Sets language list. + * @param {!Array<!OobeTypes.LanguageDsc>} languages + * @private + */ + setLanguageList_: function(languages) { + this.languages = languages; + }, + + /** + * Sets input methods. + * @param {!Array<!OobeTypes.IMEDsc>} inputMethods + * @private + */ + setInputMethods_: function(inputMethods) { + this.keyboards = inputMethods; + }, + + /** + * Sets selected keyboard. + * @param {string} keyboardId + * @private + */ + setSelectedKeyboard_: function(keyboardId) { + var found = false; + for (var keyboard of this.keyboards) { + if (keyboard.value != keyboardId) { + keyboard.selected = false; + continue; + } + keyboard.selected = true; + found = true; + } + if (!found) + return; + + // Force i18n-dropdown to refresh. + this.keyboards = this.keyboards.slice(); + this.onKeyboardsChanged_(); + }, + + /** + * Handle language selection. + * @param {!{detail: {!OobeTypes.LanguageDsc}}} event + * @private + */ + onLanguageSelected_: function(event) { + var item = event.detail; + var languageId = item.value; + this.currentLanguage = item.title; + this.screen.onLanguageSelected_(languageId); + }, + + /** + * Handle keyboard layout selection. + * @param {!{detail: {!OobeTypes.IMEDsc}}} event + * @private + */ + onKeyboardSelected_: function(event) { + var item = event.detail; + var inputMethodId = item.value; + this.currentKeyboard = item.title; + this.screen.onKeyboardSelected_(inputMethodId); + }, + + /** + * Language changes handler. + * @private + */ + onLanguagesChanged_: function() { + this.currentLanguage = getSelectedTitle(this.languages); + }, + + /** + * Keyboard changes handler. + * @private + */ + onKeyboardsChanged_: function() { + this.currentKeyboard = getSelectedTitle(this.keyboards); + }, + + /** + * Back button click handler. + * @private + */ + onBackClicked_: function() { + chrome.send('login.DemoPreferencesScreen.userActed', ['close-setup']); + }, + + /** + * Next button click handler. + * @private + */ + onNextClicked_: function() { + chrome.send('login.DemoPreferencesScreen.userActed', ['continue-setup']); + }, + +});
diff --git a/chrome/browser/resources/chromeos/login/demo_setup.js b/chrome/browser/resources/chromeos/login/demo_setup.js index e7eeee4..d49eb2a 100644 --- a/chrome/browser/resources/chromeos/login/demo_setup.js +++ b/chrome/browser/resources/chromeos/login/demo_setup.js
@@ -40,6 +40,11 @@ this.showScreen_(this.screens_[0]); }, + /** Called after resources are updated. */ + updateLocalizedContent: function() { + this.i18nUpdateLocale(); + }, + /** * Called when demo mode setup finished. * @param {string} isSuccess Whether demo setup finished successfully.
diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js index 69ff80f..69103bb 100644 --- a/chrome/browser/resources/chromeos/login/oobe.js +++ b/chrome/browser/resources/chromeos/login/oobe.js
@@ -18,6 +18,7 @@ // <include src="oobe_screen_welcome.js"> // <include src="oobe_screen_update.js"> // <include src="oobe_screen_demo_setup.js"> +// <include src="oobe_screen_demo_preferences.js"> cr.define('cr.ui.Oobe', function() { return { @@ -59,6 +60,7 @@ login.VoiceInteractionValuePropScreen.register(); login.WaitForContainerReadyScreen.register(); login.DemoSetupScreen.register(); + login.DemoPreferencesScreen.register(); cr.ui.Bubble.decorate($('bubble-persistent')); $('bubble-persistent').persistent = true;
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_demo_preferences.html b/chrome/browser/resources/chromeos/login/oobe_screen_demo_preferences.html new file mode 100644 index 0000000..d7d1d032 --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_screen_demo_preferences.html
@@ -0,0 +1,3 @@ +<div class="step hidden right" id="demo-preferences" role="group" hidden> + <demo-preferences-md id="demo-preferences-content"></demo-preferences-md> +</div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_demo_preferences.js b/chrome/browser/resources/chromeos/login/oobe_screen_demo_preferences.js new file mode 100644 index 0000000..005f1bdc --- /dev/null +++ b/chrome/browser/resources/chromeos/login/oobe_screen_demo_preferences.js
@@ -0,0 +1,53 @@ +// 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 Demo mode preferences screen implementation. + */ + +login.createScreen('DemoPreferencesScreen', 'demo-preferences', function() { + var CONTEXT_KEY_LOCALE = 'locale'; + var CONTEXT_KEY_INPUT_METHOD = 'input-method'; + + return { + /** @override */ + decorate: function() { + var demoPreferences = $('demo-preferences-content'); + demoPreferences.screen = this; + + this.context.addObserver( + CONTEXT_KEY_INPUT_METHOD, function(inputMethodId) { + $('demo-preferences-content').setSelectedKeyboard(inputMethodId); + }); + }, + + /** Returns a control which should receive an initial focus. */ + get defaultControl() { + return $('demo-preferences-content'); + }, + + /** Called after resources are updated. */ + updateLocalizedContent: function() { + $('demo-preferences-content').updateLocalizedContent(); + }, + + /** + * Called when language was selected. + * @param {string} languageId Id of the selected language. + */ + onLanguageSelected_: function(languageId) { + this.context.set(CONTEXT_KEY_LOCALE, languageId); + this.commitContextChanges(); + }, + + /** + * Called when keyboard was selected. + * @param {string} inputMethodId Id of the selected input method. + */ + onKeyboardSelected_: function(inputMethodId) { + this.context.set(CONTEXT_KEY_INPUT_METHOD, inputMethodId); + this.commitContextChanges(); + }, + }; +});
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js b/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js index 53cfddf..c9d7e4f 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js +++ b/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js
@@ -10,10 +10,16 @@ return { EXTERNAL_API: ['onSetupFinished'], + /** Returns a control which should receive an initial focus. */ get defaultControl() { return $('demo-setup-content'); }, + /** Called after resources are updated. */ + updateLocalizedContent: function() { + $('demo-setup-content').updateLocalizedContent(); + }, + /** @override */ onBeforeShow: function(data) { $('demo-setup-content').reset();
diff --git a/chrome/browser/resources/chromeos/login/oobe_screens.html b/chrome/browser/resources/chromeos/login/oobe_screens.html index cd6a766..702f7eab 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screens.html +++ b/chrome/browser/resources/chromeos/login/oobe_screens.html
@@ -14,6 +14,7 @@ <include src="oobe_screen_voice_interaction_value_prop.html"> <include src="oobe_screen_wait_for_container_ready.html"> <include src="oobe_screen_demo_setup.html"> +<include src="oobe_screen_demo_preferences.html"> <include src="../../../../../ui/login/account_picker/md_screen_account_picker.html"> <include src="screen_error_message.html"> <include src="screen_arc_terms_of_service.html">
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js index bac8230..1c83f90 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/constants.js
@@ -114,5 +114,11 @@ /** * The filename prefix for a third party wallpaper. */ - ThirdPartyWallpaperPrefix: 'third_party_' + ThirdPartyWallpaperPrefix: 'third_party_', + + /** + * The name of the custom event that's fired when the wallpaper is changed by + * third-party apps. + */ + WallpaperChangedBy3rdParty: 'wallpaperChangedBy3rdParty' };
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js index 5bcb4a6..85bef1e6 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/event_page.js
@@ -654,13 +654,25 @@ WallpaperUtil.saveToSyncStorage( Constants.AccessSyncSurpriseMeEnabledKey, false); }); - SurpriseWallpaper.getInstance().disable(); // Make third party wallpaper syncable through different devices. - var filename = Constants.ThirdPartyWallpaperPrefix + new Date().getTime(); - var thumbnailFilename = filename + Constants.CustomWallpaperThumbnailSuffix; - WallpaperUtil.storeWallpaperToSyncFS(filename, wallpaper); - WallpaperUtil.storeWallpaperToSyncFS(thumbnailFilename, thumbnail); + var fileName = Constants.ThirdPartyWallpaperPrefix + new Date().getTime(); + var thumbnailFileName = fileName + Constants.CustomWallpaperThumbnailSuffix; + WallpaperUtil.storeWallpaperToSyncFS(fileName, wallpaper); + WallpaperUtil.storeWallpaperToSyncFS(thumbnailFileName, thumbnail); WallpaperUtil.saveWallpaperInfo( - filename, layout, Constants.WallpaperSourceEnum.ThirdParty, appName); + fileName, layout, Constants.WallpaperSourceEnum.ThirdParty, appName); + + getWallpaperPickerInfo((useNewWallpaperPicker, highResolutionSuffix) => { + if (!useNewWallpaperPicker) { + SurpriseWallpaper.getInstance().disable(); + return; + } + if (wallpaperPickerWindow) { + var event = new CustomEvent( + Constants.WallpaperChangedBy3rdParty, + {detail: {wallpaperFileName: fileName}}); + wallpaperPickerWindow.contentWindow.dispatchEvent(event); + } + }); });
diff --git a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js index 1a4fea87..1e0ff07 100644 --- a/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js +++ b/chrome/browser/resources/chromeos/wallpaper_manager/js/wallpaper_manager.js
@@ -505,6 +505,13 @@ $('close-button').addEventListener('click', function() { window.close(); }); + window.addEventListener(Constants.WallpaperChangedBy3rdParty, e => { + this.currentWallpaper_ = e.detail.wallpaperFileName; + this.decorateCurrentWallpaperInfoBar_(); + // Clear the check mark (if any). Do not try to locate the new wallpaper + // in the picker to avoid changing the selected category abruptly. + this.wallpaperGrid_.selectedItem = null; + }); } else { $('window-close-button').addEventListener('click', function() { window.close();
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css index c04d74c6b..836f9992 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.css +++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -4,6 +4,7 @@ html { /* Material Design constants */ + --md-fallback-letter-size: 17px; --md-favicon-size: 16px; --md-icon-margin-bottom: 16px; --md-icon-size: 40px; @@ -452,16 +453,6 @@ margin-bottom: var(--md-icon-margin-bottom); } -.md-icon-background { - align-items: center; - background-color: rgb(241, 243, 244); - border-radius: 50%; - display: flex; - height: var(--md-icon-size); - justify-content: center; - width: var(--md-icon-size); -} - .md-favicon { pointer-events: none; } @@ -471,16 +462,24 @@ width: 100%; } -.md-favicon.failed-favicon { - background-image: -webkit-image-set( - url(chrome-search://local-ntp/images/ntp_default_favicon.png) 1x, - url(chrome-search://local-ntp/images/ntp_default_favicon.png@2x) 2x); - background-repeat: no-repeat; - background-size: var(--md-favicon-size) var(--md-favicon-size); +.md-fallback-background { + align-items: center; + background-color: rgb(136, 136, 136); + border-radius: 50%; + display: flex; + height: var(--md-icon-size); + justify-content: center; + width: var(--md-icon-size); } -.md-favicon.failed-favicon img { - display: none; +.md-fallback-letter { + color: white; + font-family: sans-serif; + font-size: var(--md-fallback-letter-size); + height: var(--md-fallback-letter-size); + line-height: var(--md-fallback-letter-size); + text-align: center; + width: var(--md-fallback-letter-size); } .md-title-container {
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js index b239204..91aac5b 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.js +++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -14,9 +14,11 @@ */ const CLASSES = { FAILED_FAVICON: 'failed-favicon', // Applied when the favicon fails to load. - MATERIAL_DESIGN: 'md', // Applies Material Design styles to the page. // Material Design classes. + MATERIAL_DESIGN: 'md', // Applies Material Design styles to the page. MD_EMPTY_TILE: 'md-empty-tile', + MD_FALLBACK_BACKGROUND: 'md-fallback-background', + MD_FALLBACK_LETTER: 'md-fallback-letter', MD_FAVICON: 'md-favicon', MD_LINK: 'md-link', MD_ICON: 'md-icon', @@ -596,8 +598,6 @@ let mdIcon = document.createElement('div'); mdIcon.className = CLASSES.MD_ICON; - let mdIconBackground = document.createElement('div'); - mdIconBackground.className = CLASSES.MD_ICON_BACKGROUND; let mdFavicon = document.createElement('div'); mdFavicon.className = CLASSES.MD_FAVICON; @@ -621,8 +621,17 @@ countLoad(); }); fi.addEventListener('error', function(ev) { + let fallbackBackground = document.createElement('div'); + fallbackBackground.className = CLASSES.MD_FALLBACK_BACKGROUND; + let fallbackLetter = document.createElement('div'); + fallbackLetter.className = CLASSES.MD_FALLBACK_LETTER; + fallbackLetter.innerText = data.title.charAt(0).toUpperCase(); mdFavicon.classList.add(CLASSES.FAILED_FAVICON); + + fallbackBackground.appendChild(fallbackLetter); mdFavicon.removeChild(fi); + mdFavicon.appendChild(fallbackBackground); + // Store the type for a potential later navigation. tileType = TileVisualType.ICON_DEFAULT; logMostVisitedImpression( @@ -634,8 +643,7 @@ }); mdFavicon.appendChild(fi); - mdIconBackground.appendChild(mdFavicon); - mdIcon.appendChild(mdIconBackground); + mdIcon.appendChild(mdFavicon); mdTileInner.appendChild(mdIcon); let mdTitleContainer = document.createElement('div');
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index a53dacce..0391630 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -47,7 +47,6 @@ #include "components/sessions/core/serialized_navigation_entry_test_helper.h" #include "components/sessions/core/session_types.h" #include "components/sessions/core/tab_restore_service.h" -#include "components/sync/protocol/session_specifics.pb.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/notification_service.h" @@ -686,24 +685,24 @@ IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreForeignTab) { GURL url1("http://google.com"); GURL url2("http://google2.com"); - SerializedNavigationEntry nav1 = - SerializedNavigationEntryTestHelper::CreateNavigation(url1.spec(), "one"); - SerializedNavigationEntry nav2 = - SerializedNavigationEntryTestHelper::CreateNavigation(url2.spec(), "two"); // Set up the restore data. - sync_pb::SessionTab sync_data; - sync_data.set_tab_visual_index(0); - sync_data.set_current_navigation_index(1); - sync_data.set_pinned(false); - sync_data.add_navigation()->CopyFrom(nav1.ToSyncData()); - sync_data.add_navigation()->CopyFrom(nav2.ToSyncData()); - sessions::SessionTab tab; - tab.SetFromSyncData(sync_data, base::Time::Now()); - EXPECT_EQ(2U, tab.navigations.size()); - for (size_t i = 0; i < tab.navigations.size(); ++i) - EXPECT_FALSE(tab.navigations[i].timestamp().is_null()); + tab.tab_visual_index = 0; + tab.current_navigation_index = 1; + tab.pinned = false; + tab.navigations.push_back( + SerializedNavigationEntryTestHelper::CreateNavigation(url1.spec(), + "one")); + tab.navigations.push_back( + SerializedNavigationEntryTestHelper::CreateNavigation(url2.spec(), + "two")); + + for (size_t i = 0; i < tab.navigations.size(); ++i) { + ASSERT_FALSE(tab.navigations[i].timestamp().is_null()); + tab.navigations[i].set_index(i); + tab.navigations[i].set_encoded_page_state(""); + } ASSERT_EQ(1, browser()->tab_strip_model()->count()); @@ -782,27 +781,27 @@ // Set up the restore data -- one window with two tabs. std::vector<const sessions::SessionWindow*> session; sessions::SessionWindow window; - auto tab1 = std::make_unique<sessions::SessionTab>(); { - sync_pb::SessionTab sync_data; - sync_data.set_tab_visual_index(0); - sync_data.set_current_navigation_index(0); - sync_data.set_pinned(true); - sync_data.add_navigation()->CopyFrom(nav1.ToSyncData()); - tab1->SetFromSyncData(sync_data, base::Time::Now()); + auto tab1 = std::make_unique<sessions::SessionTab>(); + tab1->tab_visual_index = 0; + tab1->current_navigation_index = 0; + tab1->pinned = true; + tab1->navigations.push_back( + sessions::SerializedNavigationEntryTestHelper::CreateNavigation( + url1.spec(), "one")); + window.tabs.push_back(std::move(tab1)); } - window.tabs.push_back(std::move(tab1)); - auto tab2 = std::make_unique<sessions::SessionTab>(); { - sync_pb::SessionTab sync_data; - sync_data.set_tab_visual_index(1); - sync_data.set_current_navigation_index(0); - sync_data.set_pinned(false); - sync_data.add_navigation()->CopyFrom(nav2.ToSyncData()); - tab2->SetFromSyncData(sync_data, base::Time::Now()); + auto tab2 = std::make_unique<sessions::SessionTab>(); + tab2->tab_visual_index = 1; + tab2->current_navigation_index = 0; + tab2->pinned = false; + tab2->navigations.push_back( + sessions::SerializedNavigationEntryTestHelper::CreateNavigation( + url2.spec(), "two")); + window.tabs.push_back(std::move(tab2)); } - window.tabs.push_back(std::move(tab2)); // Leave a third tab empty. Should have no effect on restored session, but // simulates partially complete foreign session data.
diff --git a/chrome/browser/sync/profile_sync_service_android.cc b/chrome/browser/sync/profile_sync_service_android.cc index 2f10932..824cb0f4 100644 --- a/chrome/browser/sync/profile_sync_service_android.cc +++ b/chrome/browser/sync/profile_sync_service_android.cc
@@ -20,6 +20,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/signin/unified_consent_helper.h" #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/common/channel_info.h" @@ -34,6 +35,7 @@ #include "components/sync/driver/sync_service_utils.h" #include "components/sync/engine/net/network_resources.h" #include "components/sync/syncable/read_transaction.h" +#include "components/unified_consent/url_keyed_data_collection_consent_helper.h" #include "content/public/browser/browser_thread.h" #include "google/cacheinvalidation/types.pb.h" #include "google_apis/gaia/gaia_constants.h" @@ -48,6 +50,7 @@ using base::android::ScopedJavaLocalRef; using browser_sync::ProfileSyncService; using content::BrowserThread; +using unified_consent::UrlKeyedDataCollectionConsentHelper; namespace { @@ -358,13 +361,17 @@ return sync_service_->HasUnrecoverableError(); } -jint ProfileSyncServiceAndroid::GetUploadToGoogleState( +jboolean ProfileSyncServiceAndroid::IsUrlKeyedAnonymizedDataCollectionEnabled( JNIEnv* env, - const JavaParamRef<jobject>&, - jint model_type) { + const base::android::JavaParamRef<jobject>& obj) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - return static_cast<int>(syncer::GetUploadToGoogleState( - sync_service_, static_cast<syncer::ModelType>(model_type))); + bool is_unified_consent_enabled = IsUnifiedConsentEnabled(profile_); + PrefService* pref_service = profile_->GetPrefs(); + std::unique_ptr<UrlKeyedDataCollectionConsentHelper> + unified_consent_url_helper = UrlKeyedDataCollectionConsentHelper:: + NewAnonymizedDataCollectionConsentHelper(is_unified_consent_enabled, + pref_service, sync_service_); + return unified_consent_url_helper->IsEnabled(); } jint ProfileSyncServiceAndroid::GetProtocolErrorClientAction(
diff --git a/chrome/browser/sync/profile_sync_service_android.h b/chrome/browser/sync/profile_sync_service_android.h index da9240ac..20c80854 100644 --- a/chrome/browser/sync/profile_sync_service_android.h +++ b/chrome/browser/sync/profile_sync_service_android.h
@@ -122,9 +122,9 @@ jboolean HasUnrecoverableError( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); - jint GetUploadToGoogleState(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jint model_type); + jboolean IsUrlKeyedAnonymizedDataCollectionEnabled( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); // Gets SyncProtocolError.ClientAction. jint GetProtocolErrorClientAction(
diff --git a/chrome/browser/translate/chrome_translate_client.cc b/chrome/browser/translate/chrome_translate_client.cc index 90011c3..b460ef8e 100644 --- a/chrome/browser/translate/chrome_translate_client.cc +++ b/chrome/browser/translate/chrome_translate_client.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/infobars/infobar_service.h" -#include "chrome/browser/language/language_model_factory.h" +#include "chrome/browser/language/language_model_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/user_event_service_factory.h" #include "chrome/browser/translate/translate_accept_languages_factory.h" @@ -30,6 +30,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/common/pref_names.h" #include "chrome/grit/theme_resources.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/prefs/pref_service.h" #include "components/sync/driver/sync_driver_switches.h" #include "components/sync/protocol/user_event_specifics.pb.h" @@ -118,8 +119,9 @@ this, translate::TranslateRankerFactory::GetForBrowserContext( web_contents->GetBrowserContext()), - LanguageModelFactory::GetForBrowserContext( - web_contents->GetBrowserContext()))) { + LanguageModelManagerFactory::GetForBrowserContext( + web_contents->GetBrowserContext()) + ->GetDefaultModel())) { translate_driver_.AddObserver(this); translate_driver_.set_translate_manager(translate_manager_.get()); } @@ -207,8 +209,9 @@ } *target = translate::TranslateManager::GetTargetLanguage( - translate_prefs.get(), - LanguageModelFactory::GetInstance()->GetForBrowserContext(profile)); + translate_prefs.get(), LanguageModelManagerFactory::GetInstance() + ->GetForBrowserContext(profile) + ->GetDefaultModel()); } void ChromeTranslateClient::RecordTranslateEvent(
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index f831b225..2bbdeb17 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1989,6 +1989,8 @@ "webui/chromeos/login/controller_pairing_screen_handler.h", "webui/chromeos/login/core_oobe_handler.cc", "webui/chromeos/login/core_oobe_handler.h", + "webui/chromeos/login/demo_preferences_screen_handler.cc", + "webui/chromeos/login/demo_preferences_screen_handler.h", "webui/chromeos/login/demo_setup_screen_handler.cc", "webui/chromeos/login/demo_setup_screen_handler.h", "webui/chromeos/login/device_disabled_screen_handler.cc",
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h b/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h index fd13e07..cff0476 100644 --- a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h +++ b/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h
@@ -51,7 +51,14 @@ - (void)requestSuggestionsForText:(NSString*)text inRange:(NSRange)range API_AVAILABLE(macos(10.12.2)); -- (void)replaceSelectedText:(NSString*)text; +// Select the range of the editing word and replace it with a suggestion +// from the touch bar. +- (void)replaceEditingWordWithSuggestion:(NSString*)text; + +// Returns a range from start to the end of the word that the cursor is +// currently in. +- (NSRange)editingWordRangeFromText:(NSString*)text + cursorPosition:(size_t)cursor; @end
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm b/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm index ae63e77..bdf8a012 100644 --- a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm +++ b/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm
@@ -4,6 +4,7 @@ #import "chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h" +#include "base/i18n/break_iterator.h" #include "base/strings/sys_string_conversions.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" @@ -65,6 +66,12 @@ // The currently selected range. If the range has length = 0, it is simply a // cursor position. NSRange selectionRange_; + + // The range of the word that's currently being edited. Used when replacing + // the current editing word with a selected suggestion. If length = 0, there + // is no word currently being edited and the suggestion will be placed at the + // cursor. + NSRange editingWordRange_; } @end @@ -124,13 +131,15 @@ return; NSTextCheckingResult* selectedResult = anItem.candidates[index]; - [self replaceSelectedText:[selectedResult replacementString]]; + [self replaceEditingWordWithSuggestion:[selectedResult replacementString]]; } - (void)webContentsTextSelectionChanged:(NSString*)text range:(NSRange)range { if (webContents_->IsFocusedElementEditable()) { [self setText:text]; selectionRange_ = range; + editingWordRange_ = + [self editingWordRangeFromText:text cursorPosition:range.location]; [self requestSuggestionsForText:text inRange:range]; } else { [controller_ invalidateTouchBar]; @@ -142,6 +151,7 @@ // TODO(tnijssen): Actually request the current text and cursor position. [self setText:@""]; selectionRange_ = NSMakeRange(0, 0); + editingWordRange_ = NSMakeRange(0, 0); [self requestSuggestionsForText:@"" inRange:NSMakeRange(0, 0)]; } } @@ -162,12 +172,43 @@ }]; } -- (void)replaceSelectedText:(NSString*)text { - // TODO(tnijssen): Create a method that replaces a range of text within - // WebContents rather than relying on WebContents::Replace() which doesn't. +- (void)replaceEditingWordWithSuggestion:(NSString*)text { + // If the editing word is not selected in its entirety, modify the selection + // to cover the current editing word. + if (!NSEqualRanges(editingWordRange_, selectionRange_)) { + int start_adjust = editingWordRange_.location - selectionRange_.location; + int end_adjust = (editingWordRange_.location + editingWordRange_.length) - + (selectionRange_.location + selectionRange_.length); + webContents_->AdjustSelectionByCharacterOffset(start_adjust, end_adjust, + false); + } webContents_->Replace(base::SysNSStringToUTF16(text)); } +- (NSRange)editingWordRangeFromText:(NSString*)text + cursorPosition:(size_t)cursor { + // The cursor should not be off the end of the text. + DCHECK(cursor <= [text length]); + + base::i18n::BreakIterator iter(base::SysNSStringToUTF16(text), + base::i18n::BreakIterator::BREAK_WORD); + DCHECK(iter.Init()); + + // Repeat iter.Advance() until end of line is reached or + // current iterator position passes cursor position. + while (iter.pos() < cursor && iter.Advance()) { + } + + // If BreakIterator stopped at the end of a word, the cursor is in/at the end + // of a word so we return [word start, word end] + if (iter.IsWord()) + return NSMakeRange(iter.prev(), iter.pos() - iter.prev()); + + // Otherwise, we are not currently in a word, so we return + // [cursor position, cursor position] + return NSMakeRange(cursor, 0); +} + - (void)setText:(NSString*)text { text_.reset([text copy]); }
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm b/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm new file mode 100644 index 0000000..85b47ed --- /dev/null +++ b/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm
@@ -0,0 +1,101 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <Cocoa/Cocoa.h> + +#include "base/strings/sys_string_conversions.h" +#import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h" +#import "chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/range/range.h" + +const std::string kEmptyText = ""; +const std::string kWord = "hello"; +const std::string kWordWithTrailingWhitespace = "hello "; +const std::string kWordWithLeadingWhitespace = " hello"; +const std::string kMultipleWords = "hello world"; + +class SuggestedTextTouchBarControllerUnitTest : public CocoaTest { + public: + void SetUp() override { + CocoaTest::SetUp(); + controller_ = [[SuggestedTextTouchBarController alloc] init]; + } + + gfx::Range GetEditingWordRange(std::string text, size_t cursor) { + NSRange range = + [controller_ editingWordRangeFromText:base::SysUTF8ToNSString(text) + cursorPosition:cursor]; + return gfx::Range(range); + } + + private: + SuggestedTextTouchBarController* controller_; // weak. +}; + +// Tests that the proper range representing the location of the editing word is +// calculated for a given text and cursor position. +TEST_F(SuggestedTextTouchBarControllerUnitTest, EditingWordRangeTest) { + // Test that the editing word range is simply the cursor position if there + // is no text. + EXPECT_EQ(gfx::Range(0, 0), GetEditingWordRange(kEmptyText, 0)); + + // Test that the editing word range contains the full word as the cursor moves + // through a word without breaks. + EXPECT_EQ(gfx::Range(0, 0), GetEditingWordRange(kWord, 0)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 1)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 2)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 3)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 4)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 5)); + + // Tests that the editing word range changes properly as the cursor moves from + // non-word to word characters. + EXPECT_EQ(gfx::Range(0, 0), + GetEditingWordRange(kWordWithLeadingWhitespace, 0)); + EXPECT_EQ(gfx::Range(1, 1), + GetEditingWordRange(kWordWithLeadingWhitespace, 1)); + EXPECT_EQ(gfx::Range(1, 6), + GetEditingWordRange(kWordWithLeadingWhitespace, 2)); + EXPECT_EQ(gfx::Range(1, 6), + GetEditingWordRange(kWordWithLeadingWhitespace, 3)); + EXPECT_EQ(gfx::Range(1, 6), + GetEditingWordRange(kWordWithLeadingWhitespace, 4)); + EXPECT_EQ(gfx::Range(1, 6), + GetEditingWordRange(kWordWithLeadingWhitespace, 5)); + EXPECT_EQ(gfx::Range(1, 6), + GetEditingWordRange(kWordWithLeadingWhitespace, 6)); + + // Tests that the editing word range changes properly as the cursor moves from + // word to non-word characters. + EXPECT_EQ(gfx::Range(0, 0), + GetEditingWordRange(kWordWithTrailingWhitespace, 0)); + EXPECT_EQ(gfx::Range(0, 5), + GetEditingWordRange(kWordWithTrailingWhitespace, 1)); + EXPECT_EQ(gfx::Range(0, 5), + GetEditingWordRange(kWordWithTrailingWhitespace, 2)); + EXPECT_EQ(gfx::Range(0, 5), + GetEditingWordRange(kWordWithTrailingWhitespace, 3)); + EXPECT_EQ(gfx::Range(0, 5), + GetEditingWordRange(kWordWithTrailingWhitespace, 4)); + EXPECT_EQ(gfx::Range(0, 5), + GetEditingWordRange(kWordWithTrailingWhitespace, 5)); + EXPECT_EQ(gfx::Range(6, 6), + GetEditingWordRange(kWordWithTrailingWhitespace, 6)); + + // Tests that the editing word range changes properly as the cursor moves from + // word to non-word and back to word characters. + EXPECT_EQ(gfx::Range(0, 0), GetEditingWordRange(kMultipleWords, 0)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kMultipleWords, 1)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kMultipleWords, 2)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kMultipleWords, 3)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kMultipleWords, 4)); + EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kMultipleWords, 5)); + EXPECT_EQ(gfx::Range(6, 6), GetEditingWordRange(kMultipleWords, 6)); + EXPECT_EQ(gfx::Range(6, 11), GetEditingWordRange(kMultipleWords, 7)); + EXPECT_EQ(gfx::Range(6, 11), GetEditingWordRange(kMultipleWords, 8)); + EXPECT_EQ(gfx::Range(6, 11), GetEditingWordRange(kMultipleWords, 9)); + EXPECT_EQ(gfx::Range(6, 11), GetEditingWordRange(kMultipleWords, 10)); + EXPECT_EQ(gfx::Range(6, 11), GetEditingWordRange(kMultipleWords, 11)); +} \ No newline at end of file
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc b/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc index d0a8ec9..4a553bdb 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc
@@ -234,15 +234,7 @@ network::ResourceResponseHead resource_response; resource_response.mime_type = "text/html"; resource_response.ssl_info = ssl_info; - - mojo::ScopedDataPipeProducerHandle producer; - mojo::ScopedDataPipeConsumerHandle consumer; - EXPECT_EQ(MOJO_RESULT_OK, - mojo::CreateDataPipe(nullptr, &producer, &consumer)); - params->client->OnReceiveResponse(resource_response); - params->client->OnStartLoadingResponseBody(std::move(consumer)); - network::URLLoaderCompletionStatus completion_status; completion_status.ssl_info = ssl_info; params->client->OnComplete(completion_status);
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc index c03a9d0d..7ddca684 100644 --- a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
@@ -282,20 +282,27 @@ // static bool ZoomBubbleView::CanRefresh(const content::WebContents* web_contents) { - Browser* browser = chrome::FindBrowserWithWebContents(web_contents); - if (!browser) + // Can't refresh when there's not already a bubble for this tab. + if (!zoom_bubble_ || (zoom_bubble_->web_contents() != web_contents)) return false; - const views::View* anchor_view = GetAnchorViewForBrowser(browser); + Browser* browser = chrome::FindBrowserWithWebContents(web_contents); + if (!browser || + (zoom_bubble_->GetAnchorView() != GetAnchorViewForBrowser(browser))) + return false; + const extensions::ExtensionZoomRequestClient* client = GetExtensionZoomRequestClient(web_contents); - // If the bubble is already showing in this window and the zoom change was not - // initiated by an extension that needs attribution in the zoom bubble, then - // the bubble can be reused and only the label text needs to be updated. - return zoom_bubble_ && zoom_bubble_->web_contents() == web_contents && - zoom_bubble_->GetAnchorView() == anchor_view && - (!client || client->ShouldSuppressBubble()); + // Allow refreshes when the client won't create its own bubble; otherwise + // the existing bubble would show the wrong zoom value. + if (client && client->ShouldSuppressBubble()) + return true; + + // Allow refreshes when the existing bubble has the same attribution for + // the zoom change, so only the label needs updating. + return zoom_bubble_->extension_info_.id == + (client ? client->extension()->id() : std::string()); } // static
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc index c0803f9..96d6b0e 100644 --- a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
@@ -273,6 +273,72 @@ EXPECT_NE(new_label, old_label); } +class ZoomBubbleReuseTest : public ZoomBubbleBrowserTest { + protected: + // Performs two zoom changes by these respective clients (where nullptr + // represents a user initiated zoom). Returns true if the zoom change by + // |client2| reused the bubble from the zoom change by |client1|. + bool IsBubbleReused(scoped_refptr<const TestZoomRequestClient> client1, + scoped_refptr<const TestZoomRequestClient> client2) { + // This test would be inconclusive for clients that do not create bubbles. + // See BubbleSuppressingExtensionRefreshesExistingBubble instead. + DCHECK(!client1 || !client1->ShouldSuppressBubble()); + DCHECK(!client2 || !client2->ShouldSuppressBubble()); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + zoom::ZoomController* zoom_controller = + zoom::ZoomController::FromWebContents(web_contents); + EXPECT_TRUE(zoom_controller); + + const double starting_zoom_level = zoom_controller->GetZoomLevel(); + const double zoom_level1 = starting_zoom_level + 0.5; + const double zoom_level2 = zoom_level1 + 0.5; + + zoom_controller->SetZoomLevelByClient(zoom_level1, client1); + const ZoomBubbleView* bubble1 = ZoomBubbleView::GetZoomBubble(); + EXPECT_TRUE(bubble1); + zoom_controller->SetZoomLevelByClient(zoom_level2, client2); + const ZoomBubbleView* bubble2 = ZoomBubbleView::GetZoomBubble(); + EXPECT_TRUE(bubble2); + + return bubble1 == bubble2; + } + + void SetUpOnMainThread() override { + extension1_ = extensions::ExtensionBuilder("Test1").Build(); + client1_ = + base::MakeRefCounted<const TestZoomRequestClient>(extension1_, false); + extension2_ = extensions::ExtensionBuilder("Test2").Build(); + client2_ = + base::MakeRefCounted<const TestZoomRequestClient>(extension2_, false); + } + + scoped_refptr<const extensions::Extension> extension1_; + scoped_refptr<const TestZoomRequestClient> client1_; + scoped_refptr<const extensions::Extension> extension2_; + scoped_refptr<const TestZoomRequestClient> client2_; +}; + +IN_PROC_BROWSER_TEST_F(ZoomBubbleReuseTest, BothUserInitiated) { + EXPECT_TRUE(IsBubbleReused(nullptr, nullptr)); +} + +IN_PROC_BROWSER_TEST_F(ZoomBubbleReuseTest, SameExtension) { + EXPECT_TRUE(IsBubbleReused(client1_, client1_)); +} + +IN_PROC_BROWSER_TEST_F(ZoomBubbleReuseTest, DifferentExtension) { + EXPECT_FALSE(IsBubbleReused(client1_, client2_)); +} + +IN_PROC_BROWSER_TEST_F(ZoomBubbleReuseTest, ExtensionThenUser) { + EXPECT_FALSE(IsBubbleReused(client1_, nullptr)); +} + +IN_PROC_BROWSER_TEST_F(ZoomBubbleReuseTest, UserThenExtension) { + EXPECT_FALSE(IsBubbleReused(nullptr, client1_)); +} + class ZoomBubbleDialogTest : public DialogBrowserTest { public: ZoomBubbleDialogTest() {}
diff --git a/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc b/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc index 1d7368df..9f25e50c 100644 --- a/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc +++ b/chrome/browser/ui/views/policy/enterprise_startup_dialog_view.cc
@@ -60,8 +60,6 @@ EnterpriseStartupDialogView::EnterpriseStartupDialogView( EnterpriseStartupDialog::DialogResultCallback callback) : callback_(std::move(callback)), can_show_browser_window_(false) { - SetBackground(views::CreateSolidBackground(GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_DialogBackground))); SetBorder(views::CreateEmptyBorder(GetDialogInsets())); CreateDialogWidget(this, nullptr, nullptr)->Show(); }
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc new file mode 100644 index 0000000..f8a3329 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
@@ -0,0 +1,55 @@ +// 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. + +#include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h" + +#include "chrome/browser/chromeos/login/oobe_screen.h" +#include "chrome/browser/chromeos/login/screens/demo_preferences_screen.h" +#include "chrome/grit/generated_resources.h" +#include "components/login/localized_values_builder.h" + +namespace { + +constexpr char kJsScreenPath[] = "login.DemoPreferencesScreen"; + +} // namespace + +namespace chromeos { + +DemoPreferencesScreenHandler::DemoPreferencesScreenHandler() + : BaseScreenHandler(kScreenId) { + set_call_js_prefix(kJsScreenPath); +} + +DemoPreferencesScreenHandler::~DemoPreferencesScreenHandler() { + if (screen_) + screen_->OnViewDestroyed(this); +} + +void DemoPreferencesScreenHandler::Show() { + ShowScreen(kScreenId); +} + +void DemoPreferencesScreenHandler::Hide() {} + +void DemoPreferencesScreenHandler::Bind(DemoPreferencesScreen* screen) { + screen_ = screen; + BaseScreenHandler::SetBaseScreen(screen); +} + +void DemoPreferencesScreenHandler::Initialize() {} + +void DemoPreferencesScreenHandler::DeclareLocalizedValues( + ::login::LocalizedValuesBuilder* builder) { + builder->Add("demoPreferencesScreenTitle", + IDS_OOBE_DEMO_SETUP_PREFERENCES_SCREEN_TITLE); + builder->Add("demoPreferencesNextButtonLabel", + IDS_OOBE_DEMO_SETUP_PREFERENCES_SCREEN_NEXT_BUTTON_LABEL); + builder->Add("languageDropdownTitle", IDS_LANGUAGE_DROPDOWN_TITLE); + builder->Add("languageDropdownLabel", IDS_LANGUAGE_DROPDOWN_LABEL); + builder->Add("keyboardDropdownTitle", IDS_KEYBOARD_DROPDOWN_TITLE); + builder->Add("keyboardDropdownLabel", IDS_KEYBOARD_DROPDOWN_LABEL); +} + +} // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h new file mode 100644 index 0000000..2c11c3a9 --- /dev/null +++ b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
@@ -0,0 +1,40 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEMO_PREFERENCES_SCREEN_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEMO_PREFERENCES_SCREEN_HANDLER_H_ + +#include "chrome/browser/chromeos/login/screens/demo_preferences_screen_view.h" +#include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" + +namespace chromeos { + +class DemoPreferencesScreen; + +// WebUI implementation of DemoPreferencesScreenView. +class DemoPreferencesScreenHandler : public BaseScreenHandler, + public DemoPreferencesScreenView { + public: + DemoPreferencesScreenHandler(); + ~DemoPreferencesScreenHandler() override; + + // DemoPreferencesScreenView: + void Show() override; + void Hide() override; + void Bind(DemoPreferencesScreen* screen) override; + + // BaseScreenHandler: + void Initialize() override; + void DeclareLocalizedValues( + ::login::LocalizedValuesBuilder* builder) override; + + private: + DemoPreferencesScreen* screen_ = nullptr; + + DISALLOW_COPY_AND_ASSIGN(DemoPreferencesScreenHandler); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEMO_PREFERENCES_SCREEN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index e9cd7c6..665d7f85 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen_view.h" #include "chrome/browser/chromeos/login/enrollment/enrollment_screen_view.h" +#include "chrome/browser/chromeos/login/screens/demo_preferences_screen_view.h" #include "chrome/browser/chromeos/login/screens/demo_setup_screen_view.h" #include "chrome/browser/chromeos/login/screens/error_screen.h" #include "chrome/browser/chromeos/login/ui/login_display_host.h" @@ -37,6 +38,7 @@ #include "chrome/browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/controller_pairing_screen_handler.h" +#include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/device_disabled_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/enable_debugging_screen_handler.h" @@ -312,6 +314,8 @@ AddScreenHandler(std::make_unique<DemoSetupScreenHandler>()); + AddScreenHandler(std::make_unique<DemoPreferencesScreenHandler>()); + policy::BrowserPolicyConnectorChromeOS* connector = g_browser_process->platform_part()->browser_policy_connector_chromeos(); ActiveDirectoryPasswordChangeScreenHandler* @@ -429,6 +433,10 @@ return GetView<DemoSetupScreenHandler>(); } +DemoPreferencesScreenView* OobeUI::GetDemoPreferencesScreenView() { + return GetView<DemoPreferencesScreenHandler>(); +} + KioskAutolaunchScreenView* OobeUI::GetKioskAutolaunchScreenView() { return GetView<KioskAutolaunchScreenHandler>(); }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h index fd85f47..bdb9f13d 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -55,6 +55,7 @@ class SupervisedUserCreationScreenHandler; class ResetView; class DemoSetupScreenView; +class DemoPreferencesScreenView; class SyncConsentScreenView; class TermsOfServiceScreenView; class UserBoardView; @@ -106,6 +107,7 @@ EnrollmentScreenView* GetEnrollmentScreenView(); ResetView* GetResetView(); DemoSetupScreenView* GetDemoSetupScreenView(); + DemoPreferencesScreenView* GetDemoPreferencesScreenView(); KioskAutolaunchScreenView* GetKioskAutolaunchScreenView(); KioskEnableScreenView* GetKioskEnableScreenView(); TermsOfServiceScreenView* GetTermsOfServiceScreenView();
diff --git a/chrome/browser/ui/webui/webui_webview_browsertest.cc b/chrome/browser/ui/webui/webui_webview_browsertest.cc index 06099a4..ab0af8c 100644 --- a/chrome/browser/ui/webui/webui_webview_browsertest.cc +++ b/chrome/browser/ui/webui/webui_webview_browsertest.cc
@@ -143,7 +143,13 @@ "testDisplayNone", base::Value(GetTestUrl("empty.html").spec()))); } -IN_PROC_BROWSER_TEST_F(WebUIWebViewBrowserTest, ExecuteScriptCode) { +// TODO(crbug.com/861600) Flaky on CrOS trybots. +#if defined(OS_CHROMEOS) && !defined(NDEBUG) +#define MAYBE_ExecuteScriptCode DISABLED_ExecuteScriptCode +#else +#define MAYBE_ExecuteScriptCode ExecuteScriptCode +#endif +IN_PROC_BROWSER_TEST_F(WebUIWebViewBrowserTest, MAYBE_ExecuteScriptCode) { ui_test_utils::NavigateToURL(browser(), GetWebViewEnabledWebUIURL()); ASSERT_TRUE(WebUIBrowserTest::RunJavascriptAsyncTest(
diff --git a/chrome/browser/vr/elements/content_element_unittest.cc b/chrome/browser/vr/elements/content_element_unittest.cc index 7326748..9498dcb 100644 --- a/chrome/browser/vr/elements/content_element_unittest.cc +++ b/chrome/browser/vr/elements/content_element_unittest.cc
@@ -86,7 +86,6 @@ UiTest::SetUp(); UiInitialState state; - state.in_cct = false; state.in_web_vr = false; auto content_input_delegate = std::make_unique<testing::NiceMock<TestContentInputDelegate>>(); @@ -200,7 +199,7 @@ void SetUp() override { UiTest::SetUp(); - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); text_input_delegate_ = std::make_unique<StrictMock<MockTextInputDelegate>>();
diff --git a/chrome/browser/vr/elements/text_input_unittest.cc b/chrome/browser/vr/elements/text_input_unittest.cc index 99a6871..e1b4d86 100644 --- a/chrome/browser/vr/elements/text_input_unittest.cc +++ b/chrome/browser/vr/elements/text_input_unittest.cc
@@ -38,7 +38,7 @@ public: void SetUp() override { UiTest::SetUp(); - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); // Make test text input. text_input_delegate_ =
diff --git a/chrome/browser/vr/model/model.h b/chrome/browser/vr/model/model.h index 953b76d..2db139f 100644 --- a/chrome/browser/vr/model/model.h +++ b/chrome/browser/vr/model/model.h
@@ -36,7 +36,6 @@ bool loading = false; float load_progress = 0.0f; bool incognito = false; - bool in_cct = false; bool can_navigate_back = false; bool can_navigate_forward = false; ToolbarState toolbar_state; @@ -98,7 +97,6 @@ // State affecting both VR browsing and WebVR. ModalPromptType active_modal_prompt_type = kModalPromptTypeNone; CapturingStateModel capturing_state; - bool experimental_features_enabled = false; bool skips_redraw_when_not_dirty = false; bool exiting_vr = false; HostedPlatformUi hosted_platform_ui;
diff --git a/chrome/browser/vr/test/mock_ui_browser_interface.h b/chrome/browser/vr/test/mock_ui_browser_interface.h index 256f161e..3541bb9 100644 --- a/chrome/browser/vr/test/mock_ui_browser_interface.h +++ b/chrome/browser/vr/test/mock_ui_browser_interface.h
@@ -34,7 +34,6 @@ MOCK_METHOD0(CloseAllTabs, void()); MOCK_METHOD0(CloseAllIncognitoTabs, void()); MOCK_METHOD0(OpenFeedback, void()); - MOCK_METHOD0(ExitCct, void()); MOCK_METHOD0(CloseHostedDialog, void()); MOCK_METHOD1(OnUnsupportedMode, void(UiUnsupportedMode mode)); MOCK_METHOD2(OnExitVrPromptResult,
diff --git a/chrome/browser/vr/test/ui_test.cc b/chrome/browser/vr/test/ui_test.cc index 82821971..6a49f2d 100644 --- a/chrome/browser/vr/test/ui_test.cc +++ b/chrome/browser/vr/test/ui_test.cc
@@ -96,9 +96,8 @@ CreateSceneInternal(state, std::move(content_input_delegate)); } -void UiTest::CreateScene(InCct in_cct, InWebVr in_web_vr) { +void UiTest::CreateScene(InWebVr in_web_vr) { UiInitialState state; - state.in_cct = in_cct; state.in_web_vr = in_web_vr; CreateScene(state); }
diff --git a/chrome/browser/vr/test/ui_test.h b/chrome/browser/vr/test/ui_test.h index 09fb60b9..1c9864e 100644 --- a/chrome/browser/vr/test/ui_test.h +++ b/chrome/browser/vr/test/ui_test.h
@@ -31,11 +31,6 @@ void SetUp() override; protected: - enum InCct : bool { - kNotInCct = false, - kInCct = true, - }; - enum InWebVr : bool { kNotInWebVr = false, kInWebVr = true, @@ -47,7 +42,7 @@ }; void CreateScene(const UiInitialState& state); - void CreateScene(InCct in_cct, InWebVr in_web_vr); + void CreateScene(InWebVr in_web_vr); protected: void CreateSceneInternal(
diff --git a/chrome/browser/vr/testapp/vr_test_context.cc b/chrome/browser/vr/testapp/vr_test_context.cc index 5d95f3b0..3a13d89 100644 --- a/chrome/browser/vr/testapp/vr_test_context.cc +++ b/chrome/browser/vr/testapp/vr_test_context.cc
@@ -245,10 +245,6 @@ ui_->OnWebVrFrameAvailable(); break; } - case ui::DomCode::US_E: - model_->experimental_features_enabled = - !model_->experimental_features_enabled; - break; case ui::DomCode::US_O: CycleOrigin(); model_->can_navigate_back = !model_->can_navigate_back; @@ -626,8 +622,6 @@ void VrTestContext::OpenFeedback() {} -void VrTestContext::ExitCct() {} - void VrTestContext::OnUnsupportedMode(vr::UiUnsupportedMode mode) { if (mode == UiUnsupportedMode::kVoiceSearchNeedsRecordAudioOsPermission) { ui_->ShowExitVrPrompt(mode);
diff --git a/chrome/browser/vr/testapp/vr_test_context.h b/chrome/browser/vr/testapp/vr_test_context.h index 79059137..ca17860 100644 --- a/chrome/browser/vr/testapp/vr_test_context.h +++ b/chrome/browser/vr/testapp/vr_test_context.h
@@ -61,7 +61,6 @@ void CloseAllTabs() override; void CloseAllIncognitoTabs() override; void OpenFeedback() override; - void ExitCct() override; void CloseHostedDialog() override; void OnUnsupportedMode(vr::UiUnsupportedMode mode) override; void OnExitVrPromptResult(vr::ExitVrPromptChoice choice,
diff --git a/chrome/browser/vr/ui.cc b/chrome/browser/vr/ui.cc index d64a54e..048a173 100644 --- a/chrome/browser/vr/ui.cc +++ b/chrome/browser/vr/ui.cc
@@ -31,7 +31,6 @@ #include "chrome/browser/vr/ui_scene_constants.h" #include "chrome/browser/vr/ui_scene_creator.h" #include "chrome/browser/vr/ui_test_input.h" -#include "chrome/common/chrome_features.h" #include "third_party/skia/include/core/SkBitmap.h" namespace vr { @@ -86,10 +85,12 @@ if (enabled) { model_->web_vr.has_received_permissions = false; model_->web_vr.state = kWebVrAwaitingFirstFrame; - model_->push_mode(kModeWebVr); + if (!model_->web_vr_enabled()) + model_->push_mode(kModeWebVr); } else { model_->web_vr.state = kWebVrNoTimeoutPending; - model_->pop_mode(); + if (model_->web_vr_enabled()) + model_->pop_mode(); } } @@ -504,8 +505,6 @@ } void Ui::InitializeModel(const UiInitialState& ui_initial_state) { - model_->experimental_features_enabled = - base::FeatureList::IsEnabled(features::kVrBrowsingExperimentalFeatures); model_->speech.has_or_can_request_audio_permission = ui_initial_state.has_or_can_request_audio_permission; model_->ui_modes.clear(); @@ -517,7 +516,6 @@ model_->push_mode(mode); } - model_->in_cct = ui_initial_state.in_cct; model_->browsing_disabled = ui_initial_state.browsing_disabled; model_->skips_redraw_when_not_dirty = ui_initial_state.skips_redraw_when_not_dirty;
diff --git a/chrome/browser/vr/ui.h b/chrome/browser/vr/ui.h index ef95ef1..40ac5e9 100644 --- a/chrome/browser/vr/ui.h +++ b/chrome/browser/vr/ui.h
@@ -44,7 +44,6 @@ struct VR_EXPORT UiInitialState { UiInitialState(); UiInitialState(const UiInitialState& other); - bool in_cct = false; bool in_web_vr = false; bool web_vr_autopresentation_expected = false; bool browsing_disabled = false;
diff --git a/chrome/browser/vr/ui_browser_interface.h b/chrome/browser/vr/ui_browser_interface.h index 6684342..907ff1d 100644 --- a/chrome/browser/vr/ui_browser_interface.h +++ b/chrome/browser/vr/ui_browser_interface.h
@@ -44,7 +44,6 @@ virtual void CloseAllTabs() = 0; virtual void CloseAllIncognitoTabs() = 0; virtual void OpenFeedback() = 0; - virtual void ExitCct() = 0; virtual void CloseHostedDialog() = 0; virtual void OnUnsupportedMode(UiUnsupportedMode mode) = 0; virtual void OnExitVrPromptResult(ExitVrPromptChoice choice,
diff --git a/chrome/browser/vr/ui_input_manager_unittest.cc b/chrome/browser/vr/ui_input_manager_unittest.cc index ad61c33..0378fe3 100644 --- a/chrome/browser/vr/ui_input_manager_unittest.cc +++ b/chrome/browser/vr/ui_input_manager_unittest.cc
@@ -149,7 +149,7 @@ public: void SetUp() override { UiTest::SetUp(); - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); input_manager_ = ui_->input_manager(); }
diff --git a/chrome/browser/vr/ui_pixeltest.cc b/chrome/browser/vr/ui_pixeltest.cc index 3cfa3d12..ad9ca201 100644 --- a/chrome/browser/vr/ui_pixeltest.cc +++ b/chrome/browser/vr/ui_pixeltest.cc
@@ -29,7 +29,6 @@ TEST_F(UiPixelTest, MAYBE(DrawVrBrowsingMode)) { // Set up scene. UiInitialState ui_initial_state; - ui_initial_state.in_cct = false; ui_initial_state.in_web_vr = false; ui_initial_state.web_vr_autopresentation_expected = false; MakeUi(ui_initial_state,
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc index cad0d528..72da33a 100644 --- a/chrome/browser/vr/ui_scene_creator.cc +++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -2747,9 +2747,6 @@ if (model->fullscreen_enabled()) { browser->ExitFullscreen(); } - if (model->in_cct) { - browser->ExitCct(); - } }, base::Unretained(model_), base::Unretained(browser_)); std::unique_ptr<DiscButton> element = @@ -2765,7 +2762,7 @@ // Close button is a special control element that needs to be hidden when // in WebVR, but it needs to be visible when in cct or fullscreen. - VR_BIND_VISIBILITY(element, model->fullscreen_enabled() || model->in_cct); + VR_BIND_VISIBILITY(element, model->fullscreen_enabled()); element->AddBinding( VR_BIND(bool, Model, model_, model->fullscreen_enabled(), UiElement, element.get(),
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc index 2d760f2..83b78e9 100644 --- a/chrome/browser/vr/ui_unittest.cc +++ b/chrome/browser/vr/ui_unittest.cc
@@ -102,10 +102,10 @@ TEST_F(UiTest, WebVrToastStateTransitions) { // Tests toast not showing when directly entering VR though WebVR // presentation. - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); ui_->SetWebVrMode(true); @@ -124,7 +124,7 @@ } TEST_F(UiTest, WebVrToastTransience) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->SetWebVrMode(true); ui_->OnWebVrFrameAvailable(); @@ -138,7 +138,7 @@ } TEST_F(UiTest, PlatformToast) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_FALSE(IsVisible(kPlatformToast)); // show and hide toast after a timeout. @@ -164,7 +164,7 @@ } TEST_F(UiTest, CaptureToasts) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); for (auto& spec : GetIndicatorSpecs()) { for (int i = 0; i < 3; ++i) { @@ -191,13 +191,9 @@ } } -TEST_F(UiTest, CloseButtonVisibleInCctFullscreen) { - // Button should be visible in cct. - CreateScene(kInCct, kNotInWebVr); - EXPECT_TRUE(IsVisible(kCloseButton)); - - // Button should not be visible when not in cct or fullscreen. - CreateScene(kNotInCct, kNotInWebVr); +TEST_F(UiTest, CloseButtonVisibleInFullscreen) { + // Button should not be visible when not in fullscreen. + CreateScene(kNotInWebVr); EXPECT_FALSE(IsVisible(kCloseButton)); // Button should be visible in fullscreen and hidden when leaving fullscreen. @@ -207,22 +203,14 @@ EXPECT_FALSE(IsVisible(kCloseButton)); // Button should not be visible when in WebVR. - CreateScene(kInCct, kInWebVr); + CreateScene(kInWebVr); EXPECT_FALSE(IsVisible(kCloseButton)); ui_->SetWebVrMode(false); - EXPECT_TRUE(IsVisible(kCloseButton)); - - // Button should be visible in Cct across transistions in fullscreen. - CreateScene(kInCct, kNotInWebVr); - EXPECT_TRUE(IsVisible(kCloseButton)); - ui_->SetFullscreen(true); - EXPECT_TRUE(IsVisible(kCloseButton)); - ui_->SetFullscreen(false); - EXPECT_TRUE(IsVisible(kCloseButton)); + EXPECT_FALSE(IsVisible(kCloseButton)); } TEST_F(UiTest, UiUpdatesForIncognito) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); // Hold onto the background color to make sure it changes. SkColor initial_background = SK_ColorBLACK; @@ -272,7 +260,7 @@ } TEST_F(UiTest, VoiceSearchHiddenInIncognito) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); model_->push_mode(kModeEditingOmnibox); EXPECT_TRUE(OnBeginFrame()); @@ -284,7 +272,7 @@ } TEST_F(UiTest, VoiceSearchHiddenWhenCantAskForPermission) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); model_->push_mode(kModeEditingOmnibox); model_->speech.has_or_can_request_audio_permission = true; @@ -297,7 +285,7 @@ } TEST_F(UiTest, VoiceSearchHiddenWhenContentCapturingAudio) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); model_->push_mode(kModeEditingOmnibox); model_->speech.has_or_can_request_audio_permission = true; @@ -311,7 +299,7 @@ } TEST_F(UiTest, UiModeWebVr) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_EQ(model_->ui_modes.size(), 1u); EXPECT_EQ(model_->ui_modes.back(), kModeBrowsing); @@ -330,7 +318,7 @@ } TEST_F(UiTest, UiModeOmniboxEditing) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_EQ(model_->ui_modes.size(), 1u); EXPECT_EQ(model_->ui_modes.back(), kModeBrowsing); @@ -352,7 +340,7 @@ } TEST_F(UiTest, UiModeVoiceSearchFromOmnibox) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_EQ(model_->ui_modes.size(), 1u); EXPECT_EQ(model_->ui_modes.back(), kModeBrowsing); @@ -389,7 +377,7 @@ } TEST_F(UiTest, HostedUiInWebVr) { - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); VerifyVisibility({kWebVrHostedUi, kWebVrFloor}, false); EXPECT_TRUE(ui_->CanSendWebVrVSync()); @@ -417,7 +405,7 @@ visible_in_fullscreen.insert(kContentFrame); visible_in_fullscreen.insert(kContentFrameHitPlane); - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); // Hold onto the background color to make sure it changes. SkColor initial_background = SK_ColorBLACK; @@ -469,7 +457,7 @@ } TEST_F(UiTest, SecurityIconClickTriggersUnsupportedMode) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); // Initial state. VerifyOnlyElementsVisible("Initial", kElementsVisibleInBrowsing); @@ -517,7 +505,7 @@ } TEST_F(UiTest, ExitWebInputEditingOnAppButtonClick) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_FALSE(scene_->GetUiElementByName(kKeyboard)->IsVisible()); ui_->ShowSoftInput(true); OnBeginFrame(); @@ -529,7 +517,7 @@ } TEST_F(UiTest, ShowAndHideExitPrompt) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); model_->active_modal_prompt_type = kModalPromptTypeExitVRForSiteInfo; model_->push_mode(kModeModalPrompt); @@ -543,7 +531,7 @@ } TEST_F(UiTest, PrimaryButtonClickTriggersOnExitPrompt) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); // Initial state. VerifyOnlyElementsVisible("Initial", kElementsVisibleInBrowsing); @@ -561,7 +549,7 @@ } TEST_F(UiTest, SecondaryButtonClickTriggersOnExitPrompt) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); // Initial state. VerifyOnlyElementsVisible("Initial", kElementsVisibleInBrowsing); @@ -580,7 +568,7 @@ } TEST_F(UiTest, ClickOnPromptBackgroundDoesNothing) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->ShowExitVrPrompt(UiUnsupportedMode::kUnhandledPageInfo); OnBeginFrame(); @@ -598,7 +586,7 @@ } TEST_F(UiTest, UiUpdatesForWebVR) { - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); model_->capturing_state.audio_capture_enabled = true; model_->capturing_state.video_capture_enabled = true; @@ -615,7 +603,7 @@ // user hits the app button to exit WebVR mode, but the site continues to pump // frames. If the frame is not ignored, our UI will think we're in WebVR mode. TEST_F(UiTest, WebVrFramesIgnoredWhenUnexpected) { - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); ui_->OnWebVrFrameAvailable(); VerifyOnlyElementsVisible("Elements hidden", std::set<UiElementName>{}); @@ -628,7 +616,7 @@ } TEST_F(UiTest, UiUpdateTransitionToWebVR) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); model_->capturing_state.audio_capture_enabled = true; model_->capturing_state.video_capture_enabled = true; model_->capturing_state.screen_capture_enabled = true; @@ -650,7 +638,7 @@ kBluetoothConnectedIndicator, }; - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_TRUE(VerifyVisibility(indicators, false)); EXPECT_TRUE(VerifyRequiresLayout(indicators, false)); @@ -684,7 +672,7 @@ } TEST_F(UiTest, PropagateContentBoundsOnStart) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); gfx::SizeF expected_bounds(0.495922f, 0.330614f); EXPECT_CALL(*browser_, @@ -696,7 +684,7 @@ } TEST_F(UiTest, PropagateContentBoundsOnFullscreen) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->OnProjMatrixChanged(kPixelDaydreamProjMatrix); ui_->SetFullscreen(true); @@ -711,7 +699,7 @@ } TEST_F(UiTest, DontPropagateContentBoundsOnNegligibleChange) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_FALSE(RunForMs(0)); ui_->OnProjMatrixChanged(kPixelDaydreamProjMatrix); @@ -728,7 +716,7 @@ } TEST_F(UiTest, LoadingIndicatorBindings) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); UiElement* background = scene_->GetUiElementByName(kLoadingIndicator); UiElement* foreground = scene_->GetUiElementByName(kLoadingIndicatorForeground); @@ -759,13 +747,13 @@ } TEST_F(UiTest, ExitWarning) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->SetIsExiting(); EXPECT_TRUE(VerifyVisibility(kElementsVisibleWithExitWarning, true)); } TEST_F(UiTest, WebVrTimeout) { - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); ui_->SetWebVrMode(true); model_->web_vr.state = kWebVrAwaitingFirstFrame; @@ -817,7 +805,7 @@ } TEST_F(UiTest, SpeechRecognitionUiVisibility) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->SetSpeechRecognitionEnabled(true); @@ -883,7 +871,7 @@ } TEST_F(UiTest, SpeechRecognitionUiVisibilityNoResult) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->SetSpeechRecognitionEnabled(true); EXPECT_TRUE(RunForMs(kSpeechRecognitionOpacityAnimationDurationMs)); @@ -912,7 +900,7 @@ } TEST_F(UiTest, OmniboxSuggestionBindings) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); UiElement* container = scene_->GetUiElementByName(kOmniboxSuggestions); ASSERT_NE(container, nullptr); @@ -938,7 +926,7 @@ } TEST_F(UiTest, OmniboxSuggestionNavigates) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); GURL gurl("http://test.com/"); model_->push_mode(kModeEditingOmnibox); model_->omnibox_suggestions.emplace_back(OmniboxSuggestion( @@ -961,7 +949,7 @@ } TEST_F(UiTest, ControllerQuiescence) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); OnBeginFrame(); EXPECT_TRUE(IsVisible(kControllerGroup)); model_->skips_redraw_when_not_dirty = true; @@ -986,7 +974,8 @@ } TEST_F(UiTest, CloseButtonColorBindings) { - CreateScene(kInCct, kNotInWebVr); + CreateScene(kNotInWebVr); + ui_->SetFullscreen(true); EXPECT_TRUE(IsVisible(kCloseButton)); DiscButton* button = static_cast<DiscButton*>(scene_->GetUiElementByName(kCloseButton)); @@ -1025,7 +1014,7 @@ } TEST_F(UiTest, ExitPresentAndFullscreenOnAppButtonClick) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); ui_->SetWebVrMode(true); // Clicking app button should trigger to exit presentation. EXPECT_CALL(*browser_, ExitPresent()); @@ -1064,7 +1053,7 @@ } TEST_F(UiTest, ControllerLabels) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); EXPECT_FALSE(IsVisible(kControllerTrackpadLabel)); EXPECT_FALSE(IsVisible(kControllerTrackpadRepositionLabel)); @@ -1128,7 +1117,7 @@ } TEST_F(UiTest, ResetRepositioner) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); Repositioner* repositioner = static_cast<Repositioner*>( scene_->GetUiElementByName(k2dBrowsingRepositioner)); @@ -1152,13 +1141,13 @@ // No element in the controller root's subtree should be hit testable. TEST_F(UiTest, ControllerHitTest) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); auto* controller = scene_->GetUiElementByName(kControllerRoot); VerifyNoHitTestableElementInSubtree(controller); } TEST_F(UiTest, BrowsingRootBounds) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); auto* elem = scene_->GetUiElementByName(k2dBrowsingContentGroup); auto* root = scene_->GetUiElementByName(k2dBrowsingRepositioner); for (; elem; elem = elem->parent()) { @@ -1174,7 +1163,7 @@ } TEST_F(UiTest, DisableResizeWhenEditing) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); UiElement* hit_plane = scene_->GetUiElementByName(kContentFrameHitPlane); EXPECT_TRUE(hit_plane->hit_testable()); model_->editing_web_input = true; @@ -1208,7 +1197,7 @@ } TEST_F(UiTest, RepositionHostedUi) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); Repositioner* repositioner = static_cast<Repositioner*>( scene_->GetUiElementByName(k2dBrowsingRepositioner)); @@ -1229,7 +1218,7 @@ // Ensures that permissions do not appear after showing hosted UI. TEST_F(UiTest, DoNotShowIndicatorsAfterHostedUi) { - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); ui_->SetWebVrMode(true); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); ui_->OnWebVrFrameAvailable(); @@ -1249,7 +1238,7 @@ // is released that we do not show the exclusive screen toast. Distinguishing // these cases requires knowledge of the previous state. TEST_F(UiTest, LongPressAppButtonInWebVrMode) { - CreateScene(kNotInCct, kInWebVr); + CreateScene(kInWebVr); ui_->SetWebVrMode(true); EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast)); ui_->OnWebVrFrameAvailable(); @@ -1272,7 +1261,7 @@ } TEST_F(UiTest, MenuItems) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); model_->overflow_menu_enabled = true; EXPECT_EQ(IsVisible(kOverflowMenuNewIncognitoTabItem), true); @@ -1295,7 +1284,7 @@ } TEST_F(UiTest, SteadyState) { - CreateScene(kNotInCct, kNotInWebVr); + CreateScene(kNotInWebVr); RunForSeconds(10.0f); // Should have reached steady state. EXPECT_FALSE(OnBeginFrame());
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 95d4d08..bcf0884ab 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -255,10 +255,6 @@ "ExternalExtensionDefaultButtonControl", base::FEATURE_DISABLED_BY_DEFAULT}; #if BUILDFLAG(ENABLE_VR) -// Controls features related to VR browsing that are under development. -const base::Feature kVrBrowsingExperimentalFeatures{ - "VrBrowsingExperimentalFeatures", base::FEATURE_DISABLED_BY_DEFAULT}; - // Controls experimental rendering features for VR browsing. const base::Feature kVrBrowsingExperimentalRendering{ "VrBrowsingExperimentalRendering", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/mac/mock_launchd.cc b/chrome/common/mac/mock_launchd.cc index f6fe40c6..8cb84638 100644 --- a/chrome/common/mac/mock_launchd.cc +++ b/chrome/common/mac/mock_launchd.cc
@@ -94,11 +94,13 @@ MockLaunchd::MockLaunchd( const base::FilePath& file, scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, + base::OnceClosure quit_closure, bool create_socket, bool as_service) : file_(file), pipe_name_(GetServiceProcessServerName()), main_task_runner_(std::move(main_task_runner)), + quit_closure_(std::move(quit_closure)), create_socket_(create_socket), as_service_(as_service), restart_called_(false), @@ -227,8 +229,7 @@ bool MockLaunchd::RemoveJob(CFStringRef label, CFErrorRef* error) { remove_called_ = true; - main_task_runner_->PostTask( - FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated()); + std::move(quit_closure_).Run(); return true; } @@ -237,8 +238,7 @@ CFStringRef name, CFStringRef session_type) { restart_called_ = true; - main_task_runner_->PostTask( - FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated()); + std::move(quit_closure_).Run(); return true; }
diff --git a/chrome/common/mac/mock_launchd.h b/chrome/common/mac/mock_launchd.h index d590d286..8ee6571 100644 --- a/chrome/common/mac/mock_launchd.h +++ b/chrome/common/mac/mock_launchd.h
@@ -10,6 +10,7 @@ #include <memory> #include <string> +#include "base/callback.h" #include "base/files/file_path.h" #include "base/mac/scoped_cftyperef.h" #include "base/memory/scoped_refptr.h" @@ -31,6 +32,7 @@ MockLaunchd(const base::FilePath& file, scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, + base::OnceClosure quit_closure, bool create_socket, bool as_service); ~MockLaunchd() override; @@ -63,6 +65,7 @@ base::FilePath file_; std::string pipe_name_; scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; + base::OnceClosure quit_closure_; std::unique_ptr<MultiProcessLock> running_lock_; bool create_socket_; bool as_service_;
diff --git a/chrome/common/service_process_util_mac_unittest.mm b/chrome/common/service_process_util_mac_unittest.mm index ad399a3d..f1192e37 100644 --- a/chrome/common/service_process_util_mac_unittest.mm +++ b/chrome/common/service_process_util_mac_unittest.mm
@@ -48,8 +48,8 @@ ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); ASSERT_TRUE(MockLaunchd::MakeABundle(GetTempDirPath(), "Test", &bundle_path_, &executable_path_)); - mock_launchd_.reset( - new MockLaunchd(executable_path_, loop_.task_runner(), false, false)); + mock_launchd_.reset(new MockLaunchd(executable_path_, loop_.task_runner(), + run_loop_.QuitClosure(), false, false)); scoped_launchd_instance_.reset( new Launchd::ScopedInstance(mock_launchd_.get())); ASSERT_TRUE(service_process_state_.Initialize());
diff --git a/chrome/renderer/net/OWNERS b/chrome/renderer/net/OWNERS index 64d7be95..5630b3b 100644 --- a/chrome/renderer/net/OWNERS +++ b/chrome/renderer/net/OWNERS
@@ -1,4 +1,6 @@ +# Preferred reviewer. mmenke@chromium.org -juliatuttle@chromium.org + +file://net/OWNERS # COMPONENT: Internals>Network
diff --git a/chrome/service/service_main.cc b/chrome/service/service_main.cc index 1af4ea7..cadcb18 100644 --- a/chrome/service/service_main.cc +++ b/chrome/service/service_main.cc
@@ -32,11 +32,11 @@ if (!state->Initialize()) return 0; + base::RunLoop run_loop; ServiceProcess service_process; - if (service_process.Initialize(&main_message_loop, - parameters.command_line, - state.release())) { - base::RunLoop().Run(); + if (service_process.Initialize(run_loop.QuitClosure(), + parameters.command_line, std::move(state))) { + run_loop.Run(); } else { LOG(ERROR) << "Service process failed to initialize"; }
diff --git a/chrome/service/service_process.cc b/chrome/service/service_process.cc index 0c5c0a4..124f13c 100644 --- a/chrome/service/service_process.cc +++ b/chrome/service/service_process.cc
@@ -131,16 +131,15 @@ ServiceProcess::ServiceProcess() : shutdown_event_(base::WaitableEvent::ResetPolicy::MANUAL, base::WaitableEvent::InitialState::NOT_SIGNALED), - main_message_loop_(NULL), enabled_services_(0), update_available_(false) { DCHECK(!g_service_process); g_service_process = this; } -bool ServiceProcess::Initialize(base::MessageLoopForUI* message_loop, +bool ServiceProcess::Initialize(base::OnceClosure quit_closure, const base::CommandLine& command_line, - ServiceProcessState* state) { + std::unique_ptr<ServiceProcessState> state) { #if defined(USE_GLIB) // g_type_init has been deprecated since version 2.35. #if !GLIB_CHECK_VERSION(2, 35, 0) @@ -148,8 +147,8 @@ g_type_init(); #endif #endif // defined(USE_GLIB) - main_message_loop_ = message_loop; - service_process_state_.reset(state); + quit_closure_ = std::move(quit_closure); + service_process_state_ = std::move(state); // Initialize TaskScheduler. constexpr int kMaxBackgroundThreads = 1; @@ -300,8 +299,7 @@ } void ServiceProcess::Terminate() { - main_message_loop_->task_runner()->PostTask( - FROM_HERE, base::RunLoop::QuitCurrentWhenIdleClosureDeprecated()); + std::move(quit_closure_).Run(); } void ServiceProcess::OnShutdown() {
diff --git a/chrome/service/service_process.h b/chrome/service/service_process.h index d699b03..a885956 100644 --- a/chrome/service/service_process.h +++ b/chrome/service/service_process.h
@@ -50,11 +50,11 @@ ServiceProcess(); ~ServiceProcess() override; - // Initialize the ServiceProcess with the message loop that it should run on. - // ServiceProcess takes ownership of |state|. - bool Initialize(base::MessageLoopForUI* message_loop, + // Initialize the ServiceProcess. |quit_closure| will be run when the service + // process is ready to exit. + bool Initialize(base::OnceClosure quit_closure, const base::CommandLine& command_line, - ServiceProcessState* state); + std::unique_ptr<ServiceProcessState> state); bool Teardown(); @@ -123,8 +123,8 @@ // An event that will be signalled when we shutdown. base::WaitableEvent shutdown_event_; - // Pointer to the main message loop that host this object. - base::MessageLoop* main_message_loop_; + // Closure to run to cause the main message loop to exit. + base::OnceClosure quit_closure_; // Count of currently enabled services in this process. int enabled_services_;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index b4b4568..a32738a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2417,7 +2417,7 @@ "../browser/installable/installable_manager_unittest.cc", "../browser/installable/installable_task_queue_unittest.cc", "../browser/internal_auth_unittest.cc", - "../browser/language/language_model_factory_unittest.cc", + "../browser/language/language_model_manager_factory_unittest.cc", "../browser/language/url_language_histogram_factory_unittest.cc", "../browser/loader/chrome_navigation_data_unittest.cc", "../browser/loader/chrome_resource_dispatcher_host_delegate_unittest.cc", @@ -4190,6 +4190,7 @@ "../browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm", "../browser/ui/cocoa/toolbar/toolbar_view_unittest.mm", "../browser/ui/cocoa/touchbar/credit_card_autofill_touch_bar_controller_unittest.mm", + "../browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm", "../browser/ui/cocoa/translate/translate_bubble_controller_unittest.mm", "../browser/ui/cocoa/url_drop_target_unittest.mm", "../browser/ui/cocoa/vertical_gradient_view_unittest.mm",
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc index d1e0bc2..640b7247 100644 --- a/chromecast/browser/cast_browser_main_parts.cc +++ b/chromecast/browser/cast_browser_main_parts.cc
@@ -396,10 +396,6 @@ void CastBrowserMainParts::PostMainMessageLoopStart() { // Ensure CastMetricsHelper initialized on UI thread. metrics::CastMetricsHelper::GetInstance(); - -#if defined(OS_ANDROID) - base::MessageLoopCurrentForUI::Get()->Start(); -#endif // defined(OS_ANDROID) } void CastBrowserMainParts::ToolkitInitialized() {
diff --git a/chromecast/graphics/BUILD.gn b/chromecast/graphics/BUILD.gn index 7571fb7..75ad4faa 100644 --- a/chromecast/graphics/BUILD.gn +++ b/chromecast/graphics/BUILD.gn
@@ -46,10 +46,13 @@ "cast_system_gesture_event_handler.h", "cast_window_manager_aura.cc", "cast_window_manager_aura.h", + "triple_tap_detector.cc", + "triple_tap_detector.h", ] deps += [ "//ui/base/ime", + "//ui/events:gesture_detection", "//ui/views", "//ui/wm", "//ui/wm/public", @@ -109,11 +112,13 @@ "cast_views_test.cc", "cast_window_manager_aura_test.cc", "run_all_unittests.cc", + "triple_tap_detector_test.cc", ] deps = [ ":graphics", "//base/test:test_support", "//mojo/core/embedder", + "//testing/gmock", "//testing/gtest", "//ui/aura", "//ui/aura:test_support",
diff --git a/chromecast/graphics/triple_tap_detector.cc b/chromecast/graphics/triple_tap_detector.cc new file mode 100644 index 0000000..3347865 --- /dev/null +++ b/chromecast/graphics/triple_tap_detector.cc
@@ -0,0 +1,132 @@ +// 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 "chromecast/graphics/triple_tap_detector.h" + +#include "base/logging.h" +#include "ui/aura/window.h" +#include "ui/aura/window_event_dispatcher.h" +#include "ui/aura/window_tree_host.h" +#include "ui/events/event.h" +#include "ui/events/event_processor.h" +#include "ui/events/event_utils.h" + +namespace chromecast { + +TripleTapDetector::TripleTapDetector(aura::Window* root_window, + TripleTapDetectorDelegate* delegate) + : root_window_(root_window), + delegate_(delegate), + enabled_(false), + triple_tap_state_(TripleTapState::NONE), + tap_count_(0) { + root_window->GetHost()->GetEventSource()->AddEventRewriter(this); +} + +TripleTapDetector::~TripleTapDetector() {} + +ui::EventRewriteStatus TripleTapDetector::RewriteEvent( + const ui::Event& event, + std::unique_ptr<ui::Event>* rewritten_event) { + if (!enabled_ || !delegate_ || !event.IsTouchEvent()) { + return ui::EVENT_REWRITE_CONTINUE; + } + + const ui::TouchEvent& touch_event = static_cast<const ui::TouchEvent&>(event); + return HandleTripleTapState(touch_event, triple_tap_state_); +} + +ui::EventRewriteStatus TripleTapDetector::NextDispatchEvent( + const ui::Event& last_event, + std::unique_ptr<ui::Event>* new_event) { + // Only called if the rewriter has returned EVENT_REWRITE_DISPATCH_ANOTHER, + // and we don't do that. + NOTREACHED(); + return ui::EVENT_REWRITE_CONTINUE; +} + +ui::EventRewriteStatus TripleTapDetector::HandleTripleTapState( + const ui::TouchEvent& event, + TripleTapState state) { + if (event.type() == ui::ET_TOUCH_PRESSED) { + // If a press happened again before the minimum inter-tap interval, cancel + // the triple tap. + if (state == TripleTapState::INTERVAL_WAIT && + (event.time_stamp() - stashed_events_.back().time_stamp()) < + gesture_detector_config_.double_tap_min_time) { + TripleTapReset(); + return ui::EVENT_REWRITE_DISCARD; + } + + // Otherwise transition into a touched state. + triple_tap_state_ = TripleTapState::TOUCH; + last_tap_location_ = event.location(); + + // If this is pressed too long, it should be treated as a long-press, and + // not part of a triple-tap, so set a timer to detect that. + triple_tap_timer_.Start(FROM_HERE, + gesture_detector_config_.longpress_timeout, this, + &TripleTapDetector::OnLongPressIntervalTimerFired); + + // Copy the event and then kill the original touch pressed event, we'll + // produce a new one when the timer expires if it turns out this wasn't a + // triple-tap. + stashed_events_.push_back(event); + + return ui::EVENT_REWRITE_DISCARD; + } + + // Finger was released while we were waiting for one, count it as a tap. + if (event.type() == ui::ET_TOUCH_RELEASED && state == TripleTapState::TOUCH) { + triple_tap_state_ = TripleTapState::INTERVAL_WAIT; + triple_tap_timer_.Start(FROM_HERE, + gesture_detector_config_.double_tap_timeout, this, + &TripleTapDetector::OnTripleTapIntervalTimerFired); + stashed_events_.push_back(event); + tap_count_++; + if (tap_count_ == 3) { + stashed_events_.clear(); + TripleTapReset(); + delegate_->OnTripleTap(event.location()); + } + return ui::EVENT_REWRITE_DISCARD; + } + + if (state != TripleTapState::NONE) { + stashed_events_.push_back(event); + return ui::EVENT_REWRITE_DISCARD; + } + + return ui::EVENT_REWRITE_CONTINUE; +} + +void TripleTapDetector::OnTripleTapIntervalTimerFired() { + TripleTapReset(); +} + +void TripleTapDetector::OnLongPressIntervalTimerFired() { + TripleTapReset(); +} + +void TripleTapDetector::TripleTapReset() { + triple_tap_state_ = TripleTapState::NONE; + tap_count_ = 0; + triple_tap_timer_.Stop(); + for (auto& event : stashed_events_) { + DispatchEvent(&event); + } + stashed_events_.clear(); +} + +void TripleTapDetector::DispatchEvent(ui::TouchEvent* event) { + // Turn off triple-tap before re-dispatching to avoid infinite recursion into + // this detector. + base::AutoReset<bool> toggle_enable(&enabled_, false); + DCHECK(!root_window_->GetHost() + ->dispatcher() + ->OnEventFromSource(event) + .dispatcher_destroyed); +} + +} // namespace chromecast
diff --git a/chromecast/graphics/triple_tap_detector.h b/chromecast/graphics/triple_tap_detector.h new file mode 100644 index 0000000..6233bbb3 --- /dev/null +++ b/chromecast/graphics/triple_tap_detector.h
@@ -0,0 +1,92 @@ +// 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 CHROMECAST_GRAPHICS_TRIPLE_TAP_DETECTOR_H_ +#define CHROMECAST_GRAPHICS_TRIPLE_TAP_DETECTOR_H_ + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/timer/timer.h" +#include "base/values.h" +#include "ui/events/event.h" +#include "ui/events/event_rewriter.h" +#include "ui/events/gesture_detection/gesture_detector.h" +#include "ui/events/gestures/gesture_provider_aura.h" +#include "ui/gfx/geometry/point.h" + +namespace aura { +class Window; +} + +namespace ui { +class Event; +class TouchEvent; +} // namespace ui + +namespace chromecast { + +class TripleTapDetectorDelegate { + public: + virtual ~TripleTapDetectorDelegate() = default; + virtual void OnTripleTap(const gfx::Point& touch_location) = 0; +}; + +enum class TripleTapState { + NONE, + TOUCH, + INTERVAL_WAIT, +}; + +class TripleTapDetector : public ui::EventRewriter { + public: + TripleTapDetector(aura::Window* root_window, + TripleTapDetectorDelegate* delegate); + ~TripleTapDetector() override; + + void set_enabled(bool enabled) { enabled_ = enabled; } + bool enabled() const { return enabled_; } + + // Overridden from ui::EventRewriter + ui::EventRewriteStatus RewriteEvent( + const ui::Event& event, + std::unique_ptr<ui::Event>* rewritten_event) override; + ui::EventRewriteStatus NextDispatchEvent( + const ui::Event& last_event, + std::unique_ptr<ui::Event>* new_event) override; + + private: + friend class TripleTapDetectorTest; + + void DispatchEvent(ui::TouchEvent* event); + ui::EventRewriteStatus HandleTripleTapState(const ui::TouchEvent& event, + TripleTapState state); + + // Expiration event for maximum time between taps in a triple tap. + void OnTripleTapIntervalTimerFired(); + // Expiration event for a finger that is pressed too long during a triple tap. + void OnLongPressIntervalTimerFired(); + + void TripleTapReset(); + + // A default gesture detector config, so we can share the same + // timeout and pixel slop constants. + ui::GestureDetector::Config gesture_detector_config_; + + aura::Window* root_window_; + TripleTapDetectorDelegate* delegate_; + + bool enabled_; + + TripleTapState triple_tap_state_; + int tap_count_; + gfx::Point last_tap_location_; + base::OneShotTimer triple_tap_timer_; + std::vector<ui::TouchEvent> stashed_events_; + + DISALLOW_COPY_AND_ASSIGN(TripleTapDetector); +}; + +} // namespace chromecast + +#endif // CHROMECAST_GRAPHICS_TRIPLE_TAP_DETECTOR_H_
diff --git a/chromecast/graphics/triple_tap_detector_test.cc b/chromecast/graphics/triple_tap_detector_test.cc new file mode 100644 index 0000000..1c770ae --- /dev/null +++ b/chromecast/graphics/triple_tap_detector_test.cc
@@ -0,0 +1,171 @@ +// 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 "chromecast/graphics/triple_tap_detector.h" + +#include "base/run_loop.h" +#include "base/test/simple_test_tick_clock.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "ui/aura/client/screen_position_client.h" +#include "ui/aura/test/aura_test_base.h" +#include "ui/aura/window.h" +#include "ui/events/event_utils.h" +#include "ui/events/gesture_detection/gesture_configuration.h" +#include "ui/events/test/event_generator.h" +#include "ui/events/test/events_test_utils.h" +#include "ui/wm/core/default_screen_position_client.h" + +using testing::_; +using testing::Eq; + +namespace chromecast { + +namespace { +constexpr gfx::Point kTestTapLocation(50, 50); +constexpr int kTapLengthMs = 50; +} // namespace + +class MockTripleTapDetectorDelegate : public TripleTapDetectorDelegate { + public: + ~MockTripleTapDetectorDelegate() override = default; + MOCK_METHOD1(OnTripleTap, void(const gfx::Point&)); +}; + +class TripleTapDetectorTest : public aura::test::AuraTestBase { + public: + ~TripleTapDetectorTest() override = default; + + void SetUp() override { + aura::test::AuraTestBase::SetUp(); + + screen_position_client_.reset(new wm::DefaultScreenPositionClient()); + aura::client::SetScreenPositionClient(root_window(), + screen_position_client_.get()); + + triple_tap_delegate_ = std::make_unique<MockTripleTapDetectorDelegate>(); + triple_tap_detector_ = std::make_unique<TripleTapDetector>( + root_window(), triple_tap_delegate_.get()); + + generator_.reset(new ui::test::EventGenerator(root_window())); + + // Tests fail if time is ever 0. + simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(10)); + // ui takes ownership of the tick clock. + ui::SetEventTickClockForTesting(&simulated_clock_); + } + + void TearDown() override { + triple_tap_detector_.reset(); + aura::test::AuraTestBase::TearDown(); + } + + // Pause the minimum amount of tap to trigger a double tap. + void DoubleTapPause() { + simulated_clock_.Advance(gesture_detector_config_.double_tap_min_time); + } + + // Pause just past the maximum amount of time to trigger a double tap. + void TooLongPause() { + simulated_clock_.Advance(gesture_detector_config_.double_tap_timeout); + simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(1)); + triple_tap_detector_->triple_tap_timer_.Stop(); + triple_tap_detector_->OnTripleTapIntervalTimerFired(); + } + + // Simulate a tap event. + void Tap(const gfx::Point& tap_point) { + ui::TouchEvent press( + ui::ET_TOUCH_PRESSED, tap_point, simulated_clock_.NowTicks(), + ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, + ui::PointerDetails::kUnknownPointerId)); + generator_->Dispatch(&press); + simulated_clock_.Advance(base::TimeDelta::FromMilliseconds(kTapLengthMs)); + ui::TouchEvent release( + ui::ET_TOUCH_RELEASED, tap_point, simulated_clock_.NowTicks(), + ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, + ui::PointerDetails::kUnknownPointerId)); + generator_->Dispatch(&release); + } + + void Tap() { Tap(kTestTapLocation); } + + TripleTapDetector& detector() { return *triple_tap_detector_; } + MockTripleTapDetectorDelegate& delegate() { return *triple_tap_delegate_; } + + private: + ui::GestureDetector::Config gesture_detector_config_; + + std::unique_ptr<aura::client::ScreenPositionClient> screen_position_client_; + + std::unique_ptr<TripleTapDetector> triple_tap_detector_; + std::unique_ptr<MockTripleTapDetectorDelegate> triple_tap_delegate_; + base::SimpleTestTickClock simulated_clock_; + std::unique_ptr<ui::test::EventGenerator> generator_; +}; + +// Verify that a simple correct triple tap triggers the delegate. +TEST_F(TripleTapDetectorTest, TripleTap) { + EXPECT_CALL(delegate(), OnTripleTap(Eq(kTestTapLocation))); + + detector().set_enabled(true); + + Tap(); + DoubleTapPause(); + Tap(); + DoubleTapPause(); + Tap(); + + base::RunLoop run_loop; + run_loop.RunUntilIdle(); +} + +// Verify that no triple taps are detected when the detector is not enabled. +TEST_F(TripleTapDetectorTest, InactiveNoTriple) { + EXPECT_CALL(delegate(), OnTripleTap(Eq(kTestTapLocation))).Times(0); + + Tap(); + DoubleTapPause(); + Tap(); + DoubleTapPause(); + Tap(); + + base::RunLoop run_loop; + run_loop.RunUntilIdle(); +} + +// Verify it's not a triple tap if the pause from the first tap to the second +// tap is too long. +TEST_F(TripleTapDetectorTest, FirstTapTooLong) { + EXPECT_CALL(delegate(), OnTripleTap(Eq(kTestTapLocation))).Times(0); + + detector().set_enabled(true); + + Tap(); + TooLongPause(); + Tap(); + DoubleTapPause(); + Tap(); + + base::RunLoop run_loop; + run_loop.RunUntilIdle(); +} + +// Verify it's not a triple tap if the pause from the second tap to the last tap +// is too long. +TEST_F(TripleTapDetectorTest, LastTapTooLong) { + EXPECT_CALL(delegate(), OnTripleTap(Eq(kTestTapLocation))).Times(0); + + detector().set_enabled(true); + + Tap(); + DoubleTapPause(); + Tap(); + TooLongPause(); + Tap(); + + base::RunLoop run_loop; + run_loop.RunUntilIdle(); +} + +} // namespace chromecast
diff --git a/chromeos/components/BUILD.gn b/chromeos/components/BUILD.gn index d3f1f73..4d0eeb4 100644 --- a/chromeos/components/BUILD.gn +++ b/chromeos/components/BUILD.gn
@@ -17,6 +17,7 @@ "//base", "//base/test:test_support", "//chromeos/components/drivefs:unit_tests", + "//chromeos/components/nearby:unit_tests", "//chromeos/components/proximity_auth:unit_tests", "//chromeos/components/tether:unit_tests", "//mojo/core/embedder",
diff --git a/chromeos/components/nearby/BUILD.gn b/chromeos/components/nearby/BUILD.gn new file mode 100644 index 0000000..4c5e8c9 --- /dev/null +++ b/chromeos/components/nearby/BUILD.gn
@@ -0,0 +1,34 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") + +static_library("nearby") { + sources = [ + "hash_utils_impl.cc", + "hash_utils_impl.h", + ] + + deps = [ + "//base", + "//chromeos/components/nearby/library", + "//crypto", + ] +} + +source_set("unit_tests") { + testonly = true + + sources = [ + "hash_utils_impl_unittests.cc", + ] + + deps = [ + ":nearby", + "//base", + "//chromeos/components/nearby/library", + "//crypto", + "//testing/gtest", + ] +}
diff --git a/chromeos/components/nearby/DEPS b/chromeos/components/nearby/DEPS new file mode 100644 index 0000000..4ef4138e4 --- /dev/null +++ b/chromeos/components/nearby/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+crypto", +]
diff --git a/chromeos/components/nearby/OWNERS b/chromeos/components/nearby/OWNERS new file mode 100644 index 0000000..94fb645a --- /dev/null +++ b/chromeos/components/nearby/OWNERS
@@ -0,0 +1,3 @@ +khorimoto@chromium.org +hansberry@chromium.org +reznor@chromium.org
diff --git a/chromeos/components/nearby/hash_utils_impl.cc b/chromeos/components/nearby/hash_utils_impl.cc new file mode 100644 index 0000000..9906aa5 --- /dev/null +++ b/chromeos/components/nearby/hash_utils_impl.cc
@@ -0,0 +1,34 @@ +// 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. + +#include "chromeos/components/nearby/hash_utils_impl.h" + +#include "base/md5.h" +#include "base/memory/ptr_util.h" +#include "crypto/sha2.h" + +namespace chromeos { + +namespace nearby { + +HashUtilsImpl::HashUtilsImpl() = default; +HashUtilsImpl::~HashUtilsImpl() = default; + +std::unique_ptr<location::nearby::ByteArray> HashUtilsImpl::md5( + const std::string& input) { + std::string md5_result = base::MD5String(input); + return std::make_unique<location::nearby::ByteArray>(md5_result.data(), + md5_result.size()); +} + +std::unique_ptr<location::nearby::ByteArray> HashUtilsImpl::sha256( + const std::string& input) { + std::string sha256_result = crypto::SHA256HashString(input); + return std::make_unique<location::nearby::ByteArray>(sha256_result.data(), + sha256_result.size()); +} + +} // namespace nearby + +} // namespace chromeos
diff --git a/chromeos/components/nearby/hash_utils_impl.h b/chromeos/components/nearby/hash_utils_impl.h new file mode 100644 index 0000000..babba31 --- /dev/null +++ b/chromeos/components/nearby/hash_utils_impl.h
@@ -0,0 +1,39 @@ +// 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. + +#ifndef CHROMEOS_COMPONENTS_NEARBY_HASH_UTILS_IMPL_H_ +#define CHROMEOS_COMPONENTS_NEARBY_HASH_UTILS_IMPL_H_ + +#include <memory> +#include <string> + +#include "base/macros.h" +#include "chromeos/components/nearby/library/byte_array.h" +#include "chromeos/components/nearby/library/hash_utils.h" + +namespace chromeos { + +namespace nearby { + +// Concrete location::nearby::HashUtils implementation. +class HashUtilsImpl : public location::nearby::HashUtils { + public: + HashUtilsImpl(); + ~HashUtilsImpl() override; + + private: + // location::nearby::HashUtils: + std::unique_ptr<location::nearby::ByteArray> md5( + const std::string& input) override; + std::unique_ptr<location::nearby::ByteArray> sha256( + const std::string& input) override; + + DISALLOW_COPY_AND_ASSIGN(HashUtilsImpl); +}; + +} // namespace nearby + +} // namespace chromeos + +#endif // CHROMEOS_COMPONENTS_NEARBY_HASH_UTILS_IMPL_H_
diff --git a/chromeos/components/nearby/hash_utils_impl_unittests.cc b/chromeos/components/nearby/hash_utils_impl_unittests.cc new file mode 100644 index 0000000..6a74b31a --- /dev/null +++ b/chromeos/components/nearby/hash_utils_impl_unittests.cc
@@ -0,0 +1,125 @@ +// 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. + +#include "chromeos/components/nearby/hash_utils_impl.h" + +#include <memory> +#include <string> + +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "chromeos/components/nearby/library/hash_utils.h" +#include "crypto/sha2.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { + +namespace nearby { + +class HashUtilsImplTest : public testing::Test { + protected: + HashUtilsImplTest() = default; + + // testing::Test: + void SetUp() override { hash_utils_ = std::make_unique<HashUtilsImpl>(); } + + std::string ComputeMd5Hash(const std::string& input) { + std::unique_ptr<location::nearby::ByteArray> md5_result = + hash_utils_->md5(input); + return std::string(md5_result->getData(), md5_result->size()); + } + + std::string ComputeSha256Hash(const std::string& input) { + std::unique_ptr<location::nearby::ByteArray> sha256_result = + hash_utils_->sha256(input); + return std::string(sha256_result->getData(), sha256_result->size()); + } + + std::unique_ptr<location::nearby::HashUtils> hash_utils_; + + private: + DISALLOW_COPY_AND_ASSIGN(HashUtilsImplTest); +}; + +// MD5 example data from http://www.ietf.org/rfc/rfc1321.txt A.5 Test Suite +TEST_F(HashUtilsImplTest, MD5_EmptyString) { + EXPECT_EQ("d41d8cd98f00b204e9800998ecf8427e", ComputeMd5Hash("")); +} + +TEST_F(HashUtilsImplTest, MD5_SingleCharacterString) { + EXPECT_EQ("0cc175b9c0f1b6a831c399e269772661", ComputeMd5Hash("a")); +} + +TEST_F(HashUtilsImplTest, MD5_ShortString) { + EXPECT_EQ("900150983cd24fb0d6963f7d28e17f72", ComputeMd5Hash("abc")); +} + +TEST_F(HashUtilsImplTest, MD5_StringWithSpace) { + EXPECT_EQ("f96b697d7cb7938d525a2f31aaf161d0", + ComputeMd5Hash("message digest")); +} + +TEST_F(HashUtilsImplTest, MD5_AlphaString) { + EXPECT_EQ("c3fcd3d76192e4007dfb496cca67e13b", + ComputeMd5Hash("abcdefghijklmnopqrstuvwxyz")); +} + +TEST_F(HashUtilsImplTest, MD5_AlphaNumericStringWithUpperLowerCase) { + EXPECT_EQ("d174ab98d277d9f5a5611c2c9f419d9f", + ComputeMd5Hash("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789")); +} + +TEST_F(HashUtilsImplTest, MD5_NumbersString) { + EXPECT_EQ("57edf4a22be3c955ac49da2e2107b67a", + ComputeMd5Hash("12345678901234567890" + "12345678901234567890" + "12345678901234567890" + "12345678901234567890")); +} + +TEST_F(HashUtilsImplTest, SHA256_ShortString) { + // Example B.1 from FIPS 180-2: one-block message. + static const uint8_t expected[] = { + 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, + 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, + 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}; + + std::string output = ComputeSha256Hash("abc"); + ASSERT_EQ(crypto::kSHA256Length, output.size()); + for (size_t i = 0; i < crypto::kSHA256Length; i++) + EXPECT_EQ(expected[i], static_cast<uint8_t>(output[i])); +} + +TEST_F(HashUtilsImplTest, SHA256_MediumString) { + // Example B.2 from FIPS 180-2: multi-block message. + static const uint8_t expected[] = { + 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, + 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, + 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}; + + std::string output = ComputeSha256Hash( + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); + ASSERT_EQ(crypto::kSHA256Length, output.size()); + for (size_t i = 0; i < crypto::kSHA256Length; i++) + EXPECT_EQ(expected[i], static_cast<uint8_t>(output[i])); +} + +TEST_F(HashUtilsImplTest, SHA256_MillionCharacterString) { + // Example B.3 from FIPS 180-2: long message. + static const uint8_t expected[] = { + 0xcd, 0xc7, 0x6e, 0x5c, 0x99, 0x14, 0xfb, 0x92, 0x81, 0xa1, 0xc7, + 0xe2, 0x84, 0xd7, 0x3e, 0x67, 0xf1, 0x80, 0x9a, 0x48, 0xa4, 0x97, + 0x20, 0x0e, 0x04, 0x6d, 0x39, 0xcc, 0xc7, 0x11, 0x2c, 0xd0}; + + std::string output = ComputeSha256Hash(std::string(1000000, 'a')); + ASSERT_EQ(crypto::kSHA256Length, output.size()); + for (size_t i = 0; i < crypto::kSHA256Length; i++) + EXPECT_EQ(expected[i], static_cast<uint8_t>(output[i])); +} + +} // namespace nearby + +} // namespace chromeos
diff --git a/chromeos/components/nearby/library/BUILD.gn b/chromeos/components/nearby/library/BUILD.gn new file mode 100644 index 0000000..3641a036 --- /dev/null +++ b/chromeos/components/nearby/library/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") + +static_library("library") { + sources = [ + "byte_array.h", + "hash_utils.h", + ] + + deps = [ + "//base", + ] +}
diff --git a/chromeos/components/nearby/library/byte_array.h b/chromeos/components/nearby/library/byte_array.h new file mode 100644 index 0000000..cbc2a22 --- /dev/null +++ b/chromeos/components/nearby/library/byte_array.h
@@ -0,0 +1,34 @@ +// 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. + +#ifndef CHROMEOS_COMPONENTS_NEARBY_LIBRARY_BYTE_ARRAY_H_ +#define CHROMEOS_COMPONENTS_NEARBY_LIBRARY_BYTE_ARRAY_H_ + +#include <string> + +namespace location { + +namespace nearby { + +// TODO(kyleqian): Remove this file pending Nearby library import. This is a +// temporary placeholder for the ByteArray class from the Nearby library, which +// is a dependency of HashUtils. See bug #861813 -> https://crbug.com/861813. +class ByteArray { + public: + ByteArray() {} + ByteArray(const char* data, size_t size) { setData(data, size); } + + void setData(const char* data, size_t size) { data_.assign(data, size); } + const char* getData() const { return data_.data(); } + size_t size() const { return data_.size(); } + + private: + std::string data_; +}; + +} // namespace nearby + +} // namespace location + +#endif // CHROMEOS_COMPONENTS_NEARBY_LIBRARY_BYTE_ARRAY_H_
diff --git a/chromeos/components/nearby/library/hash_utils.h b/chromeos/components/nearby/library/hash_utils.h new file mode 100644 index 0000000..431f349 --- /dev/null +++ b/chromeos/components/nearby/library/hash_utils.h
@@ -0,0 +1,34 @@ +// 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. + +#ifndef CHROMEOS_COMPONENTS_NEARBY_LIBRARY_HASH_UTILS_H_ +#define CHROMEOS_COMPONENTS_NEARBY_LIBRARY_HASH_UTILS_H_ + +#include <memory> +#include <string> + +#include "chromeos/components/nearby/library/byte_array.h" + +namespace location { + +namespace nearby { + +// A provider of standard hashing algorithms. +// TODO(kyleqian): Remove this file pending Nearby library import. This is a +// temporary placeholder for the HashUtils pure-virtual class from the Nearby +// library, which is a dependency of HashUtilsImpl. See bug #861813 -> +// https://crbug.com/861813. +class HashUtils { + public: + virtual ~HashUtils() {} + + virtual std::unique_ptr<ByteArray> md5(const std::string& input) = 0; + virtual std::unique_ptr<ByteArray> sha256(const std::string& input) = 0; +}; + +} // namespace nearby + +} // namespace location + +#endif // CHROMEOS_COMPONENTS_NEARBY_LIBRARY_HASH_UTILS_H_
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index 7967549..7623af8 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -178,15 +178,17 @@ return; } + // We wait for the closure to execute twice: once for the screenshot and once + // for the view hierarchy. auto on_done = base::BarrierClosure( - 2, // We wait for the closure execute twice: 1 for screenshot and 1 for - // view hierarchy. - base::BindOnce( - &AssistantManagerServiceImpl::SendContextQueryAndRunCallback, - weak_factory_.GetWeakPtr(), std::move(callback))); + 2, base::BindOnce( + &AssistantManagerServiceImpl::SendContextQueryAndRunCallback, + weak_factory_.GetWeakPtr(), std::move(callback))); + service_->client()->RequestAssistantStructure( base::BindOnce(&AssistantManagerServiceImpl::OnAssistantStructureReceived, weak_factory_.GetWeakPtr(), on_done)); + // TODO(muyuanli): handle metalayer and grab only part of the screen. service_->assistant_controller()->RequestScreenshot( region, base::BindOnce(
diff --git a/components/BUILD.gn b/components/BUILD.gn index 3573d61c..72e37b3 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -7,6 +7,7 @@ import("//build/config/ui.gni") import("//components/nacl/features.gni") import("//media/media_options.gni") +import("//ppapi/buildflags/buildflags.gni") import("//printing/buildflags/buildflags.gni") import("//rlz/buildflags/buildflags.gni") import("//testing/test.gni") @@ -500,7 +501,7 @@ data += [ "$root_out_dir/Content Shell.app/" ] } - if (!is_android) { + if (enable_plugins) { sources += [ "pdf/renderer/pdf_accessibility_tree_browsertest.cc" ] deps += [ "//components/pdf/renderer" ] }
diff --git a/components/cronet/android/cronet_library_loader.cc b/components/cronet/android/cronet_library_loader.cc index fcb34848..9359844 100644 --- a/components/cronet/android/cronet_library_loader.cc +++ b/components/cronet/android/cronet_library_loader.cc
@@ -101,7 +101,6 @@ DCHECK(!g_init_message_loop); g_init_message_loop = new base::MessageLoop(base::MessageLoop::Type::TYPE_JAVA); - static_cast<base::MessageLoopForUI*>(g_init_message_loop)->Start(); DCHECK(!g_network_change_notifier); if (!net::NetworkChangeNotifier::GetFactory()) {
diff --git a/components/cryptauth/session_keys.cc b/components/cryptauth/session_keys.cc index 74783a2d..0470543 100644 --- a/components/cryptauth/session_keys.cc +++ b/components/cryptauth/session_keys.cc
@@ -30,15 +30,10 @@ SessionKeys::SessionKeys(const std::string& master_symmetric_key) { std::string salt(reinterpret_cast<const char*>(&kSalt[0]), sizeof(kSalt)); - // We set the key_length to the length of the expected output and then take - // the result from the first key, which is the client write key. - crypto::HKDF initiator_encode(master_symmetric_key, salt, kInitiatorPurpose, - kKeySize, 0, 0); - initiator_encode_key_ = initiator_encode.client_write_key().as_string(); - - crypto::HKDF responder_encode(master_symmetric_key, salt, kResponderPurpose, - kKeySize, 0, 0); - responder_encode_key_ = responder_encode.client_write_key().as_string(); + initiator_encode_key_ = crypto::HkdfSha256(master_symmetric_key, salt, + kInitiatorPurpose, kKeySize); + responder_encode_key_ = crypto::HkdfSha256(master_symmetric_key, salt, + kResponderPurpose, kKeySize); } SessionKeys::SessionKeys() {}
diff --git a/components/domain_reliability/OWNERS b/components/domain_reliability/OWNERS index 22db3af..fdcdcec 100644 --- a/components/domain_reliability/OWNERS +++ b/components/domain_reliability/OWNERS
@@ -1,5 +1,6 @@ davidben@chromium.org -juliatuttle@chromium.org + +file://net/OWNERS per-file quic_error_mapping*=rch@chromium.org per-file quic_error_mapping*=zhongyi@chromium.org
diff --git a/components/encrypted_messages/message_encrypter.cc b/components/encrypted_messages/message_encrypter.cc index ce210f1..3d5f5aa 100644 --- a/components/encrypted_messages/message_encrypter.cc +++ b/components/encrypted_messages/message_encrypter.cc
@@ -25,12 +25,9 @@ if (!X25519(shared_secret, private_key, public_key)) return false; - crypto::HKDF hkdf(base::StringPiece(reinterpret_cast<char*>(shared_secret), - sizeof(shared_secret)), - "" /* salt */, hkdf_label, 0 /* key bytes */, - 0 /* iv bytes */, subkey_length); - - *secret = hkdf.subkey_secret().as_string(); + base::StringPiece hkdf_input(reinterpret_cast<char*>(shared_secret), + sizeof(shared_secret)); + *secret = crypto::HkdfSha256(hkdf_input, "", hkdf_label, subkey_length); return true; }
diff --git a/components/error_page/OWNERS b/components/error_page/OWNERS index bebb2c4..9475512 100644 --- a/components/error_page/OWNERS +++ b/components/error_page/OWNERS
@@ -1,8 +1,10 @@ +# Preferred reviewer. mmenke@chromium.org -juliatuttle@chromium.org # If changing network error strings, please visit go/chrome-neterror-strings # (Google internal) or contact edwardjung@chromium.org and rachelis@chromium.org per-file error_page_strings.grdp=edwardjung@chromium.org +file://net/OWNERS + # COMPONENT: Internals>Network
diff --git a/components/gcm_driver/crypto/gcm_message_cryptographer.cc b/components/gcm_driver/crypto/gcm_message_cryptographer.cc index e55f0fa3..9de1c6b 100644 --- a/components/gcm_driver/crypto/gcm_message_cryptographer.cc +++ b/components/gcm_driver/crypto/gcm_message_cryptographer.cc
@@ -59,12 +59,7 @@ // This deliberately copies over the NUL terminus. base::StringPiece info(kInfo, sizeof(kInfo)); - crypto::HKDF hkdf(ecdh_shared_secret, auth_secret, info, - 32, /* key_bytes_to_generate */ - 0, /* iv_bytes_to_generate */ - 0 /* subkey_secret_bytes_to_generate */); - - return hkdf.client_write_key().as_string(); + return crypto::HkdfSha256(ecdh_shared_secret, auth_secret, info, 32); } // Creates the info parameter for an HKDF value for the given @@ -202,12 +197,7 @@ recipient_public_key.AppendToString(&info); sender_public_key.AppendToString(&info); - crypto::HKDF hkdf(ecdh_shared_secret, auth_secret, info, - 32, /* key_bytes_to_generate */ - 0, /* iv_bytes_to_generate */ - 0 /* subkey_secret_bytes_to_generate */); - - return hkdf.client_write_key().as_string(); + return crypto::HkdfSha256(ecdh_shared_secret, auth_secret, info, 32); } // The info string used for generating the content encryption key and the @@ -459,11 +449,9 @@ EncryptionScheme::EncodingType::CONTENT_ENCRYPTION_KEY, recipient_public_key, sender_public_key); - crypto::HKDF hkdf(ecdh_shared_secret, salt, content_encryption_key_info, - kContentEncryptionKeySize, 0, /* iv_bytes_to_generate */ - 0 /* subkey_secret_bytes_to_generate */); - - return hkdf.client_write_key().as_string(); + return crypto::HkdfSha256(ecdh_shared_secret, salt, + content_encryption_key_info, + kContentEncryptionKeySize); } std::string GCMMessageCryptographer::DeriveNonce( @@ -475,16 +463,12 @@ EncryptionScheme::EncodingType::NONCE, recipient_public_key, sender_public_key); - crypto::HKDF hkdf(ecdh_shared_secret, salt, nonce_info, kNonceSize, - 0, /* iv_bytes_to_generate */ - 0 /* subkey_secret_bytes_to_generate */); - // https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02 // defines that the result should be XOR'ed with the record's sequence number, // however, Web Push encryption is limited to a single record per // https://tools.ietf.org/html/draft-ietf-webpush-encryption-03. - return hkdf.client_write_key().as_string(); + return crypto::HkdfSha256(ecdh_shared_secret, salt, nonce_info, kNonceSize); } } // namespace gcm
diff --git a/components/language/core/browser/BUILD.gn b/components/language/core/browser/BUILD.gn index ae7553b..f0c1586 100644 --- a/components/language/core/browser/BUILD.gn +++ b/components/language/core/browser/BUILD.gn
@@ -10,6 +10,8 @@ "heuristic_language_model.h", "language_model.cc", "language_model.h", + "language_model_manager.cc", + "language_model_manager.h", "pref_names.cc", "pref_names.h", "url_language_histogram.cc",
diff --git a/components/language/core/browser/language_model.h b/components/language/core/browser/language_model.h index 65346414..86f1803 100644 --- a/components/language/core/browser/language_model.h +++ b/components/language/core/browser/language_model.h
@@ -14,7 +14,7 @@ // Defines a user language model represented by a ranked list of languages and // associated scores. -class LanguageModel : public KeyedService { +class LanguageModel { public: // Information about one language that a user understands. struct LanguageDetails { @@ -29,6 +29,8 @@ float score; }; + virtual ~LanguageModel() {} + // The set of languages that the user understands. The languages are ranked // from most important to least. virtual std::vector<LanguageDetails> GetLanguages() = 0;
diff --git a/components/language/core/browser/language_model_manager.cc b/components/language/core/browser/language_model_manager.cc new file mode 100644 index 0000000..be20c364 --- /dev/null +++ b/components/language/core/browser/language_model_manager.cc
@@ -0,0 +1,25 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/language/core/browser/language_model_manager.h" + +namespace language { + +LanguageModelManager::LanguageModelManager(PrefService* prefs, + const std::string& ui_lang) { + // TODO(crbug.com/855192): put code to add UI language to the blacklist here. +} + +LanguageModelManager::~LanguageModelManager() {} + +void LanguageModelManager::SetDefaultModel( + std::unique_ptr<LanguageModel> model) { + default_model_ = std::move(model); +} + +LanguageModel* LanguageModelManager::GetDefaultModel() { + return default_model_.get(); +} + +} // namespace language
diff --git a/components/language/core/browser/language_model_manager.h b/components/language/core/browser/language_model_manager.h new file mode 100644 index 0000000..d34ba25 --- /dev/null +++ b/components/language/core/browser/language_model_manager.h
@@ -0,0 +1,35 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_LANGUAGE_CORE_BROWSER_LANGUAGE_MODEL_MANAGER_H_ +#define COMPONENTS_LANGUAGE_CORE_BROWSER_LANGUAGE_MODEL_MANAGER_H_ + +#include <string> +#include <vector> + +#include "components/keyed_service/core/keyed_service.h" +#include "components/language/core/browser/language_model.h" +#include "components/prefs/pref_service.h" + +namespace language { + +// Manages a set of LanguageModel objects. +class LanguageModelManager : public KeyedService { + public: + LanguageModelManager(PrefService* prefs, const std::string& ui_lang); + + ~LanguageModelManager() override; + + void SetDefaultModel(std::unique_ptr<LanguageModel> model); + LanguageModel* GetDefaultModel(); + + private: + std::unique_ptr<LanguageModel> default_model_; + + DISALLOW_IMPLICIT_CONSTRUCTORS(LanguageModelManager); +}; + +} // namespace language + +#endif // COMPONENTS_LANGUAGE_CORE_BROWSER_LANGUAGE_MODEL_MANAGER_H_
diff --git a/components/neterror/OWNERS b/components/neterror/OWNERS index 40148ee4..9df4a03 100644 --- a/components/neterror/OWNERS +++ b/components/neterror/OWNERS
@@ -1,5 +1,4 @@ mmenke@chromium.org -juliatuttle@chromium.org edwardjung@chromium.org # COMPONENT: Internals>Network
diff --git a/components/network_hints/OWNERS b/components/network_hints/OWNERS index 510eb168..fb59c70 100644 --- a/components/network_hints/OWNERS +++ b/components/network_hints/OWNERS
@@ -1 +1 @@ -juliatuttle@chromium.org +file://net/OWNERS
diff --git a/components/os_crypt/BUILD.gn b/components/os_crypt/BUILD.gn index 363f020..4f1d855 100644 --- a/components/os_crypt/BUILD.gn +++ b/components/os_crypt/BUILD.gn
@@ -127,7 +127,7 @@ "//base", "//testing/gtest", ] - if (is_desktop_linux) { + if (is_desktop_linux && !is_chromecast) { sources += [ "os_crypt_mocker_linux.cc", "os_crypt_mocker_linux.h", @@ -162,7 +162,7 @@ "//testing/gtest", ] - if (is_desktop_linux) { + if (is_desktop_linux && !is_chromecast) { sources += [ "key_storage_linux_unittest.cc", "key_storage_util_linux_unittest.cc",
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index c05ed61..2341154c 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -243,6 +243,7 @@ deps = [ "//base", "//crypto", + "//google_apis", ] }
diff --git a/components/password_manager/core/browser/hash_password_manager.cc b/components/password_manager/core/browser/hash_password_manager.cc index e9d6c795..eb44581 100644 --- a/components/password_manager/core/browser/hash_password_manager.cc +++ b/components/password_manager/core/browser/hash_password_manager.cc
@@ -166,7 +166,9 @@ // sign in timestamp. ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList); for (base::Value& password_hash_data : update.Get()->GetList()) { - if (GetAndDecryptField(password_hash_data, kUsernameFieldKey) == username) { + if (AreUsernamesSame( + GetAndDecryptField(password_hash_data, kUsernameFieldKey), + username)) { base::Optional<PasswordHashData> existing_password_hash = ConvertToPasswordHashData(password_hash_data); if (existing_password_hash && existing_password_hash->MatchesPassword( @@ -213,13 +215,14 @@ bool is_gaia_password) { if (prefs_) { ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList); - for (auto it = update->GetList().begin(); it != update->GetList().end(); - it++) { - if (GetAndDecryptField(*it, kUsernameFieldKey) == username && + for (auto it = update->GetList().begin(); it != update->GetList().end();) { + if (AreUsernamesSame(GetAndDecryptField(*it, kUsernameFieldKey), + username) && GetAndDecryptField(*it, kIsGaiaFieldKey) == BooleanToString(is_gaia_password)) { - update->GetList().erase(it); - return; + it = update->GetList().erase(it); + } else { + it++; } } } @@ -283,7 +286,8 @@ for (const base::Value& entry : prefs_->GetList(prefs::kPasswordHashDataList)->GetList()) { - if (GetAndDecryptField(entry, kUsernameFieldKey) == username && + if (AreUsernamesSame(GetAndDecryptField(entry, kUsernameFieldKey), + username) && GetAndDecryptField(entry, kIsGaiaFieldKey) == BooleanToString(is_gaia_password)) { return ConvertToPasswordHashData(entry); @@ -306,7 +310,8 @@ for (const base::Value& entry : prefs_->GetList(prefs::kPasswordHashDataList)->GetList()) { - if (username == GetAndDecryptField(entry, kUsernameFieldKey) && + if (AreUsernamesSame(GetAndDecryptField(entry, kUsernameFieldKey), + username) && BooleanToString(is_gaia_password) == GetAndDecryptField(entry, kIsGaiaFieldKey)) { return true; @@ -392,7 +397,8 @@ return false; } - std::string encrypted_username = EncryptString(password_hash_data.username); + std::string encrypted_username = + EncryptString(CanonicalizeUsername(password_hash_data.username)); if (encrypted_username.empty()) return false; @@ -423,17 +429,23 @@ encrypted_password_hash_entry.SetKey( kLastSignInTimeFieldKey, base::Value(base::Time::Now().ToDoubleT())); ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList); - for (auto it = update->GetList().begin(); it != update->GetList().end(); - it++) { - if (GetAndDecryptField(*it, kUsernameFieldKey) == - password_hash_data.username && + bool replace_old_entry = false; + for (auto it = update->GetList().begin(); it != update->GetList().end();) { + if (AreUsernamesSame(GetAndDecryptField(*it, kUsernameFieldKey), + password_hash_data.username) && GetAndDecryptField(*it, kIsGaiaFieldKey) == BooleanToString(password_hash_data.is_gaia_password)) { - update->GetList().erase(it); - update->GetList().push_back(std::move(encrypted_password_hash_entry)); - return true; + it = update->GetList().erase(it); + replace_old_entry = true; + } else { + it++; } } + if (replace_old_entry) { + update->GetList().push_back(std::move(encrypted_password_hash_entry)); + return true; + } + if (update->GetList().size() >= kMaxPasswordHashDataDictSize) RemoveOldestSignInPasswordHashData(&update->GetList());
diff --git a/components/password_manager/core/browser/hash_password_manager_unittest.cc b/components/password_manager/core/browser/hash_password_manager_unittest.cc index a5c4ec9..0c1206bd 100644 --- a/components/password_manager/core/browser/hash_password_manager_unittest.cc +++ b/components/password_manager/core/browser/hash_password_manager_unittest.cc
@@ -75,7 +75,7 @@ // Verify |SavePasswordHash(const std::string,const base::string16&)| // behavior. hash_password_manager.SavePasswordHash(username, password, - /*force_update=*/true); + /*is_gaia_password=*/true); EXPECT_TRUE(prefs_.HasPrefPath(prefs::kPasswordHashDataList)); // Saves the same password again won't change password hash, length or salt. @@ -83,7 +83,7 @@ hash_password_manager.RetrievePasswordHash(username, /*is_gaia_password=*/true); hash_password_manager.SavePasswordHash(username, password, - /*force_update=*/true); + /*is_gaia_password=*/true); base::Optional<PasswordHashData> existing_password_data = hash_password_manager.RetrievePasswordHash(username, /*is_gaia_password=*/true); @@ -95,7 +95,7 @@ // Verify |SavePasswordHash(const PasswordHashData&)| behavior. base::string16 new_password(base::UTF8ToUTF16("new_password")); PasswordHashData new_password_data(username, new_password, - /*force_update=*/true); + /*is_gaia_password=*/true); EXPECT_TRUE(hash_password_manager.SavePasswordHash(new_password_data)); EXPECT_NE(current_password_hash_data->hash, hash_password_manager @@ -103,6 +103,44 @@ ->hash); } +TEST_F(HashPasswordManagerTest, SavingPasswordHashDataNotCanonicalized) { + ASSERT_FALSE(prefs_.HasPrefPath(prefs::kPasswordHashDataList)); + HashPasswordManager hash_password_manager; + hash_password_manager.set_prefs(&prefs_); + base::string16 password(base::UTF8ToUTF16("password")); + std::string canonical_username("user@gmail.com"); + std::string username("US.ER@gmail.com"); + + // Verify |SavePasswordHash(const std::string,const base::string16&)| + // behavior. + hash_password_manager.SavePasswordHash(canonical_username, password, + /*is_gaia_password=*/true); + ASSERT_TRUE(prefs_.HasPrefPath(prefs::kPasswordHashDataList)); + EXPECT_EQ(1u, prefs_.GetList(prefs::kPasswordHashDataList)->GetList().size()); + EXPECT_EQ( + canonical_username, + hash_password_manager + .RetrievePasswordHash(canonical_username, /*is_gaia_password=*/true) + ->username); + + // Saves the same password with not canonicalized username should not change + // password hash. + base::Optional<PasswordHashData> current_password_hash_data = + hash_password_manager.RetrievePasswordHash(username, + /*is_gaia_password=*/true); + hash_password_manager.SavePasswordHash(username, password, + /*force_update=*/true); + base::Optional<PasswordHashData> existing_password_data = + hash_password_manager.RetrievePasswordHash(username, + /*is_gaia_password=*/true); + EXPECT_EQ(current_password_hash_data->hash, existing_password_data->hash); + EXPECT_EQ(1u, prefs_.GetList(prefs::kPasswordHashDataList)->GetList().size()); + EXPECT_EQ(canonical_username, + hash_password_manager + .RetrievePasswordHash(username, /*is_gaia_password=*/true) + ->username); +} + TEST_F(HashPasswordManagerTest, SavingGaiaPasswordAndNonGaiaPassword) { ASSERT_FALSE(prefs_.HasPrefPath(prefs::kPasswordHashDataList)); HashPasswordManager hash_password_manager; @@ -239,17 +277,17 @@ ASSERT_FALSE(prefs_.HasPrefPath(prefs::kPasswordHashDataList)); HashPasswordManager hash_password_manager; hash_password_manager.set_prefs(&prefs_); - hash_password_manager.SavePasswordHash("username", + hash_password_manager.SavePasswordHash("username@gmail.com", base::UTF8ToUTF16("password"), /*is_gaia_password=*/true); EXPECT_EQ(1u, hash_password_manager.RetrieveAllPasswordHashes().size()); base::Optional<PasswordHashData> password_hash_data = - hash_password_manager.RetrievePasswordHash("username", + hash_password_manager.RetrievePasswordHash("username@gmail.com", /*is_gaia_password=*/false); ASSERT_FALSE(password_hash_data); password_hash_data = hash_password_manager.RetrievePasswordHash( - "username", /*is_gaia_password=*/true); + "username@gmail.com", /*is_gaia_password=*/true); ASSERT_TRUE(password_hash_data); EXPECT_EQ(8u, password_hash_data->length); EXPECT_EQ(16u, password_hash_data->salt.size()); @@ -257,6 +295,15 @@ password_hash_data->salt); EXPECT_EQ(expected_hash, password_hash_data->hash); + // Retrieve not canonicalized version of "username@gmail.com" should return + // the same result. + EXPECT_TRUE( + hash_password_manager.RetrievePasswordHash("user.name@gmail.com", + /*is_gaia_password=*/true)); + EXPECT_TRUE( + hash_password_manager.RetrievePasswordHash("USER.NAME@gmail.com", + /*is_gaia_password=*/true)); + base::Optional<PasswordHashData> non_existing_data = hash_password_manager.RetrievePasswordHash("non_existing_user", true); ASSERT_FALSE(non_existing_data);
diff --git a/components/password_manager/core/browser/password_hash_data.cc b/components/password_manager/core/browser/password_hash_data.cc index 7d30dc60..f5c407e 100644 --- a/components/password_manager/core/browser/password_hash_data.cc +++ b/components/password_manager/core/browser/password_hash_data.cc
@@ -5,8 +5,11 @@ #include "components/password_manager/core/browser/password_hash_data.h" #include "base/strings/string_piece.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" #include "crypto/openssl_util.h" #include "crypto/random.h" +#include "google_apis/gaia/gaia_auth_util.h" #include "third_party/boringssl/src/include/openssl/evp.h" namespace password_manager { @@ -44,7 +47,8 @@ bool PasswordHashData::MatchesPassword(const std::string& username, const base::string16& password, bool is_gaia_password) const { - if (password.size() != this->length || username != this->username || + if (password.size() != this->length || + !AreUsernamesSame(username, this->username) || is_gaia_password != this->is_gaia_password) { return false; } @@ -99,4 +103,15 @@ return hash37; } +std::string CanonicalizeUsername(const std::string& username) { + std::vector<std::string> parts = base::SplitString( + username, "@", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); + return parts.size() != 2U ? username : gaia::CanonicalizeEmail(username); +} + +bool AreUsernamesSame(const std::string& username1, + const std::string& username2) { + return CanonicalizeUsername(username1) == CanonicalizeUsername(username2); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_hash_data.h b/components/password_manager/core/browser/password_hash_data.h index 7cec15c..98b2976 100644 --- a/components/password_manager/core/browser/password_hash_data.h +++ b/components/password_manager/core/browser/password_hash_data.h
@@ -56,6 +56,14 @@ uint64_t CalculatePasswordHash(const base::StringPiece16& text, const std::string& salt); +// If username is an email address, canonicalizes this email. Otherwise, returns +// |username|. +std::string CanonicalizeUsername(const std::string& username); + +// Returns true if the two usernames the same after canonicalization. +bool AreUsernamesSame(const std::string& username1, + const std::string& username2); + } // namespace password_manager #endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_HASH_DATA_H_
diff --git a/components/resources/OWNERS b/components/resources/OWNERS index faa90d9..456bcda 100644 --- a/components/resources/OWNERS +++ b/components/resources/OWNERS
@@ -15,8 +15,8 @@ per-file gcm_driver_resources.grdp=jianli@chromium.org per-file gcm_driver_resources.grdp=peter@chromium.org per-file gcm_driver_resources.grdp=zea@chromium.org -per-file neterror*=juliatuttle@chromium.org per-file neterror*=mmenke@chromium.org +per-file neterror*=file://net/OWNERS per-file ntp_tiles_resources.grdp=file://components/ntp_tiles/OWNERS per-file offline_pages_resources.grdp=file://components/offline_pages/OWNERS per-file proximity_auth*=tengs@chromium.org
diff --git a/components/sessions/BUILD.gn b/components/sessions/BUILD.gn index 275aa015..615c1c7 100644 --- a/components/sessions/BUILD.gn +++ b/components/sessions/BUILD.gn
@@ -108,14 +108,12 @@ public_deps = [ "//components/keyed_service/core", - "//components/sync/protocol", ] deps = [ "//base", "//components/keyed_service/core", "//components/prefs", - "//components/sync", "//components/variations", "//skia", "//ui/base", @@ -136,7 +134,6 @@ ] deps = [ "//base", - "//components/sync", "//skia", "//testing/gtest", "//ui/base", # For page_transition_types.h. @@ -160,7 +157,6 @@ "core/serialized_navigation_entry_unittest.cc", "core/session_backend_unittest.cc", "core/session_id_generator_unittest.cc", - "core/session_types_unittest.cc", "ios/ios_serialized_navigation_builder_unittest.mm", "ios/ios_serialized_navigation_driver_unittest.cc", ] @@ -180,7 +176,6 @@ ":test_support", "//base/test:test_support", "//components/prefs:test_support", - "//components/sync", "//testing/gmock", "//testing/gtest", "//ui/base", # For page transition types.
diff --git a/components/sessions/DEPS b/components/sessions/DEPS index a704684c..9b0cbfb 100644 --- a/components/sessions/DEPS +++ b/components/sessions/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+components/sync", "+components/variations", "+ui/base", "+ui/gfx",
diff --git a/components/sessions/core/serialized_navigation_entry.cc b/components/sessions/core/serialized_navigation_entry.cc index c18183e5..0056aae8 100644 --- a/components/sessions/core/serialized_navigation_entry.cc +++ b/components/sessions/core/serialized_navigation_entry.cc
@@ -5,118 +5,18 @@ #include "components/sessions/core/serialized_navigation_entry.h" #include <stddef.h> +#include <utility> #include "base/macros.h" #include "base/pickle.h" -#include "base/strings/utf_string_conversions.h" #include "base/trace_event/memory_usage_estimator.h" #include "components/sessions/core/serialized_navigation_driver.h" -#include "components/sync/base/time.h" -#include "components/sync/protocol/session_specifics.pb.h" namespace sessions { // The previous referrer policy value corresponding to |Never|. const int kObsoleteReferrerPolicyNever = 2; -namespace { - -sync_pb::SyncEnums_PageTransition ToSyncPageTransition( - ui::PageTransition transition_type) { - switch (ui::PageTransitionStripQualifier(transition_type)) { - case ui::PAGE_TRANSITION_LINK: - return sync_pb::SyncEnums_PageTransition_LINK; - - case ui::PAGE_TRANSITION_TYPED: - return sync_pb::SyncEnums_PageTransition_TYPED; - - case ui::PAGE_TRANSITION_AUTO_BOOKMARK: - return sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK; - - case ui::PAGE_TRANSITION_AUTO_SUBFRAME: - return sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME; - - case ui::PAGE_TRANSITION_MANUAL_SUBFRAME: - return sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME; - - case ui::PAGE_TRANSITION_GENERATED: - return sync_pb::SyncEnums_PageTransition_GENERATED; - - case ui::PAGE_TRANSITION_AUTO_TOPLEVEL: - return sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL; - - case ui::PAGE_TRANSITION_FORM_SUBMIT: - return sync_pb::SyncEnums_PageTransition_FORM_SUBMIT; - - case ui::PAGE_TRANSITION_RELOAD: - return sync_pb::SyncEnums_PageTransition_RELOAD; - - case ui::PAGE_TRANSITION_KEYWORD: - return sync_pb::SyncEnums_PageTransition_KEYWORD; - - case ui::PAGE_TRANSITION_KEYWORD_GENERATED: - return sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED; - - // Non-core values listed here although unreachable: - case ui::PAGE_TRANSITION_CORE_MASK: - case ui::PAGE_TRANSITION_BLOCKED: - case ui::PAGE_TRANSITION_FORWARD_BACK: - case ui::PAGE_TRANSITION_FROM_ADDRESS_BAR: - case ui::PAGE_TRANSITION_HOME_PAGE: - case ui::PAGE_TRANSITION_FROM_API: - case ui::PAGE_TRANSITION_CHAIN_START: - case ui::PAGE_TRANSITION_CHAIN_END: - case ui::PAGE_TRANSITION_CLIENT_REDIRECT: - case ui::PAGE_TRANSITION_SERVER_REDIRECT: - case ui::PAGE_TRANSITION_IS_REDIRECT_MASK: - case ui::PAGE_TRANSITION_QUALIFIER_MASK: - break; - } - NOTREACHED(); - return sync_pb::SyncEnums_PageTransition_LINK; -} - -ui::PageTransition FromSyncPageTransition( - sync_pb::SyncEnums_PageTransition transition_type) { - switch (transition_type) { - case sync_pb::SyncEnums_PageTransition_LINK: - return ui::PAGE_TRANSITION_LINK; - - case sync_pb::SyncEnums_PageTransition_TYPED: - return ui::PAGE_TRANSITION_TYPED; - - case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK: - return ui::PAGE_TRANSITION_AUTO_BOOKMARK; - - case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME: - return ui::PAGE_TRANSITION_AUTO_SUBFRAME; - - case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME: - return ui::PAGE_TRANSITION_MANUAL_SUBFRAME; - - case sync_pb::SyncEnums_PageTransition_GENERATED: - return ui::PAGE_TRANSITION_GENERATED; - - case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL: - return ui::PAGE_TRANSITION_AUTO_TOPLEVEL; - - case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT: - return ui::PAGE_TRANSITION_FORM_SUBMIT; - - case sync_pb::SyncEnums_PageTransition_RELOAD: - return ui::PAGE_TRANSITION_RELOAD; - - case sync_pb::SyncEnums_PageTransition_KEYWORD: - return ui::PAGE_TRANSITION_KEYWORD; - - case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED: - return ui::PAGE_TRANSITION_KEYWORD_GENERATED; - } - return ui::PAGE_TRANSITION_LINK; -} - -} // namespace - size_t SerializedNavigationEntry::ReplacedNavigationEntryData::EstimateMemoryUsage() const { @@ -147,77 +47,6 @@ SerializedNavigationEntry& SerializedNavigationEntry::operator=( SerializedNavigationEntry&& other) = default; -SerializedNavigationEntry SerializedNavigationEntry::FromSyncData( - int index, - const sync_pb::TabNavigation& sync_data) { - SerializedNavigationEntry navigation; - navigation.index_ = index; - navigation.unique_id_ = sync_data.unique_id(); - if (sync_data.has_correct_referrer_policy()) { - navigation.referrer_url_ = GURL(sync_data.referrer()); - navigation.referrer_policy_ = sync_data.correct_referrer_policy(); - } else { - navigation.referrer_url_ = GURL(); - navigation.referrer_policy_ = kObsoleteReferrerPolicyNever; - } - navigation.virtual_url_ = GURL(sync_data.virtual_url()); - navigation.title_ = base::UTF8ToUTF16(sync_data.title()); - - uint32_t transition = FromSyncPageTransition(sync_data.page_transition()); - - if (sync_data.has_redirect_type()) { - switch (sync_data.redirect_type()) { - case sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT: - transition |= ui::PAGE_TRANSITION_CLIENT_REDIRECT; - break; - case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT: - transition |= ui::PAGE_TRANSITION_SERVER_REDIRECT; - break; - } - } - if (sync_data.navigation_forward_back()) - transition |= ui::PAGE_TRANSITION_FORWARD_BACK; - if (sync_data.navigation_from_address_bar()) - transition |= ui::PAGE_TRANSITION_FROM_ADDRESS_BAR; - if (sync_data.navigation_home_page()) - transition |= ui::PAGE_TRANSITION_HOME_PAGE; - if (sync_data.navigation_chain_start()) - transition |= ui::PAGE_TRANSITION_CHAIN_START; - if (sync_data.navigation_chain_end()) - transition |= ui::PAGE_TRANSITION_CHAIN_END; - - navigation.transition_type_ = static_cast<ui::PageTransition>(transition); - - navigation.timestamp_ = syncer::ProtoTimeToTime(sync_data.timestamp_msec()); - if (sync_data.has_favicon_url()) - navigation.favicon_url_ = GURL(sync_data.favicon_url()); - - if (sync_data.has_password_state()) { - navigation.password_state_ = - static_cast<SerializedNavigationEntry::PasswordState>( - sync_data.password_state()); - } - - navigation.http_status_code_ = sync_data.http_status_code(); - - if (sync_data.has_replaced_navigation()) { - navigation.replaced_entry_data_ = ReplacedNavigationEntryData(); - navigation.replaced_entry_data_->first_committed_url = - GURL(sync_data.replaced_navigation().first_committed_url()); - navigation.replaced_entry_data_->first_timestamp = syncer::ProtoTimeToTime( - sync_data.replaced_navigation().first_timestamp_msec()); - navigation.replaced_entry_data_->first_transition_type = - FromSyncPageTransition( - sync_data.replaced_navigation().first_page_transition()); - } - - SerializedNavigationDriver::Get()->Sanitize(&navigation); - - navigation.is_restored_ = true; - - return navigation; -} - namespace { // Helper used by SerializedNavigationEntry::WriteToPickle(). It writes |str| to @@ -425,99 +254,6 @@ return true; } -// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? -// See http://crbug.com/67068. -sync_pb::TabNavigation SerializedNavigationEntry::ToSyncData() const { - sync_pb::TabNavigation sync_data; - sync_data.set_virtual_url(virtual_url_.spec()); - sync_data.set_referrer(referrer_url_.spec()); - sync_data.set_correct_referrer_policy(referrer_policy_); - sync_data.set_title(base::UTF16ToUTF8(title_)); - - // Page transition core. - static_assert(static_cast<int32_t>(ui::PAGE_TRANSITION_LAST_CORE) == - static_cast<int32_t>(ui::PAGE_TRANSITION_KEYWORD_GENERATED), - "PAGE_TRANSITION_LAST_CORE must equal " - "PAGE_TRANSITION_KEYWORD_GENERATED"); - sync_data.set_page_transition(ToSyncPageTransition(transition_type_)); - - // Page transition qualifiers. - if (ui::PageTransitionIsRedirect(transition_type_)) { - if (transition_type_ & ui::PAGE_TRANSITION_CLIENT_REDIRECT) { - sync_data.set_redirect_type( - sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT); - } else if (transition_type_ & ui::PAGE_TRANSITION_SERVER_REDIRECT) { - sync_data.set_redirect_type( - sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); - } - } - sync_data.set_navigation_forward_back( - (transition_type_ & ui::PAGE_TRANSITION_FORWARD_BACK) != 0); - sync_data.set_navigation_from_address_bar( - (transition_type_ & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0); - sync_data.set_navigation_home_page( - (transition_type_ & ui::PAGE_TRANSITION_HOME_PAGE) != 0); - sync_data.set_navigation_chain_start( - (transition_type_ & ui::PAGE_TRANSITION_CHAIN_START) != 0); - sync_data.set_navigation_chain_end( - (transition_type_ & ui::PAGE_TRANSITION_CHAIN_END) != 0); - - sync_data.set_unique_id(unique_id_); - sync_data.set_timestamp_msec(syncer::TimeToProtoTime(timestamp_)); - // The full-resolution timestamp works as a global ID. - sync_data.set_global_id(timestamp_.ToInternalValue()); - - sync_data.set_http_status_code(http_status_code_); - - if (favicon_url_.is_valid()) - sync_data.set_favicon_url(favicon_url_.spec()); - - if (blocked_state_ != STATE_INVALID) { - sync_data.set_blocked_state( - static_cast<sync_pb::TabNavigation_BlockedState>(blocked_state_)); - } - - sync_data.set_password_state( - static_cast<sync_pb::TabNavigation_PasswordState>(password_state_)); - - for (std::set<std::string>::const_iterator it = - content_pack_categories_.begin(); - it != content_pack_categories_.end(); ++it) { - sync_data.add_content_pack_categories(*it); - } - - // Copy all redirect chain entries except the last URL (which should match - // the virtual_url). - if (redirect_chain_.size() > 1) { // Single entry chains have no redirection. - size_t last_entry = redirect_chain_.size() - 1; - for (size_t i = 0; i < last_entry; i++) { - sync_pb::NavigationRedirect* navigation_redirect = - sync_data.add_navigation_redirect(); - navigation_redirect->set_url(redirect_chain_[i].spec()); - } - // If the last URL didn't match the virtual_url, record it separately. - if (sync_data.virtual_url() != redirect_chain_[last_entry].spec()) { - sync_data.set_last_navigation_redirect_url( - redirect_chain_[last_entry].spec()); - } - } - - if (replaced_entry_data_.has_value()) { - sync_pb::ReplacedNavigation* replaced_navigation = - sync_data.mutable_replaced_navigation(); - replaced_navigation->set_first_committed_url( - replaced_entry_data_->first_committed_url.spec()); - replaced_navigation->set_first_timestamp_msec( - syncer::TimeToProtoTime(replaced_entry_data_->first_timestamp)); - replaced_navigation->set_first_page_transition( - ToSyncPageTransition(replaced_entry_data_->first_transition_type)); - } - - sync_data.set_is_restored(is_restored_); - - return sync_data; -} - size_t SerializedNavigationEntry::EstimateMemoryUsage() const { using base::trace_event::EstimateMemoryUsage; return EstimateMemoryUsage(referrer_url_) +
diff --git a/components/sessions/core/serialized_navigation_entry.h b/components/sessions/core/serialized_navigation_entry.h index cb17bfc..47dd1bb 100644 --- a/components/sessions/core/serialized_navigation_entry.h +++ b/components/sessions/core/serialized_navigation_entry.h
@@ -25,18 +25,13 @@ class PickleIterator; } -namespace sync_pb { -class TabNavigation; -} - namespace sessions { class SerializedNavigationEntryTestHelper; // SerializedNavigationEntry is a "freeze-dried" version of NavigationEntry. It // contains the data needed to restore a NavigationEntry during session restore -// and tab restore, and it can also be pickled and unpickled. It is also -// convertible to a sync protocol buffer for session syncing. +// and tab restore, and it can also be pickled and unpickled. // // Default copy constructor and assignment operator welcome. class SESSIONS_EXPORT SerializedNavigationEntry { @@ -64,42 +59,37 @@ SerializedNavigationEntry& operator=(const SerializedNavigationEntry& other); SerializedNavigationEntry& operator=(SerializedNavigationEntry&& other); - // Construct a SerializedNavigationEntry for a particular index from a sync - // protocol buffer. Note that the sync protocol buffer doesn't contain all - // SerializedNavigationEntry fields. Also, the timestamp of the returned - // SerializedNavigationEntry is nulled out, as we assume that the protocol - // buffer is from a foreign session. - static SerializedNavigationEntry FromSyncData( - int index, - const sync_pb::TabNavigation& sync_data); - // Note that not all SerializedNavigationEntry fields are preserved. // |max_size| is the max number of bytes to write. void WriteToPickle(int max_size, base::Pickle* pickle) const; bool ReadFromPickle(base::PickleIterator* iterator); - // Convert this navigation into its sync protocol buffer equivalent. Note - // that the protocol buffer doesn't contain all SerializedNavigationEntry - // fields. - sync_pb::TabNavigation ToSyncData() const; - // The index in the NavigationController. This SerializedNavigationEntry is // valid only when the index is non-negative. int index() const { return index_; } void set_index(int index) { index_ = index; } - // Accessors for some fields taken from NavigationEntry. int unique_id() const { return unique_id_; } + void set_unique_id(int unique_id) { unique_id_ = unique_id; } const base::string16& title() const { return title_; } + void set_title(const base::string16& title) { title_ = title; } const GURL& favicon_url() const { return favicon_url_; } + void set_favicon_url(const GURL& favicon_url) { favicon_url_ = favicon_url; } int http_status_code() const { return http_status_code_; } + void set_http_status_code(int http_status_code) { + http_status_code_ = http_status_code; + } ui::PageTransition transition_type() const { return transition_type_; } + void set_transition_type(ui::PageTransition transition_type) { + transition_type_ = transition_type; + } bool has_post_data() const { return has_post_data_; } int64_t post_id() const { return post_id_; } bool is_overriding_user_agent() const { return is_overriding_user_agent_; } base::Time timestamp() const { return timestamp_; } + void set_timestamp(base::Time timestamp) { timestamp_ = timestamp; } BlockedState blocked_state() const { return blocked_state_; } void set_blocked_state(BlockedState blocked_state) { @@ -159,6 +149,13 @@ const { return replaced_entry_data_; } + void set_replaced_entry_data( + const base::Optional<ReplacedNavigationEntryData>& replaced_entry_data) { + replaced_entry_data_ = replaced_entry_data; + } + + bool is_restored() const { return is_restored_; } + void set_is_restored(bool is_restored) { is_restored_ = is_restored; } const std::map<std::string, std::string>& extended_info_map() const { return extended_info_map_;
diff --git a/components/sessions/core/serialized_navigation_entry_test_helper.cc b/components/sessions/core/serialized_navigation_entry_test_helper.cc index 516974c1..399acbad 100644 --- a/components/sessions/core/serialized_navigation_entry_test_helper.cc +++ b/components/sessions/core/serialized_navigation_entry_test_helper.cc
@@ -7,7 +7,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "components/sessions/core/serialized_navigation_entry.h" -#include "components/sync/base/time.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -31,7 +30,8 @@ const int64_t kPostID = 100; const GURL kOriginalRequestURL = GURL("http://www.original-request.com"); const bool kIsOverridingUserAgent = true; -const base::Time kTimestamp = syncer::ProtoTimeToTime(100); +const base::Time kTimestamp = + base::Time::UnixEpoch() + base::TimeDelta::FromMilliseconds(100); const GURL kFaviconURL = GURL("http://virtual-url.com/favicon.ico"); const int kHttpStatusCode = 404; const GURL kRedirectURL0 = GURL("http://go/redirect0");
diff --git a/components/sessions/core/serialized_navigation_entry_unittest.cc b/components/sessions/core/serialized_navigation_entry_unittest.cc index 72dcbe1..22e8d06 100644 --- a/components/sessions/core/serialized_navigation_entry_unittest.cc +++ b/components/sessions/core/serialized_navigation_entry_unittest.cc
@@ -17,8 +17,6 @@ #include "base/time/time.h" #include "components/sessions/core/serialized_navigation_driver.h" #include "components/sessions/core/serialized_navigation_entry_test_helper.h" -#include "components/sync/base/time.h" -#include "components/sync/protocol/session_specifics.pb.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/page_transition_types.h" #include "url/gurl.h" @@ -26,26 +24,6 @@ namespace sessions { namespace { -// Create a sync_pb::TabNavigation from the constants above. -sync_pb::TabNavigation MakeSyncDataForTest() { - sync_pb::TabNavigation sync_data; - sync_data.set_virtual_url(test_data::kVirtualURL.spec()); - sync_data.set_referrer(test_data::kReferrerURL.spec()); - sync_data.set_obsolete_referrer_policy(test_data::kReferrerPolicy); - sync_data.set_correct_referrer_policy(test_data::kReferrerPolicy); - sync_data.set_title(base::UTF16ToUTF8(test_data::kTitle)); - sync_data.set_page_transition( - sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); - sync_data.set_unique_id(test_data::kUniqueID); - sync_data.set_timestamp_msec(syncer::TimeToProtoTime(test_data::kTimestamp)); - sync_data.set_redirect_type(sync_pb::SyncEnums::CLIENT_REDIRECT); - sync_data.set_navigation_home_page(true); - sync_data.set_favicon_url(test_data::kFaviconURL.spec()); - sync_data.set_http_status_code(test_data::kHttpStatusCode); - // The redirect chain only syncs one way. - return sync_data; -} - // Create a default SerializedNavigationEntry. All its fields should be // initialized to their respective default values. TEST(SerializedNavigationEntryTest, DefaultInitializer) { @@ -71,33 +49,6 @@ EXPECT_EQ(0U, navigation.redirect_chain().size()); } -// Create a SerializedNavigationEntry from a sync_pb::TabNavigation. All its -// fields should match the protocol buffer's if it exists there, and -// sbould be set to the default value otherwise. -TEST(SerializedNavigationEntryTest, FromSyncData) { - const sync_pb::TabNavigation sync_data = MakeSyncDataForTest(); - - const SerializedNavigationEntry& navigation = - SerializedNavigationEntry::FromSyncData(test_data::kIndex, sync_data); - - EXPECT_EQ(test_data::kIndex, navigation.index()); - EXPECT_EQ(test_data::kUniqueID, navigation.unique_id()); - EXPECT_EQ(test_data::kReferrerURL, navigation.referrer_url()); - EXPECT_EQ(test_data::kReferrerPolicy, navigation.referrer_policy()); - EXPECT_EQ(test_data::kVirtualURL, navigation.virtual_url()); - EXPECT_EQ(test_data::kTitle, navigation.title()); - EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( - navigation.transition_type(), test_data::kTransitionType)); - EXPECT_FALSE(navigation.has_post_data()); - EXPECT_EQ(-1, navigation.post_id()); - EXPECT_EQ(GURL(), navigation.original_request_url()); - EXPECT_FALSE(navigation.is_overriding_user_agent()); - EXPECT_EQ(test_data::kTimestamp, navigation.timestamp()); - EXPECT_EQ(test_data::kFaviconURL, navigation.favicon_url()); - EXPECT_EQ(test_data::kHttpStatusCode, navigation.http_status_code()); - // The redirect chain only syncs one way. -} - // Create a SerializedNavigationEntry, pickle it, then create another one by // unpickling. The new one should match the old one except for fields // that aren't pickled, which should be set to default values. @@ -147,118 +98,5 @@ EXPECT_EQ(0U, new_navigation.redirect_chain().size()); } -// Create a SerializedNavigationEntry, then create a sync protocol buffer from -// it. The protocol buffer should have matching fields to the -// SerializedNavigationEntry (when applicable). -TEST(SerializedNavigationEntryTest, ToSyncData) { - const SerializedNavigationEntry navigation = - SerializedNavigationEntryTestHelper::CreateNavigationForTest(); - const sync_pb::TabNavigation sync_data = navigation.ToSyncData(); - - EXPECT_EQ(test_data::kVirtualURL.spec(), sync_data.virtual_url()); - EXPECT_EQ(test_data::kReferrerURL.spec(), sync_data.referrer()); - EXPECT_EQ(test_data::kTitle, base::ASCIIToUTF16(sync_data.title())); - EXPECT_EQ(sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME, - sync_data.page_transition()); - EXPECT_TRUE(sync_data.has_redirect_type()); - EXPECT_EQ(test_data::kUniqueID, sync_data.unique_id()); - EXPECT_EQ(syncer::TimeToProtoTime(test_data::kTimestamp), - sync_data.timestamp_msec()); - EXPECT_EQ(test_data::kTimestamp.ToInternalValue(), sync_data.global_id()); - EXPECT_EQ(test_data::kFaviconURL.spec(), sync_data.favicon_url()); - EXPECT_EQ(test_data::kHttpStatusCode, sync_data.http_status_code()); - // The proto navigation redirects don't include the final chain entry - // (because it didn't redirect) so the lengths should differ by 1. - ASSERT_EQ(3, sync_data.navigation_redirect_size() + 1); - EXPECT_EQ(test_data::kRedirectURL0.spec(), - sync_data.navigation_redirect(0).url()); - EXPECT_EQ(test_data::kRedirectURL1.spec(), - sync_data.navigation_redirect(1).url()); - EXPECT_FALSE(sync_data.has_last_navigation_redirect_url()); - EXPECT_FALSE(sync_data.has_replaced_navigation()); -} - -// Specifically test the |replaced_navigation| field, which should be populated -// when the navigation entry has been replaced by another entry (e.g. -// history.pushState()). -TEST(SerializedNavigationEntryTest, ReplacedNavigation) { - const GURL kReplacedURL = GURL("http://replaced-url.com"); - const int kReplacedTimestampMs = 79; - const ui::PageTransition kReplacedPageTransition = - ui::PAGE_TRANSITION_AUTO_BOOKMARK; - - SerializedNavigationEntry navigation = - SerializedNavigationEntryTestHelper::CreateNavigationForTest(); - SerializedNavigationEntryTestHelper::SetReplacedEntryData( - {kReplacedURL, syncer::ProtoTimeToTime(kReplacedTimestampMs), - kReplacedPageTransition}, - &navigation); - - const sync_pb::TabNavigation sync_data = navigation.ToSyncData(); - EXPECT_TRUE(sync_data.has_replaced_navigation()); - EXPECT_EQ(kReplacedURL.spec(), - sync_data.replaced_navigation().first_committed_url()); - EXPECT_EQ(kReplacedTimestampMs, - sync_data.replaced_navigation().first_timestamp_msec()); - EXPECT_EQ(sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK, - sync_data.replaced_navigation().first_page_transition()); -} - -// Test that the last_navigation_redirect_url is set when needed. This test is -// just like the above, but with a different virtual_url. Create a -// SerializedNavigationEntry, then create a sync protocol buffer from it. The -// protocol buffer should have a last_navigation_redirect_url. -TEST(SerializedNavigationEntryTest, LastNavigationRedirectUrl) { - SerializedNavigationEntry navigation = - SerializedNavigationEntryTestHelper::CreateNavigationForTest(); - SerializedNavigationEntryTestHelper::SetVirtualURL( - test_data::kOtherURL, &navigation); - - const sync_pb::TabNavigation sync_data = navigation.ToSyncData(); - EXPECT_TRUE(sync_data.has_last_navigation_redirect_url()); - EXPECT_EQ(test_data::kVirtualURL.spec(), - sync_data.last_navigation_redirect_url()); - - // The redirect chain should be the same as in the above test. - ASSERT_EQ(3, sync_data.navigation_redirect_size() + 1); - EXPECT_EQ(test_data::kRedirectURL0.spec(), - sync_data.navigation_redirect(0).url()); - EXPECT_EQ(test_data::kRedirectURL1.spec(), - sync_data.navigation_redirect(1).url()); -} - -// Ensure all transition types and qualifiers are converted to/from the sync -// SerializedNavigationEntry representation properly. -TEST(SerializedNavigationEntryTest, TransitionTypes) { - SerializedNavigationEntry navigation = - SerializedNavigationEntryTestHelper::CreateNavigationForTest(); - - for (uint32_t core_type = ui::PAGE_TRANSITION_LINK; - core_type < ui::PAGE_TRANSITION_LAST_CORE; ++core_type) { - // Because qualifier is a uint32_t, left shifting will eventually overflow - // and hit zero again. SERVER_REDIRECT, as the last qualifier and also - // in place of the sign bit, is therefore the last transition before - // breaking. - for (uint32_t qualifier = ui::PAGE_TRANSITION_FORWARD_BACK; qualifier != 0; - qualifier <<= 1) { - if (qualifier == 0x08000000) - continue; // 0x08000000 is not a valid qualifier. - ui::PageTransition transition = - ui::PageTransitionFromInt(core_type | qualifier); - SerializedNavigationEntryTestHelper::SetTransitionType( - transition, &navigation); - - const sync_pb::TabNavigation& sync_data = navigation.ToSyncData(); - const SerializedNavigationEntry& constructed_nav = - SerializedNavigationEntry::FromSyncData(test_data::kIndex, sync_data); - const ui::PageTransition constructed_transition = - constructed_nav.transition_type(); - - EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( - constructed_transition, transition)); - } - } -} - } // namespace } // namespace sessions
diff --git a/components/sessions/core/session_types.cc b/components/sessions/core/session_types.cc index ff8a23e..066099d 100644 --- a/components/sessions/core/session_types.cc +++ b/components/sessions/core/session_types.cc
@@ -10,8 +10,6 @@ namespace sessions { -//using class SerializedNavigationEntry; - // SessionTab ----------------------------------------------------------------- SessionTab::SessionTab() @@ -24,38 +22,6 @@ SessionTab::~SessionTab() { } -void SessionTab::SetFromSyncData(const sync_pb::SessionTab& sync_data, - base::Time timestamp) { - window_id = SessionID::FromSerializedValue(sync_data.window_id()); - tab_id = SessionID::FromSerializedValue(sync_data.tab_id()); - tab_visual_index = sync_data.tab_visual_index(); - current_navigation_index = sync_data.current_navigation_index(); - pinned = sync_data.pinned(); - extension_app_id = sync_data.extension_app_id(); - user_agent_override.clear(); - this->timestamp = timestamp; - navigations.clear(); - for (int i = 0; i < sync_data.navigation_size(); ++i) { - navigations.push_back( - SerializedNavigationEntry::FromSyncData(i, sync_data.navigation(i))); - } - session_storage_persistent_id.clear(); -} - -sync_pb::SessionTab SessionTab::ToSyncData() const { - sync_pb::SessionTab sync_data; - sync_data.set_tab_id(tab_id.id()); - sync_data.set_window_id(window_id.id()); - sync_data.set_tab_visual_index(tab_visual_index); - sync_data.set_current_navigation_index(current_navigation_index); - sync_data.set_pinned(pinned); - sync_data.set_extension_app_id(extension_app_id); - for (const SerializedNavigationEntry& navigation : navigations) { - *sync_data.add_navigation() = navigation.ToSyncData(); - } - return sync_data; -} - // SessionWindow --------------------------------------------------------------- SessionWindow::SessionWindow()
diff --git a/components/sessions/core/session_types.h b/components/sessions/core/session_types.h index 5ac0325..b161ca5 100644 --- a/components/sessions/core/session_types.h +++ b/components/sessions/core/session_types.h
@@ -16,7 +16,6 @@ #include "components/sessions/core/serialized_navigation_entry.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/sessions_export.h" -#include "components/sync/protocol/session_specifics.pb.h" #include "components/variations/variations_associated_data.h" #include "ui/base/ui_base_types.h" #include "ui/gfx/geometry/rect.h" @@ -40,20 +39,6 @@ static_cast<int>(navigations.size() - 1))); } - // Set all the fields of this object from the given sync data and - // timestamp. Uses SerializedNavigationEntry::FromSyncData to fill - // |navigations|. Note that the sync protocol buffer doesn't - // contain all SerializedNavigationEntry fields. - void SetFromSyncData(const sync_pb::SessionTab& sync_data, - base::Time timestamp); - - // Convert this object into its sync protocol buffer equivalent. - // Uses SerializedNavigationEntry::ToSyncData to convert |navigations|. Note - // that the protocol buffer doesn't contain all SerializedNavigationEntry - // fields, and that the returned protocol buffer doesn't have any - // favicon data. - sync_pb::SessionTab ToSyncData() const; - // Unique id of the window. SessionID window_id;
diff --git a/components/sessions/core/session_types_unittest.cc b/components/sessions/core/session_types_unittest.cc deleted file mode 100644 index e672c9e8..0000000 --- a/components/sessions/core/session_types_unittest.cc +++ /dev/null
@@ -1,111 +0,0 @@ -// Copyright 2012 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/sessions/core/session_types.h" - -#include <cstddef> -#include <string> - -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "base/time/time.h" -#include "components/sessions/core/serialized_navigation_entry_test_helper.h" -#include "components/sync/base/time.h" -#include "components/sync/protocol/session_specifics.pb.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/page_transition_types.h" -#include "url/gurl.h" - -namespace { - -// Create a typical SessionTab protocol buffer and set an existing -// SessionTab from it. The data from the protocol buffer should -// clobber the existing data. -TEST(SessionTab, FromSyncData) { - sync_pb::SessionTab sync_data; - sync_data.set_tab_id(5); - sync_data.set_window_id(10); - sync_data.set_tab_visual_index(13); - sync_data.set_current_navigation_index(3); - sync_data.set_pinned(true); - sync_data.set_extension_app_id("app_id"); - for (int i = 0; i < 5; ++i) { - sync_pb::TabNavigation* navigation = sync_data.add_navigation(); - navigation->set_virtual_url("http://foo/" + base::IntToString(i)); - navigation->set_referrer("referrer"); - navigation->set_title("title"); - navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED); - } - - sessions::SessionTab tab; - tab.window_id = SessionID::FromSerializedValue(100); - tab.tab_id = SessionID::FromSerializedValue(100); - tab.tab_visual_index = 100; - tab.current_navigation_index = 1000; - tab.pinned = false; - tab.extension_app_id = "fake"; - tab.user_agent_override = "fake"; - tab.timestamp = base::Time::FromInternalValue(100); - tab.navigations.resize(100); - tab.session_storage_persistent_id = "fake"; - - tab.SetFromSyncData(sync_data, base::Time::FromInternalValue(5u)); - EXPECT_EQ(10, tab.window_id.id()); - EXPECT_EQ(5, tab.tab_id.id()); - EXPECT_EQ(13, tab.tab_visual_index); - EXPECT_EQ(3, tab.current_navigation_index); - EXPECT_TRUE(tab.pinned); - EXPECT_EQ("app_id", tab.extension_app_id); - EXPECT_TRUE(tab.user_agent_override.empty()); - EXPECT_EQ(5u, tab.timestamp.ToInternalValue()); - ASSERT_EQ(5u, tab.navigations.size()); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, tab.navigations[i].index()); - EXPECT_EQ(GURL("referrer"), tab.navigations[i].referrer_url()); - EXPECT_EQ(base::ASCIIToUTF16("title"),tab.navigations[i].title()); - EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( - tab.navigations[i].transition_type(), ui::PAGE_TRANSITION_TYPED)); - EXPECT_EQ(GURL("http://foo/" + base::IntToString(i)), - tab.navigations[i].virtual_url()); - } - EXPECT_TRUE(tab.session_storage_persistent_id.empty()); -} - -TEST(SessionTab, ToSyncData) { - sessions::SessionTab tab; - tab.window_id = SessionID::FromSerializedValue(10); - tab.tab_id = SessionID::FromSerializedValue(5); - tab.tab_visual_index = 13; - tab.current_navigation_index = 3; - tab.pinned = true; - tab.extension_app_id = "app_id"; - tab.user_agent_override = "fake"; - tab.timestamp = base::Time::FromInternalValue(100); - for (int i = 0; i < 5; ++i) { - tab.navigations.push_back( - sessions::SerializedNavigationEntryTestHelper::CreateNavigation( - "http://foo/" + base::IntToString(i), "title")); - } - tab.session_storage_persistent_id = "fake"; - - const sync_pb::SessionTab& sync_data = tab.ToSyncData(); - EXPECT_EQ(5, sync_data.tab_id()); - EXPECT_EQ(10, sync_data.window_id()); - EXPECT_EQ(13, sync_data.tab_visual_index()); - EXPECT_EQ(3, sync_data.current_navigation_index()); - EXPECT_TRUE(sync_data.pinned()); - EXPECT_EQ("app_id", sync_data.extension_app_id()); - ASSERT_EQ(5, sync_data.navigation_size()); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(tab.navigations[i].virtual_url().spec(), - sync_data.navigation(i).virtual_url()); - EXPECT_EQ(base::UTF16ToUTF8(tab.navigations[i].title()), - sync_data.navigation(i).title()); - } - EXPECT_FALSE(sync_data.has_favicon()); - EXPECT_FALSE(sync_data.has_favicon_type()); - EXPECT_FALSE(sync_data.has_favicon_source()); -} - -} // namespace
diff --git a/components/subresource_filter/core/common/indexed_ruleset.cc b/components/subresource_filter/core/common/indexed_ruleset.cc index c036bab..c1493cd2 100644 --- a/components/subresource_filter/core/common/indexed_ruleset.cc +++ b/components/subresource_filter/core/common/indexed_ruleset.cc
@@ -66,12 +66,15 @@ // static bool IndexedRulesetMatcher::Verify(const uint8_t* buffer, size_t size) { - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"), - "IndexedRulesetMatcher::Verify"); + TRACE_EVENT_BEGIN1(TRACE_DISABLED_BY_DEFAULT("loading"), + "IndexedRulesetMatcher::Verify", "size", size); SCOPED_UMA_HISTOGRAM_TIMER( "SubresourceFilter.IndexRuleset.Verify2.WallDuration"); flatbuffers::Verifier verifier(buffer, size); - return flat::VerifyIndexedRulesetBuffer(verifier); + bool valid = flat::VerifyIndexedRulesetBuffer(verifier); + TRACE_EVENT_END1(TRACE_DISABLED_BY_DEFAULT("loading"), + "IndexedRulesetMatcher::Verify", "valid", valid); + return valid; } IndexedRulesetMatcher::IndexedRulesetMatcher(const uint8_t* buffer, size_t size)
diff --git a/components/sync_sessions/BUILD.gn b/components/sync_sessions/BUILD.gn index 75526a2..7be002c27 100644 --- a/components/sync_sessions/BUILD.gn +++ b/components/sync_sessions/BUILD.gn
@@ -103,6 +103,7 @@ "sessions_global_id_mapper_unittest.cc", "sessions_sync_manager_unittest.cc", "synced_session_tracker_unittest.cc", + "synced_session_unittest.cc", "tab_node_pool_unittest.cc", "task_tracker_unittest.cc", ]
diff --git a/components/sync_sessions/local_session_event_handler_impl.cc b/components/sync_sessions/local_session_event_handler_impl.cc index 62106fb0..a538a584 100644 --- a/components/sync_sessions/local_session_event_handler_impl.cc +++ b/components/sync_sessions/local_session_event_handler_impl.cc
@@ -420,7 +420,7 @@ // Rewrite the specifics based on the reassociated SessionTab to preserve // the new window id. auto specifics = std::make_unique<sync_pb::SessionSpecifics>(); - local_tab->ToSyncData().Swap(specifics->mutable_tab()); + SessionTabToSyncData(*local_tab).Swap(specifics->mutable_tab()); specifics->set_session_tag(current_session_tag_); specifics->set_tab_node_id(tab_node_id); batch->Put(std::move(specifics)); @@ -458,7 +458,7 @@ specifics.set_current_navigation_index(specifics.navigation_size()); sync_pb::TabNavigation* navigation = specifics.add_navigation(); - serialized_entry.ToSyncData().Swap(navigation); + SessionNavigationToSyncData(serialized_entry).Swap(navigation); if (is_supervised) { navigation->set_blocked_state( @@ -477,7 +477,7 @@ blocked_navigations = *tab_delegate.GetBlockedNavigations(); for (size_t i = 0; i < blocked_navigations.size(); ++i) { sync_pb::TabNavigation* navigation = specifics.add_navigation(); - blocked_navigations[i]->ToSyncData().Swap(navigation); + SessionNavigationToSyncData(*blocked_navigations[i]).Swap(navigation); navigation->set_blocked_state( sync_pb::TabNavigation_BlockedState_STATE_BLOCKED); // TODO(bauerb): Add categories
diff --git a/components/sync_sessions/sessions_sync_manager.cc b/components/sync_sessions/sessions_sync_manager.cc index bec28a23..3df84307 100644 --- a/components/sync_sessions/sessions_sync_manager.cc +++ b/components/sync_sessions/sessions_sync_manager.cc
@@ -62,7 +62,7 @@ const std::string& local_tag, int tab_node_id) { sync_pb::SessionSpecifics specifics; - session_tab.ToSyncData().Swap(specifics.mutable_tab()); + SessionTabToSyncData(session_tab).Swap(specifics.mutable_tab()); specifics.set_session_tag(local_tag); specifics.set_tab_node_id(tab_node_id); return specifics;
diff --git a/components/sync_sessions/synced_session.cc b/components/sync_sessions/synced_session.cc index a096259f..95995d59 100644 --- a/components/sync_sessions/synced_session.cc +++ b/components/sync_sessions/synced_session.cc
@@ -4,7 +4,321 @@ #include "components/sync_sessions/synced_session.h" +#include <vector> + +#include "base/strings/utf_string_conversions.h" +#include "components/sessions/core/serialized_navigation_driver.h" +#include "components/sync/base/time.h" +#include "ui/base/page_transition_types.h" + namespace sync_sessions { +namespace { + +using sessions::SerializedNavigationEntry; + +// The previous referrer policy value corresponding to |Never|. +// See original constant in serialized_navigation_entry.cc. +const int kObsoleteReferrerPolicyNever = 2; + +sync_pb::SyncEnums_PageTransition ToSyncPageTransition( + ui::PageTransition transition_type) { + switch (ui::PageTransitionStripQualifier(transition_type)) { + case ui::PAGE_TRANSITION_LINK: + return sync_pb::SyncEnums_PageTransition_LINK; + + case ui::PAGE_TRANSITION_TYPED: + return sync_pb::SyncEnums_PageTransition_TYPED; + + case ui::PAGE_TRANSITION_AUTO_BOOKMARK: + return sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK; + + case ui::PAGE_TRANSITION_AUTO_SUBFRAME: + return sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME; + + case ui::PAGE_TRANSITION_MANUAL_SUBFRAME: + return sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME; + + case ui::PAGE_TRANSITION_GENERATED: + return sync_pb::SyncEnums_PageTransition_GENERATED; + + case ui::PAGE_TRANSITION_AUTO_TOPLEVEL: + return sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL; + + case ui::PAGE_TRANSITION_FORM_SUBMIT: + return sync_pb::SyncEnums_PageTransition_FORM_SUBMIT; + + case ui::PAGE_TRANSITION_RELOAD: + return sync_pb::SyncEnums_PageTransition_RELOAD; + + case ui::PAGE_TRANSITION_KEYWORD: + return sync_pb::SyncEnums_PageTransition_KEYWORD; + + case ui::PAGE_TRANSITION_KEYWORD_GENERATED: + return sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED; + + // Non-core values listed here although unreachable: + case ui::PAGE_TRANSITION_CORE_MASK: + case ui::PAGE_TRANSITION_BLOCKED: + case ui::PAGE_TRANSITION_FORWARD_BACK: + case ui::PAGE_TRANSITION_FROM_ADDRESS_BAR: + case ui::PAGE_TRANSITION_HOME_PAGE: + case ui::PAGE_TRANSITION_FROM_API: + case ui::PAGE_TRANSITION_CHAIN_START: + case ui::PAGE_TRANSITION_CHAIN_END: + case ui::PAGE_TRANSITION_CLIENT_REDIRECT: + case ui::PAGE_TRANSITION_SERVER_REDIRECT: + case ui::PAGE_TRANSITION_IS_REDIRECT_MASK: + case ui::PAGE_TRANSITION_QUALIFIER_MASK: + break; + } + NOTREACHED(); + return sync_pb::SyncEnums_PageTransition_LINK; +} + +ui::PageTransition FromSyncPageTransition( + sync_pb::SyncEnums_PageTransition transition_type) { + switch (transition_type) { + case sync_pb::SyncEnums_PageTransition_LINK: + return ui::PAGE_TRANSITION_LINK; + + case sync_pb::SyncEnums_PageTransition_TYPED: + return ui::PAGE_TRANSITION_TYPED; + + case sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK: + return ui::PAGE_TRANSITION_AUTO_BOOKMARK; + + case sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME: + return ui::PAGE_TRANSITION_AUTO_SUBFRAME; + + case sync_pb::SyncEnums_PageTransition_MANUAL_SUBFRAME: + return ui::PAGE_TRANSITION_MANUAL_SUBFRAME; + + case sync_pb::SyncEnums_PageTransition_GENERATED: + return ui::PAGE_TRANSITION_GENERATED; + + case sync_pb::SyncEnums_PageTransition_AUTO_TOPLEVEL: + return ui::PAGE_TRANSITION_AUTO_TOPLEVEL; + + case sync_pb::SyncEnums_PageTransition_FORM_SUBMIT: + return ui::PAGE_TRANSITION_FORM_SUBMIT; + + case sync_pb::SyncEnums_PageTransition_RELOAD: + return ui::PAGE_TRANSITION_RELOAD; + + case sync_pb::SyncEnums_PageTransition_KEYWORD: + return ui::PAGE_TRANSITION_KEYWORD; + + case sync_pb::SyncEnums_PageTransition_KEYWORD_GENERATED: + return ui::PAGE_TRANSITION_KEYWORD_GENERATED; + } + return ui::PAGE_TRANSITION_LINK; +} + +} // namespace + +SerializedNavigationEntry SessionNavigationFromSyncData( + int index, + const sync_pb::TabNavigation& sync_data) { + SerializedNavigationEntry navigation; + navigation.set_index(index); + navigation.set_unique_id(sync_data.unique_id()); + if (sync_data.has_correct_referrer_policy()) { + navigation.set_referrer_url(GURL(sync_data.referrer())); + navigation.set_referrer_policy(sync_data.correct_referrer_policy()); + } else { + navigation.set_referrer_url(GURL()); + navigation.set_referrer_policy(kObsoleteReferrerPolicyNever); + } + navigation.set_virtual_url(GURL(sync_data.virtual_url())); + navigation.set_title(base::UTF8ToUTF16(sync_data.title())); + + uint32_t transition = FromSyncPageTransition(sync_data.page_transition()); + + if (sync_data.has_redirect_type()) { + switch (sync_data.redirect_type()) { + case sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT: + transition |= ui::PAGE_TRANSITION_CLIENT_REDIRECT; + break; + case sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT: + transition |= ui::PAGE_TRANSITION_SERVER_REDIRECT; + break; + } + } + if (sync_data.navigation_forward_back()) + transition |= ui::PAGE_TRANSITION_FORWARD_BACK; + if (sync_data.navigation_from_address_bar()) + transition |= ui::PAGE_TRANSITION_FROM_ADDRESS_BAR; + if (sync_data.navigation_home_page()) + transition |= ui::PAGE_TRANSITION_HOME_PAGE; + if (sync_data.navigation_chain_start()) + transition |= ui::PAGE_TRANSITION_CHAIN_START; + if (sync_data.navigation_chain_end()) + transition |= ui::PAGE_TRANSITION_CHAIN_END; + + navigation.set_transition_type(static_cast<ui::PageTransition>(transition)); + + navigation.set_timestamp(syncer::ProtoTimeToTime(sync_data.timestamp_msec())); + if (sync_data.has_favicon_url()) + navigation.set_favicon_url(GURL(sync_data.favicon_url())); + + if (sync_data.has_password_state()) { + navigation.set_password_state( + static_cast<SerializedNavigationEntry::PasswordState>( + sync_data.password_state())); + } + + navigation.set_http_status_code(sync_data.http_status_code()); + + if (sync_data.has_replaced_navigation()) { + SerializedNavigationEntry::ReplacedNavigationEntryData replaced_entry_data; + replaced_entry_data.first_committed_url = + GURL(sync_data.replaced_navigation().first_committed_url()); + replaced_entry_data.first_timestamp = syncer::ProtoTimeToTime( + sync_data.replaced_navigation().first_timestamp_msec()); + replaced_entry_data.first_transition_type = FromSyncPageTransition( + sync_data.replaced_navigation().first_page_transition()); + navigation.set_replaced_entry_data(replaced_entry_data); + } + + sessions::SerializedNavigationDriver::Get()->Sanitize(&navigation); + + navigation.set_is_restored(true); + + return navigation; +} + +// TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? +// See http://crbug.com/67068. +sync_pb::TabNavigation SessionNavigationToSyncData( + const SerializedNavigationEntry& navigation) { + sync_pb::TabNavigation sync_data; + sync_data.set_virtual_url(navigation.virtual_url().spec()); + sync_data.set_referrer(navigation.referrer_url().spec()); + sync_data.set_correct_referrer_policy(navigation.referrer_policy()); + sync_data.set_title(base::UTF16ToUTF8(navigation.title())); + + // Page transition core. + static_assert(static_cast<int32_t>(ui::PAGE_TRANSITION_LAST_CORE) == + static_cast<int32_t>(ui::PAGE_TRANSITION_KEYWORD_GENERATED), + "PAGE_TRANSITION_LAST_CORE must equal " + "PAGE_TRANSITION_KEYWORD_GENERATED"); + const ui::PageTransition transition_type = navigation.transition_type(); + sync_data.set_page_transition(ToSyncPageTransition(transition_type)); + + // Page transition qualifiers. + if (ui::PageTransitionIsRedirect(transition_type)) { + if (transition_type & ui::PAGE_TRANSITION_CLIENT_REDIRECT) { + sync_data.set_redirect_type( + sync_pb::SyncEnums_PageTransitionRedirectType_CLIENT_REDIRECT); + } else if (transition_type & ui::PAGE_TRANSITION_SERVER_REDIRECT) { + sync_data.set_redirect_type( + sync_pb::SyncEnums_PageTransitionRedirectType_SERVER_REDIRECT); + } + } + sync_data.set_navigation_forward_back( + (transition_type & ui::PAGE_TRANSITION_FORWARD_BACK) != 0); + sync_data.set_navigation_from_address_bar( + (transition_type & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR) != 0); + sync_data.set_navigation_home_page( + (transition_type & ui::PAGE_TRANSITION_HOME_PAGE) != 0); + sync_data.set_navigation_chain_start( + (transition_type & ui::PAGE_TRANSITION_CHAIN_START) != 0); + sync_data.set_navigation_chain_end( + (transition_type & ui::PAGE_TRANSITION_CHAIN_END) != 0); + + sync_data.set_unique_id(navigation.unique_id()); + sync_data.set_timestamp_msec(syncer::TimeToProtoTime(navigation.timestamp())); + // The full-resolution timestamp works as a global ID. + sync_data.set_global_id(navigation.timestamp().ToInternalValue()); + + sync_data.set_http_status_code(navigation.http_status_code()); + + if (navigation.favicon_url().is_valid()) + sync_data.set_favicon_url(navigation.favicon_url().spec()); + + if (navigation.blocked_state() != SerializedNavigationEntry::STATE_INVALID) { + sync_data.set_blocked_state( + static_cast<sync_pb::TabNavigation_BlockedState>( + navigation.blocked_state())); + } + + sync_data.set_password_state( + static_cast<sync_pb::TabNavigation_PasswordState>( + navigation.password_state())); + + for (const std::string& content_pack_category : + navigation.content_pack_categories()) { + sync_data.add_content_pack_categories(content_pack_category); + } + + // Copy all redirect chain entries except the last URL (which should match + // the virtual_url). + const std::vector<GURL>& redirect_chain = navigation.redirect_chain(); + if (redirect_chain.size() > 1) { // Single entry chains have no redirection. + size_t last_entry = redirect_chain.size() - 1; + for (size_t i = 0; i < last_entry; i++) { + sync_pb::NavigationRedirect* navigation_redirect = + sync_data.add_navigation_redirect(); + navigation_redirect->set_url(redirect_chain[i].spec()); + } + // If the last URL didn't match the virtual_url, record it separately. + if (sync_data.virtual_url() != redirect_chain[last_entry].spec()) { + sync_data.set_last_navigation_redirect_url( + redirect_chain[last_entry].spec()); + } + } + + const base::Optional<SerializedNavigationEntry::ReplacedNavigationEntryData>& + replaced_entry_data = navigation.replaced_entry_data(); + if (replaced_entry_data.has_value()) { + sync_pb::ReplacedNavigation* replaced_navigation = + sync_data.mutable_replaced_navigation(); + replaced_navigation->set_first_committed_url( + replaced_entry_data->first_committed_url.spec()); + replaced_navigation->set_first_timestamp_msec( + syncer::TimeToProtoTime(replaced_entry_data->first_timestamp)); + replaced_navigation->set_first_page_transition( + ToSyncPageTransition(replaced_entry_data->first_transition_type)); + } + + sync_data.set_is_restored(navigation.is_restored()); + + return sync_data; +} + +void SetSessionTabFromSyncData(const sync_pb::SessionTab& sync_data, + base::Time timestamp, + sessions::SessionTab* tab) { + DCHECK(tab); + tab->window_id = SessionID::FromSerializedValue(sync_data.window_id()); + tab->tab_id = SessionID::FromSerializedValue(sync_data.tab_id()); + tab->tab_visual_index = sync_data.tab_visual_index(); + tab->current_navigation_index = sync_data.current_navigation_index(); + tab->pinned = sync_data.pinned(); + tab->extension_app_id = sync_data.extension_app_id(); + tab->user_agent_override.clear(); + tab->timestamp = timestamp; + tab->navigations.clear(); + for (int i = 0; i < sync_data.navigation_size(); ++i) { + tab->navigations.push_back( + SessionNavigationFromSyncData(i, sync_data.navigation(i))); + } + tab->session_storage_persistent_id.clear(); +} + +sync_pb::SessionTab SessionTabToSyncData(const sessions::SessionTab& tab) { + sync_pb::SessionTab sync_data; + sync_data.set_tab_id(tab.tab_id.id()); + sync_data.set_window_id(tab.window_id.id()); + sync_data.set_tab_visual_index(tab.tab_visual_index); + sync_data.set_current_navigation_index(tab.current_navigation_index); + sync_data.set_pinned(tab.pinned); + sync_data.set_extension_app_id(tab.extension_app_id); + for (const SerializedNavigationEntry& navigation : tab.navigations) { + SessionNavigationToSyncData(navigation).Swap(sync_data.add_navigation()); + } + return sync_data; +} SyncedSessionWindow::SyncedSessionWindow() {}
diff --git a/components/sync_sessions/synced_session.h b/components/sync_sessions/synced_session.h index 772457b..5b63378 100644 --- a/components/sync_sessions/synced_session.h +++ b/components/sync_sessions/synced_session.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/time/time.h" +#include "components/sessions/core/serialized_navigation_entry.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/session_types.h" #include "components/sync/protocol/session_specifics.pb.h" @@ -19,6 +20,34 @@ namespace sync_sessions { +// Construct a SerializedNavigationEntry for a particular index from a sync +// protocol buffer. Note that the sync protocol buffer doesn't contain all +// SerializedNavigationEntry fields. Also, the timestamp of the returned +// SerializedNavigationEntry is nulled out, as we assume that the protocol +// buffer is from a foreign session. +sessions::SerializedNavigationEntry SessionNavigationFromSyncData( + int index, + const sync_pb::TabNavigation& sync_data); + +// Convert |navigation| into its sync protocol buffer equivalent. Note that the +// protocol buffer doesn't contain all SerializedNavigationEntry fields. +sync_pb::TabNavigation SessionNavigationToSyncData( + const sessions::SerializedNavigationEntry& navigation); + +// Set all the fields of |*tab| object from the given sync data and timestamp. +// Uses SerializedNavigationEntry::FromSyncData() to fill |navigations|. Note +// that the sync protocol buffer doesn't contain all SerializedNavigationEntry +// fields. |tab| must not be null. +void SetSessionTabFromSyncData(const sync_pb::SessionTab& sync_data, + base::Time timestamp, + sessions::SessionTab* tab); + +// Convert |tab| into its sync protocol buffer equivalent. Uses +// SerializedNavigationEntry::ToSyncData to convert |navigations|. Note that the +// protocol buffer doesn't contain all SerializedNavigationEntry fields, and +// that the returned protocol buffer doesn't have any favicon data. +sync_pb::SessionTab SessionTabToSyncData(const sessions::SessionTab& tab); + // A Sync wrapper for a SessionWindow. struct SyncedSessionWindow { SyncedSessionWindow();
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc index ad682bf..c757b17 100644 --- a/components/sync_sessions/synced_session_tracker.cc +++ b/components/sync_sessions/synced_session_tracker.cc
@@ -696,7 +696,7 @@ } // Update SessionTab based on protobuf. - tab->SetFromSyncData(tab_s, modification_time); + SetSessionTabFromSyncData(tab_s, modification_time, tab); // Update the last modified time. if (session->modified_time < modification_time) @@ -778,7 +778,7 @@ sync_pb::SessionSpecifics tab_pb; tab_pb.set_session_tag(session_tag); tab_pb.set_tab_node_id(tab_node_id); - tab->ToSyncData().Swap(tab_pb.mutable_tab()); + SessionTabToSyncData(*tab).Swap(tab_pb.mutable_tab()); output_cb.Run(session->session_name, &tab_pb); continue; }
diff --git a/components/sync_sessions/synced_session_tracker.h b/components/sync_sessions/synced_session_tracker.h index 2ebdc88..fe67be5 100644 --- a/components/sync_sessions/synced_session_tracker.h +++ b/components/sync_sessions/synced_session_tracker.h
@@ -143,8 +143,6 @@ // Returns a pointer to the SessionTab object associated with // |tab_id| for the session specified with |session_tag|. // Note: Ownership of the SessionTab remains within the SyncedSessionTracker. - // TODO(zea): Replace SessionTab with a Sync specific wrapper. - // https://crbug.com/662597 sessions::SessionTab* GetTab(const std::string& session_tag, SessionID tab_id);
diff --git a/components/sync_sessions/synced_session_unittest.cc b/components/sync_sessions/synced_session_unittest.cc new file mode 100644 index 0000000..dc709c2 --- /dev/null +++ b/components/sync_sessions/synced_session_unittest.cc
@@ -0,0 +1,282 @@ +// Copyright 2012 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_sessions/synced_session.h" + +#include <cstddef> +#include <string> + +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" +#include "components/sessions/core/serialized_navigation_entry_test_helper.h" +#include "components/sync/base/time.h" +#include "components/sync/protocol/session_specifics.pb.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/page_transition_types.h" +#include "url/gurl.h" + +namespace sync_sessions { +namespace { + +namespace test_data = sessions::test_data; + +using sessions::SerializedNavigationEntry; +using sessions::SerializedNavigationEntryTestHelper; + +// Create a sync_pb::TabNavigation from the constants above. +sync_pb::TabNavigation MakeSyncDataForTest() { + sync_pb::TabNavigation sync_data; + sync_data.set_virtual_url(test_data::kVirtualURL.spec()); + sync_data.set_referrer(test_data::kReferrerURL.spec()); + sync_data.set_obsolete_referrer_policy(test_data::kReferrerPolicy); + sync_data.set_correct_referrer_policy(test_data::kReferrerPolicy); + sync_data.set_title(base::UTF16ToUTF8(test_data::kTitle)); + sync_data.set_page_transition( + sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME); + sync_data.set_unique_id(test_data::kUniqueID); + sync_data.set_timestamp_msec(syncer::TimeToProtoTime(test_data::kTimestamp)); + sync_data.set_redirect_type(sync_pb::SyncEnums::CLIENT_REDIRECT); + sync_data.set_navigation_home_page(true); + sync_data.set_favicon_url(test_data::kFaviconURL.spec()); + sync_data.set_http_status_code(test_data::kHttpStatusCode); + // The redirect chain only syncs one way. + return sync_data; +} + +// Create a SerializedNavigationEntry from a sync_pb::TabNavigation. All its +// fields should match the protocol buffer's if it exists there, and +// should be set to the default value otherwise. +TEST(SyncedSessionTest, SessionNavigationFromSyncData) { + const sync_pb::TabNavigation sync_data = MakeSyncDataForTest(); + + const SerializedNavigationEntry navigation = + SessionNavigationFromSyncData(test_data::kIndex, sync_data); + + EXPECT_EQ(test_data::kIndex, navigation.index()); + EXPECT_EQ(test_data::kUniqueID, navigation.unique_id()); + EXPECT_EQ(test_data::kReferrerURL, navigation.referrer_url()); + EXPECT_EQ(test_data::kReferrerPolicy, navigation.referrer_policy()); + EXPECT_EQ(test_data::kVirtualURL, navigation.virtual_url()); + EXPECT_EQ(test_data::kTitle, navigation.title()); + EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( + navigation.transition_type(), test_data::kTransitionType)); + EXPECT_FALSE(navigation.has_post_data()); + EXPECT_EQ(-1, navigation.post_id()); + EXPECT_EQ(GURL(), navigation.original_request_url()); + EXPECT_FALSE(navigation.is_overriding_user_agent()); + EXPECT_EQ(test_data::kTimestamp, navigation.timestamp()); + EXPECT_EQ(test_data::kFaviconURL, navigation.favicon_url()); + EXPECT_EQ(test_data::kHttpStatusCode, navigation.http_status_code()); + // The redirect chain only syncs one way. +} + +// Create a SerializedNavigationEntry, then create a sync protocol buffer from +// it. The protocol buffer should have matching fields to the +// SerializedNavigationEntry (when applicable). +TEST(SyncedSessionTest, SessionNavigationToSyncData) { + const SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + const sync_pb::TabNavigation sync_data = + SessionNavigationToSyncData(navigation); + + EXPECT_EQ(test_data::kVirtualURL.spec(), sync_data.virtual_url()); + EXPECT_EQ(test_data::kReferrerURL.spec(), sync_data.referrer()); + EXPECT_EQ(test_data::kTitle, base::ASCIIToUTF16(sync_data.title())); + EXPECT_EQ(sync_pb::SyncEnums_PageTransition_AUTO_SUBFRAME, + sync_data.page_transition()); + EXPECT_TRUE(sync_data.has_redirect_type()); + EXPECT_EQ(test_data::kUniqueID, sync_data.unique_id()); + EXPECT_EQ(syncer::TimeToProtoTime(test_data::kTimestamp), + sync_data.timestamp_msec()); + EXPECT_EQ(test_data::kTimestamp.ToInternalValue(), sync_data.global_id()); + EXPECT_EQ(test_data::kFaviconURL.spec(), sync_data.favicon_url()); + EXPECT_EQ(test_data::kHttpStatusCode, sync_data.http_status_code()); + // The proto navigation redirects don't include the final chain entry + // (because it didn't redirect) so the lengths should differ by 1. + ASSERT_EQ(3, sync_data.navigation_redirect_size() + 1); + EXPECT_EQ(test_data::kRedirectURL0.spec(), + sync_data.navigation_redirect(0).url()); + EXPECT_EQ(test_data::kRedirectURL1.spec(), + sync_data.navigation_redirect(1).url()); + EXPECT_FALSE(sync_data.has_last_navigation_redirect_url()); + EXPECT_FALSE(sync_data.has_replaced_navigation()); +} + +// Specifically test the |replaced_navigation| field, which should be populated +// when the navigation entry has been replaced by another entry (e.g. +// history.pushState()). +TEST(SyncedSessionTest, SessionNavigationToSyncDataWithReplacedNavigation) { + const GURL kReplacedURL = GURL("http://replaced-url.com"); + const int kReplacedTimestampMs = 79; + const ui::PageTransition kReplacedPageTransition = + ui::PAGE_TRANSITION_AUTO_BOOKMARK; + + SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + SerializedNavigationEntryTestHelper::SetReplacedEntryData( + {kReplacedURL, syncer::ProtoTimeToTime(kReplacedTimestampMs), + kReplacedPageTransition}, + &navigation); + + const sync_pb::TabNavigation sync_data = + SessionNavigationToSyncData(navigation); + EXPECT_TRUE(sync_data.has_replaced_navigation()); + EXPECT_EQ(kReplacedURL.spec(), + sync_data.replaced_navigation().first_committed_url()); + EXPECT_EQ(kReplacedTimestampMs, + sync_data.replaced_navigation().first_timestamp_msec()); + EXPECT_EQ(sync_pb::SyncEnums_PageTransition_AUTO_BOOKMARK, + sync_data.replaced_navigation().first_page_transition()); +} + +// Test that the last_navigation_redirect_url is set when needed. This test is +// just like the above, but with a different virtual_url. Create a +// SerializedNavigationEntry, then create a sync protocol buffer from it. The +// protocol buffer should have a last_navigation_redirect_url. +TEST(SyncedSessionTest, SessionNavigationToSyncDataWithLastRedirectUrl) { + SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + SerializedNavigationEntryTestHelper::SetVirtualURL(test_data::kOtherURL, + &navigation); + + const sync_pb::TabNavigation sync_data = + SessionNavigationToSyncData(navigation); + EXPECT_TRUE(sync_data.has_last_navigation_redirect_url()); + EXPECT_EQ(test_data::kVirtualURL.spec(), + sync_data.last_navigation_redirect_url()); + + // The redirect chain should be the same as in the above test. + ASSERT_EQ(3, sync_data.navigation_redirect_size() + 1); + EXPECT_EQ(test_data::kRedirectURL0.spec(), + sync_data.navigation_redirect(0).url()); + EXPECT_EQ(test_data::kRedirectURL1.spec(), + sync_data.navigation_redirect(1).url()); +} + +// Ensure all transition types and qualifiers are converted to/from the sync +// SerializedNavigationEntry representation properly. +TEST(SyncedSessionTest, SessionNavigationToSyncDataWithTransitionTypes) { + SerializedNavigationEntry navigation = + SerializedNavigationEntryTestHelper::CreateNavigationForTest(); + + for (uint32_t core_type = ui::PAGE_TRANSITION_LINK; + core_type < ui::PAGE_TRANSITION_LAST_CORE; ++core_type) { + // Because qualifier is a uint32_t, left shifting will eventually overflow + // and hit zero again. SERVER_REDIRECT, as the last qualifier and also + // in place of the sign bit, is therefore the last transition before + // breaking. + for (uint32_t qualifier = ui::PAGE_TRANSITION_FORWARD_BACK; qualifier != 0; + qualifier <<= 1) { + if (qualifier == static_cast<uint32_t>(ui::PAGE_TRANSITION_FROM_API)) + continue; // We don't sync PAGE_TRANSITION_FROM_API. + ui::PageTransition transition = + ui::PageTransitionFromInt(core_type | qualifier); + SerializedNavigationEntryTestHelper::SetTransitionType(transition, + &navigation); + + const sync_pb::TabNavigation sync_data = + SessionNavigationToSyncData(navigation); + const SerializedNavigationEntry constructed_nav = + SessionNavigationFromSyncData(test_data::kIndex, sync_data); + const ui::PageTransition constructed_transition = + constructed_nav.transition_type(); + + EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( + constructed_transition, transition)); + } + } +} + +// Create a typical SessionTab protocol buffer and set an existing +// SessionTab from it. The data from the protocol buffer should +// clobber the existing data. +TEST(SyncedSessionTest, SetSessionTabFromSyncData) { + sync_pb::SessionTab sync_data; + sync_data.set_tab_id(5); + sync_data.set_window_id(10); + sync_data.set_tab_visual_index(13); + sync_data.set_current_navigation_index(3); + sync_data.set_pinned(true); + sync_data.set_extension_app_id("app_id"); + for (int i = 0; i < 5; ++i) { + sync_pb::TabNavigation* navigation = sync_data.add_navigation(); + navigation->set_virtual_url("http://foo/" + base::IntToString(i)); + navigation->set_referrer("referrer"); + navigation->set_title("title"); + navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED); + } + + sessions::SessionTab tab; + tab.window_id = SessionID::FromSerializedValue(100); + tab.tab_id = SessionID::FromSerializedValue(100); + tab.tab_visual_index = 100; + tab.current_navigation_index = 1000; + tab.pinned = false; + tab.extension_app_id = "fake"; + tab.user_agent_override = "fake"; + tab.timestamp = base::Time::FromInternalValue(100); + tab.navigations.resize(100); + tab.session_storage_persistent_id = "fake"; + + SetSessionTabFromSyncData(sync_data, base::Time::FromInternalValue(5u), &tab); + EXPECT_EQ(10, tab.window_id.id()); + EXPECT_EQ(5, tab.tab_id.id()); + EXPECT_EQ(13, tab.tab_visual_index); + EXPECT_EQ(3, tab.current_navigation_index); + EXPECT_TRUE(tab.pinned); + EXPECT_EQ("app_id", tab.extension_app_id); + EXPECT_TRUE(tab.user_agent_override.empty()); + EXPECT_EQ(5u, tab.timestamp.ToInternalValue()); + ASSERT_EQ(5u, tab.navigations.size()); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, tab.navigations[i].index()); + EXPECT_EQ(GURL("referrer"), tab.navigations[i].referrer_url()); + EXPECT_EQ(base::ASCIIToUTF16("title"), tab.navigations[i].title()); + EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( + tab.navigations[i].transition_type(), ui::PAGE_TRANSITION_TYPED)); + EXPECT_EQ(GURL("http://foo/" + base::IntToString(i)), + tab.navigations[i].virtual_url()); + } + EXPECT_TRUE(tab.session_storage_persistent_id.empty()); +} + +TEST(SyncedSessionTest, SessionTabToSyncData) { + sessions::SessionTab tab; + tab.window_id = SessionID::FromSerializedValue(10); + tab.tab_id = SessionID::FromSerializedValue(5); + tab.tab_visual_index = 13; + tab.current_navigation_index = 3; + tab.pinned = true; + tab.extension_app_id = "app_id"; + tab.user_agent_override = "fake"; + tab.timestamp = base::Time::FromInternalValue(100); + for (int i = 0; i < 5; ++i) { + tab.navigations.push_back( + SerializedNavigationEntryTestHelper::CreateNavigation( + "http://foo/" + base::IntToString(i), "title")); + } + tab.session_storage_persistent_id = "fake"; + + const sync_pb::SessionTab sync_data = SessionTabToSyncData(tab); + EXPECT_EQ(5, sync_data.tab_id()); + EXPECT_EQ(10, sync_data.window_id()); + EXPECT_EQ(13, sync_data.tab_visual_index()); + EXPECT_EQ(3, sync_data.current_navigation_index()); + EXPECT_TRUE(sync_data.pinned()); + EXPECT_EQ("app_id", sync_data.extension_app_id()); + ASSERT_EQ(5, sync_data.navigation_size()); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(tab.navigations[i].virtual_url().spec(), + sync_data.navigation(i).virtual_url()); + EXPECT_EQ(base::UTF16ToUTF8(tab.navigations[i].title()), + sync_data.navigation(i).title()); + } + EXPECT_FALSE(sync_data.has_favicon()); + EXPECT_FALSE(sync_data.has_favicon_type()); + EXPECT_FALSE(sync_data.has_favicon_source()); +} + +} // namespace +} // namespace sync_sessions
diff --git a/components/sync_sessions/test_synced_window_delegates_getter.cc b/components/sync_sessions/test_synced_window_delegates_getter.cc index 4b121b5..55c06bd 100644 --- a/components/sync_sessions/test_synced_window_delegates_getter.cc +++ b/components/sync_sessions/test_synced_window_delegates_getter.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "components/sessions/core/serialized_navigation_entry_test_helper.h" +#include "components/sync_sessions/synced_session.h" #include "components/sync_sessions/tab_node_pool.h" namespace sync_sessions { @@ -36,7 +37,7 @@ tab_navigation.set_http_status_code(200); auto entry = std::make_unique<sessions::SerializedNavigationEntry>( - sessions::SerializedNavigationEntry::FromSyncData(0, tab_navigation)); + SessionNavigationFromSyncData(0, tab_navigation)); sessions::SerializedNavigationEntryTestHelper::SetTimestamp(time, entry.get()); sessions::SerializedNavigationEntryTestHelper::SetTransitionType(transition,
diff --git a/components/zucchini/disassembler_dex.cc b/components/zucchini/disassembler_dex.cc index 8a1b339..e94dbc9 100644 --- a/components/zucchini/disassembler_dex.cc +++ b/components/zucchini/disassembler_dex.cc
@@ -698,12 +698,17 @@ size_t target_item_size, Reference ref, MutableBufferView image) { - const size_t idx = (ref.target - target_map_item.offset) / target_item_size; + const size_t unsafe_idx = + (ref.target - target_map_item.offset) / target_item_size; // Verify that index is within bound. - DCHECK_LT(idx, target_map_item.size); + if (unsafe_idx >= target_map_item.size) { + LOG(ERROR) << "Target index out of bounds at: " << AsHex<8>(ref.location) + << "."; + return; + } // Verify that |ref.target| points to start of item. - DCHECK_EQ(ref.target, target_map_item.offset + idx * target_item_size); - image.write<INT>(ref.location, base::checked_cast<INT>(idx)); + DCHECK_EQ(ref.target, target_map_item.offset + unsafe_idx * target_item_size); + image.write<INT>(ref.location, base::checked_cast<INT>(unsafe_idx)); } // Buffer for ReadDexHeader() to optionally return results. @@ -1453,7 +1458,7 @@ // |ref.location|. The subtraction above removed too much, so +1 to fix. base::CheckedNumeric<int8_t> delta((unsafe_byte_diff / kInstrUnitSize) + 1); if (!delta.IsValid()) { - LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location); + LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location) << "."; return; } image.write<int8_t>(ref.location, delta.ValueOrDie()); @@ -1472,7 +1477,7 @@ base::CheckedNumeric<int16_t> delta((unsafe_byte_diff / kInstrUnitSize) + 1); if (!delta.IsValid()) { - LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location); + LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location) << "."; return; } image.write<int16_t>(ref.location, delta.ValueOrDie()); @@ -1491,7 +1496,7 @@ base::CheckedNumeric<int32_t> delta((unsafe_byte_diff / kInstrUnitSize) + 1); if (!delta.IsValid()) { - LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location); + LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location) << "."; return; } image.write<int32_t>(ref.location, delta.ValueOrDie());
diff --git a/components/zucchini/fuzzers/imposed_ensemble_matcher_fuzzer.cc b/components/zucchini/fuzzers/imposed_ensemble_matcher_fuzzer.cc index bbb06cab..0dbcf86a 100644 --- a/components/zucchini/fuzzers/imposed_ensemble_matcher_fuzzer.cc +++ b/components/zucchini/fuzzers/imposed_ensemble_matcher_fuzzer.cc
@@ -59,13 +59,8 @@ zucchini::GenerateBufferImposed(old_image, new_image, file_pair.imposed_matches(), &patch_writer); - // Check that the patch size is sane. Crash the fuzzer if this isn't the case, - // as it is a failure in Zucchini's patch performance that is worth - // investigating. - size_t patch_size = patch_writer.SerializedSize(); - CHECK_LE(patch_size, kMaxImageSize * 3); - // Write to buffer to avoid IO. + size_t patch_size = patch_writer.SerializedSize(); std::unique_ptr<uint8_t[]> patch_data(new uint8_t[patch_size]); zucchini::BufferSink patch(patch_data.get(), patch_size); patch_writer.SerializeInto(patch);
diff --git a/components/zucchini/reloc_utils.cc b/components/zucchini/reloc_utils.cc index c9fb432..d6f69b9 100644 --- a/components/zucchini/reloc_utils.cc +++ b/components/zucchini/reloc_utils.cc
@@ -182,10 +182,12 @@ --block_it; rva_t rva_hi_bits = image_.read<pe::RelocHeader>(*block_it).rva_hi; rva_t target_rva = target_offset_to_rva_.Convert(ref.target); - rva_t rva_lo_bits = target_rva - rva_hi_bits; - DCHECK_EQ(rva_lo_bits & 0xFFF, rva_lo_bits); - image_.write<uint16_t>(ref.location, - (rva_lo_bits & 0xFFF) | (reloc_type_ << 12)); + rva_t rva_lo_bits = (target_rva - rva_hi_bits) & 0xFFF; + if (target_rva != rva_hi_bits + rva_lo_bits) { + LOG(ERROR) << "Invalid RVA at " << AsHex<8>(ref.location) << "."; + return; + } + image_.write<uint16_t>(ref.location, rva_lo_bits | (reloc_type_ << 12)); } } // namespace zucchini
diff --git a/components/zucchini/reloc_utils_unittest.cc b/components/zucchini/reloc_utils_unittest.cc index e75264ce..65acf5b 100644 --- a/components/zucchini/reloc_utils_unittest.cc +++ b/components/zucchini/reloc_utils_unittest.cc
@@ -260,8 +260,6 @@ EXPECT_EQ(exp_reloc_data1, Sub(image_data, reloc_region_.lo(), reloc_region_.hi())); - EXPECT_DCHECK_DEATH(writer->PutNext({0x608, 0x2000})); - writer->PutNext({0x61C, 0x2950}); std::vector<uint8_t> exp_reloc_data2 = ParseHexString( "00 10 04 00 10 00 00 00 83 3F 18 A3 F8 A7 FF 0F "
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 97fdbea6..d5878a8 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1783,6 +1783,10 @@ RunHtmlTest(FILE_PATH_LITERAL("transition.html")); } +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityTruncateLabel) { + RunHtmlTest(FILE_PATH_LITERAL("truncate-label.html")); +} + IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityUl) { RunHtmlTest(FILE_PATH_LITERAL("ul.html")); }
diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index 2cf5621..15d7b8d 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -406,11 +406,11 @@ browser_plugin_instance_id(), allow)); } -void BrowserPluginGuest::SetChildFrameSurface( +void BrowserPluginGuest::FirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { if (features::IsAshInBrowserProcess()) { SendMessageToEmbedder( - std::make_unique<BrowserPluginMsg_SetChildFrameSurface>( + std::make_unique<BrowserPluginMsg_FirstSurfaceActivation>( browser_plugin_instance_id(), surface_info)); } }
diff --git a/content/browser/browser_plugin/browser_plugin_guest.h b/content/browser/browser_plugin/browser_plugin_guest.h index 142b75d..5a63740 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.h +++ b/content/browser/browser_plugin/browser_plugin_guest.h
@@ -244,7 +244,7 @@ void PointerLockPermissionResponse(bool allow); // The next function is virtual for test purposes. - virtual void SetChildFrameSurface(const viz::SurfaceInfo& surface_info); + virtual void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info); void ResendEventToEmbedder(const blink::WebInputEvent& event);
diff --git a/content/browser/browser_side_navigation_browsertest.cc b/content/browser/browser_side_navigation_browsertest.cc index 46fb1fa..3054b8ca 100644 --- a/content/browser/browser_side_navigation_browsertest.cc +++ b/content/browser/browser_side_navigation_browsertest.cc
@@ -52,33 +52,13 @@ // below (BrowserSideNavigationBrowserTest), it will automatically start the // default server. // TODO(clamy): Rename those NavigationBrowserTests. -class BrowserSideNavigationBaseBrowserTest - : public ContentBrowserTest, - public ::testing::WithParamInterface<bool> { +class BrowserSideNavigationBaseBrowserTest : public ContentBrowserTest { protected: void SetUpOnMainThread() override { - ToogleNavigationImmediateResponse(); host_resolver()->AddRule("*", "127.0.0.1"); } - - private: - void ToogleNavigationImmediateResponse() { - if (GetParam()) { - feature_list.InitAndDisableFeature( - features::kNavigationImmediateResponseBody); - } else { - feature_list.InitAndEnableFeature( - features::kNavigationImmediateResponseBody); - } - } - - base::test::ScopedFeatureList feature_list; }; -INSTANTIATE_TEST_CASE_P(/* no prefix */, - BrowserSideNavigationBaseBrowserTest, - ::testing::Bool()); - class BrowserSideNavigationBrowserTest : public BrowserSideNavigationBaseBrowserTest { protected: @@ -88,13 +68,9 @@ } }; -INSTANTIATE_TEST_CASE_P(/* no prefix */, - BrowserSideNavigationBrowserTest, - ::testing::Bool()); - // Ensure that browser initiated basic navigations work with browser side // navigation. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, BrowserInitiatedNavigations) { // Perform a navigation with no live renderer. { @@ -138,7 +114,7 @@ // Ensure that renderer initiated same-site navigations work with browser side // navigation. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, RendererInitiatedSameSiteNavigation) { // Perform a navigation with no live renderer. { @@ -174,7 +150,7 @@ // Ensure that renderer initiated cross-site navigations work with browser side // navigation. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, RendererInitiatedCrossSiteNavigation) { // Perform a navigation with no live renderer. { @@ -228,7 +204,7 @@ } // Ensure that browser side navigation handles navigation failures. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, FailedNavigation) { +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, FailedNavigation) { // Perform a navigation with no live renderer. { TestNavigationObserver observer(shell()->web_contents()); @@ -255,7 +231,7 @@ // Ensure that browser side navigation can load browser initiated navigations // to view-source URLs. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, ViewSourceNavigation_BrowserInitiated) { TestNavigationObserver observer(shell()->web_contents()); GURL url(embedded_test_server()->GetURL("/title1.html")); @@ -268,7 +244,7 @@ // Ensure that browser side navigation blocks content initiated navigations to // view-source URLs. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, ViewSourceNavigation_RendererInitiated) { TestNavigationObserver observer(shell()->web_contents()); GURL kUrl(embedded_test_server()->GetURL("/simple_links.html")); @@ -299,7 +275,7 @@ // Ensure that closing a page by running its beforeunload handler doesn't hang // if there's an ongoing navigation. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, UnloadDuringNavigation) { content::WindowedNotificationObserver close_observer( content::NOTIFICATION_WEB_CONTENTS_DESTROYED, @@ -313,7 +289,7 @@ } // Ensure that the referrer of a navigation is properly sanitized. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, SanitizeReferrer) { +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, SanitizeReferrer) { const GURL kInsecureUrl(embedded_test_server()->GetURL("/title1.html")); const Referrer kSecureReferrer( GURL("https://secure-url.com"), @@ -345,7 +321,7 @@ // Test to verify that an exploited renderer process trying to upload a file // it hasn't been explicitly granted permissions to is correctly terminated. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, PostUploadIllegalFilePath) { GURL form_url( embedded_test_server()->GetURL("/form_that_posts_to_echoall.html")); @@ -408,7 +384,7 @@ // based on Blink's state instead of the history state in the browser process, // which ends up loading the originally blocked URL. With PlzNavigate, the // reload uses the NavigationEntry state to create a navigation and commit it. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, VerifyBlockedErrorPageURL_Reload) { NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( shell()->web_contents()->GetController()); @@ -454,17 +430,13 @@ } }; -INSTANTIATE_TEST_CASE_P(/* no prefix */, - BrowserSideNavigationBrowserDisableWebSecurityTest, - ::testing::Bool()); - // Test to verify that an exploited renderer process trying to specify a // non-empty URL for base_url_for_data_url on navigation is correctly // terminated. // TODO(nasko): This test case belongs better in // security_exploit_browsertest.cc, so move it there once PlzNavigate is on // by default. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserDisableWebSecurityTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserDisableWebSecurityTest, ValidateBaseUrlForDataUrl) { GURL start_url(embedded_test_server()->GetURL("/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), start_url)); @@ -547,7 +519,7 @@ EXPECT_TRUE(result.empty()); } -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, BackFollowedByReload) { +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, BackFollowedByReload) { // First, make two history entries. GURL url1(embedded_test_server()->GetURL("/title1.html")); GURL url2(embedded_test_server()->GetURL("/title2.html")); @@ -567,7 +539,7 @@ // Test that a navigation response can be entirely fetched, even after the // NavigationURLLoader has been deleted. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBaseBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBaseBrowserTest, FetchResponseAfterNavigationURLLoaderDeleted) { net::test_server::ControllableHttpResponse response(embedded_test_server(), "/main_document"); @@ -619,7 +591,7 @@ // renderer process. This test ensures that when the the URLLoader is deleted // (in the browser process), the URLLoaderClient (in the renderer process) stops // properly. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBaseBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBaseBrowserTest, CancelRequestAfterReadyToCommit) { // This test cancels the request using the ResourceDispatchHost. With the // NetworkService, it is not used so the request is not canceled. @@ -674,7 +646,7 @@ // Data URLs can have a reference fragment like any other URLs. This test makes // sure it is taken into account. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, DataURLWithReferenceFragment) { GURL url("data:text/html,body#foo"); EXPECT_TRUE(NavigateToURL(shell(), url)); @@ -699,7 +671,7 @@ // 1) Start on a document with history.length == 1. // 2) Create an iframe and call history.pushState at the same time. // 3) history.back() must work. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBrowserTest, IframeAndPushStateSimultaneously) { GURL main_url = embedded_test_server()->GetURL("/simple_page.html"); GURL iframe_url = embedded_test_server()->GetURL("/hello.html"); @@ -746,7 +718,7 @@ // Regression test for https://crbug.com/260144 // Back/Forward navigation in an iframe must not stop ongoing XHR. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBaseBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBaseBrowserTest, IframeNavigationsDoNotStopXHR) { // A response for the XHR request. It will be delayed until the end of all the // navigations. @@ -835,7 +807,7 @@ } // Regression test for https://crbug.com/856396. -IN_PROC_BROWSER_TEST_P(BrowserSideNavigationBaseBrowserTest, +IN_PROC_BROWSER_TEST_F(BrowserSideNavigationBaseBrowserTest, ReplacingDocumentLoaderFiresLoadEvent) { net::test_server::ControllableHttpResponse main_document_response( embedded_test_server(), "/main_document"); @@ -921,7 +893,7 @@ // 3) The request for the new navigation starts and it turns out it is a // download. The navigation is dropped. // 4) There are no more possibilities for DidStopLoading() to be sent. -IN_PROC_BROWSER_TEST_P(NavigationDownloadBrowserTest, +IN_PROC_BROWSER_TEST_F(NavigationDownloadBrowserTest, StopLoadingAfterDroppedNavigation) { net::test_server::ControllableHttpResponse main_response( embedded_test_server(), "/main"); @@ -955,8 +927,4 @@ EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); } -INSTANTIATE_TEST_CASE_P(/* no prefix */, - NavigationDownloadBrowserTest, - ::testing::Bool()); - } // namespace content
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc index ba4abf13..3560864 100644 --- a/content/browser/download/download_manager_impl.cc +++ b/content/browser/download/download_manager_impl.cc
@@ -882,7 +882,6 @@ return downloads_[id].get(); } } - DCHECK(!base::ContainsKey(downloads_by_guid_, guid)); download::DownloadItemImpl* item = item_factory_->CreatePersistedItem( this, guid, id, current_path, target_path, url_chain, referrer_url, site_url, tab_url, tab_refererr_url, mime_type, original_mime_type,
diff --git a/content/browser/frame_host/cross_process_frame_connector.cc b/content/browser/frame_host/cross_process_frame_connector.cc index 63174ea..3fc88df 100644 --- a/content/browser/frame_host/cross_process_frame_connector.cc +++ b/content/browser/frame_host/cross_process_frame_connector.cc
@@ -145,9 +145,9 @@ frame_proxy_in_parent_renderer_->GetRoutingID())); } -void CrossProcessFrameConnector::SetChildFrameSurface( +void CrossProcessFrameConnector::FirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { - frame_proxy_in_parent_renderer_->Send(new FrameMsg_SetChildFrameSurface( + frame_proxy_in_parent_renderer_->Send(new FrameMsg_FirstSurfaceActivation( frame_proxy_in_parent_renderer_->GetRoutingID(), surface_info)); }
diff --git a/content/browser/frame_host/cross_process_frame_connector.h b/content/browser/frame_host/cross_process_frame_connector.h index 05c3d32..1345059 100644 --- a/content/browser/frame_host/cross_process_frame_connector.h +++ b/content/browser/frame_host/cross_process_frame_connector.h
@@ -77,7 +77,7 @@ RenderWidgetHostViewBase* GetParentRenderWidgetHostView() override; RenderWidgetHostViewBase* GetRootRenderWidgetHostView() override; void RenderProcessGone() override; - void SetChildFrameSurface(const viz::SurfaceInfo& surface_info) override; + void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override; void SendIntrinsicSizingInfoToParent( const blink::WebIntrinsicSizingInfo&) override;
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index df0ec2a..8f12714 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -56,7 +56,6 @@ #include "content/public/common/url_constants.h" #include "content/public/common/url_utils.h" #include "content/public/common/web_preferences.h" -#include "mojo/public/cpp/system/data_pipe.h" #include "net/base/load_flags.h" #include "net/base/net_errors.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" @@ -920,7 +919,6 @@ void NavigationRequest::OnResponseStarted( const scoped_refptr<network::ResourceResponse>& response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, @@ -1029,7 +1027,6 @@ // Store the response and the URLLoaderClient endpoints until checks have been // processed. response_ = response; - response_body_ = std::move(response_body); url_loader_client_endpoints_ = std::move(url_loader_client_endpoints); ssl_info_ = response->head.ssl_info.has_value() ? *response->head.ssl_info : net::SSLInfo(); @@ -1642,9 +1639,8 @@ associated_site_instance_id_.reset(); } render_frame_host->CommitNavigation( - response_.get(), std::move(url_loader_client_endpoints_), - std::move(response_body_), common_params_, request_params_, - is_view_source_, std::move(subresource_loader_params_), + response_.get(), std::move(url_loader_client_endpoints_), common_params_, + request_params_, is_view_source_, std::move(subresource_loader_params_), std::move(subresource_overrides_), devtools_navigation_token_); // Give SpareRenderProcessHostManager a heads-up about the most recently used
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h index 4ba9fcd..6e38171 100644 --- a/content/browser/frame_host/navigation_request.h +++ b/content/browser/frame_host/navigation_request.h
@@ -22,7 +22,6 @@ #include "content/common/navigation_subresource_loader_params.h" #include "content/public/browser/navigation_throttle.h" #include "content/public/common/previews_state.h" -#include "mojo/public/cpp/system/data_pipe.h" namespace network { class ResourceRequestBody; @@ -234,7 +233,6 @@ void OnResponseStarted( const scoped_refptr<network::ResourceResponse>& response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, @@ -413,7 +411,6 @@ // checks are performed by the NavigationHandle. Once the checks have been // completed, these objects will be used to continue the navigation. scoped_refptr<network::ResourceResponse> response_; - mojo::ScopedDataPipeConsumerHandle response_body_; network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints_; net::SSLInfo ssl_info_; bool is_download_;
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index e7af1d2..ab634ef2 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -3472,9 +3472,8 @@ std::vector<ContentSecurityPolicy>() /* initiator_csp */, CSPSource() /* initiator_self_source */); CommitNavigation(nullptr, network::mojom::URLLoaderClientEndpointsPtr(), - mojo::ScopedDataPipeConsumerHandle(), common_params, - RequestNavigationParams(), false, base::nullopt, - base::nullopt /* subresource_overrides */, + common_params, RequestNavigationParams(), false, + base::nullopt, base::nullopt /* subresource_overrides */, base::UnguessableToken::Create() /* not traced */); } @@ -3633,7 +3632,6 @@ void RenderFrameHostImpl::CommitNavigation( network::ResourceResponse* response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, bool is_view_source, @@ -3805,15 +3803,15 @@ navigation_request_->GetCommitNavigationClient()) { navigation_request_->GetCommitNavigationClient()->CommitNavigation( head, common_params, request_params, - std::move(url_loader_client_endpoints), std::move(response_body), - CloneSubresourceFactories(), std::move(subresource_overrides), - std::move(controller), devtools_navigation_token); + std::move(url_loader_client_endpoints), CloneSubresourceFactories(), + std::move(subresource_overrides), std::move(controller), + devtools_navigation_token); } else { GetNavigationControl()->CommitNavigation( head, common_params, request_params, - std::move(url_loader_client_endpoints), std::move(response_body), - CloneSubresourceFactories(), std::move(subresource_overrides), - std::move(controller), devtools_navigation_token, + std::move(url_loader_client_endpoints), CloneSubresourceFactories(), + std::move(subresource_overrides), std::move(controller), + devtools_navigation_token, navigation_request_ ? base::BindOnce( &RenderFrameHostImpl::OnCrossDocumentCommitProcessed,
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 9b71328..9585ba0 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -572,7 +572,6 @@ void CommitNavigation( network::ResourceResponse* response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, bool is_view_source,
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 6a47f48f..2b56798 100644 --- a/content/browser/frame_host/render_widget_host_view_guest.cc +++ b/content/browser/frame_host/render_widget_host_view_guest.cc
@@ -367,10 +367,10 @@ root_view->GetCursorManager()->SetTooltipTextForView(this, tooltip_text); } -void RenderWidgetHostViewGuest::SendSurfaceInfoToEmbedderImpl( +void RenderWidgetHostViewGuest::FirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { if (guest_ && !guest_->is_in_destruction()) - guest_->SetChildFrameSurface(surface_info); + guest_->FirstSurfaceActivation(surface_info); } void RenderWidgetHostViewGuest::OnDidUpdateVisualPropertiesComplete(
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 8125850..515ead6 100644 --- a/content/browser/frame_host/render_widget_host_view_guest.h +++ b/content/browser/frame_host/render_widget_host_view_guest.h
@@ -162,8 +162,7 @@ private: friend class RenderWidgetHostView; - void SendSurfaceInfoToEmbedderImpl( - const viz::SurfaceInfo& surface_info) override; + void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override; void OnDidUpdateVisualPropertiesComplete( const cc::RenderFrameMetadata& metadata);
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 9a5c1dd..fa97ccf 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
@@ -117,7 +117,7 @@ BrowserPluginGuest::set_attached_for_test(attached); } - void SetChildFrameSurface(const viz::SurfaceInfo& surface_info) override { + void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override { last_surface_info_ = surface_info; }
diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc index e162611..4910201 100644 --- a/content/browser/loader/mojo_async_resource_handler.cc +++ b/content/browser/loader/mojo_async_resource_handler.cc
@@ -17,7 +17,6 @@ #include "content/browser/loader/resource_dispatcher_host_impl.h" #include "content/browser/loader/resource_request_info_impl.h" #include "content/public/browser/global_request_id.h" -#include "content/public/common/browser_side_navigation_policy.h" #include "mojo/public/c/system/data_pipe.h" #include "mojo/public/cpp/bindings/message.h" #include "net/base/mime_sniffer.h" @@ -192,13 +191,7 @@ response->head.ssl_info = request()->ssl_info(); } - if (IsNavigationImmediateResponseBodyEnabled()) { - MaybeCreateResponseBodyDataPipe(); - url_loader_client_->OnReceiveResponse(response->head); - MaybeSendStartLoadingResponseBody(); - } else { - url_loader_client_->OnReceiveResponse(response->head); - } + url_loader_client_->OnReceiveResponse(response->head); net::IOBufferWithSize* metadata = GetResponseMetadata(request()); if (metadata) { @@ -249,10 +242,31 @@ return; } - MaybeCreateResponseBodyDataPipe(); + bool first_call = false; if (!shared_writer_) { - controller->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); - return; + first_call = true; + MojoCreateDataPipeOptions options; + options.struct_size = sizeof(MojoCreateDataPipeOptions); + options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE; + options.element_num_bytes = 1; + options.capacity_num_bytes = g_allocation_size; + mojo::ScopedDataPipeProducerHandle producer; + mojo::ScopedDataPipeConsumerHandle consumer; + + MojoResult result = mojo::CreateDataPipe(&options, &producer, &consumer); + if (result != MOJO_RESULT_OK) { + controller->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); + return; + } + DCHECK(producer.is_valid()); + DCHECK(consumer.is_valid()); + + response_body_consumer_handle_ = std::move(consumer); + shared_writer_ = new SharedWriter(std::move(producer)); + handle_watcher_.Watch(shared_writer_->writer(), MOJO_HANDLE_SIGNAL_WRITABLE, + base::Bind(&MojoAsyncResourceHandler::OnWritable, + base::Unretained(this))); + handle_watcher_.ArmOrNotify(); } bool defer = false; @@ -274,8 +288,7 @@ // The first call to OnWillRead must return a buffer of at least // kMinAllocationSize. If the Mojo buffer is too small, need to allocate an // intermediary buffer. - if (!has_started_one_read_ && - static_cast<size_t>(buffer_->size()) < kMinAllocationSize) { + if (first_call && static_cast<size_t>(buffer_->size()) < kMinAllocationSize) { // The allocated buffer is too small, so need to create an intermediary one. if (EndWrite(0) != MOJO_RESULT_OK) { controller->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); @@ -288,8 +301,6 @@ *buf = buffer_; *buf_size = buffer_->size(); - - has_started_one_read_ = true; controller->Resume(); } @@ -318,8 +329,12 @@ } } - // Send the data pipe on the first OnReadCompleted call. - MaybeSendStartLoadingResponseBody(); + if (response_body_consumer_handle_.is_valid()) { + // Send the data pipe on the first OnReadCompleted call. + url_loader_client_->OnStartLoadingResponseBody( + std::move(response_body_consumer_handle_)); + response_body_consumer_handle_.reset(); + } if (is_using_io_buffer_not_from_writer_) { // Couldn't allocate a large enough buffer on the data pipe in OnWillRead. @@ -639,40 +654,4 @@ upload_progress_tracker_->OnAckReceived(); } -void MojoAsyncResourceHandler::MaybeCreateResponseBodyDataPipe() { - if (has_created_response_body_data_pipe_) - return; - has_created_response_body_data_pipe_ = true; - - MojoCreateDataPipeOptions options; - options.struct_size = sizeof(MojoCreateDataPipeOptions); - options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE; - options.element_num_bytes = 1; - options.capacity_num_bytes = g_allocation_size; - mojo::ScopedDataPipeProducerHandle producer; - mojo::ScopedDataPipeConsumerHandle consumer; - - MojoResult result = mojo::CreateDataPipe(&options, &producer, &consumer); - if (result != MOJO_RESULT_OK) - return; - - DCHECK(producer.is_valid()); - DCHECK(consumer.is_valid()); - - response_body_consumer_handle_ = std::move(consumer); - shared_writer_ = new SharedWriter(std::move(producer)); - handle_watcher_.Watch( - shared_writer_->writer(), MOJO_HANDLE_SIGNAL_WRITABLE, - base::BindRepeating(&MojoAsyncResourceHandler::OnWritable, - base::Unretained(this))); - handle_watcher_.ArmOrNotify(); -} - -void MojoAsyncResourceHandler::MaybeSendStartLoadingResponseBody() { - if (response_body_consumer_handle_.is_valid()) { - url_loader_client_->OnStartLoadingResponseBody( - std::move(response_body_consumer_handle_)); - } -} - } // namespace content
diff --git a/content/browser/loader/mojo_async_resource_handler.h b/content/browser/loader/mojo_async_resource_handler.h index 4d94a489..ad870657 100644 --- a/content/browser/loader/mojo_async_resource_handler.h +++ b/content/browser/loader/mojo_async_resource_handler.h
@@ -135,17 +135,11 @@ void OnUploadProgressACK(); static void InitializeResourceBufferConstants(); - void MaybeCreateResponseBodyDataPipe(); - void MaybeSendStartLoadingResponseBody(); - - bool has_created_response_body_data_pipe_ = false; - ResourceDispatcherHostImpl* rdh_; mojo::Binding<network::mojom::URLLoader> binding_; uint32_t url_loader_options_; - bool has_started_one_read_ = false; bool has_checked_for_sufficient_resources_ = false; bool sent_received_response_message_ = false; bool is_using_io_buffer_not_from_writer_ = false;
diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc index a6134e66..b20ac0d 100644 --- a/content/browser/loader/mojo_async_resource_handler_unittest.cc +++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc
@@ -1280,6 +1280,8 @@ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); + ASSERT_FALSE(url_loader_client_.response_body().is_valid()); + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted("A")); url_loader_client_.RunUntilResponseBodyArrived(); @@ -1331,6 +1333,7 @@ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted("B")); + ASSERT_FALSE(url_loader_client_.response_body().is_valid()); url_loader_client_.RunUntilResponseBodyArrived(); ASSERT_TRUE(url_loader_client_.response_body().is_valid());
diff --git a/content/browser/loader/navigation_url_loader_delegate.h b/content/browser/loader/navigation_url_loader_delegate.h index b3abb2a..c7d2382 100644 --- a/content/browser/loader/navigation_url_loader_delegate.h +++ b/content/browser/loader/navigation_url_loader_delegate.h
@@ -48,7 +48,6 @@ virtual void OnResponseStarted( const scoped_refptr<network::ResourceResponse>& response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download,
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index b62b588b..0cd03e5 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -54,7 +54,6 @@ #include "content/public/browser/resource_dispatcher_host_delegate.h" #include "content/public/browser/ssl_status.h" #include "content/public/browser/url_loader_request_interceptor.h" -#include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/content_features.h" #include "content/public/common/referrer.h" #include "content/public/common/url_constants.h" @@ -913,15 +912,6 @@ private: // network::mojom::URLLoaderClient implementation: void OnReceiveResponse(const network::ResourceResponseHead& head) override { - // When NavigationImmediateResponseBody is enabled, wait for - // DidStartLoadingResponseBody() before sending anything to the renderer - // process. - if (IsNavigationImmediateResponseBodyEnabled() && - !IsLoaderInterceptionEnabled() && !response_body_.is_valid()) { - head_ = head; - return; - } - received_response_ = true; // If the default loader (network) was used to handle the URL load request @@ -1076,11 +1066,11 @@ // response. https://crbug.com/416050 BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::BindOnce( - &NavigationURLLoaderImpl::OnReceiveResponse, owner_, - response->DeepCopy(), std::move(url_loader_client_endpoints), - std::move(response_body_), std::move(cloned_navigation_data), - global_request_id_, is_download, is_stream)); + base::BindOnce(&NavigationURLLoaderImpl::OnReceiveResponse, owner_, + response->DeepCopy(), + std::move(url_loader_client_endpoints), + std::move(cloned_navigation_data), global_request_id_, + is_download, is_stream)); } void OnReceiveRedirect(const net::RedirectInfo& redirect_info, @@ -1118,19 +1108,10 @@ void OnReceiveCachedMetadata(const std::vector<uint8_t>& data) override {} void OnTransferSizeUpdated(int32_t transfer_size_diff) override {} - void OnStartLoadingResponseBody( - mojo::ScopedDataPipeConsumerHandle response_body) override { - // When NavigationImmediateResponseBody is disabled, this is not reached. - // At this point, the loader and client endpoints must have been unbound and - // forwarded to the renderer. - CHECK(IsNavigationImmediateResponseBodyEnabled()); - - // When NavigationImmediateResponseBody is enabled, the NavigationURLLoader - // waits for OnStartLoadingResponseBody() instead of OnReceiveResponse() - // before delegating the load to an URLLoaderClientImpl in the renderer - // process. - response_body_ = std::move(response_body); - OnReceiveResponse(head_); + void OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle) override { + // Not reached. At this point, the loader and client endpoints must have + // been unbound and forwarded to the renderer. + CHECK(false); } void OnComplete(const network::URLLoaderCompletionStatus& status) override { @@ -1300,9 +1281,6 @@ // protocol handlers. std::set<std::string> known_schemes_; - network::ResourceResponseHead head_; - mojo::ScopedDataPipeConsumerHandle response_body_; - mutable base::WeakPtrFactory<URLLoaderRequestController> weak_factory_; DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController); @@ -1466,7 +1444,6 @@ void NavigationURLLoaderImpl::OnReceiveResponse( scoped_refptr<network::ResourceResponse> response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& global_request_id, bool is_download, @@ -1479,7 +1456,7 @@ delegate_->OnResponseStarted( std::move(response), std::move(url_loader_client_endpoints), - std::move(response_body), std::move(navigation_data), global_request_id, + std::move(navigation_data), global_request_id, allow_download_ && is_download, is_stream, request_controller_->TakeSubresourceLoaderParams()); }
diff --git a/content/browser/loader/navigation_url_loader_impl.h b/content/browser/loader/navigation_url_loader_impl.h index 270bf46..ac5e384a 100644 --- a/content/browser/loader/navigation_url_loader_impl.h +++ b/content/browser/loader/navigation_url_loader_impl.h
@@ -53,7 +53,6 @@ void OnReceiveResponse( scoped_refptr<network::ResourceResponse> response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& global_request_id, bool is_download,
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc index 3fbf387..89b7a09 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.cc +++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -85,7 +85,6 @@ #include "content/public/common/content_features.h" #include "content/public/common/origin_util.h" #include "content/public/common/resource_type.h" -#include "mojo/public/cpp/system/data_pipe.h" #include "net/base/auth.h" #include "net/base/load_flags.h" #include "net/base/mime_util.h"
diff --git a/content/browser/renderer_host/frame_connector_delegate.h b/content/browser/renderer_host/frame_connector_delegate.h index 74203c2..00a5e62a 100644 --- a/content/browser/renderer_host/frame_connector_delegate.h +++ b/content/browser/renderer_host/frame_connector_delegate.h
@@ -71,7 +71,7 @@ // Provide the SurfaceInfo to the embedder, which becomes a reference to the // current view's Surface that is included in higher-level compositor // frames. - virtual void SetChildFrameSurface(const viz::SurfaceInfo& surface_info) {} + virtual void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info) {} // Sends the given intrinsic sizing information from a sub-frame to // its corresponding remote frame in the parent frame's renderer.
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc index 471e8783..021ec6a 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
@@ -689,10 +689,11 @@ entered_views.push_back(cur_view); } - if (cur_view != root_view) { - ReportMouseTargetNotInRoot(cur_view, root_view); + // On Windows, it appears to be possible that render widget targeting could + // produce a target that is outside of the specified root. For now, we'll + // just give up in such a case. See https://crbug.com/851958. + if (cur_view != root_view) return; - } cur_view = last_mouse_move_target_; if (cur_view) { @@ -772,33 +773,6 @@ last_mouse_move_root_view_ = root_view; } -void RenderWidgetHostInputEventRouter::ReportMouseTargetNotInRoot( - RenderWidgetHostViewBase* target_root, - RenderWidgetHostViewBase* specified_root) { - static auto* specified_root_is_child_key = - base::debug::AllocateCrashKeyString("mouse-outside-root-root-is-child", - base::debug::CrashKeySize::Size32); - base::debug::ScopedCrashKeyString specified_root_is_child_key_value( - specified_root_is_child_key, - std::to_string(specified_root->IsRenderWidgetHostViewChildFrame())); - static auto* specified_root_is_mouse_locked_key = - base::debug::AllocateCrashKeyString( - "mouse-outside-root-root-is-mouse-locked", - base::debug::CrashKeySize::Size32); - base::debug::ScopedCrashKeyString specified_root_is_mouse_locked_key_value( - specified_root_is_mouse_locked_key, - std::to_string(specified_root->IsMouseLocked())); - static auto* target_root_is_mouse_locked_key = - base::debug::AllocateCrashKeyString( - "mouse-outside-root-target-root-is-mouse-locked", - base::debug::CrashKeySize::Size32); - base::debug::ScopedCrashKeyString target_root_is_mouse_locked_key_value( - target_root_is_mouse_locked_key, - std::to_string(target_root->IsMouseLocked())); - - base::debug::DumpWithoutCrashing(); -} - void RenderWidgetHostInputEventRouter::ReportBubblingScrollToSameView( const blink::WebGestureEvent& event, const RenderWidgetHostViewBase* view) {
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.h b/content/browser/renderer_host/render_widget_host_input_event_router.h index 30033fc..e7581441 100644 --- a/content/browser/renderer_host/render_widget_host_input_event_router.h +++ b/content/browser/renderer_host/render_widget_host_input_event_router.h
@@ -258,9 +258,6 @@ gfx::PointF* transformed_point, viz::EventSource source) const; - // TODO(851958): Remove once we understand the cause of 851958. - void ReportMouseTargetNotInRoot(RenderWidgetHostViewBase* target_root, - RenderWidgetHostViewBase* specified_root); // TODO(828422): Remove once this issue no longer occurs. void ReportBubblingScrollToSameView(const blink::WebGestureEvent& event, const RenderWidgetHostViewBase* view);
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 b7a8e3a..e885f12 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -559,8 +559,7 @@ ? *GetTextInputManager()->GetTextInputState() : TextInputState(); - if (!ime_adapter_android_ || (is_in_vr_ && !base::FeatureList::IsEnabled( - features::kVrWebInputEditing))) + if (!ime_adapter_android_) return; ime_adapter_android_->UpdateState(state);
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 869cf084..fffff471 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
@@ -638,13 +638,13 @@ return; if (!last_activated_surface_info_.is_valid()) return; - SendSurfaceInfoToEmbedderImpl(last_activated_surface_info_); + FirstSurfaceActivation(last_activated_surface_info_); } -void RenderWidgetHostViewChildFrame::SendSurfaceInfoToEmbedderImpl( +void RenderWidgetHostViewChildFrame::FirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { if (frame_connector_) - frame_connector_->SetChildFrameSurface(surface_info); + frame_connector_->FirstSurfaceActivation(surface_info); } void RenderWidgetHostViewChildFrame::SubmitCompositorFrame( @@ -944,7 +944,7 @@ const viz::SurfaceInfo& surface_info) { last_activated_surface_info_ = surface_info; has_frame_ = true; - SendSurfaceInfoToEmbedderImpl(surface_info); + FirstSurfaceActivation(surface_info); ProcessFrameSwappedCallbacks(); }
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 75878f0..455f4f9 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
@@ -289,8 +289,7 @@ FRIEND_TEST_ALL_PREFIXES(SitePerProcessBrowserTest, SubframeVisibleAfterRenderViewBecomesSwappedOut); - virtual void SendSurfaceInfoToEmbedderImpl( - const viz::SurfaceInfo& surface_info); + virtual void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info); void CreateCompositorFrameSinkSupport(); void ResetCompositorFrameSinkSupport();
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 3a2a5bc..bdb58a1b 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
@@ -58,7 +58,7 @@ : FrameConnectorDelegate(use_zoom_for_device_scale_factor) {} ~MockFrameConnectorDelegate() override {} - void SetChildFrameSurface(const viz::SurfaceInfo& surface_info) override { + void FirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override { last_surface_info_ = surface_info; }
diff --git a/content/browser/renderer_host/render_widget_host_view_cocoa.mm b/content/browser/renderer_host/render_widget_host_view_cocoa.mm index 8a1d329..3b3ef0f 100644 --- a/content/browser/renderer_host/render_widget_host_view_cocoa.mm +++ b/content/browser/renderer_host/render_widget_host_view_cocoa.mm
@@ -479,6 +479,13 @@ if (subtype != NSTabletPointEventSubtype && subtype != NSTabletProximityEventSubtype) { pointerType_ = blink::WebPointerProperties::PointerType::kMouse; + } else if (subtype == NSTabletProximityEventSubtype) { + isStylusEnteringProximity_ = [theEvent isEnteringProximity]; + NSPointingDeviceType deviceType = [theEvent pointingDeviceType]; + // For all tablet events, the pointer type will be pen or eraser. + pointerType_ = deviceType == NSEraserPointingDevice + ? blink::WebPointerProperties::PointerType::kEraser + : blink::WebPointerProperties::PointerType::kPen; } }
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm index 374eb9a6..c7d5263 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -165,10 +165,13 @@ NSEvent* MockMouseEventWithParams(CGEventType mouse_type, CGPoint location, CGMouseButton button, - CGEventMouseSubtype subtype) { + CGEventMouseSubtype subtype, + bool is_entering_proximity = false) { CGEventRef cg_event = CGEventCreateMouseEvent(NULL, mouse_type, location, button); CGEventSetIntegerValueField(cg_event, kCGMouseEventSubtype, subtype); + CGEventSetIntegerValueField(cg_event, kCGTabletProximityEventEnterProximity, + is_entering_proximity); NSEvent* event = [NSEvent eventWithCGEvent:cg_event]; CFRelease(cg_event); return event; @@ -942,6 +945,36 @@ GetPointerType(events)); } +TEST_F(RenderWidgetHostViewMacTest, PointerEventWithPenTypeNoTabletEvent) { + // Send a NSEvent of a mouse type with a subtype of + // NSTabletProximityEventSubtype, which indicates the input device is a pen. + NSEvent* event = + MockMouseEventWithParams(kCGEventMouseMoved, {6, 9}, kCGMouseButtonLeft, + kCGEventMouseSubtypeTabletProximity, true); + [rwhv_mac_->cocoa_view() mouseEvent:event]; + base::RunLoop().RunUntilIdle(); + MockWidgetInputHandler::MessageVector events = + host_->GetAndResetDispatchedMessages(); + ASSERT_EQ("MouseLeave", GetMessageNames(events)); + EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen, + GetPointerType(events)); + events.clear(); + + event = cocoa_test_event_utils::EnterEvent(); + [rwhv_mac_->cocoa_view() mouseEntered:event]; + base::RunLoop().RunUntilIdle(); + events = host_->GetAndResetDispatchedMessages(); + ASSERT_EQ("MouseMove MouseMove", GetMessageNames(events)); + EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen, + static_cast<const blink::WebMouseEvent*>( + events[0]->ToEvent()->Event()->web_event.get()) + ->pointer_type); + EXPECT_EQ(blink::WebPointerProperties::PointerType::kPen, + static_cast<const blink::WebMouseEvent*>( + events[1]->ToEvent()->Event()->web_event.get()) + ->pointer_type); +} + TEST_F(RenderWidgetHostViewMacTest, PointerEventWithMouseType) { // Send a NSEvent of a mouse type. NSEvent* event =
diff --git a/content/browser/renderer_host/render_widget_targeter.cc b/content/browser/renderer_host/render_widget_targeter.cc index c5f44fc..f25502b 100644 --- a/content/browser/renderer_host/render_widget_targeter.cc +++ b/content/browser/renderer_host/render_widget_targeter.cc
@@ -183,9 +183,16 @@ const gfx::PointF& last_target_location) { DCHECK(!request_in_flight_); + auto* target_client = target->host()->input_target_client(); + // |target_client| may not be set yet for this |target| on Mac, need to + // understand why this happens. https://crbug.com/859492 + if (!target_client) { + FoundTarget(root_view, target, event, latency, target_location, false); + return; + } + request_in_flight_ = true; async_depth_++; - auto* target_client = target->host()->input_target_client(); TracingUmaTracker tracker("Event.AsyncTargeting.ResponseTime", "input,latency"); async_hit_test_timeout_.reset(new OneShotTimeoutMonitor(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 3409617..c1a8e3e 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -679,7 +679,10 @@ host_zoom_map_observer_.reset(new HostZoomMapObserver(this)); #endif // !defined(OS_ANDROID) - display_cutout_host_impl_ = std::make_unique<DisplayCutoutHostImpl>(this); +#if defined(OS_ANDROID) + if (base::FeatureList::IsEnabled(features::kDisplayCutoutAPI)) + display_cutout_host_impl_ = std::make_unique<DisplayCutoutHostImpl>(this); +#endif registry_.AddInterface(base::BindRepeating( &WebContentsImpl::OnColorChooserFactoryRequest, base::Unretained(this))); @@ -1392,7 +1395,8 @@ #if defined(OS_ANDROID) void WebContentsImpl::SetDisplayCutoutSafeArea(gfx::Insets insets) { - display_cutout_host_impl_->SetDisplayCutoutSafeArea(insets); + if (display_cutout_host_impl_) + display_cutout_host_impl_->SetDisplayCutoutSafeArea(insets); } #endif @@ -4152,9 +4156,11 @@ SetNotWaitingForResponse(); // Reset the viewport fit - display_cutout_host_impl_->ViewportFitChangedForFrame( - navigation_handle->GetRenderFrameHost(), - blink::mojom::ViewportFit::kAuto); + if (display_cutout_host_impl_) { + display_cutout_host_impl_->ViewportFitChangedForFrame( + navigation_handle->GetRenderFrameHost(), + blink::mojom::ViewportFit::kAuto); + } } void WebContentsImpl::DidFinishNavigation(NavigationHandle* navigation_handle) {
diff --git a/content/common/browser_plugin/browser_plugin_messages.h b/content/common/browser_plugin/browser_plugin_messages.h index bef070d..f511cb5 100644 --- a/content/common/browser_plugin/browser_plugin_messages.h +++ b/content/common/browser_plugin/browser_plugin_messages.h
@@ -215,7 +215,7 @@ int /* browser_plugin_instance_id */, content::WebCursor /* cursor */) -IPC_MESSAGE_CONTROL2(BrowserPluginMsg_SetChildFrameSurface, +IPC_MESSAGE_CONTROL2(BrowserPluginMsg_FirstSurfaceActivation, int /* browser_plugin_instance_id */, viz::SurfaceInfo /* surface_info */)
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index 21e773401..4a14664a 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -65,9 +65,6 @@ // Note: |url_loader_client_endpoints| will be empty iff the navigation URL // wasn't handled by the network stack (i.e. about:blank, ...) // - // Note: |response_body| is only used when NavigationImmediateResponseBody is - // enabled. It contains the datapipe used to read the response body. - // // When the Network Service is enabled, |subresource_loader_factories| may // also be provided by the browser as a a means for the renderer to load // subresources where applicable. @@ -91,7 +88,6 @@ CommonNavigationParams common_params, RequestNavigationParams request_params, network.mojom.URLLoaderClientEndpoints? url_loader_client_endpoints, - handle<data_pipe_consumer>? response_body, URLLoaderFactoryBundle? subresource_loader_factories, array<TransferrableURLLoader>? subresource_overrides, ControllerServiceWorkerInfo? controller_service_worker_info,
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index 8284a42..8759dcf 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h
@@ -807,7 +807,7 @@ IPC_MESSAGE_ROUTED1(FrameMsg_IntrinsicSizingInfoOfChildChanged, blink::WebIntrinsicSizingInfo) -IPC_MESSAGE_ROUTED1(FrameMsg_SetChildFrameSurface, +IPC_MESSAGE_ROUTED1(FrameMsg_FirstSurfaceActivation, viz::SurfaceInfo /* surface_info */) // Notifies the embedding frame that the process rendering the child frame's
diff --git a/content/common/navigation_client.mojom b/content/common/navigation_client.mojom index 8f2afe0..0e7b677 100644 --- a/content/common/navigation_client.mojom +++ b/content/common/navigation_client.mojom
@@ -53,7 +53,6 @@ CommonNavigationParams common_params, RequestNavigationParams request_params, network.mojom.URLLoaderClientEndpoints? url_loader_client_endpoints, - handle<data_pipe_consumer>? response_body, URLLoaderFactoryBundle? subresource_loader_factories, array<TransferrableURLLoader>? subresource_overrides, ControllerServiceWorkerInfo? controller_service_worker_info,
diff --git a/content/public/common/browser_side_navigation_policy.cc b/content/public/common/browser_side_navigation_policy.cc index ccc210bd..726289e 100644 --- a/content/public/common/browser_side_navigation_policy.cc +++ b/content/public/common/browser_side_navigation_policy.cc
@@ -19,9 +19,4 @@ return base::FeatureList::IsEnabled(features::kPerNavigationMojoInterface); } -bool IsNavigationImmediateResponseBodyEnabled() { - return base::FeatureList::IsEnabled( - features::kNavigationImmediateResponseBody); -} - } // namespace content
diff --git a/content/public/common/browser_side_navigation_policy.h b/content/public/common/browser_side_navigation_policy.h index 8c352a0..d5887a1 100644 --- a/content/public/common/browser_side_navigation_policy.h +++ b/content/public/common/browser_side_navigation_policy.h
@@ -14,7 +14,6 @@ CONTENT_EXPORT bool IsBrowserSideNavigationEnabled(); CONTENT_EXPORT bool IsPerNavigationMojoInterfaceEnabled(); -CONTENT_EXPORT bool IsNavigationImmediateResponseBodyEnabled(); } // namespace content
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index dd700ee..bd370c75 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -245,11 +245,6 @@ #endif }; -// Transmit the response body datapipe to the renderer process in -// CommitNavigation() so that it can start reading earlier. -const base::Feature kNavigationImmediateResponseBody{ - "NavigationImmediateResponseBody", base::FEATURE_ENABLED_BY_DEFAULT}; - // If the network service is enabled, runs it in process. const base::Feature kNetworkServiceInProcess{"NetworkServiceInProcess", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -454,10 +449,6 @@ const base::Feature kV8VmFuture{"V8VmFuture", base::FEATURE_DISABLED_BY_DEFAULT}; -// Controls whether editing web input fields is enabled in VR. -const base::Feature kVrWebInputEditing{"VrWebInputEditing", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Enable WebAssembly structured cloning. // http://webassembly.org/ const base::Feature kWebAssembly{"WebAssembly",
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index cb2e3e9..5fc69c68 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -62,7 +62,6 @@ CONTENT_EXPORT extern const base::Feature kModuleScriptsImportMetaUrl; CONTENT_EXPORT extern const base::Feature kMojoSessionStorage; CONTENT_EXPORT extern const base::Feature kMojoVideoCapture; -CONTENT_EXPORT extern const base::Feature kNavigationImmediateResponseBody; CONTENT_EXPORT extern const base::Feature kNetworkServiceInProcess; CONTENT_EXPORT extern const base::Feature kNotificationContentImage; CONTENT_EXPORT extern const base::Feature kOffMainThreadWebSocket; @@ -108,7 +107,6 @@ CONTENT_EXPORT extern const base::Feature kV8LowMemoryModeForSubframes; CONTENT_EXPORT extern const base::Feature kV8Orinoco; CONTENT_EXPORT extern const base::Feature kV8VmFuture; -CONTENT_EXPORT extern const base::Feature kVrWebInputEditing; CONTENT_EXPORT extern const base::Feature kWebAssembly; CONTENT_EXPORT extern const base::Feature kWebAssemblyStreaming; CONTENT_EXPORT extern const base::Feature kWebAssemblyBaseline;
diff --git a/content/public/test/nested_message_pump_android.cc b/content/public/test/nested_message_pump_android.cc index 8e0b8df..48d4d17 100644 --- a/content/public/test/nested_message_pump_android.cc +++ b/content/public/test/nested_message_pump_android.cc
@@ -117,7 +117,7 @@ state_ = previous_state; } -void NestedMessagePumpAndroid::Start( +void NestedMessagePumpAndroid::Attach( base::MessagePump::Delegate* delegate) { JNIEnv* env = base::android::AttachCurrentThread(); DCHECK(env);
diff --git a/content/public/test/nested_message_pump_android.h b/content/public/test/nested_message_pump_android.h index 91c68a0..4f5cebe 100644 --- a/content/public/test/nested_message_pump_android.h +++ b/content/public/test/nested_message_pump_android.h
@@ -22,7 +22,7 @@ void Quit() override; void ScheduleWork() override; void ScheduleDelayedWork(const base::TimeTicks& delayed_work_time) override; - void Start(Delegate* delegate) override; + void Attach(Delegate* delegate) override; protected: ~NestedMessagePumpAndroid() override;
diff --git a/content/renderer/accessibility/blink_ax_tree_source.cc b/content/renderer/accessibility/blink_ax_tree_source.cc index 04a742a7..44d0e04d 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.cc +++ b/content/renderer/accessibility/blink_ax_tree_source.cc
@@ -501,7 +501,8 @@ blink::WebString web_name = src.GetName(nameFrom, nameObjects); if ((!web_name.IsEmpty() && !web_name.IsNull()) || nameFrom == blink::kWebAXNameFromAttributeExplicitlyEmpty) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kName, web_name.Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kName, + web_name.Utf8()); dst->SetNameFrom(AXNameFromFromBlink(nameFrom)); AddIntListAttributeFromWebObjects( ax::mojom::IntListAttribute::kLabelledbyIds, nameObjects, dst); @@ -512,8 +513,8 @@ blink::WebString web_description = src.Description(nameFrom, descriptionFrom, descriptionObjects); if (!web_description.IsEmpty()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kDescription, - web_description.Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kDescription, + web_description.Utf8()); dst->AddIntAttribute( ax::mojom::IntAttribute::kDescriptionFrom, static_cast<int32_t>(AXDescriptionFromFromBlink(descriptionFrom))); @@ -522,11 +523,11 @@ } if (src.ValueDescription().length()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kValue, - src.ValueDescription().Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kValue, + src.ValueDescription().Utf8()); } else { - dst->AddStringAttribute(ax::mojom::StringAttribute::kValue, - src.StringValue().Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kValue, + src.StringValue().Utf8()); } switch (src.Restriction()) { @@ -543,8 +544,8 @@ } if (!src.Url().IsEmpty()) - dst->AddStringAttribute(ax::mojom::StringAttribute::kUrl, - src.Url().GetString().Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kUrl, + src.Url().GetString().Utf8()); // The following set of attributes are only accessed when the accessibility // mode is set to screen reader mode, otherwise only the more basic @@ -552,8 +553,9 @@ if (accessibility_mode_.has_mode(ui::AXMode::kScreenReader)) { blink::WebString web_placeholder = src.Placeholder(nameFrom); if (!web_placeholder.IsEmpty()) - dst->AddStringAttribute(ax::mojom::StringAttribute::kPlaceholder, - web_placeholder.Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kPlaceholder, + web_placeholder.Utf8()); if (dst->role == ax::mojom::Role::kColorWell) dst->AddIntAttribute(ax::mojom::IntAttribute::kColorValue, @@ -585,8 +587,9 @@ WebAXObject parent = ParentObjectUnignored(src); if (src.FontFamily().length()) { if (parent.IsNull() || parent.FontFamily() != src.FontFamily()) - dst->AddStringAttribute(ax::mojom::StringAttribute::kFontFamily, - src.FontFamily().Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kFontFamily, + src.FontFamily().Utf8()); } // Font size is in pixels. @@ -610,8 +613,9 @@ } if (src.InvalidState() == blink::kWebAXInvalidStateOther && src.AriaInvalidValue().length()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kAriaInvalidValue, - src.AriaInvalidValue().Utf8()); + TruncateAndAddStringAttribute( + dst, ax::mojom::StringAttribute::kAriaInvalidValue, + src.AriaInvalidValue().Utf8()); } if (src.CheckedState()) { @@ -662,13 +666,14 @@ } if (src.AccessKey().length()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kAccessKey, - src.AccessKey().Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kAccessKey, + src.AccessKey().Utf8()); } if (src.AriaAutoComplete().length()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kAutoComplete, - src.AriaAutoComplete().Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kAutoComplete, + src.AriaAutoComplete().Utf8()); } if (src.Action() != blink::WebAXDefaultActionVerb::kNone) { @@ -676,20 +681,21 @@ } if (src.HasComputedStyle()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kDisplay, - src.ComputedStyleDisplay().Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kDisplay, + src.ComputedStyleDisplay().Utf8()); } if (src.Language().length()) { if (parent.IsNull() || parent.Language() != src.Language()) - dst->AddStringAttribute(ax::mojom::StringAttribute::kLanguage, - src.Language().Utf8()); + TruncateAndAddStringAttribute( + dst, ax::mojom::StringAttribute::kLanguage, src.Language().Utf8()); } if (src.KeyboardShortcut().length() && !dst->HasStringAttribute(ax::mojom::StringAttribute::kKeyShortcuts)) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kKeyShortcuts, - src.KeyboardShortcut().Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kKeyShortcuts, + src.KeyboardShortcut().Utf8()); } if (!src.NextOnLine().IsDetached()) { @@ -759,11 +765,13 @@ dst->AddBoolAttribute(ax::mojom::BoolAttribute::kLiveAtomic, src.LiveRegionAtomic()); if (!src.LiveRegionStatus().IsEmpty()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kLiveStatus, - src.LiveRegionStatus().Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kLiveStatus, + src.LiveRegionStatus().Utf8()); } - dst->AddStringAttribute(ax::mojom::StringAttribute::kLiveRelevant, - src.LiveRegionRelevant().Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kLiveRelevant, + src.LiveRegionRelevant().Utf8()); // If we are not at the root of an atomic live region. if (src.ContainerLiveRegionAtomic() && !src.LiveRegionRoot().IsDetached() && !src.LiveRegionAtomic()) { @@ -774,10 +782,11 @@ src.ContainerLiveRegionAtomic()); dst->AddBoolAttribute(ax::mojom::BoolAttribute::kContainerLiveBusy, src.ContainerLiveRegionBusy()); - dst->AddStringAttribute(ax::mojom::StringAttribute::kContainerLiveStatus, - src.ContainerLiveRegionStatus().Utf8()); - dst->AddStringAttribute( - ax::mojom::StringAttribute::kContainerLiveRelevant, + TruncateAndAddStringAttribute( + dst, ax::mojom::StringAttribute::kContainerLiveStatus, + src.ContainerLiveRegionStatus().Utf8()); + TruncateAndAddStringAttribute( + dst, ax::mojom::StringAttribute::kContainerLiveRelevant, src.ContainerLiveRegionRelevant().Utf8()); } @@ -818,8 +827,8 @@ } if (dst->role == ax::mojom::Role::kRootWebArea) - dst->AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag, - "#document"); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kHtmlTag, + "#document"); const bool is_table_like_role = ui::IsTableLikeRole(dst->role); if (is_table_like_role) { @@ -902,8 +911,9 @@ // TODO(ctguil): The tagName in WebKit is lower cased but // HTMLElement::nodeName calls localNameUpper. Consider adding // a WebElement method that returns the original lower cased tagName. - dst->AddStringAttribute(ax::mojom::StringAttribute::kHtmlTag, - base::ToLowerASCII(element.TagName().Utf8())); + TruncateAndAddStringAttribute( + dst, ax::mojom::StringAttribute::kHtmlTag, + base::ToLowerASCII(element.TagName().Utf8())); for (unsigned i = 0; i < element.AttributeCount(); ++i) { std::string name = base::ToLowerASCII(element.AttributeLocalName(i).Utf8()); @@ -915,8 +925,9 @@ // and remove ifdef. #if defined(OS_WIN) if (dst->role == ax::mojom::Role::kMath && element.InnerHTML().length()) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kInnerHtml, - element.InnerHTML().Utf8()); + TruncateAndAddStringAttribute(dst, + ax::mojom::StringAttribute::kInnerHtml, + element.InnerHTML().Utf8()); } #endif } @@ -936,12 +947,13 @@ // ARIA role. if (element.HasAttribute("role")) { - dst->AddStringAttribute(ax::mojom::StringAttribute::kRole, - element.GetAttribute("role").Utf8()); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kRole, + element.GetAttribute("role").Utf8()); } else { std::string role = GetEquivalentAriaRoleString(dst->role); if (!role.empty()) - dst->AddStringAttribute(ax::mojom::StringAttribute::kRole, role); + TruncateAndAddStringAttribute(dst, ax::mojom::StringAttribute::kRole, + role); } // Browser plugin (used in a <webview>). @@ -996,6 +1008,9 @@ } if (dst->id == image_data_node_id_) { + // In general, string attributes should be truncated using + // TruncateAndAddStringAttribute, but ImageDataUrl contains a data url + // representing an image, so add it directly using AddStringAttribute. dst->AddStringAttribute(ax::mojom::StringAttribute::kImageDataUrl, src.ImageDataUrl(max_image_data_size_).Utf8()); } @@ -1020,4 +1035,18 @@ return WebAXObject(); } +void BlinkAXTreeSource::TruncateAndAddStringAttribute( + AXContentNodeData* dst, + ax::mojom::StringAttribute attribute, + const std::string& value) const { + if (value.size() > BlinkAXTreeSource::kMaxStringAttributeLength) { + std::string truncated; + base::TruncateUTF8ToByteSize( + value, BlinkAXTreeSource::kMaxStringAttributeLength, &truncated); + dst->AddStringAttribute(attribute, truncated); + } else { + dst->AddStringAttribute(attribute, value); + } +} + } // namespace content
diff --git a/content/renderer/accessibility/blink_ax_tree_source.h b/content/renderer/accessibility/blink_ax_tree_source.h index 3047243..03e732b 100644 --- a/content/renderer/accessibility/blink_ax_tree_source.h +++ b/content/renderer/accessibility/blink_ax_tree_source.h
@@ -115,6 +115,11 @@ blink::WebAXObject ComputeRoot() const; + uint32_t kMaxStringAttributeLength = 10000; + void TruncateAndAddStringAttribute(AXContentNodeData* dst, + ax::mojom::StringAttribute attribute, + const std::string& value) const; + RenderFrameImpl* render_frame_; ui::AXMode accessibility_mode_;
diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 0071819..40a3c69 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc
@@ -136,13 +136,13 @@ #endif IPC_MESSAGE_HANDLER(BrowserPluginMsg_ShouldAcceptTouchEvents, OnShouldAcceptTouchEvents) - IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetChildFrameSurface, - OnSetChildFrameSurface) + IPC_MESSAGE_HANDLER(BrowserPluginMsg_FirstSurfaceActivation, + OnFirstSurfaceActivation) IPC_END_MESSAGE_MAP() return handled; } -void BrowserPlugin::OnSetChildFrameSurface( +void BrowserPlugin::OnFirstSurfaceActivation( int browser_plugin_instance_id, const viz::SurfaceInfo& surface_info) { if (!attached() || !features::IsAshInBrowserProcess())
diff --git a/content/renderer/browser_plugin/browser_plugin.h b/content/renderer/browser_plugin/browser_plugin.h index 7b90221..43beca6 100644 --- a/content/renderer/browser_plugin/browser_plugin.h +++ b/content/renderer/browser_plugin/browser_plugin.h
@@ -204,8 +204,8 @@ const gfx::Size& min_size, const gfx::Size& max_size); void OnDisableAutoResize(int browser_plugin_instance_id); - void OnSetChildFrameSurface(int instance_id, - const viz::SurfaceInfo& surface_info); + void OnFirstSurfaceActivation(int instance_id, + const viz::SurfaceInfo& surface_info); void OnSetContentsOpaque(int instance_id, bool opaque); void OnSetCursor(int instance_id, const WebCursor& cursor); void OnSetMouseLock(int instance_id, bool enable);
diff --git a/content/renderer/dom_storage/local_storage_cached_areas.h b/content/renderer/dom_storage/local_storage_cached_areas.h index 33d7ef2..2e41a0e 100644 --- a/content/renderer/dom_storage/local_storage_cached_areas.h +++ b/content/renderer/dom_storage/local_storage_cached_areas.h
@@ -83,7 +83,7 @@ DISALLOW_COPY_AND_ASSIGN(DOMStorageNamespace); }; - base::flat_map<std::string, DOMStorageNamespace> cached_namespaces_; + std::map<std::string, DOMStorageNamespace> cached_namespaces_; size_t total_cache_limit_; // Not owned.
diff --git a/content/renderer/loader/navigation_response_override_parameters.h b/content/renderer/loader/navigation_response_override_parameters.h index 70b6a420..e9a9b7b 100644 --- a/content/renderer/loader/navigation_response_override_parameters.h +++ b/content/renderer/loader/navigation_response_override_parameters.h
@@ -8,7 +8,6 @@ #include <vector> #include "content/common/content_export.h" -#include "mojo/public/cpp/system/data_pipe.h" #include "net/url_request/redirect_info.h" #include "services/network/public/cpp/resource_response.h" #include "services/network/public/mojom/url_loader.mojom.h" @@ -23,7 +22,6 @@ ~NavigationResponseOverrideParameters(); network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints; - mojo::ScopedDataPipeConsumerHandle response_body; network::ResourceResponseHead response; std::vector<GURL> redirects; std::vector<network::ResourceResponseHead> redirect_responses;
diff --git a/content/renderer/loader/resource_dispatcher.cc b/content/renderer/loader/resource_dispatcher.cc index 5a3dcb2..3d5bd290 100644 --- a/content/renderer/loader/resource_dispatcher.cc +++ b/content/renderer/loader/resource_dispatcher.cc
@@ -788,15 +788,6 @@ if (!GetPendingRequestInfo(request_id)) return; - if (response_override->response_body.is_valid()) { - client_ptr->OnStartLoadingResponseBody( - std::move(response_override->response_body)); - - // Abort if the request is cancelled. - if (!GetPendingRequestInfo(request_id)) - return; - } - DCHECK(response_override->url_loader_client_endpoints); client_ptr->Bind(std::move(response_override->url_loader_client_endpoints)); }
diff --git a/content/renderer/loader/web_url_loader_impl.h b/content/renderer/loader/web_url_loader_impl.h index df7487d..9cfb970 100644 --- a/content/renderer/loader/web_url_loader_impl.h +++ b/content/renderer/loader/web_url_loader_impl.h
@@ -9,6 +9,7 @@ #include "base/memory/ref_counted.h" #include "content/common/content_export.h" #include "content/common/frame.mojom.h" +#include "mojo/public/cpp/system/data_pipe.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "third_party/blink/public/platform/web_url_loader.h"
diff --git a/content/renderer/navigation_client.cc b/content/renderer/navigation_client.cc index 1f58e972..a52cbf74 100644 --- a/content/renderer/navigation_client.cc +++ b/content/renderer/navigation_client.cc
@@ -18,7 +18,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>> subresource_overrides, @@ -31,8 +30,8 @@ ResetDisconnectionHandler(); render_frame_->CommitNavigation( head, common_params, request_params, - std::move(url_loader_client_endpoints), std::move(response_body), - std::move(subresource_loaders), std::move(subresource_overrides), + std::move(url_loader_client_endpoints), std::move(subresource_loaders), + std::move(subresource_overrides), std::move(controller_service_worker_info), devtools_navigation_token, mojom::FrameNavigationControl::CommitNavigationCallback()); }
diff --git a/content/renderer/navigation_client.h b/content/renderer/navigation_client.h index 5b36beb..6905161e 100644 --- a/content/renderer/navigation_client.h +++ b/content/renderer/navigation_client.h
@@ -23,7 +23,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>> subresource_overrides,
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 4f6bff1..767ff87 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -3045,7 +3045,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loader_factories, base::Optional<std::vector<mojom::TransferrableURLLoaderPtr>> subresource_overrides, @@ -3140,7 +3139,7 @@ } else { WebURLRequest request = CreateURLRequestForCommit( common_params, request_params, std::move(url_loader_client_endpoints), - std::move(response_body), head); + head); frame_->CommitNavigation(request, load_type, item_for_history_navigation, is_client_redirect, devtools_navigation_token, std::move(document_state)); @@ -6519,7 +6518,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, const network::ResourceResponseHead& head) { // This will override the url requested by the WebURLLoader, as well as // provide it with the response to the request. @@ -6527,7 +6525,6 @@ new NavigationResponseOverrideParameters()); response_override->url_loader_client_endpoints = std::move(url_loader_client_endpoints); - response_override->response_body = std::move(response_body); response_override->response = head; response_override->redirects = request_params.redirects; response_override->redirect_responses = request_params.redirect_response;
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 6ab340e..1b10136 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -525,7 +525,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, base::Optional<std::vector<mojom::TransferrableURLLoaderPtr>> subresource_overrides, @@ -1094,7 +1093,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, const network::ResourceResponseHead& head); // Returns a ChildURLLoaderFactoryBundle which can be used to request
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index d9c6ab7..bb6248db 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc
@@ -256,7 +256,7 @@ #endif } -void RenderFrameProxy::ResendResizeParams() { +void RenderFrameProxy::ResendVisualProperties() { // Reset |sent_visual_properties_| in order to allocate a new // viz::LocalSurfaceId. sent_visual_properties_ = base::nullopt; @@ -376,24 +376,6 @@ web_frame_->SetReplicatedFeaturePolicyHeader(feature_policy_header); } -void RenderFrameProxy::SetChildFrameSurface( - const viz::SurfaceInfo& surface_info) { - // If this WebFrame has already been detached, its parent will be null. This - // can happen when swapping a WebRemoteFrame with a WebLocalFrame, where this - // message may arrive after the frame was removed from the frame tree, but - // before the frame has been destroyed. http://crbug.com/446575. - if (!web_frame()->Parent()) - return; - - if (!enable_surface_synchronization_) { - compositing_helper_->SetPrimarySurfaceId( - surface_info.id(), local_frame_size(), - cc::DeadlinePolicy::UseDefaultDeadline()); - } - compositing_helper_->SetFallbackSurfaceId(surface_info.id(), - local_frame_size()); -} - bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { // Forward Page IPCs to the RenderView. if ((IPC_MESSAGE_CLASS(msg) == PageMsgStart)) { @@ -407,7 +389,8 @@ IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) - IPC_MESSAGE_HANDLER(FrameMsg_SetChildFrameSurface, OnSetChildFrameSurface) + IPC_MESSAGE_HANDLER(FrameMsg_FirstSurfaceActivation, + OnFirstSurfaceActivation) IPC_MESSAGE_HANDLER(FrameMsg_IntrinsicSizingInfoOfChildChanged, OnIntrinsicSizingInfoOfChildChanged) IPC_MESSAGE_HANDLER(FrameMsg_UpdateOpener, OnUpdateOpener) @@ -468,9 +451,22 @@ screen_info().device_scale_factor); } -void RenderFrameProxy::OnSetChildFrameSurface( +void RenderFrameProxy::OnFirstSurfaceActivation( const viz::SurfaceInfo& surface_info) { - SetChildFrameSurface(surface_info); + // If this WebFrame has already been detached, its parent will be null. This + // can happen when swapping a WebRemoteFrame with a WebLocalFrame, where this + // message may arrive after the frame was removed from the frame tree, but + // before the frame has been destroyed. http://crbug.com/446575. + if (!web_frame()->Parent()) + return; + + if (!enable_surface_synchronization_) { + compositing_helper_->SetPrimarySurfaceId( + surface_info.id(), local_frame_size(), + cc::DeadlinePolicy::UseDefaultDeadline()); + } + compositing_helper_->SetFallbackSurfaceId(surface_info.id(), + local_frame_size()); } void RenderFrameProxy::OnIntrinsicSizingInfoOfChildChanged( @@ -496,7 +492,7 @@ // Resend the FrameRects and allocate a new viz::LocalSurfaceId when the view // changes. - ResendResizeParams(); + ResendVisualProperties(); } void RenderFrameProxy::OnDidStopLoading() { @@ -874,7 +870,7 @@ #if defined(USE_AURA) void RenderFrameProxy::OnMusEmbeddedFrameSurfaceChanged( const viz::SurfaceInfo& surface_info) { - SetChildFrameSurface(surface_info); + OnFirstSurfaceActivation(surface_info); } void RenderFrameProxy::OnMusEmbeddedFrameSinkIdAllocated( @@ -884,7 +880,7 @@ frame_sink_id_ = frame_sink_id; // Resend the FrameRects and allocate a new viz::LocalSurfaceId when the view // changes. - ResendResizeParams(); + ResendVisualProperties(); } #endif
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h index 9ca7b54b..724e773 100644 --- a/content/renderer/render_frame_proxy.h +++ b/content/renderer/render_frame_proxy.h
@@ -219,16 +219,13 @@ RenderViewImpl* render_view, RenderWidget* render_widget); - void ResendResizeParams(); - - void SetChildFrameSurface(const viz::SurfaceInfo& surface_info); + void ResendVisualProperties(); // IPC handlers void OnDeleteProxy(); void OnChildFrameProcessGone(); void OnCompositorFrameSwapped(const IPC::Message& message); - // TODO(fsamuel): Rename OnFirstSurfaceActivation(). - void OnSetChildFrameSurface(const viz::SurfaceInfo& surface_info); + void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info); void OnIntrinsicSizingInfoOfChildChanged( blink::WebIntrinsicSizingInfo sizing_info); void OnUpdateOpener(int opener_routing_id);
diff --git a/content/shell/browser/shell_browser_main_parts.cc b/content/shell/browser/shell_browser_main_parts.cc index 4d7e94e..f855437 100644 --- a/content/shell/browser/shell_browser_main_parts.cc +++ b/content/shell/browser/shell_browser_main_parts.cc
@@ -114,10 +114,6 @@ #endif void ShellBrowserMainParts::PostMainMessageLoopStart() { -#if defined(OS_ANDROID) - base::MessageLoopCurrentForUI::Get()->Start(); -#endif - #if defined(OS_CHROMEOS) chromeos::DBusThreadManager::Initialize(); bluez::BluezDBusManager::Initialize(
diff --git a/content/test/data/accessibility/html/truncate-label-expected-blink.txt b/content/test/data/accessibility/html/truncate-label-expected-blink.txt new file mode 100644 index 0000000..c8f8f97 --- /dev/null +++ b/content/test/data/accessibility/html/truncate-label-expected-blink.txt
@@ -0,0 +1,2 @@ +rootWebArea +++genericContainer name='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
diff --git a/content/test/data/accessibility/html/truncate-label.html b/content/test/data/accessibility/html/truncate-label.html new file mode 100644 index 0000000..e4effe3 --- /dev/null +++ b/content/test/data/accessibility/html/truncate-label.html
@@ -0,0 +1,17 @@ +<!-- +@BLINK-ALLOW:name=* +--> +<!DOCTYPE html> +<html> +<body> +<div id="big"></div> +<script> + var huge = document.getElementById('big'); + var count = 1000000; + var bigStr = ''; + for (var i = 0; i < count; i++) + bigStr += 'x'; + huge.setAttribute('aria-label', bigStr); +</script> +</body> +</html>
diff --git a/content/test/mock_navigation_client_impl.cc b/content/test/mock_navigation_client_impl.cc index 053af7f..a59e055e 100644 --- a/content/test/mock_navigation_client_impl.cc +++ b/content/test/mock_navigation_client_impl.cc
@@ -20,7 +20,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>> subresource_overrides,
diff --git a/content/test/mock_navigation_client_impl.h b/content/test/mock_navigation_client_impl.h index 926a6176..a82b269 100644 --- a/content/test/mock_navigation_client_impl.h +++ b/content/test/mock_navigation_client_impl.h
@@ -22,7 +22,6 @@ const CommonNavigationParams& common_params, const RequestNavigationParams& request_params, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, base::Optional<std::vector<::content::mojom::TransferrableURLLoaderPtr>> subresource_overrides,
diff --git a/content/test/test_navigation_url_loader.cc b/content/test/test_navigation_url_loader.cc index 2e9072f..793bf525 100644 --- a/content/test/test_navigation_url_loader.cc +++ b/content/test/test_navigation_url_loader.cc
@@ -90,7 +90,6 @@ url_loader_ptr.PassInterface(), std::move(url_loader_client_request)); delegate_->OnResponseStarted(response, std::move(url_loader_client_endpoints), - mojo::ScopedDataPipeConsumerHandle(), std::move(navigation_data), global_id, false, false, base::nullopt); }
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc index 0545a3de..2429660 100644 --- a/content/test/test_navigation_url_loader_delegate.cc +++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -44,7 +44,6 @@ void TestNavigationURLLoaderDelegate::ReleaseURLLoaderClientEndpoints() { url_loader_client_endpoints_ = nullptr; - response_body_.reset(); } void TestNavigationURLLoaderDelegate::OnRequestRedirected( @@ -59,7 +58,6 @@ void TestNavigationURLLoaderDelegate::OnResponseStarted( const scoped_refptr<network::ResourceResponse>& response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, @@ -67,7 +65,6 @@ base::Optional<SubresourceLoaderParams> subresource_loader_params) { response_ = response; url_loader_client_endpoints_ = std::move(url_loader_client_endpoints); - response_body_ = std::move(response_body); if (response->head.ssl_info.has_value()) ssl_info_ = *response->head.ssl_info; is_download_ = is_download;
diff --git a/content/test/test_navigation_url_loader_delegate.h b/content/test/test_navigation_url_loader_delegate.h index 8db8590..e7ecf4f 100644 --- a/content/test/test_navigation_url_loader_delegate.h +++ b/content/test/test_navigation_url_loader_delegate.h
@@ -63,7 +63,6 @@ void OnResponseStarted( const scoped_refptr<network::ResourceResponse>& response, network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints, - mojo::ScopedDataPipeConsumerHandle response_body, std::unique_ptr<NavigationData> navigation_data, const GlobalRequestID& request_id, bool is_download, @@ -79,7 +78,6 @@ scoped_refptr<network::ResourceResponse> redirect_response_; network::mojom::URLLoaderClientEndpointsPtr url_loader_client_endpoints_; scoped_refptr<network::ResourceResponse> response_; - mojo::ScopedDataPipeConsumerHandle response_body_; int net_error_; net::SSLInfo ssl_info_; int on_request_handled_counter_;
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index ed2f631c..c970e525 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc
@@ -154,7 +154,6 @@ CommitNavigation( network::ResourceResponseHead(), common_params, request_params, network::mojom::URLLoaderClientEndpointsPtr(), - mojo::ScopedDataPipeConsumerHandle(), std::make_unique<URLLoaderFactoryBundleInfo>(), base::nullopt, mojom::ControllerServiceWorkerInfoPtr(), base::UnguessableToken::Create(), CommitNavigationCallback());
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn index 54539e9..1097db51 100644 --- a/crypto/BUILD.gn +++ b/crypto/BUILD.gn
@@ -133,7 +133,6 @@ "ec_private_key_unittest.cc", "ec_signature_creator_unittest.cc", "encryptor_unittest.cc", - "hkdf_unittest.cc", "hmac_unittest.cc", "nss_key_util_unittest.cc", "nss_util_unittest.cc",
diff --git a/crypto/hkdf.cc b/crypto/hkdf.cc index 6e4f84f..e2d367c 100644 --- a/crypto/hkdf.cc +++ b/crypto/hkdf.cc
@@ -11,125 +11,24 @@ #include "base/logging.h" #include "crypto/hmac.h" +#include "third_party/boringssl/src/include/openssl/digest.h" +#include "third_party/boringssl/src/include/openssl/hkdf.h" namespace crypto { -const size_t kSHA256HashLength = 32; - -HKDF::HKDF(base::StringPiece secret, - base::StringPiece salt, - base::StringPiece info, - size_t key_bytes_to_generate, - size_t iv_bytes_to_generate, - size_t subkey_secret_bytes_to_generate) - : HKDF(secret, - salt, - info, - key_bytes_to_generate, - key_bytes_to_generate, - iv_bytes_to_generate, - iv_bytes_to_generate, - subkey_secret_bytes_to_generate) {} - -HKDF::HKDF(base::StringPiece secret, - base::StringPiece salt, - base::StringPiece info, - size_t client_key_bytes_to_generate, - size_t server_key_bytes_to_generate, - size_t client_iv_bytes_to_generate, - size_t server_iv_bytes_to_generate, - size_t subkey_secret_bytes_to_generate) { - // https://tools.ietf.org/html/rfc5869#section-2.2 - base::StringPiece actual_salt = salt; - char zeros[kSHA256HashLength]; - if (actual_salt.empty()) { - // If salt is not given, HashLength zeros are used. - memset(zeros, 0, sizeof(zeros)); - actual_salt.set(zeros, sizeof(zeros)); - } - - // Perform the Extract step to transform the input key and - // salt into the pseudorandom key (PRK) used for Expand. - HMAC prk_hmac(HMAC::SHA256); - bool result = prk_hmac.Init(actual_salt); +std::string HkdfSha256(base::StringPiece secret, + base::StringPiece salt, + base::StringPiece info, + size_t derived_key_size) { + std::string key; + key.resize(derived_key_size); + int result = ::HKDF( + reinterpret_cast<uint8_t*>(&key[0]), derived_key_size, EVP_sha256(), + reinterpret_cast<const uint8_t*>(secret.data()), secret.size(), + reinterpret_cast<const uint8_t*>(salt.data()), salt.size(), + reinterpret_cast<const uint8_t*>(info.data()), info.size()); DCHECK(result); - - // |prk| is a pseudorandom key (of kSHA256HashLength octets). - uint8_t prk[kSHA256HashLength]; - DCHECK_EQ(sizeof(prk), prk_hmac.DigestLength()); - result = prk_hmac.Sign(secret, prk, sizeof(prk)); - DCHECK(result); - - // https://tools.ietf.org/html/rfc5869#section-2.3 - // Perform the Expand phase to turn the pseudorandom key - // and info into the output keying material. - const size_t material_length = - client_key_bytes_to_generate + client_iv_bytes_to_generate + - server_key_bytes_to_generate + server_iv_bytes_to_generate + - subkey_secret_bytes_to_generate; - const size_t n = - (material_length + kSHA256HashLength - 1) / kSHA256HashLength; - DCHECK_LT(n, 256u); - - output_.resize(n * kSHA256HashLength); - base::StringPiece previous; - - std::unique_ptr<char[]> buf(new char[kSHA256HashLength + info.size() + 1]); - uint8_t digest[kSHA256HashLength]; - - HMAC hmac(HMAC::SHA256); - result = hmac.Init(prk, sizeof(prk)); - DCHECK(result); - - for (size_t i = 0; i < n; i++) { - memcpy(buf.get(), previous.data(), previous.size()); - size_t j = previous.size(); - memcpy(buf.get() + j, info.data(), info.size()); - j += info.size(); - buf[j++] = static_cast<char>(i + 1); - - result = hmac.Sign(base::StringPiece(buf.get(), j), digest, sizeof(digest)); - DCHECK(result); - - memcpy(&output_[i*sizeof(digest)], digest, sizeof(digest)); - previous = base::StringPiece(reinterpret_cast<char*>(digest), - sizeof(digest)); - } - - size_t j = 0; - // On Windows, when the size of output_ is zero, dereference of 0'th element - // results in a crash. C++11 solves this problem by adding a data() getter - // method to std::vector. - if (client_key_bytes_to_generate) { - client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), - client_key_bytes_to_generate); - j += client_key_bytes_to_generate; - } - - if (server_key_bytes_to_generate) { - server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), - server_key_bytes_to_generate); - j += server_key_bytes_to_generate; - } - - if (client_iv_bytes_to_generate) { - client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), - client_iv_bytes_to_generate); - j += client_iv_bytes_to_generate; - } - - if (server_iv_bytes_to_generate) { - server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), - server_iv_bytes_to_generate); - j += server_iv_bytes_to_generate; - } - - if (subkey_secret_bytes_to_generate) { - subkey_secret_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), - subkey_secret_bytes_to_generate); - } + return key; } -HKDF::~HKDF() = default; - } // namespace crypto
diff --git a/crypto/hkdf.h b/crypto/hkdf.h index ff93e2b..f0d7a50 100644 --- a/crypto/hkdf.h +++ b/crypto/hkdf.h
@@ -6,78 +6,19 @@ #define CRYPTO_HKDF_H_ #include <stddef.h> -#include <stdint.h> -#include <vector> +#include <string> #include "base/strings/string_piece.h" #include "crypto/crypto_export.h" namespace crypto { -// HKDF implements the key derivation function specified in RFC 5869 (using -// SHA-256) and outputs key material, as needed by QUIC. -// See https://tools.ietf.org/html/rfc5869 for details. -class CRYPTO_EXPORT HKDF { - public: - // |secret|: the input shared secret (or, from RFC 5869, the IKM). - // |salt|: an (optional) public salt / non-secret random value. While - // optional, callers are strongly recommended to provide a salt. There is no - // added security value in making this larger than the SHA-256 block size of - // 64 bytes. - // |info|: an (optional) label to distinguish different uses of HKDF. It is - // optional context and application specific information (can be a zero-length - // string). - // |key_bytes_to_generate|: the number of bytes of key material to generate - // for both client and server. - // |iv_bytes_to_generate|: the number of bytes of IV to generate for both - // client and server. - // |subkey_secret_bytes_to_generate|: the number of bytes of subkey secret to - // generate, shared between client and server. - HKDF(base::StringPiece secret, - base::StringPiece salt, - base::StringPiece info, - size_t key_bytes_to_generate, - size_t iv_bytes_to_generate, - size_t subkey_secret_bytes_to_generate); - - // An alternative constructor that allows the client and server key/IV - // lengths to be different. - HKDF(base::StringPiece secret, - base::StringPiece salt, - base::StringPiece info, - size_t client_key_bytes_to_generate, - size_t server_key_bytes_to_generate, - size_t client_iv_bytes_to_generate, - size_t server_iv_bytes_to_generate, - size_t subkey_secret_bytes_to_generate); - ~HKDF(); - - base::StringPiece client_write_key() const { - return client_write_key_; - } - base::StringPiece client_write_iv() const { - return client_write_iv_; - } - base::StringPiece server_write_key() const { - return server_write_key_; - } - base::StringPiece server_write_iv() const { - return server_write_iv_; - } - base::StringPiece subkey_secret() const { - return subkey_secret_; - } - - private: - std::vector<uint8_t> output_; - - base::StringPiece client_write_key_; - base::StringPiece server_write_key_; - base::StringPiece client_write_iv_; - base::StringPiece server_write_iv_; - base::StringPiece subkey_secret_; -}; +CRYPTO_EXPORT +std::string HkdfSha256(base::StringPiece secret, + base::StringPiece salt, + base::StringPiece info, + size_t derived_key_size); } // namespace crypto
diff --git a/crypto/hkdf_unittest.cc b/crypto/hkdf_unittest.cc deleted file mode 100644 index 0412703..0000000 --- a/crypto/hkdf_unittest.cc +++ /dev/null
@@ -1,98 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "crypto/hkdf.h" - -#include <stddef.h> -#include <stdint.h> - -#include <string> - -#include "base/macros.h" -#include "base/strings/string_number_conversions.h" -#include "testing/gtest/include/gtest/gtest.h" - -using crypto::HKDF; - -namespace test { -namespace { - -struct HKDFTest { - const char* key_hex; - const char* salt_hex; - const char* info_hex; - const char* output_hex; -}; - -// These test cases are taken from -// https://tools.ietf.org/html/rfc5869#appendix-A. -static const HKDFTest kHKDFTests[] = {{ - "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", - "000102030405060708090a0b0c", - "f0f1f2f3f4f5f6f7f8f9", - "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5" - "b887185865", - }, { - "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324" - "25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243444546474849" - "4a4b4c4d4e4f", - "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828384" - "85868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9" - "aaabacadaeaf", - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4" - "d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9" - "fafbfcfdfeff", - "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99ca" - "c7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c" - "01d5c1f3434f1d87", - }, { - "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", - "", - "", - "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395fa" - "a4b61a96c8", - }, -}; - -TEST(HKDFTest, HKDF) { - for (size_t i = 0; i < arraysize(kHKDFTests); i++) { - const HKDFTest& test(kHKDFTests[i]); - SCOPED_TRACE(i); - - std::vector<uint8_t> data; - ASSERT_TRUE(base::HexStringToBytes(test.key_hex, &data)); - const std::string key(reinterpret_cast<char*>(&data[0]), data.size()); - - data.clear(); - // |salt_hex| is optional and may be empty. - std::string salt(test.salt_hex); - if (!salt.empty()) { - ASSERT_TRUE(base::HexStringToBytes(salt, &data)); - salt.assign(reinterpret_cast<char*>(&data[0]), data.size()); - } - - data.clear(); - // |info_hex| is optional and may be empty. - std::string info(test.info_hex); - if (!info.empty()) { - ASSERT_TRUE(base::HexStringToBytes(info, &data)); - info.assign(reinterpret_cast<char*>(&data[0]), data.size()); - } - - data.clear(); - ASSERT_TRUE(base::HexStringToBytes(test.output_hex, &data)); - const std::string expected(reinterpret_cast<char*>(&data[0]), data.size()); - - // We set the key_length to the length of the expected output and then take - // the result from the first key, which is the client write key. - HKDF hkdf(key, salt, info, expected.size(), 0, 0); - - ASSERT_EQ(expected.size(), hkdf.client_write_key().size()); - EXPECT_EQ(0, memcmp(expected.data(), hkdf.client_write_key().data(), - expected.size())); - } -} - -} // namespace -} // namespace test
diff --git a/device/BUILD.gn b/device/BUILD.gn index 1ddb4c35..9265476 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -79,6 +79,7 @@ "fido/fido_request_handler_unittest.cc", "fido/get_assertion_handler_unittest.cc", "fido/get_assertion_task_unittest.cc", + "fido/mac/browsing_data_deletion_unittest.mm", "fido/mac/credential_metadata_unittest.cc", "fido/mac/get_assertion_operation_unittest_mac.mm", "fido/mac/make_credential_operation_unittest_mac.mm",
diff --git a/device/fido/BUILD.gn b/device/fido/BUILD.gn index e12421d..a19d270a 100644 --- a/device/fido/BUILD.gn +++ b/device/fido/BUILD.gn
@@ -157,6 +157,8 @@ sources += [ "mac/authenticator.h", "mac/authenticator.mm", + "mac/browsing_data_deletion.h", + "mac/browsing_data_deletion.mm", "mac/credential_metadata.cc", "mac/credential_metadata.h", "mac/get_assertion_operation.h",
diff --git a/device/fido/fido_cable_handshake_handler.cc b/device/fido/fido_cable_handshake_handler.cc index 948871a8c..a47c5d0 100644 --- a/device/fido/fido_cable_handshake_handler.cc +++ b/device/fido/fido_cable_handshake_handler.cc
@@ -37,8 +37,7 @@ std::string GenerateKey(base::StringPiece secret, base::StringPiece salt, base::StringPiece info) { - crypto::HKDF key_generator(secret, salt, info, 32, 0, 0); - return std::string(key_generator.client_write_key()); + return crypto::HkdfSha256(secret, salt, info, 32); } base::Optional<std::array<uint8_t, kClientHelloMessageSize>>
diff --git a/device/fido/fido_cable_handshake_handler_unittest.cc b/device/fido/fido_cable_handshake_handler_unittest.cc index fa933fe9..554707d 100644 --- a/device/fido/fido_cable_handshake_handler_unittest.cc +++ b/device/fido/fido_cable_handshake_handler_unittest.cc
@@ -120,14 +120,12 @@ fido_parsing_utils::Materialize(kTestNonce); fido_parsing_utils::Append(&nonce_message, client_random_nonce); fido_parsing_utils::Append(&nonce_message, kAuthenticatorSessionRandom); - crypto::HKDF key_generator( + return crypto::HkdfSha256( fido_parsing_utils::ConvertToStringPiece(kTestSessionPreKey), fido_parsing_utils::ConvertToStringPiece( fido_parsing_utils::CreateSHA256Hash( fido_parsing_utils::ConvertToStringPiece(nonce_message))), - kCableDeviceEncryptionKeyInfo, 32, 0, 0); - return std::string(key_generator.client_write_key().begin(), - key_generator.client_write_key().end()); + kCableDeviceEncryptionKeyInfo, 32); } // Given a hello message and handshake key from the authenticator, construct @@ -177,12 +175,10 @@ class FakeCableAuthenticator { public: FakeCableAuthenticator() { - crypto::HKDF key_generator( + handshake_key_ = crypto::HkdfSha256( fido_parsing_utils::ConvertToStringPiece(kTestSessionPreKey), fido_parsing_utils::ConvertToStringPiece(kTestNonce), - kCableHandshakeKeyInfo, 32, 0, 0); - handshake_key_ = std::string(key_generator.client_write_key().begin(), - key_generator.client_write_key().end()); + kCableHandshakeKeyInfo, 32); } // Receives handshake message from the client, check its validity and if the
diff --git a/device/fido/mac/authenticator.h b/device/fido/mac/authenticator.h index 8116dd9..b042869e 100644 --- a/device/fido/mac/authenticator.h +++ b/device/fido/mac/authenticator.h
@@ -5,6 +5,7 @@ #ifndef DEVICE_FIDO_MAC_AUTHENTICATOR_H_ #define DEVICE_FIDO_MAC_AUTHENTICATOR_H_ +#include "base/component_export.h" #include "base/mac/availability.h" #include "base/macros.h" #include "base/strings/string_piece_forward.h" @@ -27,6 +28,9 @@ static std::unique_ptr<TouchIdAuthenticator> CreateIfAvailable( std::string keychain_access_group, std::string metadata_secret); + static std::unique_ptr<TouchIdAuthenticator> CreateForTesting( + std::string keychain_access_group, + std::string metadata_secret); ~TouchIdAuthenticator() override;
diff --git a/device/fido/mac/authenticator.mm b/device/fido/mac/authenticator.mm index c4131ded5c..acf005d 100644 --- a/device/fido/mac/authenticator.mm +++ b/device/fido/mac/authenticator.mm
@@ -47,6 +47,14 @@ : nullptr; } +// static +std::unique_ptr<TouchIdAuthenticator> TouchIdAuthenticator::CreateForTesting( + std::string keychain_access_group, + std::string metadata_secret) { + return base::WrapUnique(new TouchIdAuthenticator( + std::move(keychain_access_group), std::move(metadata_secret))); +} + TouchIdAuthenticator::~TouchIdAuthenticator() = default; void TouchIdAuthenticator::MakeCredential(
diff --git a/device/fido/mac/browsing_data_deletion.h b/device/fido/mac/browsing_data_deletion.h new file mode 100644 index 0000000..e065d531 --- /dev/null +++ b/device/fido/mac/browsing_data_deletion.h
@@ -0,0 +1,36 @@ +// 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 DEVICE_FIDO_MAC_BROWSING_DATA_DELETION_H_ +#define DEVICE_FIDO_MAC_BROWSING_DATA_DELETION_H_ + +#include <string> + +#include "base/component_export.h" +#include "base/time/time.h" + +namespace device { +namespace fido { +namespace mac { + +// DeleteWebAuthnCredentiuals deletes Touch ID authenticator credentials from +// the macOS keychain that were created within the time interval `[begin, end)` +// and with the given metadata secret (which is tied to a browser profile). +// The |keychain_access_group| parameter is an identifier tied to Chrome's code +// signing identity that identifies the set of all keychain items associated +// with the Touch ID WebAuthentication authenticator. +// +// Returns false if any attempt to delete a credential failed (but others may +// still have succeeded), and true otherwise. +bool COMPONENT_EXPORT(DEVICE_FIDO) + DeleteWebAuthnCredentials(const std::string& keychain_access_group, + const std::string& profile_metadata_secret, + base::Time begin, + base::Time end); + +} // namespace mac +} // namespace fido +} // namespace device + +#endif // DEVICE_FIDO_MAC_BROWSING_DATA_DELETION_H_
diff --git a/device/fido/mac/browsing_data_deletion.mm b/device/fido/mac/browsing_data_deletion.mm new file mode 100644 index 0000000..6508ec618 --- /dev/null +++ b/device/fido/mac/browsing_data_deletion.mm
@@ -0,0 +1,155 @@ +// 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 "device/fido/mac/browsing_data_deletion.h" + +#include <string> + +#import <Foundation/Foundation.h> +#import <Security/Security.h> + +#include "base/logging.h" +#include "base/mac/foundation_util.h" +#include "base/mac/mac_logging.h" +#include "base/mac/scoped_cftyperef.h" +#include "base/optional.h" +#include "base/strings/sys_string_conversions.h" +#include "base/time/time.h" +#include "device/fido/mac/credential_metadata.h" +#include "device/fido/mac/keychain.h" + +namespace device { +namespace fido { +namespace mac { + +namespace { + +bool DoDeleteWebAuthnCredentials(const std::string& keychain_access_group, + const std::string& profile_metadata_secret, + base::Time begin, + base::Time end) + API_AVAILABLE(macosx(10.12.2)) { + // Query the keychain for all items tagged with the given access group, which + // should in theory yield all WebAuthentication credentials (for all + // profiles). Sadly, the kSecAttrAccessGroup filter doesn't quite work, and + // so we also get results from the legacy keychain that are tagged with no + // keychain access group. + base::ScopedCFTypeRef<CFMutableDictionaryRef> query( + CFDictionaryCreateMutable(kCFAllocatorDefault, 0, nullptr, nullptr)); + CFDictionarySetValue(query, kSecClass, kSecClassKey); + CFDictionarySetValue(query, kSecAttrAccessGroup, + base::SysUTF8ToNSString(keychain_access_group)); + CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitAll); + // Return the key reference and its attributes. + CFDictionarySetValue(query, kSecReturnRef, @YES); + CFDictionarySetValue(query, kSecReturnAttributes, @YES); + + base::ScopedCFTypeRef<CFArrayRef> keychain_items; + { + OSStatus status = Keychain::GetInstance().ItemCopyMatching( + query, reinterpret_cast<CFTypeRef*>(keychain_items.InitializeInto())); + if (status == errSecItemNotFound) { + DVLOG(1) << "no credentials found"; + return true; + } + if (status != errSecSuccess) { + OSSTATUS_DLOG(ERROR, status) << "SecItemCopyMatching failed"; + return false; + } + } + + bool result = true; + // Determine which items from the result need to be deleted. + for (CFIndex i = 0; i < CFArrayGetCount(keychain_items); ++i) { + CFDictionaryRef attributes = base::mac::CFCast<CFDictionaryRef>( + CFArrayGetValueAtIndex(keychain_items, i)); + // Skip items that don't belong to the correct keychain access group + // because the kSecAttrAccessGroup filter is broken. + CFStringRef attr_access_group = + base::mac::GetValueFromDictionary<CFStringRef>(attributes, + kSecAttrAccessGroup); + if (!attr_access_group || base::SysCFStringRefToUTF8(attr_access_group) != + keychain_access_group) { + DVLOG(1) << "missing/invalid access group"; + continue; + } + // If the RP ID, stored encrypted in the item's label, cannot be decrypted + // with the given metadata secret, then the credential belongs to a + // different profile and must be ignored. + CFStringRef sec_attr_label = base::mac::GetValueFromDictionary<CFStringRef>( + attributes, kSecAttrLabel); + if (!sec_attr_label) { + DLOG(ERROR) << "missing label"; + continue; + } + base::Optional<std::string> opt_rp_id = CredentialMetadata::DecodeRpId( + profile_metadata_secret, base::SysCFStringRefToUTF8(sec_attr_label)); + if (!opt_rp_id) { + DVLOG(1) << "key doesn't belong to this profile"; + continue; + } + + // If the creation date is out of range, the credential must be ignored. + // If the creation date is missing for some obscure reason, we delete. + CFDateRef creation_date_cf = base::mac::GetValueFromDictionary<CFDateRef>( + attributes, kSecAttrCreationDate); + if (!creation_date_cf) { + DVLOG(1) << "missing creation date; deleting anyway"; + } else { + base::Time creation_date = base::Time::FromCFAbsoluteTime( + CFDateGetAbsoluteTime(creation_date_cf)); + // Browsing data deletion API uses [begin, end) intervals. + if (creation_date < begin || creation_date >= end) { + DVLOG(1) << "creation date out of range"; + continue; + } + } + + // The sane way to delete this item would be to build a query that has the + // kSecMatchItemList field set to a list of SecKeyRef objects that need + // deleting. Sadly, on macOS that appears to work only if you also set + // kSecAttrNoLegacy (which is an internal symbol); otherwise it appears to + // only search the "legacy" keychain and return errSecItemNotFound. What + // does work however, is lookup by the (unique) kSecAttrApplicationLabel + // (which stores the credential id). So we clumsily do this for each item + // instead. + CFDataRef sec_attr_app_label = base::mac::GetValueFromDictionary<CFDataRef>( + attributes, kSecAttrApplicationLabel); + if (!sec_attr_app_label) { + DLOG(ERROR) << "missing application label"; + continue; + } + base::ScopedCFTypeRef<CFMutableDictionaryRef> delete_query( + CFDictionaryCreateMutable(kCFAllocatorDefault, 0, nullptr, nullptr)); + CFDictionarySetValue(delete_query, kSecClass, kSecClassKey); + CFDictionarySetValue(delete_query, kSecAttrApplicationLabel, + sec_attr_app_label); + OSStatus status = Keychain::GetInstance().ItemDelete(delete_query); + if (status != errSecSuccess) { + OSSTATUS_DLOG(ERROR, status) << "SecItemDelete failed"; + result = false; + continue; + } + } + return result; +} + +} // namespace + +bool DeleteWebAuthnCredentials(const std::string& keychain_access_group, + const std::string& profile_metadata_secret, + base::Time begin, + base::Time end) { + // Touch ID uses macOS APIs available in 10.12.2 or newer. No need to check + // for credentials in lower OS versions. + if (__builtin_available(macos 10.12.2, *)) { + return DoDeleteWebAuthnCredentials(keychain_access_group, + profile_metadata_secret, begin, end); + } + return true; +} + +} // namespace mac +} // namespace fido +} // namespace device
diff --git a/device/fido/mac/browsing_data_deletion_unittest.mm b/device/fido/mac/browsing_data_deletion_unittest.mm new file mode 100644 index 0000000..b21384d --- /dev/null +++ b/device/fido/mac/browsing_data_deletion_unittest.mm
@@ -0,0 +1,194 @@ +// 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 "device/fido/mac/browsing_data_deletion.h" + +#include <Foundation/Foundation.h> +#include <Security/Security.h> + +#include "base/mac/foundation_util.h" +#include "base/mac/mac_logging.h" +#include "base/mac/scoped_cftyperef.h" +#include "base/strings/sys_string_conversions.h" +#include "base/test/scoped_task_environment.h" +#include "device/fido/authenticator_selection_criteria.h" +#include "device/fido/ctap_make_credential_request.h" +#include "device/fido/fido_constants.h" +#include "device/fido/mac/authenticator.h" +#include "device/fido/mac/keychain.h" +#include "device/fido/test_callback_receiver.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +extern "C" { +// This is a private Security Framework symbol. It indicates that a query must +// be run on the "syncable" macOS keychain, which is where Secure Enclave keys +// are stored. This test needs it because it tries to erase all credentials +// belonging to the (test-only) keychain access group, and the corresponding +// filter label (kSecAttrAccessGroup) appears to be ineffective *unless* +// kSecAttrNoLegacy is `@YES`. Marked as weak import because the symbol is only +// available in 10.11 or greater. +extern const CFStringRef kSecAttrNoLegacy __attribute__((weak_import)); +} + +namespace device { + +using test::TestCallbackReceiver; + +namespace fido { +namespace mac { +namespace { + +constexpr char kKeychainAccessGroup[] = + "EQHXZ8M8AV.com.google.chrome.webauthn.test"; +constexpr char kMetadataSecret[] = "supersecret"; + +constexpr std::array<uint8_t, kClientDataHashLength> kClientDataHash = {}; +constexpr char kRpId[] = "rp.example.com"; +const std::vector<uint8_t> kUserId = {10, 11, 12, 13, 14, 15}; + +// Returns a query to use with Keychain instance methods that returns all +// credentials in the non-legacy keychain that are tagged with the keychain +// access group used in this test. +base::ScopedCFTypeRef<CFMutableDictionaryRef> BaseQuery() { + base::ScopedCFTypeRef<CFMutableDictionaryRef> query( + CFDictionaryCreateMutable(kCFAllocatorDefault, 0, nullptr, nullptr)); + CFDictionarySetValue(query, kSecClass, kSecClassKey); + base::ScopedCFTypeRef<CFStringRef> access_group_ref( + base::SysUTF8ToCFStringRef(kKeychainAccessGroup)); + CFDictionarySetValue(query, kSecAttrAccessGroup, access_group_ref.release()); + CFDictionarySetValue(query, kSecAttrNoLegacy, @YES); + CFDictionarySetValue(query, kSecReturnAttributes, @YES); + CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitAll); + return query; +} + +// Returns all WebAuthn credentials stored in the keychain, regardless of which +// profile they are associated with. May return a null reference if an error +// occurred. +base::ScopedCFTypeRef<CFArrayRef> QueryAllCredentials() { + if (__builtin_available(macOS 10.12.2, *)) { + base::ScopedCFTypeRef<CFArrayRef> items; + OSStatus status = Keychain::GetInstance().ItemCopyMatching( + BaseQuery(), reinterpret_cast<CFTypeRef*>(items.InitializeInto())); + if (status == errSecItemNotFound) { + // The API returns null, but we should return an empty array instead to + // distinguish from real errors. + items = base::ScopedCFTypeRef<CFArrayRef>( + CFArrayCreate(nullptr, nullptr, 0, nullptr)); + } else if (status != errSecSuccess) { + OSSTATUS_DLOG(ERROR, status); + } + return items; + } + NOTREACHED(); + return base::ScopedCFTypeRef<CFArrayRef>(nullptr); +} + +// Returns the number of WebAuthn credentials in the keychain (for all +// profiles), or -1 if an error occurs. +ssize_t CredentialCount() { + base::ScopedCFTypeRef<CFArrayRef> items = QueryAllCredentials(); + return items ? CFArrayGetCount(items) : -1; +} + +bool ResetKeychain() { + if (__builtin_available(macOS 10.12.2, *)) { + OSStatus status = Keychain::GetInstance().ItemDelete(BaseQuery()); + if (status != errSecSuccess && status != errSecItemNotFound) { + OSSTATUS_DLOG(ERROR, status); + return false; + } + return true; + } + NOTREACHED(); + return false; +} + +class BrowsingDataDeletionTest : public testing::Test { + public: + void SetUp() override { + authenticator_ = MakeAuthenticator(kMetadataSecret); + CHECK(authenticator_); + CHECK(ResetKeychain()); + } + + void TearDown() override { ResetKeychain(); } + + protected: + CtapMakeCredentialRequest MakeRequest() { + return CtapMakeCredentialRequest( + kClientDataHash, PublicKeyCredentialRpEntity(kRpId), + PublicKeyCredentialUserEntity(kUserId), + PublicKeyCredentialParams( + {{PublicKeyCredentialParams:: + CredentialInfo() /* defaults to ES-256 */}})); + } + + std::unique_ptr<TouchIdAuthenticator> MakeAuthenticator( + std::string profile_metadata_secret) { + return TouchIdAuthenticator::CreateForTesting( + kKeychainAccessGroup, std::move(profile_metadata_secret)); + } + + bool MakeCredential() { return MakeCredential(authenticator_.get()); } + + bool MakeCredential(TouchIdAuthenticator* authenticator) { + TestCallbackReceiver<CtapDeviceResponseCode, + base::Optional<AuthenticatorMakeCredentialResponse>> + callback_receiver; + authenticator->MakeCredential(AuthenticatorSelectionCriteria(), + MakeRequest(), callback_receiver.callback()); + callback_receiver.WaitForCallback(); + auto result = callback_receiver.TakeResult(); + return std::get<0>(result) == CtapDeviceResponseCode::kSuccess; + } + + bool DeleteCredentials() { return DeleteCredentials(kMetadataSecret); } + + bool DeleteCredentials(const std::string& metadata_secret) { + return DeleteWebAuthnCredentials(kKeychainAccessGroup, metadata_secret, + base::Time(), base::Time::Max()); + } + + base::test::ScopedTaskEnvironment scoped_task_environment; + std::unique_ptr<TouchIdAuthenticator> authenticator_; +}; + +// All tests are disabled because they need to be codesigned with the +// keychain-access-group entitlement, executed on a Macbook Pro with Touch ID +// running macOS 10.12.2 or later, and require user input (Touch ID). + +TEST_F(BrowsingDataDeletionTest, DISABLED_Basic) { + ASSERT_EQ(0, CredentialCount()); + ASSERT_TRUE(MakeCredential()); + ASSERT_EQ(1, CredentialCount()); + + EXPECT_TRUE(DeleteCredentials()); + EXPECT_EQ(0, CredentialCount()); +} + +TEST_F(BrowsingDataDeletionTest, DISABLED_DifferentProfiles) { + // Create credentials in two different profiles. + EXPECT_EQ(0, CredentialCount()); + ASSERT_TRUE(MakeCredential()); + std::string other_metadata_secret = "reallynotsosecret"; + auto other_authenticator = MakeAuthenticator(other_metadata_secret); + ASSERT_TRUE(MakeCredential(other_authenticator.get())); + ASSERT_EQ(2, CredentialCount()); + + // Delete credential from the first profile. + EXPECT_TRUE(DeleteCredentials()); + EXPECT_EQ(1, CredentialCount()); + // Only providing the correct secret removes the second credential. + EXPECT_TRUE(DeleteCredentials()); + EXPECT_EQ(1, CredentialCount()); + EXPECT_TRUE(DeleteCredentials(other_metadata_secret)); + EXPECT_EQ(0, CredentialCount()); +} + +} // namespace +} // namespace mac +} // namespace fido +} // namespace device
diff --git a/device/fido/mac/keychain.h b/device/fido/mac/keychain.h index 0b62779..8772cea 100644 --- a/device/fido/mac/keychain.h +++ b/device/fido/mac/keychain.h
@@ -8,6 +8,7 @@ #import <Foundation/Foundation.h> #import <Security/Security.h> +#include "base/component_export.h" #include "base/mac/scoped_cftyperef.h" #include "base/macros.h" #include "base/no_destructor.h" @@ -24,7 +25,7 @@ // keychain-access-group entitlements, and therefore requires code signing with // a real Apple developer ID. We therefore group these function here, so they // can be mocked out in testing. -class API_AVAILABLE(macosx(10.12.2)) Keychain { +class COMPONENT_EXPORT(DEVICE_FIDO) API_AVAILABLE(macosx(10.12.2)) Keychain { public: static const Keychain& GetInstance();
diff --git a/docs/useful_urls.md b/docs/useful_urls.md index f8b9ca4..4d82629 100644 --- a/docs/useful_urls.md +++ b/docs/useful_urls.md
@@ -5,38 +5,24 @@ ## Build Status -* [Main buildbot waterfall](https://build.chromium.org/p/chromium/console) -* [Last Known Good Revision](http://chromium-status.appspot.com/lkgr) : Try bots pull this revision from trunk -* [List of the last 100 potential LKGRs](http://chromium-status.appspot.com/revisions) -* [Status dashboard for LKGR](https://build.chromium.org/p/chromium/lkgr-status/) -* https://build.chromium.org/p/tryserver.chromium/waterfall?committer=developer@chromium.org : Try bot runs, by developer -* [Tree uptime stats](https://chromium-status.appspot.com/status_viewer) -* [Commit queue status](https://chromium-cq-status.appspot.com) -* [Pending commit queue jobs](https://codereview.chromium.org/search?closed=3&commit=2&limit=50) +* https://ci.chromium.org/p/chromium/g/main/console: Main build console +* https://chromium-status.appspot.com/status_viewer: Tree uptime stats ## For Sheriffs -* https://sheriff-o-matic.appspot.com/ : Sheriff-o-Matic -* https://build.chromium.org/p/chromium.chromiumos/waterfall?show_events=true&reload=120&failures_only=true : List of failing bots for a waterfall(chromium.chromiumos as an example) -* https://build.chromium.org/p/chromium.linux/waterfall?show_events=true&reload=120&builder=Linux%20Builder%20x64&builder=Linux%20Builder%20(dbg) : Monitor one or multiple bots(Linux Builder x64 and Linux Builder (dbg) on chromium.linux as an example) -* https://build.chromium.org/p/chromium.win/waterfall/help : Customize the waterfall view for a waterfall(using chromium.win as an example) -* [Lists historical test results for the bots](https://test-results.appspot.com/dashboards/flakiness_dashboard.html) +* https://sheriff-o-matic.appspot.com/ ## Release Information -* [Current release versions of Chrome on all channels](https://omahaproxy.appspot.com/viewer) -* [Looks up the revision of a build/release version](https://omahaproxy.appspot.com/) +* https://omahaproxy.appspot.com/: Current release versions ## Source Information -* [Code Search](https://cs.chromium.org/) -* https://cs.chromium.org/SEARCH_TERM : Code Search for a specific SEARCH\_TERM -* [Gitiles Source Code Browser](https://chromium.googlesource.com/chromium/src/) -* https://chromium.googlesource.com/chromium/src/+log/b6cfa6a..9a2e0a8?pretty=fuller : Git changes in revision range(also works for build numbers) -* https://build.chromium.org/f/chromium/perf/dashboard/ui/changelog.html?url=/trunk/src&mode=html&range=SUCCESS_REV:FAILURE_REV : SVN changes in revision range -* https://build.chromium.org/f/chromium/perf/dashboard/ui/changelog_blink.html?url=/trunk&mode=html&range=SUCCESS_REV:FAILURE_REV : Blink changes in revision range +* https://cs.chromium.org/: Code search +* https://chromium.googlesource.com/chromium/src/: Gitiles source code browser +* https://chromium.googlesource.com/chromium/src/+log/b6cfa6a..9a2e0a8?pretty=fuller: Git changelog ## Communication -* [Chromium Developers List](https://groups.google.com/a/chromium.org/group/chromium-dev/topics) -* [Chromium Users List](https://groups.google.com/a/chromium.org/group/chromium-discuss/topics) +* [Chromium Developers List chromium-dev@](https://groups.google.com/a/chromium.org/group/chromium-dev/topics) +* [Chromium Users List chromium-discuss@](https://groups.google.com/a/chromium.org/group/chromium-discuss/topics)
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index 75b8a3af..4042760 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -480,6 +480,7 @@ "//testing/gtest", "//third_party/angle:translator", "//third_party/mesa:mesa_headers", + "//third_party/mesa:osmesa", "//ui/gfx", "//ui/gfx:test_support", "//ui/gfx/geometry", @@ -525,6 +526,7 @@ data_deps = [ # Needed for isolate script to execute. "//testing:run_perf_test", + "//third_party/mesa:osmesa", ] # This target should not require the Chrome executable to run.
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index 8ecfe12..92ca326 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -191,6 +191,8 @@ "raster_cmd_validation_implementation_autogen.h", "raster_decoder.cc", "raster_decoder.h", + "raster_decoder_context_state.cc", + "raster_decoder_context_state.h", "renderbuffer_manager.cc", "renderbuffer_manager.h", "sampler_manager.cc",
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 862f247..aa913772 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -32,7 +32,6 @@ #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/raster_cmd_format.h" #include "gpu/command_buffer/common/raster_cmd_ids.h" -#include "gpu/command_buffer/common/skia_utils.h" #include "gpu/command_buffer/common/sync_token.h" #include "gpu/command_buffer/service/buffer_manager.h" #include "gpu/command_buffer/service/command_buffer_service.h" @@ -54,6 +53,7 @@ #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/query_manager.h" #include "gpu/command_buffer/service/raster_cmd_validation.h" +#include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/command_buffer/service/service_font_manager.h" #include "gpu/command_buffer/service/service_transfer_cache.h" #include "gpu/command_buffer/service/vertex_array_manager.h" @@ -72,7 +72,6 @@ #include "ui/gl/gl_gl_api_implementation.h" #include "ui/gl/gl_surface.h" #include "ui/gl/gl_version_info.h" -#include "ui/gl/init/create_gr_gl_interface.h" // Local versions of the SET_GL_ERROR macros #define LOCAL_SET_GL_ERROR(error, function_name, msg) \ @@ -326,17 +325,19 @@ // PessimisticallyResetGrContext). // // Case 2b: Executing a command that is not whitelisted: We force GL state to -// match |state_| as necessary (see |need_context_state_reset_|) in +// match |state_| as necessary (see |need_context_state_reset|) in // DoCommandsImpl with RestoreState(nullptr). This will call // GrContext::resetContext. class RasterDecoderImpl final : public RasterDecoder, public gles2::ErrorStateClient, public ServiceFontManager::Client { public: - RasterDecoderImpl(DecoderClient* client, - CommandBufferServiceBase* command_buffer_service, - gles2::Outputter* outputter, - gles2::ContextGroup* group); + RasterDecoderImpl( + DecoderClient* client, + CommandBufferServiceBase* command_buffer_service, + gles2::Outputter* outputter, + gles2::ContextGroup* group, + scoped_refptr<RasterDecoderContextState> raster_decoder_context_state); ~RasterDecoderImpl() override; GLES2Util* GetGLES2Util() override { return &util_; } @@ -476,6 +477,9 @@ } gl::GLApi* api() const { return state_.api(); } + GrContext* gr_context() const { + return raster_decoder_context_state_->gr_context.get(); + } const FeatureInfo::FeatureFlags& features() const { return feature_info_->feature_flags(); @@ -557,8 +561,8 @@ // Calling GrContext::resetContext() is very cheap, so we do it // pessimistically. We could dirty less state if skia state setting // performance becomes an issue. - if (gr_context_) { - gr_context_->resetContext(); + if (gr_context()) { + gr_context()->resetContext(); } } @@ -752,6 +756,7 @@ // The ContextGroup for this decoder uses to track resources. scoped_refptr<gles2::ContextGroup> group_; + scoped_refptr<RasterDecoderContextState> raster_decoder_context_state_; std::unique_ptr<Validators> validators_; scoped_refptr<gles2::FeatureInfo> feature_info_; @@ -793,18 +798,10 @@ // Raster helpers. ServiceFontManager font_manager_; - sk_sp<GrContext> gr_context_; sk_sp<SkSurface> sk_surface_; std::unique_ptr<SkCanvas> raster_canvas_; uint32_t raster_color_space_id_; std::vector<SkDiscardableHandleId> locked_handles_; - size_t glyph_cache_max_texture_bytes_; - - // |need_context_state_reset_| is set whenever Skia may have altered the - // driver's GL state. It signals the need to restore driver GL state to - // |state_| before executing commands that do not - // PermitsInconsistentContextState. - bool need_context_state_reset_ = false; // Tracing helpers. int raster_chromium_id_ = 0; @@ -830,9 +827,10 @@ DecoderClient* client, CommandBufferServiceBase* command_buffer_service, Outputter* outputter, - ContextGroup* group) { - return new RasterDecoderImpl(client, command_buffer_service, outputter, - group); + ContextGroup* group, + scoped_refptr<RasterDecoderContextState> raster_decoder_context_state) { + return new RasterDecoderImpl(client, command_buffer_service, outputter, group, + std::move(raster_decoder_context_state)); } RasterDecoder::RasterDecoder(CommandBufferServiceBase* command_buffer_service, @@ -879,11 +877,13 @@ DecoderClient* client, CommandBufferServiceBase* command_buffer_service, Outputter* outputter, - ContextGroup* group) + ContextGroup* group, + scoped_refptr<RasterDecoderContextState> raster_decoder_context_state) : RasterDecoder(command_buffer_service, outputter), client_(client), logger_(&debug_marker_manager_, client), group_(group), + raster_decoder_context_state_(std::move(raster_decoder_context_state)), validators_(new Validators), feature_info_(group_->feature_info()), state_(group_->feature_info(), this, &logger_), @@ -893,7 +893,9 @@ gpu_decoder_category_(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED( TRACE_DISABLED_BY_DEFAULT("gpu_decoder"))), font_manager_(this), - weak_ptr_factory_(this) {} + weak_ptr_factory_(this) { + DCHECK(raster_decoder_context_state_); +} RasterDecoderImpl::~RasterDecoderImpl() {} @@ -1010,62 +1012,18 @@ return ContextResult::kFatalFailure; } - // Assume that we can create a GrContext. This will be set to false if - // there's a failure. - supports_oop_raster_ = true; - sk_sp<const GrGLInterface> interface( - gl::init::CreateGrGLInterface(gl_version_info())); - if (!interface) { - DLOG(ERROR) << "OOP raster support disabled: GrGLInterface creation " - "failed."; - supports_oop_raster_ = false; - } - + supports_oop_raster_ = !!raster_decoder_context_state_->gr_context; if (supports_oop_raster_) { - // If you make any changes to the GrContext::Options here that could - // affect text rendering, make sure to match the capabilities initialized - // in GetCapabilities and ensuring these are also used by the - // PaintOpBufferSerializer. - GrContextOptions options; - options.fDriverBugWorkarounds = - GrDriverBugWorkarounds(workarounds().ToIntSet()); - size_t max_resource_cache_bytes = 0u; - DetermineGrCacheLimitsFromAvailableMemory( - &max_resource_cache_bytes, &glyph_cache_max_texture_bytes_); - options.fGlyphCacheTextureMaximumBytes = glyph_cache_max_texture_bytes_; - gr_context_ = GrContext::MakeGL(std::move(interface), options); - - if (gr_context_) { - // TODO(enne): This cache is for this decoder only and each decoder has - // its own cache. This is pretty unfortunate. This really needs to be - // rethought before shipping. Most likely a different command buffer - // context for raster-in-gpu, with a shared gl context / gr context - // that different decoders can use. - constexpr int kMaxGaneshResourceCacheCount = 16384; - gr_context_->setResourceCacheLimits(kMaxGaneshResourceCacheCount, - max_resource_cache_bytes); transfer_cache_ = std::make_unique<ServiceTransferCache>(); - } else { - bool was_lost = CheckResetStatus(); - if (was_lost) { - DLOG(ERROR) - << "ContextResult::kTransientFailure: Could not create GrContext"; - Destroy(true); - return ContextResult::kTransientFailure; - } - DLOG(ERROR) << "OOP raster support disabled: GrContext creation " - "failed."; - supports_oop_raster_ = false; } } - } return ContextResult::kSuccess; } const ContextState* RasterDecoderImpl::GetContextState() { - if (need_context_state_reset_) { - need_context_state_reset_ = false; + if (raster_decoder_context_state_->need_context_state_reset) { + raster_decoder_context_state_->need_context_state_reset = false; // Returning nullptr to force full state restoration by the caller. We do // this because GrContext changes to GL state are untracked in our state_. return nullptr; @@ -1090,13 +1048,20 @@ copy_texture_chromium_->Destroy(); copy_texture_chromium_.reset(); } + + // Make sure we flush any pending skia work on this context. + if (sk_surface_) { + sk_surface_->flush(); + sk_surface_.reset(); + } + if (gr_context()) { + gr_context()->flush(); + } } else { if (group_ && group_->texture_manager()) { group_->texture_manager()->MarkContextLost(); } - if (gr_context_) { - gr_context_->abandonContext(); - } + state_.MarkContextLost(); } @@ -1197,10 +1162,11 @@ // junk, which is a bug (https://crbug.com/828578). caps.sync_query = feature_info_->feature_flags().chromium_sync_query; - if (gr_context_) { + if (gr_context()) { caps.context_supports_distance_field_text = - gr_context_->supportsDistanceFieldText(); - caps.glyph_cache_max_texture_bytes = glyph_cache_max_texture_bytes_; + gr_context()->supportsDistanceFieldText(); + caps.glyph_cache_max_texture_bytes = + raster_decoder_context_state_->glyph_cache_max_texture_bytes; } return caps; } @@ -1425,6 +1391,10 @@ vertex_array_manager_->MarkContextLost(); } state_.MarkContextLost(); + raster_decoder_context_state_->context_lost = true; + + if (gr_context()) + gr_context()->abandonContext(); } bool RasterDecoderImpl::CheckResetStatus() { @@ -1549,8 +1519,8 @@ } } if (!PermitsInconsistentContextState(command)) { - if (need_context_state_reset_) { - need_context_state_reset_ = false; + if (raster_decoder_context_state_->need_context_state_reset) { + raster_decoder_context_state_->need_context_state_reset = false; RestoreState(nullptr); } } @@ -1772,9 +1742,9 @@ bound_texture ? bound_texture->service_id() : 0); DCHECK(glGetError() == GL_NO_ERROR); - if (gr_context_) { - gr_context_->resetContext(kPixelStore_GrGLBackendState | - kTextureBinding_GrGLBackendState); + if (gr_context()) { + gr_context()->resetContext(kPixelStore_GrGLBackendState | + kTextureBinding_GrGLBackendState); } return true; @@ -1824,8 +1794,8 @@ api()->glBindBufferFn(GL_PIXEL_UNPACK_BUFFER, bound_buffer->service_id()); } - if (gr_context_) { - gr_context_->resetContext(kTextureBinding_GrGLBackendState); + if (gr_context()) { + gr_context()->resetContext(kTextureBinding_GrGLBackendState); } return true; } @@ -2208,7 +2178,7 @@ } ScopedTextureBinder binder(&state_, texture_manager(), texture, - texture_metadata->target(), gr_context_.get()); + texture_metadata->target(), gr_context()); texture_manager()->SetParameteri("glTexParameteri", GetErrorState(), texture, pname, param); @@ -2241,7 +2211,7 @@ { ScopedTextureBinder binder(&state_, texture_manager(), texture_ref, - texture_metadata->target(), gr_context_.get()); + texture_metadata->target(), gr_context()); if (image->BindTexImage(texture_metadata->target())) image_state = Texture::BOUND; @@ -2290,7 +2260,7 @@ if (image_state == Texture::BOUND) { ScopedTextureBinder binder(&state_, texture_manager(), texture_ref, - texture_metadata->target(), gr_context_.get()); + texture_metadata->target(), gr_context()); image->ReleaseTexImage(texture_metadata->target()); texture_manager()->SetLevelInfo(texture_ref, texture_metadata->target(), 0, @@ -2404,7 +2374,7 @@ untyped_format, &is_cleared); ScopedTextureBinder binder(&state_, texture_manager(), texture_ref, - texture_metadata.target(), gr_context_.get()); + texture_metadata.target(), gr_context()); if (!texture_manager()->ValidForTarget(texture_metadata.target(), 0, width, height, 1)) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glTexStorage2DImage", @@ -2445,7 +2415,7 @@ } ScopedTextureBinder binder(&state_, texture_manager(), texture_ref, - texture_metadata.target(), gr_context_.get()); + texture_metadata.target(), gr_context()); unsigned int internal_format = viz::TextureStorageFormat(texture_metadata.format()); @@ -2498,7 +2468,7 @@ DCHECK(!state_.bound_pixel_unpack_buffer.get()); ScopedTextureBinder binder(&state_, texture_manager(), texture_ref, - texture_metadata.target(), gr_context_.get()); + texture_metadata.target(), gr_context()); TextureManager::DoTexImageArguments args = { texture_metadata.target(), @@ -2675,7 +2645,7 @@ GLint dest_level = 0; ScopedTextureBinder binder(&state_, texture_manager(), dest_texture_ref, - dest_target, gr_context_.get()); + dest_target, gr_context()); int source_width = 0; int source_height = 0; @@ -2892,8 +2862,8 @@ DCHECK(rv) << "CopyTexImage() failed"; } if (!texture_unit) { - RestoreCurrentTextureBindings( - &state_, textarget, state_.active_texture_unit, gr_context_.get()); + RestoreCurrentTextureBindings(&state_, textarget, + state_.active_texture_unit, gr_context()); return false; } return true; @@ -2941,7 +2911,7 @@ GLboolean can_use_lcd_text, GLint color_type, GLuint color_space_transfer_cache_id) { - if (!gr_context_) { + if (!gr_context()) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glBeginRasterCHROMIUM", "chromium_raster_transport not enabled via attribs"); return; @@ -2954,7 +2924,7 @@ DCHECK(locked_handles_.empty()); DCHECK(!raster_canvas_); - need_context_state_reset_ = true; + raster_decoder_context_state_->need_context_state_reset = true; // This function should look identical to // ResourceProvider::ScopedSkSurfaceProvider. @@ -3046,10 +3016,10 @@ // If we can't match requested MSAA samples, don't use MSAA. int final_msaa_count = std::max(static_cast<int>(msaa_sample_count), 0); if (final_msaa_count > - gr_context_->maxSurfaceSampleCountForColorType(sk_color_type)) + gr_context()->maxSurfaceSampleCountForColorType(sk_color_type)) final_msaa_count = 0; sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( - gr_context_.get(), gr_texture, kTopLeft_GrSurfaceOrigin, final_msaa_count, + gr_context(), gr_texture, kTopLeft_GrSurfaceOrigin, final_msaa_count, sk_color_type, nullptr, &surface_props); if (!sk_surface_) { @@ -3105,7 +3075,7 @@ return; } DCHECK(transfer_cache_); - need_context_state_reset_ = true; + raster_decoder_context_state_->need_context_state_reset = true; if (font_shm_size > 0) { // Deserialize fonts before raster. @@ -3175,7 +3145,7 @@ return; } - need_context_state_reset_ = true; + raster_decoder_context_state_->need_context_state_reset = true; raster_canvas_.reset(); sk_surface_->prepareForExternalIO(); @@ -3212,7 +3182,7 @@ "Attempt to use OOP transfer cache on a context without OOP raster."); return; } - DCHECK(gr_context_); + DCHECK(gr_context()); DCHECK(transfer_cache_); // Validate the type we are about to create. @@ -3244,7 +3214,7 @@ handle_shm_id); if (!transfer_cache_->CreateLockedEntry( - entry_type, entry_id, handle, gr_context_.get(), + entry_type, entry_id, handle, gr_context(), base::make_span(data_memory, data_size))) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCreateTransferCacheEntryINTERNAL", "Failure to deserialize transfer cache entry.");
diff --git a/gpu/command_buffer/service/raster_decoder.h b/gpu/command_buffer/service/raster_decoder.h index b2600ff..150ac05d 100644 --- a/gpu/command_buffer/service/raster_decoder.h +++ b/gpu/command_buffer/service/raster_decoder.h
@@ -24,16 +24,19 @@ } // namespace gles2 namespace raster { +struct RasterDecoderContextState; // This class implements the AsyncAPIInterface interface, decoding // RasterInterface commands and calling GL. class GPU_GLES2_EXPORT RasterDecoder : public DecoderContext, public CommonDecoder { public: - static RasterDecoder* Create(DecoderClient* client, - CommandBufferServiceBase* command_buffer_service, - gles2::Outputter* outputter, - gles2::ContextGroup* group); + static RasterDecoder* Create( + DecoderClient* client, + CommandBufferServiceBase* command_buffer_service, + gles2::Outputter* outputter, + gles2::ContextGroup* group, + scoped_refptr<RasterDecoderContextState> raster_decoder_context_state); ~RasterDecoder() override;
diff --git a/gpu/command_buffer/service/raster_decoder_context_state.cc b/gpu/command_buffer/service/raster_decoder_context_state.cc new file mode 100644 index 0000000..2f2d1b0 --- /dev/null +++ b/gpu/command_buffer/service/raster_decoder_context_state.cc
@@ -0,0 +1,66 @@ +// 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 "gpu/command_buffer/service/raster_decoder_context_state.h" + +#include "gpu/config/gpu_driver_bug_workarounds.h" +#include "ui/gl/gl_context.h" +#include "ui/gl/gl_share_group.h" +#include "ui/gl/gl_surface.h" +#include "ui/gl/init/create_gr_gl_interface.h" + +namespace gpu { +namespace raster { + +RasterDecoderContextState::RasterDecoderContextState( + scoped_refptr<gl::GLShareGroup> share_group, + scoped_refptr<gl::GLSurface> surface, + scoped_refptr<gl::GLContext> context, + bool use_virtualized_gl_contexts) + : share_group(std::move(share_group)), + surface(std::move(surface)), + context(std::move(context)), + use_virtualized_gl_contexts(use_virtualized_gl_contexts) {} + +RasterDecoderContextState::~RasterDecoderContextState() { + if (gr_context) + gr_context->abandonContext(); +} + +void RasterDecoderContextState::InitializeGrContext( + const GpuDriverBugWorkarounds& workarounds) { + DCHECK(context->IsCurrent(surface.get())); + + sk_sp<const GrGLInterface> interface( + gl::init::CreateGrGLInterface(*context->GetVersionInfo())); + if (!interface) { + LOG(ERROR) << "OOP raster support disabled: GrGLInterface creation " + "failed."; + return; + } + + // If you make any changes to the GrContext::Options here that could + // affect text rendering, make sure to match the capabilities initialized + // in GetCapabilities and ensuring these are also used by the + // PaintOpBufferSerializer. + GrContextOptions options; + options.fDriverBugWorkarounds = + GrDriverBugWorkarounds(workarounds.ToIntSet()); + size_t max_resource_cache_bytes = 0u; + raster::DetermineGrCacheLimitsFromAvailableMemory( + &max_resource_cache_bytes, &glyph_cache_max_texture_bytes); + options.fGlyphCacheTextureMaximumBytes = glyph_cache_max_texture_bytes; + gr_context = GrContext::MakeGL(std::move(interface), options); + if (!gr_context) { + LOG(ERROR) << "OOP raster support disabled: GrContext creation " + "failed."; + } else { + constexpr int kMaxGaneshResourceCacheCount = 16384; + gr_context->setResourceCacheLimits(kMaxGaneshResourceCacheCount, + max_resource_cache_bytes); + } +} + +} // namespace raster +} // namespace gpu
diff --git a/gpu/command_buffer/service/raster_decoder_context_state.h b/gpu/command_buffer/service/raster_decoder_context_state.h new file mode 100644 index 0000000..273a13c2 --- /dev/null +++ b/gpu/command_buffer/service/raster_decoder_context_state.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 GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_CONTEXT_STATE_H_ +#define GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_CONTEXT_STATE_H_ + +#include "base/memory/ref_counted.h" +#include "gpu/command_buffer/common/skia_utils.h" +#include "gpu/gpu_gles2_export.h" +#include "third_party/skia/include/gpu/GrContext.h" + +namespace gl { +class GLContext; +class GLShareGroup; +class GLSurface; +} // namespace gl + +namespace gpu { +class GpuDriverBugWorkarounds; + +namespace raster { + +struct GPU_GLES2_EXPORT RasterDecoderContextState + : public base::RefCounted<RasterDecoderContextState> { + public: + RasterDecoderContextState(scoped_refptr<gl::GLShareGroup> share_group, + scoped_refptr<gl::GLSurface> surface, + scoped_refptr<gl::GLContext> context, + bool use_virtualized_gl_contexts); + void InitializeGrContext(const GpuDriverBugWorkarounds& workarounds); + + scoped_refptr<gl::GLShareGroup> share_group; + scoped_refptr<gl::GLSurface> surface; + scoped_refptr<gl::GLContext> context; + sk_sp<GrContext> gr_context; + bool use_virtualized_gl_contexts = false; + bool context_lost = false; + size_t glyph_cache_max_texture_bytes = 0u; + + // |need_context_state_reset| is set whenever Skia may have altered the + // driver's GL state. It signals the need to restore driver GL state to + // |state_| before executing commands that do not + // PermitsInconsistentContextState. + bool need_context_state_reset = false; + + private: + friend class base::RefCounted<RasterDecoderContextState>; + ~RasterDecoderContextState(); +}; + +} // namespace raster +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_CONTEXT_STATE_H_
diff --git a/gpu/command_buffer/service/raster_decoder_unittest.cc b/gpu/command_buffer/service/raster_decoder_unittest.cc index 02c7bb0..8352698 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest.cc
@@ -7,18 +7,24 @@ #include <limits> #include "base/command_line.h" +#include "base/memory/ptr_util.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/raster_cmd_format.h" #include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/command_buffer/service/program_manager.h" #include "gpu/command_buffer/service/query_manager.h" +#include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/command_buffer/service/raster_decoder_unittest_base.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_image_stub.h" #include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" +#include "ui/gl/init/gl_factory.h" +#include "ui/gl/test/gl_surface_test_support.h" using ::testing::_; using ::testing::Return; @@ -524,5 +530,123 @@ EXPECT_EQ(error::kDeferLaterCommands, ExecuteCmd(end_raster_cmd)); } +class RasterDecoderOOPTest : public testing::Test, DecoderClient { + public: + RasterDecoderOOPTest() : shader_translator_cache_(gpu_preferences_) {} + + void SetUp() override { + gl::GLSurfaceTestSupport::InitializeOneOff(); + gpu::GpuDriverBugWorkarounds workarounds; + + scoped_refptr<gl::GLShareGroup> share_group = new gl::GLShareGroup(); + scoped_refptr<gl::GLSurface> surface = + gl::init::CreateOffscreenGLSurface(gfx::Size()); + scoped_refptr<gl::GLContext> context = gl::init::CreateGLContext( + share_group.get(), surface.get(), gl::GLContextAttribs()); + ASSERT_TRUE(context->MakeCurrent(surface.get())); + + context_state_ = new raster::RasterDecoderContextState( + std::move(share_group), std::move(surface), std::move(context), + false /* use_virtualized_gl_contexts */); + context_state_->InitializeGrContext(workarounds); + + GpuFeatureInfo gpu_feature_info; + gpu_feature_info.status_values[GPU_FEATURE_TYPE_OOP_RASTERIZATION] = + kGpuFeatureStatusEnabled; + scoped_refptr<gles2::FeatureInfo> feature_info = + new gles2::FeatureInfo(workarounds, gpu_feature_info); + group_ = new gles2::ContextGroup( + gpu_preferences_, false, &mailbox_manager_, + nullptr /* memory_tracker */, &shader_translator_cache_, + &framebuffer_completeness_cache_, feature_info, + false /* bind_generates_resource */, &image_manager_, + nullptr /* image_factory */, nullptr /* progress_reporter */, + gpu_feature_info, &discardable_manager_); + } + void TearDown() override { + context_state_ = nullptr; + gl::init::ShutdownGL(false); + } + + // DecoderClient implementation. + void OnConsoleMessage(int32_t id, const std::string& message) override {} + void CacheShader(const std::string& key, const std::string& shader) override { + } + void OnFenceSyncRelease(uint64_t release) override {} + bool OnWaitSyncToken(const gpu::SyncToken&) override { return false; } + void OnDescheduleUntilFinished() override {} + void OnRescheduleAfterFinished() override {} + void OnSwapBuffers(uint64_t swap_id, uint32_t flags) override {} + + std::unique_ptr<RasterDecoder> CreateDecoder() { + auto decoder = base::WrapUnique( + RasterDecoder::Create(this, &command_buffer_service_, &outputter_, + group_.get(), context_state_)); + ContextCreationAttribs attribs; + attribs.enable_oop_rasterization = true; + attribs.enable_raster_interface = true; + CHECK_EQ( + decoder->Initialize(context_state_->surface, context_state_->context, + true, gles2::DisallowedFeatures(), attribs), + ContextResult::kSuccess); + return decoder; + } + + template <typename T> + error::Error ExecuteCmd(RasterDecoder* decoder, const T& cmd) { + static_assert(T::kArgFlags == cmd::kFixed, + "T::kArgFlags should equal cmd::kFixed"); + int entries_processed = 0; + return decoder->DoCommands(1, (const void*)&cmd, + ComputeNumEntries(sizeof(cmd)), + &entries_processed); + } + + protected: + gles2::TraceOutputter outputter_; + FakeCommandBufferServiceBase command_buffer_service_; + scoped_refptr<RasterDecoderContextState> context_state_; + + GpuPreferences gpu_preferences_; + gles2::MailboxManagerImpl mailbox_manager_; + gles2::ShaderTranslatorCache shader_translator_cache_; + gles2::FramebufferCompletenessCache framebuffer_completeness_cache_; + gles2::ImageManager image_manager_; + ServiceDiscardableManager discardable_manager_; + scoped_refptr<gles2::ContextGroup> group_; +}; + +TEST_F(RasterDecoderOOPTest, StateRestoreAcrossDecoders) { + // First decoder receives a skia command requiring context state reset. + auto decoder1 = CreateDecoder(); + EXPECT_FALSE(context_state_->need_context_state_reset); + decoder1->SetUpForRasterCHROMIUMForTest(); + cmds::EndRasterCHROMIUM end_raster_cmd; + end_raster_cmd.Init(); + EXPECT_FALSE(error::IsError(ExecuteCmd(decoder1.get(), end_raster_cmd))); + EXPECT_TRUE(context_state_->need_context_state_reset); + + // Another decoder receives a command which does not require consistent state, + // it should be processed without state restoration. + auto decoder2 = CreateDecoder(); + decoder2->SetUpForRasterCHROMIUMForTest(); + EXPECT_FALSE(error::IsError(ExecuteCmd(decoder2.get(), end_raster_cmd))); + EXPECT_TRUE(context_state_->need_context_state_reset); + + // Now process a command which requires consistent state. + cmds::CreateTexture create_tex_cmd; + create_tex_cmd.Init(false, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, + viz::ResourceFormat::RGBA_8888, 4); + EXPECT_FALSE(error::IsError(ExecuteCmd(decoder2.get(), create_tex_cmd))); + EXPECT_FALSE(context_state_->need_context_state_reset); + + decoder1->Destroy(true); + context_state_->context->MakeCurrent(context_state_->surface.get()); + decoder2->Destroy(true); + + // Make sure the context is preserved across decoders. + EXPECT_FALSE(context_state_->gr_context->abandoned()); +} + } // namespace raster } // namespace gpu
diff --git a/gpu/command_buffer/service/raster_decoder_unittest_base.cc b/gpu/command_buffer/service/raster_decoder_unittest_base.cc index d22651e..da69047 100644 --- a/gpu/command_buffer/service/raster_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/raster_decoder_unittest_base.cc
@@ -23,6 +23,7 @@ #include "gpu/command_buffer/service/logger.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/command_buffer/service/service_utils.h" #include "gpu/command_buffer/service/test_helper.h" #include "gpu/command_buffer/service/vertex_attrib_manager.h" @@ -264,8 +265,13 @@ SetupInitCapabilitiesExpectations(group_->feature_info()->IsES3Capable()); SetupInitStateExpectations(group_->feature_info()->IsES3Capable()); + scoped_refptr<raster::RasterDecoderContextState> context_state = + new raster::RasterDecoderContextState( + new gl::GLShareGroup(), surface_, context_, + feature_info->workarounds().use_virtualized_gl_contexts); decoder_.reset(RasterDecoder::Create(this, command_buffer_service_.get(), - &outputter_, group_.get())); + &outputter_, group_.get(), + std::move(context_state))); decoder_->SetIgnoreCachedStateForTest(ignore_cached_state_for_test_); decoder_->GetLogger()->set_log_synthesized_gl_errors(false);
diff --git a/gpu/command_buffer/service/service_utils.cc b/gpu/command_buffer/service/service_utils.cc index 431a6bd2..1a241d2 100644 --- a/gpu/command_buffer/service/service_utils.cc +++ b/gpu/command_buffer/service/service_utils.cc
@@ -37,10 +37,16 @@ gl::GLContextAttribs GenerateGLContextAttribs( const ContextCreationAttribs& attribs_helper, const ContextGroup* context_group) { - DCHECK(context_group != nullptr); + return GenerateGLContextAttribs(attribs_helper, + context_group->use_passthrough_cmd_decoder()); +} + +gl::GLContextAttribs GenerateGLContextAttribs( + const ContextCreationAttribs& attribs_helper, + bool use_passthrough_cmd_decoder) { gl::GLContextAttribs attribs; attribs.gpu_preference = attribs_helper.gpu_preference; - if (context_group->use_passthrough_cmd_decoder()) { + if (use_passthrough_cmd_decoder) { attribs.bind_generates_resource = attribs_helper.bind_generates_resource; attribs.webgl_compatibility_context = IsWebGLContextType(attribs_helper.context_type);
diff --git a/gpu/command_buffer/service/service_utils.h b/gpu/command_buffer/service/service_utils.h index 06e5d03..1d5d523 100644 --- a/gpu/command_buffer/service/service_utils.h +++ b/gpu/command_buffer/service/service_utils.h
@@ -20,6 +20,10 @@ const ContextCreationAttribs& attribs_helper, const ContextGroup* context_group); +GPU_GLES2_EXPORT gl::GLContextAttribs GenerateGLContextAttribs( + const ContextCreationAttribs& attribs_helper, + bool use_passthrough_cmd_decoder); + // Returns true if the passthrough command decoder has been requested GPU_GLES2_EXPORT bool UsePassthroughCommandDecoder( const base::CommandLine* command_line);
diff --git a/gpu/command_buffer/tests/fuzzer_main.cc b/gpu/command_buffer/tests/fuzzer_main.cc index 0125db8..ab4cc15b 100644 --- a/gpu/command_buffer/tests/fuzzer_main.cc +++ b/gpu/command_buffer/tests/fuzzer_main.cc
@@ -28,6 +28,7 @@ #include "gpu/command_buffer/service/logger.h" #include "gpu/command_buffer/service/mailbox_manager_impl.h" #include "gpu/command_buffer/service/raster_decoder.h" +#include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/command_buffer/service/service_discardable_manager.h" #include "gpu/command_buffer/service/sync_point_manager.h" #include "gpu/command_buffer/service/transfer_buffer_manager.h" @@ -354,9 +355,14 @@ #if defined(GPU_FUZZER_USE_RASTER_DECODER) CHECK(feature_info->feature_flags().chromium_raster_transport); + scoped_refptr<raster::RasterDecoderContextState> context_state = + new raster::RasterDecoderContextState( + share_group_, surface_, context_, + config_.workarounds.use_virtualized_gl_contexts); + context_state->InitializeGrContext(config_.workarounds); decoder_.reset(raster::RasterDecoder::Create( command_buffer_.get(), command_buffer_->service(), &outputter_, - context_group.get())); + context_group.get(), std::move(context_state))); #else decoder_.reset(gles2::GLES2Decoder::Create( command_buffer_.get(), command_buffer_->service(), &outputter_,
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc index bc3b627..be0d4715 100644 --- a/gpu/ipc/in_process_command_buffer.cc +++ b/gpu/ipc/in_process_command_buffer.cc
@@ -45,6 +45,7 @@ #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/command_buffer/service/query_manager.h" #include "gpu/command_buffer/service/raster_decoder.h" +#include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/command_buffer/service/service_utils.h" #include "gpu/command_buffer/service/sync_point_manager.h" #include "gpu/command_buffer/service/transfer_buffer_manager.h" @@ -64,6 +65,8 @@ #include "ui/gl/gl_image.h" #include "ui/gl/gl_image_shared_memory.h" #include "ui/gl/gl_share_group.h" +#include "ui/gl/gl_version_info.h" +#include "ui/gl/init/create_gr_gl_interface.h" #include "ui/gl/init/gl_factory.h" #if defined(OS_WIN) @@ -275,11 +278,11 @@ // |context_group_| instead. transfer_buffer_manager_ = std::make_unique<TransferBufferManager>(nullptr); + GpuDriverBugWorkarounds workarounds( + task_executor_->gpu_feature_info().enabled_gpu_driver_bug_workarounds); if (params.share_command_buffer) { context_group_ = params.share_command_buffer->context_group_; } else { - GpuDriverBugWorkarounds workarounds( - task_executor_->gpu_feature_info().enabled_gpu_driver_bug_workarounds); auto feature_info = base::MakeRefCounted<gles2::FeatureInfo>( workarounds, task_executor_->gpu_feature_info()); @@ -314,22 +317,6 @@ command_buffer_ = std::make_unique<CommandBufferService>( this, transfer_buffer_manager_.get()); - bool supports_oop_rasterization = - task_executor_->gpu_feature_info() - .status_values[GPU_FEATURE_TYPE_OOP_RASTERIZATION] == - kGpuFeatureStatusEnabled; - if (supports_oop_rasterization && params.attribs.enable_oop_rasterization && - params.attribs.enable_raster_interface && - !params.attribs.enable_gles2_interface) { - decoder_.reset(raster::RasterDecoder::Create(this, command_buffer_.get(), - task_executor_->outputter(), - context_group_.get())); - } else { - decoder_.reset(gles2::GLES2Decoder::Create(this, command_buffer_.get(), - task_executor_->outputter(), - context_group_.get())); - } - if (!surface_) { if (params.is_offscreen) { // TODO(crbug.com/832243): GLES2CommandBufferStub has additional logic for @@ -396,31 +383,64 @@ crash_keys::gpu_gl_context_is_virtual.Set(use_virtualized_gl_context_ ? "1" : "0"); - if (use_virtualized_gl_context_) { - DCHECK(gl_share_group_); - scoped_refptr<gl::GLContext> real_context = - gl_share_group_->GetSharedContext(surface_.get()); - if (!real_context.get()) { - real_context = gl::init::CreateGLContext( - gl_share_group_.get(), surface_.get(), - GenerateGLContextAttribs(params.attribs, context_group_.get())); - if (!real_context) { - // TODO(piman): This might not be fatal, we could recurse into - // CreateGLContext to get more info, tho it should be exceedingly - // rare and may not be recoverable anyway. - DestroyOnGpuThread(); - LOG(ERROR) << "ContextResult::kFatalFailure: " - "Failed to create shared context for virtualization."; - return gpu::ContextResult::kFatalFailure; - } - // Ensure that context creation did not lose track of the intended share - // group. - DCHECK(real_context->share_group() == gl_share_group_.get()); - gl_share_group_->SetSharedContext(surface_.get(), real_context.get()); - - task_executor_->gpu_feature_info().ApplyToGLContext(real_context.get()); + // TODO(khushalsagar): A lot of this initialization code is duplicated in + // GpuChannelManager. Pull it into a common util method. + scoped_refptr<gl::GLContext> real_context = + use_virtualized_gl_context_ + ? gl_share_group_->GetSharedContext(surface_.get()) + : nullptr; + if (!real_context) { + real_context = gl::init::CreateGLContext( + gl_share_group_.get(), surface_.get(), + GenerateGLContextAttribs(params.attribs, context_group_.get())); + if (!real_context) { + // TODO(piman): This might not be fatal, we could recurse into + // CreateGLContext to get more info, tho it should be exceedingly + // rare and may not be recoverable anyway. + DestroyOnGpuThread(); + LOG(ERROR) << "ContextResult::kFatalFailure: " + "Failed to create shared context for virtualization."; + return gpu::ContextResult::kFatalFailure; } + // Ensure that context creation did not lose track of the intended share + // group. + DCHECK(real_context->share_group() == gl_share_group_.get()); + task_executor_->gpu_feature_info().ApplyToGLContext(real_context.get()); + if (use_virtualized_gl_context_) + gl_share_group_->SetSharedContext(surface_.get(), real_context.get()); + } + + if (!real_context->MakeCurrent(surface_.get())) { + LOG(ERROR) + << "ContextResult::kTransientFailure, failed to make context current"; + DestroyOnGpuThread(); + return ContextResult::kTransientFailure; + } + + bool supports_oop_rasterization = + task_executor_->gpu_feature_info() + .status_values[GPU_FEATURE_TYPE_OOP_RASTERIZATION] == + kGpuFeatureStatusEnabled; + if (supports_oop_rasterization && params.attribs.enable_oop_rasterization && + params.attribs.enable_raster_interface && + !params.attribs.enable_gles2_interface) { + scoped_refptr<raster::RasterDecoderContextState> context_state = + new raster::RasterDecoderContextState(gl_share_group_, surface_, + real_context, + use_virtualized_gl_context_); + context_state->InitializeGrContext(workarounds); + + decoder_.reset(raster::RasterDecoder::Create( + this, command_buffer_.get(), task_executor_->outputter(), + context_group_.get(), std::move(context_state))); + } else { + decoder_.reset(gles2::GLES2Decoder::Create(this, command_buffer_.get(), + task_executor_->outputter(), + context_group_.get())); + } + + if (use_virtualized_gl_context_) { context_ = base::MakeRefCounted<GLContextVirtual>( gl_share_group_.get(), real_context.get(), decoder_->AsWeakPtr()); if (!context_->Initialize( @@ -434,29 +454,20 @@ "Failed to initialize virtual GL context."; return gpu::ContextResult::kFatalFailure; } - } else { - context_ = gl::init::CreateGLContext( - gl_share_group_.get(), surface_.get(), - GenerateGLContextAttribs(params.attribs, context_group_.get())); - if (!context_) { + + if (!context_->MakeCurrent(surface_.get())) { DestroyOnGpuThread(); - LOG(ERROR) << "ContextResult::kFatalFailure: Failed to create context."; - return gpu::ContextResult::kFatalFailure; + // The caller should retry making a context, but this one won't work. + LOG(ERROR) << "ContextResult::kTransientFailure: " + "Could not make context current."; + return gpu::ContextResult::kTransientFailure; } - task_executor_->gpu_feature_info().ApplyToGLContext(context_.get()); - } - if (!context_->MakeCurrent(surface_.get())) { - DestroyOnGpuThread(); - // The caller should retry making a context, but this one won't work. - LOG(ERROR) << "ContextResult::kTransientFailure: " - "Could not make context current."; - return gpu::ContextResult::kTransientFailure; - } - - if (!context_->GetGLStateRestorer()) { context_->SetGLStateRestorer( new GLStateRestorerImpl(decoder_->AsWeakPtr())); + } else { + context_ = real_context; + DCHECK(context_->IsCurrent(surface_.get())); } if (!context_group_->has_program_cache() &&
diff --git a/gpu/ipc/service/gpu_channel_manager.cc b/gpu/ipc/service/gpu_channel_manager.cc index 80f1b880..176ca27d 100644 --- a/gpu/ipc/service/gpu_channel_manager.cc +++ b/gpu/ipc/service/gpu_channel_manager.cc
@@ -32,6 +32,7 @@ #include "gpu/ipc/service/gpu_memory_buffer_factory.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_share_group.h" +#include "ui/gl/gl_version_info.h" #include "ui/gl/init/gl_factory.h" namespace gpu { @@ -291,6 +292,11 @@ if (program_cache_) program_cache_->Trim(0u); + + if (raster_decoder_context_state_) { + raster_decoder_context_state_->context_lost = true; + raster_decoder_context_state_.reset(); + } } #endif @@ -301,4 +307,112 @@ discardable_manager_.HandleMemoryPressure(memory_pressure_level); } +scoped_refptr<raster::RasterDecoderContextState> +GpuChannelManager::GetRasterDecoderContextState( + const ContextCreationAttribs& requested_attribs, + ContextResult* result) { + if (raster_decoder_context_state_ && + !raster_decoder_context_state_->context_lost) { + return raster_decoder_context_state_; + } + + ContextCreationAttribs attribs; + attribs.gpu_preference = gl::PreferIntegratedGpu; + attribs.context_type = CONTEXT_TYPE_OPENGLES2; + attribs.bind_generates_resource = false; + + if (attribs.gpu_preference != requested_attribs.gpu_preference || + attribs.context_type != requested_attribs.context_type || + attribs.bind_generates_resource != + requested_attribs.bind_generates_resource) { + LOG(ERROR) << "ContextResult::kFatalFailure: Incompatible creation attribs " + "used with RasterDecoder"; + *result = ContextResult::kFatalFailure; + } + + scoped_refptr<gl::GLSurface> surface = GetDefaultOffscreenSurface(); + if (!surface) { + LOG(ERROR) << "Failed to create offscreen surface"; + *result = ContextResult::kFatalFailure; + return nullptr; + } + + bool use_virtualized_gl_contexts = false; +#if defined(OS_MACOSX) + // Virtualize PreferIntegratedGpu contexts by default on OS X to prevent + // performance regressions when enabling FCM. + // http://crbug.com/180463 + if (attribs.gpu_preference == gl::PreferIntegratedGpu) + use_virtualized_gl_contexts = true; +#endif + use_virtualized_gl_contexts |= + gpu_driver_bug_workarounds_.use_virtualized_gl_contexts; + // MailboxManagerSync synchronization correctness currently depends on having + // only a single context. See crbug.com/510243 for details. + use_virtualized_gl_contexts |= mailbox_manager_->UsesSync(); + + const bool use_passthrough_decoder = + gles2::PassthroughCommandDecoderSupported() && + gpu_preferences_.use_passthrough_cmd_decoder; + scoped_refptr<gl::GLShareGroup> share_group; + if (use_passthrough_decoder) { + share_group = new gl::GLShareGroup(); + } else { + share_group = share_group_; + } + + scoped_refptr<gl::GLContext> context = + use_virtualized_gl_contexts ? share_group->GetSharedContext(surface.get()) + : nullptr; + if (!context) { + context = gl::init::CreateGLContext( + share_group.get(), surface.get(), + gles2::GenerateGLContextAttribs(attribs, use_passthrough_decoder)); + if (!context) { + // TODO(piman): This might not be fatal, we could recurse into + // CreateGLContext to get more info, tho it should be exceedingly + // rare and may not be recoverable anyway. + LOG(ERROR) << "ContextResult::kFatalFailure: " + "Failed to create shared context for virtualization."; + *result = ContextResult::kFatalFailure; + return nullptr; + } + // Ensure that context creation did not lose track of the intended share + // group. + DCHECK(context->share_group() == share_group.get()); + gpu_feature_info_.ApplyToGLContext(context.get()); + + if (use_virtualized_gl_contexts) + share_group->SetSharedContext(surface.get(), context.get()); + } + + // This should be either: + // (1) a non-virtual GL context, or + // (2) a mock/stub context. + DCHECK(context->GetHandle() || + gl::GetGLImplementation() == gl::kGLImplementationMockGL || + gl::GetGLImplementation() == gl::kGLImplementationStubGL); + + if (!context->MakeCurrent(surface.get())) { + LOG(ERROR) + << "ContextResult::kTransientFailure, failed to make context current"; + *result = ContextResult::kTransientFailure; + return nullptr; + } + + raster_decoder_context_state_ = new raster::RasterDecoderContextState( + std::move(share_group), std::move(surface), std::move(context), + use_virtualized_gl_contexts); + const bool enable_raster_transport = + gpu_feature_info_.status_values[GPU_FEATURE_TYPE_OOP_RASTERIZATION] == + gpu::kGpuFeatureStatusEnabled; + if (enable_raster_transport) { + raster_decoder_context_state_->InitializeGrContext( + gpu_driver_bug_workarounds_); + } + + *result = ContextResult::kSuccess; + return raster_decoder_context_state_; +} + } // namespace gpu
diff --git a/gpu/ipc/service/gpu_channel_manager.h b/gpu/ipc/service/gpu_channel_manager.h index 8b919c0..0a06ce9 100644 --- a/gpu/ipc/service/gpu_channel_manager.h +++ b/gpu/ipc/service/gpu_channel_manager.h
@@ -21,6 +21,7 @@ #include "build/build_config.h" #include "gpu/command_buffer/common/activity_flags.h" #include "gpu/command_buffer/common/constants.h" +#include "gpu/command_buffer/service/raster_decoder_context_state.h" #include "gpu/command_buffer/service/service_discardable_manager.h" #include "gpu/command_buffer/service/shader_translator_cache.h" #include "gpu/config/gpu_driver_bug_workarounds.h" @@ -135,6 +136,10 @@ void GetVideoMemoryUsageStats( VideoMemoryUsageStats* video_memory_usage_stats) const; + scoped_refptr<raster::RasterDecoderContextState> GetRasterDecoderContextState( + const ContextCreationAttribs& attribs, + ContextResult* result); + private: void InternalDestroyGpuMemoryBuffer(gfx::GpuMemoryBufferId id, int client_id); void InternalDestroyGpuMemoryBufferOnIO(gfx::GpuMemoryBufferId id, @@ -192,6 +197,19 @@ base::MemoryPressureListener memory_pressure_listener_; + // The RasterDecoderContextState is shared across all RasterDecoders. Note + // that this class needs to be ref-counted to conveniently manage the lifetime + // of the shared context in the case of a context loss. While the + // RasterDecoders strictly outlive the GpuChannelManager, in the event of a + // context loss the clients need to re-create the GpuChannel and command + // buffers once notified. In this interim state we can have multiple instances + // of the RasterDecoderContextState, for the lost and recovered clients. In + // order to avoid having the GpuChannelManager keep the lost context state + // alive until all clients have recovered, we use a ref-counted object and + // allow the decoders to manage its lifetime. + scoped_refptr<raster::RasterDecoderContextState> + raster_decoder_context_state_; + // Member variables should appear before the WeakPtrFactory, to ensure // that any WeakPtrs to Controller are invalidated before its members // variable's destructors are executed, rendering them invalid.
diff --git a/gpu/ipc/service/gpu_channel_manager_unittest.cc b/gpu/ipc/service/gpu_channel_manager_unittest.cc index 6da864c7..54ccc970 100644 --- a/gpu/ipc/service/gpu_channel_manager_unittest.cc +++ b/gpu/ipc/service/gpu_channel_manager_unittest.cc
@@ -44,6 +44,15 @@ &result, &capabilities)); EXPECT_EQ(result, gpu::ContextResult::kSuccess); + ContextCreationAttribs attribs; + attribs.gpu_preference = gl::PreferIntegratedGpu; + attribs.context_type = CONTEXT_TYPE_OPENGLES2; + attribs.bind_generates_resource = false; + auto raster_decoder_state = + channel_manager()->GetRasterDecoderContextState(attribs, &result); + EXPECT_EQ(result, ContextResult::kSuccess); + ASSERT_TRUE(raster_decoder_state); + CommandBufferStub* stub = channel->LookupCommandBuffer(kRouteId); EXPECT_TRUE(stub); @@ -55,6 +64,11 @@ } else { EXPECT_TRUE(channel); } + + // We should always clear the shared raster state on background cleanup. + ASSERT_NE( + channel_manager()->GetRasterDecoderContextState(attribs, &result).get(), + raster_decoder_state.get()); } #endif };
diff --git a/gpu/ipc/service/raster_command_buffer_stub.cc b/gpu/ipc/service/raster_command_buffer_stub.cc index c4e5b2c1..87ce063 100644 --- a/gpu/ipc/service/raster_command_buffer_stub.cc +++ b/gpu/ipc/service/raster_command_buffer_stub.cc
@@ -86,6 +86,12 @@ return ContextResult::kFatalFailure; } + if (surface_handle_ != kNullSurfaceHandle) { + LOG(ERROR) << "ContextResult::kFatalFailure: " + "RenderInterface clients must render offscreen."; + return gpu::ContextResult::kFatalFailure; + } + scoped_refptr<gles2::FeatureInfo> feature_info = new gles2::FeatureInfo( manager->gpu_driver_bug_workarounds(), manager->gpu_feature_info()); gpu::GpuMemoryBufferFactory* gmb_factory = @@ -100,87 +106,37 @@ manager->watchdog() /* progress_reporter */, manager->gpu_feature_info(), manager->discardable_manager()); -#if defined(OS_MACOSX) - // Virtualize PreferIntegratedGpu contexts by default on OS X to prevent - // performance regressions when enabling FCM. - // http://crbug.com/180463 - if (init_params.attribs.gpu_preference == gl::PreferIntegratedGpu) - use_virtualized_gl_context_ = true; -#endif - - use_virtualized_gl_context_ |= - context_group_->feature_info()->workarounds().use_virtualized_gl_contexts; - - // MailboxManagerSync synchronization correctness currently depends on having - // only a single context. See crbug.com/510243 for details. - use_virtualized_gl_context_ |= manager->mailbox_manager()->UsesSync(); - - if (surface_handle_ != kNullSurfaceHandle) { + ContextResult result; + auto raster_decoder_context_state = + manager->GetRasterDecoderContextState(init_params.attribs, &result); + if (!raster_decoder_context_state) { LOG(ERROR) << "ContextResult::kFatalFailure: " - "RenderInterface clients must render offscreen."; - return gpu::ContextResult::kFatalFailure; + "Failed to create raster decoder state."; + DCHECK_NE(result, gpu::ContextResult::kSuccess); + return result; } - surface_ = manager->GetDefaultOffscreenSurface(); - if (!surface_) { - LOG(ERROR) << "ContextResult::kFatalFailure: " - "Failed to create default offscreen surface."; - return gpu::ContextResult::kFatalFailure; - } + surface_ = raster_decoder_context_state->surface; + share_group_ = raster_decoder_context_state->share_group; + use_virtualized_gl_context_ = + raster_decoder_context_state->use_virtualized_gl_contexts; command_buffer_ = std::make_unique<CommandBufferService>( this, context_group_->transfer_buffer_manager()); std::unique_ptr<raster::RasterDecoder> decoder(raster::RasterDecoder::Create( - this, command_buffer_.get(), manager->outputter(), context_group_.get())); + this, command_buffer_.get(), manager->outputter(), context_group_.get(), + raster_decoder_context_state)); sync_point_client_state_ = channel_->sync_point_manager()->CreateSyncPointClientState( CommandBufferNamespace::GPU_IO, command_buffer_id_, sequence_id_); - if (context_group_->use_passthrough_cmd_decoder()) { - // When using the passthrough command decoder, only share with other - // contexts in the explicitly requested share group - share_group_ = new gl::GLShareGroup(); - } else { - // When using the validating command decoder, always use the global share - // group - share_group_ = channel_->share_group(); - } - // TODO(sunnyps): Should this use ScopedCrashKey instead? crash_keys::gpu_gl_context_is_virtual.Set(use_virtualized_gl_context_ ? "1" : "0"); - scoped_refptr<gl::GLContext> context; + scoped_refptr<gl::GLContext> context = raster_decoder_context_state->context; if (use_virtualized_gl_context_) { - context = share_group_->GetSharedContext(surface_.get()); - if (!context) { - context = gl::init::CreateGLContext( - share_group_.get(), surface_.get(), - GenerateGLContextAttribs(init_params.attribs, context_group_.get())); - if (!context) { - // TODO(piman): This might not be fatal, we could recurse into - // CreateGLContext to get more info, tho it should be exceedingly - // rare and may not be recoverable anyway. - LOG(ERROR) << "ContextResult::kFatalFailure: " - "Failed to create shared context for virtualization."; - return gpu::ContextResult::kFatalFailure; - } - // Ensure that context creation did not lose track of the intended share - // group. - DCHECK(context->share_group() == share_group_.get()); - share_group_->SetSharedContext(surface_.get(), context.get()); - - // This needs to be called against the real shared context, not the - // virtual context created below. - manager->gpu_feature_info().ApplyToGLContext(context.get()); - } - // This should be either: - // (1) a non-virtual GL context, or - // (2) a mock/stub context. - DCHECK(context->GetHandle() || - gl::GetGLImplementation() == gl::kGLImplementationMockGL || - gl::GetGLImplementation() == gl::kGLImplementationStubGL); context = base::MakeRefCounted<GLContextVirtual>( share_group_.get(), context.get(), decoder->AsWeakPtr()); if (!context->Initialize(surface_.get(), @@ -196,19 +152,8 @@ "Failed to initialize virtual GL context."; return gpu::ContextResult::kFatalFailure; } - } else { - context = gl::init::CreateGLContext( - share_group_.get(), surface_.get(), - GenerateGLContextAttribs(init_params.attribs, context_group_.get())); - if (!context) { - // TODO(piman): This might not be fatal, we could recurse into - // CreateGLContext to get more info, tho it should be exceedingly - // rare and may not be recoverable anyway. - LOG(ERROR) << "ContextResult::kFatalFailure: Failed to create context."; - return gpu::ContextResult::kFatalFailure; - } - manager->gpu_feature_info().ApplyToGLContext(context.get()); + context->SetGLStateRestorer(new GLStateRestorerImpl(decoder->AsWeakPtr())); } if (!context->MakeCurrent(surface_.get())) { @@ -217,19 +162,15 @@ return gpu::ContextResult::kTransientFailure; } - if (!context->GetGLStateRestorer()) { - context->SetGLStateRestorer(new GLStateRestorerImpl(decoder->AsWeakPtr())); - } - if (!context_group_->has_program_cache() && !context_group_->feature_info()->workarounds().disable_program_cache) { context_group_->set_program_cache(manager->program_cache()); } // Initialize the decoder with either the view or pbuffer GLContext. - auto result = decoder->Initialize(surface_, context, true /* offscreen */, - gpu::gles2::DisallowedFeatures(), - init_params.attribs); + result = decoder->Initialize(surface_, context, true /* offscreen */, + gpu::gles2::DisallowedFeatures(), + init_params.attribs); if (result != gpu::ContextResult::kSuccess) { DLOG(ERROR) << "Failed to initialize decoder."; return result;
diff --git a/headless/test/DEPS b/headless/test/DEPS index 77c0dd46..cb553ed 100644 --- a/headless/test/DEPS +++ b/headless/test/DEPS
@@ -4,5 +4,10 @@ "+components/viz/common/features.h", "+components/viz/common/switches.h", "+third_party/skia/include", + ], + "headless_protocol_browsertest.cc": [ + "+cc/base/switches.h", + "+components/viz/common/features.h", + "+components/viz/common/switches.h", ] }
diff --git a/headless/test/headless_protocol_browsertest.cc b/headless/test/headless_protocol_browsertest.cc index d38cce38..014f2be 100644 --- a/headless/test/headless_protocol_browsertest.cc +++ b/headless/test/headless_protocol_browsertest.cc
@@ -10,8 +10,13 @@ #include "base/files/file_util.h" #include "base/json/json_reader.h" #include "base/path_service.h" +#include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" +#include "cc/base/switches.h" +#include "components/viz/common/features.h" +#include "components/viz/common/switches.h" +#include "content/public/common/content_switches.h" #include "content/public/test/browser_test.h" #include "headless/public/devtools/domains/runtime.h" #include "headless/public/headless_browser.h" @@ -174,10 +179,45 @@ builder.SetHostResolverRules("MAP *.test 127.0.0.1"); } + void SetUpCommandLine(base::CommandLine* command_line) override { + HeadlessAsyncDevTooledBrowserTest::SetUpCommandLine(command_line); + // The following switches are recommended for BeginFrameControl required by + // compositor tests, see https://goo.gl/3zHXhB for details + static const char* const compositor_switches[] = { + // We control BeginFrames ourselves and need all compositing stages to + // run. + switches::kRunAllCompositorStagesBeforeDraw, + switches::kDisableNewContentRenderingTimeout, + + // Animtion-only BeginFrames are only supported when updates from the + // impl-thread are disabled, see go/headless-rendering. + cc::switches::kDisableThreadedAnimation, + cc::switches::kDisableCheckerImaging, + switches::kDisableThreadedScrolling, + + // Ensure that image animations don't resync their animation timestamps + // when looping back around. + switches::kDisableImageAnimationResync, + }; + + for (auto* compositor_switch : compositor_switches) { + command_line->AppendSwitch(compositor_switch); + } + + // In surface synchronization, child surface IDs are allocated by + // parents and new CompositorFrames only activate once all their child + // surfaces exist. In --run-all-compositor-stages-before-draw mode, this + // means that child surface initialization and resize fully propagates + // within a single BeginFrame. + scoped_feature_list_.InitAndEnableFeature( + features::kEnableSurfaceSynchronization); + } + protected: bool test_finished_ = false; std::string test_folder_; std::string script_name_; + base::test::ScopedFeatureList scoped_feature_list_; }; #define HEADLESS_PROTOCOL_TEST(TEST_NAME, SCRIPT_NAME) \
diff --git a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json index f016188..9dbcfea 100644 --- a/ios/build/bots/chromium.fyi/ios12-beta-simulator.json +++ b/ios/build/bots/chromium.fyi/ios12-beta-simulator.json
@@ -1,7 +1,8 @@ { "comments": [ "Run tests on iOS12beta track on 64-bit iOS 12 simulators.", - "Note: Xcode 10.3 requires Mac OS 10.13.4 so .4 is specified for 'host os'." + "Note: Xcode 10 requires a minimum of OSX 10.13.4 so .5 is specified for", + "'host os'." ], "xcode build version": "9C40b", "gn_args": [
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm index f9484f3e2..48a911d 100644 --- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -29,7 +29,7 @@ #include "ios/chrome/browser/history/top_sites_factory.h" #include "ios/chrome/browser/history/web_history_service_factory.h" #include "ios/chrome/browser/invalidation/ios_chrome_profile_invalidation_provider_factory.h" -#include "ios/chrome/browser/language/language_model_factory.h" +#include "ios/chrome/browser/language/language_model_manager_factory.h" #include "ios/chrome/browser/language/url_language_histogram_factory.h" #include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h" #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" @@ -117,7 +117,7 @@ ProfileSyncServiceFactory::GetInstance(); IOSUserEventServiceFactory::GetInstance(); GoogleLogoServiceFactory::GetInstance(); - LanguageModelFactory::GetInstance(); + LanguageModelManagerFactory::GetInstance(); ProfileOAuth2TokenServiceFactory::GetInstance(); ReadingListModelFactory::GetInstance(); SigninClientFactory::GetInstance();
diff --git a/ios/chrome/browser/language/BUILD.gn b/ios/chrome/browser/language/BUILD.gn index 6233bf9..99d5eb0 100644 --- a/ios/chrome/browser/language/BUILD.gn +++ b/ios/chrome/browser/language/BUILD.gn
@@ -5,8 +5,8 @@ source_set("language") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ - "language_model_factory.cc", - "language_model_factory.h", + "language_model_manager_factory.cc", + "language_model_manager_factory.h", "url_language_histogram_factory.cc", "url_language_histogram_factory.h", ] @@ -27,7 +27,7 @@ configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ - "language_model_factory_unittest.cc", + "language_model_manager_factory_unittest.cc", "url_language_histogram_factory_unittest.cc", ] deps = [
diff --git a/ios/chrome/browser/language/language_model_factory.cc b/ios/chrome/browser/language/language_model_manager_factory.cc similarity index 66% rename from ios/chrome/browser/language/language_model_factory.cc rename to ios/chrome/browser/language/language_model_manager_factory.cc index 4219d03d..0131742 100644 --- a/ios/chrome/browser/language/language_model_factory.cc +++ b/ios/chrome/browser/language/language_model_manager_factory.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ios/chrome/browser/language/language_model_factory.h" +#include "ios/chrome/browser/language/language_model_manager_factory.h" #include "base/feature_list.h" #include "components/keyed_service/core/keyed_service.h" @@ -10,6 +10,7 @@ #include "components/language/core/browser/baseline_language_model.h" #include "components/language/core/browser/heuristic_language_model.h" #include "components/language/core/browser/language_model.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/language/core/browser/pref_names.h" #include "components/language/core/common/language_experiments.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -19,31 +20,12 @@ #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/pref_names.h" -// static -LanguageModelFactory* LanguageModelFactory::GetInstance() { - return base::Singleton<LanguageModelFactory>::get(); -} +namespace { -// static -language::LanguageModel* LanguageModelFactory::GetForBrowserState( - ios::ChromeBrowserState* const state) { - return static_cast<language::LanguageModel*>( - GetInstance()->GetServiceForBrowserState(state, true)); -} - -LanguageModelFactory::LanguageModelFactory() - : BrowserStateKeyedServiceFactory( - "LanguageModel", - BrowserStateDependencyManager::GetInstance()) {} - -LanguageModelFactory::~LanguageModelFactory() {} - -std::unique_ptr<KeyedService> LanguageModelFactory::BuildServiceInstanceFor( - web::BrowserState* const state) const { +std::unique_ptr<language::LanguageModel> BuildDefaultLanguageModelFor( + ios::ChromeBrowserState* const chrome_state) { language::OverrideLanguageModel override_model_mode = language::GetOverrideLanguageModel(); - ios::ChromeBrowserState* const chrome_state = - ios::ChromeBrowserState::FromBrowserState(state); if (override_model_mode == language::OverrideLanguageModel::HEURISTIC) { return std::make_unique<language::HeuristicLanguageModel>( @@ -59,13 +41,47 @@ prefs::kAcceptLanguages); } -web::BrowserState* LanguageModelFactory::GetBrowserStateToUse( +} // namespace + +// static +LanguageModelManagerFactory* LanguageModelManagerFactory::GetInstance() { + return base::Singleton<LanguageModelManagerFactory>::get(); +} + +// static +language::LanguageModelManager* LanguageModelManagerFactory::GetForBrowserState( + ios::ChromeBrowserState* const state) { + return static_cast<language::LanguageModelManager*>( + GetInstance()->GetServiceForBrowserState(state, true)); +} + +LanguageModelManagerFactory::LanguageModelManagerFactory() + : BrowserStateKeyedServiceFactory( + "LanguageModelManager", + BrowserStateDependencyManager::GetInstance()) {} + +LanguageModelManagerFactory::~LanguageModelManagerFactory() {} + +std::unique_ptr<KeyedService> +LanguageModelManagerFactory::BuildServiceInstanceFor( + web::BrowserState* const state) const { + ios::ChromeBrowserState* const chrome_state = + ios::ChromeBrowserState::FromBrowserState(state); + std::unique_ptr<language::LanguageModelManager> manager = + std::make_unique<language::LanguageModelManager>( + chrome_state->GetPrefs(), + GetApplicationContext()->GetApplicationLocale()); + manager->SetDefaultModel(BuildDefaultLanguageModelFor(chrome_state)); + return manager; +} + +web::BrowserState* LanguageModelManagerFactory::GetBrowserStateToUse( web::BrowserState* const state) const { // Use the original profile's language model even in Incognito mode. return GetBrowserStateRedirectedInIncognito(state); } -void LanguageModelFactory::RegisterBrowserStatePrefs( +void LanguageModelManagerFactory::RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* const registry) { if (base::FeatureList::IsEnabled(language::kUseHeuristicLanguageModel)) { registry->RegisterDictionaryPref(
diff --git a/ios/chrome/browser/language/language_model_factory.h b/ios/chrome/browser/language/language_model_manager_factory.h similarity index 61% rename from ios/chrome/browser/language/language_model_factory.h rename to ios/chrome/browser/language/language_model_manager_factory.h index 8dde0a595..66407ee 100644 --- a/ios/chrome/browser/language/language_model_factory.h +++ b/ios/chrome/browser/language/language_model_manager_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_FACTORY_H -#define IOS_CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_FACTORY_H +#ifndef IOS_CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_MANAGER_FACTORY_H_ +#define IOS_CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_MANAGER_FACTORY_H_ #include <memory> @@ -16,7 +16,7 @@ } namespace language { -class LanguageModel; +class LanguageModelManager; } namespace user_prefs { @@ -25,17 +25,17 @@ // Manages the language model for each profile. The particular language model // provided depends on feature flags. -class LanguageModelFactory : public BrowserStateKeyedServiceFactory { +class LanguageModelManagerFactory : public BrowserStateKeyedServiceFactory { public: - static LanguageModelFactory* GetInstance(); - static language::LanguageModel* GetForBrowserState( + static LanguageModelManagerFactory* GetInstance(); + static language::LanguageModelManager* GetForBrowserState( ios::ChromeBrowserState* browser_state); private: - friend struct base::DefaultSingletonTraits<LanguageModelFactory>; + friend struct base::DefaultSingletonTraits<LanguageModelManagerFactory>; - LanguageModelFactory(); - ~LanguageModelFactory() override; + LanguageModelManagerFactory(); + ~LanguageModelManagerFactory() override; // BrowserStateKeyedServiceFactory implementation. std::unique_ptr<KeyedService> BuildServiceInstanceFor( @@ -45,7 +45,7 @@ void RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* registry) override; - DISALLOW_COPY_AND_ASSIGN(LanguageModelFactory); + DISALLOW_COPY_AND_ASSIGN(LanguageModelManagerFactory); }; -#endif // IOS_CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_FACTORY_H +#endif // IOS_CHROME_BROWSER_LANGUAGE_LANGUAGE_MODEL_MANAGER_FACTORY_H_
diff --git a/ios/chrome/browser/language/language_model_factory_unittest.cc b/ios/chrome/browser/language/language_model_manager_factory_unittest.cc similarity index 63% rename from ios/chrome/browser/language/language_model_factory_unittest.cc rename to ios/chrome/browser/language/language_model_manager_factory_unittest.cc index 05eff92..03d15b4 100644 --- a/ios/chrome/browser/language/language_model_factory_unittest.cc +++ b/ios/chrome/browser/language/language_model_manager_factory_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ios/chrome/browser/language/language_model_factory.h" +#include "ios/chrome/browser/language/language_model_manager_factory.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/web/public/test/test_web_thread_bundle.h" @@ -13,20 +13,21 @@ using testing::IsNull; using testing::Not; -using LanguageModelFactoryTest = PlatformTest; +using LanguageModelManagerFactoryTest = PlatformTest; // Check that Incognito language modeling is inherited from the user's profile. -TEST_F(LanguageModelFactoryTest, SharedWithIncognito) { +TEST_F(LanguageModelManagerFactoryTest, SharedWithIncognito) { web::TestWebThreadBundle thread_bundle; std::unique_ptr<TestChromeBrowserState> state( TestChromeBrowserState::Builder().Build()); - const language::LanguageModel* const model = - LanguageModelFactory::GetForBrowserState(state.get()); - EXPECT_THAT(model, Not(IsNull())); + const language::LanguageModelManager* const manager = + LanguageModelManagerFactory::GetForBrowserState(state.get()); + EXPECT_THAT(manager, Not(IsNull())); ios::ChromeBrowserState* const incognito = state->GetOffTheRecordChromeBrowserState(); ASSERT_THAT(incognito, Not(IsNull())); - EXPECT_THAT(LanguageModelFactory::GetForBrowserState(incognito), Eq(model)); + EXPECT_THAT(LanguageModelManagerFactory::GetForBrowserState(incognito), + Eq(manager)); }
diff --git a/ios/chrome/browser/translate/BUILD.gn b/ios/chrome/browser/translate/BUILD.gn index 631e76b..4437149 100644 --- a/ios/chrome/browser/translate/BUILD.gn +++ b/ios/chrome/browser/translate/BUILD.gn
@@ -34,6 +34,7 @@ "//components/infobars/core", "//components/keyed_service/core", "//components/keyed_service/ios", + "//components/language/core/browser", "//components/metrics", "//components/prefs", "//components/strings",
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.mm b/ios/chrome/browser/translate/chrome_ios_translate_client.mm index d6282ace..e51c708 100644 --- a/ios/chrome/browser/translate/chrome_ios_translate_client.mm +++ b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
@@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "components/infobars/core/infobar.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/prefs/pref_service.h" #include "components/sync/driver/sync_driver_switches.h" #include "components/sync/protocol/user_event_specifics.pb.h" @@ -28,7 +29,7 @@ #include "ios/chrome/browser/infobars/infobar.h" #include "ios/chrome/browser/infobars/infobar_controller.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h" -#include "ios/chrome/browser/language/language_model_factory.h" +#include "ios/chrome/browser/language/language_model_manager_factory.h" #include "ios/chrome/browser/pref_names.h" #import "ios/chrome/browser/sync/ios_user_event_service_factory.h" #import "ios/chrome/browser/translate/after_translate_infobar_controller.h" @@ -73,9 +74,10 @@ translate::TranslateRankerFactory::GetForBrowserState( ios::ChromeBrowserState::FromBrowserState( web_state->GetBrowserState())), - LanguageModelFactory::GetForBrowserState( + LanguageModelManagerFactory::GetForBrowserState( ios::ChromeBrowserState::FromBrowserState( - web_state->GetBrowserState())))), + web_state->GetBrowserState())) + ->GetDefaultModel())), translate_driver_(web_state, web_state->GetNavigationManager(), translate_manager_.get()),
diff --git a/ios/chrome/browser/ui/autofill/cells/BUILD.gn b/ios/chrome/browser/ui/autofill/cells/BUILD.gn index 5f725dc9d..98ee66ce 100644 --- a/ios/chrome/browser/ui/autofill/cells/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/cells/BUILD.gn
@@ -17,10 +17,12 @@ "//components/strings", "//ios/chrome/app/strings", "//ios/chrome/app/theme", + "//ios/chrome/browser", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/autofill:autofill_ui", "//ios/chrome/browser/ui/collection_view/cells", "//ios/chrome/browser/ui/colors", + "//ios/chrome/common/ui_util", "//ios/public/provider/chrome/browser", "//ios/public/provider/chrome/browser/ui", "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h b/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h index 571635ca..f12ba6e 100644 --- a/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h +++ b/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h
@@ -8,6 +8,7 @@ #import <UIKit/UIKit.h> #import "ios/chrome/browser/ui/autofill/autofill_ui_type.h" +#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" @@ -15,6 +16,9 @@ // a text field. @interface AutofillEditItem : CollectionViewItem +// The style to use for the cell. +@property(nonatomic, assign) CollectionViewCellStyle cellStyle; + // The name of the text field. @property(nonatomic, copy) NSString* textFieldName;
diff --git a/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm b/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm index 4b08a5f..b236d4e 100644 --- a/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm +++ b/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm
@@ -4,8 +4,12 @@ #import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h" +#import "ios/chrome/browser/experimental_flags.h" +#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" #import "ios/chrome/browser/ui/rtl_geometry.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" +#import "ios/chrome/common/ui_util/constraints_ui_util.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" @@ -24,8 +28,14 @@ const CGFloat kLabelAndFieldGap = 5; } // namespace +@interface AutofillEditCell () +// Updates the cell's fonts and colors for the given |cellStyle|. +- (void)updateForStyle:(CollectionViewCellStyle)cellStyle; +@end + @implementation AutofillEditItem +@synthesize cellStyle = _cellStyle; @synthesize textFieldName = _textFieldName; @synthesize textFieldValue = _textFieldValue; @synthesize identifyingIcon = _identifyingIcon; @@ -41,6 +51,7 @@ self = [super initWithType:type]; if (self) { self.cellClass = [AutofillEditCell class]; + _cellStyle = CollectionViewCellStyle::kMaterial; _returnKeyType = UIReturnKeyNext; _keyboardType = UIKeyboardTypeDefault; _autoCapitalizationType = UITextAutocapitalizationTypeWords; @@ -52,6 +63,10 @@ - (void)configureCell:(AutofillEditCell*)cell { [super configureCell:cell]; + + // Update fonts and colors before changing anything else. + [cell updateForStyle:self.cellStyle]; + NSString* textLabelFormat = self.required ? @"%@*" : @"%@"; cell.textLabel.text = [NSString stringWithFormat:textLabelFormat, self.textFieldName]; @@ -101,8 +116,6 @@ _textLabel = [[UILabel alloc] init]; _textLabel.translatesAutoresizingMaskIntoConstraints = NO; - _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14]; - _textLabel.textColor = [[MDCPalette greyPalette] tint900]; [_textLabel setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal]; [contentView addSubview:_textLabel]; @@ -111,8 +124,6 @@ _textField.translatesAutoresizingMaskIntoConstraints = NO; [contentView addSubview:_textField]; - _textField.font = [[MDCTypography fontLoader] lightFontOfSize:16]; - _textField.textColor = [[MDCPalette greyPalette] tint500]; _textField.autocorrectionType = UITextAutocorrectionTypeNo; _textField.clearButtonMode = UITextFieldViewModeWhileEditing; _textField.contentVerticalAlignment = @@ -140,10 +151,6 @@ [_textLabel.leadingAnchor constraintEqualToAnchor:contentView.leadingAnchor constant:kHorizontalPadding], - [_textLabel.topAnchor constraintEqualToAnchor:contentView.topAnchor - constant:kVerticalPadding], - [_textLabel.bottomAnchor constraintEqualToAnchor:contentView.bottomAnchor - constant:-kVerticalPadding], _textFieldTrailingConstraint, [_textField.firstBaselineAnchor constraintEqualToAnchor:_textLabel.firstBaselineAnchor], @@ -158,10 +165,26 @@ _iconHeightConstraint, _iconWidthConstraint, ]]; + AddOptionalVerticalPadding(contentView, _textLabel, kVerticalPadding); } return self; } +- (void)updateForStyle:(CollectionViewCellStyle)cellStyle { + if (cellStyle == CollectionViewCellStyle::kUIKit && + experimental_flags::IsSettingsUIRebootEnabled()) { + self.textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize]; + self.textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor); + self.textField.font = [UIFont systemFontOfSize:kUIKitMainFontSize]; + self.textField.textColor = [UIColor grayColor]; + } else { + self.textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14]; + self.textLabel.textColor = [[MDCPalette greyPalette] tint900]; + self.textField.font = [[MDCTypography fontLoader] lightFontOfSize:16]; + self.textField.textColor = [[MDCPalette greyPalette] tint500]; + } +} + #pragma mark - UIView - (void)layoutSubviews {
diff --git a/ios/chrome/browser/ui/collection_view/cells/BUILD.gn b/ios/chrome/browser/ui/collection_view/cells/BUILD.gn index b0c88fb..62ac67d 100644 --- a/ios/chrome/browser/ui/collection_view/cells/BUILD.gn +++ b/ios/chrome/browser/ui/collection_view/cells/BUILD.gn
@@ -10,6 +10,8 @@ "activity_indicator_cell.mm", "collection_view_account_item.h", "collection_view_account_item.mm", + "collection_view_cell_constants.h", + "collection_view_cell_style.h", "collection_view_detail_item.h", "collection_view_detail_item.mm", "collection_view_footer_item.h", @@ -27,11 +29,14 @@ deps = [ "//base", "//ios/chrome/app/strings", + "//ios/chrome/browser", + "//ios/chrome/browser/ui:ui_util", "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/list_model", "//ios/chrome/browser/ui/material_components", "//ios/chrome/browser/ui/util", "//ios/chrome/common", + "//ios/chrome/common/ui_util", "//ios/third_party/material_roboto_font_loader_ios", "//ui/base", "//url",
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h index e50a9d1..dadaf0db 100644 --- a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" @@ -15,6 +16,7 @@ // Item for account avatar, used everywhere an account cell is shown. @interface CollectionViewAccountItem : CollectionViewItem +@property(nonatomic, assign) CollectionViewCellStyle cellStyle; @property(nonatomic, strong) UIImage* image; @property(nonatomic, copy) NSString* text; @property(nonatomic, copy) NSString* detailText;
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm index 0cc0985..2a48412 100644 --- a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
@@ -5,8 +5,11 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h" #include "base/mac/foundation_util.h" +#import "ios/chrome/browser/experimental_flags.h" #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h" +#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h" #include "ui/base/l10n/l10n_util.h" @@ -32,8 +35,14 @@ const CGFloat kHorizontalErrorIconFixedSize = 25; } +@interface CollectionViewAccountCell () +// Updates the cell's fonts and colors for the given |cellStyle|. +- (void)updateForStyle:(CollectionViewCellStyle)cellStyle; +@end + @implementation CollectionViewAccountItem +@synthesize cellStyle = _cellStyle; @synthesize image = _image; @synthesize text = _text; @synthesize detailText = _detailText; @@ -47,7 +56,8 @@ if (self) { self.cellClass = [CollectionViewAccountCell class]; self.accessibilityTraits |= UIAccessibilityTraitButton; - self.enabled = YES; + _cellStyle = CollectionViewCellStyle::kMaterial; + _enabled = YES; } return self; } @@ -56,6 +66,8 @@ - (void)configureCell:(CollectionViewAccountCell*)cell { [super configureCell:cell]; + + [cell updateForStyle:self.cellStyle]; cell.imageView.image = self.image; cell.textLabel.text = self.text; cell.detailTextLabel.text = self.detailText; @@ -108,7 +120,7 @@ if (self) { self.isAccessibilityElement = YES; [self addSubviews]; - [self setDefaultViewStyling]; + [self updateForStyle:CollectionViewCellStyle::kMaterial]; [self setViewConstraints]; } return self; @@ -136,16 +148,24 @@ [contentView addSubview:_detailTextLabel]; } -// Set default imageView styling and default font and text colors for labels. -- (void)setDefaultViewStyling { +- (void)updateForStyle:(CollectionViewCellStyle)cellStyle { _imageView.contentMode = UIViewContentModeCenter; _imageView.layer.masksToBounds = YES; - - _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14]; - _textLabel.textColor = [[MDCPalette greyPalette] tint900]; - _detailTextLabel.font = [[MDCTypography fontLoader] regularFontOfSize:14]; - _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500]; _imageView.contentMode = UIViewContentModeScaleAspectFit; + + if (cellStyle == CollectionViewCellStyle::kUIKit && + experimental_flags::IsSettingsUIRebootEnabled()) { + _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize]; + _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor); + _detailTextLabel.font = + [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize]; + _detailTextLabel.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor); + } else { + _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14]; + _textLabel.textColor = [[MDCPalette greyPalette] tint900]; + _detailTextLabel.font = [[MDCTypography fontLoader] regularFontOfSize:14]; + _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500]; + } } // Set constraints on subviews.
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h b/ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h new file mode 100644 index 0000000..7c4ee4f --- /dev/null +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h
@@ -0,0 +1,42 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_CELLS_COLLECTION_VIEW_CELL_CONSTANTS_H_ +#define IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_CELLS_COLLECTION_VIEW_CELL_CONSTANTS_H_ + +#import <CoreGraphics/CoreGraphics.h> + +// The amount of padding at the top and bottom of UIKit-style cells. +const CGFloat kUIKitVerticalPadding = 16; + +// The font size and color to use for main text in UIKit-style cells. +const int kUIKitMainTextColor = 0x000000; +const CGFloat kUIKitMainFontSize = 17; + +// The font size and color to use for detail text that is on the trailing edge +// of the top line. +const int kUIKitDetailTextColor = 0x8E8E93; +const CGFloat kUIKitDetailFontSize = 17; + +// The font size and color to use for detail text that is on its own line. +const int kUIKitMultilineDetailTextColor = 0x8E8E93; +const CGFloat kUIKitMultilineDetailFontSize = 12; + +// The font size and color to use for footer text in UIKit-style cells. +const int kUIKitFooterTextColor = 0x8A8A8F; +const CGFloat kUIKitFooterFontSize = 13; +const int kUIKitFooterLinkColor = 0x1A73E8; + +// The tint color to use for switches in UIKit-style cells. +const int kUIKitSwitchTintColor = 0x1A73E8; + +// The font size and color to use for headers in UIKit-style cells. +const int kUIKitHeaderTextColor = 0x000000; +const CGFloat kUIKitHeaderTextAlpha = 0.5; +const CGFloat kUIKitHeaderFontSize = 13; + +// The color to use for separators between UIKit-style cells. +const int kUIKitSeparatorColor = 0xC8C7CC; + +#endif // IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_CELLS_COLLECTION_VIEW_CELL_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h b/ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h new file mode 100644 index 0000000..9b2e7331 --- /dev/null +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h
@@ -0,0 +1,18 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_CELLS_COLLECTION_VIEW_CELL_STYLE_H_ +#define IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_CELLS_COLLECTION_VIEW_CELL_STYLE_H_ + +// Defines the style of a collection view cell. Individual cells may choose to +// expose and respect this setting. +enum class CollectionViewCellStyle { + // A cell style that conforms to Material Design guidelines. + kMaterial = 0, + + // A cell style that conforms to stock UIKit guidelines. + kUIKit, +}; + +#endif // IOS_CHROME_BROWSER_UI_COLLECTION_VIEW_CELLS_COLLECTION_VIEW_CELL_STYLE_H_
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h index 4aec2e37f6..484c2304 100644 --- a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h
@@ -7,6 +7,7 @@ #import <UIKit/UIKit.h> +#import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_style.h" #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h" #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h" #include "url/gurl.h" @@ -37,6 +38,9 @@ // The image to show. @property(nonatomic, strong) UIImage* image; +// The style to use for the cell. +@property(nonatomic, assign) CollectionViewCellStyle cellStyle; + @end // CollectionViewFooterCell implements a UICollectionViewCell subclass
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm index a88ca03..d204665 100644 --- a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm +++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
@@ -4,7 +4,10 @@ #import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h" +#import "ios/chrome/browser/experimental_flags.h" +#include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h" +#import "ios/chrome/browser/ui/uikit_ui_util.h" #import "ios/chrome/browser/ui/util/label_link_controller.h" #import "ios/chrome/common/string_util.h" #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h" @@ -31,7 +34,11 @@ @property(nonatomic, weak) id<CollectionViewFooterLinkDelegate> linkDelegate; // Sets the URL to load when the link in |textLabel| is tapped. -- (void)setLabelLinkURL:(const GURL&)URL; +- (void)setLabelLinkURL:(const GURL&)URL + withCellStyle:(CollectionViewCellStyle)cellStyle; + +// Updates the cell's fonts and colors for the given |cellStyle|. +- (void)updateForStyle:(CollectionViewCellStyle)cellStyle; @end @@ -41,11 +48,14 @@ @synthesize linkURL = _linkURL; @synthesize linkDelegate = _linkDelegate; @synthesize image = _image; +@synthesize cellStyle = _cellStyle; - (instancetype)initWithType:(NSInteger)type { self = [super initWithType:type]; if (self) { self.cellClass = [CollectionViewFooterCell class]; + _cellStyle = CollectionViewCellStyle::kMaterial; + _linkURL = GURL(); } return self; } @@ -54,8 +64,11 @@ - (void)configureCell:(CollectionViewFooterCell*)cell { [super configureCell:cell]; + + // Update fonts and colors before setting the link label URL. + [cell updateForStyle:_cellStyle]; cell.textLabel.text = _text; - [cell setLabelLinkURL:_linkURL]; + [cell setLabelLinkURL:_linkURL withCellStyle:_cellStyle]; cell.linkDelegate = _linkDelegate; cell.imageView.image = _image; } @@ -85,19 +98,14 @@ _textLabel = [[UILabel alloc] init]; _textLabel.translatesAutoresizingMaskIntoConstraints = NO; _textLabel.backgroundColor = [UIColor clearColor]; + _textLabel.numberOfLines = 0; + _textLabel.lineBreakMode = NSLineBreakByWordWrapping; [self.contentView addSubview:_textLabel]; _imageView = [[UIImageView alloc] initWithFrame:CGRectZero]; _imageView.translatesAutoresizingMaskIntoConstraints = NO; [self.contentView addSubview:_imageView]; - _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14]; - _textLabel.textColor = [[MDCPalette greyPalette] tint900]; - _textLabel.shadowOffset = CGSizeMake(1.f, 0.f); - _textLabel.shadowColor = [UIColor whiteColor]; - _textLabel.numberOfLines = 0; - _textLabel.lineBreakMode = NSLineBreakByWordWrapping; - _horizontalPadding = kDefaultHorizontalPadding; _textLeadingAnchorConstraint = [_textLabel.leadingAnchor constraintEqualToAnchor:_imageView.trailingAnchor]; @@ -119,7 +127,8 @@ return self; } -- (void)setLabelLinkURL:(const GURL&)URL { +- (void)setLabelLinkURL:(const GURL&)URL + withCellStyle:(CollectionViewCellStyle)cellStyle { _linkController = nil; if (!URL.is_valid()) { return; @@ -135,11 +144,29 @@ action:^(const GURL& URL) { [weakSelf.linkDelegate cell:weakSelf didTapLinkURL:URL]; }]; - [_linkController setLinkColor:[[MDCPalette cr_bluePalette] tint500]]; + if (cellStyle == CollectionViewCellStyle::kUIKit && + experimental_flags::IsSettingsUIRebootEnabled()) { + [_linkController setLinkColor:UIColorFromRGB(kUIKitFooterLinkColor)]; + } else { + [_linkController setLinkColor:[[MDCPalette cr_bluePalette] tint500]]; + } [_linkController addLinkWithRange:range url:URL]; } } +- (void)updateForStyle:(CollectionViewCellStyle)cellStyle { + if (cellStyle == CollectionViewCellStyle::kUIKit && + experimental_flags::IsSettingsUIRebootEnabled()) { + self.textLabel.font = [UIFont systemFontOfSize:kUIKitFooterFontSize]; + self.textLabel.textColor = UIColorFromRGB(kUIKitFooterTextColor); + } else { + self.textLabel.shadowOffset = CGSizeMake(1.f, 0.f); + self.textLabel.shadowColor = [UIColor whiteColor]; + self.textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14]; + self.textLabel.textColor = [[MDCPalette greyPalette] tint900]; + } +} + - (void)layoutSubviews { [super layoutSubviews]; @@ -168,7 +195,8 @@ [super prepareForReuse]; self.textLabel.text = nil; self.imageView.image = nil; - [self setLabelLinkURL:GURL()]; + [self setLabelLinkURL:GURL() + withCellStyle:CollectionViewCellStyle::kMaterial]; self.horizontalPadding = kDefaultHorizontalPadding; _linkController = nil; _linkDelegate = nil;
diff --git a/ios/chrome/browser/ui/settings/cells/BUILD.gn b/ios/chrome/browser/ui/settings/cells/BUILD.gn index addfb48..426cb25 100644 --- a/ios/chrome/browser/ui/settings/cells/BUILD.gn +++ b/ios/chrome/browser/ui/settings/cells/BUILD.gn
@@ -46,6 +46,7 @@ "//components/autofill/core/browser", "//components/strings", "//ios/chrome/app/strings", + "//ios/chrome/browser", "//ios/chrome/browser/browsing_data", "//ios/chrome/browser/ui", "//ios/chrome/browser/ui/collection_view/cells", @@ -85,6 +86,7 @@ "//components/sync_preferences:sync_preferences", "//components/sync_preferences:test_support", "//ios/chrome/app/strings", + "//ios/chrome/browser", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/browsing_data", "//ios/chrome/browser/browsing_data:counters",
diff --git a/ios/chrome/common/ui_util/constraints_ui_util.h b/ios/chrome/common/ui_util/constraints_ui_util.h index b4d9313..e7a8616 100644 --- a/ios/chrome/common/ui_util/constraints_ui_util.h +++ b/ios/chrome/common/ui_util/constraints_ui_util.h
@@ -159,6 +159,21 @@ LayoutSides side_flags, ChromeDirectionalEdgeInsets insets); +// Adds an optional amount of padding to the top and bottom of a view using a +// constraint with a lowered priority. One use case is with a collectionview or +// tableview cell. When the cell is self-sizing, these constraints will kick in +// and expand the cell to add the desired padding around the inner views, but +// the padding is optional so that the inner views are not artificially +// shortened when fixed-size cells cut into that padding. The padding is added +// between |outerView| and |innerView|. +void AddOptionalVerticalPadding(UIView* outerView, + UIView* innerView, + CGFloat padding); +void AddOptionalVerticalPadding(UIView* outerView, + UIView* topInnerView, + UIView* bottomInnerView, + CGFloat padding); + #pragma mark - Safe Area. // Returns a safeAreaLayoutGuide for a given view.
diff --git a/ios/chrome/common/ui_util/constraints_ui_util.mm b/ios/chrome/common/ui_util/constraints_ui_util.mm index ae12cdf..3d81c3c 100644 --- a/ios/chrome/common/ui_util/constraints_ui_util.mm +++ b/ios/chrome/common/ui_util/constraints_ui_util.mm
@@ -149,3 +149,26 @@ [NSLayoutConstraint activateConstraints:constraints]; } + +void AddOptionalVerticalPadding(UIView* outerView, + UIView* innerView, + CGFloat padding) { + AddOptionalVerticalPadding(outerView, innerView, innerView, padding); +} + +void AddOptionalVerticalPadding(UIView* outerView, + UIView* topInnerView, + UIView* bottomInnerView, + CGFloat padding) { + NSLayoutConstraint* topPaddingConstraint = [topInnerView.topAnchor + constraintGreaterThanOrEqualToAnchor:outerView.topAnchor + constant:padding]; + topPaddingConstraint.priority = UILayoutPriorityDefaultLow; + NSLayoutConstraint* bottomPaddingConstraint = [bottomInnerView.bottomAnchor + constraintLessThanOrEqualToAnchor:outerView.bottomAnchor + constant:-padding]; + bottomPaddingConstraint.priority = UILayoutPriorityDefaultLow; + + [NSLayoutConstraint + activateConstraints:@[ topPaddingConstraint, bottomPaddingConstraint ]]; +}
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn index 8f96b72..80754cf 100644 --- a/ios/web_view/BUILD.gn +++ b/ios/web_view/BUILD.gn
@@ -121,8 +121,8 @@ "internal/cwv_web_view_configuration_internal.h", "internal/cwv_web_view_internal.h", "internal/ios_global_state_web_view_configuration.cc", - "internal/language/web_view_language_model_factory.cc", - "internal/language/web_view_language_model_factory.h", + "internal/language/web_view_language_model_manager_factory.cc", + "internal/language/web_view_language_model_manager_factory.h", "internal/language/web_view_url_language_histogram_factory.cc", "internal/language/web_view_url_language_histogram_factory.h", "internal/pref_names.cc",
diff --git a/ios/web_view/internal/language/web_view_language_model_factory.cc b/ios/web_view/internal/language/web_view_language_model_manager_factory.cc similarity index 68% rename from ios/web_view/internal/language/web_view_language_model_factory.cc rename to ios/web_view/internal/language/web_view_language_model_manager_factory.cc index 7bd2b6f..7d95c31 100644 --- a/ios/web_view/internal/language/web_view_language_model_factory.cc +++ b/ios/web_view/internal/language/web_view_language_model_manager_factory.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ios/web_view/internal/language/web_view_language_model_factory.h" +#include "ios/web_view/internal/language/web_view_language_model_manager_factory.h" #include "base/feature_list.h" #include "base/memory/singleton.h" @@ -11,6 +11,7 @@ #include "components/language/core/browser/baseline_language_model.h" #include "components/language/core/browser/heuristic_language_model.h" #include "components/language/core/browser/language_model.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/language/core/browser/pref_names.h" #include "components/language/core/common/language_experiments.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -21,30 +22,12 @@ namespace ios_web_view { -// static -WebViewLanguageModelFactory* WebViewLanguageModelFactory::GetInstance() { - return base::Singleton<WebViewLanguageModelFactory>::get(); -} +namespace { -// static -language::LanguageModel* WebViewLanguageModelFactory::GetForBrowserState( - WebViewBrowserState* const state) { - return static_cast<language::LanguageModel*>( - GetInstance()->GetServiceForBrowserState(state, true)); -} - -WebViewLanguageModelFactory::WebViewLanguageModelFactory() - : BrowserStateKeyedServiceFactory( - "LanguageModel", - BrowserStateDependencyManager::GetInstance()) {} - -std::unique_ptr<KeyedService> -WebViewLanguageModelFactory::BuildServiceInstanceFor( - web::BrowserState* const context) const { +std::unique_ptr<language::LanguageModel> BuildDefaultLanguageModelFor( + WebViewBrowserState* const web_view_browser_state) { language::OverrideLanguageModel override_model_mode = language::GetOverrideLanguageModel(); - WebViewBrowserState* const web_view_browser_state = - WebViewBrowserState::FromBrowserState(context); if (override_model_mode == language::OverrideLanguageModel::HEURISTIC) { return std::make_unique<language::HeuristicLanguageModel>( @@ -61,7 +44,42 @@ prefs::kAcceptLanguages); } -void WebViewLanguageModelFactory::RegisterBrowserStatePrefs( +} // namespace + +// static +WebViewLanguageModelManagerFactory* +WebViewLanguageModelManagerFactory::GetInstance() { + return base::Singleton<WebViewLanguageModelManagerFactory>::get(); +} + +// static +language::LanguageModelManager* +WebViewLanguageModelManagerFactory::GetForBrowserState( + WebViewBrowserState* const state) { + return static_cast<language::LanguageModelManager*>( + GetInstance()->GetServiceForBrowserState(state, true)); +} + +WebViewLanguageModelManagerFactory::WebViewLanguageModelManagerFactory() + : BrowserStateKeyedServiceFactory( + "LanguageModelManager", + BrowserStateDependencyManager::GetInstance()) {} + +std::unique_ptr<KeyedService> +WebViewLanguageModelManagerFactory::BuildServiceInstanceFor( + web::BrowserState* const context) const { + WebViewBrowserState* const web_view_browser_state = + WebViewBrowserState::FromBrowserState(context); + std::unique_ptr<language::LanguageModelManager> manager = + std::make_unique<language::LanguageModelManager>( + web_view_browser_state->GetPrefs(), + ApplicationContext::GetInstance()->GetApplicationLocale()); + manager->SetDefaultModel( + BuildDefaultLanguageModelFor(web_view_browser_state)); + return manager; +} + +void WebViewLanguageModelManagerFactory::RegisterBrowserStatePrefs( user_prefs::PrefRegistrySyncable* const registry) { if (base::FeatureList::IsEnabled(language::kUseHeuristicLanguageModel)) { registry->RegisterDictionaryPref( @@ -70,7 +88,7 @@ } } -web::BrowserState* WebViewLanguageModelFactory::GetBrowserStateToUse( +web::BrowserState* WebViewLanguageModelManagerFactory::GetBrowserStateToUse( web::BrowserState* state) const { WebViewBrowserState* browser_state = WebViewBrowserState::FromBrowserState(state);
diff --git a/ios/web_view/internal/language/web_view_language_model_factory.h b/ios/web_view/internal/language/web_view_language_model_manager_factory.h similarity index 61% rename from ios/web_view/internal/language/web_view_language_model_factory.h rename to ios/web_view/internal/language/web_view_language_model_manager_factory.h index 8d7c63e..168b657 100644 --- a/ios/web_view/internal/language/web_view_language_model_factory.h +++ b/ios/web_view/internal/language/web_view_language_model_manager_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef IOS_WEB_VIEW_INTERNAL_LANGUAGE_WEB_VIEW_LANGUAGE_MODEL_FACTORY_H_ -#define IOS_WEB_VIEW_INTERNAL_LANGUAGE_WEB_VIEW_LANGUAGE_MODEL_FACTORY_H_ +#ifndef IOS_WEB_VIEW_INTERNAL_LANGUAGE_WEB_VIEW_LANGUAGE_MODEL_MANAGER_FACTORY_H_ +#define IOS_WEB_VIEW_INTERNAL_LANGUAGE_WEB_VIEW_LANGUAGE_MODEL_MANAGER_FACTORY_H_ #include <memory> @@ -16,7 +16,7 @@ } // namespace base namespace language { -class LanguageModel; +class LanguageModelManager; } // namespace language namespace user_prefs { @@ -27,17 +27,19 @@ class WebViewBrowserState; -class WebViewLanguageModelFactory : public BrowserStateKeyedServiceFactory { +class WebViewLanguageModelManagerFactory + : public BrowserStateKeyedServiceFactory { public: - static language::LanguageModel* GetForBrowserState( + static language::LanguageModelManager* GetForBrowserState( WebViewBrowserState* browser_state); - static WebViewLanguageModelFactory* GetInstance(); + static WebViewLanguageModelManagerFactory* GetInstance(); private: - friend struct base::DefaultSingletonTraits<WebViewLanguageModelFactory>; + friend struct base::DefaultSingletonTraits< + WebViewLanguageModelManagerFactory>; - WebViewLanguageModelFactory(); - ~WebViewLanguageModelFactory() override = default; + WebViewLanguageModelManagerFactory(); + ~WebViewLanguageModelManagerFactory() override = default; // BrowserStateKeyedServiceFactory implementation. std::unique_ptr<KeyedService> BuildServiceInstanceFor( @@ -47,9 +49,9 @@ web::BrowserState* GetBrowserStateToUse( web::BrowserState* state) const override; - DISALLOW_COPY_AND_ASSIGN(WebViewLanguageModelFactory); + DISALLOW_COPY_AND_ASSIGN(WebViewLanguageModelManagerFactory); }; } // namespace ios_web_view -#endif // IOS_WEB_VIEW_INTERNAL_LANGUAGE_WEB_VIEW_LANGUAGE_MODEL_FACTORY_H_ +#endif // IOS_WEB_VIEW_INTERNAL_LANGUAGE_WEB_VIEW_LANGUAGE_MODEL_MANAGER_FACTORY_H_
diff --git a/ios/web_view/internal/translate/web_view_translate_client.mm b/ios/web_view/internal/translate/web_view_translate_client.mm index c4e131ab..37c1f3a7 100644 --- a/ios/web_view/internal/translate/web_view_translate_client.mm +++ b/ios/web_view/internal/translate/web_view_translate_client.mm
@@ -8,6 +8,7 @@ #include "base/logging.h" #include "components/infobars/core/infobar.h" +#include "components/language/core/browser/language_model_manager.h" #include "components/prefs/pref_service.h" #include "components/translate/core/browser/page_translated_details.h" #include "components/translate/core/browser/translate_accept_languages.h" @@ -18,7 +19,7 @@ #include "components/translate/core/common/language_detection_details.h" #include "ios/web/public/browser_state.h" #import "ios/web/public/web_state/web_state.h" -#include "ios/web_view/internal/language/web_view_language_model_factory.h" +#include "ios/web_view/internal/language/web_view_language_model_manager_factory.h" #import "ios/web_view/internal/language/web_view_url_language_histogram_factory.h" #include "ios/web_view/internal/pref_names.h" #import "ios/web_view/internal/translate/cwv_translation_controller_internal.h" @@ -41,7 +42,8 @@ translate_manager_(std::make_unique<translate::TranslateManager>( this, WebViewTranslateRankerFactory::GetForBrowserState(browser_state_), - WebViewLanguageModelFactory::GetForBrowserState(browser_state_))), + WebViewLanguageModelManagerFactory::GetForBrowserState(browser_state_) + ->GetDefaultModel())), translate_driver_(web_state, web_state->GetNavigationManager(), translate_manager_.get()) {
diff --git a/ios/web_view/internal/web_view_browser_state.mm b/ios/web_view/internal/web_view_browser_state.mm index a2bedff..dbd5181 100644 --- a/ios/web_view/internal/web_view_browser_state.mm +++ b/ios/web_view/internal/web_view_browser_state.mm
@@ -26,7 +26,7 @@ #include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h" #include "ios/web_view/internal/content_settings/web_view_cookie_settings_factory.h" #include "ios/web_view/internal/content_settings/web_view_host_content_settings_map_factory.h" -#include "ios/web_view/internal/language/web_view_language_model_factory.h" +#include "ios/web_view/internal/language/web_view_language_model_manager_factory.h" #include "ios/web_view/internal/language/web_view_url_language_histogram_factory.h" #include "ios/web_view/internal/pref_names.h" #include "ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h" @@ -161,7 +161,7 @@ #endif // BUILDFLAG(IOS_WEB_VIEW_ENABLE_AUTOFILL) // Instantiate all factories to setup dependency graph for pref registration. - WebViewLanguageModelFactory::GetInstance(); + WebViewLanguageModelManagerFactory::GetInstance(); WebViewTranslateRankerFactory::GetInstance(); WebViewUrlLanguageHistogramFactory::GetInstance(); WebViewTranslateAcceptLanguagesFactory::GetInstance();
diff --git a/media/base/android/media_codec_bridge_impl_unittest.cc b/media/base/android/media_codec_bridge_impl_unittest.cc index 33b8097..34bf7cb1 100644 --- a/media/base/android/media_codec_bridge_impl_unittest.cc +++ b/media/base/android/media_codec_bridge_impl_unittest.cc
@@ -444,12 +444,14 @@ const int bit_rate = 300000; const int frame_rate = 30; const int i_frame_interval = 20; - const int color_format = COLOR_FORMAT_YUV420_SEMIPLANAR; + const std::set<int> supported_color_formats = + MediaCodecUtil::GetEncoderColorFormats("video/avc"); + ASSERT_TRUE(supported_color_formats.size() != 0); std::unique_ptr<MediaCodecBridge> media_codec( MediaCodecBridgeImpl::CreateVideoEncoder( kCodecH264, gfx::Size(width, height), bit_rate, frame_rate, - i_frame_interval, color_format)); + i_frame_interval, *supported_color_formats.begin())); ASSERT_THAT(media_codec, NotNull()); const char* src_filename = "bear_320x192_40frames.yuv";
diff --git a/net/BUILD.gn b/net/BUILD.gn index bf1b809..192e34e 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1528,6 +1528,7 @@ "third_party/quic/platform/impl/quic_flag_utils_impl.h", "third_party/quic/platform/impl/quic_flags_impl.cc", "third_party/quic/platform/impl/quic_flags_impl.h", + "third_party/quic/platform/impl/quic_hkdf_impl.cc", "third_party/quic/platform/impl/quic_hkdf_impl.h", "third_party/quic/platform/impl/quic_hostname_utils_impl.cc", "third_party/quic/platform/impl/quic_hostname_utils_impl.h",
diff --git a/net/reporting/OWNERS b/net/reporting/OWNERS deleted file mode 100644 index 510eb168..0000000 --- a/net/reporting/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -juliatuttle@chromium.org
diff --git a/net/test/embedded_test_server/embedded_test_server.cc b/net/test/embedded_test_server/embedded_test_server.cc index b3473bb5..d298824 100644 --- a/net/test/embedded_test_server/embedded_test_server.cc +++ b/net/test/embedded_test_server/embedded_test_server.cc
@@ -83,7 +83,8 @@ void EmbeddedTestServer::SetConnectionListener( EmbeddedTestServerConnectionListener* listener) { - DCHECK(!io_thread_.get()); + DCHECK(!io_thread_.get()) + << "ConnectionListener must be set before starting the server."; connection_listener_ = listener; } @@ -170,7 +171,8 @@ } void EmbeddedTestServer::StartAcceptingConnections() { - DCHECK(!io_thread_.get()); + DCHECK(!io_thread_.get()) + << "Server must not be started while server is running"; base::Thread::Options thread_options; thread_options.message_loop_type = base::MessageLoop::TYPE_IO; io_thread_.reset(new base::Thread("EmbeddedTestServer IO Thread"));
diff --git a/net/third_party/quic/platform/impl/quic_hkdf_impl.cc b/net/third_party/quic/platform/impl/quic_hkdf_impl.cc new file mode 100644 index 0000000..2d6ea99a --- /dev/null +++ b/net/third_party/quic/platform/impl/quic_hkdf_impl.cc
@@ -0,0 +1,137 @@ +// 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 "net/third_party/quic/platform/impl/quic_hkdf_impl.h" + +#include <stddef.h> +#include <stdint.h> + +#include <memory> + +#include "base/logging.h" +#include "crypto/hmac.h" + +using crypto::HMAC; + +namespace quic { + +const size_t kSHA256HashLength = 32; + +QuicHKDFImpl::QuicHKDFImpl(base::StringPiece secret, + base::StringPiece salt, + base::StringPiece info, + size_t key_bytes_to_generate, + size_t iv_bytes_to_generate, + size_t subkey_secret_bytes_to_generate) + : QuicHKDFImpl(secret, + salt, + info, + key_bytes_to_generate, + key_bytes_to_generate, + iv_bytes_to_generate, + iv_bytes_to_generate, + subkey_secret_bytes_to_generate) {} + +QuicHKDFImpl::QuicHKDFImpl(base::StringPiece secret, + base::StringPiece salt, + base::StringPiece info, + size_t client_key_bytes_to_generate, + size_t server_key_bytes_to_generate, + size_t client_iv_bytes_to_generate, + size_t server_iv_bytes_to_generate, + size_t subkey_secret_bytes_to_generate) { + // https://tools.ietf.org/html/rfc5869#section-2.2 + base::StringPiece actual_salt = salt; + char zeros[kSHA256HashLength]; + if (actual_salt.empty()) { + // If salt is not given, HashLength zeros are used. + memset(zeros, 0, sizeof(zeros)); + actual_salt.set(zeros, sizeof(zeros)); + } + + // Perform the Extract step to transform the input key and + // salt into the pseudorandom key (PRK) used for Expand. + HMAC prk_hmac(HMAC::SHA256); + bool result = prk_hmac.Init(actual_salt); + DCHECK(result); + + // |prk| is a pseudorandom key (of kSHA256HashLength octets). + uint8_t prk[kSHA256HashLength]; + DCHECK_EQ(sizeof(prk), prk_hmac.DigestLength()); + result = prk_hmac.Sign(secret, prk, sizeof(prk)); + DCHECK(result); + + // https://tools.ietf.org/html/rfc5869#section-2.3 + // Perform the Expand phase to turn the pseudorandom key + // and info into the output keying material. + const size_t material_length = + client_key_bytes_to_generate + client_iv_bytes_to_generate + + server_key_bytes_to_generate + server_iv_bytes_to_generate + + subkey_secret_bytes_to_generate; + const size_t n = + (material_length + kSHA256HashLength - 1) / kSHA256HashLength; + DCHECK_LT(n, 256u); + + output_.resize(n * kSHA256HashLength); + base::StringPiece previous; + + std::unique_ptr<char[]> buf(new char[kSHA256HashLength + info.size() + 1]); + uint8_t digest[kSHA256HashLength]; + + HMAC hmac(HMAC::SHA256); + result = hmac.Init(prk, sizeof(prk)); + DCHECK(result); + + for (size_t i = 0; i < n; i++) { + memcpy(buf.get(), previous.data(), previous.size()); + size_t j = previous.size(); + memcpy(buf.get() + j, info.data(), info.size()); + j += info.size(); + buf[j++] = static_cast<char>(i + 1); + + result = hmac.Sign(base::StringPiece(buf.get(), j), digest, sizeof(digest)); + DCHECK(result); + + memcpy(&output_[i * sizeof(digest)], digest, sizeof(digest)); + previous = + base::StringPiece(reinterpret_cast<char*>(digest), sizeof(digest)); + } + + size_t j = 0; + // On Windows, when the size of output_ is zero, dereference of 0'th element + // results in a crash. C++11 solves this problem by adding a data() getter + // method to std::vector. + if (client_key_bytes_to_generate) { + client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), + client_key_bytes_to_generate); + j += client_key_bytes_to_generate; + } + + if (server_key_bytes_to_generate) { + server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), + server_key_bytes_to_generate); + j += server_key_bytes_to_generate; + } + + if (client_iv_bytes_to_generate) { + client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), + client_iv_bytes_to_generate); + j += client_iv_bytes_to_generate; + } + + if (server_iv_bytes_to_generate) { + server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), + server_iv_bytes_to_generate); + j += server_iv_bytes_to_generate; + } + + if (subkey_secret_bytes_to_generate) { + subkey_secret_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), + subkey_secret_bytes_to_generate); + } +} + +QuicHKDFImpl::~QuicHKDFImpl() = default; + +} // namespace quic
diff --git a/net/third_party/quic/platform/impl/quic_hkdf_impl.h b/net/third_party/quic/platform/impl/quic_hkdf_impl.h index 535730fe..a66ba1f 100644 --- a/net/third_party/quic/platform/impl/quic_hkdf_impl.h +++ b/net/third_party/quic/platform/impl/quic_hkdf_impl.h
@@ -5,11 +5,64 @@ #ifndef NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_HKDF_IMPL_H_ #define NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_HKDF_IMPL_H_ -#include "crypto/hkdf.h" +#include "base/strings/string_piece.h" +#include "net/base/net_export.h" namespace quic { -using QuicHKDFImpl = crypto::HKDF; +// HKDF implements the key derivation function specified in RFC 5869 (using +// SHA-256) and outputs key material, as needed by QUIC. +// See https://tools.ietf.org/html/rfc5869 for details. +class NET_EXPORT QuicHKDFImpl { + public: + // |secret|: the input shared secret (or, from RFC 5869, the IKM). + // |salt|: an (optional) public salt / non-secret random value. While + // optional, callers are strongly recommended to provide a salt. There is no + // added security value in making this larger than the SHA-256 block size of + // 64 bytes. + // |info|: an (optional) label to distinguish different uses of HKDF. It is + // optional context and application specific information (can be a zero-length + // string). + // |key_bytes_to_generate|: the number of bytes of key material to generate + // for both client and server. + // |iv_bytes_to_generate|: the number of bytes of IV to generate for both + // client and server. + // |subkey_secret_bytes_to_generate|: the number of bytes of subkey secret to + // generate, shared between client and server. + QuicHKDFImpl(base::StringPiece secret, + base::StringPiece salt, + base::StringPiece info, + size_t key_bytes_to_generate, + size_t iv_bytes_to_generate, + size_t subkey_secret_bytes_to_generate); + + // An alternative constructor that allows the client and server key/IV + // lengths to be different. + QuicHKDFImpl(base::StringPiece secret, + base::StringPiece salt, + base::StringPiece info, + size_t client_key_bytes_to_generate, + size_t server_key_bytes_to_generate, + size_t client_iv_bytes_to_generate, + size_t server_iv_bytes_to_generate, + size_t subkey_secret_bytes_to_generate); + ~QuicHKDFImpl(); + + base::StringPiece client_write_key() const { return client_write_key_; } + base::StringPiece client_write_iv() const { return client_write_iv_; } + base::StringPiece server_write_key() const { return server_write_key_; } + base::StringPiece server_write_iv() const { return server_write_iv_; } + base::StringPiece subkey_secret() const { return subkey_secret_; } + + private: + std::vector<uint8_t> output_; + + base::StringPiece client_write_key_; + base::StringPiece server_write_key_; + base::StringPiece client_write_iv_; + base::StringPiece server_write_iv_; + base::StringPiece subkey_secret_; +}; } // namespace quic
diff --git a/remoting/client/chromoting_client_runtime.cc b/remoting/client/chromoting_client_runtime.cc index 220ba30..7bd10f7 100644 --- a/remoting/client/chromoting_client_runtime.cc +++ b/remoting/client/chromoting_client_runtime.cc
@@ -11,6 +11,7 @@ #include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_current.h" #include "base/task_scheduler/task_scheduler.h" +#include "build/build_config.h" #include "remoting/base/chromium_url_request.h" #include "remoting/base/telemetry_log_writer.h" #include "remoting/base/url_request_context_getter.h" @@ -36,13 +37,10 @@ VLOG(1) << "Starting main message loop"; ui_loop_.reset(new base::MessageLoopForUI()); -#if defined(OS_ANDROID) - // On Android, the UI thread is managed by Java, so we need to attach and - // start a special type of message loop to allow Chromium code to run tasks. - ui_loop_->Start(); -#elif defined(OS_IOS) +#if defined(OS_IOS) + // TODO(ranj): Attach on BindToCurrentThread(). ui_loop_->Attach(); -#endif // OS_ANDROID, OS_IOS +#endif #if defined(DEBUG) net::URLFetcher::SetIgnoreCertificateRequests(true);
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc index 8ffa62b..75d50756 100644 --- a/services/network/network_service_unittest.cc +++ b/services/network/network_service_unittest.cc
@@ -224,8 +224,8 @@ } #endif // defined(OS_CHROMEOS) -// |gssapi_library_name| is only supported certain POSIX platforms. -#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_IOS) && \ +// |gssapi_library_name| is only supported on certain POSIX platforms. +#if BUILDFLAG(USE_KERBEROS) && defined(OS_POSIX) && !defined(OS_ANDROID) && \ !defined(OS_CHROMEOS) TEST_F(NetworkServiceTest, AuthGssapiLibraryName) { const std::string kGssapiLibraryName = "Jim";
diff --git a/services/ui/ws2/gpu_interface_provider.h b/services/ui/ws2/gpu_interface_provider.h index f099d7c..ab8e97a 100644 --- a/services/ui/ws2/gpu_interface_provider.h +++ b/services/ui/ws2/gpu_interface_provider.h
@@ -8,6 +8,10 @@ #include "base/component_export.h" #include "services/service_manager/public/cpp/binder_registry.h" +namespace service_manager { +struct BindSourceInfo; +} + namespace ui { namespace ws2 { @@ -23,6 +27,13 @@ // ui::mojom::GpuRequest. virtual void RegisterGpuInterfaces( service_manager::BinderRegistry* registry) = 0; + +#if defined(USE_OZONE) + // Registers the gpu-related interfaces needed by Ozone. + virtual void RegisterOzoneGpuInterfaces( + service_manager::BinderRegistryWithArgs< + const service_manager::BindSourceInfo&>* registry) = 0; +#endif }; } // namespace ws2
diff --git a/services/ui/ws2/window_service.cc b/services/ui/ws2/window_service.cc index 01c06675..9a13846 100644 --- a/services/ui/ws2/window_service.cc +++ b/services/ui/ws2/window_service.cc
@@ -114,15 +114,24 @@ &WindowService::BindWindowTreeFactoryRequest, base::Unretained(this))); // |gpu_interface_provider_| may be null in tests. - if (gpu_interface_provider_) + if (gpu_interface_provider_) { gpu_interface_provider_->RegisterGpuInterfaces(®istry_); + +#if defined(USE_OZONE) + gpu_interface_provider_->RegisterOzoneGpuInterfaces( + ®istry_with_source_info_); +#endif + } } void WindowService::OnBindInterface( const service_manager::BindSourceInfo& remote_info, const std::string& interface_name, mojo::ScopedMessagePipeHandle handle) { - registry_.BindInterface(interface_name, std::move(handle)); + if (!registry_with_source_info_.TryBindInterface(interface_name, &handle, + remote_info)) { + registry_.BindInterface(interface_name, std::move(handle)); + } } void WindowService::BindClipboardHostRequest(
diff --git a/services/ui/ws2/window_service.h b/services/ui/ws2/window_service.h index 9f598918..ac668eb 100644 --- a/services/ui/ws2/window_service.h +++ b/services/ui/ws2/window_service.h
@@ -123,6 +123,10 @@ service_manager::BinderRegistry registry_; + service_manager::BinderRegistryWithArgs< + const service_manager::BindSourceInfo&> + registry_with_source_info_; + std::unique_ptr<UserActivityMonitor> user_activity_monitor_; std::unique_ptr<WindowTreeFactory> window_tree_factory_;
diff --git a/skia/OWNERS b/skia/OWNERS index 3e0ec40..29bc40f9 100644 --- a/skia/OWNERS +++ b/skia/OWNERS
@@ -1,6 +1,6 @@ alokp@chromium.org borenet@google.com -bsalomon@chromium.org +bsalomon@google.com bungeman@google.com djsollen@google.com fmalita@chromium.org
diff --git a/skia/ext/SkMemory_new_handler.cpp b/skia/ext/SkMemory_new_handler.cpp index 42ce498..a6ae3c3 100644 --- a/skia/ext/SkMemory_new_handler.cpp +++ b/skia/ext/SkMemory_new_handler.cpp
@@ -5,6 +5,7 @@ #include <stddef.h> #include <stdlib.h> +#include "base/debug/alias.h" #include "base/process/memory.h" #include "build/build_config.h" #include "third_party/skia/include/core/SkTypes.h" @@ -30,6 +31,13 @@ } void sk_abort_no_print() { + // Linker's ICF feature may merge this function with other functions with + // the same definition (e.g. any function whose sole job is to call abort()) + // and it may confuse the crash report processing system. + // http://crbug.com/860850 + static int static_variable_to_make_this_function_unique = 0x736b; // "sk" + base::debug::Alias(&static_variable_to_make_this_function_unique); + abort(); }
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 86776f6..9f73ddc 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -599,61 +599,20 @@ "isolated_scripts": [ { "args": [ - "heap_profiling.mobile.disabled", + "--smoke-test-mode", + "--benchmarks=heap_profiling.mobile.disabled,heap_profiling.mobile.native,heap_profiling.mobile.pseudo", "-v", "--output-format=chartjson", "--browser=android-chromium" ], - "isolate_name": "telemetry_perf_tests", - "name": "heap_profiling.mobile.disabled", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_os": "KTU84P", - "device_type": "hammerhead", - "os": "Android" - } + "isolate_name": "performance_test_suite", + "merge": { + "args": [ + "--smoke-test-mode" ], - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "heap_profiling.mobile.native", - "-v", - "--output-format=chartjson", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "heap_profiling.mobile.native", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_os": "KTU84P", - "device_type": "hammerhead", - "os": "Android" - } - ], - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "heap_profiling.mobile.pseudo", - "-v", - "--output-format=chartjson", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "heap_profiling.mobile.pseudo", + "script": "//tools/perf/process_perf_results.py" + }, + "name": "heap_profiling.mobile", "swarming": { "can_use_on_swarming_builders": true, "dimension_sets": [
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index cdee61d..af113b4 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -5247,25 +5247,6 @@ { "args": [ "--test-launcher-batch-limit=400", - "--deqp-egl-display-type=angle-vulkan" - ], - "name": "angle_deqp_egl_vulkan_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:1cb3-384.90", - "os": "Ubuntu", - "pool": "Chrome-GPU" - } - ], - "shards": 4 - }, - "test": "angle_deqp_egl_tests" - }, - { - "args": [ - "--test-launcher-batch-limit=400", "--deqp-egl-display-type=angle-gl" ], "name": "angle_deqp_gles2_gl_tests", @@ -5284,25 +5265,6 @@ }, { "args": [ - "--deqp-egl-display-type=angle-vulkan", - "--test-launcher-batch-limit=400" - ], - "name": "angle_deqp_gles2_vulkan_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:1cb3-384.90", - "os": "Ubuntu", - "pool": "Chrome-GPU" - } - ], - "shards": 4 - }, - "test": "angle_deqp_gles2_tests" - }, - { - "args": [ "--test-launcher-batch-limit=400", "--deqp-egl-display-type=angle-gl" ], @@ -7915,7 +7877,16 @@ } ] }, - "test": "angle_end2end_tests" + "test": "angle_end2end_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -7933,7 +7904,16 @@ } ] }, - "test": "angle_unittests" + "test": "angle_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -7951,7 +7931,16 @@ } ] }, - "test": "gl_tests" + "test": "gl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -7968,7 +7957,16 @@ } ] }, - "test": "gl_unittests" + "test": "gl_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -7985,7 +7983,16 @@ } ] }, - "test": "gles2_conform_test" + "test": "gles2_conform_test", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -7999,7 +8006,16 @@ } ] }, - "test": "gpu_unittests" + "test": "gpu_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8017,7 +8033,16 @@ } ] }, - "test": "services_unittests" + "test": "services_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -8031,7 +8056,16 @@ } ] }, - "test": "swiftshader_unittests" + "test": "swiftshader_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -8056,6 +8090,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8079,6 +8122,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8102,6 +8154,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8125,6 +8186,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8152,6 +8222,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8182,6 +8261,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8220,6 +8308,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8244,6 +8341,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8267,6 +8373,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8291,6 +8406,15 @@ } ], "shards": 2 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ] @@ -8313,7 +8437,16 @@ } ] }, - "test": "angle_end2end_tests" + "test": "angle_end2end_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8331,7 +8464,16 @@ } ] }, - "test": "angle_unittests" + "test": "angle_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8349,7 +8491,16 @@ } ] }, - "test": "gl_tests" + "test": "gl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8366,7 +8517,16 @@ } ] }, - "test": "gl_unittests" + "test": "gl_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8383,7 +8543,16 @@ } ] }, - "test": "gles2_conform_test" + "test": "gles2_conform_test", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -8397,7 +8566,16 @@ } ] }, - "test": "gpu_unittests" + "test": "gpu_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8415,7 +8593,16 @@ } ] }, - "test": "services_unittests" + "test": "services_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -8429,7 +8616,16 @@ } ] }, - "test": "swiftshader_unittests" + "test": "swiftshader_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -8454,6 +8650,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8477,6 +8682,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8500,6 +8714,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8523,6 +8746,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8550,6 +8782,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8580,6 +8821,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8618,6 +8868,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8642,6 +8901,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8665,6 +8933,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8689,6 +8966,15 @@ } ], "shards": 2 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ] @@ -8711,7 +8997,16 @@ } ] }, - "test": "angle_end2end_tests" + "test": "angle_end2end_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8729,7 +9024,16 @@ } ] }, - "test": "angle_unittests" + "test": "angle_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8750,7 +9054,16 @@ } ] }, - "test": "browser_tests" + "test": "browser_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8768,7 +9081,16 @@ } ] }, - "test": "gl_tests" + "test": "gl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8785,7 +9107,16 @@ } ] }, - "test": "gl_unittests" + "test": "gl_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8802,7 +9133,16 @@ } ] }, - "test": "gles2_conform_test" + "test": "gles2_conform_test", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -8816,7 +9156,16 @@ } ] }, - "test": "gpu_unittests" + "test": "gpu_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -8834,7 +9183,16 @@ } ] }, - "test": "services_unittests" + "test": "services_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -8848,7 +9206,16 @@ } ] }, - "test": "swiftshader_unittests" + "test": "swiftshader_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -8873,6 +9240,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8896,6 +9272,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8919,6 +9304,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8942,6 +9336,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8969,6 +9372,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -8999,6 +9411,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9037,6 +9458,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9061,6 +9491,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9084,6 +9523,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9110,6 +9558,15 @@ } ], "shards": 20 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9134,6 +9591,15 @@ } ], "shards": 2 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ] @@ -9156,7 +9622,16 @@ } ] }, - "test": "angle_end2end_tests" + "test": "angle_end2end_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9174,7 +9649,16 @@ } ] }, - "test": "angle_unittests" + "test": "angle_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9195,7 +9679,16 @@ } ] }, - "test": "browser_tests" + "test": "browser_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9213,7 +9706,16 @@ } ] }, - "test": "gl_tests" + "test": "gl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9230,7 +9732,16 @@ } ] }, - "test": "gl_unittests" + "test": "gl_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9247,7 +9758,16 @@ } ] }, - "test": "gles2_conform_test" + "test": "gles2_conform_test", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -9261,7 +9781,16 @@ } ] }, - "test": "gpu_unittests" + "test": "gpu_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9279,7 +9808,16 @@ } ] }, - "test": "services_unittests" + "test": "services_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -9293,7 +9831,16 @@ } ] }, - "test": "swiftshader_unittests" + "test": "swiftshader_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -9318,6 +9865,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9341,6 +9897,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9364,6 +9929,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9387,6 +9961,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9414,6 +9997,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9444,6 +10036,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9482,6 +10083,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9506,6 +10116,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9529,6 +10148,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9555,6 +10183,15 @@ } ], "shards": 20 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -9579,6 +10216,15 @@ } ], "shards": 2 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ] @@ -9603,7 +10249,16 @@ ], "shards": 4 }, - "test": "angle_deqp_egl_tests" + "test": "angle_deqp_egl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9623,7 +10278,16 @@ ], "shards": 4 }, - "test": "angle_deqp_gles2_tests" + "test": "angle_deqp_gles2_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -9643,7 +10307,16 @@ ], "shards": 12 }, - "test": "angle_deqp_gles3_tests" + "test": "angle_deqp_gles3_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ] }, @@ -10565,7 +11238,16 @@ } ] }, - "test": "angle_end2end_tests" + "test": "angle_end2end_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -10582,7 +11264,16 @@ } ] }, - "test": "gles2_conform_test" + "test": "gles2_conform_test", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -10596,7 +11287,16 @@ } ] }, - "test": "gpu_unittests" + "test": "gpu_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -10614,7 +11314,16 @@ } ] }, - "test": "services_unittests" + "test": "services_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -10628,7 +11337,16 @@ } ] }, - "test": "swiftshader_unittests" + "test": "swiftshader_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -10657,6 +11375,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -10683,6 +11410,15 @@ } ], "shards": 20 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ] @@ -10705,7 +11441,16 @@ } ] }, - "test": "angle_end2end_tests" + "test": "angle_end2end_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -10722,7 +11467,16 @@ } ] }, - "test": "gles2_conform_test" + "test": "gles2_conform_test", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -10736,7 +11490,16 @@ } ] }, - "test": "gpu_unittests" + "test": "gpu_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -10754,7 +11517,16 @@ } ] }, - "test": "services_unittests" + "test": "services_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "swarming": { @@ -10768,7 +11540,16 @@ } ] }, - "test": "swiftshader_unittests" + "test": "swiftshader_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -10797,6 +11578,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"10de:0fe9\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ]
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json index 1a353f3..ca21e6e0 100644 --- a/testing/buildbot/chromium.gpu.json +++ b/testing/buildbot/chromium.gpu.json
@@ -1558,7 +1558,16 @@ } ] }, - "test": "angle_unittests" + "test": "angle_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -1576,7 +1585,16 @@ } ] }, - "test": "gl_tests" + "test": "gl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -1593,7 +1611,16 @@ } ] }, - "test": "gl_unittests" + "test": "gl_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -1618,6 +1645,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1641,6 +1677,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1664,6 +1709,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1687,6 +1741,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1714,6 +1777,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1744,6 +1816,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1782,6 +1863,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1806,6 +1896,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1829,6 +1928,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1853,6 +1961,15 @@ } ], "shards": 2 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ] @@ -1875,7 +1992,16 @@ } ] }, - "test": "angle_unittests" + "test": "angle_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -1896,7 +2022,16 @@ } ] }, - "test": "browser_tests" + "test": "browser_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -1914,7 +2049,16 @@ } ] }, - "test": "gl_tests" + "test": "gl_tests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } }, { "args": [ @@ -1931,7 +2075,16 @@ } ] }, - "test": "gl_unittests" + "test": "gl_unittests", + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" + } } ], "isolated_scripts": [ @@ -1956,6 +2109,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -1979,6 +2141,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2002,6 +2173,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2025,6 +2205,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2052,6 +2241,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2082,6 +2280,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2120,6 +2327,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2144,6 +2360,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2167,6 +2392,15 @@ "pool": "Chrome-GPU" } ] + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } }, { @@ -2191,6 +2425,15 @@ } ], "shards": 2 + }, + "trigger_script": { + "args": [ + "--multiple-trigger-configs", + "[{\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.12.6\", \"pool\": \"Chrome-GPU\"}, {\"gpu\": \"1002:6821\", \"hidpi\": \"1\", \"os\": \"Mac-10.13.5\", \"pool\": \"Chrome-GPU\"}]", + "--multiple-dimension-script-verbose", + "True" + ], + "script": "//testing/trigger_scripts/trigger_multiple_dimensions.py" } } ]
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 63285af..92c6d74c 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -104,6 +104,24 @@ "test": "cast_shell_unittests" }, { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "cast_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_browsertests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_unittests" + }, + { "args": [ "--test-launcher-filter-file=src/testing/buildbot/filters/cast-linux.content_browsertests.filter" ], @@ -212,6 +230,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "services_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "shell_dialogs_unittests" }, { @@ -367,6 +391,24 @@ "test": "cast_shell_unittests" }, { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "cast_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_browsertests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, + "test": "components_unittests" + }, + { "args": [ "--test-launcher-filter-file=src/testing/buildbot/filters/cast-linux.content_browsertests.filter" ], @@ -475,6 +517,12 @@ "swarming": { "can_use_on_swarming_builders": true }, + "test": "services_unittests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true + }, "test": "shell_dialogs_unittests" }, { @@ -693,16 +741,23 @@ "isolated_scripts": [ { "args": [ - "memory.leak_detection", + "--benchmarks=memory.leak_detection", + "--smoke-test-mode", "--upload-results", "--output-format=histograms", "--browser=release", "--xvfb" ], - "isolate_name": "telemetry_perf_tests", + "isolate_name": "performance_test_suite", + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, "name": "memory.leak_detection", "override_compile_targets": [ - "telemetry_perf_tests" + "performance_test_suite" ], "swarming": { "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index 4bb0d50..0e4b16c 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -53,16 +53,23 @@ "isolated_scripts": [ { "args": [ - "experimental.startup.android.coldish", + "--benchmarks=experimental.startup.android.coldish", "-v", "--upload-results", "--output-format=histograms", "--browser=android-chromium" ], - "isolate_name": "telemetry_perf_tests", - "name": "experimental.startup.android.coldish", + "isolate_name": "performance_test_suite", + "merge": { + "args": [ + "--service-account-file", + "/creds/service_accounts/service-account-chromium-perf-histograms.json" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite", "override_compile_targets": [ - "telemetry_perf_tests" + "performance_test_suite" ], "swarming": { "can_use_on_swarming_builders": true, @@ -80,88 +87,23 @@ }, { "args": [ - "heap_profiling.mobile.disabled", + "--benchmarks=heap_profiling.mobile.disabled,heap_profiling.mobile.native,heap_profiling.mobile.pseudo,smoothness.oop_rasterization.top_25_smooth,thread_times.oop_rasterization.key_mobile,rendering.oopd.mobile", "-v", "--upload-results", "--output-format=histograms", "--browser=android-chromium" ], - "isolate_name": "telemetry_perf_tests", - "name": "heap_profiling.mobile.disabled", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "id": "build187-b7--device2", - "pool": "chrome.tests.perf-fyi" - } + "isolate_name": "performance_test_suite", + "merge": { + "args": [ + "--service-account-file", + "/creds/service_accounts/service-account-chromium-perf-histograms.json" ], - "expiration": 3600, - "hard_timeout": 1080, - "ignore_task_failure": false, - "io_timeout": 360 - } - }, - { - "args": [ - "heap_profiling.mobile.native", - "-v", - "--upload-results", - "--output-format=histograms", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "heap_profiling.mobile.native", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "id": "build187-b7--device2", - "pool": "chrome.tests.perf-fyi" - } - ], - "expiration": 3600, - "hard_timeout": 1080, - "ignore_task_failure": false, - "io_timeout": 360 - } - }, - { - "args": [ - "heap_profiling.mobile.pseudo", - "-v", - "--upload-results", - "--output-format=histograms", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "heap_profiling.mobile.pseudo", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "id": "build187-b7--device2", - "pool": "chrome.tests.perf-fyi" - } - ], - "expiration": 3600, - "hard_timeout": 1080, - "ignore_task_failure": false, - "io_timeout": 360 - } - }, - { - "args": [ - "smoothness.oop_rasterization.top_25_smooth", - "-v", - "--upload-results", - "--output-format=histograms", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "smoothness.oop_rasterization.top_25_smooth", + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite", "override_compile_targets": [ - "telemetry_perf_tests" + "performance_test_suite" ], "swarming": { "can_use_on_swarming_builders": true, @@ -176,304 +118,6 @@ "ignore_task_failure": false, "io_timeout": 360 } - }, - { - "args": [ - "thread_times.oop_rasterization.key_mobile", - "-v", - "--upload-results", - "--output-format=histograms", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "thread_times.oop_rasterization.key_mobile", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "id": "build187-b7--device2", - "pool": "chrome.tests.perf-fyi" - } - ], - "expiration": 3600, - "hard_timeout": 1080, - "ignore_task_failure": false, - "io_timeout": 360 - } - }, - { - "args": [ - "rendering.oopd.mobile", - "-v", - "--upload-results", - "--output-format=histograms", - "--browser=android-chromium" - ], - "isolate_name": "telemetry_perf_tests", - "name": "rendering.oopd.mobile", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "id": "build187-b7--device2", - "pool": "chrome.tests.perf-fyi" - } - ], - "expiration": 3600, - "hard_timeout": 1080, - "ignore_task_failure": false, - "io_timeout": 360 - } - } - ] - }, - "Histogram Pipeline Linux Perf": { - "isolated_scripts": [ - { - "args": [ - "dummy_benchmark.histogram_benchmark_1", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=release", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "dummy_benchmark.histogram_benchmark_1", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "dummy_benchmark.histogram_benchmark_1", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=reference", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "dummy_benchmark.histogram_benchmark_1.reference", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "loading.desktop", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=release", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "loading.desktop", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "loading.desktop", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=reference", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "loading.desktop.reference", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "system_health.common_desktop", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=release", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "system_health.common_desktop", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "system_health.common_desktop", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=reference", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "system_health.common_desktop.reference", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "system_health.memory_desktop", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=release", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "system_health.memory_desktop", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "system_health.memory_desktop", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=reference", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "system_health.memory_desktop.reference", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "speedometer2", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=release", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "speedometer2", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "speedometer2", - "-v", - "--upload-results", - "--output-format=histograms", - "--output-format=json-test-results", - "--browser=reference", - "--xvfb", - "--also-run-disabled-tests" - ], - "isolate_name": "telemetry_perf_tests", - "name": "speedometer2.reference", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } } ] }, @@ -481,44 +125,23 @@ "isolated_scripts": [ { "args": [ - "loading.desktop.network_service", + "--benchmarks=loading.desktop.network_service,rendering.oopd.desktop", "-v", "--upload-results", "--output-format=chartjson", "--browser=release" ], - "isolate_name": "telemetry_perf_tests", - "name": "loading.desktop.network_service", - "override_compile_targets": [ - "telemetry_perf_tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:1cb3", - "id": "build186-b7", - "pool": "chrome.tests.perf-fyi" - } + "isolate_name": "performance_test_suite", + "merge": { + "args": [ + "--service-account-file", + "/creds/service_accounts/service-account-chromium-perf-histograms.json" ], - "expiration": 36000, - "hard_timeout": 10800, - "ignore_task_failure": false, - "io_timeout": 3600 - } - }, - { - "args": [ - "rendering.oopd.desktop", - "-v", - "--upload-results", - "--output-format=chartjson", - "--browser=release" - ], - "isolate_name": "telemetry_perf_tests", - "name": "rendering.oopd.desktop", + "script": "//tools/perf/process_perf_results.py" + }, + "name": "performance_test_suite", "override_compile_targets": [ - "telemetry_perf_tests" + "performance_test_suite" ], "swarming": { "can_use_on_swarming_builders": true,
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index ee44c29..7c9ee63 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1088,14 +1088,9 @@ "-v", ], }, - "telemetry_perf_tests": { - "label": "//chrome/test:telemetry_perf_tests", - "type": "script", - "script": "//testing/scripts/run_telemetry_benchmark_as_googletest.py", - "args": [ - "../../tools/perf/run_benchmark", - ], - }, + # This isolate is solely used to run the One Builbot Step Tester + # trybot so that we don't use the full chrome build each time. Instead + # this uses the reference build to run telemetry. "telemetry_perf_tests_without_chrome": { "label": "//chrome/test:telemetry_perf_tests_without_chrome", "type": "script", @@ -1104,9 +1099,6 @@ "../../tools/perf/run_benchmark", ], }, - # Perf is in the middle of refactoring their recipe. crbug.com/757933 - # These isolates are the new targets for the refactor and will replace - # the old ones when migration is complete. "performance_test_suite": { "label": "//chrome/test:performance_test_suite", "type": "script",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index c08a866..acda218 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -340,10 +340,6 @@ }, 'cast_unittests': { 'remove_from': [ - # Unclear why these largely aren't run on Android. - # TODO(kbr): why are the cast unit tests not run on the Cast bots?! - 'Cast Audio Linux', - 'Cast Linux', # chromium.clang 'ToTAndroidCFI', 'ToTLinuxThinLTO', @@ -581,9 +577,7 @@ }, 'components_browsertests': { 'remove_from': [ - # On chromium.linux, unclear why these aren't run on the Cast bots. - 'Cast Audio Linux', - 'Cast Linux', + # chromium.linux 'Linux Tests (dbg)(1)(32)', # chromium.win 'Win7 Tests (dbg)(1)', @@ -613,11 +607,6 @@ }, }, 'components_unittests': { - 'remove_from': [ - # On chromium.linux, unclear why these aren't run on the Cast bots. - 'Cast Audio Linux', - 'Cast Linux', - ], 'modifications': { # chromium.android 'android-marshmallow-arm64-rel': { @@ -1596,9 +1585,6 @@ # chromium.gpu.fyi # The face and barcode detection tests fail on the Mac Pros. 'Mac Pro FYI Release (AMD)', - # On chromium.linux, unclear why these aren't run on Cast. - 'Cast Audio Linux', - 'Cast Linux', # chromium.memory 'Linux ChromiumOS MSan Tests', # https://crbug.com/831676 'Linux MSan Tests', # https://crbug.com/831676
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index b5fa610e..cff5228 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1596,16 +1596,23 @@ 'leak_detection_isolated_scripts': { 'memory.leak_detection': { 'args': [ - 'memory.leak_detection', + '--benchmarks=memory.leak_detection', + '--smoke-test-mode', '--upload-results', '--output-format=histograms', '--browser=release', '--xvfb' ], - 'isolate_name': 'telemetry_perf_tests', + 'isolate_name': 'performance_test_suite', 'override_compile_targets': [ - 'telemetry_perf_tests', + 'performance_test_suite', ], + 'merge': { + 'args': [ + '--smoke-test-mode', + ], + 'script': '//tools/perf/process_perf_results.py', + }, 'swarming': { 'expiration': 36000, 'hard_timeout': 10800, @@ -1692,32 +1699,21 @@ }, 'memory_infra_isolated_scripts': { - 'heap_profiling.mobile.disabled': { + 'heap_profiling.mobile': { 'args': [ - 'heap_profiling.mobile.disabled', + '--smoke-test-mode', + '--benchmarks=heap_profiling.mobile.disabled,heap_profiling.mobile.native,heap_profiling.mobile.pseudo', '-v', '--output-format=chartjson', '--browser=android-chromium', ], - 'isolate_name': 'telemetry_perf_tests', - }, - 'heap_profiling.mobile.native': { - 'args': [ - 'heap_profiling.mobile.native', - '-v', - '--output-format=chartjson', - '--browser=android-chromium', - ], - 'isolate_name': 'telemetry_perf_tests', - }, - 'heap_profiling.mobile.pseudo': { - 'args': [ - 'heap_profiling.mobile.pseudo', - '-v', - '--output-format=chartjson', - '--browser=android-chromium', - ], - 'isolate_name': 'telemetry_perf_tests', + 'isolate_name': 'performance_test_suite', + 'merge': { + 'args': [ + '--smoke-test-mode', + ], + 'script': '//tools/perf/process_perf_results.py', + }, }, }, @@ -2494,9 +2490,7 @@ 'gpu_angle_deqp_linux_nvidia_gtests': [ 'gpu_angle_deqp_egl_gl_tests', - 'gpu_angle_deqp_egl_vulkan_tests', 'gpu_angle_deqp_gles2_gl_tests', - 'gpu_angle_deqp_gles2_vulkan_tests', 'gpu_angle_deqp_gles3_gl_tests', 'gpu_angle_deqp_gles31_gl_tests', ],
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 1d29e8c..5c8f411 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -963,6 +963,15 @@ 'gtest_tests': 'gpu_desktop_gtests', 'gpu_telemetry_tests': 'gpu_common_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Mac Retina Release (AMD)': { 'browser_config': 'release', @@ -981,6 +990,15 @@ 'gtest_tests': 'gpu_desktop_gtests', 'gpu_telemetry_tests': 'gpu_common_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Win10 Debug (NVIDIA)': { 'browser_config': 'debug', @@ -1554,6 +1572,8 @@ { 'gpu': '1002:6821', 'hidpi': '1', + # TODO(crbug.com/856799): upgrade to 10.13.5 as soon as + # there is some capacity. 'os': 'Mac-10.12.6', 'pool': 'Chrome-GPU', }, @@ -1597,6 +1617,15 @@ 'gtest_tests': 'gpu_fyi_mac_debug_gtests', 'gpu_telemetry_tests': 'gpu_common_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Mac FYI Retina Debug (NVIDIA)': { 'os_type': 'mac', @@ -1615,6 +1644,15 @@ 'gtest_tests': 'gpu_fyi_mac_debug_gtests', 'gpu_telemetry_tests': 'gpu_common_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '10de:0fe9', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Mac FYI Retina Release (AMD)': { 'os_type': 'mac', @@ -1633,6 +1671,15 @@ 'gtest_tests': 'gpu_fyi_mac_release_gtests', 'gpu_telemetry_tests': 'gpu_fyi_mac_release_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Mac FYI Retina Release (NVIDIA)': { 'os_type': 'mac', @@ -1651,6 +1698,15 @@ 'gtest_tests': 'gpu_fyi_mac_release_gtests', 'gpu_telemetry_tests': 'gpu_fyi_mac_release_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '10de:0fe9', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Mac FYI dEQP Release AMD': { 'os_type': 'mac', @@ -1667,6 +1723,15 @@ 'test_suites': { 'gtest_tests': 'gpu_angle_deqp_mac_gtests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Mac FYI dEQP Release Intel': { 'os_type': 'mac', @@ -1791,6 +1856,7 @@ 'gtest_tests': 'gpu_fyi_mac_optional_gtests', 'gpu_telemetry_tests': 'gpu_fyi_optional_telemetry_tests', }, + 'use_multi_dimension_trigger_script': True, }, 'Optional Mac Retina Release (NVIDIA)': { 'os_type': 'mac', @@ -1809,6 +1875,15 @@ 'gtest_tests': 'gpu_fyi_mac_optional_gtests', 'gpu_telemetry_tests': 'gpu_fyi_optional_telemetry_tests', }, + 'alternate_swarming_dimensions': [ + { + 'gpu': '10de:0fe9', + 'hidpi': '1', + 'os': 'Mac-10.13.5', + 'pool': 'Chrome-GPU', + }, + ], + 'use_multi_dimension_trigger_script': True, }, 'Optional Win10 Release (Intel HD 630)': { 'os_type': 'win',
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index e50fa76d..b84e36877 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -107,6 +107,7 @@ crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/successes.worker.html [ Timeout ] crbug.com/591099 external/wpt/WebCryptoAPI/import_export/rsa_importKey.worker.html [ Timeout ] crbug.com/709227 external/wpt/WebCryptoAPI/import_export/symmetric_importKey.worker.html [ Failure ] +crbug.com/591099 external/wpt/content-security-policy/reporting/report-original-url.sub.html [ Failure Pass ] crbug.com/591099 external/wpt/credential-management/federatedcredential-framed-get.sub.https.html [ Pass ] crbug.com/591099 external/wpt/credential-management/passwordcredential-framed-get.sub.https.html [ Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001.xht [ Pass ] @@ -114,14 +115,29 @@ crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001e.xht [ Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001h.xht [ Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e.xht [ Pass ] +crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-nested-002.xht [ Pass ] crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006.xht [ Pass ] +crbug.com/591099 external/wpt/css/CSS2/normal-flow/max-width-applies-to-005.xht [ Failure ] +crbug.com/591099 external/wpt/css/CSS2/normal-flow/min-width-applies-to-005.xht [ Failure ] +crbug.com/591099 external/wpt/css/CSS2/normal-flow/replaced-intrinsic-001.xht [ Failure ] crbug.com/591099 external/wpt/css/CSS2/text/white-space-mixed-003.xht [ Pass ] +crbug.com/591099 external/wpt/css/css-animations/CSSAnimation-getComputedTiming.tentative.html [ Failure Pass ] +crbug.com/591099 external/wpt/css/css-animations/Element-getAnimations-dynamic-changes.tentative.html [ Failure ] crbug.com/591099 external/wpt/css/css-backgrounds/box-shadow-syntax-001.xht [ Failure ] crbug.com/591099 external/wpt/css/css-contain/contain-paint-007.html [ Pass ] +crbug.com/591099 external/wpt/css/css-contain/counter-scoping-003.html [ Failure ] +crbug.com/591099 external/wpt/css/css-display/display-contents-fieldset-nested-legend.html [ Failure ] +crbug.com/591099 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-007.xht [ Failure ] +crbug.com/591099 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure ] +crbug.com/591099 external/wpt/css/css-flexbox/flexbox_visibility-collapse-line-wrapping.html [ Failure ] crbug.com/714962 external/wpt/css/css-fonts/font-features-across-space-1.html [ Pass ] crbug.com/714962 external/wpt/css/css-fonts/font-features-across-space-3.html [ Pass ] +crbug.com/591099 external/wpt/css/css-fonts/font-synthesis-01.html [ Failure ] +crbug.com/591099 external/wpt/css/css-fonts/font-variant-alternates-02.html [ Failure ] +crbug.com/591099 external/wpt/css/css-fonts/font-variant-alternates-08.html [ Failure ] crbug.com/591099 external/wpt/css/css-fonts/font-variant-ligatures-11.html [ Pass ] +crbug.com/591099 external/wpt/css/css-grid/alignment/grid-gutters-009.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-002.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/alignment/grid-row-axis-self-baseline-synthesized-003.html [ Failure ] @@ -135,6 +151,15 @@ crbug.com/591099 external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html [ Failure ] crbug.com/591099 external/wpt/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html [ Failure ] +crbug.com/591099 external/wpt/css/css-grid/grid-layout-properties.html [ Failure ] +crbug.com/591099 external/wpt/css/css-images/tiled-gradients.html [ Failure ] +crbug.com/591099 external/wpt/css/css-masking/clip-path-svg-content/mask-objectboundingbox-content-clip-transform.svg [ Failure ] +crbug.com/591099 external/wpt/css/css-masking/clip-path-svg-content/mask-userspaceonuse-content-clip.svg [ Failure ] +crbug.com/591099 external/wpt/css/css-masking/clip-path/clip-path-polygon-010.html [ Failure ] +crbug.com/591099 external/wpt/css/css-multicol/multicol-span-all-margin-nested-002.xht [ Failure ] +crbug.com/591099 external/wpt/css/css-position/position-relative-table-tfoot-left.html [ Failure ] +crbug.com/591099 external/wpt/css/css-position/position-relative-table-thead-top.html [ Failure ] +crbug.com/591099 external/wpt/css/css-position/position-relative-table-tr-top-absolute-child.html [ Failure ] crbug.com/591099 external/wpt/css/css-position/position-sticky-writing-modes.html [ Failure ] crbug.com/591099 external/wpt/css/css-pseudo/first-letter-opacity-float-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-rhythm/ [ Skip ] @@ -142,6 +167,9 @@ crbug.com/591099 external/wpt/css/css-scroll-anchoring/opt-out.html [ Failure ] crbug.com/591099 external/wpt/css/css-scroll-anchoring/position-change-heuristic.html [ Failure ] crbug.com/714962 external/wpt/css/css-scroll-anchoring/wrapped-text.html [ Failure ] +crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-008.html [ Failure ] +crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-011.html [ Failure ] +crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-013.html [ Failure ] crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-010.html [ Pass ] crbug.com/591099 external/wpt/css/css-shapes/shape-outside/supported-shapes/circle/shape-outside-circle-027.html [ Pass ] crbug.com/591099 external/wpt/css/css-shapes/shape-outside/supported-shapes/polygon/shape-outside-polygon-017.html [ Pass ] @@ -149,6 +177,7 @@ crbug.com/591099 external/wpt/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html [ Pass ] crbug.com/845902 external/wpt/css/css-sizing/whitespace-and-break.html [ Pass ] crbug.com/591099 external/wpt/css/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html [ Failure ] +crbug.com/591099 external/wpt/css/css-text-decor/text-emphasis-position-below-left-001.xht [ Failure ] crbug.com/591099 external/wpt/css/css-text/i18n/css3-text-line-break-jazh-136.html [ Pass ] crbug.com/591099 external/wpt/css/css-text/i18n/css3-text-line-break-jazh-142.html [ Pass ] crbug.com/591099 external/wpt/css/css-text/i18n/css3-text-line-break-opclns-255.html [ Pass ] @@ -160,8 +189,14 @@ crbug.com/591099 external/wpt/css/css-text/white-space/pre-wrap-002.html [ Pass ] crbug.com/40634 external/wpt/css/css-text/white-space/trailing-space-before-br-001.html [ Pass ] crbug.com/591099 external/wpt/css/css-text/word-break/word-break-break-all-004.html [ Pass ] +crbug.com/591099 external/wpt/css/css-text/word-break/word-break-break-all-008.html [ Failure ] +crbug.com/591099 external/wpt/css/css-transforms/transform-box/view-box-mutation.html [ Failure ] crbug.com/591099 external/wpt/css/css-transforms/transform-transformed-tr-percent-height-child.html [ Failure ] crbug.com/591099 external/wpt/css/css-transforms/transform3d-perspective-008.html [ Pass ] +crbug.com/591099 external/wpt/css/css-transitions/properties-value-003.html [ Failure Pass ] +crbug.com/591099 external/wpt/css/css-transitions/properties-value-implicit-001.html [ Pass ] +crbug.com/591099 external/wpt/css/css-ui/box-sizing-019.html [ Failure ] +crbug.com/591099 external/wpt/css/css-ui/outline-006.html [ Failure ] crbug.com/591099 external/wpt/css/css-ui/text-overflow-010.html [ Pass ] crbug.com/591099 external/wpt/css/css-ui/text-overflow-015.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht [ Pass ] @@ -242,6 +277,8 @@ crbug.com/591099 external/wpt/css/css-writing-modes/available-size-010.html [ Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/available-size-011.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/available-size-012.html [ Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes/available-size-015.html [ Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes/available-size-016.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/available-size-017.html [ Pass ] crbug.com/591099 external/wpt/css/css-writing-modes/available-size-018.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/block-flow-direction-vrl-009.xht [ Pass ] @@ -257,6 +294,8 @@ crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001s.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001t.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-001.xht [ Pass ] +crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-008.xht [ Failure ] +crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-004.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-013.xht [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/text-combine-upright-decorations-001.html [ Failure ] crbug.com/591099 external/wpt/css/css-writing-modes/text-combine-upright-layout-rules-001.html [ Failure ] @@ -266,32 +305,51 @@ crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Pass ] crbug.com/591099 external/wpt/css/geometry/interfaces.worker.html [ Pass ] crbug.com/591099 external/wpt/css/selectors/focus-within-004.html [ Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative-invalid.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-attr-mapping.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-abspos-child-002.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-item-vert-001b.html [ Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-baseline-001.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-collapsed-item-horiz-001.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-002.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-definite-sizes-002.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-definite-sizes-004.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002a.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-003a.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-005v.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/split-inner-inline-2.html [ Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/float-retry-push-image.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-003.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-004.html [ Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-008.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039.html [ Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-048.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-051.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-008.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-padding-box-border-radius-002.html [ Pass ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-021.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-032.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-break-inside-001.html [ Failure ] +crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-break-inside-001a.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-007.html [ Failure ] crbug.com/591099 external/wpt/editing/run/bold.html [ Pass ] +crbug.com/591099 external/wpt/editing/run/fontname.html [ Pass ] crbug.com/591099 external/wpt/editing/run/formatblock.html [ Pass ] crbug.com/591099 external/wpt/editing/run/inserthtml.html [ Pass ] +crbug.com/591099 external/wpt/editing/run/insertimage.html [ Pass ] crbug.com/591099 external/wpt/editing/run/insertlinebreak.html [ Pass ] crbug.com/591099 external/wpt/editing/run/insertparagraph.html [ Pass ] crbug.com/591099 external/wpt/editing/run/justifycenter.html [ Pass ] @@ -301,31 +359,104 @@ crbug.com/591099 external/wpt/editing/run/misc.html [ Pass ] crbug.com/591099 external/wpt/editing/run/multitest.html [ Pass ] crbug.com/591099 external/wpt/editing/run/strikethrough.html [ Pass ] +crbug.com/591099 external/wpt/editing/run/unlink.html [ Pass ] +crbug.com/591099 external/wpt/encoding/eof-utf-8-two.html [ Failure ] +crbug.com/591099 external/wpt/fetch/cross-origin-resource-policy/fetch.any.html [ Timeout ] +crbug.com/591099 external/wpt/fetch/http-cache/basic-auth-cache-test.html [ Timeout ] +crbug.com/591099 external/wpt/fullscreen/api/document-exit-fullscreen-nested-in-iframe-manual.html [ Pass ] crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html/browsers/sandboxing/sandbox-disallow-same-origin.html [ Pass ] +crbug.com/591099 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_parent [ Timeout ] +crbug.com/591099 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_self [ Timeout ] crbug.com/591099 external/wpt/html/dom/documents/dom-tree-accessors/Document.currentScript.html [ Pass ] +crbug.com/591099 external/wpt/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-positive.html [ Timeout ] +crbug.com/591099 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/serialization-via-idb.any.worker.html [ Failure ] +crbug.com/591099 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-domain-success.sub.html [ Failure ] +crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Failure ] +crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-2j.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-percentage.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/replaced-elements/svg-inline-sizing/svg-inline.html [ Failure ] +crbug.com/591099 external/wpt/html/semantics/embedded-content/the-embed-element/embed-represent-nothing-02.html [ Failure ] +crbug.com/591099 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-list-owner-menu.html [ Failure ] +crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/async_010.htm [ Pass ] +crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/integration-with-the-javascript-agent-formalism/canblock-window.html [ Failure ] +crbug.com/591099 external/wpt/infrastructure/reftest/reftest_ref_timeout.html [ Timeout ] +crbug.com/591099 external/wpt/media-source/mediasource-avtracks.html [ Failure ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-audio-bitrate.html [ Failure ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-av-video-bitrate.html [ Failure ] +crbug.com/591099 external/wpt/media-source/mediasource-config-change-mp4-v-bitrate.html [ Failure ] +crbug.com/591099 external/wpt/mimesniff/mime-types/parsing.any.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/convert-to-blob/offscreencanvas.convert.to.blob.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.basic.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.9arg.sourcesize.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.animated.poster.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.canvas.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.path.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.transform.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.worker.html [ Pass ] +crbug.com/591099 external/wpt/offscreen-canvas/path-objects/2d.path.stroke.prune.curve.worker.html [ Failure ] crbug.com/591099 external/wpt/payment-handler/can-make-payment-event-constructor.https.worker.html [ Pass ] crbug.com/591099 external/wpt/payment-request/payment-allowed-by-feature-policy.https.sub.html [ Pass ] crbug.com/591099 external/wpt/payment-request/payment-disabled-by-feature-policy.https.sub.html [ Pass ] +crbug.com/591099 external/wpt/performance-timeline/po-observe.html [ Timeout ] crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ] +crbug.com/591099 external/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch-manual.html [ Pass Timeout ] crbug.com/591099 external/wpt/quirks/line-height-calculation.html [ Failure ] crbug.com/591099 external/wpt/requestidlecallback/basic.html [ Pass Timeout ] crbug.com/591099 external/wpt/requestidlecallback/callback-exception.html [ Pass ] crbug.com/591099 external/wpt/requestidlecallback/callback-idle-periods.html [ Pass ] -crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass ] -crbug.com/591099 external/wpt/requestidlecallback/callback-invoked.html [ Pass ] +crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass Timeout ] +crbug.com/591099 external/wpt/requestidlecallback/callback-invoked.html [ Pass Timeout ] +crbug.com/591099 external/wpt/requestidlecallback/callback-timeout-when-busy.html [ Timeout ] crbug.com/591099 external/wpt/requestidlecallback/cancel-invoked.html [ Pass ] crbug.com/591099 external/wpt/requestidlecallback/idlharness.html [ Pass Timeout ] +crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/broken-chunked-encoding.https.html [ Failure Pass ] +crbug.com/591099 external/wpt/speech-api/SpeechSynthesis-speak-twice.html [ Timeout ] +crbug.com/591099 external/wpt/svg/painting/reftests/paint-context-002.svg [ Failure ] +crbug.com/591099 external/wpt/svg/shapes/ellipse-07.svg [ Failure ] +crbug.com/591099 external/wpt/user-timing/invoke_with_timing_attributes.worker.html [ Failure ] crbug.com/591099 external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html [ Pass ] crbug.com/591099 external/wpt/webrtc/interfaces.html [ Pass Timeout ] +crbug.com/591099 external/wpt/websockets/Create-Secure-extensions-empty.any.worker.html [ Timeout ] +crbug.com/591099 external/wpt/websockets/cookies/001.html?wss [ Failure Pass ] crbug.com/591099 external/wpt/websockets/opening-handshake/003-sets-origin.worker.html [ Pass ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_cues_overlapping_partially_move_down.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/2_tracks.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_start.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u05D0_first.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/size_99.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/line_50_percent.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/color_hsla.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/white-space_pre-wrap_wrapped.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_box.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/background_shorthand.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_animation_with_timestamp.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_properties.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_background_shorthand.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_font_shorthand.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_normal_wrapped.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_outline_shorthand.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/color_rgba.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_background_shorthand.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_normal_wrapped.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre-wrap_wrapped.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre_wrapped.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_allowed_properties.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/not_root_selector.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/root_namespace.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-decoration_overline.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/text-shadow.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_outline_properties.html [ Failure ] +crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_normal_wrapped.html [ Failure ] +crbug.com/591099 external/wpt/workers/constructors/Worker/same-origin.html [ Timeout ] crbug.com/591099 external/wpt/xhr/abort-after-stop.htm [ Pass ] +crbug.com/591099 external/wpt/xhr/open-url-redirected-worker-origin.htm [ Failure ] crbug.com/591099 external/wpt/xhr/send-authentication-prompt-2-manual.htm [ Failure ] crbug.com/591099 fast/backgrounds/background-clip-text.html [ Failure ] crbug.com/591099 fast/backgrounds/background-leakage-transforms.html [ Failure ] @@ -344,7 +475,6 @@ crbug.com/591099 fast/block/float/nopaint-after-layer-destruction2.html [ Failure ] crbug.com/591099 fast/block/float/overlapping-floats-paint-hittest-order-1.html [ Failure ] crbug.com/591099 fast/block/line-layout/floats-do-not-fit-on-line.html [ Failure ] -crbug.com/591099 fast/block/over-constrained-auto-margin.html [ Failure ] crbug.com/591099 fast/block/positioning/positioned-child-inside-relative-positioned-anonymous-block.html [ Failure ] crbug.com/591099 fast/borders/bidi-002.html [ Failure ] crbug.com/859497 fast/borders/bidi-009a.html [ Failure ] @@ -358,7 +488,7 @@ crbug.com/591099 fast/box-shadow/box-shadow.html [ Failure ] crbug.com/591099 fast/box-shadow/inset-subpixel.html [ Failure ] crbug.com/591099 fast/box-shadow/inset.html [ Failure ] -crbug.com/591099 fast/box-sizing/replaced.html [ Failure ] +crbug.com/591099 fast/box-sizing/replaced.html [ Failure Pass ] crbug.com/591099 fast/css-generated-content/first-letter-next-sibling-crash.html [ Crash ] crbug.com/591099 fast/css-generated-content/float-first-letter-siblings-convert-to-inline.html [ Crash ] crbug.com/591099 fast/css-grid-layout/flex-and-minmax-content-resolution-columns.html [ Failure ] @@ -400,8 +530,6 @@ crbug.com/714962 fast/css/focus-ring-recursive-continuations.html [ Failure ] crbug.com/714962 fast/css/focus-ring-recursive-inlines.html [ Failure ] crbug.com/591099 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Failure ] -crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-margin-auto.html [ Failure ] -crbug.com/591099 fast/css/getComputedStyle/getComputedStyle-margin-percentage.html [ Failure ] crbug.com/591099 fast/css/opacity-float.html [ Pass ] crbug.com/591099 fast/css/outline-narrowLine.html [ Failure ] crbug.com/591099 fast/css/transform-inline-style-remove.html [ Failure ] @@ -467,7 +595,6 @@ crbug.com/591099 fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ] crbug.com/591099 fast/scrolling/scrollbar-tickmarks-hittest.html [ Pass ] crbug.com/591099 fast/spatial-navigation/snav-fully-aligned-vertically.html [ Failure ] -crbug.com/591099 fast/sub-pixel/computedstylemargin.html [ Failure ] crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ] crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ] crbug.com/591099 fast/table/border-collapsing/004-vertical.html [ Failure ] @@ -477,8 +604,8 @@ crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ] crbug.com/591099 fast/table/fixed-table-layout/table-with-percent-width.html [ Failure ] crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ] -crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ] -crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure Pass ] +crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure ] +crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ] crbug.com/591099 fast/table/percent-height-replaced-content-in-cell.html [ Failure ] crbug.com/858998 fast/table/table-continuation-outline-paint-crash.html [ Failure ] crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ] @@ -493,7 +620,6 @@ crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Pass ] crbug.com/591099 fast/text/international/text-combine-image-test.html [ Failure ] crbug.com/591099 fast/text/orientation-sideways.html [ Failure ] -crbug.com/591099 fast/text/selection/atsui-partial-selection.html [ Failure Pass ] crbug.com/591099 fast/text/selection/emphasis.html [ Failure ] crbug.com/591099 fast/text/text-combine-first-line-crash.html [ Crash ] crbug.com/591099 fast/text/unicode-fallback-font.html [ Failure ] @@ -514,7 +640,7 @@ crbug.com/591099 fast/writing-mode/text-combine-justify.html [ Failure ] crbug.com/591099 fast/writing-mode/text-combine-line-break.html [ Failure ] crbug.com/591099 fast/writing-mode/text-combine-various-fonts.html [ Failure ] -crbug.com/591099 fast/writing-mode/vertical-rl-replaced-selection.html [ Failure ] +crbug.com/591099 fast/writing-mode/vertical-rl-replaced-selection.html [ Failure Pass ] crbug.com/591099 fullscreen/full-screen-with-flex-item.html [ Failure ] crbug.com/591099 hittesting/inline-with-clip-path.html [ Failure ] crbug.com/855039 html/details_summary/details-writing-mode-align-center.html [ Failure ] @@ -539,6 +665,7 @@ crbug.com/591099 http/tests/loading/preload-picture-nested.html [ Failure ] crbug.com/591099 http/tests/loading/preload-picture-sizes-2x.html [ Failure ] crbug.com/591099 http/tests/loading/preload-picture-sizes.html [ Failure ] +crbug.com/591099 http/tests/local/blob/send-sliced-data-blob.html [ Crash Pass ] crbug.com/591099 http/tests/local/fileapi/select-dragged-file-input.html [ Skip ] crbug.com/591099 http/tests/misc/acid3.html [ Failure ] crbug.com/591099 http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ] @@ -632,7 +759,7 @@ crbug.com/591099 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Failure ] crbug.com/591099 paint/invalidation/outline/focus-continuations.html [ Failure ] crbug.com/591099 paint/invalidation/outline/focus-enable-continuations.html [ Failure ] -crbug.com/591099 paint/invalidation/outline/focus-layers.html [ Failure ] +crbug.com/591099 paint/invalidation/outline/focus-layers.html [ Crash Failure ] crbug.com/591099 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ] crbug.com/591099 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ] crbug.com/591099 paint/invalidation/outline/inline-focus.html [ Failure ] @@ -684,6 +811,7 @@ crbug.com/591099 paint/invalidation/stacking-context-lost.html [ Failure ] crbug.com/591099 paint/invalidation/svg/add-background-property-on-root.html [ Failure ] crbug.com/591099 paint/invalidation/svg/add-outline-property-on-root.html [ Failure ] +crbug.com/591099 paint/invalidation/svg/animated-path-inside-transformed-html.xhtml [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/overflow-repaint.html [ Failure ] crbug.com/591099 paint/invalidation/svg/remove-background-property-on-root.html [ Failure ] crbug.com/591099 paint/invalidation/svg/remove-outline-property-on-root.html [ Failure ] @@ -765,10 +893,9 @@ crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ] crbug.com/591099 virtual/layout_ng/ [ Skip ] crbug.com/824918 virtual/layout_ng_experimental/ [ Skip ] -crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass Timeout ] +crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/background-tab-on-submit-ctrl-click.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/background-tab-on-submit-synthesized-ctrl-click.html [ Failure ] -crbug.com/591099 virtual/mouseevent_fractional/fast/events/select-element.html [ Failure Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass ] @@ -785,11 +912,9 @@ crbug.com/591099 virtual/spv2/paint/invalidation/box/margin.html [ Failure Pass ] crbug.com/591099 virtual/stable/ [ Skip ] crbug.com/591099 virtual/threaded/ [ Skip ] -crbug.com/591099 virtual/user-activation-v2/fast/dom/Window/window-lookup-precedence.html [ Failure Pass ] crbug.com/591099 virtual/user-activation-v2/fast/events/background-tab-on-submit-ctrl-click.html [ Failure ] crbug.com/591099 virtual/user-activation-v2/fast/events/background-tab-on-submit-synthesized-ctrl-click.html [ Failure ] crbug.com/591099 virtual/user-activation-v2/fast/events/mouse-cursor.html [ Failure ] -crbug.com/591099 virtual/user-activation-v2/fast/events/select-element.html [ Failure Pass ] crbug.com/591099 virtual/user-activation-v2/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 virtual/user-activation-v2/fullscreen/full-screen-with-flex-item.html [ Failure ] crbug.com/591099 virtual/video-surface-layer/media/picture-in-picture/controls/picture-in-picture-button.html [ Pass ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees index fd6394b9..0cbf896 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
@@ -160,6 +160,8 @@ crbug.com/855702 virtual/threaded/animations/img-element-transform.html [ Timeout Failure Pass ] crbug.com/855702 virtual/threaded/animations/compositor-independent-transform-cancel.html [ Failure ] +crbug.com/861824 virtual/threaded/fast/animationworklet/animation-worklet-inside-iframe.html [ Failure ] + # These scrollbar tests should pass. Bug(none) virtual/prefer_compositing_to_lcd_text/scrollbars/ [ Pass ] crbug.com/836912 compositing/rtl/rtl-absolute-overflow.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 5221a67..80e7d91 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2730,12 +2730,6 @@ crbug.com/849859 external/wpt/web-animations/timing-model/animations/pausing-an-animation.html [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 external/wpt/svg/shapes/ellipse-05.svg [ Failure ] -crbug.com/626703 external/wpt/svg/shapes/ellipse-06.svg [ Failure ] -crbug.com/626703 external/wpt/svg/shapes/ellipse-08.svg [ Failure ] -crbug.com/626703 external/wpt/svg/shapes/ellipse-03.svg [ Failure ] -crbug.com/626703 external/wpt/svg/shapes/ellipse-07.svg [ Failure ] -crbug.com/626703 external/wpt/svg/shapes/ellipse-02.svg [ Failure ] crbug.com/626703 external/wpt/svg/rendering/order/z-index.svg [ Failure ] crbug.com/626703 external/wpt/websockets/Create-on-worker-shutdown.any.html [ Timeout ] crbug.com/626703 external/wpt/web-animations/timing-model/timelines/update-and-send-events.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 16b6b292..56a2123a 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -158262,6 +158262,11 @@ {} ] ], + "interfaces/netinfo.idl": [ + [ + {} + ] + ], "interfaces/orientation-event.idl": [ [ {} @@ -158282,6 +158287,11 @@ {} ] ], + "interfaces/payment-method-basic-card.idl": [ + [ + {} + ] + ], "interfaces/payment-request.idl": [ [ {} @@ -160037,6 +160047,11 @@ {} ] ], + "netinfo/idlharness.any.worker-expected.txt": [ + [ + {} + ] + ], "notifications/META.yml": [ [ {} @@ -160582,6 +160597,11 @@ {} ] ], + "payment-request/idlharness.https.window-expected.txt": [ + [ + {} + ] + ], "payment-request/interfaces.https-expected.txt": [ [ {} @@ -169402,6 +169422,21 @@ {} ] ], + "web-animations/animation-model/animation-types/accumulation-per-property-expected.txt": [ + [ + {} + ] + ], + "web-animations/animation-model/animation-types/addition-per-property-expected.txt": [ + [ + {} + ] + ], + "web-animations/animation-model/animation-types/interpolation-per-property-expected.txt": [ + [ + {} + ] + ], "web-animations/animation-model/animation-types/property-list.js": [ [ {} @@ -187237,6 +187272,12 @@ {} ] ], + "content-security-policy/worker-src/dedicated-worker-src-child-fallback-blocked.sub.html": [ + [ + "/content-security-policy/worker-src/dedicated-worker-src-child-fallback-blocked.sub.html", + {} + ] + ], "content-security-policy/worker-src/dedicated-worker-src-child-fallback.sub.html": [ [ "/content-security-policy/worker-src/dedicated-worker-src-child-fallback.sub.html", @@ -187291,6 +187332,12 @@ {} ] ], + "content-security-policy/worker-src/service-worker-src-child-fallback-blocked.https.sub.html": [ + [ + "/content-security-policy/worker-src/service-worker-src-child-fallback-blocked.https.sub.html", + {} + ] + ], "content-security-policy/worker-src/service-worker-src-child-fallback.https.sub.html": [ [ "/content-security-policy/worker-src/service-worker-src-child-fallback.https.sub.html", @@ -187345,6 +187392,12 @@ {} ] ], + "content-security-policy/worker-src/shared-worker-src-child-fallback-blocked.sub.html": [ + [ + "/content-security-policy/worker-src/shared-worker-src-child-fallback-blocked.sub.html", + {} + ] + ], "content-security-policy/worker-src/shared-worker-src-child-fallback.sub.html": [ [ "/content-security-policy/worker-src/shared-worker-src-child-fallback.sub.html", @@ -227315,6 +227368,16 @@ {} ] ], + "netinfo/idlharness.any.js": [ + [ + "/netinfo/idlharness.any.html", + {} + ], + [ + "/netinfo/idlharness.any.worker.html", + {} + ] + ], "netinfo/netinfo-basics.html": [ [ "/netinfo/netinfo-basics.html", @@ -237019,6 +237082,12 @@ {} ] ], + "payment-method-basic-card/idlharness.window.js": [ + [ + "/payment-method-basic-card/idlharness.window.html", + {} + ] + ], "payment-method-basic-card/payment-request-canmakepayment-method.https.html": [ [ "/payment-method-basic-card/payment-request-canmakepayment-method.https.html", @@ -237127,9 +237196,9 @@ {} ] ], - "payment-request/interfaces.https.html": [ + "payment-request/idlharness.https.window.js": [ [ - "/payment-request/interfaces.https.html", + "/payment-request/idlharness.https.window.html", {} ] ], @@ -277599,7 +277668,7 @@ "support" ], "content-security-policy/support/dedicated-worker-helper.js": [ - "c2ee371b1ca6b56d4579032db79470d38dc7fad9", + "f639d5dc27035efded725cf52849542a41be244a", "support" ], "content-security-policy/support/document-write-alert-fail.js": [ @@ -277711,11 +277780,11 @@ "support" ], "content-security-policy/support/service-worker-helper.js": [ - "dada4b697830bd56b771e02de8460dffcb3a494e", + "ffeb07440ac35d0b28cfb794b6644ac7c29d4906", "support" ], "content-security-policy/support/shared-worker-helper.js": [ - "7e7b17341425d222d440f2f4607ee40ff020efe6", + "432e0b740095aa98e72998a9f98ada0650ef1b08", "support" ], "content-security-policy/support/siblingPath.js": [ @@ -277902,6 +277971,10 @@ "ec579a530ae0f44e387ed400d5b923cdb8203dc7", "testharness" ], + "content-security-policy/worker-src/dedicated-worker-src-child-fallback-blocked.sub.html": [ + "fed3835538da7901920652ab97e6d0c5dba6d9b4", + "testharness" + ], "content-security-policy/worker-src/dedicated-worker-src-child-fallback.sub.html": [ "1206a6f00c5cf43da1327625fb7c97ce9f63a868", "testharness" @@ -277938,6 +278011,10 @@ "561c9a2ce0d4c1b9e148cad2ca5bad4b17517e9e", "testharness" ], + "content-security-policy/worker-src/service-worker-src-child-fallback-blocked.https.sub.html": [ + "f939b41fec58bcefd86e0e1f942d1c399592a043", + "testharness" + ], "content-security-policy/worker-src/service-worker-src-child-fallback.https.sub.html": [ "90d70a062e718daf5013f3b12662066b6edb1692", "testharness" @@ -277974,6 +278051,10 @@ "ff4d7ca289ea20fa00bca535fdcf929876a2278b", "testharness" ], + "content-security-policy/worker-src/shared-worker-src-child-fallback-blocked.sub.html": [ + "8cd3dc4fc6fee0a9508ab6911f1b86c1199b86f7", + "testharness" + ], "content-security-policy/worker-src/shared-worker-src-child-fallback.sub.html": [ "8cc98872cd4fe0ed2e411d74ba4c79684fb1b312", "testharness" @@ -316215,7 +316296,7 @@ "testharness" ], "css/css-properties-values-api/registered-property-computation.html": [ - "e5241ea91d80edd7e7bd87ef3073d1976656e6d3", + "10e9775e5331ac0b765aa03e66e0d6cc80063cfb", "testharness" ], "css/css-properties-values-api/registered-property-cssom.html": [ @@ -376510,6 +376591,10 @@ "378af7beb3cf20086cec84840286f5e2a33f850c", "support" ], + "interfaces/netinfo.idl": [ + "357a99c1a5cb73265ee63d1ab1a0e413c6ced458", + "support" + ], "interfaces/orientation-event.idl": [ "0188bd03cdd323e354e8e7c3d279c6983f701378", "support" @@ -376526,8 +376611,12 @@ "c47c18345c06d87b7b9fe318b22d51413603f626", "support" ], + "interfaces/payment-method-basic-card.idl": [ + "9084a6098bc6e4b9c41532ec95a4de2193454404", + "support" + ], "interfaces/payment-request.idl": [ - "669b8faf18cb5c12f135e991279b90a48d71ee97", + "75b25f49f12c282187aec91cfc59b92867ffa0ad", "support" ], "interfaces/performance-timeline.idl": [ @@ -378063,7 +378152,7 @@ "support" ], "mixed-content/META.yml": [ - "52a129de7ed7cfd3cb474655290348457ecf3eef", + "acf85de62f4f8213fe780ee74eee47f6d3be2fc2", "support" ], "mixed-content/OWNERS": [ @@ -379778,6 +379867,14 @@ "cf7c4eaf7a7a55a74da91284f69dab004682f1bb", "support" ], + "netinfo/idlharness.any.js": [ + "0011632bd063fb72229a3a29695883dfa977c23b", + "testharness" + ], + "netinfo/idlharness.any.worker-expected.txt": [ + "b68161a7723f4e0c4b77faf8884e5d81389944cf", + "support" + ], "netinfo/netinfo-basics.html": [ "972b4048bbb74e1489329ae48759b587b9ad3800", "testharness" @@ -386794,6 +386891,10 @@ "01e6ebc11174b8de17212aaf004890685bd90fae", "manual" ], + "payment-method-basic-card/idlharness.window.js": [ + "0219c2651ea2bd20d1c694f4f450646a38b8513f", + "testharness" + ], "payment-method-basic-card/payment-request-canmakepayment-method.https-expected.txt": [ "da4907d81ce5375d90c80196b63aca3b44748627", "support" @@ -386954,14 +387055,18 @@ "6695acdcd1647fdd37702a7f63658dcd50f25596", "testharness" ], + "payment-request/idlharness.https.window-expected.txt": [ + "4820c131955ad8ac437f54e4a260f8393784df12", + "support" + ], + "payment-request/idlharness.https.window.js": [ + "f79dbdeb7275cea54a8dd8329fc1802dbd91743f", + "testharness" + ], "payment-request/interfaces.https-expected.txt": [ "92c5778c542afb2ac71b3854a8bf6d6741cc24f9", "support" ], - "payment-request/interfaces.https.html": [ - "d269e8378f2a84ba96c981536667817e0db9e2d1", - "testharness" - ], "payment-request/onpaymentmenthodchange-attribute.https-expected.txt": [ "5e4e265d0bdaa24256b372e69ed7921aa9ffca15", "support" @@ -388227,7 +388332,7 @@ "support" ], "referrer-policy/META.yml": [ - "f4454894fc36bdc73ea3fde9d4b97efb5c999b2f", + "308ca26ec2e8d500a9016b8d51fce21d87e1e9af", "support" ], "referrer-policy/OWNERS": [ @@ -404738,10 +404843,18 @@ "9dfaf5979c3bf30bf075b3929ac3620954e83497", "support" ], + "web-animations/animation-model/animation-types/accumulation-per-property-expected.txt": [ + "54972d5b282adfb6f885c08a1788642de11a341b", + "support" + ], "web-animations/animation-model/animation-types/accumulation-per-property.html": [ "40be406294368fc2eccb9a4e525c1f2bb40a3683", "testharness" ], + "web-animations/animation-model/animation-types/addition-per-property-expected.txt": [ + "75d46e1681711c4de6e134161440bcb6c153d5e2", + "support" + ], "web-animations/animation-model/animation-types/addition-per-property.html": [ "0077ef18e19f57f2f6b1b312079a9c8d03bd1714", "testharness" @@ -404750,12 +404863,16 @@ "f3e48d8ddd42f1eecb36af2a8e1cfade6d0a02d4", "testharness" ], + "web-animations/animation-model/animation-types/interpolation-per-property-expected.txt": [ + "fa4e2f2443ba373f32b470f52923c8f28bfd4754", + "support" + ], "web-animations/animation-model/animation-types/interpolation-per-property.html": [ "ab09cd8b77d05a1036f9976c3f0e92a6d9e183f3", "testharness" ], "web-animations/animation-model/animation-types/property-list.js": [ - "a6c524f515065db203ae5395f699b857eb279cd4", + "f98e619ad0a50d3e7c0dd8fecfb6c577a8a9ffae", "support" ], "web-animations/animation-model/animation-types/property-types.js": [ @@ -407751,7 +407868,7 @@ "testharness" ], "websockets/META.yml": [ - "417baa06a0b769e413c8c547f712db2b45b5f317", + "bcc53062d41d325f706f0016704f1d102b2dfa99", "support" ], "websockets/OWNERS": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/netinfo.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/netinfo.idl new file mode 100644 index 0000000..75edd350 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/netinfo.idl
@@ -0,0 +1,45 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content of this file was automatically extracted from the +// "Network Information API" spec. +// See: https://wicg.github.io/netinfo/ + +enum ConnectionType { + "bluetooth", + "cellular", + "ethernet", + "mixed", + "none", + "other", + "unknown", + "wifi", + "wimax" +}; +enum EffectiveConnectionType { + "2g", + "3g", + "4g", + "slow-2g" +}; +[NoInterfaceObject, + Exposed=(Window,Worker)] +interface NavigatorNetworkInformation { + readonly attribute NetworkInformation connection; +}; + +Navigator implements NavigatorNetworkInformation; + +WorkerNavigator implements NavigatorNetworkInformation; +[Exposed=(Window,Worker)] +interface NetworkInformation : EventTarget { + readonly attribute ConnectionType type; + readonly attribute EffectiveConnectionType effectiveType; + readonly attribute Megabit downlinkMax; + readonly attribute Megabit downlink; + readonly attribute Millisecond rtt; + readonly attribute boolean saveData; + attribute EventHandler onchange; +}; + +typedef unrestricted double Megabit; + +typedef unsigned long long Millisecond;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-method-basic-card.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-method-basic-card.idl new file mode 100644 index 0000000..02479217 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-method-basic-card.idl
@@ -0,0 +1,20 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content of this file was automatically extracted from the +// "Payment Method: Basic Card" spec. +// See: https://w3c.github.io/payment-method-basic-card/ + +dictionary BasicCardRequest { + sequence<DOMString> supportedNetworks; + sequence<BasicCardType> supportedTypes; + }; + + enum BasicCardType { "credit", "debit", "prepaid" }; + + dictionary BasicCardResponse { + required DOMString cardNumber; + DOMString cardholderName; + DOMString cardSecurityCode; + DOMString expiryMonth; + DOMString expiryYear; + PaymentAddress? billingAddress; + };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl index 94e1cf91..0c0a3f4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/payment-request.idl
@@ -38,8 +38,9 @@ required PaymentItem total; }; dictionary PaymentDetailsUpdate : PaymentDetailsBase { - DOMString error; - PaymentItem total; + DOMString error; + PaymentItem total; + AddressErrorFields shippingAddressErrors; }; dictionary PaymentDetailsModifier { required DOMString supportedMethods; @@ -100,6 +101,20 @@ DOMString recipient; DOMString phone; }; +dictionary AddressErrorFields { + DOMString addressLineError; + DOMString cityError; + DOMString countryError; + DOMString dependentLocalityError; + DOMString languageCodeError; + DOMString organizationError; + DOMString phoneError; + DOMString postalCodeError; + DOMString recipientError; + DOMString regionError; + DOMString regionCodeError; + DOMString sortingCodeError; +}; dictionary PaymentShippingOption { required DOMString id; required DOMString label;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mixed-content/META.yml b/third_party/WebKit/LayoutTests/external/wpt/mixed-content/META.yml index 6323e4c..a6e480d9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mixed-content/META.yml +++ b/third_party/WebKit/LayoutTests/external/wpt/mixed-content/META.yml
@@ -1,2 +1,2 @@ suggested_reviewers: - - kristijanburnik + - andypaicu
diff --git a/third_party/WebKit/LayoutTests/external/wpt/netinfo/idlharness.any.js b/third_party/WebKit/LayoutTests/external/wpt/netinfo/idlharness.any.js new file mode 100644 index 0000000..d8e1561 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/netinfo/idlharness.any.js
@@ -0,0 +1,19 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +// https://wicg.github.io/netinfo/ + +idl_test( + ['netinfo'], + ['html', 'dom'], + idl_array => { + idl_array.add_objects({ NetworkInformation: ['navigator.connection'] }); + if (self.isWorker) { + idl_array.add_objects({ WorkerNavigator: ['navigator'] }); + } else { + idl_array.add_objects({ Navigator: ['navigator'] }); + } + }, + 'netinfo interfaces.');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/netinfo/idlharness.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/netinfo/idlharness.any.worker-expected.txt new file mode 100644 index 0000000..e1a5ad0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/netinfo/idlharness.any.worker-expected.txt
@@ -0,0 +1,37 @@ +This is a testharness.js-based test. +PASS netinfo interfaces. +PASS NetworkInformation interface: existence and properties of interface object +PASS NetworkInformation interface object length +PASS NetworkInformation interface object name +PASS NetworkInformation interface: existence and properties of interface prototype object +PASS NetworkInformation interface: existence and properties of interface prototype object's "constructor" property +PASS NetworkInformation interface: existence and properties of interface prototype object's @@unscopables property +PASS NetworkInformation interface: attribute type +PASS Unscopable handled correctly for type property on NetworkInformation +PASS NetworkInformation interface: attribute effectiveType +PASS Unscopable handled correctly for effectiveType property on NetworkInformation +PASS NetworkInformation interface: attribute downlinkMax +PASS Unscopable handled correctly for downlinkMax property on NetworkInformation +PASS NetworkInformation interface: attribute downlink +PASS Unscopable handled correctly for downlink property on NetworkInformation +PASS NetworkInformation interface: attribute rtt +PASS Unscopable handled correctly for rtt property on NetworkInformation +PASS NetworkInformation interface: attribute saveData +PASS Unscopable handled correctly for saveData property on NetworkInformation +PASS NetworkInformation interface: attribute onchange +PASS Unscopable handled correctly for onchange property on NetworkInformation +PASS NetworkInformation must be primary interface of navigator.connection +PASS Stringification of navigator.connection +PASS NetworkInformation interface: navigator.connection must inherit property "type" with the proper type +PASS NetworkInformation interface: navigator.connection must inherit property "effectiveType" with the proper type +PASS NetworkInformation interface: navigator.connection must inherit property "downlinkMax" with the proper type +PASS NetworkInformation interface: navigator.connection must inherit property "downlink" with the proper type +PASS NetworkInformation interface: navigator.connection must inherit property "rtt" with the proper type +PASS NetworkInformation interface: navigator.connection must inherit property "saveData" with the proper type +PASS NetworkInformation interface: navigator.connection must inherit property "onchange" with the proper type +PASS Navigator interface: existence and properties of interface object +FAIL Navigator interface: navigator must not have property "connection" assert_false: expected false got true +PASS WorkerNavigator interface: attribute connection +PASS Unscopable handled correctly for connection property on WorkerNavigator +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-method-basic-card/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/payment-method-basic-card/idlharness.window.js new file mode 100644 index 0000000..a1078c6 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-method-basic-card/idlharness.window.js
@@ -0,0 +1,12 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +// https://w3c.github.io/payment-method-basic-card/ + +idl_test( + ['payment-method-basic-card'], + [], // No deps + null, // No objects + 'payment-method-basic-card interfaces.');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt new file mode 100644 index 0000000..32e5de76 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window-expected.txt
@@ -0,0 +1,106 @@ +This is a testharness.js-based test. +PASS Setup for Payment Request API IDL tests. +PASS PaymentRequest interface: existence and properties of interface object +PASS PaymentRequest interface object length +PASS PaymentRequest interface object name +PASS PaymentRequest interface: existence and properties of interface prototype object +PASS PaymentRequest interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentRequest interface: existence and properties of interface prototype object's @@unscopables property +PASS PaymentRequest interface: operation show([object Object]) +PASS Unscopable handled correctly for show([object Object]) on PaymentRequest +PASS PaymentRequest interface: operation abort() +PASS Unscopable handled correctly for abort() on PaymentRequest +PASS PaymentRequest interface: operation canMakePayment() +PASS Unscopable handled correctly for canMakePayment() on PaymentRequest +PASS PaymentRequest interface: attribute id +PASS Unscopable handled correctly for id property on PaymentRequest +PASS PaymentRequest interface: attribute shippingAddress +PASS Unscopable handled correctly for shippingAddress property on PaymentRequest +PASS PaymentRequest interface: attribute shippingOption +PASS Unscopable handled correctly for shippingOption property on PaymentRequest +PASS PaymentRequest interface: attribute shippingType +PASS Unscopable handled correctly for shippingType property on PaymentRequest +PASS PaymentRequest interface: attribute onshippingaddresschange +PASS Unscopable handled correctly for onshippingaddresschange property on PaymentRequest +PASS PaymentRequest interface: attribute onshippingoptionchange +PASS Unscopable handled correctly for onshippingoptionchange property on PaymentRequest +PASS PaymentRequest must be primary interface of paymentRequest +PASS Stringification of paymentRequest +PASS PaymentRequest interface: paymentRequest must inherit property "show([object Object])" with the proper type +PASS PaymentRequest interface: calling show([object Object]) on paymentRequest with too few arguments must throw TypeError +PASS PaymentRequest interface: paymentRequest must inherit property "abort()" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "canMakePayment()" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "id" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "shippingAddress" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "shippingOption" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "shippingType" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "onshippingaddresschange" with the proper type +PASS PaymentRequest interface: paymentRequest must inherit property "onshippingoptionchange" with the proper type +PASS PaymentAddress interface: existence and properties of interface object +PASS PaymentAddress interface object length +PASS PaymentAddress interface object name +PASS PaymentAddress interface: existence and properties of interface prototype object +PASS PaymentAddress interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentAddress interface: existence and properties of interface prototype object's @@unscopables property +PASS PaymentAddress interface: operation toJSON() +PASS Unscopable handled correctly for toJSON() on PaymentAddress +PASS PaymentAddress interface: attribute city +PASS Unscopable handled correctly for city property on PaymentAddress +PASS PaymentAddress interface: attribute country +PASS Unscopable handled correctly for country property on PaymentAddress +PASS PaymentAddress interface: attribute dependentLocality +PASS Unscopable handled correctly for dependentLocality property on PaymentAddress +PASS PaymentAddress interface: attribute languageCode +PASS Unscopable handled correctly for languageCode property on PaymentAddress +PASS PaymentAddress interface: attribute organization +PASS Unscopable handled correctly for organization property on PaymentAddress +PASS PaymentAddress interface: attribute phone +PASS Unscopable handled correctly for phone property on PaymentAddress +PASS PaymentAddress interface: attribute postalCode +PASS Unscopable handled correctly for postalCode property on PaymentAddress +PASS PaymentAddress interface: attribute recipient +PASS Unscopable handled correctly for recipient property on PaymentAddress +PASS PaymentAddress interface: attribute region +PASS Unscopable handled correctly for region property on PaymentAddress +FAIL PaymentAddress interface: attribute regionCode assert_true: The prototype object must have a property "regionCode" expected true got false +PASS Unscopable handled correctly for regionCode property on PaymentAddress +PASS PaymentAddress interface: attribute sortingCode +PASS Unscopable handled correctly for sortingCode property on PaymentAddress +PASS PaymentAddress interface: attribute addressLine +PASS Unscopable handled correctly for addressLine property on PaymentAddress +PASS PaymentResponse interface: existence and properties of interface object +PASS PaymentResponse interface object length +PASS PaymentResponse interface object name +PASS PaymentResponse interface: existence and properties of interface prototype object +PASS PaymentResponse interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentResponse interface: existence and properties of interface prototype object's @@unscopables property +PASS PaymentResponse interface: operation toJSON() +PASS Unscopable handled correctly for toJSON() on PaymentResponse +PASS PaymentResponse interface: attribute requestId +PASS Unscopable handled correctly for requestId property on PaymentResponse +PASS PaymentResponse interface: attribute methodName +PASS Unscopable handled correctly for methodName property on PaymentResponse +PASS PaymentResponse interface: attribute details +PASS Unscopable handled correctly for details property on PaymentResponse +PASS PaymentResponse interface: attribute shippingAddress +PASS Unscopable handled correctly for shippingAddress property on PaymentResponse +PASS PaymentResponse interface: attribute shippingOption +PASS Unscopable handled correctly for shippingOption property on PaymentResponse +PASS PaymentResponse interface: attribute payerName +PASS Unscopable handled correctly for payerName property on PaymentResponse +PASS PaymentResponse interface: attribute payerEmail +PASS Unscopable handled correctly for payerEmail property on PaymentResponse +PASS PaymentResponse interface: attribute payerPhone +PASS Unscopable handled correctly for payerPhone property on PaymentResponse +PASS PaymentResponse interface: operation complete(PaymentComplete) +PASS Unscopable handled correctly for complete(PaymentComplete) on PaymentResponse +PASS PaymentRequestUpdateEvent interface: existence and properties of interface object +PASS PaymentRequestUpdateEvent interface object length +PASS PaymentRequestUpdateEvent interface object name +PASS PaymentRequestUpdateEvent interface: existence and properties of interface prototype object +PASS PaymentRequestUpdateEvent interface: existence and properties of interface prototype object's "constructor" property +PASS PaymentRequestUpdateEvent interface: existence and properties of interface prototype object's @@unscopables property +PASS PaymentRequestUpdateEvent interface: operation updateWith([object Object]) +PASS Unscopable handled correctly for updateWith([object Object]) on PaymentRequestUpdateEvent +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js new file mode 100644 index 0000000..1efdfb2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/payment-request/idlharness.https.window.js
@@ -0,0 +1,26 @@ +// META: script=/resources/WebIDLParser.js +// META: script=/resources/idlharness.js + +'use strict'; + +// https://w3c.github.io/payment-request/ + +idl_test( + ['payment-request'], + ['dom', 'html'], + idlArray => { + try { + const methods = [{supportedMethods: 'foo'}]; + const amount = {currency: 'USD', value: '0'}; + const details = {total: {label: 'bar', amount: amount} }; + window.paymentRequest = new PaymentRequest(methods, details); + } catch (e) { + // Will be surfaced in idlharness.js's test_object below. + } + + idlArray.add_objects({ + PaymentRequest: ['paymentRequest'], + }); + }, + 'Setup for Payment Request API IDL tests.' +);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html deleted file mode 100644 index a7ec323..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/payment-request/interfaces.https.html +++ /dev/null
@@ -1,32 +0,0 @@ -<!doctype html> -<meta charset=utf-8> -<title>Payment Request interface IDL tests</title> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> -<script src=/resources/WebIDLParser.js></script> -<script src=/resources/idlharness.js></script> -<script> -promise_test(async () => { - const urls = ["/interfaces/dom.idl", "/interfaces/payment-request.idl"]; - const [dom, payment_request] = await Promise.all( - urls.map(url => fetch(url).then(r => r.text()))); - const idlArray = new IdlArray(); - idlArray.add_untested_idls(dom); - idlArray.add_idls(payment_request); - - // typedef EventHandler from HTML - // https://html.spec.whatwg.org/#eventhandler - idlArray.add_idls(` - [TreatNonObjectAsNull] - callback EventHandlerNonNull = any (Event event); - typedef EventHandlerNonNull? EventHandler; - `); - const methods = "[{supportedMethods: 'foo'}]"; - const amount = "{currency: 'USD', value: '0'}"; - const details = `{total: {label: 'bar', amount: ${amount}} }`; - idlArray.add_objects({ - PaymentRequest: [`new PaymentRequest(${methods}, ${details})`], - }); - idlArray.test(); -}, "Setup for Payment Request API IDL tests."); -</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/get-invalid-entries.html b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/get-invalid-entries.html new file mode 100644 index 0000000..33d6589 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/get-invalid-entries.html
@@ -0,0 +1,27 @@ +<!doctype html> +<html> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> +async_test(function(t) { + performance.mark('windowMark'); + const worker = new Worker("resources/worker-invalid-entries.js"); + worker.onmessage = function(event) { + assert_equals(event.data['invalid'], 0, 'The worker must have 0 invalid entries.'); + assert_equals(event.data['mark'], 1, 'The worker must have 1 mark entry.'); + assert_equals(event.data['measure'], 0, 'The worker must have 0 measure entries.'); + assert_equals(performance.getEntriesByType('invalid').length, 0, + 'The window must have 0 invalid entries.'); + assert_equals(performance.getEntriesByType('mark').length, 1, + 'The window must have 1 mark entry.'); + assert_equals(performance.getEntriesByType('measure').length, 0, + 'The window must have 0 measure entries.') + t.done(); + } +}, 'Get invalid entries from worker and window.'); +</script> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/resources/worker-invalid-entries.js b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/resources/worker-invalid-entries.js new file mode 100644 index 0000000..bd7fba2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/performance-timeline/resources/worker-invalid-entries.js
@@ -0,0 +1,6 @@ +performance.mark('workerMark'); +postMessage({ + 'invalid' : performance.getEntriesByType('invalid').length, + 'mark' : performance.getEntriesByType('mark').length, + 'measure' : performance.getEntriesByType('measure').length +});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/META.yml b/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/META.yml index 7e9d06b34..0b081a4b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/META.yml +++ b/third_party/WebKit/LayoutTests/external/wpt/referrer-policy/META.yml
@@ -1,5 +1,4 @@ suggested_reviewers: - estark37 - jeisinger - - kristijanburnik - domfarolino
diff --git a/third_party/WebKit/LayoutTests/external/wpt/websockets/META.yml b/third_party/WebKit/LayoutTests/external/wpt/websockets/META.yml index fe75a79..d53bd7c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/websockets/META.yml +++ b/third_party/WebKit/LayoutTests/external/wpt/websockets/META.yml
@@ -1,5 +1,4 @@ suggested_reviewers: - - kristijanburnik - zqzhang - Jxck - jdm
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames-expected.txt new file mode 100644 index 0000000..34f098f --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames-expected.txt
@@ -0,0 +1,57 @@ +Tests inline values rendering while stepping between call frames. + +=========== 11< ========== +[11] > debugger; +[12] var sameName = 'foo'; +[13] innerFunction('not-foo'); +[14] } +[15] +[16] function innerFunction(sameName) { +[17] return; +[18] } +=========== 11< ========== +[11] debugger; +[12] > var sameName = 'foo'; +[13] innerFunction('not-foo'); +[14] } +[15] +[16] function innerFunction(sameName) { +[17] return; +[18] } +=========== 11< ========== +[11] debugger; +[12] var sameName = 'foo'; sameName = "foo" +[13] > innerFunction('not-foo'); +[14] } +[15] +[16] function innerFunction(sameName) { +[17] return; +[18] } +=========== 11< ========== +[11] debugger; +[12] var sameName = 'foo'; +[13] innerFunction('not-foo'); +[14] } +[15] +[16] function innerFunction(sameName) { sameName = "not-foo" +[17] > return; +[18] } +=========== 11< ========== +[11] debugger; +[12] var sameName = 'foo'; +[13] innerFunction('not-foo'); +[14] } +[15] +[16] function innerFunction(sameName) { sameName = "not-foo" +[17] > return; +[18] } +=========== 11< ========== +[11] debugger; +[12] var sameName = 'foo'; sameName = "foo" +[13] innerFunction('not-foo'); +[14] > } +[15] +[16] function innerFunction(sameName) { +[17] return; +[18] } +
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames.js new file mode 100644 index 0000000..a005a26c --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-ui/debugger-inline-values-frames.js
@@ -0,0 +1,61 @@ +// 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. + +(async function() { + TestRunner.addResult(`Tests inline values rendering while stepping between call frames.\n`); + await TestRunner.loadModule('sources_test_runner'); + await TestRunner.showPanel('sources'); + await TestRunner.evaluateInPagePromise(` + function testFunction() + { + debugger; + var sameName = 'foo'; + innerFunction('not-foo'); + } + + function innerFunction(sameName) { + return; + } + `); + + SourcesTestRunner.startDebuggerTest(runTestFunction); + SourcesTestRunner.setQuiet(true); + + var stepCount = 0; + + function runTestFunction() { + TestRunner.addSniffer( + Sources.DebuggerPlugin.prototype, '_executionLineChanged', + onSetExecutionLocation); + TestRunner.evaluateInPage('setTimeout(testFunction, 0)'); + } + + function onSetExecutionLocation(liveLocation) { + TestRunner.deprecatedRunAfterPendingDispatches(dumpAndContinue.bind( + null, this._textEditor, liveLocation.uiLocation().lineNumber)); + } + + function dumpAndContinue(textEditor, lineNumber) { + var startLine = 11; + var endLine = 19; + TestRunner.addResult(`=========== ${startLine}< ==========`); + var lineCount = endLine - startLine; + for (var i = startLine; i < endLine; ++i) { + var output = ['[' + (i < lineCount ? ' ' : '') + i + ']']; + output.push(i == lineNumber ? '>' : ' '); + output.push(textEditor.line(i)); + output.push('\t'); + textEditor._decorations.get(i).forEach(decoration => output.push(decoration.element.deepTextContent())); + TestRunner.addResult(output.join(' ')); + } + + TestRunner.addSniffer( + Sources.DebuggerPlugin.prototype, '_executionLineChanged', + onSetExecutionLocation); + if (++stepCount < 6) + SourcesTestRunner.stepInto(); + else + SourcesTestRunner.completeDebuggerTest(); + } +})();
diff --git a/third_party/WebKit/LayoutTests/svg/custom/SVGEllipse-without-rx-or-ry-expected.svg b/third_party/WebKit/LayoutTests/svg/custom/SVGEllipse-without-rx-or-ry-expected.svg index cfaad28..db7c1615 100644 --- a/third_party/WebKit/LayoutTests/svg/custom/SVGEllipse-without-rx-or-ry-expected.svg +++ b/third_party/WebKit/LayoutTests/svg/custom/SVGEllipse-without-rx-or-ry-expected.svg
@@ -1,13 +1,13 @@ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> - <ellipse rx="0" + <ellipse rx="50" ry="50" cx="100" cy="100" fill="green"/> <ellipse rx="80" - ry="0" + ry="80" cx="280" cy="100" fill="green"/> -</svg> \ No newline at end of file +</svg>
diff --git a/third_party/android_async_task/OWNERS b/third_party/android_async_task/OWNERS index ea4b4f3e..ceb69e5 100644 --- a/third_party/android_async_task/OWNERS +++ b/third_party/android_async_task/OWNERS
@@ -1,3 +1,4 @@ +agrieve@chromium.org hartmanng@chromium.org torne@chromium.org wnwen@chromium.org
diff --git a/third_party/blink/renderer/core/dom/accessible_node.cc b/third_party/blink/renderer/core/dom/accessible_node.cc index 4102ae4b..3654c6c 100644 --- a/third_party/blink/renderer/core/dom/accessible_node.cc +++ b/third_party/blink/renderer/core/dom/accessible_node.cc
@@ -644,9 +644,7 @@ void AccessibleNode::setCurrent(const AtomicString& current) { SetStringProperty(AOMStringProperty::kCurrent, current); - - if (AXObjectCache* cache = GetAXObjectCache()) - cache->HandleAttributeChanged(aria_currentAttr, element_); + NotifyAttributeChanged(aria_currentAttr); } AccessibleNodeList* AccessibleNode::describedBy() { @@ -1173,8 +1171,12 @@ const blink::QualifiedName& attribute) { // TODO(dmazzoni): Make a cleaner API for this rather than pretending // the DOM attribute changed. - if (AXObjectCache* cache = GetAXObjectCache()) - cache->HandleAttributeChanged(attribute, element_); + if (AXObjectCache* cache = GetAXObjectCache()) { + if (element_) + cache->HandleAttributeChanged(attribute, element_); + else + cache->HandleAttributeChanged(attribute, this); + } } AXObjectCache* AccessibleNode::GetAXObjectCache() {
diff --git a/third_party/blink/renderer/core/dom/ax_object_cache.h b/third_party/blink/renderer/core/dom/ax_object_cache.h index 911d194..afe5bbb 100644 --- a/third_party/blink/renderer/core/dom/ax_object_cache.h +++ b/third_party/blink/renderer/core/dom/ax_object_cache.h
@@ -103,6 +103,10 @@ virtual void HandleLayoutComplete(Document*) = 0; virtual void HandleClicked(Node*) = 0; + // Changes to virtual Accessibility Object Model nodes. + virtual void HandleAttributeChanged(const QualifiedName& attr_name, + AccessibleNode*) = 0; + virtual void SetCanvasObjectBounds(HTMLCanvasElement*, Element*, const LayoutRect&) = 0;
diff --git a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_callback.cc b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_callback.cc index ef89f7a..d76ebfa 100644 --- a/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_callback.cc +++ b/third_party/blink/renderer/core/editing/spellcheck/idle_spell_check_callback.cc
@@ -29,8 +29,9 @@ namespace { -const int kColdModeTimerIntervalMS = 1000; -const int kConsecutiveColdModeTimerIntervalMS = 200; +constexpr TimeDelta kColdModeTimerInterval = TimeDelta::FromMilliseconds(1000); +constexpr TimeDelta kConsecutiveColdModeTimerInterval = + TimeDelta::FromMilliseconds(200); const int kHotModeRequestTimeoutMS = 200; const int kInvalidHandle = -1; const int kDummyHandleForForcedInvocation = -2; @@ -118,10 +119,10 @@ return; DCHECK(!cold_mode_timer_.IsActive()); - int interval_ms = state_ == State::kInColdModeInvocation - ? kConsecutiveColdModeTimerIntervalMS - : kColdModeTimerIntervalMS; - cold_mode_timer_.StartOneShot(interval_ms / 1000.0, FROM_HERE); + TimeDelta interval = state_ == State::kInColdModeInvocation + ? kConsecutiveColdModeTimerInterval + : kColdModeTimerInterval; + cold_mode_timer_.StartOneShot(interval, FROM_HERE); state_ = State::kColdModeTimerStarted; }
diff --git a/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc b/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc index f22ef3b..6a1a804 100644 --- a/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc +++ b/third_party/blink/renderer/core/exported/web_form_element_observer_impl.cc
@@ -84,9 +84,8 @@ } } else { // Either "style" or "class" was modified. Check the computed style. - HTMLElement& element = *ToHTMLElement(record->target()); CSSComputedStyleDeclaration* style = - CSSComputedStyleDeclaration::Create(&element); + CSSComputedStyleDeclaration::Create(record->target()); if (style->GetPropertyValue(CSSPropertyDisplay) == "none") { callback_->ElementWasHiddenOrRemoved(); Disconnect();
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc index d6238113..dade15e 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -106,7 +106,7 @@ namespace blink { // Timeout for link preloads to be used after window.onload -static const int kUnusedPreloadTimeoutInSeconds = 3; +static constexpr TimeDelta kUnusedPreloadTimeout = TimeDelta::FromSeconds(3); class PostMessageTimer final : public GarbageCollectedFinalized<PostMessageTimer>, @@ -1452,8 +1452,7 @@ if (GetFrame() && document_loader == GetFrame()->Loader().GetDocumentLoader() && document_loader->Fetcher()->CountPreloads()) { - unused_preloads_timer_.StartOneShot(kUnusedPreloadTimeoutInSeconds, - FROM_HERE); + unused_preloads_timer_.StartOneShot(kUnusedPreloadTimeout, FROM_HERE); } } else { DispatchEvent(load_event, document());
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc index d33fc83..1bd01d9 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc +++ b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
@@ -18,8 +18,8 @@ #include "third_party/blink/renderer/platform/graphics/image_data_buffer.h" #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/image-encoders/image_encoder_utils.h" +#include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" -#include "third_party/blink/renderer/platform/threading/background_task_runner.h" #include "third_party/blink/renderer/platform/web_task_runner.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/time.h" @@ -371,7 +371,7 @@ WrapPersistent(this))); } else { - BackgroundTaskRunner::PostOnBackgroundThread( + BackgroundScheduler::PostOnBackgroundThread( FROM_HERE, CrossThreadBind(&CanvasAsyncBlobCreator::EncodeImageOnEncoderThread, WrapCrossThreadPersistent(this), quality));
diff --git a/third_party/blink/renderer/core/html/track/vtt/vtt_region.cc b/third_party/blink/renderer/core/html/track/vtt/vtt_region.cc index e8350dea6..30af927 100644 --- a/third_party/blink/renderer/core/html/track/vtt/vtt_region.cc +++ b/third_party/blink/renderer/core/html/track/vtt/vtt_region.cc
@@ -68,7 +68,7 @@ constexpr float kLineHeight = 5.33; // Default scrolling animation time period (s). -constexpr float kScrollTime = 0.433; +constexpr TimeDelta kScrollTime = TimeDelta::FromMilliseconds(433); bool IsNonPercentage(double value, const char* method, @@ -397,7 +397,7 @@ if (scroll_timer_.IsActive()) return; - double duration = IsScrollingRegion() ? kScrollTime : 0; + TimeDelta duration = IsScrollingRegion() ? kScrollTime : TimeDelta(); scroll_timer_.StartOneShot(duration, FROM_HERE); }
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc index 4f1cd8d..2e0c5c4 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -17,7 +17,7 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h" #include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h" #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h" -#include "third_party/blink/renderer/platform/threading/background_task_runner.h" +#include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColorSpaceXformCanvas.h" #include "third_party/skia/include/core/SkImageInfo.h" @@ -1008,7 +1008,7 @@ draw_dst_rect, parsed_options.flip_y); std::unique_ptr<ParsedOptions> passed_parsed_options = std::make_unique<ParsedOptions>(parsed_options); - BackgroundTaskRunner::PostOnBackgroundThread( + BackgroundScheduler::PostOnBackgroundThread( FROM_HERE, CrossThreadBind(&RasterizeImageOnBackgroundThread, WrapCrossThreadPersistent(resolver),
diff --git a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc index d0dd1b6..076b9bee 100644 --- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc +++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_factories.cc
@@ -54,8 +54,8 @@ #include "third_party/blink/renderer/platform/cross_thread_functional.h" #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h" +#include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include "third_party/blink/renderer/platform/shared_buffer.h" -#include "third_party/blink/renderer/platform/threading/background_task_runner.h" #include "v8/include/v8.h" namespace blink { @@ -297,7 +297,7 @@ DOMArrayBuffer* array_buffer) { scoped_refptr<base::SingleThreadTaskRunner> task_runner = Platform::Current()->CurrentThread()->GetTaskRunner(); - BackgroundTaskRunner::PostOnBackgroundThread( + BackgroundScheduler::PostOnBackgroundThread( FROM_HERE, CrossThreadBind( &ImageBitmapFactories::ImageBitmapLoader::DecodeImageOnDecoderThread,
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc index 8ef57ffc..708b6779 100644 --- a/third_party/blink/renderer/core/input/event_handler.cc +++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -127,7 +127,8 @@ // The amount of time to wait for a cursor update on style and layout changes // Set to 50Hz, no need to be faster than common screen refresh rate -static const double kCursorUpdateInterval = 0.02; +static constexpr TimeDelta kCursorUpdateInterval = + TimeDelta::FromMilliseconds(20); static const int kMaximumCursorSize = 128; @@ -708,7 +709,7 @@ // the same behavior and it's more compatible with other browsers. GetSelectionController().InitializeSelectionState(); HitTestResult hit_test_result = EventHandlingUtil::HitTestResultInFrame( - frame_, document_point, HitTestRequest::kReadOnly); + frame_, HitTestLocation(document_point), HitTestRequest::kReadOnly); InputDeviceCapabilities* source_capabilities = frame_->GetDocument() ->domWindow() @@ -1460,7 +1461,7 @@ // FIXME: Unify this with the other best* functions which are very similar. TRACE_EVENT0("input", "EventHandler::bestClickableNodeForHitTestResult"); - DCHECK(result.IsRectBasedTest()); + DCHECK(location.IsRectBasedTest()); // If the touch is over a scrollbar, don't adjust the touch point since touch // adjustment only takes into account DOM nodes so a touch over a scrollbar @@ -1491,7 +1492,7 @@ const HitTestResult& result, IntPoint& target_point, Node*& target_node) { - DCHECK(result.IsRectBasedTest()); + DCHECK(location.IsRectBasedTest()); IntPoint touch_center = frame_->View()->ConvertToRootFrame(RoundedIntPoint(location.Point())); IntRect touch_rect = @@ -1707,7 +1708,7 @@ event_with_hit_test_results.GetHitTestResult().InnerElement(); // TODO(https://crbug.com/668758): Use a normal BeginFrame update for this. active_interval_timer_.StartOneShot( - (kMinimumActiveInterval - active_interval).InSecondsF(), FROM_HERE); + kMinimumActiveInterval - active_interval, FROM_HERE); } return event_with_hit_test_results; @@ -1752,7 +1753,7 @@ location, hit_type); } - if (hit_test_result.IsRectBasedTest()) { + if (location.IsRectBasedTest()) { // Adjust the location of the gesture to the most likely nearby node, as // appropriate for the type of event. ApplyTouchAdjustment(&adjusted_event, location, &hit_test_result); @@ -1765,16 +1766,16 @@ LocalFrame* hit_frame = hit_test_result.InnerNodeFrame(); if (!hit_frame) hit_frame = frame_; + location = HitTestLocation(hit_frame->View()->ConvertFromRootFrame( + LayoutPoint(adjusted_event.PositionInRootFrame()))); hit_test_result = EventHandlingUtil::HitTestResultInFrame( - hit_frame, - hit_frame->View()->ConvertFromRootFrame( - LayoutPoint(adjusted_event.PositionInRootFrame())), + hit_frame, location, (hit_type | HitTestRequest::kReadOnly) & ~HitTestRequest::kListBased); } // If we did a rect-based hit test it must be resolved to the best single node // by now to ensure consumers don't accidentally use one of the other // candidates. - DCHECK(!hit_test_result.IsRectBasedTest()); + DCHECK(!location.IsRectBasedTest()); if (ShouldApplyTouchAdjustment(gesture_event) && (gesture_event.GetType() == WebInputEvent::kGestureTap || @@ -1821,6 +1822,7 @@ if (adjusted) { LayoutPoint point = frame_->View()->ConvertFromRootFrame(adjusted_point); DCHECK(location.ContainsPoint(FloatPoint(point))); + DCHECK(location.IsRectBasedTest()); location = hit_test_result->ResolveRectBasedTest(adjusted_node, point); gesture_event->ApplyTouchAdjustment( WebFloatPoint(adjusted_point.X(), adjusted_point.Y()));
diff --git a/third_party/blink/renderer/core/input/event_handling_util.cc b/third_party/blink/renderer/core/input/event_handling_util.cc index 1f9ea6f..0ee5fc4 100644 --- a/third_party/blink/renderer/core/input/event_handling_util.cc +++ b/third_party/blink/renderer/core/input/event_handling_util.cc
@@ -18,16 +18,16 @@ HitTestResult HitTestResultInFrame( LocalFrame* frame, - const LayoutPoint& point, + const HitTestLocation& location, HitTestRequest::HitTestRequestType hit_type) { - HitTestLocation location(point); + DCHECK(!location.IsRectBasedTest()); HitTestResult result(HitTestRequest(hit_type), location); if (!frame || !frame->ContentLayoutObject()) return result; if (frame->View()) { - IntRect rect(IntPoint(), frame->View()->Size()); - if (!rect.Contains(RoundedIntPoint(point))) + FloatRect rect(FloatPoint(), FloatSize(frame->View()->Size())); + if (!location.Intersects(rect)) return result; } frame->ContentLayoutObject()->HitTest(location, result);
diff --git a/third_party/blink/renderer/core/input/event_handling_util.h b/third_party/blink/renderer/core/input/event_handling_util.h index a7a06a1..a8ccd47 100644 --- a/third_party/blink/renderer/core/input/event_handling_util.h +++ b/third_party/blink/renderer/core/input/event_handling_util.h
@@ -24,7 +24,7 @@ HitTestResult HitTestResultInFrame( LocalFrame*, - const LayoutPoint&, + const HitTestLocation&, HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kReadOnly | HitTestRequest::kActive);
diff --git a/third_party/blink/renderer/core/input/gesture_manager.cc b/third_party/blink/renderer/core/input/gesture_manager.cc index b43ff23..0011350 100644 --- a/third_party/blink/renderer/core/input/gesture_manager.cc +++ b/third_party/blink/renderer/core/input/gesture_manager.cc
@@ -196,7 +196,7 @@ adjusted_point = frame_view->ConvertFromRootFrame( FlooredIntPoint(gesture_event.PositionInRootFrame())); current_hit_test = EventHandlingUtil::HitTestResultInFrame( - frame_, adjusted_point, hit_type); + frame_, HitTestLocation(adjusted_point), hit_type); } // Capture data for showUnhandledTapUIIfNeeded. @@ -259,7 +259,7 @@ main_frame.View()->UpdateAllLifecyclePhases(); adjusted_point = frame_view->ConvertFromRootFrame(tapped_position); current_hit_test = EventHandlingUtil::HitTestResultInFrame( - frame_, adjusted_point, hit_type); + frame_, HitTestLocation(adjusted_point), hit_type); } WebMouseEvent fake_mouse_up(
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc index 648ce2e..b65d684 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.cc +++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -62,11 +62,13 @@ // The amount of time to wait before sending a fake mouse event triggered // during a scroll. -constexpr double kFakeMouseMoveIntervalDuringScroll = 0.1; +constexpr TimeDelta kFakeMouseMoveIntervalDuringScroll = + TimeDelta::FromMilliseconds(100); // The amount of time to wait before sending a fake mouse event on style and // layout changes sets to 50Hz, same as common screen refresh rate. -constexpr double kFakeMouseMoveIntervalPerFrame = 0.02; +constexpr TimeDelta kFakeMouseMoveIntervalPerFrame = + TimeDelta::FromMilliseconds(20); // TODO(crbug.com/653490): Read these values from the OS. #if defined(OS_MACOSX) @@ -624,7 +626,7 @@ // during a scroll. This avoids a potential source of scroll jank. // Or dispatch a fake mouse move to update hover states when the layout // changes. - double interval = + TimeDelta interval = fake_mouse_move_reason == MouseEventManager::FakeMouseMoveReason::kDuringScroll ? kFakeMouseMoveIntervalDuringScroll
diff --git a/third_party/blink/renderer/core/input/touch_event_manager.cc b/third_party/blink/renderer/core/input/touch_event_manager.cc index 6383a69..adc2e8d8 100644 --- a/third_party/blink/renderer/core/input/touch_event_manager.cc +++ b/third_party/blink/renderer/core/input/touch_event_manager.cc
@@ -532,11 +532,11 @@ if (touch_sequence_document_ && (!touch_node || &touch_node->GetDocument() != touch_sequence_document_)) { if (touch_sequence_document_->GetFrame()) { - LayoutPoint frame_point = LayoutPoint( + HitTestLocation location(LayoutPoint( touch_sequence_document_->GetFrame()->View()->ConvertFromRootFrame( - event.PositionInWidget())); + event.PositionInWidget()))); result = EventHandlingUtil::HitTestResultInFrame( - touch_sequence_document_->GetFrame(), frame_point, hit_type); + touch_sequence_document_->GetFrame(), location, hit_type); Node* node = result.InnerNode(); if (!node) return;
diff --git a/third_party/blink/renderer/core/layout/hit_test_result.cc b/third_party/blink/renderer/core/layout/hit_test_result.cc index 83fcfdd..c45642f 100644 --- a/third_party/blink/renderer/core/layout/hit_test_result.cc +++ b/third_party/blink/renderer/core/layout/hit_test_result.cc
@@ -50,16 +50,14 @@ HitTestResult::HitTestResult() : hit_test_request_(HitTestRequest::kReadOnly | HitTestRequest::kActive), cacheable_(true), - is_over_embedded_content_view_(false), - is_rect_based_test_(false) {} + is_over_embedded_content_view_(false) {} HitTestResult::HitTestResult(const HitTestRequest& other_request, const HitTestLocation& location) : hit_test_request_(other_request), cacheable_(true), point_in_inner_node_frame_(location.Point()), - is_over_embedded_content_view_(false), - is_rect_based_test_(location.IsRectBasedTest()) {} + is_over_embedded_content_view_(false) {} HitTestResult::HitTestResult(const HitTestResult& other) : hit_test_request_(other.hit_test_request_), @@ -71,8 +69,7 @@ inner_url_element_(other.URLElement()), scrollbar_(other.GetScrollbar()), is_over_embedded_content_view_(other.IsOverEmbeddedContentView()), - canvas_region_id_(other.CanvasRegionId()), - is_rect_based_test_(other.IsRectBasedTest()) { + canvas_region_id_(other.CanvasRegionId()) { // Only copy the NodeSet in case of list hit test. list_based_test_result_ = other.list_based_test_result_ ? new NodeSet(*other.list_based_test_result_) @@ -114,7 +111,6 @@ is_over_embedded_content_view_ = other.IsOverEmbeddedContentView(); cacheable_ = other.cacheable_; canvas_region_id_ = other.CanvasRegionId(); - is_rect_based_test_ = other.IsRectBasedTest(); // Only copy the NodeSet in case of list hit test. list_based_test_result_ = other.list_based_test_result_ @@ -455,7 +451,6 @@ HitTestLocation HitTestResult::ResolveRectBasedTest( Node* resolved_inner_node, const LayoutPoint& resolved_point_in_main_frame) { - DCHECK(IsRectBasedTest()); point_in_inner_node_frame_ = resolved_point_in_main_frame; inner_node_ = nullptr; inner_possibly_pseudo_node_ = nullptr; @@ -468,7 +463,6 @@ DCHECK(resolved_inner_node); if (auto* layout_object = resolved_inner_node->GetLayoutObject()) layout_object->UpdateHitTestResult(*this, LayoutPoint()); - is_rect_based_test_ = false; return HitTestLocation(resolved_point_in_main_frame); }
diff --git a/third_party/blink/renderer/core/layout/hit_test_result.h b/third_party/blink/renderer/core/layout/hit_test_result.h index 72147e5..817311af 100644 --- a/third_party/blink/renderer/core/layout/hit_test_result.h +++ b/third_party/blink/renderer/core/layout/hit_test_result.h
@@ -94,9 +94,6 @@ return is_over_embedded_content_view_; } - // Forwarded from HitTestLocation - bool IsRectBasedTest() const { return is_rect_based_test_; } - // The hit-tested point in the coordinates of the innerNode frame, the frame // containing innerNode. const LayoutPoint& PointInInnerNodeFrame() const { @@ -204,7 +201,6 @@ mutable Member<NodeSet> list_based_test_result_; String canvas_region_id_; - bool is_rect_based_test_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/jank_tracker.cc b/third_party/blink/renderer/core/layout/jank_tracker.cc index fab6085..24c209e 100644 --- a/third_party/blink/renderer/core/layout/jank_tracker.cc +++ b/third_party/blink/renderer/core/layout/jank_tracker.cc
@@ -15,7 +15,7 @@ namespace blink { -static const float kTimerDelay = 3.0; +static constexpr TimeDelta kTimerDelay = TimeDelta::FromSeconds(3); static const float kRegionGranularitySteps = 60.0; static FloatPoint LogicalStart(const FloatRect& rect,
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.cc b/third_party/blink/renderer/core/layout/layout_embedded_content.cc index 131aa0f..d9b5dcd 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.cc
@@ -154,7 +154,7 @@ // Check to see if we are really over the EmbeddedContentView itself (and not // just in the border/padding area). - if ((inside || result.IsRectBasedTest()) && !had_result && + if ((inside || location_in_container.IsRectBasedTest()) && !had_result && result.InnerNode() == GetNode()) { result.SetIsOverEmbeddedContentView( ContentBoxRect().Contains(result.LocalPoint()));
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc index 98f7b42..027fdc9 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -752,6 +752,7 @@ DCHECK(!child.IsFloating()); DCHECK(!child.IsOutOfFlowPositioned()); DCHECK(child.CreatesNewFormattingContext()); + DCHECK(child.IsBlock()); const ComputedStyle& child_style = child.Style(); const TextDirection direction = ConstraintSpace().Direction(); @@ -917,6 +918,13 @@ container_builder_.AddChild(layout_result, logical_offset); container_builder_.PropagateBreak(layout_result); + // The margins we store will be used by e.g. getComputedStyle(). + // When calculating these values, ignore any floats that might have + // affected the child. This is what Edge does. + ResolveInlineMargins(child_style, Style(), child_available_size_.inline_size, + fragment.InlineSize(), &child_data.margins); + ToNGBlockNode(child).StoreMargins(ConstraintSpace(), child_data.margins); + *previous_inflow_position = ComputeInflowPosition( *previous_inflow_position, child, child_data, child_bfc_offset, logical_offset, *layout_result, fragment, @@ -1258,6 +1266,9 @@ if (child.IsBlock()) container_builder_.PropagateBreak(layout_result); + if (child.IsBlock()) + ToNGBlockNode(child).StoreMargins(ConstraintSpace(), child_data.margins); + *previous_inflow_position = ComputeInflowPosition(*previous_inflow_position, child, child_data, child_bfc_offset, logical_offset, *layout_result,
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 4cb5b7f..32d898ca 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -416,6 +416,9 @@ intrinsic_content_logical_height -= border_scrollbar_padding.BlockSum(); box_->SetLogicalHeight(logical_height); box_->SetIntrinsicContentLogicalHeight(intrinsic_content_logical_height); + // TODO(mstensho): This should always be done by the parent algorithm, since + // we may have auto margins, which only the parent is able to resolve. Remove + // the following line when all layout modes do this properly. box_->SetMargin(ComputePhysicalMargins(constraint_space, Style())); LayoutMultiColumnFlowThread* flow_thread = GetFlowThread(*box_); @@ -778,4 +781,13 @@ } } +void NGBlockNode::StoreMargins(const NGConstraintSpace& constraint_space, + const NGBoxStrut& margins) { + if (constraint_space.IsIntermediateLayout()) + return; + NGPhysicalBoxStrut physical_margins = margins.ConvertToPhysical( + constraint_space.GetWritingMode(), constraint_space.Direction()); + box_->SetMargin(physical_margins); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.h b/third_party/blink/renderer/core/layout/ng/ng_block_node.h index 87cd038..8b43a9e 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.h +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
@@ -77,6 +77,9 @@ void SaveStaticOffsetForLegacy(const NGLogicalOffset&, const LayoutObject* offset_container); + // Write back resolved margins to legacy. + void StoreMargins(const NGConstraintSpace&, const NGBoxStrut& margins); + static bool CanUseNewLayout(const LayoutBox&); bool CanUseNewLayout() const;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc index ad066f7f..10e0f346 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_ellipse.cc
@@ -94,6 +94,10 @@ } else { radii_ = ToFloatSize(length_context.ResolveLengthPair( svg_style.Rx(), svg_style.Ry(), style)); + if (svg_style.Rx().IsAuto()) + radii_.SetWidth(radii_.Height()); + else if (svg_style.Ry().IsAuto()) + radii_.SetHeight(radii_.Width()); } }
diff --git a/third_party/blink/renderer/core/page/validation_message_client_impl.cc b/third_party/blink/renderer/core/page/validation_message_client_impl.cc index f5251ab2..ad3d52a6 100644 --- a/third_party/blink/renderer/core/page/validation_message_client_impl.cc +++ b/third_party/blink/renderer/core/page/validation_message_client_impl.cc
@@ -112,7 +112,7 @@ &ValidationMessageClientImpl::Reset); // This should be equal to or larger than transition duration of // #container.hiding in validation_bubble.css. - const double kHidingAnimationDuration = 0.13333; + const TimeDelta kHidingAnimationDuration = TimeDelta::FromSecondsD(0.13333); timer_->StartOneShot(kHidingAnimationDuration, FROM_HERE); }
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 3d32c57..e17bb7a 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -2185,7 +2185,7 @@ inside_fragment_background_rect) && IsHitCandidate(this, false, z_offset_for_contents_ptr, unflattened_transform_state.get())) { - if (result.IsRectBasedTest()) + if (recursion_data.original_location.IsRectBasedTest()) result.Append(temp_result); else result = temp_result; @@ -2413,7 +2413,8 @@ // If it is a list-based test, we can safely append the temporary result // since it might had hit nodes but not necesserily had hitLayer set. - DCHECK(!result.IsRectBasedTest() || result.GetHitTestRequest().ListBased()); + DCHECK(!recursion_data.original_location.IsRectBasedTest() || + result.GetHitTestRequest().ListBased()); if (result.GetHitTestRequest().ListBased()) result.Append(temp_result);
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc index 06e30f2..1676b5f1 100644 --- a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc +++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
@@ -39,7 +39,8 @@ namespace blink { -static const double kAnimationPolicyOnceDuration = 3.000; +static constexpr TimeDelta kAnimationPolicyOnceDuration = + TimeDelta::FromSeconds(3); SMILTimeContainer::SMILTimeContainer(SVGSVGElement& owner) : presentation_time_(0),
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.cc b/third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.cc index f6e205872..a3a240dd 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image_chrome_client.cc
@@ -38,7 +38,8 @@ namespace blink { -static const double kAnimationFrameDelay = 1.0 / 60; +static constexpr TimeDelta kAnimationFrameDelay = + TimeDelta::FromSecondsD(1.0 / 60); SVGImageChromeClient::SVGImageChromeClient(SVGImage* image) : image_(image), @@ -110,7 +111,7 @@ // animations, but prefer a fixed, jittery, frame-delay if there're any // animations. Checking for pending/active animations could be more // stringent. - double fire_time = 0; + TimeDelta fire_time; if (image_->MaybeAnimated()) { if (IsSuspended()) return;
diff --git a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc index a49b4ca..2f2dfa88 100644 --- a/third_party/blink/renderer/core/svg/svg_ellipse_element.cc +++ b/third_party/blink/renderer/core/svg/svg_ellipse_element.cc
@@ -69,6 +69,10 @@ FloatSize radii(ToFloatSize( length_context.ResolveLengthPair(svg_style.Rx(), svg_style.Ry(), style))); + if (svg_style.Rx().IsAuto()) + radii.SetWidth(radii.Height()); + else if (svg_style.Ry().IsAuto()) + radii.SetHeight(radii.Width()); if (radii.Width() < 0 || radii.Height() < 0 || (!radii.Width() && !radii.Height())) return path;
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc index 2ad8a68..99375ad 100644 --- a/third_party/blink/renderer/core/timing/performance.cc +++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -160,7 +160,8 @@ return entries; } -PerformanceEntryVector Performance::getEntriesByType(const String& entry_type) { +PerformanceEntryVector Performance::getEntriesByType( + const AtomicString& entry_type) { PerformanceEntryVector entries; PerformanceEntry::EntryType type = PerformanceEntry::ToEntryTypeEnum(entry_type); @@ -228,8 +229,9 @@ return entries; } -PerformanceEntryVector Performance::getEntriesByName(const String& name, - const String& entry_type) { +PerformanceEntryVector Performance::getEntriesByName( + const String& name, + const AtomicString& entry_type) { PerformanceEntryVector entries; PerformanceEntry::EntryType type = PerformanceEntry::ToEntryTypeEnum(entry_type);
diff --git a/third_party/blink/renderer/core/timing/performance.h b/third_party/blink/renderer/core/timing/performance.h index 1b61ccd..9126b86b 100644 --- a/third_party/blink/renderer/core/timing/performance.h +++ b/third_party/blink/renderer/core/timing/performance.h
@@ -48,6 +48,7 @@ #include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/linked_hash_set.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" namespace blink { @@ -113,9 +114,9 @@ double GetTimeOrigin() const { return TimeTicksInSeconds(time_origin_); } PerformanceEntryVector getEntries(); - PerformanceEntryVector getEntriesByType(const String& entry_type); + PerformanceEntryVector getEntriesByType(const AtomicString& entry_type); PerformanceEntryVector getEntriesByName(const String& name, - const String& entry_type); + const AtomicString& entry_type); void clearResourceTimings(); void setResourceTimingBufferSize(unsigned);
diff --git a/third_party/blink/renderer/core/timing/performance_entry.cc b/third_party/blink/renderer/core/timing/performance_entry.cc index 8d867d3..2ad3ed8 100644 --- a/third_party/blink/renderer/core/timing/performance_entry.cc +++ b/third_party/blink/renderer/core/timing/performance_entry.cc
@@ -41,14 +41,11 @@ } PerformanceEntry::PerformanceEntry(const String& name, - const String& entry_type, double start_time, double finish_time) : duration_(finish_time - start_time), name_(name), - entry_type_(entry_type), start_time_(start_time), - entry_type_enum_(ToEntryTypeEnum(entry_type)), index_(index_seq.GetNext()) {} PerformanceEntry::~PerformanceEntry() = default; @@ -57,10 +54,6 @@ return name_; } -String PerformanceEntry::entryType() const { - return entry_type_; -} - DOMHighResTimeStamp PerformanceEntry::startTime() const { return start_time_; } @@ -69,29 +62,107 @@ return duration_; } +const AtomicString& PerformanceEntry::CompositeKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, composite, ()); + if (!composite.IsSet()) + *composite = "composite"; + return *composite; +} + +const AtomicString& PerformanceEntry::EventKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, event, ()); + if (!event.IsSet()) + *event = "event"; + return *event; +} + +const AtomicString& PerformanceEntry::FirstInputKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, firstInput, ()); + if (!firstInput.IsSet()) + *firstInput = "firstInput"; + return *firstInput; +} + +const AtomicString& PerformanceEntry::LongtaskKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, longtask, ()); + if (!longtask.IsSet()) + *longtask = "longtask"; + return *longtask; +} + +const AtomicString& PerformanceEntry::MarkKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, mark, ()); + if (!mark.IsSet()) + *mark = "mark"; + return *mark; +} + +const AtomicString& PerformanceEntry::MeasureKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, measure, ()); + if (!measure.IsSet()) + *measure = "measure"; + return *measure; +} + +const AtomicString& PerformanceEntry::NavigationKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, navigation, ()); + if (!navigation.IsSet()) + *navigation = "navigation"; + return *navigation; +} + +const AtomicString& PerformanceEntry::PaintKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, paint, ()); + if (!paint.IsSet()) + *paint = "paint"; + return *paint; +} + +const AtomicString& PerformanceEntry::RenderKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, render, ()); + if (!render.IsSet()) + *render = "render"; + return *render; +} + +const AtomicString& PerformanceEntry::ResourceKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, resource, ()); + if (!resource.IsSet()) + *resource = "resource"; + return *resource; +} + +const AtomicString& PerformanceEntry::TaskattributionKeyword() { + DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<AtomicString>, taskattribution, + ()); + if (!taskattribution.IsSet()) + *taskattribution = "taskattribution"; + return *taskattribution; +} + PerformanceEntry::EntryType PerformanceEntry::ToEntryTypeEnum( - const String& entry_type) { - if (entry_type == "composite") + const AtomicString& entry_type) { + if (entry_type == CompositeKeyword()) return kComposite; - if (entry_type == "longtask") + if (entry_type == LongtaskKeyword()) return kLongTask; - if (entry_type == "mark") + if (entry_type == MarkKeyword()) return kMark; - if (entry_type == "measure") + if (entry_type == MeasureKeyword()) return kMeasure; - if (entry_type == "render") + if (entry_type == RenderKeyword()) return kRender; - if (entry_type == "resource") + if (entry_type == ResourceKeyword()) return kResource; - if (entry_type == "navigation") + if (entry_type == NavigationKeyword()) return kNavigation; - if (entry_type == "taskattribution") + if (entry_type == TaskattributionKeyword()) return kTaskAttribution; - if (entry_type == "paint") + if (entry_type == PaintKeyword()) return kPaint; - if (entry_type == "event") + if (entry_type == EventKeyword()) return kEvent; - if (entry_type == "firstInput") + if (entry_type == FirstInputKeyword()) return kFirstInput; return kInvalid; }
diff --git a/third_party/blink/renderer/core/timing/performance_entry.h b/third_party/blink/renderer/core/timing/performance_entry.h index 6641341..286b860 100644 --- a/third_party/blink/renderer/core/timing/performance_entry.h +++ b/third_party/blink/renderer/core/timing/performance_entry.h
@@ -69,8 +69,9 @@ }; String name() const; - String entryType() const; DOMHighResTimeStamp startTime() const; + virtual AtomicString entryType() const = 0; + virtual PerformanceEntryType EntryTypeEnum() const = 0; // PerformanceNavigationTiming will override this due to // the nature of reporting it early, which means not having a // finish time available at construction time. @@ -79,13 +80,11 @@ ScriptValue toJSONForBinding(ScriptState*) const; - PerformanceEntryType EntryTypeEnum() const { return entry_type_enum_; } - - bool IsResource() const { return entry_type_enum_ == kResource; } - bool IsRender() const { return entry_type_enum_ == kRender; } - bool IsComposite() const { return entry_type_enum_ == kComposite; } - bool IsMark() const { return entry_type_enum_ == kMark; } - bool IsMeasure() const { return entry_type_enum_ == kMeasure; } + bool IsResource() const { return EntryTypeEnum() == kResource; } + bool IsRender() const { return EntryTypeEnum() == kRender; } + bool IsComposite() const { return EntryTypeEnum() == kComposite; } + bool IsMark() const { return EntryTypeEnum() == kMark; } + bool IsMeasure() const { return EntryTypeEnum() == kMeasure; } static bool StartTimeCompareLessThan(PerformanceEntry* a, PerformanceEntry* b) { @@ -94,11 +93,22 @@ return a->startTime() < b->startTime(); } - static PerformanceEntry::EntryType ToEntryTypeEnum(const String& entry_type); + static const AtomicString& CompositeKeyword(); + static const AtomicString& EventKeyword(); + static const AtomicString& FirstInputKeyword(); + static const AtomicString& LongtaskKeyword(); + static const AtomicString& MarkKeyword(); + static const AtomicString& MeasureKeyword(); + static const AtomicString& NavigationKeyword(); + static const AtomicString& PaintKeyword(); + static const AtomicString& RenderKeyword(); + static const AtomicString& ResourceKeyword(); + static const AtomicString& TaskattributionKeyword(); + static PerformanceEntry::EntryType ToEntryTypeEnum( + const AtomicString& entry_type); protected: PerformanceEntry(const String& name, - const String& entry_type, double start_time, double finish_time); virtual void BuildJSONValue(V8ObjectBuilder&) const; @@ -108,9 +118,7 @@ private: const String name_; - const String entry_type_; const double start_time_; - const PerformanceEntryType entry_type_enum_; const int index_; };
diff --git a/third_party/blink/renderer/core/timing/performance_event_timing.cc b/third_party/blink/renderer/core/timing/performance_event_timing.cc index be23bd0..5fe4adc 100644 --- a/third_party/blink/renderer/core/timing/performance_event_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_event_timing.cc
@@ -18,35 +18,42 @@ // TODO(npm): enable this DCHECK once https://crbug.com/852846 is fixed. // DCHECK_LE(start_time, processing_start); DCHECK_LE(processing_start, processing_end); - return new PerformanceEventTiming(event_type, "event", start_time, - processing_start, processing_end, - cancelable); + return new PerformanceEventTiming( + event_type, PerformanceEntry::EventKeyword(), start_time, + processing_start, processing_end, cancelable); } // static PerformanceEventTiming* PerformanceEventTiming::CreateFirstInputTiming( PerformanceEventTiming* entry) { PerformanceEventTiming* first_input = new PerformanceEventTiming( - entry->name(), "firstInput", entry->startTime(), entry->processingStart(), - entry->processingEnd(), entry->cancelable()); + entry->name(), PerformanceEntry::FirstInputKeyword(), entry->startTime(), + entry->processingStart(), entry->processingEnd(), entry->cancelable()); first_input->SetDuration(entry->duration()); return first_input; } PerformanceEventTiming::PerformanceEventTiming( const String& event_type, - const String& entry_type, + const AtomicString& entry_type, DOMHighResTimeStamp start_time, DOMHighResTimeStamp processing_start, DOMHighResTimeStamp processing_end, bool cancelable) - : PerformanceEntry(event_type, entry_type, start_time, 0.0), + : PerformanceEntry(event_type, start_time, 0.0), + entry_type_(entry_type), processing_start_(processing_start), processing_end_(processing_end), cancelable_(cancelable) {} PerformanceEventTiming::~PerformanceEventTiming() = default; +PerformanceEntryType PerformanceEventTiming::EntryTypeEnum() const { + return entry_type_ == PerformanceEntry::EventKeyword() + ? PerformanceEntry::EntryType::kEvent + : PerformanceEntry::EntryType::kFirstInput; +} + DOMHighResTimeStamp PerformanceEventTiming::processingStart() const { return processing_start_; }
diff --git a/third_party/blink/renderer/core/timing/performance_event_timing.h b/third_party/blink/renderer/core/timing/performance_event_timing.h index 2386f04..3337b23 100644 --- a/third_party/blink/renderer/core/timing/performance_event_timing.h +++ b/third_party/blink/renderer/core/timing/performance_event_timing.h
@@ -27,6 +27,9 @@ ~PerformanceEventTiming() override; + AtomicString entryType() const override { return entry_type_; } + PerformanceEntryType EntryTypeEnum() const override; + bool cancelable() const { return cancelable_; } DOMHighResTimeStamp processingStart() const; @@ -40,11 +43,12 @@ private: PerformanceEventTiming(const String& event_type, - const String& entry_type, + const AtomicString& entry_type, DOMHighResTimeStamp start_time, DOMHighResTimeStamp processing_start, DOMHighResTimeStamp processing_end, bool cancelable); + AtomicString entry_type_; DOMHighResTimeStamp processing_start_; DOMHighResTimeStamp processing_end_; bool cancelable_;
diff --git a/third_party/blink/renderer/core/timing/performance_long_task_timing.cc b/third_party/blink/renderer/core/timing/performance_long_task_timing.cc index edc7cca..ba90d25 100644 --- a/third_party/blink/renderer/core/timing/performance_long_task_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_long_task_timing.cc
@@ -34,7 +34,7 @@ String culprit_frame_id, String culprit_frame_name, const SubTaskAttribution::EntriesVector& sub_task_attributions) - : PerformanceEntry(name, "longtask", start_time, end_time) { + : PerformanceEntry(name, start_time, end_time) { // Only one possible container type exists currently: "iframe". if (RuntimeEnabledFeatures::LongTaskV2Enabled()) { for (auto&& it : sub_task_attributions) { @@ -55,6 +55,14 @@ PerformanceLongTaskTiming::~PerformanceLongTaskTiming() = default; +AtomicString PerformanceLongTaskTiming::entryType() const { + return PerformanceEntry::LongtaskKeyword(); +} + +PerformanceEntryType PerformanceLongTaskTiming::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kLongTask; +} + TaskAttributionVector PerformanceLongTaskTiming::attribution() const { return attribution_; }
diff --git a/third_party/blink/renderer/core/timing/performance_long_task_timing.h b/third_party/blink/renderer/core/timing/performance_long_task_timing.h index a231112..cb9fd59 100644 --- a/third_party/blink/renderer/core/timing/performance_long_task_timing.h +++ b/third_party/blink/renderer/core/timing/performance_long_task_timing.h
@@ -29,6 +29,9 @@ String frame_name, const SubTaskAttribution::EntriesVector& sub_task_attributions); + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; + TaskAttributionVector attribution() const; void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/core/timing/performance_mark.cc b/third_party/blink/renderer/core/timing/performance_mark.cc index 9c27340f..8c5d0b6 100644 --- a/third_party/blink/renderer/core/timing/performance_mark.cc +++ b/third_party/blink/renderer/core/timing/performance_mark.cc
@@ -13,7 +13,7 @@ const String& name, double start_time, const ScriptValue& detail) - : PerformanceEntry(name, "mark", start_time, start_time) { + : PerformanceEntry(name, start_time, start_time) { world_ = WrapRefCounted(&script_state->World()); if (detail.IsEmpty() || detail.IsNull() || detail.IsUndefined()) { return; @@ -21,6 +21,14 @@ detail_.Set(detail.GetIsolate(), detail.V8Value()); } +AtomicString PerformanceMark::entryType() const { + return PerformanceEntry::MarkKeyword(); +} + +PerformanceEntryType PerformanceMark::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kMark; +} + ScriptValue PerformanceMark::detail(ScriptState* script_state) const { v8::Isolate* isolate = script_state->GetIsolate(); if (detail_.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/timing/performance_mark.h b/third_party/blink/renderer/core/timing/performance_mark.h index da8b9af..9af17a7 100644 --- a/third_party/blink/renderer/core/timing/performance_mark.h +++ b/third_party/blink/renderer/core/timing/performance_mark.h
@@ -44,6 +44,9 @@ return new PerformanceMark(script_state, name, start_time, detail); } + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; + ScriptValue detail(ScriptState*) const; void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/core/timing/performance_measure.cc b/third_party/blink/renderer/core/timing/performance_measure.cc index 7146f7dd..ab06293a7 100644 --- a/third_party/blink/renderer/core/timing/performance_measure.cc +++ b/third_party/blink/renderer/core/timing/performance_measure.cc
@@ -14,7 +14,7 @@ double start_time, double end_time, const ScriptValue& detail) - : PerformanceEntry(name, "measure", start_time, end_time) { + : PerformanceEntry(name, start_time, end_time) { if (detail.IsEmpty()) { detail_ = SerializedScriptValue::NullValue(); } else { @@ -29,4 +29,12 @@ return ScriptValue(script_state, detail); } +AtomicString PerformanceMeasure::entryType() const { + return PerformanceEntry::MeasureKeyword(); +} + +PerformanceEntryType PerformanceMeasure::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kMeasure; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/performance_measure.h b/third_party/blink/renderer/core/timing/performance_measure.h index e73e87e8..86b17ba 100644 --- a/third_party/blink/renderer/core/timing/performance_measure.h +++ b/third_party/blink/renderer/core/timing/performance_measure.h
@@ -48,6 +48,9 @@ } ScriptValue detail(ScriptState*) const; + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; + void Trace(blink::Visitor* visitor) override { PerformanceEntry::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc index b29695b..2685932 100644 --- a/third_party/blink/renderer/core/timing/performance_navigation_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.cc
@@ -23,7 +23,6 @@ const WebVector<WebServerTimingInfo>& server_timing) : PerformanceResourceTiming( info ? info->FinalResponse().Url().GetString() : "", - "navigation", time_origin, server_timing), ContextClient(frame), @@ -34,6 +33,14 @@ PerformanceNavigationTiming::~PerformanceNavigationTiming() = default; +AtomicString PerformanceNavigationTiming::entryType() const { + return PerformanceEntry::NavigationKeyword(); +} + +PerformanceEntryType PerformanceNavigationTiming::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kNavigation; +} + void PerformanceNavigationTiming::Trace(blink::Visitor* visitor) { ContextClient::Trace(visitor); PerformanceResourceTiming::Trace(visitor); @@ -110,7 +117,7 @@ } AtomicString PerformanceNavigationTiming::initiatorType() const { - return "navigation"; + return PerformanceEntry::NavigationKeyword(); } bool PerformanceNavigationTiming::GetAllowRedirectDetails() const {
diff --git a/third_party/blink/renderer/core/timing/performance_navigation_timing.h b/third_party/blink/renderer/core/timing/performance_navigation_timing.h index 495ea85a..3893589 100644 --- a/third_party/blink/renderer/core/timing/performance_navigation_timing.h +++ b/third_party/blink/renderer/core/timing/performance_navigation_timing.h
@@ -38,6 +38,8 @@ // Attributes inheritted from PerformanceEntry. DOMHighResTimeStamp duration() const override; + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; AtomicString initiatorType() const override;
diff --git a/third_party/blink/renderer/core/timing/performance_observer.cc b/third_party/blink/renderer/core/timing/performance_observer.cc index 49f006d..9df0dbb 100644 --- a/third_party/blink/renderer/core/timing/performance_observer.cc +++ b/third_party/blink/renderer/core/timing/performance_observer.cc
@@ -73,8 +73,10 @@ PerformanceEntryTypeMask entry_types = PerformanceEntry::kInvalid; if (observer_init.hasEntryTypes() && observer_init.entryTypes().size()) { const Vector<String>& sequence = observer_init.entryTypes(); - for (const auto& entry_type_string : sequence) - entry_types |= PerformanceEntry::ToEntryTypeEnum(entry_type_string); + for (const auto& entry_type_string : sequence) { + entry_types |= + PerformanceEntry::ToEntryTypeEnum(AtomicString(entry_type_string)); + } } if (entry_types == PerformanceEntry::kInvalid) { exception_state.ThrowTypeError(
diff --git a/third_party/blink/renderer/core/timing/performance_observer_entry_list.cc b/third_party/blink/renderer/core/timing/performance_observer_entry_list.cc index 4a24ab6f..61a6223 100644 --- a/third_party/blink/renderer/core/timing/performance_observer_entry_list.cc +++ b/third_party/blink/renderer/core/timing/performance_observer_entry_list.cc
@@ -27,7 +27,7 @@ } PerformanceEntryVector PerformanceObserverEntryList::getEntriesByType( - const String& entry_type) { + const AtomicString& entry_type) { PerformanceEntryVector entries; PerformanceEntry::EntryType type = PerformanceEntry::ToEntryTypeEnum(entry_type); @@ -48,7 +48,7 @@ PerformanceEntryVector PerformanceObserverEntryList::getEntriesByName( const String& name, - const String& entry_type) { + const AtomicString& entry_type) { PerformanceEntryVector entries; PerformanceEntry::EntryType type = PerformanceEntry::ToEntryTypeEnum(entry_type);
diff --git a/third_party/blink/renderer/core/timing/performance_observer_entry_list.h b/third_party/blink/renderer/core/timing/performance_observer_entry_list.h index 2225c16f..f7b6a54b 100644 --- a/third_party/blink/renderer/core/timing/performance_observer_entry_list.h +++ b/third_party/blink/renderer/core/timing/performance_observer_entry_list.h
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace blink { @@ -23,9 +24,9 @@ ~PerformanceObserverEntryList() override; PerformanceEntryVector getEntries() const; - PerformanceEntryVector getEntriesByType(const String& entry_type); + PerformanceEntryVector getEntriesByType(const AtomicString& entry_type); PerformanceEntryVector getEntriesByName(const String& name, - const String& entry_type); + const AtomicString& entry_type); void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/core/timing/performance_paint_timing.cc b/third_party/blink/renderer/core/timing/performance_paint_timing.cc index a0c6ea4..1342c50e 100644 --- a/third_party/blink/renderer/core/timing/performance_paint_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_paint_timing.cc
@@ -11,12 +11,19 @@ PerformancePaintTiming::PerformancePaintTiming(PaintType type, double start_time) : PerformanceEntry(FromPaintTypeToString(type), - "paint", start_time, start_time) {} PerformancePaintTiming::~PerformancePaintTiming() = default; +AtomicString PerformancePaintTiming::entryType() const { + return PerformanceEntry::PaintKeyword(); +} + +PerformanceEntryType PerformancePaintTiming::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kPaint; +} + String PerformancePaintTiming::FromPaintTypeToString(PaintType type) { switch (type) { case PaintType::kFirstPaint:
diff --git a/third_party/blink/renderer/core/timing/performance_paint_timing.h b/third_party/blink/renderer/core/timing/performance_paint_timing.h index 1fc2f48c..c67d510 100644 --- a/third_party/blink/renderer/core/timing/performance_paint_timing.h +++ b/third_party/blink/renderer/core/timing/performance_paint_timing.h
@@ -19,6 +19,9 @@ PerformancePaintTiming(PaintType, double start_time); ~PerformancePaintTiming() override; + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; + static String FromPaintTypeToString(PaintType); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.cc b/third_party/blink/renderer/core/timing/performance_resource_timing.cc index 07f0791..385b4c1 100644 --- a/third_party/blink/renderer/core/timing/performance_resource_timing.cc +++ b/third_party/blink/renderer/core/timing/performance_resource_timing.cc
@@ -46,7 +46,6 @@ TimeTicks time_origin, const AtomicString& initiator_type) : PerformanceEntry(info.name, - "resource", Performance::MonotonicTimeToDOMHighResTimeStamp( time_origin, info.start_time, @@ -78,16 +77,23 @@ // This constructor is for PerformanceNavigationTiming. PerformanceResourceTiming::PerformanceResourceTiming( const String& name, - const String& entry_type, TimeTicks time_origin, const WebVector<WebServerTimingInfo>& server_timing) - : PerformanceEntry(name, entry_type, 0.0, 0.0), + : PerformanceEntry(name, 0.0, 0.0), time_origin_(time_origin), server_timing_( PerformanceServerTiming::FromParsedServerTiming(server_timing)) {} PerformanceResourceTiming::~PerformanceResourceTiming() = default; +AtomicString PerformanceResourceTiming::entryType() const { + return PerformanceEntry::ResourceKeyword(); +} + +PerformanceEntryType PerformanceResourceTiming::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kResource; +} + ResourceLoadTiming* PerformanceResourceTiming::GetResourceLoadTiming() const { return timing_.get(); }
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.h b/third_party/blink/renderer/core/timing/performance_resource_timing.h index 6a352ec..5c8d447 100644 --- a/third_party/blink/renderer/core/timing/performance_resource_timing.h +++ b/third_party/blink/renderer/core/timing/performance_resource_timing.h
@@ -57,6 +57,9 @@ return new PerformanceResourceTiming(info, time_origin, initiator_type); } + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; + // Related doc: https://goo.gl/uNecAj. virtual AtomicString initiatorType() const; AtomicString nextHopProtocol() const; @@ -85,7 +88,6 @@ // This constructor is for PerformanceNavigationTiming. // Related doc: https://goo.gl/uNecAj. PerformanceResourceTiming(const String& name, - const String& entry_type, TimeTicks time_origin, const WebVector<WebServerTimingInfo>&); virtual AtomicString AlpnNegotiatedProtocol() const;
diff --git a/third_party/blink/renderer/core/timing/task_attribution_timing.cc b/third_party/blink/renderer/core/timing/task_attribution_timing.cc index 78a26f88..1308fd6 100644 --- a/third_party/blink/renderer/core/timing/task_attribution_timing.cc +++ b/third_party/blink/renderer/core/timing/task_attribution_timing.cc
@@ -17,7 +17,7 @@ double start_time, double finish_time, String script_url) - : PerformanceEntry(name, "taskattribution", start_time, finish_time), + : PerformanceEntry(name, start_time, finish_time), container_type_(container_type), container_src_(container_src), container_id_(container_id), @@ -26,6 +26,14 @@ TaskAttributionTiming::~TaskAttributionTiming() = default; +AtomicString TaskAttributionTiming::entryType() const { + return PerformanceEntry::TaskattributionKeyword(); +} + +PerformanceEntryType TaskAttributionTiming::EntryTypeEnum() const { + return PerformanceEntry::EntryType::kTaskAttribution; +} + String TaskAttributionTiming::scriptURL() const { return script_url_; }
diff --git a/third_party/blink/renderer/core/timing/task_attribution_timing.h b/third_party/blink/renderer/core/timing/task_attribution_timing.h index 59c2d79e..875a306d 100644 --- a/third_party/blink/renderer/core/timing/task_attribution_timing.h +++ b/third_party/blink/renderer/core/timing/task_attribution_timing.h
@@ -40,6 +40,10 @@ container_id, container_name, 0.0, 0.0, g_empty_string); } + + AtomicString entryType() const override; + PerformanceEntryType EntryTypeEnum() const override; + String containerType() const; String containerSrc() const; String containerId() const;
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc index 24b6b31..c4ccc751 100644 --- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc +++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc
@@ -40,8 +40,8 @@ namespace blink { -static const double kMinimumProgressEventDispatchingIntervalInSeconds = - .05; // 50 ms per specification. +static constexpr TimeDelta kMinimumProgressEventDispatchingInterval = + TimeDelta::FromMilliseconds(50); // 50 ms per specification. XMLHttpRequestProgressEventThrottle::DeferredEvent::DeferredEvent() { Clear(); @@ -105,7 +105,7 @@ } else { DispatchProgressProgressEvent(ProgressEvent::Create( EventTypeNames::progress, length_computable, loaded, total)); - StartOneShot(kMinimumProgressEventDispatchingIntervalInSeconds, FROM_HERE); + StartOneShot(kMinimumProgressEventDispatchingInterval, FROM_HERE); } } @@ -169,7 +169,7 @@ DispatchProgressProgressEvent(deferred_.Take()); // Watch if another "progress" ProgressEvent arrives in the next 50ms. - StartOneShot(kMinimumProgressEventDispatchingIntervalInSeconds, FROM_HERE); + StartOneShot(kMinimumProgressEventDispatchingInterval, FROM_HERE); } void XMLHttpRequestProgressEventThrottle::Pause() {
diff --git a/third_party/blink/renderer/devtools/front_end/network/NetworkLogViewColumns.js b/third_party/blink/renderer/devtools/front_end/network/NetworkLogViewColumns.js index c00716e4..4f2d5ba 100644 --- a/third_party/blink/renderer/devtools/front_end/network/NetworkLogViewColumns.js +++ b/third_party/blink/renderer/devtools/front_end/network/NetworkLogViewColumns.js
@@ -40,6 +40,8 @@ this._calculatorsMap.set(Network.NetworkLogViewColumns._calculatorTypes.Time, timeCalculator); this._calculatorsMap.set(Network.NetworkLogViewColumns._calculatorTypes.Duration, durationCalculator); + this._lastWheelTime = 0; + this._setupDataGrid(); this._setupWaterfall(); } @@ -166,8 +168,10 @@ _onMouseWheel(shouldConsume, event) { if (shouldConsume) event.consume(true); - this._activeScroller.scrollTop -= event.wheelDeltaY; + const hasRecentWheel = Date.now() - this._lastWheelTime < 80; + this._activeScroller.scrollBy({top: -event.wheelDeltaY, behavior: hasRecentWheel ? 'instant' : 'smooth'}); this._syncScrollers(); + this._lastWheelTime = Date.now(); } _syncScrollers() {
diff --git a/third_party/blink/renderer/devtools/front_end/sources/DebuggerPlugin.js b/third_party/blink/renderer/devtools/front_end/sources/DebuggerPlugin.js index 3da04584..2e097049 100644 --- a/third_party/blink/renderer/devtools/front_end/sources/DebuggerPlugin.js +++ b/third_party/blink/renderer/devtools/front_end/sources/DebuggerPlugin.js
@@ -735,11 +735,6 @@ Sources.SourceMapNamesResolver.resolveScopeInObject(localScope) .getAllProperties(false, false, this._prepareScopeVariables.bind(this, callFrame)); } - - if (this._clearValueWidgetsTimer) { - clearTimeout(this._clearValueWidgetsTimer); - this._clearValueWidgetsTimer = null; - } } _showContinueToLocations() { @@ -923,19 +918,16 @@ * @param {?Array.<!SDK.RemoteObjectProperty>} internalProperties */ _prepareScopeVariables(callFrame, properties, internalProperties) { - if (!properties || !properties.length || properties.length > 500 || !this._textEditor.isShowing()) { - this._clearValueWidgets(); + this._clearValueWidgets(); + if (!properties || !properties.length || properties.length > 500 || !this._textEditor.isShowing()) return; - } const functionUILocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation( /** @type {!SDK.DebuggerModel.Location} */ (callFrame.functionLocation())); const executionUILocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(callFrame.location()); if (!functionUILocation || !executionUILocation || functionUILocation.uiSourceCode !== this._uiSourceCode || - executionUILocation.uiSourceCode !== this._uiSourceCode) { - this._clearValueWidgets(); + executionUILocation.uiSourceCode !== this._uiSourceCode) return; - } const functionEditorLocation = this._transformer.rawToEditorLocation(functionUILocation.lineNumber, functionUILocation.columnNumber); @@ -943,17 +935,9 @@ this._transformer.rawToEditorLocation(executionUILocation.lineNumber, executionUILocation.columnNumber); const fromLine = functionEditorLocation[0]; const fromColumn = functionEditorLocation[1]; - let toLine = executionEditorLocation[0]; - - // Make sure we have a chance to update all existing widgets. - if (this._valueWidgets) { - for (const line of this._valueWidgets.keys()) - toLine = Math.max(toLine, line + 1); - } - if (fromLine >= toLine || toLine - fromLine > 500 || fromLine < 0 || toLine >= this._textEditor.linesCount) { - this._clearValueWidgets(); + const toLine = executionEditorLocation[0]; + if (fromLine >= toLine || toLine - fromLine > 500 || fromLine < 0 || toLine >= this._textEditor.linesCount) return; - } const valuesMap = new Map(); for (const property of properties) @@ -1069,6 +1053,10 @@ if (this._executionLocation) this._textEditor.clearExecutionLine(); this._executionLocation = null; + if (this._clearValueWidgetsTimer) { + clearTimeout(this._clearValueWidgetsTimer); + this._clearValueWidgetsTimer = null; + } this._clearValueWidgetsTimer = setTimeout(this._clearValueWidgets.bind(this), 1000); this._clearContinueToLocationsNoRestore(); });
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index f6378fe..159eff8 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -869,6 +869,14 @@ PostNotification(obj, kAXClicked); } +void AXObjectCacheImpl::HandleAttributeChanged( + const QualifiedName& attr_name, + AccessibleNode* accessible_node) { + modification_count_++; + if (AXObject* obj = Get(accessible_node)) + PostNotification(obj, kAXAriaAttributeChanged); +} + void AXObjectCacheImpl::HandleAriaExpandedChange(Node* node) { if (AXObject* obj = GetOrCreate(node)) obj->HandleAriaExpandedChanged();
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 84522986..75a3212 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -150,6 +150,8 @@ void HandleLoadComplete(Document*) override; void HandleLayoutComplete(Document*) override; void HandleClicked(Node*) override; + void HandleAttributeChanged(const QualifiedName& attr_name, + AccessibleNode*) override; void SetCanvasObjectBounds(HTMLCanvasElement*, Element*,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc index c6b0a3f7..c4dfefe2 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.cc
@@ -33,6 +33,11 @@ children_.push_back(AXObjectCache().GetOrCreate(child)); } +void AXVirtualObject::ChildrenChanged() { + ClearChildren(); + AXObjectCache().PostNotification(this, AXObjectCacheImpl::kAXChildrenChanged); +} + const AtomicString& AXVirtualObject::GetAOMPropertyOrARIAAttribute( AOMStringProperty property) const { if (!accessible_node_)
diff --git a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h index 19c5e83..772bab1 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h +++ b/third_party/blink/renderer/modules/accessibility/ax_virtual_object.h
@@ -24,6 +24,7 @@ AXObject* ComputeParent() const override { return parent_; } bool IsVirtualObject() const override { return true; } void AddChildren() override; + void ChildrenChanged() override; const AtomicString& GetAOMPropertyOrARIAAttribute( AOMStringProperty) const override; bool HasAOMPropertyOrARIAAttribute(AOMBooleanProperty,
diff --git a/third_party/blink/renderer/modules/eventsource/event_source.cc b/third_party/blink/renderer/modules/eventsource/event_source.cc index 262e504..f7078d94 100644 --- a/third_party/blink/renderer/modules/eventsource/event_source.cc +++ b/third_party/blink/renderer/modules/eventsource/event_source.cc
@@ -175,7 +175,8 @@ void EventSource::ScheduleReconnect() { state_ = kConnecting; - connect_timer_.StartOneShot(reconnect_delay_ / 1000.0, FROM_HERE); + connect_timer_.StartOneShot(TimeDelta::FromMilliseconds(reconnect_delay_), + FROM_HERE); DispatchEvent(Event::Create(EventTypeNames::error)); }
diff --git a/third_party/blink/renderer/modules/geolocation/geo_notifier.cc b/third_party/blink/renderer/modules/geolocation/geo_notifier.cc index f1877102..ce8d3a7 100644 --- a/third_party/blink/renderer/modules/geolocation/geo_notifier.cc +++ b/third_party/blink/renderer/modules/geolocation/geo_notifier.cc
@@ -72,7 +72,8 @@ } void GeoNotifier::StartTimer() { - timer_->StartOneShot(options_.timeout() / 1000.0, FROM_HERE); + timer_->StartOneShot(TimeDelta::FromMilliseconds(options_.timeout()), + FROM_HERE); } void GeoNotifier::StopTimer() { @@ -93,12 +94,6 @@ timer_.StartOneShot(interval, caller); } -void GeoNotifier::Timer::StartOneShot(double interval, - const base::Location& caller) { - DCHECK(notifier_->geolocation_->DoesOwnNotifier(notifier_)); - timer_.StartOneShot(interval, caller); -} - void GeoNotifier::Timer::Stop() { DCHECK(notifier_->geolocation_->DoesOwnNotifier(notifier_)); timer_.Stop();
diff --git a/third_party/blink/renderer/modules/geolocation/geo_notifier.h b/third_party/blink/renderer/modules/geolocation/geo_notifier.h index 1aafc29..69cf9a9 100644 --- a/third_party/blink/renderer/modules/geolocation/geo_notifier.h +++ b/third_party/blink/renderer/modules/geolocation/geo_notifier.h
@@ -70,7 +70,6 @@ // TimerBase-compatible API void StartOneShot(TimeDelta interval, const base::Location& caller); - void StartOneShot(double interval, const base::Location& caller); void Stop(); bool IsActive() const { return timer_.IsActive(); }
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc index 69d2ff0..d3a8546 100644 --- a/third_party/blink/renderer/modules/payments/payment_request.cc +++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -139,7 +139,7 @@ // If the website does not call complete() 60 seconds after show() has been // resolved, then behave as if the website called complete("fail"). -static const int kCompleteTimeoutSeconds = 60; +constexpr TimeDelta kCompleteTimeout = TimeDelta::FromSeconds(60); // Validates ShippingOption or PaymentItem, which happen to have identical // fields, except for "id", which is present only in ShippingOption. @@ -1076,7 +1076,7 @@ return; } - complete_timer_.StartOneShot(kCompleteTimeoutSeconds, FROM_HERE); + complete_timer_.StartOneShot(kCompleteTimeout, FROM_HERE); show_resolver_->Resolve(new PaymentResponse( std::move(response), shipping_address_.Get(), this, id_));
diff --git a/third_party/blink/renderer/modules/payments/payment_request_update_event.cc b/third_party/blink/renderer/modules/payments/payment_request_update_event.cc index 45e4712..92e86937 100644 --- a/third_party/blink/renderer/modules/payments/payment_request_update_event.cc +++ b/third_party/blink/renderer/modules/payments/payment_request_update_event.cc
@@ -19,7 +19,7 @@ // Reject the payment request if the page does not resolve the promise from // updateWith within 60 seconds. -static const int kAbortTimeout = 60; +constexpr TimeDelta kAbortTimeout = TimeDelta::FromSeconds(60); class UpdatePaymentDetailsFunction : public ScriptFunction { public:
diff --git a/third_party/blink/renderer/modules/serviceworkers/wait_until_observer.cc b/third_party/blink/renderer/modules/serviceworkers/wait_until_observer.cc index 8f89ad2c..707a4b17 100644 --- a/third_party/blink/renderer/modules/serviceworkers/wait_until_observer.cc +++ b/third_party/blink/renderer/modules/serviceworkers/wait_until_observer.cc
@@ -26,10 +26,10 @@ const unsigned kWindowInteractionTimeout = 10; const unsigned kWindowInteractionTimeoutForTest = 1; -unsigned WindowInteractionTimeout() { - return LayoutTestSupport::IsRunningLayoutTest() - ? kWindowInteractionTimeoutForTest - : kWindowInteractionTimeout; +TimeDelta WindowInteractionTimeout() { + return TimeDelta::FromSeconds(LayoutTestSupport::IsRunningLayoutTest() + ? kWindowInteractionTimeoutForTest + : kWindowInteractionTimeout); } } // anonymous namespace
diff --git a/third_party/blink/renderer/modules/vibration/vibration_controller.cc b/third_party/blink/renderer/modules/vibration/vibration_controller.cc index ae76aa1..20965e8 100644 --- a/third_party/blink/renderer/modules/vibration/vibration_controller.cc +++ b/third_party/blink/renderer/modules/vibration/vibration_controller.cc
@@ -152,7 +152,8 @@ pattern_.EraseAt(0); } - timer_do_vibrate_.StartOneShot(interval / 1000.0, FROM_HERE); + timer_do_vibrate_.StartOneShot(TimeDelta::FromMilliseconds(interval), + FROM_HERE); } void VibrationController::Cancel() {
diff --git a/third_party/blink/renderer/modules/webaudio/async_audio_decoder.cc b/third_party/blink/renderer/modules/webaudio/async_audio_decoder.cc index 06ab78df..d5287d2 100644 --- a/third_party/blink/renderer/modules/webaudio/async_audio_decoder.cc +++ b/third_party/blink/renderer/modules/webaudio/async_audio_decoder.cc
@@ -34,7 +34,7 @@ #include "third_party/blink/renderer/platform/audio/audio_bus.h" #include "third_party/blink/renderer/platform/audio/audio_file_reader.h" #include "third_party/blink/renderer/platform/cross_thread_functional.h" -#include "third_party/blink/renderer/platform/threading/background_task_runner.h" +#include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include "third_party/blink/renderer/platform/web_task_runner.h" namespace blink { @@ -51,7 +51,7 @@ if (!audio_data) return; - BackgroundTaskRunner::PostOnBackgroundThread( + BackgroundScheduler::PostOnBackgroundThread( FROM_HERE, CrossThreadBind(&AsyncAudioDecoder::DecodeOnBackgroundThread, WrapCrossThreadPersistent(audio_data), sample_rate,
diff --git a/third_party/blink/renderer/modules/webaudio/audio_node.cc b/third_party/blink/renderer/modules/webaudio/audio_node.cc index ea52ac8..c3578ad 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_node.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_node.cc
@@ -730,9 +730,6 @@ connected_nodes_[output_index] = new HeapHashSet<Member<AudioNode>>(); connected_nodes_[output_index]->insert(destination); - // Let context know that a connection has been made. - context()->IncrementConnectionCount(); - return destination; } @@ -990,16 +987,6 @@ } } -void AudioNode::DisconnectWithoutException(unsigned output_index) { - DCHECK(IsMainThread()); - BaseAudioContext::GraphAutoLocker locker(context()); - - // Sanity check input and output indices. - if (output_index >= Handler().NumberOfOutputs()) - return; - DisconnectAllFromOutput(output_index); -} - unsigned AudioNode::numberOfInputs() const { return Handler().NumberOfInputs(); }
diff --git a/third_party/blink/renderer/modules/webaudio/audio_node.h b/third_party/blink/renderer/modules/webaudio/audio_node.h index fd97f31..172bab83 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_node.h +++ b/third_party/blink/renderer/modules/webaudio/audio_node.h
@@ -346,9 +346,6 @@ // Called inside AudioHandler constructors. void DidAddOutput(unsigned number_of_outputs); - // Like disconnect, but no exception is thrown if the outputIndex is invalid. - // Just do nothing in that case. - void DisconnectWithoutException(unsigned output_index); protected: explicit AudioNode(BaseAudioContext&);
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc index 3e023ce9..4a8ef69 100644 --- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc +++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -93,7 +93,6 @@ is_cleared_(false), is_resolving_resume_promises_(false), has_posted_cleanup_task_(false), - connection_count_(0), deferred_task_handler_(DeferredTaskHandler::Create()), context_state_(kSuspended), periodic_wave_sine_(nullptr),
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h index dfda282..2d8dec8 100644 --- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h +++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
@@ -251,14 +251,6 @@ // Called at the end of each render quantum. void HandlePostRenderTasks(); - // Keeps track of the number of connections made. - void IncrementConnectionCount() { - DCHECK(IsMainThread()); - connection_count_++; - } - - unsigned ConnectionCount() const { return connection_count_; } - DeferredTaskHandler& GetDeferredTaskHandler() const { return *deferred_task_handler_; } @@ -421,8 +413,6 @@ // thread. Cleared by the main thread task once it has run. bool has_posted_cleanup_task_; - unsigned connection_count_; - // Graph locking. scoped_refptr<DeferredTaskHandler> deferred_task_handler_;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 7d639dbd..06ccd0cd 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -111,7 +111,7 @@ namespace { -const double kSecondsBetweenRestoreAttempts = 1.0; +constexpr TimeDelta kDurationBetweenRestoreAttempts = TimeDelta::FromSeconds(1); const int kMaxGLErrorsAllowedToConsole = 256; const unsigned kMaxGLActiveContextsOnWorker = 4; @@ -7660,7 +7660,7 @@ } if (!buffer) { if (context_lost_mode_ == kRealLostContext) { - restore_timer_.StartOneShot(kSecondsBetweenRestoreAttempts, FROM_HERE); + restore_timer_.StartOneShot(kDurationBetweenRestoreAttempts, FROM_HERE); } else { // This likely shouldn't happen but is the best way to report it to the // WebGL app.
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 3546f975..09b1b27 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1371,8 +1371,6 @@ "theme.cc", "theme.h", "theme_types.h", - "threading/background_task_runner.cc", - "threading/background_task_runner.h", "time_clamper.cc", "time_clamper.h", "timer.cc", @@ -1866,7 +1864,6 @@ "text/text_run_test.cc", "text/unicode_utilities_test.cc", "text/writing_mode_utils_test.cc", - "threading/background_task_runner_test.cc", "time_clamper_test.cc", "timer_test.cc", "transforms/affine_transform_test.cc",
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc b/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc index 3c42b95..6e5acfba 100644 --- a/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc +++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource.cc
@@ -428,7 +428,7 @@ } NOINLINE void RawResourceClientStateChecker::SetSerializedCachedMetadata() { - SECURITY_CHECK(state_ == kResponseReceived || state_ == kDataReceived); + SECURITY_CHECK(state_ == kResponseReceived); state_ = kSetSerializedCachedMetadata; }
diff --git a/third_party/blink/renderer/platform/scheduler/BUILD.gn b/third_party/blink/renderer/platform/scheduler/BUILD.gn index 5900ba7..a6723c7 100644 --- a/third_party/blink/renderer/platform/scheduler/BUILD.gn +++ b/third_party/blink/renderer/platform/scheduler/BUILD.gn
@@ -20,6 +20,7 @@ "child/webthread_base.cc", "child/webthread_impl_for_worker_scheduler.cc", "child/webthread_impl_for_worker_scheduler.h", + "common/background_scheduler.cc", "common/cancelable_closure_holder.cc", "common/cancelable_closure_holder.h", "common/frame_or_worker_scheduler.cc", @@ -78,6 +79,7 @@ "main_thread/user_model.cc", "main_thread/user_model.h", "main_thread/web_render_widget_scheduling_state.cc", + "public/background_scheduler.h", "public/frame_or_worker_scheduler.h", "public/frame_scheduler.h", "public/page_lifecycle_state.h", @@ -174,6 +176,7 @@ "base/work_queue_sets_unittest.cc", "base/work_queue_unittest.cc", "child/webthread_impl_for_worker_scheduler_unittest.cc", + "common/background_scheduler_unittest.cc", "common/idle_canceled_delayed_task_sweeper_unittest.cc", "common/idle_helper_unittest.cc", "common/metrics_helper_unittest.cc",
diff --git a/third_party/blink/renderer/platform/threading/background_task_runner.cc b/third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc similarity index 65% rename from third_party/blink/renderer/platform/threading/background_task_runner.cc rename to third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc index b5d0e0c..18d898e3 100644 --- a/third_party/blink/renderer/platform/threading/background_task_runner.cc +++ b/third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc
@@ -2,16 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "third_party/blink/renderer/platform/threading/background_task_runner.h" +#include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include "base/location.h" #include "base/task_scheduler/post_task.h" namespace blink { -void BackgroundTaskRunner::PostOnBackgroundThread( - const base::Location& location, - CrossThreadClosure closure) { +void BackgroundScheduler::PostOnBackgroundThread(const base::Location& location, + CrossThreadClosure closure) { base::PostTaskWithTraits(location, {base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, ConvertToBaseCallback(std::move(closure)));
diff --git a/third_party/blink/renderer/platform/threading/background_task_runner_test.cc b/third_party/blink/renderer/platform/scheduler/common/background_scheduler_unittest.cc similarity index 82% rename from third_party/blink/renderer/platform/threading/background_task_runner_test.cc rename to third_party/blink/renderer/platform/scheduler/common/background_scheduler_unittest.cc index 5c9cc81b..66710ec 100644 --- a/third_party/blink/renderer/platform/threading/background_task_runner_test.cc +++ b/third_party/blink/renderer/platform/scheduler/common/background_scheduler_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "third_party/blink/renderer/platform/threading/background_task_runner.h" +#include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h" #include <memory> #include "base/location.h" @@ -21,10 +21,10 @@ } // namespace -TEST(BackgroundTaskRunnerTest, RunOnBackgroundThread) { +TEST(BackgroundSchedulerTest, RunOnBackgroundThread) { base::test::ScopedTaskEnvironment scoped_task_environment; std::unique_ptr<WaitableEvent> done_event = std::make_unique<WaitableEvent>(); - BackgroundTaskRunner::PostOnBackgroundThread( + BackgroundScheduler::PostOnBackgroundThread( FROM_HERE, CrossThreadBind(&PingPongTask, CrossThreadUnretained(done_event.get()))); // Test passes by not hanging on the following wait().
diff --git a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc index f19fe359..1cd63c8 100644 --- a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc
@@ -171,7 +171,7 @@ DISALLOW_COPY_AND_ASSIGN(TaskQueueThrottlerWithAutoAdvancingTimeTest); }; -INSTANTIATE_TEST_CASE_P(All, +INSTANTIATE_TEST_CASE_P(, TaskQueueThrottlerWithAutoAdvancingTimeTest, testing::Bool());
diff --git a/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h new file mode 100644 index 0000000..ef80a0a --- /dev/null +++ b/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h
@@ -0,0 +1,28 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_BACKGROUND_SCHEDULER_H_ +#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_BACKGROUND_SCHEDULER_H_ + +#include "base/location.h" +#include "third_party/blink/renderer/platform/platform_export.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" + +namespace blink { + +namespace BackgroundScheduler { + +// This is a thin wrapper around base::TaskScheduler to accomodate +// Blink's CrossThreadClosure, which only allows background tasks. +// +// Non-background tasks should be posted using another scheduler, e.g. +// FrameShceduler. +PLATFORM_EXPORT void PostOnBackgroundThread(const base::Location&, + CrossThreadClosure); + +} // namespace BackgroundScheduler + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_PUBLIC_BACKGROUND_SCHEDULER_H_
diff --git a/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h index 90a1affe..63873ee 100644 --- a/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h
@@ -49,16 +49,16 @@ SchedulingLifecycleState CalculateLifecycleState(ObserverType) const override; protected: - scoped_refptr<base::sequence_manager::TaskQueue> DefaultTaskQueue(); scoped_refptr<base::sequence_manager::TaskQueue> ThrottleableTaskQueue(); + scoped_refptr<base::sequence_manager::TaskQueue> UnthrottleableTaskQueue(); private: void SetUpThrottling(); base::WeakPtr<WorkerScheduler> GetWeakPtr(); - scoped_refptr<base::sequence_manager::TaskQueue> default_task_queue_; scoped_refptr<base::sequence_manager::TaskQueue> throttleable_task_queue_; + scoped_refptr<base::sequence_manager::TaskQueue> unthrottleable_task_queue_; SchedulingLifecycleState lifecycle_state_ = SchedulingLifecycleState::kNotThrottled;
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_helper.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_helper.cc index 7854196..a63fae8 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_helper.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_helper.cc
@@ -19,9 +19,9 @@ TaskType default_task_type) : SchedulerHelper(std::move(sequence_manager)), non_main_thread_scheduler_(non_main_thread_scheduler), - default_task_queue_(NewTaskQueue(TaskQueue::Spec("worker_default_tq") + default_task_queue_(NewTaskQueue(TaskQueue::Spec("subthread_default_tq") .SetShouldMonitorQuiescence(true))), - control_task_queue_(NewTaskQueue(TaskQueue::Spec("worker_control_tq") + control_task_queue_(NewTaskQueue(TaskQueue::Spec("subthread_control_tq") .SetShouldNotifyObservers(false))) { InitDefaultQueues(default_task_queue_, control_task_queue_, default_task_type);
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc index 462e2ae..ccfd7cb 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
@@ -33,12 +33,11 @@ } scoped_refptr<NonMainThreadTaskQueue> -NonMainThreadSchedulerImpl::CreateTaskRunner() { +NonMainThreadSchedulerImpl::CreateTaskRunner(const char* name) { helper_->CheckOnValidThread(); - return helper_->NewTaskQueue( - base::sequence_manager::TaskQueue::Spec("worker_tq") - .SetShouldMonitorQuiescence(true) - .SetTimeDomain(nullptr)); + return helper_->NewTaskQueue(base::sequence_manager::TaskQueue::Spec(name) + .SetShouldMonitorQuiescence(true) + .SetTimeDomain(nullptr)); } void NonMainThreadSchedulerImpl::RunIdleTask(blink::WebThread::IdleTask task,
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h index dcc5a4e1..a48153d 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
@@ -85,7 +85,7 @@ // // virtual void Shutdown(); - scoped_refptr<NonMainThreadTaskQueue> CreateTaskRunner(); + scoped_refptr<NonMainThreadTaskQueue> CreateTaskRunner(const char* name); protected: static void RunIdleTask(WebThread::IdleTask task, base::TimeTicks deadline);
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc index 8c1bba82..5e7f398 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler.cc
@@ -15,8 +15,10 @@ WorkerScheduler::WorkerScheduler(WorkerThreadScheduler* worker_thread_scheduler, WorkerSchedulerProxy* proxy) - : default_task_queue_(worker_thread_scheduler->CreateTaskRunner()), - throttleable_task_queue_(worker_thread_scheduler->CreateTaskRunner()), + : throttleable_task_queue_( + worker_thread_scheduler->CreateTaskRunner("worker_throttleable_tq")), + unthrottleable_task_queue_(worker_thread_scheduler->CreateTaskRunner( + "worker_unthrottleable_tq")), thread_scheduler_(worker_thread_scheduler), weak_factory_(this) { thread_scheduler_->RegisterWorkerScheduler(this); @@ -77,7 +79,7 @@ thread_scheduler_->UnregisterWorkerScheduler(this); - default_task_queue_->ShutdownTaskQueue(); + unthrottleable_task_queue_->ShutdownTaskQueue(); throttleable_task_queue_->ShutdownTaskQueue(); #if DCHECK_IS_ON() @@ -128,7 +130,7 @@ // TODO(nhiroki): Identify which tasks can be throttled / suspendable and // move them into other task runners. See also comments in // Get(LocalFrame). (https://crbug.com/670534) - return TaskQueueWithTaskType::Create(default_task_queue_, type); + return TaskQueueWithTaskType::Create(unthrottleable_task_queue_, type); case TaskType::kMainThreadTaskQueueV8: case TaskType::kMainThreadTaskQueueCompositor: case TaskType::kMainThreadTaskQueueDefault: @@ -168,8 +170,8 @@ } scoped_refptr<base::sequence_manager::TaskQueue> -WorkerScheduler::DefaultTaskQueue() { - return default_task_queue_.get(); +WorkerScheduler::UnthrottleableTaskQueue() { + return unthrottleable_task_queue_.get(); } scoped_refptr<base::sequence_manager::TaskQueue>
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc index 4a5f979..b47e0392 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_unittest.cc
@@ -71,7 +71,7 @@ WorkerThreadSchedulerForTest* thread_scheduler) : WorkerScheduler(thread_scheduler, nullptr) {} - using WorkerScheduler::DefaultTaskQueue; + using WorkerScheduler::UnthrottleableTaskQueue; using WorkerScheduler::ThrottleableTaskQueue; };
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc index 13276a1..095971e 100644 --- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc
@@ -101,7 +101,7 @@ // Null clock might trigger some assertions. task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(5)); scheduler_->Init(); - default_task_runner_ = scheduler_->CreateTaskRunner(); + default_task_runner_ = scheduler_->CreateTaskRunner("test_tq"); idle_task_runner_ = scheduler_->IdleTaskRunner(); }
diff --git a/third_party/blink/renderer/platform/threading/DEPS b/third_party/blink/renderer/platform/threading/DEPS deleted file mode 100644 index 7dd39b3f..0000000 --- a/third_party/blink/renderer/platform/threading/DEPS +++ /dev/null
@@ -1,16 +0,0 @@ -include_rules = [ - # Don't depend on platform/. - "-third_party/blink/renderer/platform", - - # Module. - "+third_party/blink/renderer/platform/threading", - - # Dependencies. - "+base/task_scheduler", - "+base/test", - "+third_party/blink/renderer/platform/cross_thread_functional.h", - "+third_party/blink/renderer/platform/platform_export.h", - "+third_party/blink/renderer/platform/threading/background_task_runner.h", - "+third_party/blink/renderer/platform/waitable_event.h", - "+third_party/blink/renderer/platform/wtf", -]
diff --git a/third_party/blink/renderer/platform/threading/background_task_runner.h b/third_party/blink/renderer/platform/threading/background_task_runner.h deleted file mode 100644 index 52df837..0000000 --- a/third_party/blink/renderer/platform/threading/background_task_runner.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_THREADING_BACKGROUND_TASK_RUNNER_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_THREADING_BACKGROUND_TASK_RUNNER_H_ - -#include "base/location.h" -#include "third_party/blink/renderer/platform/platform_export.h" -#include "third_party/blink/renderer/platform/wtf/functional.h" - -namespace blink { - -namespace BackgroundTaskRunner { - -PLATFORM_EXPORT void PostOnBackgroundThread(const base::Location&, - CrossThreadClosure); - -} // BackgroundTaskRunner - -} // namespace blink - -#endif
diff --git a/third_party/blink/tools/lldb/lldb_blink.py b/third_party/blink/tools/lldb/lldb_blink.py index ab07d38..0610924 100644 --- a/third_party/blink/tools/lldb/lldb_blink.py +++ b/third_party/blink/tools/lldb/lldb_blink.py
@@ -44,6 +44,7 @@ debugger.HandleCommand('type summary add -F lldb_blink.BlinkLayoutUnit_SummaryProvider blink::LayoutUnit') debugger.HandleCommand('type summary add -F lldb_blink.BlinkLayoutSize_SummaryProvider blink::LayoutSize') debugger.HandleCommand('type summary add -F lldb_blink.BlinkLayoutPoint_SummaryProvider blink::LayoutPoint') + debugger.HandleCommand('type summary add -F lldb_blink.BlinkLength_SummaryProvider blink::Length') def WTFString_SummaryProvider(valobj, dict): @@ -84,6 +85,11 @@ provider = BlinkLayoutPointProvider(valobj, dict) return "{ x = %s, y = %s }" % (provider.get_x(), provider.get_y()) + +def BlinkLength_SummaryProvider(valobj, dict): + provider = BlinkLengthProvider(valobj, dict) + return "{ %s }" % (provider.to_string()) + # FIXME: Provide support for the following types: # def WTFCString_SummaryProvider(valobj, dict): # def BlinkKURL_SummaryProvider(valobj, dict): @@ -208,6 +214,54 @@ return BlinkLayoutUnitProvider(self.valobj.GetChildMemberWithName('y_'), dict).to_string() +class BlinkLengthProvider: + "Print a blink::Length" + def __init__(self, valobj, dict): + self.valobj = valobj + + def to_string(self): + ltype = self.valobj.GetChildMemberWithName('type_').GetValueAsSigned() + if self.valobj.GetChildMemberWithName('is_float_').GetValueAsSigned(): + val = self.valobj.GetChildMemberWithName('float_value_').GetValue() + else: + val = self.valobj.GetChildMemberWithName('int_value_').GetValue() + + quirk = '' + if self.valobj.GetChildMemberWithName('quirk_').GetValueAsSigned(): + quirk = ', quirk=true' + + if ltype == 0: + return 'Length(Auto)' + if ltype == 1: + return 'Length(%s%%, Percent%s)' % (val, quirk) + if ltype == 2: + return 'Length(%s, Fixed%s)' % (val, quirk) + if ltype == 3: + return 'Length(Intrinsic)' + if ltype == 4: + return 'Length(MinIntrinsic)' + if ltype == 5: + return 'Length(MinContent)' + if ltype == 6: + return 'Length(MaxContent)' + if ltype == 7: + return 'Length(FillAvailable)' + if ltype == 8: + return 'Length(FitContent)' + if ltype == 9: + # FIXME: If we can call member functions, we can improve this. + return 'Length(Calculated)' + if ltype == 10: + return 'Length(ExtendToZoom)' + if ltype == 11: + return 'Length(DeviceWidth)' + if ltype == 12: + return 'Length(DeviceHeight)' + if ltype == 13: + return 'Length(MaxSizeNone)' + return 'Length(unknown type %s)' % ltype + + class WTFVectorProvider: def __init__(self, valobj, internal_dict): self.valobj = valobj
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 8696a1a..2efcf316d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -27962,6 +27962,7 @@ <int value="-792079435" label="EnableAppsGridGapFeature:disabled"/> <int value="-790036192" label="overscroll-start-threshold"/> <int value="-787426248" label="ChromeHomeSurvey:disabled"/> + <int value="-782536046" label="NewContactsPicker:enabled"/> <int value="-780798969" label="disable-single-click-autofill"/> <int value="-780599934" label="AutofillUpstreamSendPanFirstSix:enabled"/> <int value="-778126349" label="DownloadsLocationChange:enabled"/> @@ -28005,6 +28006,7 @@ <int value="-709058455" label="ui-slow-animations"/> <int value="-707655322" label="Newblue:disabled"/> <int value="-706733351" label="enable-floating-virtual-keyboard:enabled"/> + <int value="-705746939" label="ChromeDuet:enabled"/> <int value="-704232562" label="UseMonitorColorSpace:enabled"/> <int value="-702477233" label="ContentFullscreen:enabled"/> <int value="-699767107" label="enable-sync-app-list"/> @@ -28341,6 +28343,7 @@ <int value="52368742" label="enable-pixel-canvas-recording:disabled"/> <int value="54571864" label="EnableDisplayZoomSetting:enabled"/> <int value="56723110" label="enable-webfonts-intervention"/> + <int value="57555893" label="NewContactsPicker:disabled"/> <int value="57639188" label="SoundContentSetting:disabled"/> <int value="57791920" label="MemoryCoordinator:enabled"/> <int value="58099178" label="SecondaryUiMd:enabled"/> @@ -28937,6 +28940,7 @@ <int value="1319725131" label="enable-distance-field-text"/> <int value="1320201920" label="enable-touchpad-three-finger-click"/> <int value="1330264457" label="OmniboxUIExperimentVerticalLayout:disabled"/> + <int value="1332120969" label="ChromeDuet:disabled"/> <int value="1333847867" label="NoScriptPreviews:enabled"/> <int value="1338864675" label="EnableTouchableAppContextMenu:disabled"/> <int value="1339426771" label="TopSitesFromSiteEngagement:disabled"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index be929c9..d67a17cd 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -42418,7 +42418,7 @@ </histogram> <histogram name="MediaRouter.Cast.Channel.ConnectResult" enum="BooleanSuccess"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> Whether opening Cast channel succeeds or not. Recorded when all opening channel attempts (including retry attempts) finish. @@ -42427,7 +42427,7 @@ <histogram name="MediaRouter.Cast.Channel.Error" enum="MediaRouterCastChannelError"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> Errors encountered on a Cast channel. Recorded when a Cast channel fails to open, or when an opened channel fails to respond to keepalive ping request @@ -42446,7 +42446,7 @@ <histogram name="MediaRouter.Cast.Discovery.ConnectedDevicesCount" units="devices"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> The number of connected Cast devices. Recorded when browser finishes discovering Cast devices. Recording happens roughly once per hour. @@ -42454,7 +42454,7 @@ </histogram> <histogram name="MediaRouter.Cast.Discovery.KnownDevicesCount" units="devices"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> The number of known Cast devices. Recorded when browser finishes discovering Cast devices. Recording happens roughly once per hour. @@ -42468,7 +42468,7 @@ </histogram> <histogram name="MediaRouter.Cast.Mdns.Channel.Open_Failure" units="ms"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> Duration in milliseconds taken to fail to open a cast channel. Recorded when one opening channel attempt fails. @@ -42476,7 +42476,7 @@ </histogram> <histogram name="MediaRouter.Cast.Mdns.Channel.Open_Success" units="ms"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> Duration in milliseconds taken to successfully open a cast channel. Recorded when one opening channel attempt succeeds. @@ -42484,7 +42484,7 @@ </histogram> <histogram name="MediaRouter.Dial.AvailableDevicesCount" units="devices"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> The number of available DIAL devices. Recorded when browser finishes discovering DIAL devices. Recording happens roughly once per hour. @@ -42492,7 +42492,7 @@ </histogram> <histogram name="MediaRouter.Dial.KnownDevicesCount" units="devices"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> The number of known DIAL devices. Recorded when browser finishes discovering DIAL devices. Recording happens roughly once per hour. @@ -42501,7 +42501,7 @@ <histogram name="MediaRouter.Dial.ParsingError" enum="MediaRouterDialParsingError"> - <owner>zhaobin@chromium.org</owner> + <owner>mfoltz@chromium.org</owner> <summary> Error encountered while parsing DIAL device description XML text. Recorded when utility process returns an invalid DIAL device description object to @@ -42511,7 +42511,7 @@ <histogram name="MediaRouter.Icon.Click.Location" enum="MediaRouterDialogOpenOrigin"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary>Location the user clicked to open the Media Router dialog.</summary> </histogram> @@ -42626,8 +42626,8 @@ </histogram> <histogram name="MediaRouter.Route.CreationOutcome" - units="MediaRouterCreateRouteOutcome"> - <owner>apacible@chromium.org</owner> + enum="MediaRouterCreateRouteOutcome"> + <owner>takumif@chromium.org</owner> <summary> The number of times a Media Router create route response succeeds or fails. This breaks down the different failure types in to separate buckets. @@ -42644,7 +42644,7 @@ <histogram name="MediaRouter.Source.CastingSource" enum="MediaRouterSourceTypes"> - <owner>amp@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> The source of a Media Router session. This is recorded to keep track of what kind of media is being streamed. @@ -42652,7 +42652,7 @@ </histogram> <histogram name="MediaRouter.Source.LocalFileFormat" enum="MediaContainers"> - <owner>amp@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> The file format of a local media Media Router session. This is recorded when a casting session begins to keep track of what kind of media is being @@ -42661,7 +42661,7 @@ </histogram> <histogram name="MediaRouter.Source.LocalFileSize" units="MB"> - <owner>amp@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> The file size of a local media Media Router session. This is recorded when a casting session begins to keep track of what kind of media is being @@ -42671,7 +42671,7 @@ </histogram> <histogram name="MediaRouter.Ui.Action.CloseLatency" units="ms"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from the user opening the Media Router dialog to the user closing the dialog. This is only recorded if closing the dialog @@ -42680,7 +42680,7 @@ </histogram> <histogram name="MediaRouter.Ui.Action.StartLocal.Latency" units="ms"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from the Media Router dialog showing the sink list and being populated with at least one device to the user selecting a @@ -42690,25 +42690,25 @@ <histogram name="MediaRouter.Ui.Action.StartLocalPosition" enum="MediaRouterSinkPositionLabel"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary>The index of the sink that was selected in the sink list.</summary> </histogram> <histogram name="MediaRouter.Ui.Action.StartLocalSessionSuccessful" enum="BooleanSuccess"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> The number of times a session was successfully started versus failed. </summary> </histogram> <histogram name="MediaRouter.Ui.Action.StopRoute" enum="MediaRouteType"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary>The number of times a user stops different types of routes.</summary> </histogram> <histogram name="MediaRouter.Ui.Device.Count"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> Counts the number of devices known and populated to the Media Router dialog three seconds after the dialog loads. Always expected to be non-negative. @@ -42724,7 +42724,7 @@ </histogram> <histogram name="MediaRouter.Ui.Dialog.LoadedWithData" units="ms"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from the user click to open the Media Router dialog to initializing the dialog with data. @@ -42732,22 +42732,22 @@ </histogram> <histogram name="MediaRouter.Ui.Dialog.Paint" units="ms"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> Duration in milliseconds taken from a user click to open the Media Router dialog to the initial paint. </summary> </histogram> -<histogram name="MediaRouter.Ui.FirstAction" units="MediaRouterUserAction"> - <owner>apacible@chromium.org</owner> +<histogram name="MediaRouter.Ui.FirstAction" enum="MediaRouterUserAction"> + <owner>takumif@chromium.org</owner> <summary> The first action taken by the user after opening the Media Router dialog. </summary> </histogram> <histogram name="MediaRouter.Ui.InitialState" enum="MediaRouterInitialViews"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> The view that was shown when the Media Router dialog is initially opened. </summary> @@ -42755,7 +42755,7 @@ <histogram name="MediaRouter.Ui.Navigate.SourceSelection" enum="MediaRouterSourceTypes"> - <owner>apacible@chromium.org</owner> + <owner>takumif@chromium.org</owner> <summary> The number of times the user selects a specific cast source type. </summary> @@ -81151,6 +81151,14 @@ </summary> </histogram> +<histogram name="ResourceCoordinator.LocalDB.OnDiskSize" units="KB"> + <owner>sebmarchand@chromium.org</owner> + <summary> + The size of the Local Site Characteristics database on disk. Recorded at + startup when the database gets opened. + </summary> +</histogram> + <histogram name="ResourcePrefetchPredictor.CachePattern" enum="HttpCachePattern"> <obsolete>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 19daeb7..53c9304 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -3532,6 +3532,12 @@ example). </summary> </metric> + <metric name="FailureLiveStateDevToolsOpen"> + <summary> + Booling indicating that the intervention was disallowed because the tab is + currently using DevTools. + </summary> + </metric> <metric name="FailureLiveStateExtensionDisallowed"> <summary> Booling indicating that the intervention was disallowed by an extension.
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index ad284010..b22494c 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -232,6 +232,7 @@ # unused JNI functions. android_library("ui_utils_java") { java_files = [ + "java/src/org/chromium/ui/ContactsPickerListener.java", "java/src/org/chromium/ui/PhotoPickerListener.java", "java/src/org/chromium/ui/UiUtils.java", ]
diff --git a/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java b/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java new file mode 100644 index 0000000..67e7d52 --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/ContactsPickerListener.java
@@ -0,0 +1,25 @@ +// 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.ui; + +/** + * The callback used to indicate what action the user took in the picker. + */ +public interface ContactsPickerListener { + /** + * The action the user took in the picker. + */ + enum ContactsPickerAction { + CANCEL, + CONTACTS_SELECTED, + } + + /** + * Called when the user has selected an action. For possible actions see above. + * + * @param contacts The contacts that were selected. + */ + void onContactsPickerUserAction(ContactsPickerAction action, String[] contacts); +}
diff --git a/ui/android/java/src/org/chromium/ui/PhotoPickerListener.java b/ui/android/java/src/org/chromium/ui/PhotoPickerListener.java index a2321d1..1bc82eb 100644 --- a/ui/android/java/src/org/chromium/ui/PhotoPickerListener.java +++ b/ui/android/java/src/org/chromium/ui/PhotoPickerListener.java
@@ -29,5 +29,5 @@ * * @param photos The photos that were selected. */ - void onPickerUserAction(Action action, String[] photos); + void onPhotoPickerUserAction(Action action, String[] photos); }
diff --git a/ui/android/java/src/org/chromium/ui/UiUtils.java b/ui/android/java/src/org/chromium/ui/UiUtils.java index aefb188..6363258 100644 --- a/ui/android/java/src/org/chromium/ui/UiUtils.java +++ b/ui/android/java/src/org/chromium/ui/UiUtils.java
@@ -85,6 +85,9 @@ /** A delegate for the photo picker. */ private static PhotoPickerDelegate sPhotoPickerDelegate; + /** A delegate for the contacts picker. */ + private static ContactsPickerDelegate sContactsPickerDelegate; + /** * A delegate that can be implemented to override whether or not keyboard detection will be * used. @@ -120,6 +123,64 @@ void onPhotoPickerDismissed(); } + // ContactsPickerDelegate: + + /** + * Allows setting a delegate for an Android contacts picker. + * @param delegate A {@link ContactsPickerDelegate} instance. + */ + public static void setContactsPickerDelegate(ContactsPickerDelegate delegate) { + sContactsPickerDelegate = delegate; + } + + /** + * Returns whether a contacts picker should be called. + */ + public static boolean shouldShowContactsPicker() { + return sContactsPickerDelegate != null; + } + + /** + * Called to display the contacts picker. + * @param context The context to use. + * @param listener The listener that will be notified of the action the user took in the + * picker. + */ + public static boolean showContactsPicker( + Context context, ContactsPickerListener listener, boolean allowMultiple) { + if (sContactsPickerDelegate == null) return false; + sContactsPickerDelegate.showContactsPicker(context, listener, allowMultiple); + return true; + } + + /** + * Called when the contacts picker dialog has been dismissed. + */ + public static void onContactsPickerDismissed() { + if (sContactsPickerDelegate == null) return; + sContactsPickerDelegate.onContactsPickerDismissed(); + } + + /** + * A delegate interface for the contacts picker. + */ + public interface ContactsPickerDelegate { + /** + * Called to display the contacts picker. + * @param context The context to use. + * @param listener The listener that will be notified of the action the user took in the + * picker. + * @param allowMultiple Whether to allow multiple contacts to be picked. + */ + void showContactsPicker( + Context context, ContactsPickerListener listener, boolean allowMultiple); + + /** + * Called when the contacts picker dialog has been dismissed. + */ + void onContactsPickerDismissed(); + } + // PhotoPickerDelegate: /**
diff --git a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java index 2e0a6f6..f33e1fa 100644 --- a/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java +++ b/ui/android/java/src/org/chromium/ui/base/DeviceFormFactor.java
@@ -5,7 +5,6 @@ package org.chromium.ui.base; import android.content.Context; -import android.os.Build; import android.support.annotation.UiThread; import org.chromium.base.ContextUtils; @@ -86,28 +85,22 @@ return detectScreenWidthBucket(context) == SCREEN_BUCKET_LARGET_TABLET; } + /** + * Detect the screen width bucket by loading the min_screen_width_bucket value (Android will + * select the value from the correct directory; values, *-sw600dp, *-sw720dp). We can't use any + * shortcuts here since there are several devices that are phone or tablet, but load each + * others' resources (see https://crbug.com/850096 and https://crbug.com/669974 for more info). + * @param context An Android context to read resources from. + * @return The screen width bucket the device is in (see constants at the top of this class). + */ private static int detectScreenWidthBucket(Context context) { - // Pre-JB MR1, Display.getSize() is used rather than Display.getRealSize(). - // For our query, getSize() is not always correct. https://crbug.com/829318 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 - // TODO(agrieve): Remove thread check and audit for background usages. - // https://crbug.com/669974 - && ThreadUtils.runningOnUiThread() - && !isTabletDisplay(DisplayAndroid.getNonMultiDisplay(context))) { - // There have been no cases where tablet resources end up being used on phone-sized - // displays. Short-circuit this common-case since checking resources is slower (and - // triggers a strict-mode violation when value is not cached). - return 0; - } return context.getResources().getInteger(R.integer.min_screen_width_bucket); } private static int detectScreenWidthBucket(WindowAndroid windowAndroid) { ThreadUtils.assertOnUiThread(); Context context = windowAndroid.getContext().get(); - if (context == null || !isTabletDisplay(windowAndroid.getDisplay())) { - return 0; - } + if (context == null) return 0; return context.getResources().getInteger(R.integer.min_screen_width_bucket); } @@ -127,9 +120,4 @@ public static int getMinimumTabletWidthPx(DisplayAndroid display) { return DisplayUtil.dpToPx(display, DeviceFormFactor.MINIMUM_TABLET_WIDTH_DP); } - - // Function is private to ensure that Context is also consulted when answering this query. - private static boolean isTabletDisplay(DisplayAndroid display) { - return DisplayUtil.getSmallestWidth(display) >= getMinimumTabletWidthPx(display); - } }
diff --git a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java index 1af6795..165c03a 100644 --- a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java +++ b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
@@ -29,6 +29,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.ui.ContactsPickerListener; import org.chromium.ui.PhotoPickerListener; import org.chromium.ui.R; import org.chromium.ui.UiUtils; @@ -45,7 +46,8 @@ * a set of accepted file types. The path of the selected file is passed to the native dialog. */ @JNINamespace("ui") -public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPickerListener { +public class SelectFileDialog + implements WindowAndroid.IntentCallback, ContactsPickerListener, PhotoPickerListener { private static final String TAG = "SelectFileDialog"; private static final String IMAGE_TYPE = "image/"; private static final String VIDEO_TYPE = "video/"; @@ -153,7 +155,11 @@ new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION)); List<String> missingPermissions = new ArrayList<>(); - if (shouldUsePhotoPicker()) { + if (shouldUseContactsPicker()) { + if (!window.hasPermission(Manifest.permission.READ_CONTACTS)) { + missingPermissions.add(Manifest.permission.READ_CONTACTS); + } + } else if (shouldUsePhotoPicker()) { if (!window.hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) { missingPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); } @@ -234,9 +240,19 @@ if (mWindowAndroid.showIntent(soundRecorder, this, R.string.low_memory_error)) return; } - // Use the new photo picker, if available. Activity activity = mWindowAndroid.getActivity().get(); List<String> imageMimeTypes = convertToImageMimeTypes(mFileTypes); + + // Use the new contacts picker, if available. + if (shouldUseContactsPicker() + && UiUtils.showContactsPicker(activity, this, mAllowMultiple)) { + // Since showContactsPicker only has a not-implemented message, cancel the request so + // we can serve others. This will be removed once showContactsPicker is implemented. + onFileNotSelected(); + return; + } + + // Use the new photo picker, if available. if (shouldUsePhotoPicker() && UiUtils.showPhotoPicker(activity, this, mAllowMultiple, imageMimeTypes)) { return; @@ -304,6 +320,19 @@ } /** + * Determines whether the contacts picker should be used for this select file request. To be + * applicable for the contacts picker, the following must be true: + * 1.) Only text/json+contacts must be specicied as an accepted type. + * 2.) The contacts picker is supported by the embedder (i.e. Chrome). + * 3.) There is a valid Android Activity associated with the file request. + */ + private boolean shouldUseContactsPicker() { + if (mFileTypes.size() != 1) return false; + if (!mFileTypes.get(0).equals("text/json+contacts")) return false; + return UiUtils.shouldShowContactsPicker() && mWindowAndroid.getActivity().get() != null; + } + + /** * Converts a list of extensions and Mime types to a list of de-duped Mime types containing * image types only. If the input list contains a non-image type, then null is returned. * @param fileTypes the list of filetypes (extensions and Mime types) to convert. @@ -347,7 +376,7 @@ } @Override - public void onPickerUserAction(Action action, String[] photos) { + public void onPhotoPickerUserAction(Action action, String[] photos) { switch (action) { case CANCEL: onFileNotSelected(); @@ -403,6 +432,19 @@ } } + @Override + public void onContactsPickerUserAction(ContactsPickerAction action, String[] contacts) { + switch (action) { + case CANCEL: + onFileNotSelected(); + break; + + case CONTACTS_SELECTED: + onFileNotSelected(); + break; + } + } + private class GetCameraIntentTask extends AsyncTask<Void, Void, Uri> { private Boolean mDirectToCamera; private WindowAndroid mWindow;
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js index 34149185..4c6c336 100644 --- a/ui/login/display_manager.js +++ b/ui/login/display_manager.js
@@ -15,6 +15,7 @@ /** @const */ var SCREEN_OOBE_RESET = 'reset'; /** @const */ var SCREEN_OOBE_ENROLLMENT = 'oauth-enrollment'; /** @const */ var SCREEN_OOBE_DEMO_SETUP = 'demo-setup'; +/** @const */ var SCREEN_OOBE_DEMO_PREFERENCES = 'demo-preferences'; /** @const */ var SCREEN_OOBE_KIOSK_ENABLE = 'kiosk-enable'; /** @const */ var SCREEN_OOBE_AUTO_ENROLLMENT_CHECK = 'auto-enrollment-check'; /** @const */ var SCREEN_GAIA_SIGNIN = 'gaia-signin';
diff --git a/ui/views/controls/menu/submenu_view.cc b/ui/views/controls/menu/submenu_view.cc index 3be22e1..cdb36b6 100644 --- a/ui/views/controls/menu/submenu_view.cc +++ b/ui/views/controls/menu/submenu_view.cc
@@ -385,6 +385,7 @@ const gfx::Rect& bounds, bool do_capture) { if (host_) { + host_->SetMenuHostBounds(bounds); host_->ShowMenuHost(do_capture); } else { host_ = new MenuHost(this);
diff --git a/ui/views/style/platform_style.cc b/ui/views/style/platform_style.cc index 2ee8334..564d6e6 100644 --- a/ui/views/style/platform_style.cc +++ b/ui/views/style/platform_style.cc
@@ -42,8 +42,8 @@ // Set kFocusHaloInset to negative half of kFocusHaloThickness to draw half of // the focus ring inside and half outside the parent elmeent -const float PlatformStyle::kFocusHaloThickness = 4.f; -const float PlatformStyle::kFocusHaloInset = -2.f; +const float PlatformStyle::kFocusHaloThickness = 2.f; +const float PlatformStyle::kFocusHaloInset = -1.f; #if !defined(OS_MACOSX)