diff --git a/DEPS b/DEPS index eb6263e..36ad85b 100644 --- a/DEPS +++ b/DEPS
@@ -144,7 +144,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'ff2e8fe65f5610a846c69ef5fb12a3fba524dce1', + 'skia_revision': '96d2ee0fd0bb09d1505a89987341557bbdf2fcff', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -156,11 +156,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '6f0780f8e42e97353a801cbf5c9baae11238df6d', + 'angle_revision': 'ec9ff8ce3909ec618842d1922aacf6c6cd961b2e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '52ce1e9f23861cddc58db9646f32de67d8808111', + 'swiftshader_revision': '6448bd6606392e3fec18b2b7fb7fb43da5a2996e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -275,11 +275,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'shaderc_revision': '1f2dec1e12341170ebdc7723111ec17537cf8336', + 'shaderc_revision': '72988e40a45ea46bfd615420b060c0b923a7a866', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'c8ab96cdd907c53a6147beaf3e2dcda943818e3f', + 'dawn_revision': '4af9808400d993f58977ed7d320b1f912e92573f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -808,7 +808,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '83b0f9357fe17c0b9fd97a78bc57967ea6315bc6', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd6f3722b5323b8a1db14c2061e610bac90f0ad10', 'condition': 'checkout_linux', }, @@ -833,7 +833,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '65c2b1e1d17e7f444b965a5eeefa2af8f0d61216', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0fb33b26eb533a6f6184cab75ad50c229ee5c130', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -883,7 +883,7 @@ }, 'src/third_party/grpc/src': { - 'url': Var('chromium_git') + '/external/github.com/grpc/grpc.git' + '@' + 'c007642f109a2f50b8ed3e4626880539ba55aca5', + 'url': Var('chromium_git') + '/external/github.com/grpc/grpc.git' + '@' + '74b981a6a3d9ba17f3acae1d72b9109325ef656d', }, 'src/third_party/freetype/src': @@ -1194,7 +1194,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '8707d4db8017e42563b45565dd0fdad217860d4a', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '3d5856c03a84d75057ce46e168e055811f8f9611', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1403,7 +1403,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9a756b715c2871026e698448c22dc30e520ad88b', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ded8bf94b4c3b28429000446e038f3e252c17072', 'condition': 'checkout_src_internal', },
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 07008ac0..6edfa6db 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -190,8 +190,6 @@ "assistant/assistant_interaction_controller.h", "assistant/assistant_notification_controller.cc", "assistant/assistant_notification_controller.h", - "assistant/assistant_notification_expiry_monitor.cc", - "assistant/assistant_notification_expiry_monitor.h", "assistant/assistant_screen_context_controller.cc", "assistant/assistant_screen_context_controller.h", "assistant/assistant_settings.cc", @@ -221,6 +219,8 @@ "dbus/ash_dbus_services.h", "dbus/display_service_provider.cc", "dbus/display_service_provider.h", + "dbus/gesture_properties_service_provider.cc", + "dbus/gesture_properties_service_provider.h", "dbus/liveness_service_provider.cc", "dbus/liveness_service_provider.h", "dbus/url_handler_service_provider.cc", @@ -1413,6 +1413,7 @@ "//ui/message_center", "//ui/native_theme", "//ui/ozone", + "//ui/ozone/public/interfaces:gesture_properties_service", "//ui/platform_window", "//ui/platform_window/stub", "//ui/snapshot", @@ -1563,6 +1564,7 @@ copy("dbus_service_files") { sources = [ "dbus/org.chromium.DisplayService.conf", + "dbus/org.chromium.GesturePropertiesService.conf", "dbus/org.chromium.LivenessService.conf", "dbus/org.chromium.UrlHandlerService.conf", ] @@ -1601,13 +1603,13 @@ "app_menu/notification_menu_view_unittest.cc", "app_menu/notification_overflow_view_unittest.cc", "assistant/assistant_controller_unittest.cc", - "assistant/assistant_notification_controller_unittest.cc", "assistant/assistant_screen_context_controller_unittest.cc", "assistant/model/assistant_query_history_unittest.cc", "assistant/ui/assistant_container_view_unittest.cc", "assistant/util/deep_link_util_unittest.cc", "autoclick/autoclick_drag_event_rewriter_unittest.cc", "autoclick/autoclick_unittest.cc", + "dbus/gesture_properties_service_provider_unittest.cc", "dbus/url_handler_service_provider_unittest.cc", "detachable_base/detachable_base_handler_unittest.cc", "detachable_base/detachable_base_notification_controller_unittest.cc", @@ -1933,6 +1935,7 @@ "//chromeos/dbus/hammerd", "//chromeos/dbus/power", "//chromeos/dbus/power:power_manager_proto", + "//chromeos/dbus/services:test_support", # TODO(https://crbug.com/644355): Remove Shill dependencies. "//chromeos/network:test_support", @@ -1997,6 +2000,7 @@ "//ui/message_center", "//ui/message_center:test_support", "//ui/message_center/public/cpp", + "//ui/ozone/testhelpers:mock_gesture_properties_service", "//ui/resources", "//ui/snapshot", "//ui/strings",
diff --git a/ash/app_list/model/search/search_model.cc b/ash/app_list/model/search/search_model.cc index 7de4def..9c49536 100644 --- a/ash/app_list/model/search/search_model.cc +++ b/ash/app_list/model/search/search_model.cc
@@ -53,9 +53,8 @@ if (matches.size() == max_results) break; SearchResult* item = results->GetItemAt(i); - if (result_filter.Run(*item)) { + if (result_filter.Run(*item)) matches.push_back(item); - } } return matches; }
diff --git a/ash/app_list/views/search_result_tile_item_list_view.cc b/ash/app_list/views/search_result_tile_item_list_view.cc index 5e7a5f00..04c794b 100644 --- a/ash/app_list/views/search_result_tile_item_list_view.cc +++ b/ash/app_list/views/search_result_tile_item_list_view.cc
@@ -254,19 +254,20 @@ base::string16 query; base::TrimWhitespace(raw_query, base::TRIM_ALL, &query); - // We ask for |max_search_result_tiles_| total results, and we prefer - // reinstall candidates if appropriate. we fetch |reinstall_results| first, - // and front-fill the rest from the regular result types. - auto reinstall_filter = + // We ask for |max_search_result_tiles_| policy tile results first, + // then add them to their preferred position in the tile list if found. + auto policy_tiles_filter = base::BindRepeating([](const SearchResult& r) -> bool { - return r.display_type() == - ash::SearchResultDisplayType::kRecommendation && - r.result_type() == ash::SearchResultType::kPlayStoreReinstallApp; + return r.display_location() == + ash::SearchResultDisplayLocation::kTileListContainer && + r.display_index() != ash::SearchResultDisplayIndex::kUndefined && + r.display_type() == + ash::SearchResultDisplayType::kRecommendation; }); - std::vector<SearchResult*> reinstall_results = + std::vector<SearchResult*> policy_tiles_results = is_app_reinstall_recommendation_enabled_ && query.empty() ? SearchModel::FilterSearchResultsByFunction( - results(), reinstall_filter, max_search_result_tiles_) + results(), policy_tiles_filter, max_search_result_tiles_) : std::vector<SearchResult*>(); SearchResult::DisplayType display_type = @@ -274,10 +275,11 @@ ? (query.empty() ? ash::SearchResultDisplayType::kRecommendation : ash::SearchResultDisplayType::kTile) : ash::SearchResultDisplayType::kTile; - size_t display_num = max_search_result_tiles_ - reinstall_results.size(); + size_t display_num = max_search_result_tiles_ - policy_tiles_results.size(); - // Do not display the continue reading app in the search result list. - auto non_reinstall_filter = base::BindRepeating( + // Do not display the repeat reinstall results or continue reading app in the + // search result list. + auto non_policy_tiles_filter = base::BindRepeating( [](const SearchResult::DisplayType& display_type, const SearchResult& r) -> bool { return r.display_type() == display_type && @@ -288,11 +290,25 @@ display_type); std::vector<SearchResult*> display_results = SearchModel::FilterSearchResultsByFunction( - results(), non_reinstall_filter, display_num); + results(), non_policy_tiles_filter, display_num); - // Append the reinstalls to the display results. - display_results.insert(display_results.end(), reinstall_results.begin(), - reinstall_results.end()); + // Policy tile results will be appended to the final tiles list + // based on their specified index. If the requested index is out of + // range of the current list, the result will be appended to the back. + std::sort(policy_tiles_results.begin(), policy_tiles_results.end(), + [](const SearchResult* r1, const SearchResult* r2) -> bool { + return r1->display_index() < r2->display_index(); + }); + + for (auto* result : policy_tiles_results) { + // if the app is requesting to be placed in an index out of bounds + if (result->display_index() + 1 > display_results.size()) { + display_results.emplace_back(result); + } else { + display_results.emplace(display_results.begin() + result->display_index(), + result); + } + } return display_results; }
diff --git a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc index 1bfd473..abb8a5f3 100644 --- a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc +++ b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc
@@ -29,6 +29,9 @@ constexpr size_t kInstalledApps = 4; constexpr size_t kPlayStoreApps = 2; constexpr size_t kRecommendedApps = 1; + +// used to test when multiple policy chips have been added +constexpr size_t kMultipleRecommendedApps = 3; } // namespace class SearchResultTileItemListViewTest @@ -125,6 +128,9 @@ result->set_result_id("RecommendedApp " + base::NumberToString(i)); result->set_display_type(ash::SearchResultDisplayType::kRecommendation); result->set_result_type(ash::SearchResultType::kPlayStoreReinstallApp); + result->set_display_location( + ash::SearchResultDisplayLocation::kTileListContainer); + result->set_display_index(ash::SearchResultDisplayIndex::kSixthIndex); result->set_title(base::ASCIIToUTF16("RecommendedApp ") + base::NumberToString16(i)); result->SetRating(1 + i); @@ -137,6 +143,73 @@ RunPendingMessages(); } + void SetUpSearchResultsWithMultiplePolicies() { + SearchModel::SearchResults* results = GetResults(); + + const ash::SearchResultDisplayIndex policy_indexes[3] = { + ash::SearchResultDisplayIndex::kFourthIndex, + ash::SearchResultDisplayIndex::kFifthIndex, + ash::SearchResultDisplayIndex::kSixthIndex, + }; + + // Populate results for installed applications. + for (size_t i = 0; i < kInstalledApps; ++i) { + std::unique_ptr<TestSearchResult> result = + std::make_unique<TestSearchResult>(); + result->set_result_id("InstalledApp " + base::NumberToString(i)); + result->set_display_type(ash::SearchResultDisplayType::kTile); + result->set_result_type(ash::SearchResultType::kInstalledApp); + result->set_title(base::ASCIIToUTF16("InstalledApp ") + + base::NumberToString16(i)); + results->Add(std::move(result)); + } + + // Populate results for Play Store search applications. + if (IsPlayStoreAppSearchEnabled()) { + for (size_t i = 0; i < kPlayStoreApps; ++i) { + std::unique_ptr<TestSearchResult> result = + std::make_unique<TestSearchResult>(); + result->set_result_id("PlayStoreApp " + base::NumberToString(i)); + result->set_display_type(ash::SearchResultDisplayType::kTile); + result->set_result_type(ash::SearchResultType::kPlayStoreApp); + result->set_title(base::ASCIIToUTF16("PlayStoreApp ") + + base::NumberToString16(i)); + result->SetRating(1 + i); + result->SetFormattedPrice(base::ASCIIToUTF16("Price ") + + base::NumberToString16(i)); + results->Add(std::move(result)); + } + } + + if (IsReinstallAppRecommendationEnabled()) { + for (size_t i = 0; i < kMultipleRecommendedApps; ++i) { + std::unique_ptr<TestSearchResult> result = + std::make_unique<TestSearchResult>(); + result->set_result_id("RecommendedApp " + base::NumberToString(i)); + result->set_display_type(ash::SearchResultDisplayType::kRecommendation); + result->set_result_type(ash::SearchResultType::kPlayStoreReinstallApp); + result->set_display_location( + ash::SearchResultDisplayLocation::kTileListContainer); + result->set_display_index(policy_indexes[i]); + result->set_title(base::ASCIIToUTF16("RecommendedApp ") + + base::NumberToString16(i)); + result->SetRating(1 + i); + results->Add(std::move(result)); + } + } + + for (size_t i = 0; i < results->item_count(); ++i) { + if (results->GetItemAt(i)->display_index() != + ash::SearchResultDisplayIndex::kUndefined) { + results->Move(i, results->GetItemAt(i)->display_index()); + } + } + + // Adding results calls SearchResultContainerView::ScheduleUpdate(). + // It will post a delayed task to update the results and relayout. + RunPendingMessages(); + } + size_t GetOpenResultCount(int ranking) { return view_delegate_.open_search_result_counts()[ranking]; } @@ -244,6 +317,29 @@ } } +TEST_P(SearchResultTileItemListViewTest, TestRecommendations) { + CreateSearchResultTileItemListView(); + SetUpSearchResultsWithMultiplePolicies(); + + const size_t child_step = 2; + + size_t first_index = kInstalledApps + kMultipleRecommendedApps; + + if (IsReinstallAppRecommendationEnabled()) { + size_t stepper = IsPlayStoreAppSearchEnabled() ? 3 : 2; + for (size_t i = 0; i < stepper; ++i) { + ui::AXNodeData node_data; + view()->children()[first_index + (i)*child_step]->GetAccessibleNodeData( + &node_data); + EXPECT_EQ(ax::mojom::Role::kButton, node_data.role); + EXPECT_EQ( + "RecommendedApp " + base::NumberToString(i) + ", Star rating " + + base::NumberToString(i + 1) + ".0, App recommendation", + node_data.GetStringAttribute(ax::mojom::StringAttribute::kName)); + } + } +} + INSTANTIATE_TEST_SUITE_P(, SearchResultTileItemListViewTest, testing::ValuesIn({std::make_pair(false, false),
diff --git a/ash/app_list/views/suggestion_chip_container_view.cc b/ash/app_list/views/suggestion_chip_container_view.cc index e77b757..ef78cf1 100644 --- a/ash/app_list/views/suggestion_chip_container_view.cc +++ b/ash/app_list/views/suggestion_chip_container_view.cc
@@ -4,6 +4,7 @@ #include "ash/app_list/views/suggestion_chip_container_view.h" +#include <algorithm> #include <memory> #include "ash/app_list/app_list_util.h" @@ -28,16 +29,10 @@ // The spacing between chips. constexpr int kChipSpacing = 8; -// Sort suggestion chip results by |display_index| value in ascending order. -bool IndexOrdering(const SearchResult* result1, const SearchResult* result2) { - return result1->display_index() < result2->display_index(); -} - -bool IsPolicySuggestionChip(const SearchResult* result) { - return result->display_location() == +bool IsPolicySuggestionChip(const SearchResult& result) { + return result.display_location() == ash::SearchResultDisplayLocation::kSuggestionChipContainer && - result->display_index() != - ash::SearchResultDisplayIndex::kPlacementUndefined; + result.display_index() != ash::SearchResultDisplayIndex::kUndefined; } } // namespace @@ -87,7 +82,7 @@ // Filter out priority suggestion chips with a non-default value // for |display_index|. auto filter_indexed_policy_chips = [](const SearchResult& r) -> bool { - return IsPolicySuggestionChip(&r); + return IsPolicySuggestionChip(r); }; std::vector<SearchResult*> indexed_policy_results = SearchModel::FilterSearchResultsByFunction( @@ -95,7 +90,9 @@ AppListConfig::instance().num_start_page_tiles()); std::sort(indexed_policy_results.begin(), indexed_policy_results.end(), - &IndexOrdering); + [](const SearchResult* r1, const SearchResult* r2) -> bool { + return r1->display_index() < r2->display_index(); + }); // Need to filter out kArcAppShortcut since it will be confusing to users // if shortcuts are displayed as suggestion chips. Also filter out any @@ -104,7 +101,7 @@ return r.display_type() == ash::SearchResultDisplayType::kRecommendation && r.result_type() != ash::SearchResultType::kPlayStoreReinstallApp && r.result_type() != ash::SearchResultType::kArcAppShortcut && - !IsPolicySuggestionChip(&r); + !IsPolicySuggestionChip(r); }; std::vector<SearchResult*> display_results = SearchModel::FilterSearchResultsByFunction( @@ -115,11 +112,9 @@ // Update display results list by placing policy result chips at their // specified |display_index|. for (auto* result : indexed_policy_results) { - std::vector<SearchResult*>::iterator desired_index = - display_results.begin() + result->display_index(); - display_results.emplace(desired_index, result); + display_results.emplace(display_results.begin() + result->display_index(), + result); } - // Update search results here, but wait until layout to add them as child // views when we know this view's bounds. for (size_t i = 0; i < static_cast<size_t>(
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc index 1e32def2..6328039 100644 --- a/ash/assistant/assistant_notification_controller.cc +++ b/ash/assistant/assistant_notification_controller.cc
@@ -8,7 +8,6 @@ #include <utility> #include "ash/assistant/assistant_controller.h" -#include "ash/assistant/assistant_notification_expiry_monitor.h" #include "ash/assistant/util/deep_link_util.h" #include "ash/public/cpp/notification_utils.h" #include "ash/public/cpp/vector_icons/vector_icons.h" @@ -82,7 +81,6 @@ AssistantController* assistant_controller) : assistant_controller_(assistant_controller), binding_(this), - expiry_monitor_(this), notifier_id_(GetNotifierId()) { AddModelObserver(this); assistant_controller_->AddObserver(this);
diff --git a/ash/assistant/assistant_notification_controller.h b/ash/assistant/assistant_notification_controller.h index 6a7e63e0..bd1655b 100644 --- a/ash/assistant/assistant_notification_controller.h +++ b/ash/assistant/assistant_notification_controller.h
@@ -9,7 +9,6 @@ #include "ash/ash_export.h" #include "ash/assistant/assistant_controller_observer.h" -#include "ash/assistant/assistant_notification_expiry_monitor.h" #include "ash/assistant/model/assistant_notification_model.h" #include "ash/assistant/model/assistant_notification_model_observer.h" #include "ash/assistant/model/assistant_ui_model_observer.h" @@ -98,7 +97,6 @@ mojo::Binding<mojom::AssistantNotificationController> binding_; AssistantNotificationModel model_; - AssistantNotificationExpiryMonitor expiry_monitor_; // Owned by AssistantController. chromeos::assistant::mojom::Assistant* assistant_ = nullptr;
diff --git a/ash/assistant/assistant_notification_controller_unittest.cc b/ash/assistant/assistant_notification_controller_unittest.cc deleted file mode 100644 index 0fa00a5..0000000 --- a/ash/assistant/assistant_notification_controller_unittest.cc +++ /dev/null
@@ -1,291 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/assistant/assistant_notification_controller.h" - -#include "ash/assistant/assistant_controller.h" -#include "ash/assistant/model/assistant_notification_model_observer.h" -#include "ash/shell.h" -#include "ash/test/ash_test_base.h" -#include "base/test/scoped_task_environment.h" -#include "chromeos/services/assistant/public/mojom/assistant.mojom.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace ash { - -using chromeos::assistant::mojom::AssistantNotificationPtr; -using testing::_; -using testing::Eq; -using testing::Field; -using testing::StrictMock; - -constexpr bool kAnyBool = false; - -class AssistantNotificationModelObserverMock - : public AssistantNotificationModelObserver { - public: - AssistantNotificationModelObserverMock() = default; - ~AssistantNotificationModelObserverMock() override = default; - - MOCK_METHOD1(OnNotificationAdded, - void(const AssistantNotification* notification)); - MOCK_METHOD1(OnNotificationUpdated, - void(const AssistantNotification* notification)); - MOCK_METHOD2(OnNotificationRemoved, - void(const AssistantNotification* notification, - bool from_server)); - MOCK_METHOD1(OnAllNotificationsRemoved, void(bool from_server)); - - private: - DISALLOW_COPY_AND_ASSIGN(AssistantNotificationModelObserverMock); -}; - -MATCHER_P(IdIs, expected_id, "") { - if (arg->client_id != expected_id) { - *result_listener << "Received notification with a wrong id.\n" - << "Expected:\n '" << expected_id << "'\n" - << "Actual:\n '" << arg->client_id << "'\n"; - return false; - } - return true; -} - -class AssistantNotificationControllerTest : public AshTestBase { - protected: - AssistantNotificationControllerTest() { - DestroyScopedTaskEnvironment(); - scoped_task_environment_ = std::make_unique< - base::test::ScopedTaskEnvironment>( - base::test::ScopedTaskEnvironment::MainThreadType::UI_MOCK_TIME, - base::test::ScopedTaskEnvironment::NowSource::MAIN_THREAD_MOCK_TIME); - } - ~AssistantNotificationControllerTest() override = default; - - void SetUp() override { - ASSERT_TRUE(chromeos::switches::IsAssistantEnabled()); - - AshTestBase::SetUp(); - - controller_ = - Shell::Get()->assistant_controller()->notification_controller(); - DCHECK(controller_); - } - - AssistantNotificationController& controller() { return *controller_; } - - AssistantNotificationModelObserverMock& AddStrictObserverMock() { - observer_ = - std::make_unique<StrictMock<AssistantNotificationModelObserverMock>>(); - controller().AddModelObserver(observer_.get()); - return *observer_; - } - - AssistantNotificationPtr CreateNotification(const std::string& id) { - auto notification = - chromeos::assistant::mojom::AssistantNotification::New(); - notification->client_id = id; - return notification; - } - - AssistantNotificationPtr CreateNotification(const std::string& id, - int timeout_ms) { - auto result = CreateNotification(id); - result->expiry_time = - base::Time::Now() + base::TimeDelta::FromMilliseconds(timeout_ms); - return result; - } - - void AddNotification(const std::string& id, int timeout_ms) { - controller().AddOrUpdateNotification(CreateNotification(id, timeout_ms)); - } - - void AddNotification(const std::string& id) { - controller().AddOrUpdateNotification(CreateNotification(id)); - } - - void UpdateNotification(const std::string& id, int timeout_ms) { - controller().AddOrUpdateNotification(CreateNotification(id, timeout_ms)); - } - - void UpdateNotification(const std::string& id) { - controller().AddOrUpdateNotification(CreateNotification(id)); - } - - void RemoveNotification(const std::string& id) { - controller().RemoveNotificationById(id, kAnyBool); - } - - void ForwardTimeInMs(int time_in_ms) { - scoped_task_environment_->FastForwardBy( - base::TimeDelta::FromMilliseconds(time_in_ms)); - } - - private: - AssistantNotificationController* controller_; - std::unique_ptr<AssistantNotificationModelObserverMock> observer_; - std::unique_ptr<base::test::ScopedTaskEnvironment> scoped_task_environment_; - - DISALLOW_COPY_AND_ASSIGN(AssistantNotificationControllerTest); -}; - -TEST_F(AssistantNotificationControllerTest, - ShouldInformObserverOfNewNotifications) { - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationAdded(IdIs("id"))); - - controller().AddOrUpdateNotification(CreateNotification("id")); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldInformObserverOfUpdatedNotifications) { - const auto notification = CreateNotification("id"); - controller().AddOrUpdateNotification(notification.Clone()); - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationUpdated(IdIs("id"))); - - controller().AddOrUpdateNotification(notification.Clone()); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldInformObserverOfRemovedNotifications) { - const auto notification = CreateNotification("id"); - controller().AddOrUpdateNotification(notification.Clone()); - constexpr bool from_server = kAnyBool; - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("id"), Eq(from_server))); - - controller().RemoveNotificationById(notification->client_id, from_server); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldInformObserverOfRemoveAllNotifications) { - const auto notification = CreateNotification("id"); - controller().AddOrUpdateNotification(notification.Clone()); - constexpr bool from_server = !kAnyBool; - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnAllNotificationsRemoved(Eq(from_server))); - - controller().RemoveAllNotifications(from_server); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldRemoveNotificationWhenItExpires) { - constexpr int timeout_ms = 1000; - AddNotification("id", timeout_ms); - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("id"), _)); - - ForwardTimeInMs(timeout_ms); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldNotRemoveNotificationsTooSoon) { - constexpr int timeout_ms = 1000; - AddNotification("id", timeout_ms); - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved).Times(0); - ForwardTimeInMs(timeout_ms - 1); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldUseFromServerFalseWhenNotificationExpires) { - constexpr int timeout_ms = 1000; - AddNotification("id", timeout_ms); - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved(_, Eq(false))); - - ForwardTimeInMs(timeout_ms); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldRemoveEachNotificationAsItExpires) { - constexpr int first_timeout_ms = 1000; - constexpr int second_timeout_ms = 1500; - - AddNotification("first", first_timeout_ms); - AddNotification("second", second_timeout_ms); - - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("first"), _)); - ForwardTimeInMs(first_timeout_ms); - - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("second"), _)); - int delta_between_notifications = second_timeout_ms - first_timeout_ms; - ForwardTimeInMs(delta_between_notifications); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldSupport2NotificationsThatExpireAtTheSameTime) { - constexpr int timeout_ms = 1000; - - AddNotification("first", timeout_ms); - AddNotification("at-same-time", timeout_ms); - - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("first"), _)); - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("at-same-time"), _)); - ForwardTimeInMs(timeout_ms); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldImmediateRemoveNotificationsThatAlreadyExpired) { - constexpr int negative_timeout = -1000; - - AddNotification("expired", negative_timeout); - - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved(IdIs("expired"), _)); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldNotRemoveNotificationsThatWereManuallyRemoved) { - constexpr int timeout = 1000; - - AddNotification("id", timeout); - RemoveNotification("id"); - - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved).Times(0); - ForwardTimeInMs(timeout); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldSupportExpiryTimeSetInUpdate) { - constexpr int timeout = 1000; - - AddNotification("id"); - UpdateNotification("id", timeout); - - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved); - ForwardTimeInMs(timeout); -} - -TEST_F(AssistantNotificationControllerTest, - ShouldNotRemoveNotificationIfExpiryTimeIsClearedInUpdate) { - constexpr int timeout = 1000; - - AddNotification("id", timeout); - UpdateNotification("id"); - - auto& observer = AddStrictObserverMock(); - - EXPECT_CALL(observer, OnNotificationRemoved).Times(0); - ForwardTimeInMs(timeout); -} - -} // namespace ash
diff --git a/ash/assistant/assistant_notification_expiry_monitor.cc b/ash/assistant/assistant_notification_expiry_monitor.cc deleted file mode 100644 index ad153820..0000000 --- a/ash/assistant/assistant_notification_expiry_monitor.cc +++ /dev/null
@@ -1,130 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/assistant/assistant_notification_expiry_monitor.h" - -#include "ash/assistant/assistant_notification_controller.h" -#include "ash/assistant/model/assistant_notification_model.h" -#include "ash/assistant/model/assistant_notification_model_observer.h" -#include "base/bind.h" -#include "chromeos/services/assistant/public/mojom/assistant.mojom.h" - -namespace ash { - -namespace { - -bool HasExpired(const AssistantNotificationExpiryMonitor::AssistantNotification* - notification) { - return notification->expiry_time.has_value() && - (notification->expiry_time.value() <= base::Time::Now()); -} - -// Returns the minimum of the base::Time instances that actually have a value. -base::Optional<base::Time> Min(base::Optional<base::Time> left, - base::Optional<base::Time> right) { - if (!left.has_value()) - return right; - - if (!right.has_value()) - return left; - - return std::min(left.value(), right.value()); -} - -} // namespace - -class AssistantNotificationExpiryMonitor::Observer - : public AssistantNotificationModelObserver { - public: - Observer(AssistantNotificationExpiryMonitor* monitor) : monitor_(monitor) {} - ~Observer() override = default; - - void OnNotificationAdded(const AssistantNotification* notification) override { - monitor_->UpdateTimer(); - } - - void OnNotificationUpdated( - const AssistantNotification* notification) override { - monitor_->UpdateTimer(); - } - - void OnNotificationRemoved(const AssistantNotification* notification, - bool from_server) override { - monitor_->UpdateTimer(); - } - - void OnAllNotificationsRemoved(bool from_server) override { - monitor_->UpdateTimer(); - } - - private: - AssistantNotificationExpiryMonitor* const monitor_; - - DISALLOW_COPY_AND_ASSIGN(Observer); -}; - -AssistantNotificationExpiryMonitor::AssistantNotificationExpiryMonitor( - AssistantNotificationController* controller) - : controller_(controller), observer_(std::make_unique<Observer>(this)) { - DCHECK(controller_); - controller_->AddModelObserver(observer_.get()); -} - -AssistantNotificationExpiryMonitor::~AssistantNotificationExpiryMonitor() = - default; - -void AssistantNotificationExpiryMonitor::UpdateTimer() { - base::Optional<base::TimeDelta> timeout = GetTimerTimeout(); - if (timeout) { - timer_.Start( - FROM_HERE, timeout.value(), - base::BindOnce( - &AssistantNotificationExpiryMonitor::RemoveExpiredNotifications, - base::Unretained(this))); - } else { - timer_.Stop(); - } -} - -base::Optional<base::TimeDelta> -AssistantNotificationExpiryMonitor::GetTimerTimeout() const { - base::Optional<base::Time> endtime = GetTimerEndTime(); - if (endtime) - return endtime.value() - base::Time::Now(); - return base::nullopt; -} - -base::Optional<base::Time> AssistantNotificationExpiryMonitor::GetTimerEndTime() - const { - base::Optional<base::Time> result = base::nullopt; - for (const AssistantNotification* notification : GetNotifications()) - result = Min(result, notification->expiry_time); - return result; -} - -void AssistantNotificationExpiryMonitor::RemoveExpiredNotifications() { - for (const NotificationId& id : GetExpiredNotifications()) { - VLOG(1) << "Removing expired notification '" << id << "'"; - controller_->RemoveNotificationById(id, /*from_server=*/false); - } - - UpdateTimer(); -} - -std::vector<AssistantNotificationExpiryMonitor::NotificationId> -AssistantNotificationExpiryMonitor::GetExpiredNotifications() const { - std::vector<NotificationId> result; - for (const AssistantNotification* notification : GetNotifications()) { - if (HasExpired(notification)) - result.push_back(notification->client_id); - } - return result; -} - -std::vector<const AssistantNotificationExpiryMonitor::AssistantNotification*> -AssistantNotificationExpiryMonitor::GetNotifications() const { - return controller_->model()->GetNotifications(); -} - -} // namespace ash
diff --git a/ash/assistant/assistant_notification_expiry_monitor.h b/ash/assistant/assistant_notification_expiry_monitor.h deleted file mode 100644 index ba99e5a1..0000000 --- a/ash/assistant/assistant_notification_expiry_monitor.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_ -#define ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_ - -#include <memory> -#include <vector> - -#include "ash/assistant/model/assistant_notification_model_observer.h" -#include "base/optional.h" -#include "base/timer/timer.h" - -namespace ash { - -class AssistantNotificationController; - -// Will track all Assistant notifications by subscribing to the given -// |controller| and will call -// |AssistantNotificationController::RemoveNotificationById| when the -// notification expires (i.e. when the current time passes the value in the -// expiry_time| field). -class AssistantNotificationExpiryMonitor { - public: - using AssistantNotification = - chromeos::assistant::mojom::AssistantNotification; - - explicit AssistantNotificationExpiryMonitor( - AssistantNotificationController* controller); - ~AssistantNotificationExpiryMonitor(); - - private: - using NotificationId = std::string; - class Observer; - - // Start/stop the timer waiting for the next expiry time. - // If the timer is already running this will start a new timer with the - // (new) expiry time that will expire first. - void UpdateTimer(); - - base::Optional<base::TimeDelta> GetTimerTimeout() const; - base::Optional<base::Time> GetTimerEndTime() const; - void RemoveExpiredNotifications(); - std::vector<NotificationId> GetExpiredNotifications() const; - std::vector<const AssistantNotification*> GetNotifications() const; - - base::OneShotTimer timer_; - AssistantNotificationController* const controller_; - std::unique_ptr<Observer> observer_; - - DISALLOW_COPY_AND_ASSIGN(AssistantNotificationExpiryMonitor); -}; - -} // namespace ash -#endif // ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
diff --git a/ash/assistant/model/assistant_notification_model.cc b/ash/assistant/model/assistant_notification_model.cc index af725f1..875396f 100644 --- a/ash/assistant/model/assistant_notification_model.cc +++ b/ash/assistant/model/assistant_notification_model.cc
@@ -79,16 +79,11 @@ } std::vector<const chromeos::assistant::mojom::AssistantNotification*> -AssistantNotificationModel::GetNotifications() const { - return GetNotificationsByType(base::nullopt); -} - -std::vector<const chromeos::assistant::mojom::AssistantNotification*> AssistantNotificationModel::GetNotificationsByType( - base::Optional<AssistantNotificationType> type) const { + AssistantNotificationType type) const { std::vector<const AssistantNotification*> notifications; for (const auto& notification : notifications_) { - if (!type || notification.second->type == type.value()) + if (notification.second->type == type) notifications.push_back(notification.second.get()); } return notifications;
diff --git a/ash/assistant/model/assistant_notification_model.h b/ash/assistant/model/assistant_notification_model.h index a203f99..22c8dbf 100644 --- a/ash/assistant/model/assistant_notification_model.h +++ b/ash/assistant/model/assistant_notification_model.h
@@ -58,12 +58,8 @@ const AssistantNotification* GetNotificationById(const std::string& id) const; // Returns all notifications matching the specified |type|. - // Use base::nullopt to return all notifications independent of their type. std::vector<const AssistantNotification*> GetNotificationsByType( - base::Optional<AssistantNotificationType> type) const; - - // Returns all notifications (that have not been removed). - std::vector<const AssistantNotification*> GetNotifications() const; + AssistantNotificationType type) const; // Returns true if the model contains a notification uniquely identified by // |id|, otherwise false.
diff --git a/ash/dbus/DEPS b/ash/dbus/DEPS index 83a2f47..825e5ca3 100644 --- a/ash/dbus/DEPS +++ b/ash/dbus/DEPS
@@ -3,3 +3,9 @@ "+chromeos/dbus/services", "+dbus", ] + +specific_include_rules = { + ".*test\.cc": [ + "+gmock/gmock.h", + ] +}
diff --git a/ash/dbus/ash_dbus_services.cc b/ash/dbus/ash_dbus_services.cc index 5cc7ce67..028f8ab 100644 --- a/ash/dbus/ash_dbus_services.cc +++ b/ash/dbus/ash_dbus_services.cc
@@ -5,8 +5,11 @@ #include "ash/dbus/ash_dbus_services.h" #include "ash/dbus/display_service_provider.h" +#include "ash/dbus/gesture_properties_service_provider.h" #include "ash/dbus/liveness_service_provider.h" #include "ash/dbus/url_handler_service_provider.h" +#include "base/feature_list.h" +#include "chromeos/constants/chromeos_features.h" #include "chromeos/dbus/services/cros_dbus_service.h" #include "dbus/object_path.h" #include "third_party/cros_system_api/dbus/service_constants.h" @@ -19,6 +22,14 @@ dbus::ObjectPath(chromeos::kDisplayServicePath), chromeos::CrosDBusService::CreateServiceProviderList( std::make_unique<DisplayServiceProvider>())); + if (base::FeatureList::IsEnabled( + chromeos::features::kGesturePropertiesDBusService)) { + gesture_properties_service_ = chromeos::CrosDBusService::Create( + system_bus, chromeos::kGesturePropertiesServiceName, + dbus::ObjectPath(chromeos::kGesturePropertiesServicePath), + chromeos::CrosDBusService::CreateServiceProviderList( + std::make_unique<GesturePropertiesServiceProvider>())); + } liveness_service_ = chromeos::CrosDBusService::Create( system_bus, chromeos::kLivenessServiceName, dbus::ObjectPath(chromeos::kLivenessServicePath), @@ -33,6 +44,7 @@ AshDBusServices::~AshDBusServices() { display_service_.reset(); + gesture_properties_service_.reset(); liveness_service_.reset(); url_handler_service_.reset(); }
diff --git a/ash/dbus/ash_dbus_services.h b/ash/dbus/ash_dbus_services.h index 274ffa7..e92486a 100644 --- a/ash/dbus/ash_dbus_services.h +++ b/ash/dbus/ash_dbus_services.h
@@ -27,6 +27,7 @@ private: std::unique_ptr<chromeos::CrosDBusService> display_service_; + std::unique_ptr<chromeos::CrosDBusService> gesture_properties_service_; std::unique_ptr<chromeos::CrosDBusService> liveness_service_; std::unique_ptr<chromeos::CrosDBusService> url_handler_service_;
diff --git a/ash/dbus/gesture_properties_service_provider.cc b/ash/dbus/gesture_properties_service_provider.cc new file mode 100644 index 0000000..0b4d622a --- /dev/null +++ b/ash/dbus/gesture_properties_service_provider.cc
@@ -0,0 +1,94 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/dbus/gesture_properties_service_provider.h" + +#include <memory> +#include <utility> + +#include "base/bind.h" +#include "base/logging.h" +#include "dbus/message.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +#include "ui/ozone/public/input_controller.h" +#include "ui/ozone/public/ozone_platform.h" + +namespace ash { + +GesturePropertiesServiceProvider::GesturePropertiesServiceProvider() + : weak_ptr_factory_(this) {} + +GesturePropertiesServiceProvider::~GesturePropertiesServiceProvider() = default; + +void GesturePropertiesServiceProvider::Start( + scoped_refptr<dbus::ExportedObject> exported_object) { + dbus::ExportedObject::OnExportedCallback on_exported = + base::BindRepeating(&GesturePropertiesServiceProvider::OnExported, + weak_ptr_factory_.GetWeakPtr()); + exported_object->ExportMethod( + chromeos::kGesturePropertiesServiceInterface, + chromeos::kGesturePropertiesServiceListDevicesMethod, + base::BindRepeating(&GesturePropertiesServiceProvider::ListDevices, + weak_ptr_factory_.GetWeakPtr()), + on_exported); +} + +void GesturePropertiesServiceProvider::OnExported( + const std::string& interface_name, + const std::string& method_name, + bool success) { + if (!success) + LOG(ERROR) << "Failed to export " << interface_name << "." << method_name; +} + +namespace { + +void ListDevicesCallback( + std::unique_ptr<dbus::Response> response, + const dbus::ExportedObject::ResponseSender& response_sender, + const base::flat_map<int, std::string>& result) { + dbus::MessageWriter writer(response.get()); + writer.AppendUint32(result.size()); + dbus::MessageWriter dict_writer(nullptr); + writer.OpenArray("{is}", &dict_writer); + for (const auto& pair : result) { + dbus::MessageWriter dict_entry_writer(nullptr); + dict_writer.OpenDictEntry(&dict_entry_writer); + dict_entry_writer.AppendInt32(pair.first); + dict_entry_writer.AppendString(pair.second); + dict_writer.CloseContainer(&dict_entry_writer); + } + writer.CloseContainer(&dict_writer); + response_sender.Run(std::move(response)); +} + +} // namespace + +void GesturePropertiesServiceProvider::ListDevices( + dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender) { + std::unique_ptr<dbus::Response> response = + dbus::Response::FromMethodCall(method_call); + + GetService()->ListDevices(base::BindOnce( + &ListDevicesCallback, std::move(response), response_sender)); +} + +ui::ozone::mojom::GesturePropertiesService* +GesturePropertiesServiceProvider::GetService() { + if (service_for_test_ != nullptr) + return service_for_test_; + + if (!service_.is_bound()) { + ui::ozone::mojom::GesturePropertiesServiceRequest request = + mojo::MakeRequest(&service_); + ui::OzonePlatform::GetInstance() + ->GetInputController() + ->GetGesturePropertiesService(std::move(request)); + } + return service_.get(); +} + +} // namespace ash
diff --git a/ash/dbus/gesture_properties_service_provider.h b/ash/dbus/gesture_properties_service_provider.h new file mode 100644 index 0000000..cb1b4171 --- /dev/null +++ b/ash/dbus/gesture_properties_service_provider.h
@@ -0,0 +1,66 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_DBUS_GESTURE_PROPERTIES_SERVICE_PROVIDER_H_ +#define ASH_DBUS_GESTURE_PROPERTIES_SERVICE_PROVIDER_H_ + +#include "ash/ash_export.h" +#include "base/containers/flat_map.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "chromeos/dbus/services/cros_dbus_service.h" +#include "dbus/exported_object.h" +#include "dbus/message.h" +#include "ui/ozone/public/interfaces/gesture_properties_service.mojom.h" + +namespace dbus { +class MethodCall; +} + +namespace ash { + +/** + * Provides a D-Bus bridge to the Mojo GesturePropertiesService, allowing + * gesture properties to be easily modified. See the Google-internal design doc + * at go/cros-gesture-properties-dbus-design for more details. + */ +class ASH_EXPORT GesturePropertiesServiceProvider + : public chromeos::CrosDBusService::ServiceProviderInterface { + public: + GesturePropertiesServiceProvider(); + ~GesturePropertiesServiceProvider() override; + + void set_service_for_test( + ui::ozone::mojom::GesturePropertiesService* service) { + service_for_test_ = service; + } + + // CrosDBusService::ServiceProviderInterface + void Start(scoped_refptr<dbus::ExportedObject> exported_object) override; + + private: + // Called from ExportedObject when CheckLiveness() is exported as a D-Bus + // method or failed to be exported. + void OnExported(const std::string& interface_name, + const std::string& method_name, + bool success); + + // Called on UI thread in response to a D-Bus request. + void ListDevices(dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender); + + ui::ozone::mojom::GesturePropertiesService* GetService(); + + ui::ozone::mojom::GesturePropertiesServicePtr service_; + ui::ozone::mojom::GesturePropertiesService* service_for_test_ = nullptr; + + base::WeakPtrFactory<GesturePropertiesServiceProvider> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(GesturePropertiesServiceProvider); +}; + +} // namespace ash + +#endif // ASH_DBUS_GESTURE_PROPERTIES_SERVICE_PROVIDER_H_
diff --git a/ash/dbus/gesture_properties_service_provider_unittest.cc b/ash/dbus/gesture_properties_service_provider_unittest.cc new file mode 100644 index 0000000..e23bd42f --- /dev/null +++ b/ash/dbus/gesture_properties_service_provider_unittest.cc
@@ -0,0 +1,157 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/dbus/gesture_properties_service_provider.h" + +#include "chromeos/dbus/services/service_provider_test_helper.h" +#include "dbus/message.h" +#include "dbus/object_path.h" +#include "gmock/gmock.h" +#include "services/service_manager/public/cpp/test/test_connector_factory.h" +#include "third_party/cros_system_api/dbus/service_constants.h" +#include "ui/ozone/testhelpers/mock_gesture_properties_service.h" + +using ::testing::_; +using ::testing::ElementsAre; +using ::testing::InvokeArgument; +using ::testing::Unused; + +namespace ash { + +namespace { + +uint32_t expect_uint32(dbus::MessageReader* reader) { + uint32_t result; + EXPECT_TRUE(reader->PopUint32(&result)); + return result; +} + +int32_t expect_int32(dbus::MessageReader* reader) { + int32_t result; + EXPECT_TRUE(reader->PopInt32(&result)); + return result; +} + +std::string expect_string(dbus::MessageReader* reader) { + std::string result; + EXPECT_TRUE(reader->PopString(&result)); + return result; +} + +} // namespace + +class GesturePropertiesServiceProviderTest : public testing::Test { + public: + GesturePropertiesServiceProviderTest() { + service_manager::TestConnectorFactory test_connector_factory; + mock_service_ = std::make_unique<MockGesturePropertiesService>(); + ON_CALL(*mock_service_, ListDevices(_)) + .WillByDefault(Invoke( + this, &GesturePropertiesServiceProviderTest::FakeListDevices)); + ON_CALL(*mock_service_, ListProperties(_, _)) + .WillByDefault(Invoke( + this, &GesturePropertiesServiceProviderTest::FakeListProperties)); + + service_provider_ = std::make_unique<GesturePropertiesServiceProvider>(); + service_provider_->set_service_for_test(mock_service_.get()); + } + + ~GesturePropertiesServiceProviderTest() override { test_helper_.TearDown(); } + + void FakeListDevices( + ui::ozone::mojom::GesturePropertiesService::ListDevicesCallback + callback) { + std::move(callback).Run(list_devices_response_); + } + + void FakeListProperties( + Unused, + ui::ozone::mojom::GesturePropertiesService::ListPropertiesCallback + callback) { + std::move(callback).Run(list_properties_response_); + } + + protected: + void CallDBusMethod(std::string name, + dbus::MethodCall* method_call, + std::unique_ptr<dbus::Response>& response) { + test_helper_.SetUp( + chromeos::kGesturePropertiesServiceName, + dbus::ObjectPath(chromeos::kGesturePropertiesServicePath), + chromeos::kGesturePropertiesServiceInterface, name, + service_provider_.get()); + response = test_helper_.CallMethod(method_call); + ASSERT_TRUE(response); + } + + void CallWithoutParameters(std::string name, + std::unique_ptr<dbus::Response>& response) { + dbus::MethodCall* method_call = new dbus::MethodCall( + chromeos::kGesturePropertiesServiceInterface, name); + CallDBusMethod(name, std::move(method_call), response); + } + + void CheckMethodErrorsWithNoParameters(std::string name) { + std::unique_ptr<dbus::Response> response = nullptr; + CallWithoutParameters(name, response); + EXPECT_EQ(dbus::Message::MESSAGE_ERROR, response->GetMessageType()); + } + + base::flat_map<int, std::string> list_devices_response_ = {}; + std::vector<std::string> list_properties_response_ = {}; + + std::unique_ptr<MockGesturePropertiesService> mock_service_; + + std::unique_ptr<GesturePropertiesServiceProvider> service_provider_; + chromeos::ServiceProviderTestHelper test_helper_; + + DISALLOW_COPY_AND_ASSIGN(GesturePropertiesServiceProviderTest); +}; + +TEST_F(GesturePropertiesServiceProviderTest, ListDevicesEmpty) { + list_devices_response_ = {}; + EXPECT_CALL(*mock_service_, ListDevices(_)); + + std::unique_ptr<dbus::Response> response = nullptr; + CallWithoutParameters(chromeos::kGesturePropertiesServiceListDevicesMethod, + response); + + dbus::MessageReader reader(response.get()); + EXPECT_EQ(0u, expect_uint32(&reader)); + dbus::MessageReader array_reader(nullptr); + ASSERT_TRUE(reader.PopArray(&array_reader)); + EXPECT_FALSE(array_reader.HasMoreData()); + EXPECT_FALSE(reader.HasMoreData()); +} + +TEST_F(GesturePropertiesServiceProviderTest, ListDevicesSuccess) { + list_devices_response_ = { + {4, "dev 1"}, + {7, "dev 2"}, + }; + EXPECT_CALL(*mock_service_, ListDevices(_)); + + std::unique_ptr<dbus::Response> response = nullptr; + CallWithoutParameters(chromeos::kGesturePropertiesServiceListDevicesMethod, + response); + + dbus::MessageReader reader(response.get()); + EXPECT_EQ(2u, expect_uint32(&reader)); + dbus::MessageReader array_reader(nullptr); + ASSERT_TRUE(reader.PopArray(&array_reader)); + + dbus::MessageReader dict_entry_reader(nullptr); + ASSERT_TRUE(array_reader.PopDictEntry(&dict_entry_reader)); + EXPECT_EQ(4, expect_int32(&dict_entry_reader)); + EXPECT_EQ("dev 1", expect_string(&dict_entry_reader)); + + ASSERT_TRUE(array_reader.PopDictEntry(&dict_entry_reader)); + EXPECT_EQ(7, expect_int32(&dict_entry_reader)); + EXPECT_EQ("dev 2", expect_string(&dict_entry_reader)); + + EXPECT_FALSE(array_reader.HasMoreData()); + EXPECT_FALSE(reader.HasMoreData()); +} + +} // namespace ash
diff --git a/ash/dbus/org.chromium.GesturePropertiesService.conf b/ash/dbus/org.chromium.GesturePropertiesService.conf new file mode 100644 index 0000000..b1a369c4 --- /dev/null +++ b/ash/dbus/org.chromium.GesturePropertiesService.conf
@@ -0,0 +1,20 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<!-- + Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. + + This file will be installed at /opt/google/chrome/dbus on Chrome OS. +--> +<busconfig> + <policy user="chronos"> + <allow own="org.chromium.GesturePropertiesService"/> + </policy> + + <policy user="chronos"> + <allow send_destination="org.chromium.GesturePropertiesService" + send_interface="org.chromium.GesturePropertiesServiceInterface"/> + </policy> + +</busconfig>
diff --git a/ash/display/cros_display_config.cc b/ash/display/cros_display_config.cc index 98015d5..758b5c2 100644 --- a/ash/display/cros_display_config.cc +++ b/ash/display/cros_display_config.cc
@@ -22,7 +22,7 @@ #include "ui/display/display_layout_builder.h" #include "ui/display/manager/display_manager.h" #include "ui/display/manager/display_util.h" -#include "ui/display/mojo/display_struct_traits.h" +#include "ui/display/mojom/display_mojom_traits.h" #include "ui/display/screen.h" namespace ash {
diff --git a/ash/keyboard/keyboard_controller_impl.cc b/ash/keyboard/keyboard_controller_impl.cc index bf7d8d60..70fa3bfd6 100644 --- a/ash/keyboard/keyboard_controller_impl.cc +++ b/ash/keyboard/keyboard_controller_impl.cc
@@ -79,11 +79,6 @@ observer.OnKeyboardVisibleBoundsChanged(screen_bounds); } -void KeyboardControllerImpl::SendOnLoadKeyboardContentsRequested() { - for (auto& observer : observers_) - observer.OnLoadKeyboardContentsRequested(); -} - void KeyboardControllerImpl::SendOnKeyboardUIDestroyed() { for (auto& observer : observers_) observer.OnKeyboardUIDestroyed(); @@ -91,10 +86,6 @@ // ash::KeyboardController -void KeyboardControllerImpl::KeyboardContentsLoaded(const gfx::Size& size) { - keyboard_ui_controller()->KeyboardContentsLoaded(size); -} - keyboard::KeyboardConfig KeyboardControllerImpl::GetKeyboardConfig() { return keyboard_ui_controller_->keyboard_config(); }
diff --git a/ash/keyboard/keyboard_controller_impl.h b/ash/keyboard/keyboard_controller_impl.h index 37430b1d..584c7f7 100644 --- a/ash/keyboard/keyboard_controller_impl.h +++ b/ash/keyboard/keyboard_controller_impl.h
@@ -54,11 +54,9 @@ // Forwards events to observers. void SendOnKeyboardVisibleBoundsChanged(const gfx::Rect& screen_bounds); - void SendOnLoadKeyboardContentsRequested(); void SendOnKeyboardUIDestroyed(); // ash::KeyboardController: - void KeyboardContentsLoaded(const gfx::Size& size) override; keyboard::KeyboardConfig GetKeyboardConfig() override; void SetKeyboardConfig( const keyboard::KeyboardConfig& keyboard_config) override;
diff --git a/ash/keyboard/ui/keyboard_ui.cc b/ash/keyboard/ui/keyboard_ui.cc index 173aab1..3473649 100644 --- a/ash/keyboard/ui/keyboard_ui.cc +++ b/ash/keyboard/ui/keyboard_ui.cc
@@ -35,11 +35,6 @@ window->Hide(); } -void KeyboardUI::KeyboardContentsLoaded(const gfx::Size& size) { - NOTREACHED() << "Unexpected call to KeyboardContentsLoaded. Size: " - << size.ToString(); -} - void KeyboardUI::SetController(KeyboardUIController* controller) { keyboard_controller_ = controller; }
diff --git a/ash/keyboard/ui/keyboard_ui.h b/ash/keyboard/ui/keyboard_ui.h index 4c8065e..7c2874c9 100644 --- a/ash/keyboard/ui/keyboard_ui.h +++ b/ash/keyboard/ui/keyboard_ui.h
@@ -13,9 +13,6 @@ namespace aura { class Window; } -namespace gfx { -class Size; -} namespace ui { class InputMethod; } @@ -70,8 +67,6 @@ // TODO(https://crbug.com/845780): Change this to accept a callback. virtual void ReloadKeyboardIfNeeded() = 0; - virtual void KeyboardContentsLoaded(const gfx::Size& size); - // |controller| may be null when KeyboardUIController is being destroyed. void SetController(KeyboardUIController* controller);
diff --git a/ash/keyboard/ui/keyboard_ui_controller.cc b/ash/keyboard/ui/keyboard_ui_controller.cc index 505464a..c9c497b5 100644 --- a/ash/keyboard/ui/keyboard_ui_controller.cc +++ b/ash/keyboard/ui/keyboard_ui_controller.cc
@@ -1060,12 +1060,6 @@ return false; } -void KeyboardUIController::KeyboardContentsLoaded(const gfx::Size& size) { - if (!IsEnabled()) - return; - ui_->KeyboardContentsLoaded(size); -} - ui::TextInputClient* KeyboardUIController::GetTextInputClient() { return ui_->GetInputMethod()->GetTextInputClient(); }
diff --git a/ash/keyboard/ui/keyboard_ui_controller.h b/ash/keyboard/ui/keyboard_ui_controller.h index 07ff340..b6f4e4d8 100644 --- a/ash/keyboard/ui/keyboard_ui_controller.h +++ b/ash/keyboard/ui/keyboard_ui_controller.h
@@ -223,7 +223,7 @@ bool IsKeyboardVisible(); - void KeyboardContentsLoaded(const gfx::Size& size); + void KeyboardContentsLoaded(); aura::Window* parent_container() { return parent_container_; }
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc index 6523878..d35e576 100644 --- a/ash/login/ui/lock_contents_view.cc +++ b/ash/login/ui/lock_contents_view.cc
@@ -1252,9 +1252,19 @@ main_view_->AddChildView(primary_big_view_); - // Build media controls view. + // Build media controls view. Using base::Unretained(this) is safe here + // because these callbacks are used by |media_controls_view_|, which is + // owned by |this|. + LockScreenMediaControlsView::Callbacks media_controls_callbacks; + media_controls_callbacks.media_controls_enabled = base::BindRepeating( + &LockContentsView::AreMediaControlsEnabled, base::Unretained(this)); + media_controls_callbacks.hide_media_controls = base::BindRepeating( + &LockContentsView::HideMediaControlsLayout, base::Unretained(this)); + media_controls_callbacks.show_media_controls = base::BindRepeating( + &LockContentsView::CreateMediaControlsLayout, base::Unretained(this)); + media_controls_view_ = std::make_unique<LockScreenMediaControlsView>( - Shell::Get()->connector(), this); + Shell::Get()->connector(), media_controls_callbacks); media_controls_view_->set_owned_by_client(); if (users.size() > 1) {
diff --git a/ash/login/ui/lock_screen_media_controls_view.cc b/ash/login/ui/lock_screen_media_controls_view.cc index 9302e919..20e2ff7ef 100644 --- a/ash/login/ui/lock_screen_media_controls_view.cc +++ b/ash/login/ui/lock_screen_media_controls_view.cc
@@ -110,12 +110,22 @@ } // namespace +LockScreenMediaControlsView::Callbacks::Callbacks() = default; + +LockScreenMediaControlsView::Callbacks::~Callbacks() = default; + LockScreenMediaControlsView::LockScreenMediaControlsView( service_manager::Connector* connector, - LockContentsView* view) - : view_(view), - connector_(connector), - hide_controls_timer_(new base::OneShotTimer()) { + const Callbacks& callbacks) + : connector_(connector), + hide_controls_timer_(new base::OneShotTimer()), + media_controls_enabled_(callbacks.media_controls_enabled), + hide_media_controls_(callbacks.hide_media_controls), + show_media_controls_(callbacks.show_media_controls) { + DCHECK(callbacks.media_controls_enabled); + DCHECK(callbacks.hide_media_controls); + DCHECK(callbacks.show_media_controls); + SetBackground(views::CreateRoundedRectBackground(kMediaControlsBackground, kMediaControlsCornerRadius)); middle_spacing_ = std::make_unique<NonAccessibleView>(); @@ -253,20 +263,22 @@ // If controls aren't enabled or there is no session to show, don't show the // controls. - if (!view_->AreMediaControlsEnabled() || !session_info) { - view_->HideMediaControlsLayout(); + if (!media_controls_enabled_.Run() || !session_info) { + hide_media_controls_.Run(); } else if (!IsDrawn() && session_info->playback_state == media_session::mojom::MediaPlaybackState::kPaused) { // If the screen is locked while media is paused, don't show the controls. - view_->HideMediaControlsLayout(); + hide_media_controls_.Run(); } else if (!IsDrawn()) { - view_->CreateMediaControlsLayout(); + show_media_controls_.Run(); } - SetIsPlaying(session_info && - session_info->playback_state == - media_session::mojom::MediaPlaybackState::kPlaying); + if (IsDrawn()) { + SetIsPlaying(session_info && + session_info->playback_state == + media_session::mojom::MediaPlaybackState::kPlaying); + } } void LockScreenMediaControlsView::MediaSessionMetadataChanged( @@ -308,10 +320,8 @@ // If there is no current session but there was a previous one, wait to see // if a new session starts before hiding the controls. if (!request_id.has_value() && media_session_id_.has_value()) { - hide_controls_timer_->Start( - FROM_HERE, kNextMediaDelay, - base::BindOnce(&LockContentsView::HideMediaControlsLayout, - base::Unretained(view_))); + hide_controls_timer_->Start(FROM_HERE, kNextMediaDelay, + hide_media_controls_); } media_session_id_ = request_id;
diff --git a/ash/login/ui/lock_screen_media_controls_view.h b/ash/login/ui/lock_screen_media_controls_view.h index 6c134d39..ac56adb 100644 --- a/ash/login/ui/lock_screen_media_controls_view.h +++ b/ash/login/ui/lock_screen_media_controls_view.h
@@ -25,7 +25,6 @@ namespace ash { -class LockContentsView; class MediaControlsHeaderView; class NonAccessibleView; @@ -35,8 +34,27 @@ public media_session::mojom::MediaControllerImageObserver, public views::ButtonListener { public: + using MediaControlsEnabled = base::RepeatingCallback<bool()>; + + struct Callbacks { + Callbacks(); + ~Callbacks(); + + // Called in |MediaSessionInfoChanged| to determine the visibility of the + // media controls. + MediaControlsEnabled media_controls_enabled; + + // Called when the controls should be hidden on the lock screen. + base::RepeatingClosure hide_media_controls; + + // Called when the controls should be drawn on the lock screen. + base::RepeatingClosure show_media_controls; + + DISALLOW_COPY_AND_ASSIGN(Callbacks); + }; + LockScreenMediaControlsView(service_manager::Connector* connector, - LockContentsView* view); + const Callbacks& callbacks); ~LockScreenMediaControlsView() override; // views::View: @@ -96,9 +114,6 @@ // necessary. void SetIsPlaying(bool playing); - // Lock screen view which this view belongs to. - LockContentsView* const view_; - // Used to connect to the Media Session service. service_manager::Connector* const connector_; @@ -140,6 +155,11 @@ NonAccessibleView* button_row_ = nullptr; views::ToggleImageButton* play_pause_button_ = nullptr; + // Callbacks. + const MediaControlsEnabled media_controls_enabled_; + const base::RepeatingClosure hide_media_controls_; + const base::RepeatingClosure show_media_controls_; + DISALLOW_COPY_AND_ASSIGN(LockScreenMediaControlsView); };
diff --git a/ash/media/media_notification_container_impl.cc b/ash/media/media_notification_container_impl.cc index 0c8effc..6b98d13 100644 --- a/ash/media/media_notification_container_impl.cc +++ b/ash/media/media_notification_container_impl.cc
@@ -60,6 +60,7 @@ void MediaNotificationContainerImpl::UpdateCornerRadius(int top_radius, int bottom_radius) { + MessageView::SetCornerRadius(top_radius, bottom_radius); view_.UpdateCornerRadius(top_radius, bottom_radius); }
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h index 48149570..415e66e0 100644 --- a/ash/public/cpp/app_list/app_list_types.h +++ b/ash/public/cpp/app_list/app_list_types.h
@@ -143,7 +143,7 @@ enum SearchResultDisplayLocation { kSuggestionChipContainer, kTileListContainer, - kUnknown, + kPlacementUndefined, }; // Which index in the UI container should the result be placed in. @@ -154,7 +154,7 @@ kFourthIndex, kFifthIndex, kSixthIndex, - kPlacementUndefined, + kUndefined, }; // Actions for OmniBox zero state suggestion. @@ -261,11 +261,10 @@ // Which UI container should the result be displayed in. SearchResultDisplayLocation display_location = - SearchResultDisplayLocation::kUnknown; + SearchResultDisplayLocation::kPlacementUndefined; // Which index in the UI container should the result be placed in. - SearchResultDisplayIndex display_index = - SearchResultDisplayIndex::kPlacementUndefined; + SearchResultDisplayIndex display_index = SearchResultDisplayIndex::kUndefined; // A score to determine the result display order. double display_score = 0;
diff --git a/ash/public/cpp/keyboard/keyboard_controller.h b/ash/public/cpp/keyboard/keyboard_controller.h index 6a2de18..8bdb7c5 100644 --- a/ash/public/cpp/keyboard/keyboard_controller.h +++ b/ash/public/cpp/keyboard/keyboard_controller.h
@@ -36,9 +36,6 @@ virtual ~KeyboardController(); - // Informs the controller that the keyboard contents have loaded. - virtual void KeyboardContentsLoaded(const gfx::Size& size) = 0; - // Retrieves the current keyboard configuration. virtual keyboard::KeyboardConfig GetKeyboardConfig() = 0;
diff --git a/ash/public/cpp/test/test_keyboard_controller_observer.cc b/ash/public/cpp/test/test_keyboard_controller_observer.cc index daeac0d..27a96ae 100644 --- a/ash/public/cpp/test/test_keyboard_controller_observer.cc +++ b/ash/public/cpp/test/test_keyboard_controller_observer.cc
@@ -40,10 +40,6 @@ void TestKeyboardControllerObserver::OnKeyboardOccludedBoundsChanged( const gfx::Rect& bounds) {} -void TestKeyboardControllerObserver::OnLoadKeyboardContentsRequested() { - controller_->KeyboardContentsLoaded(gfx::Size(100, 100)); -} - void TestKeyboardControllerObserver::OnKeyboardUIDestroyed() {} } // namespace ash
diff --git a/ash/public/cpp/test/test_keyboard_controller_observer.h b/ash/public/cpp/test/test_keyboard_controller_observer.h index 55cab7c..4c57819 100644 --- a/ash/public/cpp/test/test_keyboard_controller_observer.h +++ b/ash/public/cpp/test/test_keyboard_controller_observer.h
@@ -29,7 +29,6 @@ void OnKeyboardVisibilityChanged(bool visible) override; void OnKeyboardVisibleBoundsChanged(const gfx::Rect& bounds) override; void OnKeyboardOccludedBoundsChanged(const gfx::Rect& bounds) override; - void OnLoadKeyboardContentsRequested() override; void OnKeyboardUIDestroyed() override; const keyboard::KeyboardConfig& config() const { return config_; }
diff --git a/ash/public/interfaces/BUILD.gn b/ash/public/interfaces/BUILD.gn index 0702956..cadacf6 100644 --- a/ash/public/interfaces/BUILD.gn +++ b/ash/public/interfaces/BUILD.gn
@@ -30,7 +30,7 @@ "//skia/public/interfaces", "//ui/base/ime/chromeos/public/interfaces", "//ui/base/mojom", - "//ui/display/mojo:interfaces", + "//ui/display/mojom:mojom", "//ui/gfx/geometry/mojo", "//ui/gfx/image/mojo:interfaces", "//ui/gfx/range/mojo",
diff --git a/ash/public/interfaces/cros_display_config.mojom b/ash/public/interfaces/cros_display_config.mojom index ac2899a1..5be4f56 100644 --- a/ash/public/interfaces/cros_display_config.mojom +++ b/ash/public/interfaces/cros_display_config.mojom
@@ -5,7 +5,7 @@ module ash.mojom; import "ui/gfx/geometry/mojo/geometry.mojom"; -import "ui/display/mojo/display.mojom"; +import "ui/display/mojom/display.mojom"; // All points, bounds, and insets are in display pixels unless otherwise // sepcified.
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index bb6cbdb..eaef353 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -8,7 +8,6 @@ #include <functional> #include <utility> -#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h" #include "ash/metrics/histogram_macros.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/fps_counter.h" @@ -864,11 +863,6 @@ } bool OverviewGrid::ShouldAnimateWallpaper() const { - // Kiosk next shell mode will have an opaque background covering the wallpaper - // prior to entering overview, so there's no need to animate it. - if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled()) - return false; - // Never animate when doing app dragging or when immediately exiting. const auto enter_exit_type = overview_session_->enter_exit_overview_type(); if (enter_exit_type ==
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc index 147624f..9686328 100644 --- a/ash/wm/overview/overview_item.cc +++ b/ash/wm/overview/overview_item.cc
@@ -539,7 +539,7 @@ void OverviewItem::OnSelectorItemDragStarted(OverviewItem* item) { is_being_dragged_ = (item == this); - // Disable mask and shadow for the dragged overview item during dragging. + // Disable shadow for the dragged overview item during dragging. if (is_being_dragged_) UpdateRoundedCornersAndShadow(); @@ -555,7 +555,7 @@ // Do nothing further with the dragged overview item if it is being snapped. if (snap) return; - // Re-show mask and shadow for the dragged overview item after drag ends. + // Re-show shadow for the dragged overview item after drag ends. UpdateRoundedCornersAndShadow(); } @@ -703,33 +703,33 @@ } void OverviewItem::UpdateRoundedCornersAndShadow() { - // Do not show mask and shadow if: - // 1) overview is shutting down or - // 2) this overview item is in an overview grid that contains more than 10 - // windows. In this case don't apply rounded corner mask because it can - // push the compositor memory usage to the limit. TODO(oshima): Remove - // this once new rounded corner impl is available. (crbug.com/903486) - // 3) we're currently in entering overview animation or - // 4) this overview item is being dragged or - // 5) this overview item is the drop target window or - // 6) this overview item is in animation. + // Do not show the rounded corners and the shadow if overview is shutting down + // or we're currently in entering overview animation. bool should_show = true; OverviewController* overview_controller = Shell::Get()->overview_controller(); if (disable_mask_ || !overview_controller || !overview_controller->InOverviewSession() || - overview_controller->IsInStartAnimation() || is_being_dragged_ || - overview_grid_->IsDropTargetWindow(GetWindow()) || - transform_window_.GetOverviewWindow() - ->layer() - ->GetAnimator() - ->is_animating()) { + overview_controller->IsInStartAnimation()) { should_show = false; } - transform_window_.UpdateMask(should_show); - SetShadowBounds(should_show ? base::make_optional(gfx::ToEnclosedRect( - transform_window_.GetTransformedBounds())) - : base::nullopt); + // In addition, the shadow should be hidden if + // 1) this overview item is being dragged or + // 2) this overview item is the drop target window or + // 3) this overview item is in animation. + const bool should_show_shadow = + should_show && !is_being_dragged_ && + !overview_grid_->IsDropTargetWindow(GetWindow()) && + !transform_window_.GetOverviewWindow() + ->layer() + ->GetAnimator() + ->is_animating(); + + transform_window_.UpdateRoundedCorners(should_show); + SetShadowBounds(should_show_shadow + ? base::make_optional(gfx::ToEnclosedRect( + transform_window_.GetTransformedBounds())) + : base::nullopt); if (transform_window_.IsMinimized()) { caption_container_view_->UpdatePreviewRoundedCorners( should_show, kOverviewWindowRoundingDp);
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 08df7d5..4a80f212 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -2683,7 +2683,7 @@ // Test that the mask that is applied to add rounded corners in overview mode // is removed during drags. -TEST_F(OverviewSessionRoundedCornerTest, RoundedEdgeMaskVisibilityDragging) { +TEST_F(OverviewSessionRoundedCornerTest, ShadowVisibilityDragging) { std::unique_ptr<aura::Window> window1(CreateTestWindow()); std::unique_ptr<aura::Window> window2(CreateTestWindow()); @@ -2697,8 +2697,8 @@ ui::ScopedAnimationDurationScaleMode test_duration_mode( ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); - // Drag the first window. Verify that the mask was removed for the first - // window but still exists for the second window as we do not apply mask + // Drag the first window. Verify that the shadow was removed for the first + // window but still exists for the second window as we do not make shadow // for a dragged window. const gfx::Point start_drag = gfx::ToRoundedPoint(item1->target_bounds().CenterPoint()); @@ -2708,25 +2708,31 @@ EXPECT_FALSE(window1->layer()->GetAnimator()->is_animating()); EXPECT_FALSE(window2->layer()->GetAnimator()->is_animating()); - EXPECT_FALSE(HasRoundedCorner(item1)); - EXPECT_TRUE(HasRoundedCorner(item2)); + EXPECT_TRUE(item1->GetShadowBoundsForTesting().IsEmpty()); + EXPECT_FALSE(item2->GetShadowBoundsForTesting().IsEmpty()); // Drag to horizontally and then back to the start to avoid activating the - // window, drag to close or entering splitview. Verify that the mask is + // window, drag to close or entering splitview. Verify that the shadow is // invisible on both items during animation. generator->MoveMouseTo(gfx::Point(0, start_drag.y())); + + // The drop target window should be created with no shadow. + OverviewItem* drop_target_item = GetDropTarget(0); + ASSERT_TRUE(drop_target_item); + EXPECT_TRUE(drop_target_item->GetShadowBoundsForTesting().IsEmpty()); + generator->MoveMouseTo(start_drag); generator->ReleaseLeftButton(); EXPECT_TRUE(window1->layer()->GetAnimator()->is_animating()); EXPECT_TRUE(window2->layer()->GetAnimator()->is_animating()); - EXPECT_FALSE(HasRoundedCorner(item1)); - EXPECT_FALSE(HasRoundedCorner(item2)); + EXPECT_TRUE(item1->GetShadowBoundsForTesting().IsEmpty()); + EXPECT_TRUE(item2->GetShadowBoundsForTesting().IsEmpty()); - // Verify that the mask is visble again after animation is finished. + // Verify that the shadow is visble again after animation is finished. window1->layer()->GetAnimator()->StopAnimating(); window2->layer()->GetAnimator()->StopAnimating(); - EXPECT_TRUE(HasRoundedCorner(item1)); - EXPECT_TRUE(HasRoundedCorner(item2)); + EXPECT_FALSE(item1->GetShadowBoundsForTesting().IsEmpty()); + EXPECT_FALSE(item2->GetShadowBoundsForTesting().IsEmpty()); } // Tests that the shadows in overview mode are placed correctly.
diff --git a/ash/wm/overview/scoped_overview_transform_window.cc b/ash/wm/overview/scoped_overview_transform_window.cc index 8f8c9922..c47a7504 100644 --- a/ash/wm/overview/scoped_overview_transform_window.cc +++ b/ash/wm/overview/scoped_overview_transform_window.cc
@@ -137,7 +137,7 @@ targeting_policy_map_.erase(it); } - UpdateMask(/*show=*/false); + UpdateRoundedCorners(/*show=*/false); StopObservingImplicitAnimations(); aura::client::GetTransientWindowClient()->RemoveObserver(this); window_->layer()->SetClipRect(original_clip_rect_); @@ -379,9 +379,7 @@ overview_bounds_.reset(); } -// TODO(sammiequon): Investigate if waiting till the end of the animation to set -// these properties is still required. -void ScopedOverviewTransformWindow::UpdateMask(bool show) { +void ScopedOverviewTransformWindow::UpdateRoundedCorners(bool show) { // Minimized windows have their corners rounded in CaptionContainerView. if (IsMinimized()) return; @@ -410,9 +408,11 @@ void ScopedOverviewTransformWindow::OnLayerAnimationStarted( ui::LayerAnimationSequence* sequence) { - // Remove the mask before animating because masks affect animation - // performance. The mask will be added back once the animation is completed. - overview_item_->UpdateRoundedCornersAndShadow(); + // Remove the shadow before animating because it may affect animation + // performance. The shadow will be added back once the animation is completed. + // Note that we can't use UpdateRoundedCornersAndShadow() since we don't want + // to update the rounded corners. + overview_item_->SetShadowBounds(base::nullopt); } void ScopedOverviewTransformWindow::OnImplicitAnimationsCompleted() {
diff --git a/ash/wm/overview/scoped_overview_transform_window.h b/ash/wm/overview/scoped_overview_transform_window.h index fa9068e..20c00aa 100644 --- a/ash/wm/overview/scoped_overview_transform_window.h +++ b/ash/wm/overview/scoped_overview_transform_window.h
@@ -146,9 +146,9 @@ // change. Must be called before PositionWindows in OverviewGrid. void UpdateWindowDimensionsType(); - // Updates the mask which gives rounded corners on the windows. Shows the mask - // if |show| is true, otherwise removes it. - void UpdateMask(bool show); + // Updates the rounded corners on the window. Makes the rounded corners if + // |show| is true, otherwise removes it. + void UpdateRoundedCorners(bool show); // Stop listening to any animations to finish. void CancelAnimationsListener();
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc index 2923cb0..f3e577fb 100644 --- a/ash/wm/splitview/split_view_controller_unittest.cc +++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -13,11 +13,8 @@ #include "ash/app_list/app_list_controller_impl.h" #include "ash/display/screen_orientation_controller.h" #include "ash/display/screen_orientation_controller_test_api.h" -#include "ash/kiosk_next/kiosk_next_shell_test_util.h" -#include "ash/kiosk_next/mock_kiosk_next_shell_client.h" #include "ash/magnifier/docked_magnifier_controller_impl.h" #include "ash/public/cpp/app_types.h" -#include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/fps_counter.h" #include "ash/public/cpp/presentation_time_recorder.h" #include "ash/public/cpp/window_properties.h" @@ -52,7 +49,6 @@ #include "ash/wm/wm_event.h" #include "base/stl_util.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/test/test_windows.h" @@ -4602,76 +4598,4 @@ EXPECT_EQ(backdrop_window->bounds(), active_desk_container->bounds()); } -class SplitViewKioskNextAppDraggingTest : public SplitViewAppDraggingTest { - public: - SplitViewKioskNextAppDraggingTest() = default; - ~SplitViewKioskNextAppDraggingTest() override = default; - - // SplitViewAppDraggingTest: - void SetUp() override { - scoped_feature_list_.InitAndEnableFeature(features::kKioskNextShell); - set_start_session(false); - - SplitViewAppDraggingTest::SetUp(); - - client_ = std::make_unique<MockKioskNextShellClient>(); - LogInKioskNextUser(GetSessionControllerClient()); - } - - void TearDown() override { - client_.reset(); - SplitViewAppDraggingTest::TearDown(); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - std::unique_ptr<MockKioskNextShellClient> client_; - - DISALLOW_COPY_AND_ASSIGN(SplitViewKioskNextAppDraggingTest); -}; - -// Tests that split view is disabled in Kiosk Next sessions. -TEST_F(SplitViewKioskNextAppDraggingTest, SplitViewDisabled) { - std::unique_ptr<aura::Window> window(CreateWindow(gfx::Rect(0, 0, 400, 400))); - - EXPECT_FALSE(ShouldAllowSplitView()); - EXPECT_FALSE(CanSnapInSplitview(window.get())); -} - -// Tests that dragging a maximized window doesn't show drag indicators or allow -// snapping in Kiosk Next sessions. -TEST_F(SplitViewKioskNextAppDraggingTest, DragMaximizedWindow) { - UpdateDisplay("800x600"); - InitializeWindow(); - EXPECT_TRUE(wm::GetWindowState(window())->IsMaximized()); - gfx::Rect display_bounds = - screen_util::GetDisplayWorkAreaBoundsInScreenForActiveDeskContainer( - window()); - - // Move the window by a small amount of distance will maximize the window - // again. - gfx::Point location(0, 10); - SendGestureEvents(location); - EXPECT_TRUE(wm::GetWindowState(window())->IsMaximized()); - - // Drag the window down to trigger overview mode. - const float long_scroll_delta = display_bounds.height() / 4 + 5; - location.set_y(long_scroll_delta); - SendScrollStartAndUpdate(location); - OverviewController* overview_controller = Shell::Get()->overview_controller(); - EXPECT_TRUE(overview_controller->InOverviewSession()); - EXPECT_FALSE( - overview_controller->overview_session()->IsWindowInOverview(window())); - - // No drag indicators. - EXPECT_EQ(IndicatorState::kNone, GetIndicatorState()); - - // Complete the drag and verify the window is not snapped. - EndScrollSequence(); - EXPECT_TRUE(overview_controller->InOverviewSession()); - EXPECT_EQ(IndicatorState::kNone, GetIndicatorState()); - EXPECT_FALSE(split_view_controller()->InSplitViewMode()); - EXPECT_FALSE(wm::GetWindowState(window())->IsSnapped()); -} - } // namespace ash
diff --git a/ash/wm/splitview/split_view_utils.cc b/ash/wm/splitview/split_view_utils.cc index bdd00e4..c0b969a 100644 --- a/ash/wm/splitview/split_view_utils.cc +++ b/ash/wm/splitview/split_view_utils.cc
@@ -6,7 +6,6 @@ #include "ash/accessibility/accessibility_controller_impl.h" #include "ash/display/screen_orientation_controller.h" -#include "ash/kiosk_next/kiosk_next_shell_controller_impl.h" #include "ash/public/cpp/ash_features.h" #include "ash/public/cpp/ash_switches.h" #include "ash/public/cpp/toast_data.h" @@ -248,10 +247,6 @@ if (Shell::Get()->screen_pinning_controller()->IsPinned()) return false; - // Don't allow split view in Kiosk Next. - if (Shell::Get()->kiosk_next_shell_controller()->IsEnabled()) - return false; - // TODO(crubg.com/853588): Disallow window dragging and split screen while // ChromeVox is on until they are in a usable state. if (Shell::Get()->accessibility_controller()->spoken_feedback_enabled())
diff --git a/base/files/file_descriptor_watcher_posix.cc b/base/files/file_descriptor_watcher_posix.cc index f43a7d9..04579d1a 100644 --- a/base/files/file_descriptor_watcher_posix.cc +++ b/base/files/file_descriptor_watcher_posix.cc
@@ -174,7 +174,7 @@ // thread. This ensures that the file descriptor is never accessed after // this destructor returns. // - // Use a ScopedClosureRunner to ensure that |done| is signalled even if the + // Use a ScopedClosureRunner to ensure that |done| is signaled even if the // thread doesn't run any more tasks (if PostTask returns true, it means // that the task was queued, but it doesn't mean that a RunLoop will run the // task before the queue is deleted).
diff --git a/base/files/file_descriptor_watcher_posix.h b/base/files/file_descriptor_watcher_posix.h index d89d000c..6eff314 100644 --- a/base/files/file_descriptor_watcher_posix.h +++ b/base/files/file_descriptor_watcher_posix.h
@@ -97,11 +97,16 @@ // Registers |callback| to be posted on the current sequence when |fd| is // readable or writable without blocking. |callback| is unregistered when the // returned Controller is deleted (deletion must happen on the current - // sequence). To call these methods, a FileDescriptorWatcher must have been + // sequence). + // Usage note: To call these methods, a FileDescriptorWatcher must have been // instantiated on the current thread and SequencedTaskRunnerHandle::IsSet() // must return true (these conditions are met at least on all ThreadPool // threads as well as on threads backed by a MessageLoopForIO). |fd| must // outlive the returned Controller. + // Shutdown note: notifications aren't guaranteed to be emitted once the bound + // (current) SequencedTaskRunner enters its shutdown phase (i.e. + // ThreadPool::Shutdown() or Thread::Stop()) regardless of the + // SequencedTaskRunner's TaskShutdownBehavior. static std::unique_ptr<Controller> WatchReadable( int fd, const RepeatingClosure& callback);
diff --git a/base/memory/weak_ptr.h b/base/memory/weak_ptr.h index af2bd38..72b5f1f 100644 --- a/base/memory/weak_ptr.h +++ b/base/memory/weak_ptr.h
@@ -16,14 +16,13 @@ // // class Controller { // public: -// Controller() : weak_factory_(this) {} // void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); } // void WorkComplete(const Result& result) { ... } // private: // // 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. -// WeakPtrFactory<Controller> weak_factory_; +// WeakPtrFactory<Controller> weak_factory_{this}; // }; // // class Worker {
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc index 5bc38cc..d257d85 100644 --- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc +++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -73,6 +73,8 @@ // To avoid symbol collisions in jumbo builds. namespace sequence_manager_impl_unittest { +constexpr TimeDelta kDelay = TimeDelta::FromSeconds(42); + enum class TestType { kMockTaskRunner, kMessageLoop, @@ -4762,132 +4764,129 @@ } // namespace -TEST_P(SequenceManagerTest, LastUnblockEnqueueOrder_WithFence) { - constexpr TimeDelta kDelay = TimeDelta::FromSeconds(42); - - { - // Post a task. Install a fence at the beginning of time and remove it. The - // task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder(). - auto queue = CreateTaskQueue(); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime); - queue->RemoveFence(); - auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder()); - } - - { - // Post a 1st task. Install a now fence. Post a 2nd task. Run the first - // task. Remove the fence. The 2nd task's EnqueueOrder should be less than - // GetLastUnblockEnqueueOrder(). - auto queue = CreateTaskQueue(); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFence(TaskQueue::InsertFencePosition::kNow); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - queue->RemoveFence(); - auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder()); - } - - { - // Post a 1st task. Install a now fence. Post a 2nd task. Remove the fence. - // GetLastUnblockEnqueueOrder() should indicate that the queue was never - // blocked (front task could always run). - auto queue = CreateTaskQueue(); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFence(TaskQueue::InsertFencePosition::kNow); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->RemoveFence(); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - } - - { - // Post a 1st task. Install a now fence. Post a 2nd task. Install a now - // fence (moves the previous fence). GetLastUnblockEnqueueOrder() should - // indicate that the queue was never blocked (front task could always run). - auto queue = CreateTaskQueue(); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFence(TaskQueue::InsertFencePosition::kNow); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFence(TaskQueue::InsertFencePosition::kNow); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - } - - { - const TimeTicks start_time = mock_tick_clock()->NowTicks(); - - // Post a 1st task. Install a delayed fence. Post a 2nd task that will run - // after the fence. Run the first task. Remove the fence. The 2nd task's - // EnqueueOrder should be less than GetLastUnblockEnqueueOrder(). - auto queue = - CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true)); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFenceAt(start_time + kDelay); - queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), 2 * kDelay); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - FastForwardBy(2 * kDelay); - queue->RemoveFence(); - auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder()); - } - - { - const TimeTicks start_time = mock_tick_clock()->NowTicks(); - - // Post a 1st task. Install a delayed fence. Post a 2nd task that will run - // before the fence. GetLastUnblockEnqueueOrder() should indicate that the - // queue was never blocked (front task could always run). - auto queue = - CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true)); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->InsertFenceAt(start_time + 2 * kDelay); - queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), kDelay); - RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - FastForwardBy(3 * kDelay); - EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); - queue->RemoveFence(); - } +// Post a task. Install a fence at the beginning of time and remove it. The +// task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder(). +TEST_P(SequenceManagerTest, + GetLastUnblockEnqueueOrder_PostInsertFenceBeginningOfTime) { + auto queue = CreateTaskQueue(); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFence(TaskQueue::InsertFencePosition::kBeginningOfTime); + queue->RemoveFence(); + auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder()); } -TEST_P(SequenceManagerTest, LastUnblockEnqueueOrder_WithEnabled) { - { - // Post a 1st task. Disable the queue and re-enable it. Post a 2nd task. The - // 1st task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder(). - auto queue = CreateTaskQueue(); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->GetTaskQueueImpl()->SetQueueEnabled(false); - queue->GetTaskQueueImpl()->SetQueueEnabled(true); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder()); - auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder()); - } +// Post a 1st task. Install a now fence. Post a 2nd task. Run the first task. +// Remove the fence. The 2nd task's EnqueueOrder should be less than +// GetLastUnblockEnqueueOrder(). +TEST_P(SequenceManagerTest, GetLastUnblockEnqueueOrder_PostInsertNowFencePost) { + auto queue = CreateTaskQueue(); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFence(TaskQueue::InsertFencePosition::kNow); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); + queue->RemoveFence(); + auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder()); +} - { - // Disable the queue. Post a 1st task. Re-enable the queue. Post a 2nd task. - // The 1st task's EnqueueOrder should be less than - // GetLastUnblockEnqueueOrder(). - auto queue = CreateTaskQueue(); - queue->GetTaskQueueImpl()->SetQueueEnabled(false); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - queue->GetTaskQueueImpl()->SetQueueEnabled(true); - queue->task_runner()->PostTask(FROM_HERE, DoNothing()); - auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder()); - auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); - EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder()); - } +// Post a 1st task. Install a now fence. Post a 2nd task. Remove the fence. +// GetLastUnblockEnqueueOrder() should indicate that the queue was never +// blocked (front task could always run). +TEST_P(SequenceManagerTest, + GetLastUnblockEnqueueOrder_PostInsertNowFencePost2) { + auto queue = CreateTaskQueue(); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFence(TaskQueue::InsertFencePosition::kNow); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->RemoveFence(); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); +} + +// Post a 1st task. Install a now fence. Post a 2nd task. Install a now fence +// (moves the previous fence). GetLastUnblockEnqueueOrder() should indicate +// that the queue was never blocked (front task could always run). +TEST_P(SequenceManagerTest, + GetLastUnblockEnqueueOrder_PostInsertNowFencePostInsertNowFence) { + auto queue = CreateTaskQueue(); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFence(TaskQueue::InsertFencePosition::kNow); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFence(TaskQueue::InsertFencePosition::kNow); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); +} + +// Post a 1st task. Install a delayed fence. Post a 2nd task that will run +// after the fence. Run the first task. Remove the fence. The 2nd task's +// EnqueueOrder should be less than GetLastUnblockEnqueueOrder(). +TEST_P(SequenceManagerTest, + GetLastUnblockEnqueueOrder_PostInsertDelayedFencePostAfterFence) { + const TimeTicks start_time = mock_tick_clock()->NowTicks(); + auto queue = + CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true)); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFenceAt(start_time + kDelay); + queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), 2 * kDelay); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); + FastForwardBy(2 * kDelay); + queue->RemoveFence(); + auto enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_LT(enqueue_order, queue->GetLastUnblockEnqueueOrder()); +} + +// Post a 1st task. Install a delayed fence. Post a 2nd task that will run +// before the fence. GetLastUnblockEnqueueOrder() should indicate that the +// queue was never blocked (front task could always run). +TEST_P(SequenceManagerTest, + GetLastUnblockEnqueueOrder_PostInsertDelayedFencePostBeforeFence) { + const TimeTicks start_time = mock_tick_clock()->NowTicks(); + auto queue = + CreateTaskQueue(TaskQueue::Spec("test").SetDelayedFencesAllowed(true)); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->InsertFenceAt(start_time + 2 * kDelay); + queue->task_runner()->PostDelayedTask(FROM_HERE, DoNothing(), kDelay); + RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); + FastForwardBy(3 * kDelay); + EXPECT_FALSE(queue->GetLastUnblockEnqueueOrder()); + queue->RemoveFence(); +} + +// Post a 1st task. Disable the queue and re-enable it. Post a 2nd task. The 1st +// task's EnqueueOrder should be less than GetLastUnblockEnqueueOrder(). +TEST_P(SequenceManagerTest, GetLastUnblockEnqueueOrder_PostDisablePostEnable) { + auto queue = CreateTaskQueue(); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->GetTaskQueueImpl()->SetQueueEnabled(false); + queue->GetTaskQueueImpl()->SetQueueEnabled(true); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder()); + auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder()); +} + +// Disable the queue. Post a 1st task. Re-enable the queue. Post a 2nd task. +// The 1st task's EnqueueOrder should be less than +// GetLastUnblockEnqueueOrder(). +TEST_P(SequenceManagerTest, GetLastUnblockEnqueueOrder_DisablePostEnablePost) { + auto queue = CreateTaskQueue(); + queue->GetTaskQueueImpl()->SetQueueEnabled(false); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + queue->GetTaskQueueImpl()->SetQueueEnabled(true); + queue->task_runner()->PostTask(FROM_HERE, DoNothing()); + auto first_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_LT(first_enqueue_order, queue->GetLastUnblockEnqueueOrder()); + auto second_enqueue_order = RunTaskAndCaptureEnqueueOrder(queue); + EXPECT_GT(second_enqueue_order, queue->GetLastUnblockEnqueueOrder()); } } // namespace sequence_manager_impl_unittest
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc index 0827e46e..64877c7 100644 --- a/base/task/sequence_manager/task_queue_impl.cc +++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -757,27 +757,28 @@ // Tasks posted after this point will have a strictly higher enqueue order // and will be blocked from running. main_thread_only().current_fence = current_fence; - bool task_unblocked = + bool front_task_unblocked = main_thread_only().immediate_work_queue->InsertFence(current_fence); - task_unblocked |= + front_task_unblocked |= main_thread_only().delayed_work_queue->InsertFence(current_fence); { base::internal::CheckedAutoLock lock(any_thread_lock_); - if (!task_unblocked && previous_fence && previous_fence < current_fence) { + if (!front_task_unblocked && previous_fence && + previous_fence < current_fence) { if (!any_thread_.immediate_incoming_queue.empty() && any_thread_.immediate_incoming_queue.front().enqueue_order() > previous_fence && any_thread_.immediate_incoming_queue.front().enqueue_order() < current_fence) { - task_unblocked = true; + front_task_unblocked = true; } } UpdateCrossThreadQueueStateLocked(); } - if (IsQueueEnabled() && task_unblocked) { + if (IsQueueEnabled() && front_task_unblocked) { main_thread_only().last_unblocked_enqueue_order = sequence_manager_->GetNextSequenceNumber(); sequence_manager_->ScheduleWork(); @@ -799,23 +800,24 @@ main_thread_only().current_fence = EnqueueOrder::none(); main_thread_only().delayed_fence = nullopt; - bool task_unblocked = main_thread_only().immediate_work_queue->RemoveFence(); - task_unblocked |= main_thread_only().delayed_work_queue->RemoveFence(); + bool front_task_unblocked = + main_thread_only().immediate_work_queue->RemoveFence(); + front_task_unblocked |= main_thread_only().delayed_work_queue->RemoveFence(); { base::internal::CheckedAutoLock lock(any_thread_lock_); - if (!task_unblocked && previous_fence) { + if (!front_task_unblocked && previous_fence) { if (!any_thread_.immediate_incoming_queue.empty() && any_thread_.immediate_incoming_queue.front().enqueue_order() > previous_fence) { - task_unblocked = true; + front_task_unblocked = true; } } UpdateCrossThreadQueueStateLocked(); } - if (IsQueueEnabled() && task_unblocked) { + if (IsQueueEnabled() && front_task_unblocked) { main_thread_only().last_unblocked_enqueue_order = sequence_manager_->GetNextSequenceNumber(); sequence_manager_->ScheduleWork();
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc index 2f3bf68..6b9282f 100644 --- a/base/task/thread_pool/task_tracker.cc +++ b/base/task/thread_pool/task_tracker.cc
@@ -343,8 +343,8 @@ void TaskTracker::CompleteShutdown() { // It is safe to access |shutdown_event_| without holding |lock_| because the - // pointer never changes after being set by StartShutdown(), which must be - // called before this. + // pointer never changes after being set by StartShutdown(), which must + // happen-before before this. DCHECK(TS_UNCHECKED_READ(shutdown_event_)); { base::ScopedAllowBaseSyncPrimitives allow_wait; @@ -405,13 +405,7 @@ // ordering bug. This aims to catch those early. CheckedAutoLock auto_lock(shutdown_lock_); DCHECK(shutdown_event_); - // TODO(http://crbug.com/698140): Atomically shutdown the service thread - // to prevent racily posting BLOCK_SHUTDOWN tasks in response to a - // FileDescriptorWatcher (and/or make such notifications never be - // BLOCK_SHUTDOWN). Then, enable this DCHECK, until then, skip the task. - // DCHECK(!shutdown_event_->IsSignaled()); - if (shutdown_event_->IsSignaled()) - return false; + DCHECK(!shutdown_event_->IsSignaled()); } // TODO(scheduler-dev): Record the task traits here. @@ -643,20 +637,11 @@ const bool shutdown_started = state_->IncrementNumItemsBlockingShutdown(); if (shutdown_started) { - // A BLOCK_SHUTDOWN task posted after shutdown has completed is an // ordering bug. This aims to catch those early. CheckedAutoLock auto_lock(shutdown_lock_); DCHECK(shutdown_event_); - // TODO(http://crbug.com/698140): Atomically shutdown the service thread - // to prevent racily posting BLOCK_SHUTDOWN tasks in response to a - // FileDescriptorWatcher (and/or make such notifications never be - // BLOCK_SHUTDOWN). Then, enable this DCHECK, until then, skip the task. - // DCHECK(!shutdown_event_->IsSignaled()); - if (shutdown_event_->IsSignaled()) { - state_->DecrementNumItemsBlockingShutdown(); - return false; - } + DCHECK(!shutdown_event_->IsSignaled()); } return true;
diff --git a/base/task/thread_pool/task_tracker.h b/base/task/thread_pool/task_tracker.h index 1ab341e..4a7f28b6 100644 --- a/base/task/thread_pool/task_tracker.h +++ b/base/task/thread_pool/task_tracker.h
@@ -236,7 +236,10 @@ const bool has_log_best_effort_tasks_switch_; // Number of tasks blocking shutdown and boolean indicating whether shutdown - // has started. + // has started. |shutdown_lock_| should be held to access |shutdown_event_| + // when this indicates that shutdown has started because State doesn't provide + // memory barriers. It intentionally trades having to use a Lock on shutdown + // with not needing memory barriers at runtime. const std::unique_ptr<State> state_; // Number of task sources that haven't completed their execution. Is
diff --git a/base/task/thread_pool/task_tracker_unittest.cc b/base/task/thread_pool/task_tracker_unittest.cc index c2649fd..00ac240 100644 --- a/base/task/thread_pool/task_tracker_unittest.cc +++ b/base/task/thread_pool/task_tracker_unittest.cc
@@ -487,7 +487,11 @@ Task task(CreateTask()); // |task_tracker_| shouldn't allow a task to be posted after shutdown. - EXPECT_FALSE(tracker_.WillPostTask(&task, GetParam())); + if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) { + EXPECT_DCHECK_DEATH(tracker_.WillPostTask(&task, GetParam())); + } else { + EXPECT_FALSE(tracker_.WillPostTask(&task, GetParam())); + } } // Verify that BLOCK_SHUTDOWN and SKIP_ON_SHUTDOWN tasks can
diff --git a/base/task/thread_pool/thread_pool_impl.cc b/base/task/thread_pool/thread_pool_impl.cc index 189c86d..5e6e490a 100644 --- a/base/task/thread_pool/thread_pool_impl.cc +++ b/base/task/thread_pool/thread_pool_impl.cc
@@ -289,6 +289,14 @@ void ThreadPoolImpl::Shutdown() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Stop() the ServiceThread before triggering shutdown. This ensures that no + // more delayed tasks or file descriptor watches will trigger during shutdown + // (preventing http://crbug.com/698140). None of these asynchronous tasks + // being guaranteed to happen anyways, stopping right away is valid behavior + // and avoids the more complex alternative of shutting down the service thread + // atomically during TaskTracker shutdown. + service_thread_->Stop(); + task_tracker_->StartShutdown(); // Allow all tasks to run. Done after initiating shutdown to ensure that non-
diff --git a/base/task/thread_pool/thread_pool_impl_unittest.cc b/base/task/thread_pool/thread_pool_impl_unittest.cc index a2ee40f..880d4fc6 100644 --- a/base/task/thread_pool/thread_pool_impl_unittest.cc +++ b/base/task/thread_pool/thread_pool_impl_unittest.cc
@@ -770,12 +770,6 @@ // Give a chance for the file watcher to fire before closing the handles. PlatformThread::Sleep(TestTimeouts::tiny_timeout()); - // Need to join the ServiceThread before closing the pipes as the pipe - // becoming readable is observed on the ServiceThread and TSAN correctly - // identifies this as a race even though the above sleep makes it highly - // unlikely in practice. - TearDown(); - EXPECT_EQ(0, IGNORE_EINTR(close(pipes[0]))); EXPECT_EQ(0, IGNORE_EINTR(close(pipes[1]))); }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index b916d2d8..e977286 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1355,7 +1355,6 @@ "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java", "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java", "java/src/org/chromium/chrome/browser/preferences/website/StorageInfo.java", - "java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java", "java/src/org/chromium/chrome/browser/preferences/website/TriStateSiteSettingsPreference.java", "java/src/org/chromium/chrome/browser/preferences/website/Website.java", "java/src/org/chromium/chrome/browser/preferences/website/WebsiteAddress.java",
diff --git a/chrome/android/java/res/drawable-hdpi/settings_translate.png b/chrome/android/java/res/drawable-hdpi/settings_translate.png deleted file mode 100644 index 8067680e..0000000 --- a/chrome/android/java/res/drawable-hdpi/settings_translate.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/settings_translate.png b/chrome/android/java/res/drawable-mdpi/settings_translate.png deleted file mode 100644 index 3b9b4cd..0000000 --- a/chrome/android/java/res/drawable-mdpi/settings_translate.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/settings_translate.png b/chrome/android/java/res/drawable-xhdpi/settings_translate.png deleted file mode 100644 index 131a573..0000000 --- a/chrome/android/java/res/drawable-xhdpi/settings_translate.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/settings_translate.png b/chrome/android/java/res/drawable-xxhdpi/settings_translate.png deleted file mode 100644 index 55878e6..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/settings_translate.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/settings_translate.png b/chrome/android/java/res/drawable-xxxhdpi/settings_translate.png deleted file mode 100644 index 058b50b..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/settings_translate.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml index e0e937c..817c639 100644 --- a/chrome/android/java/res/values/values.xml +++ b/chrome/android/java/res/values/values.xml
@@ -48,7 +48,6 @@ <string name="help_context_bookmarks">mobile_bookmarks</string> <string name="help_context_history">mobile_history</string> <string name="help_context_privacy">mobile_privacy</string> - <string name="help_context_translate">mobile_translate</string> <string name="help_context_general">mobile_general</string> <string name="help_context_protected_content">protected_content</string> <string name="help_context_data_reduction">reduce_data_usage</string>
diff --git a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml index 69be874..a183d7f 100644 --- a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml +++ b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
@@ -3,9 +3,9 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> +<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - <Preference + <android.support.v7.preference.Preference android:key="server_profile_description" android:selectable="false" /> @@ -14,4 +14,4 @@ android:widgetLayout="@layout/autofill_server_data_edit_link" android:title="@string/autofill_from_google_account_long" /> -</PreferenceScreen> +</android.support.v7.preference.PreferenceScreen>
diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/android/java/res/xml/site_settings_preferences.xml index d299561..ef75b04 100644 --- a/chrome/android/java/res/xml/site_settings_preferences.xml +++ b/chrome/android/java/res/xml/site_settings_preferences.xml
@@ -76,12 +76,6 @@ <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences" android:key="sound" /> - <!-- Google Translate --> - <Preference - android:fragment="org.chromium.chrome.browser.preferences.website.TranslatePreferences" - android:key="translate" - android:title="@string/google_translate" - android:icon="@drawable/settings_translate" /> <!-- Storage --> <!-- TODO(finnur): Move this over to the new Usage screen, once it exists. --> <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
diff --git a/chrome/android/java/res/xml/translate_preferences.xml b/chrome/android/java/res/xml/translate_preferences.xml deleted file mode 100644 index 9b80ffd7..0000000 --- a/chrome/android/java/res/xml/translate_preferences.xml +++ /dev/null
@@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. --> - -<PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <org.chromium.chrome.browser.preferences.ChromeSwitchPreference - android:key="translate_switch" - android:summaryOn="@string/text_on" - android:summaryOff="@string/text_off" - app:drawDivider="true" /> - - <org.chromium.chrome.browser.preferences.TextMessagePreference - android:title="@string/translate_prefs_description" /> - - <org.chromium.chrome.browser.preferences.ButtonPreference - android:key="reset_translate_button" - android:title="@string/reset_translate_defaults" /> - -</PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java index 53511a80..83206ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskScheduler.java
@@ -25,8 +25,8 @@ */ public class BackgroundSyncBackgroundTaskScheduler { /** - * Denotes the one-off Background Sync Background Tasks scheduled through - * this class. + * Denotes the types of one-off Background Tasks scheduled through this + * class. * ONE_SHOT_SYNC_CHROME_WAKE_UP is the task that processes one-shot * Background Sync registrations. * PERIODIC_SYNC_CHROME_WAKE_UP processes Periodic Background Sync @@ -35,8 +35,8 @@ @IntDef({BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, BackgroundSyncTask.PERIODIC_SYNC_CHROME_WAKE_UP}) public @interface BackgroundSyncTask { - int PERIODIC_SYNC_CHROME_WAKE_UP = 0; - int ONE_SHOT_SYNC_CHROME_WAKE_UP = 1; + int ONE_SHOT_SYNC_CHROME_WAKE_UP = 0; + int PERIODIC_SYNC_CHROME_WAKE_UP = 1; }; // Keep in sync with the default min_sync_recovery_time of @@ -58,10 +58,10 @@ } /** - * Returns the appropriate TaskID to use based on the class of the Background + * Returns the appropriate TaskID to use based on the type of the Background * Sync task we're working with. * - * @param taskType The Background Sync task to get the TaskID for. + * @param taskType Type of the Background Sync task to get the TaskID for. */ @VisibleForTesting public static int getAppropriateTaskId(@BackgroundSyncTask int taskType) { @@ -77,10 +77,10 @@ } /** - * Returns the appropriate task class to use based on the Background + * Returns the appropriate task class to use based on the type of the Background * Sync task we're working with. * - * @param taskType The Background Sync task to get the task class for. + * @param taskType Type of the Background Sync task to get the task class for. */ @VisibleForTesting public static Class<? extends NativeBackgroundTask> getAppropriateTaskClass( @@ -99,7 +99,7 @@ /** * Cancels a Background Sync one-off task, if there's one scheduled. * - * @param taskType The Background Sync task to cancel. + * @param taskType The type of BackgroundSync task to cancel. */ @VisibleForTesting protected void cancelOneOffTask(@BackgroundSyncTask int taskType) { @@ -113,7 +113,7 @@ * events. * * @param minDelayMs The minimum time to wait before waking the browser. - * @param taskType The Background Sync task to schedule. + * @param taskType The type of BackgroundSync task to schedule. */ protected boolean scheduleOneOffTask(long minDelayMs, @BackgroundSyncTask int taskType) { // Pack SOONEST_EXPECTED_WAKETIME in extras. @@ -134,23 +134,21 @@ } /** - * Based on shouldLaunch, either creates or cancels a one-off background - * task to wake up Chrome upon network connectivity. + * Based on shouldLaunch, either creates or cancels a one-off background task to + * wake up Chrome upon network connectivity. * - * @param taskType The one-off background task to create. * @param shouldLaunch Whether to launch the browser in the background. * @param minDelayMs The minimum time to wait before waking the browser. */ @VisibleForTesting @CalledByNative - protected void launchBrowserIfStopped( - @BackgroundSyncTask int taskType, boolean shouldLaunch, long minDelayMs) { + protected void launchBrowserIfStopped(boolean shouldLaunch, long minDelayMs) { if (!shouldLaunch) { - cancelOneOffTask(taskType); + cancelOneOffTask(BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP); return; } - scheduleOneOffTask(minDelayMs, taskType); + scheduleOneOffTask(minDelayMs, BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP); } /** @@ -158,7 +156,7 @@ * Background Sync events in the event of an OS upgrade or Google Play Services * upgrade. * - * @param taskType The Background Sync task to reschedule. + * @param taskType The type of BackgroundSync task to reschedule. */ public void reschedule(@BackgroundSyncTask int taskType) { scheduleOneOffTask(MIN_SYNC_RECOVERY_TIME, taskType);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java index a85a9f01..54d113e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java
@@ -359,13 +359,6 @@ } /** - * Resets translate defaults if needed - */ - public void resetTranslateDefaults() { - nativeResetTranslateDefaults(); - } - - /** * @return the last account id associated with sync. */ public String getSyncLastAccountId() { @@ -1108,7 +1101,6 @@ private native boolean nativeGetSoundEnabled(); private native boolean nativeGetSupervisedUserSafeSitesEnabled(); private native void nativeSetTranslateEnabled(boolean enabled); - private native void nativeResetTranslateDefaults(); private native void nativeMigrateJavascriptPreference(); private native boolean nativeGetBrowsingDataDeletionPreference( int dataType, int clearBrowsingDataTab);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java index 52be01c4..87c3a5f3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java
@@ -5,7 +5,8 @@ package org.chromium.chrome.browser.preferences; import android.content.Context; -import android.preference.Preference; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceViewHolder; import android.util.AttributeSet; import android.view.View; @@ -27,10 +28,10 @@ } @Override - protected void onBindView(View view) { - super.onBindView(view); + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); - View button = view.findViewById(R.id.preference_click_target); + View button = holder.findViewById(R.id.preference_click_target); button.setClickable(true); button.setOnClickListener(new View.OnClickListener() { @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java index d37e1ee5..74c5a6a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java
@@ -6,9 +6,8 @@ import android.content.Context; import android.os.Bundle; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceFragment; +import android.support.v7.preference.Preference; +import android.support.v7.preference.PreferenceFragmentCompat; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeStringConstants; @@ -22,15 +21,14 @@ * Fragment for settings page that allows user to view and edit a single server-provided address. */ public class AutofillServerProfilePreferences - extends PreferenceFragment implements OnPreferenceClickListener { + extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener { private String mGUID; private static final String PREF_SERVER_PROFILE_DESCRIPTION = "server_profile_description"; private static final String PREF_SERVER_PROFILE_EDIT_LINK = "server_profile_edit_link"; @Override - public void onCreate(Bundle savedState) { - super.onCreate(savedState); + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { PreferenceUtils.addPreferencesFromResource(this, R.xml.autofill_server_profile_preferences); getActivity().setTitle(R.string.autofill_edit_profile);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java index 0f6eea70..314b202 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
@@ -14,7 +14,6 @@ import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.PreferenceGroup; -import android.support.v7.preference.PreferenceScreen; import android.support.v7.widget.Toolbar; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; @@ -117,7 +116,7 @@ } }); getActivity().setTitle(R.string.prefs_saved_passwords_title); - setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity())); + setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getStyledContext())); PasswordManagerHandlerProvider.getInstance().addObserver(this); setHasOptionsMenu(true); // Password Export might be optional but Search is always present. @@ -247,7 +246,7 @@ PreferenceGroup passwordParent; if (mSearchQuery == null) { - PreferenceCategory profileCategory = new PreferenceCategory(getActivity()); + PreferenceCategory profileCategory = new PreferenceCategory(getStyledContext()); profileCategory.setKey(PREF_KEY_CATEGORY_SAVED_PASSWORDS); profileCategory.setTitle(R.string.prefs_saved_passwords_title); profileCategory.setOrder(ORDER_SAVED_PASSWORDS); @@ -266,16 +265,16 @@ if (shouldBeFiltered(url, name)) { continue; // The current password won't show with the active filter, try the next. } - PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity()); - screen.setTitle(url); - screen.setOnPreferenceClickListener(this); - screen.setSummary(name); - Bundle args = screen.getExtras(); + Preference preference = new Preference(getStyledContext()); + preference.setTitle(url); + preference.setOnPreferenceClickListener(this); + preference.setSummary(name); + Bundle args = preference.getExtras(); args.putString(PASSWORD_LIST_NAME, name); args.putString(PASSWORD_LIST_URL, url); args.putString(PASSWORD_LIST_PASSWORD, password); args.putInt(PASSWORD_LIST_ID, i); - passwordParent.addPreference(screen); + passwordParent.addPreference(preference); } mNoPasswords = passwordParent.getPreferenceCount() == 0; if (mNoPasswords) { @@ -320,7 +319,7 @@ displayManageAccountLink(); - PreferenceCategory profileCategory = new PreferenceCategory(getActivity()); + PreferenceCategory profileCategory = new PreferenceCategory(getStyledContext()); profileCategory.setKey(PREF_KEY_CATEGORY_EXCEPTIONS); profileCategory.setTitle(R.string.section_saved_passwords_exceptions); profileCategory.setOrder(ORDER_EXCEPTIONS); @@ -329,13 +328,13 @@ String exception = PasswordManagerHandlerProvider.getInstance() .getPasswordManagerHandler() .getSavedPasswordException(i); - PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity()); - screen.setTitle(exception); - screen.setOnPreferenceClickListener(this); - Bundle args = screen.getExtras(); + Preference preference = new Preference(getStyledContext()); + preference.setTitle(exception); + preference.setOnPreferenceClickListener(this); + Bundle args = preference.getExtras(); args.putString(PASSWORD_LIST_URL, exception); args.putInt(PASSWORD_LIST_ID, i); - profileCategory.addPreference(screen); + profileCategory.addPreference(preference); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java index 853da20..3e7407b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
@@ -37,7 +37,6 @@ // are defined in the SiteSettingsCategory, additional keys // are listed here. static final String MEDIA_KEY = "media"; - static final String TRANSLATE_KEY = "translate"; // Whether this class is handling showing the Media sub-menu (and not the main menu). boolean mMediaSubMenu; @@ -79,7 +78,6 @@ getPreferenceScreen().removePreference(findPreference(i)); } getPreferenceScreen().removePreference(findPreference(MEDIA_KEY)); - getPreferenceScreen().removePreference(findPreference(TRANSLATE_KEY)); } else { // These will be tucked under the Media subkey, so don't show them on the main menu. getPreferenceScreen().removePreference(findPreference(Type.AUTOPLAY)); @@ -90,7 +88,6 @@ if (!SiteSettingsCategory.adsCategoryEnabled()) { getPreferenceScreen().removePreference(findPreference(Type.ADS)); } - getPreferenceScreen().removePreference(findPreference(TRANSLATE_KEY)); if (!ChromeFeatureList.isEnabled(ChromeFeatureList.SENSOR_CONTENT_SETTING)) { getPreferenceScreen().removePreference(findPreference(Type.SENSORS)); } @@ -108,10 +105,6 @@ private void updatePreferenceStates() { PrefServiceBridge prefServiceBridge = PrefServiceBridge.getInstance(); - // Translate preference. - Preference translatePref = findPreference(TRANSLATE_KEY); - if (translatePref != null) setTranslateStateSummary(translatePref); - // Preferences that navigate to Website Settings. List<Integer> websitePrefs = new ArrayList<Integer>(); if (mMediaSubMenu) { @@ -224,11 +217,4 @@ preference.getTitle().toString()); return false; } - - private void setTranslateStateSummary(Preference translatePref) { - boolean translateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled(); - translatePref.setSummary(translateEnabled - ? R.string.website_settings_category_ask - : R.string.website_settings_category_blocked); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java deleted file mode 100644 index 995967c..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TranslatePreferences.java +++ /dev/null
@@ -1,106 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.preferences.website; - -import android.content.Context; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceChangeListener; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceFragment; -import android.support.graphics.drawable.VectorDrawableCompat; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.help.HelpAndFeedback; -import org.chromium.chrome.browser.preferences.ButtonPreference; -import org.chromium.chrome.browser.preferences.ChromeSwitchPreference; -import org.chromium.chrome.browser.preferences.PrefServiceBridge; -import org.chromium.chrome.browser.preferences.PreferenceUtils; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.ui.widget.Toast; - -/** - * Fragment to keep track of the translate preferences. - */ -public class TranslatePreferences extends PreferenceFragment { - - public static final String PREF_TRANSLATE_SWITCH = "translate_switch"; - public static final String PREF_RESET_TRANSLATE_BUTTON = "reset_translate_button"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - PreferenceUtils.addPreferencesFromResource(this, R.xml.translate_preferences); - getActivity().setTitle(R.string.google_translate); - setHasOptionsMenu(true); - - final Context context = getActivity(); - if (context == null) return; - - ChromeSwitchPreference translateSwitch = - (ChromeSwitchPreference) findPreference(PREF_TRANSLATE_SWITCH); - - boolean isTranslateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled(); - translateSwitch.setChecked(isTranslateEnabled); - - translateSwitch.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - PrefServiceBridge.getInstance().setTranslateEnabled((boolean) newValue); - return true; - } - }); - translateSwitch.setManagedPreferenceDelegate( - preference -> PrefServiceBridge.getInstance().isTranslateManaged()); - - ButtonPreference resetTranslateButton = (ButtonPreference) - findPreference(PREF_RESET_TRANSLATE_BUTTON); - - resetTranslateButton.setOnPreferenceClickListener(new OnPreferenceClickListener(){ - @Override - public boolean onPreferenceClick(Preference preference) { - PrefServiceBridge.getInstance().resetTranslateDefaults(); - Toast.makeText(getActivity(), getString( - R.string.translate_prefs_toast_description), - Toast.LENGTH_SHORT).show(); - return true; - } - }); - - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - menu.clear(); - MenuItem help = menu.add( - Menu.NONE, R.id.menu_id_targeted_help, Menu.NONE, R.string.menu_help); - help.setIcon(VectorDrawableCompat.create( - getResources(), R.drawable.ic_help_and_feedback, getActivity().getTheme())); - help.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - - menu.add(Menu.NONE, R.id.menu_id_reset, Menu.NONE, R.string.reset_translate_defaults); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.menu_id_targeted_help) { - HelpAndFeedback.getInstance(getActivity()) - .show(getActivity(), getString(R.string.help_context_translate), - Profile.getLastUsedProfile(), null); - return true; - } else if (itemId == R.id.menu_id_reset) { - PrefServiceBridge.getInstance().resetTranslateDefaults(); - Toast.makeText(getActivity(), getString( - R.string.translate_prefs_toast_description), - Toast.LENGTH_SHORT).show(); - return true; - } - return false; - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java index 23450d5..8b3a12d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java
@@ -6,14 +6,12 @@ import android.content.Context; import android.content.SharedPreferences; -import android.os.SystemClock; import android.support.annotation.IntDef; import android.util.Log; import org.chromium.base.ContextUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; -import org.chromium.base.metrics.RecordHistogram; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -273,14 +271,7 @@ SharedPreferences prefs = ContextUtils.getApplicationContext().getSharedPreferences( mPrefPackage, Context.MODE_PRIVATE); try { - long time = SystemClock.elapsedRealtime(); final int numSavedEntries = prefs.getInt(mPrefNumSavedEntries, 0); - try { - RecordHistogram.recordTimesHistogram("Android.StrictMode.WebappSharedPrefs", - SystemClock.elapsedRealtime() - time); - } catch (UnsatisfiedLinkError error) { - // Intentionally ignored - it's ok to miss recording the metric occasionally. - } if (numSavedEntries <= NUM_WEBAPP_ACTIVITIES) { for (int i = 0; i < numSavedEntries; ++i) { String currentActivityIndexPref = mPrefActivityIndex + i;
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 1fe6d09..577e3a3 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1236,20 +1236,6 @@ Protected content </message> - <!-- Google translate preferences --> - <message name="IDS_GOOGLE_TRANSLATE" desc='Title for the Google Translate settings screen. [CHAR-LIMIT=32]'> - Google Translate - </message> - <message name="IDS_TRANSLATE_PREFS_DESCRIPTION" desc="Translate preference description"> - When this feature is turned on, Chrome will offer to translate pages written in other languages using Google Translate. - </message> - <message name="IDS_TRANSLATE_PREFS_TOAST_DESCRIPTION" desc="Translate settings reset toast when resetting defaults"> - Your translate settings have been reset. - </message> - <message name="IDS_RESET_TRANSLATE_DEFAULTS" desc="Title for translate reset menu preference"> - Reset translate settings - </message> - <!-- Storage preferences --> <message name="IDS_WEBSITE_SETTINGS_STORAGE" desc="Title for Storage settings which show how much data websites are storing on the user's device. [CHAR-LIMIT=32]"> Storage
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java index 63ae2131..242c8694 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
@@ -53,7 +53,7 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"}) -@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+ +@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+ @Restriction(RESTRICTION_TYPE_SVR) public class VrInstallUpdateInfoBarTest { @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java index 4602dd65..c9e98676 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
@@ -47,7 +47,6 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages", "enable-webvr"}) -@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+ public class WebXrVrDeviceTest { @ClassParameter private static List<ParameterSet> sClassParams = @@ -77,6 +76,7 @@ @Test @MediumTest @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+ public void testDeviceCapabilitiesMatchExpectations() throws InterruptedException { mWebVrTestFramework.loadUrlAndAwaitInitialization( WebVrTestFramework.getFileUrlForHtmlTestFile( @@ -95,6 +95,7 @@ @MediumTest @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) @Restriction(RESTRICTION_TYPE_SVR) + // Sensorless still works on older devices since it doesn't rely on anything in the DFM. public void testGvrlessMagicWindowCapabilities() throws InterruptedException { // Make Chrome think that VrCore is not installed VrShellDelegateUtils.setVrCoreCompatibility(VrCoreCompatibility.VR_NOT_AVAILABLE); @@ -119,6 +120,7 @@ .Remove({"enable-webvr"}) @CommandLineFlags.Add({"enable-features=WebXR"}) @XrActivityRestriction({XrActivityRestriction.SupportedActivity.ALL}) + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebXR is only supported on L+ public void testWebXrCapabilities() throws InterruptedException { mWebXrVrTestFramework.loadUrlAndAwaitInitialization( WebXrVrTestFramework.getFileUrlForHtmlTestFile("test_webxr_capabilities"), @@ -141,6 +143,7 @@ .Remove({"enable-webvr"}) @CommandLineFlags.Add({"enable-features=WebXR"}) @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM) + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebXR is only supported on L+ public void testForNullPosesInInlineVrPostImmersive() throws InterruptedException { mWebXrVrTestFramework.loadUrlAndAwaitInitialization( WebXrVrTestFramework.getFileUrlForHtmlTestFile("test_inline_vr_poses"), @@ -176,6 +179,7 @@ .Remove({"enable-webvr"}) @CommandLineFlags.Add({"enable-features=WebXR"}) @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM) + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+ public void testForNullPosesInInlineVrFromNfc() throws InterruptedException { mWebXrVrTestFramework.loadUrlAndAwaitInitialization( WebXrVrTestFramework.getFileUrlForHtmlTestFile("test_inline_vr_poses"), @@ -209,6 +213,7 @@ .Remove({"enable-webvr"}) @CommandLineFlags.Add({"enable-features=WebXR"}) @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM) + @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on L+ public void testForNullPosesInInlineVrOnNavigation() throws InterruptedException { NfcSimUtils.simNfcScanUntilVrEntry(mTestRule.getActivity()); mWebXrVrTestFramework.loadUrlAndAwaitInitialization(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java index f45c006..3da2fffc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
@@ -43,7 +43,7 @@ @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages", "enable-webvr"}) -@MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+ +@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // WebVR is only supported on K+ public class WebXrVrTabTest { @ClassParameter private static List<ParameterSet> sClassParams =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java index 1adf616..dfeb7e6 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java
@@ -86,7 +86,6 @@ @Feature({"BackgroundSync"}) public void testLaunchBrowserIfStopped() { BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped( - BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, /* shouldLaunch= */ true, /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS); verify(mTaskScheduler, times(1)) @@ -121,7 +120,6 @@ @Feature({"BackgroundSync"}) public void testCancelOneShotTask() { BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped( - BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, /* shouldLaunch= */ true, /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS); verify(mTaskScheduler, times(1)) @@ -164,7 +162,6 @@ @Feature({"BackgroundSync"}) public void testLaunchBrowserCalledTwice() { BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped( - BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, /* shouldLaunch= */ true, /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS); verify(mTaskScheduler, times(1)) @@ -174,7 +171,6 @@ assertEquals(ONE_DAY_IN_MILLISECONDS, taskInfo.getOneOffInfo().getWindowStartTimeMs()); BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped( - BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, /* shouldLaunch= */ true, /* minDelayMs= */ ONE_WEEK_IN_MILLISECONDS); verify(mTaskScheduler, times(1)) @@ -210,11 +206,9 @@ @Feature({"BackgroundSync"}) public void testLaunchBrowserThenCancel() { BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped( - BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, /* shouldLaunch= */ true, /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS); BackgroundSyncBackgroundTaskScheduler.getInstance().launchBrowserIfStopped( - BackgroundSyncTask.ONE_SHOT_SYNC_CHROME_WAKE_UP, /* shouldLaunch= */ false, /* minDelayMs= */ ONE_DAY_IN_MILLISECONDS);
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index b94ea291..af29c36 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -454,6 +454,7 @@ deps += [ "//chrome/browser/ui/webui/chromeos/add_supervision:mojo_bindings", "//chrome/browser/ui/webui/chromeos/machine_learning:mojo_bindings", + "//chrome/services/cups_proxy/public/cpp:manifest", "//chrome/services/cups_proxy/public/mojom", "//chromeos/assistant:buildflags", "//chromeos/services/cellular_setup/public/mojom", @@ -619,7 +620,6 @@ deps += [ "//ash/public/cpp:manifest", "//chrome/services/cups_ipp_parser/public/cpp:manifest", - "//chrome/services/cups_proxy/public/cpp:manifest", "//chromeos/services/cellular_setup/public/cpp:manifest", "//chromeos/services/ime/public/cpp:manifest", "//chromeos/services/network_config/public/cpp:manifest",
diff --git a/chrome/app/DEPS b/chrome/app/DEPS index cd61910..af15780 100644 --- a/chrome/app/DEPS +++ b/chrome/app/DEPS
@@ -84,7 +84,6 @@ ], "builtin_service_manifests\.cc": [ "+chrome/services/cups_ipp_parser/public", - "+chrome/services/cups_proxy/public", "+chrome/services/file_util/public", "+chrome/services/isolated_xr_device/manifest.h", "+chrome/services/media_gallery_util/public",
diff --git a/chrome/app/builtin_service_manifests.cc b/chrome/app/builtin_service_manifests.cc index 45184cb..9d1a96e 100644 --- a/chrome/app/builtin_service_manifests.cc +++ b/chrome/app/builtin_service_manifests.cc
@@ -24,7 +24,6 @@ #if defined(OS_CHROMEOS) #include "ash/public/cpp/manifest.h" #include "chrome/services/cups_ipp_parser/public/cpp/manifest.h" // nogncheck -#include "chrome/services/cups_proxy/public/cpp/manifest.h" #include "chromeos/services/cellular_setup/public/cpp/manifest.h" #include "chromeos/services/ime/public/cpp/manifest.h" #include "chromeos/services/network_config/public/cpp/manifest.h" @@ -145,7 +144,6 @@ chromeos::cellular_setup::GetManifest(), chromeos::ime::GetManifest(), chromeos::network_config::GetManifest(), - chromeos::printing::GetCupsProxyManifest(), chromeos::secure_channel::GetManifest(), GetCupsIppParserManifest(), #endif
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h index e4bb299..385adb9 100644 --- a/chrome/app/chrome_command_ids.h +++ b/chrome/app/chrome_command_ids.h
@@ -329,6 +329,9 @@ #define IDC_BOOKMARK_BAR_UNDO 51012 #define IDC_BOOKMARK_BAR_REDO 51013 #define IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS 51014 +// Context menu items for Sharing +#define IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE 51030 +#define IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES 51031 // Context menu items in the status tray #define IDC_STATUS_TRAY_KEEP_CHROME_RUNNING_IN_BACKGROUND 51100
diff --git a/chrome/app/chrome_content_browser_overlay_manifest.cc b/chrome/app/chrome_content_browser_overlay_manifest.cc index 43ad206..7ba31e824 100644 --- a/chrome/app/chrome_content_browser_overlay_manifest.cc +++ b/chrome/app/chrome_content_browser_overlay_manifest.cc
@@ -51,6 +51,7 @@ #if defined(OS_CHROMEOS) #include "chrome/browser/ui/webui/chromeos/add_supervision/add_supervision.mojom.h" #include "chrome/browser/ui/webui/chromeos/machine_learning/machine_learning_internals_page_handler.mojom.h" +#include "chrome/services/cups_proxy/public/cpp/manifest.h" #include "chrome/services/cups_proxy/public/mojom/constants.mojom.h" #include "chromeos/assistant/buildflags.h" // nogncheck #include "chromeos/services/cellular_setup/public/mojom/cellular_setup.mojom.h" @@ -254,6 +255,7 @@ #if defined(OS_CHROMEOS) .PackageService(chromeos::device_sync::GetManifest()) .PackageService(chromeos::multidevice_setup::GetManifest()) + .PackageService(chromeos::printing::GetCupsProxyManifest()) #if BUILDFLAG(ENABLE_CROS_ASSISTANT) .PackageService(chromeos::assistant::GetManifest()) #endif
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index e20d22e..6826d3f 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -6415,6 +6415,25 @@ </message> </if> + <!-- Sharing features. --> + <if expr="not use_titlecase"> + <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES" desc="The label of item for click to call in context menu when multiple devices are available."> + Call from your devices + </message> + <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE" desc="The label of item for click to call in context menu for showing device name when multiple devices are available."> + Call from <ph name="DEVICE_NAME">$1<ex>Jimmy's Pixel</ex></ph> + </message> + </if> + + <if expr="use_titlecase"> + <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES" desc="In Title Case: The label of item for click to call in context menu when multiple devices are available."> + Call from Your Devices + </message> + <message name="IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE" desc="In Title Case: The label of item for click to call in context menu when single device is available."> + Call from <ph name="DEVICE_NAME">$1<ex>Jimmy's Pixel</ex></ph> + </message> + </if> + <!-- Collected cookies window --> <message name="IDS_COLLECTED_COOKIES_DIALOG_TITLE" desc="The title of the collect cookies dialog">
diff --git a/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES.png.sha1 b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES.png.sha1 new file mode 100644 index 0000000..7db1032 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES.png.sha1
@@ -0,0 +1 @@ +d3ea7c88529dd93e5f403fa57d5df3bfadf8936a \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE.png.sha1 b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE.png.sha1 new file mode 100644 index 0000000..c83107a --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE.png.sha1
@@ -0,0 +1 @@ +bc5be9872a3e0a2c30bbb9a80ac370cafa339988 \ No newline at end of file
diff --git a/chrome/app/printing_strings_grd/OWNERS b/chrome/app/printing_strings_grd/OWNERS index 9b08c66..01ea38e 100644 --- a/chrome/app/printing_strings_grd/OWNERS +++ b/chrome/app/printing_strings_grd/OWNERS
@@ -1 +1,2 @@ file://printing/OWNERS +# COMPONENT: Internals>Printing
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 8e21f915..0602b08 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -913,6 +913,7 @@ "ntp_tiles/chrome_popular_sites_factory.h", "offline_items_collection/offline_content_aggregator_factory.cc", "offline_items_collection/offline_content_aggregator_factory.h", + "omnibox/common/omnibox_features.h", "page_load_metrics/metrics_navigation_throttle.cc", "page_load_metrics/metrics_navigation_throttle.h", "page_load_metrics/metrics_web_contents_observer.cc", @@ -2932,6 +2933,8 @@ "download/download_shelf_controller.h", "enterprise_reporting/extension_info.cc", "enterprise_reporting/extension_info.h", + "enterprise_reporting/policy_info.cc", + "enterprise_reporting/policy_info.h", "enterprise_reporting/prefs.cc", "enterprise_reporting/prefs.h", "enterprise_reporting/profile_report_generator.cc", @@ -3309,8 +3312,12 @@ "serial/serial_chooser_context_factory.cc", "serial/serial_chooser_context_factory.h", "sharing/click_to_call/click_to_call_constants.h", + "sharing/click_to_call/click_to_call_context_menu_observer.cc", + "sharing/click_to_call/click_to_call_context_menu_observer.h", "sharing/click_to_call/click_to_call_sharing_dialog_controller.cc", "sharing/click_to_call/click_to_call_sharing_dialog_controller.h", + "sharing/click_to_call/click_to_call_utils.cc", + "sharing/click_to_call/click_to_call_utils.h", "sharing/sharing_dialog_controller.cc", "sharing/sharing_dialog_controller.h", "signin/signin_promo.cc", @@ -3566,6 +3573,7 @@ "//ash/public/cpp", "//chrome/browser/chromeos", "//chrome/services/cups_proxy", + "//chrome/services/cups_proxy/public/mojom", "//chromeos/components/account_manager", "//chromeos/services/assistant/public:feature_flags", "//chromeos/services/cellular_setup",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 433184a..f671797 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3483,11 +3483,6 @@ flag_descriptions::kEnableGoogleAssistantDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::switches::kAssistantFeature)}, - {"enable-assistant-voice-match", - flag_descriptions::kEnableAssistantVoiceMatchName, - flag_descriptions::kEnableAssistantVoiceMatchDescription, kOsCrOS, - FEATURE_VALUE_TYPE(chromeos::assistant::features::kAssistantVoiceMatch)}, - {"enable-assistant-dsp", flag_descriptions::kEnableGoogleAssistantDspName, flag_descriptions::kEnableGoogleAssistantDspDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::assistant::features::kEnableDspHotword)},
diff --git a/chrome/browser/accessibility/accessibility_extension_api.cc b/chrome/browser/accessibility/accessibility_extension_api.cc index 6d4b05a..d3deac9 100644 --- a/chrome/browser/accessibility/accessibility_extension_api.cc +++ b/chrome/browser/accessibility/accessibility_extension_api.cc
@@ -32,6 +32,7 @@ #include "extensions/common/image_util.h" #include "extensions/common/manifest_handlers/background_info.h" #include "services/service_manager/public/cpp/connector.h" +#include "ui/accessibility/accessibility_switches.h" #include "ui/events/base_event_utils.h" #include "ui/events/keycodes/keyboard_codes.h" @@ -433,7 +434,13 @@ int padding = 40; int item_width = 88; - int item_height = 60; + + int item_height; + if (::switches::IsExperimentalAccessibilitySwitchAccessTextEnabled()) { + item_height = 85; + } else { + item_height = 60; + } // TODO(anastasi): This should be a preference that the user can change. int max_cols = 3;
diff --git a/chrome/browser/android/background_sync_launcher_android.cc b/chrome/browser/android/background_sync_launcher_android.cc index 5800344..c7a05ba 100644 --- a/chrome/browser/android/background_sync_launcher_android.cc +++ b/chrome/browser/android/background_sync_launcher_android.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/android/chrome_feature_list.h" #include "chrome/browser/profiles/profile_manager.h" #include "content/public/browser/background_sync_context.h" -#include "content/public/browser/background_sync_parameters.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" @@ -33,12 +32,6 @@ // updated before every test run. (https://crbug.com/514449) bool disable_play_services_version_check_for_tests = false; -// Returns 0 to create a ONE_SHOT_SYNC_CHROME_WAKE_UP task, or 1 to create a -// PERIODIC_SYNC_CHROME_WAKE_UP task, based on |sync_type|. -int GetBackgroundTaskType(blink::mojom::BackgroundSyncType sync_type) { - return static_cast<int>(sync_type); -} - } // namespace // static @@ -69,21 +62,10 @@ } // static -void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) { +void BackgroundSyncLauncherAndroid::LaunchBrowserIfStopped() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - Get()->ScheduleBrowserWakeUpImpl(sync_type); -} - -// static -void BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeUpDelta( - blink::mojom::BackgroundSyncType sync_type, - base::TimeDelta soonest_wakeup_delta) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - Get()->ScheduleBrowserWakeUpWithWakeUpDeltaImpl(sync_type, - soonest_wakeup_delta); + Get()->LaunchBrowserIfStoppedImpl(); } // static @@ -102,22 +84,19 @@ base::android::AttachCurrentThread()); } -void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUpImpl( - blink::mojom::BackgroundSyncType sync_type) { +void BackgroundSyncLauncherAndroid::LaunchBrowserIfStoppedImpl() { DCHECK_CURRENTLY_ON(BrowserThread::UI); auto* profile = ProfileManager::GetLastUsedProfile(); DCHECK(profile); content::BackgroundSyncContext::GetSoonestWakeupDeltaAcrossPartitions( - sync_type, profile, - base::BindOnce(&BackgroundSyncLauncherAndroid:: - ScheduleBrowserWakeUpWithWakeUpDeltaImpl, - base::Unretained(this), sync_type)); + profile, base::BindOnce( + &BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeupDelta, + base::Unretained(this))); } -void BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUpWithWakeUpDeltaImpl( - blink::mojom::BackgroundSyncType sync_type, +void BackgroundSyncLauncherAndroid::LaunchBrowserWithWakeupDelta( base::TimeDelta soonest_wakeup_delta) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -134,8 +113,7 @@ Java_BackgroundSyncBackgroundTaskScheduler_launchBrowserIfStopped( env, java_background_sync_background_task_scheduler_launcher_, - GetBackgroundTaskType(sync_type), !soonest_wakeup_delta.is_max(), - min_delay_ms); + !soonest_wakeup_delta.is_max(), min_delay_ms); } void BackgroundSyncLauncherAndroid::FireBackgroundSyncEvents(
diff --git a/chrome/browser/android/background_sync_launcher_android.h b/chrome/browser/android/background_sync_launcher_android.h index 80f264b..c59d0f8 100644 --- a/chrome/browser/android/background_sync_launcher_android.h +++ b/chrome/browser/android/background_sync_launcher_android.h
@@ -29,15 +29,7 @@ // is running when the device next goes online after that time has passed. // If this time is set to base::TimeDelta::Max() across all storage // partitions, the wake-up task is cancelled. - static void ScheduleBrowserWakeUp(blink::mojom::BackgroundSyncType sync_type); - - // Schedule a background task to bring up Chrome when the device next goes - // online after |soonest_wakeup_delta| has passed. - // If |soonest_wakeup_delta| is set to base::TimeDelta::Max(), the wake-up - // task is cancelled. - static void LaunchBrowserWithWakeUpDelta( - blink::mojom::BackgroundSyncType sync_type, - base::TimeDelta soonest_wakeup_delta); + static void LaunchBrowserIfStopped(); static bool ShouldDisableBackgroundSync(); @@ -59,10 +51,8 @@ BackgroundSyncLauncherAndroid(); ~BackgroundSyncLauncherAndroid(); - void ScheduleBrowserWakeUpImpl(blink::mojom::BackgroundSyncType sync_type); - void ScheduleBrowserWakeUpWithWakeUpDeltaImpl( - blink::mojom::BackgroundSyncType sync_type, - base::TimeDelta soonest_wakeup_delta); + void LaunchBrowserIfStoppedImpl(); + void LaunchBrowserWithWakeupDelta(base::TimeDelta soonest_wakeup_delta); base::android::ScopedJavaGlobalRef<jobject> java_gcm_network_manager_launcher_;
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc index 6f079ade..3dba2ccf8 100644 --- a/chrome/browser/android/preferences/pref_service_bridge.cc +++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -873,14 +873,6 @@ GetPrefService()->SetBoolean(prefs::kOfferTranslateEnabled, enabled); } -static void JNI_PrefServiceBridge_ResetTranslateDefaults( - JNIEnv* env, - const JavaParamRef<jobject>& obj) { - std::unique_ptr<translate::TranslatePrefs> translate_prefs = - ChromeTranslateClient::CreateTranslatePrefs(GetPrefService()); - translate_prefs->ResetToDefaults(); -} - static void JNI_PrefServiceBridge_MigrateJavascriptPreference( JNIEnv* env, const JavaParamRef<jobject>& obj) {
diff --git a/chrome/browser/background_sync/background_sync_controller_impl.cc b/chrome/browser/background_sync/background_sync_controller_impl.cc index 6a8f9758..366e31e9 100644 --- a/chrome/browser/background_sync/background_sync_controller_impl.cc +++ b/chrome/browser/background_sync/background_sync_controller_impl.cc
@@ -157,15 +157,13 @@ origin, status_code, num_attempts, max_attempts); } -void BackgroundSyncControllerImpl::ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) { +void BackgroundSyncControllerImpl::RunInBackground() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (profile_->IsOffTheRecord()) return; - #if defined(OS_ANDROID) - BackgroundSyncLauncherAndroid::ScheduleBrowserWakeUp(sync_type); + BackgroundSyncLauncherAndroid::LaunchBrowserIfStopped(); #endif }
diff --git a/chrome/browser/background_sync/background_sync_controller_impl.h b/chrome/browser/background_sync/background_sync_controller_impl.h index 3816f98f..c45b3334 100644 --- a/chrome/browser/background_sync/background_sync_controller_impl.h +++ b/chrome/browser/background_sync/background_sync_controller_impl.h
@@ -75,8 +75,7 @@ blink::ServiceWorkerStatusCode status_code, int num_attempts, int max_attempts) override; - void ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) override; + void RunInBackground() override; base::TimeDelta GetNextEventDelay( const url::Origin& origin, int64_t min_interval,
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index b033e5fc..4b0eba4 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -57,6 +57,7 @@ #include "chrome/browser/component_updater/crl_set_component_installer.h" #include "chrome/browser/component_updater/file_type_policies_component_installer.h" #include "chrome/browser/component_updater/mei_preload_component_installer.h" +#include "chrome/browser/component_updater/on_device_head_suggest_component_installer.h" #include "chrome/browser/component_updater/optimization_hints_component_installer.h" #include "chrome/browser/component_updater/origin_trials_component_installer.h" #include "chrome/browser/component_updater/pepper_flash_component_installer.h" @@ -489,6 +490,7 @@ whitelist_installer->RegisterComponents(); RegisterSubresourceFilterComponent(cus); + RegisterOnDeviceHeadSuggestComponent(cus); RegisterOptimizationHintsComponent(cus, profile_prefs); base::FilePath path;
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 21c9bba..da97e83d 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -411,15 +411,12 @@ #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h" -#include "chrome/browser/chromeos/printing/cups_proxy_service_delegate_impl.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/speech/tts_chromeos.h" #include "chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.h" #include "chrome/browser/ui/ash/tablet_mode_client.h" #include "chrome/browser/ui/browser_dialogs.h" -#include "chrome/services/cups_proxy/cups_proxy_service.h" -#include "chrome/services/cups_proxy/public/mojom/constants.mojom.h" #include "chromeos/constants/chromeos_constants.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_switches.h" @@ -1546,26 +1543,28 @@ bool ChromeContentBrowserClient::ShouldUseProcessPerSite( content::BrowserContext* browser_context, const GURL& effective_url) { - // Non-extension, non-Instant URLs should generally use - // process-per-site-instance. Because we expect to use the effective URL, - // URLs for hosted apps (apart from bookmark apps) should have an extension - // scheme by now. - Profile* profile = Profile::FromBrowserContext(browser_context); if (!profile) return false; + // NTP should use process-per-site. This is a performance optimization to + // reduce process count associated with NTP tabs. + if (effective_url == GURL(chrome::kChromeUINewTabURL)) + return true; #if !defined(OS_ANDROID) if (search::ShouldUseProcessPerSiteForInstantURL(effective_url, profile)) return true; #endif #if BUILDFLAG(ENABLE_EXTENSIONS) - return ChromeContentBrowserClientExtensionsPart::ShouldUseProcessPerSite( - profile, effective_url); -#else - return false; + if (ChromeContentBrowserClientExtensionsPart::ShouldUseProcessPerSite( + profile, effective_url)) + return true; #endif + + // Non-extension, non-NTP URLs should generally use process-per-site-instance + // (rather than process-per-site). + return false; } bool ChromeContentBrowserClient::ShouldUseSpareRenderProcessHost( @@ -4071,14 +4070,6 @@ return; } - if (service_name == chromeos::printing::mojom::kCupsProxyServiceName) { - service_manager::Service::RunAsyncUntilTermination( - std::make_unique<chromeos::printing::CupsProxyService>( - std::move(*receiver), - std::make_unique<chromeos::CupsProxyServiceDelegateImpl>())); - return; - } - if (service_name == chromeos::network_config::mojom::kServiceName) { service_manager::Service::RunAsyncUntilTermination( std::make_unique<chromeos::network_config::NetworkConfigService>(
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 8a8c907..3f627b6 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1861,6 +1861,8 @@ "printing/cups_proxy_service_delegate_impl.h", "printing/cups_proxy_service_manager.cc", "printing/cups_proxy_service_manager.h", + "printing/cups_proxy_service_manager_factory.cc", + "printing/cups_proxy_service_manager_factory.h", "printing/enterprise_printers_provider.cc", "printing/enterprise_printers_provider.h", "printing/ppd_provider_factory.cc",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 0578946..dd1e8827 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -96,7 +96,6 @@ #include "chrome/browser/chromeos/power/power_metrics_reporter.h" #include "chrome/browser/chromeos/power/process_data_collector.h" #include "chrome/browser/chromeos/power/renderer_freezer.h" -#include "chrome/browser/chromeos/printing/cups_proxy_service_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/resource_reporter/resource_reporter.h" #include "chrome/browser/chromeos/scheduler_configuration_manager.h" @@ -713,8 +712,6 @@ lock_to_single_user_manager_ = std::make_unique<policy::LockToSingleUserManager>(); - cups_proxy_service_manager_ = std::make_unique<CupsProxyServiceManager>(); - ChromeBrowserMainPartsLinux::PreMainMessageLoopRun(); }
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h index 653ec18..ac760e8 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -39,7 +39,6 @@ class ArcKioskAppManager; class CrosUsbDetector; -class CupsProxyServiceManager; class DemoModeResourcesRemover; class DiscoverManager; class EventRewriterDelegateImpl; @@ -174,8 +173,6 @@ std::unique_ptr<WilcoDtcSupportdManager> wilco_dtc_supportd_manager_; std::unique_ptr<GnubbyNotification> gnubby_notification_; - std::unique_ptr<chromeos::CupsProxyServiceManager> - cups_proxy_service_manager_; DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos); };
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 49677c0..f21ebdc 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -428,7 +428,7 @@ base::Value all_policies_array = policy::GetAllPolicyValuesAsDictionary( browser_context(), true /* with_user_policies */, false /* convert_values */, true /* with_device_data */, - false /* pretty_print */); + false /* pretty_print */, true /* convert_types */); return RespondNow(OneArgument( base::Value::ToUniquePtrValue(std::move(all_policies_array))));
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc b/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc index c2e3f9d..5c48299 100644 --- a/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc +++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager.cc
@@ -4,9 +4,10 @@ #include "chrome/browser/chromeos/printing/cups_proxy_service_manager.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/services/cups_proxy/public/mojom/constants.mojom.h" #include "chromeos/dbus/cups_proxy/cups_proxy_client.h" -#include "content/public/browser/system_connector.h" +#include "content/public/browser/browser_context.h" #include "services/service_manager/public/cpp/connector.h" namespace chromeos { @@ -29,9 +30,12 @@ // Note: The service does not support BindInterface calls, so we // intentionally leave out a connection_error_handler, since it would // called immediately. - content::GetSystemConnector()->Connect( - printing::mojom::kCupsProxyServiceName, - service_handle_.BindNewPipeAndPassReceiver()); + // TODO(crbug.com/945409): Manage our own service instance when ServiceManager + // goes away. + content::BrowserContext::GetConnectorFor( + ProfileManager::GetPrimaryUserProfile()) + ->Connect(printing::mojom::kCupsProxyServiceName, + service_handle_.BindNewPipeAndPassReceiver()); } } // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager.h b/chrome/browser/chromeos/printing/cups_proxy_service_manager.h index dc7cdf1..ab3760ee 100644 --- a/chrome/browser/chromeos/printing/cups_proxy_service_manager.h +++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager.h
@@ -8,19 +8,23 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "chrome/services/cups_proxy/public/mojom/proxy.mojom.h" +#include "components/keyed_service/core/keyed_service.h" #include "mojo/public/cpp/bindings/remote.h" namespace chromeos { -// Responsible for lazily starting the CupsProxyService once notified that the -// CupsProxyDaemon has started. +// This KeyedService is responsible for helping manage the +// lifetime of the CupsProxyService. This manager is started with the Profile +// and launches the service once the CupsProxyDaemon has started. Notice that +// this manager's interface is empty; this reflects the fact that the service's +// sole client is the daemon. // -// Note: This manager is not currently fault-tolerant, i.e. should the -// service/daemon fail, we do not try to restart. -class CupsProxyServiceManager { +// Note: This manager is not fault-tolerant, i.e. should the service/daemon +// fail, we do not try to restart. +class CupsProxyServiceManager : public KeyedService { public: CupsProxyServiceManager(); - ~CupsProxyServiceManager(); + ~CupsProxyServiceManager() override; private: void OnDaemonAvailable(bool daemon_available);
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.cc b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.cc new file mode 100644 index 0000000..0253b828 --- /dev/null +++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.cc
@@ -0,0 +1,60 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h" + +#include "chrome/browser/chromeos/printing/cups_proxy_service_manager.h" +#include "chrome/browser/chromeos/profiles/profile_helper.h" +#include "chrome/browser/profiles/incognito_helpers.h" +#include "chrome/browser/profiles/profile.h" +#include "components/keyed_service/content/browser_context_dependency_manager.h" + +namespace chromeos { + +// static +CupsProxyServiceManagerFactory* CupsProxyServiceManagerFactory::GetInstance() { + static base::NoDestructor<CupsProxyServiceManagerFactory> factory; + return factory.get(); +} + +// static +CupsProxyServiceManager* CupsProxyServiceManagerFactory::GetForBrowserContext( + content::BrowserContext* context) { + return static_cast<CupsProxyServiceManager*>( + GetInstance()->GetServiceForBrowserContext(context, true)); +} + +CupsProxyServiceManagerFactory::CupsProxyServiceManagerFactory() + : BrowserContextKeyedServiceFactory( + "CupsProxyServiceManagerFactory", + BrowserContextDependencyManager::GetInstance()) {} + +CupsProxyServiceManagerFactory::~CupsProxyServiceManagerFactory() = default; + +KeyedService* CupsProxyServiceManagerFactory::BuildServiceInstanceFor( + content::BrowserContext* context) const { + // We do not need an instance of CupsProxyServiceManager on the lockscreen. + if (ProfileHelper::IsLockScreenAppProfile( + Profile::FromBrowserContext(context)) || + ProfileHelper::IsSigninProfile(Profile::FromBrowserContext(context))) { + return nullptr; + } + return new CupsProxyServiceManager(); +} + +content::BrowserContext* CupsProxyServiceManagerFactory::GetBrowserContextToUse( + content::BrowserContext* context) const { + return chrome::GetBrowserContextRedirectedInIncognito(context); +} + +bool CupsProxyServiceManagerFactory::ServiceIsCreatedWithBrowserContext() + const { + return true; +} + +bool CupsProxyServiceManagerFactory::ServiceIsNULLWhileTesting() const { + return true; +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h new file mode 100644 index 0000000..c9c3acf --- /dev/null +++ b/chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h
@@ -0,0 +1,45 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PROXY_SERVICE_MANAGER_FACTORY_H_ +#define CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PROXY_SERVICE_MANAGER_FACTORY_H_ + +#include "base/no_destructor.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" + +namespace content { +class BrowserContext; +} + +namespace chromeos { + +class CupsProxyServiceManager; + +class CupsProxyServiceManagerFactory + : public BrowserContextKeyedServiceFactory { + public: + static CupsProxyServiceManagerFactory* GetInstance(); + static CupsProxyServiceManager* GetForBrowserContext( + content::BrowserContext* context); + + private: + friend base::NoDestructor<CupsProxyServiceManagerFactory>; + + CupsProxyServiceManagerFactory(); + ~CupsProxyServiceManagerFactory() override; + + // BrowserContextKeyedServiceFactory overrides: + KeyedService* BuildServiceInstanceFor( + content::BrowserContext* context) const override; + content::BrowserContext* GetBrowserContextToUse( + content::BrowserContext* context) const override; + bool ServiceIsCreatedWithBrowserContext() const override; + bool ServiceIsNULLWhileTesting() const override; + + DISALLOW_COPY_AND_ASSIGN(CupsProxyServiceManagerFactory); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_PRINTING_CUPS_PROXY_SERVICE_MANAGER_FACTORY_H_
diff --git a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc b/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc index 359d791..baa32161 100644 --- a/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc +++ b/chrome/browser/component_updater/on_device_head_suggest_component_installer.cc
@@ -18,15 +18,16 @@ #include "components/component_updater/component_installer.h" #include "components/component_updater/component_updater_paths.h" #include "components/component_updater/component_updater_service.h" +#include "components/omnibox/common/omnibox_features.h" namespace component_updater { namespace { -// CRX hash. The extension id is: mokoelfideihaddlikjdmdbecmlibfaj. +// CRX hash. The extension id is: feejiaigafnbpeeogmhmjfmkcjplcneb. const uint8_t kOnDeviceHeadSuggestPublicKeySHA256[32] = { - 0xce, 0xae, 0x4b, 0x58, 0x34, 0x87, 0x03, 0x3b, 0x8a, 0x93, 0xc3, - 0x14, 0x2c, 0xb8, 0x15, 0x09, 0x6e, 0x41, 0x6b, 0xc0, 0xb4, 0x0d, - 0x96, 0x2b, 0xd6, 0x7e, 0xd9, 0x97, 0xc6, 0x2a, 0xb0, 0x9f}; + 0x54, 0x49, 0x80, 0x86, 0x05, 0xd1, 0xf4, 0x4e, 0x6c, 0x7c, 0x95, + 0xca, 0x29, 0xfb, 0x2d, 0x41, 0xe5, 0x12, 0x55, 0x83, 0x59, 0x58, + 0x50, 0x41, 0x02, 0x6b, 0xb9, 0x06, 0x2c, 0xe0, 0xf8, 0x34}; void UpdateModelDirectory(const base::FilePath& file_path) { base::PathService::Override(DIR_ON_DEVICE_HEAD_SUGGEST, file_path); @@ -57,14 +58,8 @@ const base::DictionaryValue& manifest, const base::FilePath& install_dir) const { const std::string* name = manifest.FindStringPath("name"); - const std::string* locale = manifest.FindStringPath("locale"); - if (!name || !locale) - return false; - - if (!base::StartsWith(*name, "OnDeviceHeadSuggest", - base::CompareCase::SENSITIVE) || - *locale != accept_locale_) + if (!name || *name != ("OnDeviceHeadSuggest" + accept_locale_)) return false; return base::PathExists(install_dir); @@ -123,9 +118,11 @@ } void RegisterOnDeviceHeadSuggestComponent(ComponentUpdateService* cus) { - auto installer = base::MakeRefCounted<ComponentInstaller>( - std::make_unique<OnDeviceHeadSuggestInstallerPolicy>()); - installer->Register(cus, base::OnceClosure()); + if (base::FeatureList::IsEnabled(omnibox::kOnDeviceHeadProvider)) { + auto installer = base::MakeRefCounted<ComponentInstaller>( + std::make_unique<OnDeviceHeadSuggestInstallerPolicy>()); + installer->Register(cus, base::OnceClosure()); + } } } // namespace component_updater
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc index 170901f..e0d2c5c 100644 --- a/chrome/browser/download/download_target_determiner.cc +++ b/chrome/browser/download/download_target_determiner.cc
@@ -290,6 +290,7 @@ } virtual_path_ = target_directory.Append(generated_filename); should_notify_extensions_ = true; + DCHECK(virtual_path_.IsAbsolute()); } else { conflict_action_ = DownloadPathReservationTracker::OVERWRITE; virtual_path_ = download_->GetForcedFilePath(); @@ -299,8 +300,8 @@ // issue with the forced path, the user is still not prompted. If the path // supplied to a programmatic download is invalid, then the caller needs to // intervene. + DCHECK(virtual_path_.IsAbsolute()); } - DCHECK(virtual_path_.IsAbsolute()); DVLOG(20) << "Generated virtual path: " << virtual_path_.AsUTF8Unsafe(); return CONTINUE;
diff --git a/chrome/browser/enterprise_reporting/policy_info.cc b/chrome/browser/enterprise_reporting/policy_info.cc new file mode 100644 index 0000000..46062d12 --- /dev/null +++ b/chrome/browser/enterprise_reporting/policy_info.cc
@@ -0,0 +1,84 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise_reporting/policy_info.h" + +#include "base/json/json_writer.h" +#include "base/optional.h" +#include "chrome/browser/policy/policy_conversions.h" +#include "components/policy/core/common/policy_types.h" + +namespace enterprise_reporting { + +using namespace policy; + +namespace { + +em::Policy_PolicyLevel GetLevel(const base::Value& policy) { + switch (static_cast<PolicyLevel>(*policy.FindIntKey("level"))) { + case POLICY_LEVEL_RECOMMENDED: + return em::Policy_PolicyLevel_LEVEL_RECOMMENDED; + case POLICY_LEVEL_MANDATORY: + return em::Policy_PolicyLevel_LEVEL_MANDATORY; + } + NOTREACHED() << "Invalid policy level: " << *policy.FindIntKey("level"); + return em::Policy_PolicyLevel_LEVEL_UNKNOWN; +} + +em::Policy_PolicyScope GetScope(const base::Value& policy) { + switch (static_cast<PolicyScope>(*policy.FindIntKey("scope"))) { + case POLICY_SCOPE_USER: + return em::Policy_PolicyScope_SCOPE_USER; + case POLICY_SCOPE_MACHINE: + return em::Policy_PolicyScope_SCOPE_MACHINE; + } + NOTREACHED() << "Invalid policy scope: " << *policy.FindIntKey("scope"); + return em::Policy_PolicyScope_SCOPE_UNKNOWN; +} + +em::Policy_PolicySource GetSource(const base::Value& policy) { + switch (static_cast<PolicySource>(*policy.FindIntKey("source"))) { + case POLICY_SOURCE_ENTERPRISE_DEFAULT: + return em::Policy_PolicySource_SOURCE_ENTERPRISE_DEFAULT; + case POLICY_SOURCE_CLOUD: + return em::Policy_PolicySource_SOURCE_CLOUD; + case POLICY_SOURCE_ACTIVE_DIRECTORY: + return em::Policy_PolicySource_SOURCE_ACTIVE_DIRECTORY; + case POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE: + return em::Policy_PolicySource_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE; + case POLICY_SOURCE_PLATFORM: + return em::Policy_PolicySource_SOURCE_PLATFORM; + case POLICY_SOURCE_PRIORITY_CLOUD: + return em::Policy_PolicySource_SOURCE_PRIORITY_CLOUD; + case POLICY_SOURCE_MERGED: + return em::Policy_PolicySource_SOURCE_MERGED; + case POLICY_SOURCE_COUNT: + NOTREACHED(); + return em::Policy_PolicySource_SOURCE_UNKNOWN; + } + NOTREACHED() << "Invalid policy source: " << *policy.FindIntKey("source"); + return em::Policy_PolicySource_SOURCE_UNKNOWN; +} + +} // namespace + +void AppendChromePolicyInfoIntoProfileReport( + const base::Value& policies, + em::ChromeUserProfileInfo* profile_info) { + for (const auto& item : policies.FindKey("chromePolicies")->DictItems()) { + const base::Value& policy = item.second; + auto* policy_info = profile_info->add_chrome_policies(); + policy_info->set_name(item.first); + policy_info->set_level(GetLevel(policy)); + policy_info->set_scope(GetScope(policy)); + policy_info->set_source(GetSource(policy)); + base::JSONWriter::Write(*policy.FindKey("value"), + policy_info->mutable_value()); + const std::string* error = policy.FindStringKey("error"); + if (error) + policy_info->set_error(*error); + } +} + +} // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise_reporting/policy_info.h b/chrome/browser/enterprise_reporting/policy_info.h new file mode 100644 index 0000000..6a3dfae --- /dev/null +++ b/chrome/browser/enterprise_reporting/policy_info.h
@@ -0,0 +1,24 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_ +#define CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_ + +#include "components/policy/proto/device_management_backend.pb.h" + +namespace em = enterprise_management; + +namespace base { +class Value; +} + +namespace enterprise_reporting { + +void AppendChromePolicyInfoIntoProfileReport( + const base::Value& policies, + em::ChromeUserProfileInfo* profile_info); + +} // namespace enterprise_reporting + +#endif // CHROME_BROWSER_ENTERPRISE_REPORTING_POLICY_INFO_H_
diff --git a/chrome/browser/enterprise_reporting/policy_info_unittest.cc b/chrome/browser/enterprise_reporting/policy_info_unittest.cc new file mode 100644 index 0000000..c95422a --- /dev/null +++ b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
@@ -0,0 +1,93 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise_reporting/policy_info.h" + +#include "chrome/browser/policy/policy_conversions.h" +#include "chrome/test/base/testing_profile.h" +#include "components/policy/core/common/mock_policy_service.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/proto/device_management_backend.pb.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace em = enterprise_management; + +namespace enterprise_reporting { +namespace { +constexpr char kPolicyName1[] = "policy_a"; +constexpr char kPolicyName2[] = "policy_b"; +} // namespace + +using ::testing::_; +using ::testing::Eq; + +class PolicyInfoTest : public ::testing::Test { + public: + void SetUp() override { + TestingProfile::Builder builder; + builder.SetPolicyService(GetPolicyService()); + profile_ = builder.Build(); + } + + std::unique_ptr<policy::MockPolicyService> GetPolicyService() { + auto policy_service = std::make_unique<policy::MockPolicyService>(); + ON_CALL(*policy_service.get(), + GetPolicies(Eq(policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME, + std::string())))) + .WillByDefault(::testing::ReturnRef(policy_map_)); + policy_service_ = policy_service.get(); + return policy_service; + } + + TestingProfile* profile() { return profile_.get(); } + policy::PolicyMap* policy_map() { return &policy_map_; } + policy::MockPolicyService* policy_service() { return policy_service_; } + + private: + content::TestBrowserThreadBundle thread_bundle_; + std::unique_ptr<TestingProfile> profile_; + policy::PolicyMap policy_map_; + policy::MockPolicyService* policy_service_; +}; + +// Verify two Chrome policies are appended to the Profile report properly. +TEST_F(PolicyInfoTest, ChromePolicy) { + policy_map()->Set(kPolicyName1, policy::POLICY_LEVEL_MANDATORY, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, + std::make_unique<base::Value>(std::vector<base::Value>()), + nullptr); + policy_map()->Set(kPolicyName2, policy::POLICY_LEVEL_RECOMMENDED, + policy::POLICY_SCOPE_MACHINE, policy::POLICY_SOURCE_MERGED, + std::make_unique<base::Value>(true), nullptr); + em::ChromeUserProfileInfo profile_info; + + EXPECT_CALL(*policy_service(), GetPolicies(_)); + + AppendChromePolicyInfoIntoProfileReport( + policy::GetAllPolicyValuesAsDictionary( + profile(), /* with_user_policies */ true, /* convert_values */ false, + /* with_device_data*/ false, + /* is_pretty_print */ false, /* convert_types */ false), + &profile_info); + EXPECT_EQ(2, profile_info.chrome_policies_size()); + + auto policy1 = profile_info.chrome_policies(0); + EXPECT_EQ(kPolicyName1, policy1.name()); + EXPECT_EQ("[]", policy1.value()); + EXPECT_EQ(em::Policy_PolicyLevel_LEVEL_MANDATORY, policy1.level()); + EXPECT_EQ(em::Policy_PolicyScope_SCOPE_USER, policy1.scope()); + EXPECT_EQ(em::Policy_PolicySource_SOURCE_CLOUD, policy1.source()); + EXPECT_NE("", policy1.error()); + + auto policy2 = profile_info.chrome_policies(1); + EXPECT_EQ(kPolicyName2, policy2.name()); + EXPECT_EQ("true", policy2.value()); + EXPECT_EQ(em::Policy_PolicyLevel_LEVEL_RECOMMENDED, policy2.level()); + EXPECT_EQ(em::Policy_PolicyScope_SCOPE_MACHINE, policy2.scope()); + EXPECT_EQ(em::Policy_PolicySource_SOURCE_MERGED, policy2.source()); + EXPECT_NE("", policy2.error()); +} + +} // namespace enterprise_reporting
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.cc b/chrome/browser/enterprise_reporting/profile_report_generator.cc index 5236551..5300fa4d 100644 --- a/chrome/browser/enterprise_reporting/profile_report_generator.cc +++ b/chrome/browser/enterprise_reporting/profile_report_generator.cc
@@ -9,6 +9,8 @@ #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/enterprise_reporting/extension_info.h" +#include "chrome/browser/enterprise_reporting/policy_info.h" +#include "chrome/browser/policy/policy_conversions.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" @@ -54,6 +56,15 @@ GetExtensionInfo(); GetPluginInfo(); + if (policies_enabled_) { + // TODO(crbug.com/983151): Upload policy error as their IDs. + policies_ = policy::GetAllPolicyValuesAsDictionary( + profile_, /* with_user_policies */ true, /* convert_values */ false, + /* with_device_data*/ false, + /* is_pretty_print */ false, /* convert_types */ false); + GetChromePolicyInfo(); + } + CheckReportStatusAsync(); return; } @@ -85,6 +96,10 @@ weak_ptr_factory_.GetWeakPtr())); } +void ProfileReportGenerator::GetChromePolicyInfo() { + AppendChromePolicyInfoIntoProfileReport(policies_, report_.get()); +} + void ProfileReportGenerator::OnPluginsLoaded( const std::vector<content::WebPluginInfo>& plugins) { for (auto plugin : plugins) {
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.h b/chrome/browser/enterprise_reporting/profile_report_generator.h index 3f50659d..9d0b9b30 100644 --- a/chrome/browser/enterprise_reporting/profile_report_generator.h +++ b/chrome/browser/enterprise_reporting/profile_report_generator.h
@@ -8,6 +8,7 @@ #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/values.h" #include "components/policy/proto/device_management_backend.pb.h" namespace em = enterprise_management; @@ -51,7 +52,7 @@ void GetExtensionInfo(); void GetPluginInfo(); - // TODO(zmin): void GetChromePolicyInfo(); + void GetChromePolicyInfo(); // TODO(zmin): void GetExtensionPolicyInfo(); // TODO(zmin): void GetPolicyFetchTimestampInfo(); @@ -62,6 +63,7 @@ void CheckReportStatusAsync(); Profile* profile_; + base::Value policies_; bool extensions_and_plugins_enabled_ = true; bool policies_enabled_ = true;
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc index 6d292f4e..b1a603a4 100644 --- a/chrome/browser/extensions/crx_installer.cc +++ b/chrome/browser/extensions/crx_installer.cc
@@ -482,9 +482,6 @@ UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallSource", install_source(), Manifest::NUM_LOCATIONS); - UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackFailureInstallCause", - install_cause(), - extension_misc::NUM_INSTALL_CAUSES); ReportFailureFromFileThread(error); } @@ -501,10 +498,6 @@ install_source(), Manifest::NUM_LOCATIONS); - UMA_HISTOGRAM_ENUMERATION("Extensions.UnpackSuccessInstallCause", - install_cause(), - extension_misc::NUM_INSTALL_CAUSES); - extension_ = extension; temp_dir_ = temp_dir; dnr_ruleset_checksum_ = dnr_ruleset_checksum;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index da706346..ffaa277 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -851,11 +851,6 @@ "expiry_milestone": 76 }, { - "name": "enable-assistant-voice-match", - "owners": [ "croissant-eng" ], - "expiry_milestone": 76 - }, - { "name": "enable-async-dns", "owners": [ "ericorth", "net-dev" ], "expiry_milestone": 81
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index e0768e8..61ff6a1c 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -3137,10 +3137,6 @@ const char kEnableAssistantMediaSessionIntegrationDescription[] = "Enable Assistant Media Session Integration."; -const char kEnableAssistantVoiceMatchName[] = "Enable Assistant Voice Match"; -const char kEnableAssistantVoiceMatchDescription[] = - "Enable the Assistant Voice Match feature"; - const char kEnableBackgroundBlurName[] = "Enable background blur."; const char kEnableBackgroundBlurDescription[] = "Enables background blur for the Launcher and Shelf.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 6e5f67ca..379a33c 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1875,9 +1875,6 @@ extern const char kEnableAssistantMediaSessionIntegrationName[]; extern const char kEnableAssistantMediaSessionIntegrationDescription[]; -extern const char kEnableAssistantVoiceMatchName[]; -extern const char kEnableAssistantVoiceMatchDescription[]; - extern const char kEnableBackgroundBlurName[]; extern const char kEnableBackgroundBlurDescription[];
diff --git a/chrome/browser/notifications/scheduler/internal/BUILD.gn b/chrome/browser/notifications/scheduler/internal/BUILD.gn index ff10cac..d956686 100644 --- a/chrome/browser/notifications/scheduler/internal/BUILD.gn +++ b/chrome/browser/notifications/scheduler/internal/BUILD.gn
@@ -37,6 +37,8 @@ "impression_types.h", "init_aware_scheduler.cc", "init_aware_scheduler.h", + "noop_notification_schedule_service.cc", + "noop_notification_schedule_service.h", "notification_entry.cc", "notification_entry.h", "notification_schedule_service_impl.cc",
diff --git a/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.cc b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.cc new file mode 100644 index 0000000..54f7d8a --- /dev/null +++ b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.cc
@@ -0,0 +1,50 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h" + +#include "chrome/browser/notifications/scheduler/public/notification_params.h" + +namespace notifications { + +NoopNotificationScheduleService::NoopNotificationScheduleService() = default; + +NoopNotificationScheduleService::~NoopNotificationScheduleService() = default; + +void NoopNotificationScheduleService::Schedule( + std::unique_ptr<NotificationParams> notification_params) {} + +void NoopNotificationScheduleService::DeleteNotifications( + SchedulerClientType type) {} + +void NoopNotificationScheduleService::GetImpressionDetail( + SchedulerClientType, + ImpressionDetail::ImpressionDetailCallback callback) {} + +NotificationBackgroundTaskScheduler::Handler* +NoopNotificationScheduleService::GetBackgroundTaskSchedulerHandler() { + return this; +} + +UserActionHandler* NoopNotificationScheduleService::GetUserActionHandler() { + return this; +} + +void NoopNotificationScheduleService::OnStartTask( + SchedulerTaskTime task_time, + TaskFinishedCallback callback) {} + +void NoopNotificationScheduleService::OnStopTask(SchedulerTaskTime task_time) {} + +void NoopNotificationScheduleService::OnClick( + const std::string& notification_id) {} + +void NoopNotificationScheduleService::OnActionClick( + const std::string& notification_id, + ActionButtonType button_type) {} + +void NoopNotificationScheduleService::OnDismiss( + const std::string& notification_id) {} + +} // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h new file mode 100644 index 0000000..245a756 --- /dev/null +++ b/chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h
@@ -0,0 +1,49 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_NOOP_NOTIFICATION_SCHEDULE_SERVICE_H_ +#define CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_NOOP_NOTIFICATION_SCHEDULE_SERVICE_H_ + +#include "chrome/browser/notifications/scheduler/public/notification_schedule_service.h" +#include "chrome/browser/notifications/scheduler/public/user_action_handler.h" + +namespace notifications { + +class NoopNotificationScheduleService + : public NotificationScheduleService, + public NotificationBackgroundTaskScheduler::Handler, + public UserActionHandler { + public: + NoopNotificationScheduleService(); + ~NoopNotificationScheduleService() override; + + private: + // NotificationScheduleService implementation. + void Schedule( + std::unique_ptr<NotificationParams> notification_params) override; + void DeleteNotifications(SchedulerClientType type) override; + void GetImpressionDetail( + SchedulerClientType, + ImpressionDetail::ImpressionDetailCallback callback) override; + NotificationBackgroundTaskScheduler::Handler* + GetBackgroundTaskSchedulerHandler() override; + UserActionHandler* GetUserActionHandler() override; + + // NotificationBackgroundTaskScheduler::Handler implementation. + void OnStartTask(SchedulerTaskTime task_time, + TaskFinishedCallback callback) override; + void OnStopTask(SchedulerTaskTime task_time) override; + + // UserActionHandler implementation. + void OnClick(const std::string& notification_id) override; + void OnActionClick(const std::string& notification_id, + ActionButtonType button_type) override; + void OnDismiss(const std::string& notification_id) override; + + DISALLOW_COPY_AND_ASSIGN(NoopNotificationScheduleService); +}; + +} // namespace notifications + +#endif // CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_INTERNAL_NOOP_NOTIFICATION_SCHEDULE_SERVICE_H_
diff --git a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc index 0c173de..ae15e3ebc 100644 --- a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc +++ b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/bind.h" #include "base/logging.h" #include "chrome/browser/notifications/scheduler/internal/notification_scheduler.h" #include "chrome/browser/notifications/scheduler/public/notification_params.h" @@ -14,7 +15,11 @@ NotificationScheduleServiceImpl::NotificationScheduleServiceImpl( std::unique_ptr<NotificationScheduler> scheduler) - : scheduler_(std::move(scheduler)) {} + : scheduler_(std::move(scheduler)) { + scheduler_->Init( + base::BindOnce(&NotificationScheduleServiceImpl::OnInitialized, + weak_ptr_factory_.GetWeakPtr())); +} NotificationScheduleServiceImpl::~NotificationScheduleServiceImpl() = default; @@ -69,4 +74,9 @@ scheduler_->OnDismiss(notification_id); } +void NotificationScheduleServiceImpl::OnInitialized(bool success) { + // TODO(xingliu): Track metric here. + NOTIMPLEMENTED(); +} + } // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h index 3815519..0830660c 100644 --- a/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h +++ b/chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h
@@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "base/memory/weak_ptr.h" #include "chrome/browser/notifications/scheduler/public/notification_schedule_service.h" #include "chrome/browser/notifications/scheduler/public/user_action_handler.h" @@ -49,9 +50,13 @@ ActionButtonType button_type) override; void OnDismiss(const std::string& notification_id) override; + // Called after initialization is done. + void OnInitialized(bool success); + // Provides the actual notification scheduling functionalities. std::unique_ptr<NotificationScheduler> scheduler_; + base::WeakPtrFactory<NotificationScheduleServiceImpl> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(NotificationScheduleServiceImpl); };
diff --git a/chrome/browser/notifications/scheduler/public/BUILD.gn b/chrome/browser/notifications/scheduler/public/BUILD.gn index b5a1c01..67fd6f8 100644 --- a/chrome/browser/notifications/scheduler/public/BUILD.gn +++ b/chrome/browser/notifications/scheduler/public/BUILD.gn
@@ -12,6 +12,8 @@ sources = [ "display_agent.cc", "display_agent.h", + "features.cc", + "features.h", "impression_detail.cc", "impression_detail.h", "notification_background_task_scheduler.h",
diff --git a/chrome/browser/notifications/scheduler/public/features.cc b/chrome/browser/notifications/scheduler/public/features.cc new file mode 100644 index 0000000..6c70b11 --- /dev/null +++ b/chrome/browser/notifications/scheduler/public/features.cc
@@ -0,0 +1,14 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/notifications/scheduler/public/features.h" + +namespace notifications { +namespace features { + +const base::Feature kNotificationScheduleService{ + "NotificationScheduleService", base::FEATURE_DISABLED_BY_DEFAULT}; + +} // namespace features +} // namespace notifications
diff --git a/chrome/browser/notifications/scheduler/public/features.h b/chrome/browser/notifications/scheduler/public/features.h new file mode 100644 index 0000000..0e84b11 --- /dev/null +++ b/chrome/browser/notifications/scheduler/public/features.h
@@ -0,0 +1,19 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_PUBLIC_FEATURES_H_ +#define CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_PUBLIC_FEATURES_H_ + +#include "base/feature_list.h" + +namespace notifications { +namespace features { + +// The feature to enable NotificationScheduleService. +extern const base::Feature kNotificationScheduleService; + +} // namespace features +} // namespace notifications + +#endif // CHROME_BROWSER_NOTIFICATIONS_SCHEDULER_PUBLIC_FEATURES_H_
diff --git a/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc b/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc index c46c331..9b49958 100644 --- a/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc +++ b/chrome/browser/notifications/scheduler/schedule_service_factory_helper.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/notifications/scheduler/internal/impression_history_tracker.h" #include "chrome/browser/notifications/scheduler/internal/impression_store.h" #include "chrome/browser/notifications/scheduler/internal/init_aware_scheduler.h" +#include "chrome/browser/notifications/scheduler/internal/noop_notification_schedule_service.h" #include "chrome/browser/notifications/scheduler/internal/notification_schedule_service_impl.h" #include "chrome/browser/notifications/scheduler/internal/notification_scheduler_context.h" #include "chrome/browser/notifications/scheduler/internal/notification_store.h" @@ -22,6 +23,7 @@ #include "chrome/browser/notifications/scheduler/internal/scheduler_config.h" #include "chrome/browser/notifications/scheduler/internal/webui_client.h" #include "chrome/browser/notifications/scheduler/public/display_agent.h" +#include "chrome/browser/notifications/scheduler/public/features.h" #include "chrome/browser/notifications/scheduler/public/notification_background_task_scheduler.h" #include "chrome/browser/notifications/scheduler/public/notification_scheduler_client_registrar.h" #include "components/leveldb_proto/public/proto_database_provider.h" @@ -43,6 +45,9 @@ std::unique_ptr<DisplayAgent> display_agent, leveldb_proto::ProtoDatabaseProvider* db_provider, const base::FilePath& storage_dir) { + if (!base::FeatureList::IsEnabled(features::kNotificationScheduleService)) + return static_cast<KeyedService*>(new NoopNotificationScheduleService()); + auto config = SchedulerConfig::Create(); auto task_runner = base::CreateSequencedTaskRunnerWithTraits( {base::MayBlock(), base::TaskPriority::BEST_EFFORT});
diff --git a/chrome/browser/policy/OWNERS b/chrome/browser/policy/OWNERS index 1f757aed..4d55e12 100644 --- a/chrome/browser/policy/OWNERS +++ b/chrome/browser/policy/OWNERS
@@ -5,6 +5,7 @@ pmarko@chromium.org poromov@chromium.org rsorokin@chromium.org +zmin@chromium.org per-file *browser_dm_token_storage*=rogerta@chromium.org per-file *browser_dm_token_storage*=zmin@chromium.org
diff --git a/chrome/browser/policy/e2e_test/tests/__init__.py b/chrome/browser/policy/e2e_test/tests/__init__.py index 7e6463f..8b8d8ce 100644 --- a/chrome/browser/policy/e2e_test/tests/__init__.py +++ b/chrome/browser/policy/e2e_test/tests/__init__.py
@@ -5,6 +5,7 @@ from force_google_safe_search.force_google_safe_search import * from homepage.homepage import * from restore_on_startup.restore_on_startup import * +from password_manager_enabled.password_manager_enabled import * from popups_allowed.popups_allowed import * from url_blacklist.url_blacklist import * from url_whitelist.url_whitelist import *
diff --git a/chrome/browser/policy/e2e_test/tests/password_manager_enabled/__init__.py b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/__init__.py
diff --git a/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled.py b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled.py new file mode 100644 index 0000000..ea290e3 --- /dev/null +++ b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled.py
@@ -0,0 +1,42 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import os +from chrome_ent_test.ent_tests import ChromeEnterpriseTestCase +from chrome_ent_test.infra.core import environment, before_all, test + + +@environment(file="../policy_test.asset.textpb") +class PasswordManagerEnabledTest(ChromeEnterpriseTestCase): + """Test the PasswordManagerEnabled policy. + + See https://www.chromium.org/administrators/policy-list-3#PasswordManagerEnabled""" + + @before_all + def setup(self): + self.InstallChrome('client2012') + self.InstallWebDriver('client2012') + + def isPasswordManagerEnabled(self): + dir = os.path.dirname(os.path.abspath(__file__)) + output = self.RunWebDriverTest( + 'client2012', + os.path.join(dir, 'password_manager_enabled_webdriver_test.py')) + return "TRUE" in output + + @test + def test_PasswordManagerDisabled(self): + self.SetPolicy('win2012-dc', 'PasswordManagerEnabled', 0, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + enabled = self.isPasswordManagerEnabled() + self.assertFalse(enabled) + + @test + def test_PasswordManagerEnabled(self): + self.SetPolicy('win2012-dc', 'PasswordManagerEnabled', 1, 'DWORD') + self.RunCommand('client2012', 'gpupdate /force') + + enabled = self.isPasswordManagerEnabled() + self.assertTrue(enabled)
diff --git a/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled_webdriver_test.py b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled_webdriver_test.py new file mode 100644 index 0000000..320d5a0 --- /dev/null +++ b/chrome/browser/policy/e2e_test/tests/password_manager_enabled/password_manager_enabled_webdriver_test.py
@@ -0,0 +1,40 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import test_util +from absl import app + + +def getShadowDom(driver, root, selector): + el = root.find_element_by_css_selector(selector) + return driver.execute_script("return arguments[0].shadowRoot", el) + + +def getNestedShadowDom(driver, selectors): + el = driver + for selector in selectors: + el = getShadowDom(driver, el, selector) + return el + + +def main(argv): + driver = test_util.create_chrome_webdriver() + driver.get("chrome://settings/passwords") + + # The settings is nested within multiple shadow doms - extract it. + el = getNestedShadowDom(driver, [ + "settings-ui", "settings-main", "settings-basic-page", + "settings-autofill-page", "passwords-section", "#passwordToggle" + ]) + + if el.find_element_by_css_selector("cr-toggle").get_attribute("checked"): + print "TRUE" + else: + print "FALSE" + + driver.quit() + + +if __name__ == '__main__': + app.run(main)
diff --git a/chrome/browser/policy/policy_conversions.cc b/chrome/browser/policy/policy_conversions.cc index 643a813..0d79ed2 100644 --- a/chrome/browser/policy/policy_conversions.cc +++ b/chrome/browser/policy/policy_conversions.cc
@@ -129,28 +129,36 @@ // |known_policy_schemas| contains |Schema|s for known policies in the same // policy namespace of |map|. A policy without an entry in // |known_policy_schemas| is an unknown policy. +// When |convert_types| is true, policy types are converted into string. For +// example, POLICY_SCOPE_USER is converted to 'user'. Otherwise, policy types +// are returned as integers. Value GetPolicyValue( const std::string& policy_name, const PolicyMap::Entry& policy, PolicyErrorMap* errors, bool convert_values, const base::Optional<PolicyToSchemaMap>& known_policy_schemas, - bool is_pretty_print) { + bool is_pretty_print, + bool convert_types) { base::Optional<Schema> known_policy_schema = GetKnownPolicySchema(known_policy_schemas, policy_name); Value value(Value::Type::DICTIONARY); value.SetKey("value", CopyAndMaybeConvert(*policy.value, convert_values, known_policy_schema, is_pretty_print)); - value.SetKey("scope", Value((policy.scope == POLICY_SCOPE_USER) - ? "user" - : ((policy.scope == POLICY_SCOPE_MACHINE) - ? "machine" - : "merged"))); - value.SetKey("level", - Value((policy.level == POLICY_LEVEL_RECOMMENDED) ? "recommended" - : "mandatory")); - value.SetKey("source", Value(kPolicySources[policy.source].name)); + if (convert_types) { + value.SetKey( + "scope", + Value((policy.scope == POLICY_SCOPE_USER) ? "user" : "machine")); + value.SetKey("level", Value(Value((policy.level == POLICY_LEVEL_RECOMMENDED) + ? "recommended" + : "mandatory"))); + value.SetKey("source", Value(kPolicySources[policy.source].name)); + } else { + value.SetKey("scope", Value(policy.scope)); + value.SetKey("level", Value(policy.level)); + value.SetKey("source", Value(policy.source)); + } base::string16 error; if (!known_policy_schema.has_value()) { // We don't know what this policy is. This is an important error to @@ -187,7 +195,7 @@ for (const auto& conflict : policy.conflicts) { base::Value conflicted_policy_value = GetPolicyValue(policy_name, conflict, errors, convert_values, - known_policy_schemas, is_pretty_print); + known_policy_schemas, is_pretty_print, convert_types); conflict_values.GetList().push_back(std::move(conflicted_policy_value)); } @@ -210,7 +218,8 @@ bool convert_values, const base::Optional<PolicyToSchemaMap>& known_policy_schemas, Value* values, - bool is_pretty_print) { + bool is_pretty_print, + bool convert_types) { DCHECK(values); for (const auto& entry : map) { const std::string& policy_name = entry.first; @@ -219,7 +228,7 @@ continue; base::Value value = GetPolicyValue(policy_name, policy, errors, convert_values, - known_policy_schemas, is_pretty_print); + known_policy_schemas, is_pretty_print, convert_types); values->SetKey(policy_name, std::move(value)); } } @@ -248,7 +257,8 @@ bool keep_user_policies, bool convert_values, Value* values, - bool is_pretty_print) { + bool is_pretty_print, + bool convert_types) { PolicyService* policy_service = GetPolicyService(context); PolicyMap map; @@ -281,14 +291,15 @@ GetPolicyValues( map, &errors, keep_user_policies, convert_values, GetKnownPolicies(schema_map, policy_namespace, is_pretty_print), values, - is_pretty_print); + is_pretty_print, convert_types); } #if defined(OS_CHROMEOS) void GetDeviceLocalAccountPolicies(bool convert_values, Value* values, bool with_device_data, - bool is_pretty_print) { + bool is_pretty_print, + bool convert_types) { // DeviceLocalAccount policies are only available for affiliated users and for // system logs. if (!with_device_data && @@ -349,7 +360,7 @@ GetPolicyValues( map, &errors, true, convert_values, GetKnownPolicies(schema_map, policy_namespace, is_pretty_print), - ¤t_account_policies, is_pretty_print); + ¤t_account_policies, is_pretty_print, convert_types); if (values->is_list()) { Value current_account_policies_data(Value::Type::DICTIONARY); @@ -383,7 +394,8 @@ bool with_user_policies, bool convert_values, bool with_device_data, - bool is_pretty_print) { + bool is_pretty_print, + bool convert_types) { Value all_policies(Value::Type::LIST); DCHECK(context); @@ -392,7 +404,7 @@ // Add Chrome policy values. Value chrome_policies(Value::Type::DICTIONARY); GetChromePolicyValues(context, with_user_policies, convert_values, - &chrome_policies, is_pretty_print); + &chrome_policies, is_pretty_print, convert_types); Value chrome_policies_data(Value::Type::DICTIONARY); chrome_policies_data.SetKey("name", Value("Chrome Policies")); chrome_policies_data.SetKey("policies", std::move(chrome_policies)); @@ -431,7 +443,7 @@ GetPolicyService(context)->GetPolicies(policy_namespace), &empty_error_map, with_user_policies, convert_values, GetKnownPolicies(schema_map, policy_namespace, is_pretty_print), - &extension_policies, is_pretty_print); + &extension_policies, is_pretty_print, convert_types); Value extension_policies_data(Value::Type::DICTIONARY); extension_policies_data.SetKey("name", Value(extension->name())); extension_policies_data.SetKey("id", Value(extension->id())); @@ -443,7 +455,7 @@ #if defined(OS_CHROMEOS) Value device_local_account_policies(Value::Type::DICTIONARY); GetDeviceLocalAccountPolicies(convert_values, &all_policies, with_device_data, - is_pretty_print); + is_pretty_print, convert_types); #endif // defined(OS_CHROMEOS) return all_policies; @@ -453,7 +465,8 @@ bool with_user_policies, bool convert_values, bool with_device_data, - bool is_pretty_print) { + bool is_pretty_print, + bool convert_types) { Value all_policies(Value::Type::DICTIONARY); if (!context) { LOG(ERROR) << "Can not dump policies, null context"; @@ -465,7 +478,7 @@ // Add Chrome policy values. Value chrome_policies(Value::Type::DICTIONARY); GetChromePolicyValues(context, with_user_policies, convert_values, - &chrome_policies, is_pretty_print); + &chrome_policies, is_pretty_print, convert_types); all_policies.SetKey("chromePolicies", std::move(chrome_policies)); #if BUILDFLAG(ENABLE_EXTENSIONS) @@ -499,7 +512,7 @@ GetPolicyService(context)->GetPolicies(policy_namespace), &empty_error_map, with_user_policies, convert_values, GetKnownPolicies(schema_map, policy_namespace, is_pretty_print), - &extension_policies, is_pretty_print); + &extension_policies, is_pretty_print, convert_types); extension_values.SetKey(extension->id(), std::move(extension_policies)); } all_policies.SetKey("extensionPolicies", std::move(extension_values)); @@ -508,7 +521,8 @@ #if defined(OS_CHROMEOS) Value device_local_account_policies(Value::Type::DICTIONARY); GetDeviceLocalAccountPolicies(convert_values, &device_local_account_policies, - with_device_data, is_pretty_print); + with_device_data, is_pretty_print, + convert_types); all_policies.SetKey("deviceLocalAccountPolicies", std::move(device_local_account_policies)); #endif // defined(OS_CHROMEOS) @@ -578,7 +592,7 @@ bool is_pretty_print) { Value all_policies = GetAllPolicyValuesAsDictionary( context, with_user_policies, false /* convert_values */, with_device_data, - is_pretty_print); + is_pretty_print, true /* convert_types */); return DictionaryToJSONString(all_policies, is_pretty_print); }
diff --git a/chrome/browser/policy/policy_conversions.h b/chrome/browser/policy/policy_conversions.h index 7b9777c..f1e3b1ff 100644 --- a/chrome/browser/policy/policy_conversions.h +++ b/chrome/browser/policy/policy_conversions.h
@@ -18,16 +18,21 @@ namespace policy { +// TODO(crbug.com/983174): Refactor the file as these functions have too many +// parameters. + extern const LocalizedString kPolicySources[POLICY_SOURCE_COUNT]; // Returns an array with the values of all set policies, with some values // converted to be shown in javascript, if it is specified. // |with_user_policies| governs if values with POLICY_SCOPE_USER are included. +// |convert_types| governs if policy types are returned as string. base::Value GetAllPolicyValuesAsArray(content::BrowserContext* context, bool with_user_policies, bool convert_values, bool with_device_data, - bool is_pretty_print); + bool is_pretty_print, + bool convert_types); // Returns a dictionary with the values of all set policies, with some values // converted to be shown in javascript, if it is specified. @@ -35,12 +40,14 @@ // |with_device_data| governs if device identity data (e.g. // enrollment client ID) and device local accounts policies are included, // it is used in logs uploads to the server. -// |is_pretty_print| govers if JSON policy value is pretty printed. +// |is_pretty_print| governs if JSON policy value is pretty printed. +// |convert_types| governs if policy types are returned as string. base::Value GetAllPolicyValuesAsDictionary(content::BrowserContext* context, bool with_user_policies, bool convert_values, bool with_device_data, - bool is_pretty_print); + bool is_pretty_print, + bool convert_types); // Returns a JSON with the values of all set policies. // |with_user_policies| governs if values with POLICY_SCOPE_USER are included.
diff --git a/chrome/browser/printing/printer_manager_dialog.h b/chrome/browser/printing/printer_manager_dialog.h index 6779a76..a8df6f3 100644 --- a/chrome/browser/printing/printer_manager_dialog.h +++ b/chrome/browser/printing/printer_manager_dialog.h
@@ -12,6 +12,8 @@ #error "Printing must be enabled" #endif +class Profile; + namespace printing { // An abstraction of a printer manager dialog. This is used for the printing @@ -20,7 +22,7 @@ class PrinterManagerDialog { public: // Displays the native printer manager dialog. - static void ShowPrinterManagerDialog(); + static void ShowPrinterManagerDialog(Profile* profile); private: DISALLOW_IMPLICIT_CONSTRUCTORS(PrinterManagerDialog);
diff --git a/chrome/browser/printing/printer_manager_dialog_linux.cc b/chrome/browser/printing/printer_manager_dialog_linux.cc index 0289ce1..672a6c5c 100644 --- a/chrome/browser/printing/printer_manager_dialog_linux.cc +++ b/chrome/browser/printing/printer_manager_dialog_linux.cc
@@ -87,7 +87,7 @@ namespace printing { -void PrinterManagerDialog::ShowPrinterManagerDialog() { +void PrinterManagerDialog::ShowPrinterManagerDialog(Profile* profile) { base::PostTaskWithTraits( FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING}, base::BindOnce(&DetectAndOpenPrinterConfigDialog));
diff --git a/chrome/browser/printing/printer_manager_dialog_mac.mm b/chrome/browser/printing/printer_manager_dialog_mac.mm index 44bfc69..6c58eff1 100644 --- a/chrome/browser/printing/printer_manager_dialog_mac.mm +++ b/chrome/browser/printing/printer_manager_dialog_mac.mm
@@ -11,7 +11,7 @@ static NSString* kPrintAndFaxPrefPane = @"/System/Library/PreferencePanes/PrintAndFax.prefPane"; -void PrinterManagerDialog::ShowPrinterManagerDialog() { +void PrinterManagerDialog::ShowPrinterManagerDialog(Profile* profile) { [[NSWorkspace sharedWorkspace] openFile:kPrintAndFaxPrefPane]; }
diff --git a/chrome/browser/printing/printer_manager_dialog_win.cc b/chrome/browser/printing/printer_manager_dialog_win.cc index 9ea0e81..3bb3253 100644 --- a/chrome/browser/printing/printer_manager_dialog_win.cc +++ b/chrome/browser/printing/printer_manager_dialog_win.cc
@@ -12,6 +12,9 @@ #include "base/path_service.h" #include "base/task/post_task.h" #include "base/threading/thread.h" +#include "base/win/windows_version.h" +#include "chrome/browser/platform_util.h" +#include "url/gurl.h" namespace { @@ -32,10 +35,14 @@ namespace printing { -void PrinterManagerDialog::ShowPrinterManagerDialog() { - base::PostTaskWithTraits( - FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING}, - base::BindOnce(OpenPrintersDialogCallback)); +void PrinterManagerDialog::ShowPrinterManagerDialog(Profile* profile) { + if (base::win::GetVersion() >= base::win::Version::WIN10_RS1) { + platform_util::OpenExternal(profile, GURL("ms-settings:printers")); + } else { + base::PostTaskWithTraits( + FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING}, + base::BindOnce(OpenPrintersDialogCallback)); + } } } // namespace printing
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 0ccf7965..6c61fc3 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -116,6 +116,7 @@ #include "chrome/browser/chromeos/policy/user_network_configuration_updater_factory.h" #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h" #include "chrome/browser/chromeos/printing/cups_printers_manager_factory.h" +#include "chrome/browser/chromeos/printing/cups_proxy_service_manager_factory.h" #include "chrome/browser/chromeos/printing/synced_printers_manager_factory.h" #include "chrome/browser/chromeos/smb_client/smb_service_factory.h" #include "chrome/browser/chromeos/tether/tether_service_factory.h" @@ -267,6 +268,7 @@ chromeos::AccountManagerMigratorFactory::GetInstance(); chromeos::CupsPrintJobManagerFactory::GetInstance(); chromeos::CupsPrintersManagerFactory::GetInstance(); + chromeos::CupsProxyServiceManagerFactory::GetInstance(); chromeos::SyncedPrintersManagerFactory::GetInstance(); chromeos::smb_client::SmbServiceFactory::GetInstance(); crostini::CrostiniRegistryServiceFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc index 1a0de268..37b90f5 100644 --- a/chrome/browser/profiles/profile_impl.cc +++ b/chrome/browser/profiles/profile_impl.cc
@@ -179,10 +179,13 @@ #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" #include "chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.h" #include "chrome/browser/chromeos/preferences.h" +#include "chrome/browser/chromeos/printing/cups_proxy_service_delegate_impl.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/secure_channel/secure_channel_client_provider.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chrome/browser/signin/chrome_device_id_helper.h" +#include "chrome/services/cups_proxy/cups_proxy_service.h" +#include "chrome/services/cups_proxy/public/mojom/constants.mojom.h" #include "chromeos/assistant/buildflags.h" #include "chromeos/components/account_manager/account_manager.h" #include "chromeos/components/account_manager/account_manager_factory.h" @@ -1328,6 +1331,12 @@ chromeos::GcmDeviceInfoProviderImpl::GetInstance()); } + if (service_name == chromeos::printing::mojom::kCupsProxyServiceName) { + return std::make_unique<chromeos::printing::CupsProxyService>( + std::move(request), + std::make_unique<chromeos::CupsProxyServiceDelegateImpl>()); + } + #if BUILDFLAG(ENABLE_CROS_ASSISTANT) if (service_name == chromeos::assistant::mojom::kServiceName) { return std::make_unique<chromeos::assistant::Service>(
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index a0b96dfe..8d1ed7b 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -367,14 +367,6 @@ #endif registrar_.Add( this, - chrome::NOTIFICATION_BROWSER_OPENED, - content::NotificationService::AllSources()); - registrar_.Add( - this, - chrome::NOTIFICATION_BROWSER_CLOSED, - content::NotificationService::AllSources()); - registrar_.Add( - this, chrome::NOTIFICATION_CLOSE_ALL_BROWSERS_REQUEST, content::NotificationService::AllSources()); registrar_.Add( @@ -1139,87 +1131,14 @@ save_active_profiles = true; break; } - case chrome::NOTIFICATION_BROWSER_OPENED: { -#if defined(OS_ANDROID) - NOTREACHED(); - break; -#else - Browser* browser = content::Source<Browser>(source).ptr(); - DCHECK(browser); - Profile* profile = browser->profile(); - DCHECK(profile); - bool is_ephemeral = - profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles); - if (!profile->IsOffTheRecord() && !is_ephemeral && - ++browser_counts_[profile] == 1) { - active_profiles_.push_back(profile); - save_active_profiles = true; - } - // If browsers are opening, we can't be closing all the browsers. This - // can happen if the application was exited, but background mode or - // packaged apps prevented the process from shutting down, and then - // a new browser window was opened. - closing_all_browsers_ = false; - break; -#endif - } - case chrome::NOTIFICATION_BROWSER_CLOSED: { -#if defined(OS_ANDROID) - NOTREACHED(); - break; -#else - Browser* browser = content::Source<Browser>(source).ptr(); - DCHECK(browser); - Profile* profile = browser->profile(); - DCHECK(profile); - if (!profile->IsOffTheRecord() && --browser_counts_[profile] == 0) { - active_profiles_.erase(std::find(active_profiles_.begin(), - active_profiles_.end(), profile)); - save_active_profiles = !closing_all_browsers_; - } - break; -#endif - } default: { NOTREACHED(); break; } } - if (save_active_profiles) { - PrefService* local_state = g_browser_process->local_state(); - DCHECK(local_state); - ListPrefUpdate update(local_state, prefs::kProfilesLastActive); - base::ListValue* profile_list = update.Get(); - - profile_list->Clear(); - - // crbug.com/120112 -> several non-incognito profiles might have the same - // GetPath().BaseName(). In that case, we cannot restore both - // profiles. Include each base name only once in the last active profile - // list. - std::set<std::string> profile_paths; - std::vector<Profile*>::const_iterator it; - for (it = active_profiles_.begin(); it != active_profiles_.end(); ++it) { - // crbug.com/823338 -> CHECK that the profiles aren't guest or incognito, - // causing a crash during session restore. - CHECK(!(*it)->IsGuestSession()) - << "Guest profiles shouldn't be saved as active profiles"; - CHECK(!(*it)->IsOffTheRecord()) - << "OTR profiles shouldn't be saved as active profiles"; - std::string profile_path = (*it)->GetPath().BaseName().MaybeAsASCII(); - // Some profiles might become ephemeral after they are created. - // Don't persist the System Profile as one of the last actives, it should - // never get a browser. - if (!(*it)->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) && - profile_paths.find(profile_path) == profile_paths.end() && - profile_path != - base::FilePath(chrome::kSystemProfileDir).AsUTF8Unsafe()) { - profile_paths.insert(profile_path); - profile_list->AppendString(profile_path); - } - } - } + if (save_active_profiles) + SaveActiveProfiles(); } void ProfileManager::OnProfileCreated(Profile* profile, @@ -1407,6 +1326,14 @@ Profile::CREATE_MODE_ASYNCHRONOUS); } +ProfileManager::ProfileInfo::ProfileInfo(std::unique_ptr<Profile> profile, + bool created) + : profile(std::move(profile)), created(created) {} + +ProfileManager::ProfileInfo::~ProfileInfo() { + ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release()); +} + Profile* ProfileManager::GetActiveUserOrOffTheRecordProfileFromPath( const base::FilePath& user_data_dir) { #if defined(OS_CHROMEOS) @@ -1762,15 +1689,86 @@ callbacks[i].Run(profile, status); } -ProfileManager::ProfileInfo::ProfileInfo(std::unique_ptr<Profile> profile, - bool created) - : profile(std::move(profile)), created(created) {} +void ProfileManager::SaveActiveProfiles() { + PrefService* local_state = g_browser_process->local_state(); + DCHECK(local_state); + ListPrefUpdate update(local_state, prefs::kProfilesLastActive); + base::ListValue* profile_list = update.Get(); -ProfileManager::ProfileInfo::~ProfileInfo() { - ProfileDestroyer::DestroyProfileWhenAppropriate(profile.release()); + profile_list->Clear(); + + // crbug.com/120112 -> several non-incognito profiles might have the same + // GetPath().BaseName(). In that case, we cannot restore both + // profiles. Include each base name only once in the last active profile + // list. + std::set<std::string> profile_paths; + std::vector<Profile*>::const_iterator it; + for (it = active_profiles_.begin(); it != active_profiles_.end(); ++it) { + // crbug.com/823338 -> CHECK that the profiles aren't guest or incognito, + // causing a crash during session restore. + CHECK(!(*it)->IsGuestSession()) + << "Guest profiles shouldn't be saved as active profiles"; + CHECK(!(*it)->IsOffTheRecord()) + << "OTR profiles shouldn't be saved as active profiles"; + std::string profile_path = (*it)->GetPath().BaseName().MaybeAsASCII(); + // Some profiles might become ephemeral after they are created. + // Don't persist the System Profile as one of the last actives, it should + // never get a browser. + if (!(*it)->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles) && + profile_paths.find(profile_path) == profile_paths.end() && + profile_path != + base::FilePath(chrome::kSystemProfileDir).AsUTF8Unsafe()) { + profile_paths.insert(profile_path); + profile_list->AppendString(profile_path); + } + } } #if !defined(OS_ANDROID) +void ProfileManager::OnBrowserOpened(Browser* browser) { + DCHECK(browser); + Profile* profile = browser->profile(); + DCHECK(profile); + bool is_ephemeral = + profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles); + if (!profile->IsOffTheRecord() && !is_ephemeral && + ++browser_counts_[profile] == 1) { + active_profiles_.push_back(profile); + SaveActiveProfiles(); + } + // If browsers are opening, we can't be closing all the browsers. This + // can happen if the application was exited, but background mode or + // packaged apps prevented the process from shutting down, and then + // a new browser window was opened. + closing_all_browsers_ = false; +} + +void ProfileManager::OnBrowserClosed(Browser* browser) { + Profile* profile = browser->profile(); + DCHECK(profile); + if (!profile->IsOffTheRecord() && --browser_counts_[profile] == 0) { + active_profiles_.erase( + std::find(active_profiles_.begin(), active_profiles_.end(), profile)); + if (!closing_all_browsers_) + SaveActiveProfiles(); + } + + Profile* original_profile = profile->GetOriginalProfile(); + // Do nothing if the closed window is not the last window of the same profile. + for (auto* browser_iter : *BrowserList::GetInstance()) { + if (browser_iter->profile()->GetOriginalProfile() == original_profile) + return; + } + + base::FilePath path = profile->GetPath(); + if (IsProfileDirectoryMarkedForDeletion(path)) { + // Do nothing if the profile is already being deleted. + } else if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) { + // Delete if the profile is an ephemeral profile. + ScheduleForcedEphemeralProfileForDeletion(path); + } +} + void ProfileManager::UpdateLastUser(Profile* last_active) { PrefService* local_state = g_browser_process->local_state(); DCHECK(local_state); @@ -1801,27 +1799,13 @@ BrowserList::RemoveObserver(this); } -void ProfileManager::BrowserListObserver::OnBrowserAdded( - Browser* browser) {} +void ProfileManager::BrowserListObserver::OnBrowserAdded(Browser* browser) { + profile_manager_->OnBrowserOpened(browser); +} void ProfileManager::BrowserListObserver::OnBrowserRemoved( Browser* browser) { - Profile* profile = browser->profile(); - Profile* original_profile = profile->GetOriginalProfile(); - // Do nothing if the closed window is not the last window of the same profile. - for (auto* browser : *BrowserList::GetInstance()) { - if (browser->profile()->GetOriginalProfile() == original_profile) - return; - } - - base::FilePath path = profile->GetPath(); - if (IsProfileDirectoryMarkedForDeletion(path)) { - // Do nothing if the profile is already being deleted. - } else if (profile->GetPrefs()->GetBoolean(prefs::kForceEphemeralProfiles)) { - // Delete if the profile is an ephemeral profile. - g_browser_process->profile_manager() - ->ScheduleForcedEphemeralProfileForDeletion(path); - } + profile_manager_->OnBrowserClosed(browser); } void ProfileManager::BrowserListObserver::OnBrowserSetLastActive(
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h index 4b4fa3f..985c6445 100644 --- a/chrome/browser/profiles/profile_manager.h +++ b/chrome/browser/profiles/profile_manager.h
@@ -358,7 +358,12 @@ Profile* profile, Profile::CreateStatus status); + void SaveActiveProfiles(); + #if !defined(OS_ANDROID) + void OnBrowserOpened(Browser* browser); + void OnBrowserClosed(Browser* browser); + // Updates the last active user of the current session. // On Chrome OS updating this user will have no effect since when browser is // restored after crash there's another preference that is taken into account.
diff --git a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc index d8b2535..16e10342 100644 --- a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.cc
@@ -58,6 +58,20 @@ items_.push_back(item); } +void MockRenderViewContextMenu::AddMenuItemWithIcon( + int command_id, + const base::string16& title, + const gfx::ImageSkia& image) { + MockMenuItem item; + item.command_id = command_id; + item.enabled = observer_->IsCommandIdEnabled(command_id); + item.checked = false; + item.hidden = false; + item.title = title; + item.icon = gfx::Image(image); + items_.push_back(item); +} + void MockRenderViewContextMenu::AddCheckItem(int command_id, const base::string16& title) { MockMenuItem item; @@ -89,6 +103,27 @@ item.title = label; items_.push_back(item); + AppendSubMenuItems(model); +} + +void MockRenderViewContextMenu::AddSubMenuWithStringIdAndIcon( + int command_id, + int message_id, + ui::MenuModel* model, + const gfx::ImageSkia& image) { + MockMenuItem item; + item.command_id = command_id; + item.enabled = observer_->IsCommandIdEnabled(command_id); + item.checked = observer_->IsCommandIdChecked(command_id); + item.hidden = false; + item.title = l10n_util::GetStringUTF16(message_id); + item.icon = gfx::Image(image); + items_.push_back(item); + + AppendSubMenuItems(model); +} + +void MockRenderViewContextMenu::AppendSubMenuItems(ui::MenuModel* model) { // Add items in the submenu |model| to |items_| so that the items can be // updated later via the RenderViewContextMenuProxy interface. // NOTE: this is a hack for the mock class. Ideally, RVCMProxy should neither
diff --git a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h index 6ce9530..cf31b4c 100644 --- a/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h +++ b/chrome/browser/renderer_context_menu/mock_render_view_context_menu.h
@@ -52,11 +52,18 @@ // RenderViewContextMenuProxy implementation. void AddMenuItem(int command_id, const base::string16& title) override; + void AddMenuItemWithIcon(int command_id, + const base::string16& title, + const gfx::ImageSkia& image) override; void AddCheckItem(int command_id, const base::string16& title) override; void AddSeparator() override; void AddSubMenu(int command_id, const base::string16& label, ui::MenuModel* model) override; + void AddSubMenuWithStringIdAndIcon(int command_id, + int message_id, + ui::MenuModel* model, + const gfx::ImageSkia& image) override; void UpdateMenuItem(int command_id, bool enabled, bool hidden, @@ -83,6 +90,9 @@ PrefService* GetPrefs(); private: + // Helper function to append items in sub menu from |model|. + void AppendSubMenuItems(ui::MenuModel* model); + // An observer used for initializing the status of menu items added in this // test. This is owned by our owner and the owner is responsible for its // lifetime.
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 2b14fcf..99539e2b 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -56,6 +56,8 @@ #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h" #include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h" +#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h" +#include "chrome/browser/sharing/click_to_call/click_to_call_utils.h" #include "chrome/browser/spellchecker/spellcheck_service.h" #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/translate/translate_service.h" @@ -350,13 +352,15 @@ {IDC_CONTENT_LINK_SEND_TAB_TO_SELF, 103}, {IDC_SEND_TAB_TO_SELF_SINGLE_TARGET, 104}, {IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET, 105}, + {IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, 106}, + {IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, 107}, // To add new items: // - Add one more line above this comment block, using the UMA value // from the line below this comment block. // - Increment the UMA value in that latter line. // - Add the new item to the RenderViewContextMenuItem enum in // tools/metrics/histograms/enums.xml. - {0, 106}}); + {0, 108}}); // These UMA values are for the the ContextMenuOptionDesktop enum, used for // the ContextMenu.SelectedOptionDesktop histograms. @@ -1143,6 +1147,8 @@ if (!params_.link_url.is_empty()) { const Browser* browser = GetBrowser(); const bool in_app = browser && browser->is_app(); + WebContents* active_web_contents = + browser ? browser->tab_strip_model()->GetActiveWebContents() : nullptr; menu_model_.AddItemWithStringId( IDC_CONTENT_CONTEXT_OPENLINKNEWTAB, @@ -1244,8 +1250,7 @@ } #endif // !defined(OS_CHROMEOS) if (browser && send_tab_to_self::ShouldOfferFeatureForLink( - browser->tab_strip_model()->GetActiveWebContents(), - params_.link_url)) { + active_web_contents, params_.link_url)) { send_tab_to_self::RecordSendTabToSelfClickResult( send_tab_to_self::kLinkMenu, SendTabToSelfClickResult::kShowItem); menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); @@ -1274,7 +1279,7 @@ } else { send_tab_to_self_sub_menu_model_ = std::make_unique<send_tab_to_self::SendTabToSelfSubMenuModel>( - browser->tab_strip_model()->GetActiveWebContents(), + active_web_contents, send_tab_to_self::SendTabToSelfMenuType::kLink, params_.link_url); #if defined(OS_MACOSX) @@ -1290,6 +1295,18 @@ } } + // Context menu item for click to call. + if (active_web_contents && + ShouldOfferClickToCall(active_web_contents->GetBrowserContext(), + params_.link_url)) { + if (!click_to_call_context_menu_observer_) { + click_to_call_context_menu_observer_ = + std::make_unique<ClickToCallContextMenuObserver>(this); + observers_.AddObserver(click_to_call_context_menu_observer_.get()); + } + click_to_call_context_menu_observer_->InitMenu(params_); + } + menu_model_.AddSeparator(ui::NORMAL_SEPARATOR); menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_SAVELINKAS, IDS_CONTENT_CONTEXT_SAVELINKAS);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.h b/chrome/browser/renderer_context_menu/render_view_context_menu.h index ab836b9a..49728eb 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.h +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.h
@@ -34,6 +34,7 @@ #endif class AccessibilityLabelsMenuObserver; +class ClickToCallContextMenuObserver; class PrintPreviewContextMenuObserver; class Profile; class SpellingMenuObserver; @@ -288,6 +289,10 @@ std::unique_ptr<send_tab_to_self::SendTabToSelfSubMenuModel> send_tab_to_self_sub_menu_model_; + // Click to call menu observer. + std::unique_ptr<ClickToCallContextMenuObserver> + click_to_call_context_menu_observer_; + DISALLOW_COPY_AND_ASSIGN(RenderViewContextMenu); };
diff --git a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc index 324856b8..29e35fc 100644 --- a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc +++ b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
@@ -35,6 +35,7 @@ #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/no_renderer_crashes_assertion.h" +#include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" #include "media/base/media_switches.h" #include "net/base/filename_util.h" @@ -605,14 +606,18 @@ GURL url(chrome::kChromeUIOmniboxURL); ui_test_utils::NavigateToURL(browser(), url); - ui_test_utils::NavigateToURLWithDisposition( - browser(), url, WindowOpenDisposition::NEW_BACKGROUND_TAB, - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); + WebContents* wc1 = browser()->tab_strip_model()->GetWebContentsAt(0); + + content::WebContentsAddedObserver wc2_observer; + content::ExecuteScriptAsync( + wc1, content::JsReplace("window.open($1, '_blank')", url)); + WebContents* wc2 = wc2_observer.GetWebContents(); + content::TestNavigationObserver nav_observer(wc2, 1); + nav_observer.Wait(); EXPECT_EQ(2, browser()->tab_strip_model()->count()); - - WebContents* wc1 = browser()->tab_strip_model()->GetWebContentsAt(0); - WebContents* wc2 = browser()->tab_strip_model()->GetWebContentsAt(1); + EXPECT_EQ(wc1->GetMainFrame()->GetLastCommittedURL(), + wc2->GetMainFrame()->GetLastCommittedURL()); EXPECT_EQ(wc1->GetMainFrame()->GetProcess(), wc2->GetMainFrame()->GetProcess());
diff --git a/chrome/browser/resources/chromeos/switch_access/BUILD.gn b/chrome/browser/resources/chromeos/switch_access/BUILD.gn index f0406109b..34438a3 100644 --- a/chrome/browser/resources/chromeos/switch_access/BUILD.gn +++ b/chrome/browser/resources/chromeos/switch_access/BUILD.gn
@@ -40,7 +40,15 @@ "icons/decrement.svg", "icons/dictation.svg", "icons/increment.svg", + "icons/jumpToBeginningOfText.svg", + "icons/jumpToEndOfText.svg", "icons/keyboard.svg", + "icons/moveBackwardOneCharOfText.svg", + "icons/moveBackwardOneWordOfText.svg", + "icons/moveDownOneLineOfText.svg", + "icons/moveForwardOneCharOfText.svg", + "icons/moveForwardOneWordOfText.svg", + "icons/moveUpOneLineOfText.svg", "icons/options.svg", "icons/scrollDownOrForward.svg", "icons/scrollLeft.svg", @@ -64,6 +72,7 @@ "switch_access_constants.js", "switch_access_predicate.js", "text_input_manager.js", + "text_navigation_manager.js", ] rewrite_rules = [ rebase_path(".", root_build_dir) + ":", @@ -175,6 +184,7 @@ ":switch_access_interface", ":switch_access_predicate", ":text_input_manager", + ":text_navigation_manager", "../chromevox:constants", "../chromevox:tree_walker", "../select_to_speak:closure_shim", @@ -196,6 +206,7 @@ ":switch_access_constants", ":switch_access_predicate", ":text_input_manager", + ":text_navigation_manager", "../chromevox:constants", "../chromevox:tree_walker", ] @@ -282,6 +293,7 @@ externs_list = [ "$externs_path/automation.js", "$externs_path/chrome_extensions.js", + "$externs_path/command_line_private.js", ] } @@ -301,3 +313,10 @@ js_library("text_input_manager") { externs_list = [ "$externs_path/accessibility_private.js" ] } + +js_library("text_navigation_manager") { + deps = [ + ":switch_access_constants", + ] + externs_list = [ "$externs_path/accessibility_private.js" ] +}
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/jumpToBeginningOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/jumpToBeginningOfText.svg new file mode 100644 index 0000000..4035615 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/jumpToBeginningOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M9 3v2H7V3zm3.414 6H17v2h-4.586l1.293 1.293-1.414 1.414L9 10l3.293-3.707 1.414 1.414zM9 15v2H7v-2zM5 3v14H3V3zm8 12v2h-2v-2zm4 0v2h-2v-2zm0-12v2h-2V3zm-4 0v2h-2V3z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/jumpToEndOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/jumpToEndOfText.svg new file mode 100644 index 0000000..6df36d5 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/jumpToEndOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M11 3h2v2h-2zM7.586 9L6.293 7.707l1.414-1.414L11 10l-3.293 3.707-1.414-1.414L7.586 11H3V9zM11 15h2v2h-2zm4-12h2v14h-2zM7 15h2v2H7zm-4 0h2v2H3zM3 3h2v2H3zm4 0h2v2H7z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneCharOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneCharOfText.svg new file mode 100644 index 0000000..f5f16021 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneCharOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M13 5v10h-2v2h6v-2h-2V5h2V3h-6v2zM9 3H7v2h2zM5 3H3v2h2zm0 12H3v2h2zm1.414-6l1.293-1.293-1.414-1.414L3 10l3.293 3.707 1.414-1.414L6.414 11H11V9zM9 15H7v2h2z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneWordOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneWordOfText.svg new file mode 100644 index 0000000..20902021 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/moveBackwardOneWordOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M6.414 9l1.293-1.293-1.414-1.414L3 10l3.293 3.707 1.414-1.414L6.414 11H9V9zM17 3h-6v14h6zm-2 2v10h-2V5zM3 5h6V3H3zm0 10v2h6v-2z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveDownOneLineOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveDownOneLineOfText.svg new file mode 100644 index 0000000..b44fe25 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/moveDownOneLineOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M17 5H3V3h14zm-6 5.586l1.293-1.293 1.414 1.414L10 14l-3.707-3.293 1.414-1.414L9 10.586V6h2zM17 17H3v-2h14z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneCharOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneCharOfText.svg new file mode 100644 index 0000000..27f8689e9 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneCharOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M7 5v10h2v2H3v-2h2V5H3V3h6v2zm4-2h2v2h-2zm4 0h2v2h-2zm0 12h2v2h-2zm-1.414-6l-1.293-1.293 1.414-1.414L17 10l-3.293 3.707-1.414-1.414L13.586 11H9V9zM11 15h2v2h-2z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneWordOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneWordOfText.svg new file mode 100644 index 0000000..95ac570 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/moveForwardOneWordOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M13.586 9l-1.293-1.293 1.414-1.414L17 10l-3.293 3.707-1.414-1.414L13.586 11H11V9zM3 3h6v14H3zm2 2v10h2V5zm12 0h-6V3h6zm0 10v2h-6v-2z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/icons/moveUpOneLineOfText.svg b/chrome/browser/resources/chromeos/switch_access/icons/moveUpOneLineOfText.svg new file mode 100644 index 0000000..3c53d750 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/icons/moveUpOneLineOfText.svg
@@ -0,0 +1,5 @@ +<!-- Copyright 2019 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. --> + +<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg"><path d="M3 15h14v2H3zm6-5.586l-1.293 1.293-1.414-1.414L10 6l3.707 3.293-1.414 1.414L11 9.414V14H9zM3 3h14v2H3z" fill="#E8EAED" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 index 418712a8..7e70a67 100644 --- a/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2 +++ b/chrome/browser/resources/chromeos/switch_access/manifest.json.jinja2
@@ -25,12 +25,14 @@ "switch_access_constants.js", "switch_access_predicate.js", "text_input_manager.js", + "text_navigation_manager.js", "tree_walker.js", "background.js" ] }, "permissions": [ "accessibilityPrivate", + "commandLinePrivate", "storage", "tabs" ],
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_manager.js b/chrome/browser/resources/chromeos/switch_access/menu_manager.js index 3baa3e0..fec0e2cb 100644 --- a/chrome/browser/resources/chromeos/switch_access/menu_manager.js +++ b/chrome/browser/resources/chromeos/switch_access/menu_manager.js
@@ -184,9 +184,19 @@ if (!this.inMenu_ || !this.node_) return false; - this.clearFocusRing_(); - this.node_.doDefault(); - this.exit(); + + if (window.switchAccess.textEditingEnabled()) { + if (this.node_.role == RoleType.BUTTON) { + this.node_.doDefault(); + } else { + this.exit(); + } + } else { + this.clearFocusRing_(); + this.node_.doDefault(); + this.exit(); + } + return true; } @@ -263,6 +273,18 @@ if (SwitchAccessPredicate.isTextInput(node)) { actions.push(SAConstants.MenuAction.KEYBOARD); actions.push(SAConstants.MenuAction.DICTATION); + + if (window.switchAccess.textEditingEnabled() && + node.state[StateType.FOCUSED]) { + actions.push(SAConstants.MenuAction.JUMP_TO_BEGINNING_OF_TEXT); + actions.push(SAConstants.MenuAction.JUMP_TO_END_OF_TEXT); + actions.push(SAConstants.MenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT); + actions.push(SAConstants.MenuAction.MOVE_BACKWARD_ONE_WORD_OF_TEXT); + actions.push(SAConstants.MenuAction.MOVE_DOWN_ONE_LINE_OF_TEXT); + actions.push(SAConstants.MenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT); + actions.push(SAConstants.MenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT); + actions.push(SAConstants.MenuAction.MOVE_UP_ONE_LINE_OF_TEXT); + } } else if (actions.length > 0) { actions.push(SAConstants.MenuAction.SELECT); } @@ -291,7 +313,13 @@ * @param {!SAConstants.MenuAction} action */ performAction(action) { - this.exit(); + if (!window.switchAccess.textEditingEnabled()) { + this.exit(); + } + + // Whether or not the menu should exit after performing + // the action. + let exitAfterAction = true; switch (action) { case SAConstants.MenuAction.SELECT: @@ -312,9 +340,45 @@ case SAConstants.MenuAction.SCROLL_RIGHT: this.navigationManager_.scroll(action); break; + case SAConstants.MenuAction.JUMP_TO_BEGINNING_OF_TEXT: + this.navigationManager_.jumpToBeginningOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.JUMP_TO_END_OF_TEXT: + this.navigationManager_.jumpToEndOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.MOVE_BACKWARD_ONE_CHAR_OF_TEXT: + this.navigationManager_.moveBackwardOneCharOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.MOVE_BACKWARD_ONE_WORD_OF_TEXT: + this.navigationManager_.moveBackwardOneWordOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.MOVE_DOWN_ONE_LINE_OF_TEXT: + this.navigationManager_.moveDownOneLineOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.MOVE_FORWARD_ONE_CHAR_OF_TEXT: + this.navigationManager_.moveForwardOneCharOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.MOVE_FORWARD_ONE_WORD_OF_TEXT: + this.navigationManager_.moveForwardOneWordOfText(); + exitAfterAction = false; + break; + case SAConstants.MenuAction.MOVE_UP_ONE_LINE_OF_TEXT: + this.navigationManager_.moveUpOneLineOfText(); + exitAfterAction = false; + break; default: this.navigationManager_.performActionOnCurrentNode(action); } + + if (window.switchAccess.textEditingEnabled() && exitAfterAction) { + this.exit(); + } } /**
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_panel.css b/chrome/browser/resources/chromeos/switch_access/menu_panel.css index cceefe8..df3cd4d9 100644 --- a/chrome/browser/resources/chromeos/switch_access/menu_panel.css +++ b/chrome/browser/resources/chromeos/switch_access/menu_panel.css
@@ -28,6 +28,11 @@ padding: 4px; width: 80px; } + +.action.textEditingEnabled { + height: 75px; +} + button.action { background: none; border: none;
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_panel.html b/chrome/browser/resources/chromeos/switch_access/menu_panel.html index 82ea3384..0de8669d 100644 --- a/chrome/browser/resources/chromeos/switch_access/menu_panel.html +++ b/chrome/browser/resources/chromeos/switch_access/menu_panel.html
@@ -54,6 +54,38 @@ <img src="icons/scrollUpOrBackward.svg"> <p class="i18n" msgid="scroll_backward"></p> </button> + <button class="action" id="jumpToBeginningOfText"> + <img src="icons/jumpToBeginningOfText.svg"> + <p class="i18n" msgid="jump_to_beginning_of_text"></p> + </button> + <button class="action" id="jumpToEndOfText"> + <img src="icons/jumpToEndOfText.svg"> + <p class="i18n" msgid="jump_to_end_of_text"></p> + </button> + <button class="action" id="moveBackwardOneCharOfText"> + <img src="icons/moveBackwardOneCharOfText.svg"> + <p class="i18n" msgid="move_backward_one_char_of_text"></p> + </button> + <button class="action" id="moveBackwardOneWordOfText"> + <img src="icons/moveBackwardOneWordOfText.svg"> + <p class="i18n" msgid="move_backward_one_word_of_text"></p> + </button> + <button class="action" id="moveDownOneLineOfText"> + <img src="icons/moveDownOneLineOfText.svg"> + <p class="i18n" msgid="move_down_one_line_of_text"></p> + </button> + <button class="action" id="moveForwardOneCharOfText"> + <img src="icons/moveForwardOneCharOfText.svg"> + <p class="i18n" msgid="move_forward_one_char_of_text"></p> + </button> + <button class="action" id="moveForwardOneWordOfText"> + <img src="icons/moveForwardOneWordOfText.svg"> + <p class="i18n" msgid="move_forward_one_word_of_text"></p> + </button> + <button class="action" id="moveUpOneLineOfText"> + <img src="icons/moveUpOneLineOfText.svg"> + <p class="i18n" msgid="move_up_one_line_of_text"></p> + </button> <button class="action" id="dictation"> <img src="icons/dictation.svg"> <p class="i18n" msgid="dictation"></p>
diff --git a/chrome/browser/resources/chromeos/switch_access/menu_panel.js b/chrome/browser/resources/chromeos/switch_access/menu_panel.js index 40a0a9b6..59dedbe 100644 --- a/chrome/browser/resources/chromeos/switch_access/menu_panel.js +++ b/chrome/browser/resources/chromeos/switch_access/menu_panel.js
@@ -13,6 +13,12 @@ * @private {MenuManager} */ this.menuManager_; + + /** + * Reference to switch access. + * @private {SwitchAccess} + */ + this.switchAccess_; } /** @@ -37,8 +43,8 @@ * reference to this object for communication. */ connectToBackground() { - const switchAccess = chrome.extension.getBackgroundPage().switchAccess; - this.menuManager_ = switchAccess.connectMenuPanel(this); + this.switchAccess_ = chrome.extension.getBackgroundPage().switchAccess; + this.menuManager_ = this.switchAccess_.connectMenuPanel(this); } /** @@ -105,7 +111,20 @@ // TODO(anastasi): This should be a preference that the user can change. const maxCols = 3; const numRows = Math.ceil(numActions / maxCols); - const height = 60 * numRows; + + let rowHeight; + + if (this.switchAccess_.textEditingEnabled()) { + rowHeight = 85; + const actions = document.getElementsByClassName('action'); + for (let action of actions) { + action.classList.add('textEditingEnabled'); + } + } else { + rowHeight = 60; + } + + const height = rowHeight * numRows; document.getElementById(SAConstants.MENU_ID).style.height = height + 'px'; }
diff --git a/chrome/browser/resources/chromeos/switch_access/navigation_manager.js b/chrome/browser/resources/chromeos/switch_access/navigation_manager.js index 03ef7589..62a0f51 100644 --- a/chrome/browser/resources/chromeos/switch_access/navigation_manager.js +++ b/chrome/browser/resources/chromeos/switch_access/navigation_manager.js
@@ -32,6 +32,12 @@ this.textInputManager_ = new TextInputManager(this); /** + * Handles text navigation actions. + * @private {!TextNavigationManager} + */ + this.textNavigationManager_ = new TextNavigationManager(); + + /** * The desktop node. * @private {!chrome.automation.AutomationNode} */ @@ -232,6 +238,72 @@ } /** + * Moves the text caret to the beginning of the current node. + * @public + */ + jumpToBeginningOfText() { + this.textNavigationManager_.jumpToBeginning(); + } + + /** + * Moves the text caret to the end of the current node. + * @public + */ + jumpToEndOfText() { + this.textNavigationManager_.jumpToEnd(); + } + + /** + * Moves the text caret backward one character in the current + * node. + * @public + */ + moveBackwardOneCharOfText() { + this.textNavigationManager_.moveBackwardOneChar(); + } + + /** + * Moves the text caret backward one word in the current node. + * @public + */ + moveBackwardOneWordOfText() { + this.textNavigationManager_.moveBackwardOneWord(); + } + + /** + * Moves the text caret down one line in the current node. + * @public + */ + moveDownOneLineOfText() { + this.textNavigationManager_.moveDownOneLine(); + } + + /** + * Moves the text caret forward one character in the current + * node. + * @public + */ + moveForwardOneCharOfText() { + this.textNavigationManager_.moveForwardOneChar(); + } + + /** + * Moves the text caret forward one word in the current node. + * @public + */ + moveForwardOneWordOfText() { + this.textNavigationManager_.moveForwardOneWord(); + } + + /** + * Moves the text caret up one line in the current node. + * @public + */ + moveUpOneLineOfText() { + this.textNavigationManager_.moveUpOneLine(); + } + + /** * Perform the default action for the currently highlighted node. If the node * is the current scope, go back to the previous scope. If the node is a group * other than the current scope, go into that scope. If the node is @@ -247,6 +319,13 @@ if (!this.node_.role) return; + if (window.switchAccess.textEditingEnabled()) { + if (SwitchAccessPredicate.isTextInput(this.node_)) { + this.node_.focus(); + return; + } + } + if (this.textInputManager_.pressKey(this.node_)) { return; }
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd index f80a3094..b69f750 100644 --- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd
@@ -162,6 +162,30 @@ <message desc="The Switch Access action to open the Switch Access settings page. Should be short." name="IDS_SWITCH_ACCESS_SETTINGS_ACTION"> Settings </message> + <message desc="The Switch Access action for moving the text caret to the beginning of the text element." name="IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT"> + Jump to beginning + </message> + <message desc="The Switch Access action for moving the text caret to the end of the text element." name="IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT"> + Jump to end + </message> + <message desc="The Switch Access action for moving the text caret backward one character." name="IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT"> + Move backward one char + </message> + <message desc="The Switch Access action for moving the text caret backward one word." name="IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT"> + Move backward one word + </message> + <message desc="The Switch Access action for moving the text caret forward one character." name="IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT"> + Move forward one char + </message> + <message desc="The Switch Access action for moving the text caret forward one word." name="IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT"> + Move forward one word + </message> + <message desc="The Switch Access action for moving the text caret down one line." name="IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT"> + Move down one line + </message> + <message desc="The Switch Access action for moving the text caret up one line." name="IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT"> + Move up one line + </message> </messages> </release> </grit>
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT.png.sha1 new file mode 100644 index 0000000..3bbc42c --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_BEGINNING_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +e68ee6951b36fbe8e64d71db1a0ba9e7a0bdb490 \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT.png.sha1 new file mode 100644 index 0000000..acfcd4df --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_JUMP_TO_END_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +6824a4fdfc95468f05dde0020c28a853f5a67a70 \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT.png.sha1 new file mode 100644 index 0000000..0f2b1be --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_CHAR_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +d1834f2f0ba5afcd82c98d5c56c7745977b5faeb \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT.png.sha1 new file mode 100644 index 0000000..ffbb193b --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_BACKWARD_ONE_WORD_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +84dc7a4068ab23c21f69e1a7a4ee54b9712ada39 \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT.png.sha1 new file mode 100644 index 0000000..6404a3d --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_DOWN_ONE_LINE_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +46aa39047b892eafb7a60f143a62673505d168a9 \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT.png.sha1 new file mode 100644 index 0000000..7a794ba --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_CHAR_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +aafc234630449ed9a4cbac49938ea85147359c78 \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT.png.sha1 new file mode 100644 index 0000000..883c63b --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_FORWARD_ONE_WORD_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +fb106304128d1e93cf5c593ac8920cc3386ff8ad \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT.png.sha1 b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT.png.sha1 new file mode 100644 index 0000000..514b4a0 --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_grd/IDS_SWITCH_ACCESS_MOVE_UP_ONE_LINE_OF_TEXT.png.sha1
@@ -0,0 +1 @@ +a97cb50b5142d21a91e19f098715aa3820b47a00 \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access.js b/chrome/browser/resources/chromeos/switch_access/switch_access.js index a6127d5e..6a0395e 100644 --- a/chrome/browser/resources/chromeos/switch_access/switch_access.js +++ b/chrome/browser/resources/chromeos/switch_access/switch_access.js
@@ -54,6 +54,12 @@ */ this.navReadyCallback_ = null; + /** + * Feature flag controlling improvement of text input capabilities. + * @private {boolean} + */ + this.enableTextEditing_ = false; + this.init_(); } @@ -73,6 +79,11 @@ if (this.navReadyCallback_) this.navReadyCallback_(); }.bind(this)); + + chrome.commandLinePrivate.hasSwitch( + 'enable-experimental-accessibility-switch-access-text', (result) => { + this.enableTextEditing_ = result; + }); } /** @@ -122,6 +133,16 @@ } /** + * Returns whether or not the feature flag + * for text editing is enabled. + * @return {boolean} + * @public + */ + textEditingEnabled() { + return this.enableTextEditing_; + } + + /** * Return a list of the names of all user commands. * @override * @return {!Array<!SAConstants.Command>}
diff --git a/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js b/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js index 1420d6d9..4c9fd05 100644 --- a/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js +++ b/chrome/browser/resources/chromeos/switch_access/switch_access_constants.js
@@ -136,8 +136,24 @@ DICTATION: 'dictation', // Increment the value of an input field. INCREMENT: chrome.automation.ActionType.INCREMENT, + // Move text caret to the beginning of the text field. + JUMP_TO_BEGINNING_OF_TEXT: 'jumpToBeginningOfText', + // Move text caret to the end of the text field. + JUMP_TO_END_OF_TEXT: 'jumpToEndOfText', // Open and jump to the virtual keyboard KEYBOARD: 'keyboard', + // Move text caret one character backward. + MOVE_BACKWARD_ONE_CHAR_OF_TEXT: 'moveBackwardOneCharOfText', + // Move text caret one word backward. + MOVE_BACKWARD_ONE_WORD_OF_TEXT: 'moveBackwardOneWordOfText', + // Move text caret one line down. + MOVE_DOWN_ONE_LINE_OF_TEXT: 'moveDownOneLineOfText', + // Move text caret one character forward. + MOVE_FORWARD_ONE_CHAR_OF_TEXT: 'moveForwardOneCharOfText', + // Move text caret one word forward. + MOVE_FORWARD_ONE_WORD_OF_TEXT: 'moveForwardOneWordOfText', + // Move text caret one line up. + MOVE_UP_ONE_LINE_OF_TEXT: 'moveUpOneLineOfText', // Open and jump to the Switch Access settings in a new Chrome tab. OPTIONS: 'options', // Scroll the current element (or its ancestor) logically backwards. @@ -170,3 +186,18 @@ width: 0, height: 0 }; + +/** + * Defines the key codes of all key events to be sent. + * Currently used for text navigation actions. + * @enum {number} + * @const + */ +SAConstants.KeyCode = { + END: 35, + HOME: 36, + LEFT_ARROW: 37, + UP_ARROW: 38, + RIGHT_ARROW: 39, + DOWN_ARROW: 40 +}; \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/text_navigation_manager.js b/chrome/browser/resources/chromeos/switch_access/text_navigation_manager.js new file mode 100644 index 0000000..f8d47fd --- /dev/null +++ b/chrome/browser/resources/chromeos/switch_access/text_navigation_manager.js
@@ -0,0 +1,112 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Class to handle navigating text. Currently, only + * navigation of editable text fields is supported. + */ +class TextNavigationManager { + /** + * Jumps to the beginning of the text field (does nothing + * if already at the beginning). + * @public + */ + jumpToBeginning() { + this.simulateKeyPress_(SAConstants.KeyCode.HOME, {ctrl: true}); + } + + /** + * Jumps to the end of the text field (does nothing if + * already at the end). + * @public + */ + jumpToEnd() { + this.simulateKeyPress_(SAConstants.KeyCode.END, {ctrl: true}); + } + + /** + * Moves the text caret one character back (does nothing + * if there are no more characters preceding the current + * location of the caret). + * @public + */ + moveBackwardOneChar() { + this.simulateKeyPress_(SAConstants.KeyCode.LEFT_ARROW, {}); + } + + /** + * Moves the text caret one word backwards (does nothing + * if already at the beginning of the field). If the + * text caret is in the middle of a word, moves the caret + * to the beginning of that word. + * @public + */ + moveBackwardOneWord() { + this.simulateKeyPress_(SAConstants.KeyCode.LEFT_ARROW, {ctrl: true}); + } + + /** + * Moves the text caret one character forward (does nothing + * if there are no more characters following the current + * location of the caret). + * @public + */ + moveForwardOneChar() { + this.simulateKeyPress_(SAConstants.KeyCode.RIGHT_ARROW, {}); + } + + /** + * Moves the text caret one word forward (does nothing if + * already at the end of the field). If the text caret is + * in the middle of a word, moves the caret to the end of + * that word. + * @public + */ + moveForwardOneWord() { + this.simulateKeyPress_(SAConstants.KeyCode.RIGHT_ARROW, {ctrl: true}); + } + + /** + * Moves the text caret one line up (does nothing + * if there are no lines above the current location of + * the caret). + * @public + */ + moveUpOneLine() { + this.simulateKeyPress_(SAConstants.KeyCode.UP_ARROW, {}); + } + + /** + * Moves the text caret one line down (does nothing + * if there are no lines below the current location of + * the caret). + * @public + */ + moveDownOneLine() { + this.simulateKeyPress_(SAConstants.KeyCode.DOWN_ARROW, {}); + } + + /** + * Simulates a single key stroke with the given key code + * and keyboard modifiers (whether or not CTRL, ALT, SEARCH, + * SHIFT are being held). + * + * @param {number} keyCode + * @param {!chrome.accessibilityPrivate.SyntheticKeyboardModifiers} modifiers + * @private + */ + simulateKeyPress_(keyCode, modifiers) { + chrome.accessibilityPrivate.sendSyntheticKeyEvent({ + type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYDOWN, + keyCode: keyCode, + modifiers: modifiers + }); + + chrome.accessibilityPrivate.sendSyntheticKeyEvent({ + type: chrome.accessibilityPrivate.SyntheticKeyboardEventType.KEYUP, + keyCode: keyCode, + modifiers: modifiers + }); + } +} \ No newline at end of file
diff --git a/chrome/browser/resources/local_ntp/icons/colored_header.svg b/chrome/browser/resources/local_ntp/icons/colored_header.svg new file mode 100644 index 0000000..288f6f4 --- /dev/null +++ b/chrome/browser/resources/local_ntp/icons/colored_header.svg
@@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="130px" + height="40px" + viewBox="0 0 130 40" + version="1.1" + id="svg4765" + sodipodi:docname="colored-header.svg" + inkscape:version="0.92.3 (2405546, 2018-03-11)"> + <metadata + id="metadata4771"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title>ic-ntp-shortcuts-header</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs4769" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1297" + inkscape:window-height="688" + id="namedview4767" + showgrid="false" + inkscape:zoom="4.8" + inkscape:cx="76.144652" + inkscape:cy="32.314819" + inkscape:window-x="3486" + inkscape:window-y="298" + inkscape:window-maximized="0" + inkscape:current-layer="svg4765" /> + <!-- Generator: Sketch 54.1 (76490) - https://sketchapp.com --> + <title + id="title4758">ic-ntp-shortcuts-header</title> + <desc + id="desc4760">Created with Sketch.</desc> + <path + style="fill:#d93025;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="m 52.792125,16.638275 c -1.558053,-0.640709 -2.46799,-1.578762 -3.063032,-3.157678 -0.258437,-0.685749 -0.302859,-1.064041 -0.253341,-2.157386 0.07554,-1.6677974 0.544737,-2.7097496 1.692666,-3.7588922 1.12893,-1.0317787 2.113309,-1.3670063 3.799505,-1.2939114 1.164657,0.050487 1.439108,0.1180822 2.257734,0.5560648 1.700233,0.9096603 2.652276,2.4152882 2.778616,4.3942958 0.16603,2.600723 -1.339494,4.846853 -3.731181,5.566645 -1.067754,0.321347 -2.484458,0.260649 -3.480967,-0.149138 z m 3.677461,-2.238987 C 58.141804,13.055014 58.277858,10.477094 56.75087,9.0695662 55.705568,8.10604 54.548174,7.9476031 53.280665,8.5945264 c -0.664803,0.3393084 -0.94822,0.6565765 -1.321342,1.4791646 -0.598485,1.319424 -0.311237,3.055032 0.667322,4.032083 0.653851,0.652843 1.188222,0.836121 2.296145,0.787527 0.844457,-0.03704 1.066592,-0.107983 1.546796,-0.494013 z" + id="path4775" + inkscape:connector-curvature="0" /> + <path + style="fill:#d93025;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="m 93.243638,16.791187 c -1.322385,-0.431646 -2.605435,-1.58809 -3.170464,-2.857618 -0.443424,-0.996302 -0.537766,-3.114174 -0.186146,-4.1787327 0.459731,-1.3918707 1.289274,-2.403738 2.498628,-3.0477998 0.656316,-0.3495315 0.897078,-0.3922845 2.209709,-0.3923856 1.750154,-1.347e-4 2.263078,0.211741 3.365322,1.3901286 0.739022,0.7900748 1.5471,2.3122585 1.328555,2.5026125 -0.06993,0.06091 -1.701563,0.761437 -3.625851,1.556728 -1.924288,0.795291 -3.498705,1.501853 -3.498705,1.570138 0,0.285461 1.0896,1.299941 1.564555,1.456691 0.644907,0.212838 1.770254,0.209983 2.343655,-0.0059 0.240652,-0.09062 0.683662,-0.403876 0.984466,-0.696115 l 0.546916,-0.531343 0.815738,0.541619 c 0.448656,0.29789 0.815737,0.60109 0.815737,0.673777 0,0.244635 -1.458021,1.445674 -2.168455,1.786257 -0.873904,0.41895 -2.878317,0.540562 -3.82366,0.231989 z m 1.314899,-6.424686 c 1.257312,-0.5311184 2.17288,-1.0008387 2.17288,-1.1147688 0,-0.3474108 -0.956531,-0.9438591 -1.67065,-1.04174 -0.932951,-0.1278751 -1.864461,0.242135 -2.510919,0.997376 -0.449206,0.5247962 -0.827104,1.4859958 -0.827104,2.1037728 0,0.266282 -0.145753,0.314835 2.835793,-0.94464 z" + id="path4777" + inkscape:connector-curvature="0" /> + <path + style="fill:#1e8e3e;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="M 85.977501,8.5979031 V 0.64295185 h 1.104855 1.104854 V 8.5979031 16.552854 h -1.104854 -1.104855 z" + id="path4779" + inkscape:connector-curvature="0" /> + <path + style="fill:#1a73e8;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="m 76.853462,21.598658 c -0.343214,-0.141956 -0.909847,-0.462726 -1.259185,-0.712823 -0.645316,-0.461992 -1.625016,-1.763251 -1.533724,-2.037126 0.02754,-0.08262 0.437826,-0.306096 0.911747,-0.49661 0.822217,-0.330527 0.868306,-0.334119 1.006551,-0.07845 0.07968,0.147368 0.394194,0.508587 0.698913,0.80271 0.996155,0.961517 2.691209,1.078986 3.833419,0.26566 0.566545,-0.403415 0.98745,-1.36764 1.104998,-2.531367 0.109543,-1.08448 -3.39e-4,-1.224342 -0.555555,-0.707086 -0.643892,0.599876 -1.324944,0.81664 -2.55194,0.812228 -1.054528,-0.0038 -1.276472,-0.05685 -2.109672,-0.504311 -3.862174,-2.074153 -3.866917,-7.5505053 -0.0084,-9.6505955 1.098347,-0.5977958 2.689293,-0.6943715 3.771247,-0.2289274 0.41605,0.1789801 0.870894,0.451871 1.010762,0.6064241 0.358633,0.3962852 0.503271,0.3500329 0.503271,-0.1609361 V 6.5355084 h 1.031197 1.031198 v 5.2960496 c 0,3.363351 -0.0605,5.580934 -0.165782,6.076699 -0.358712,1.689134 -1.289475,2.954312 -2.611208,3.549392 -0.95478,0.429866 -3.221381,0.507672 -4.107878,0.141009 z m 3.008287,-6.822942 c 1.131717,-0.427593 1.868493,-1.669606 1.873289,-3.157878 0.0028,-0.86476 -0.0659,-1.157805 -0.425589,-1.8156234 -0.676343,-1.2369441 -1.920296,-1.8165584 -3.204597,-1.4931677 -1.451145,0.3654025 -2.321474,1.597539 -2.321474,3.2865421 0,1.537167 0.698039,2.683174 1.936465,3.179195 0.475504,0.190451 1.638963,0.190957 2.141906,9.28e-4 z" + id="path5324" + inkscape:connector-curvature="0" /> + <path + style="fill:#1a73e8;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="m 37.702732,16.572061 c -3.608224,-1.03865 -6.260841,-4.438713 -6.260841,-8.0249993 0,-2.2866039 0.798299,-4.1654259 2.489127,-5.8582377 3.117921,-3.12157795 7.698154,-3.49323118 11.097943,-0.9005189 l 0.704548,0.5372957 -0.760012,0.769572 -0.760013,0.769572 -0.462627,-0.352863 C 43.496412,3.317807 42.893279,2.9741312 42.410562,2.7481575 41.624111,2.3799977 41.37134,2.3372843 39.978457,2.3371791 c -1.500588,-1.131e-4 -1.59332,0.0191 -2.676931,0.5546499 -3.83901,1.8973419 -4.670343,7.0194203 -1.632356,10.057408 2.928466,2.928465 8.493062,1.988634 9.608529,-1.622829 0.16848,-0.545475 0.306327,-1.084227 0.306327,-1.197226 0,-0.16852 -0.50316,-0.2054536 -2.798964,-0.2054536 H 39.986098 V 8.818874 7.7140197 h 3.903818 3.903819 v 1.3185742 c 0,0.7252158 -0.07326,1.6698661 -0.162794,2.0992231 -0.548224,2.628905 -2.660726,4.780475 -5.382742,5.482292 -1.197723,0.308808 -3.397293,0.288461 -4.545467,-0.04205 z" + id="path5326" + inkscape:connector-curvature="0" /> + <path + style="fill:#f9ab00;fill-opacity:1;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="m 64.866306,16.647989 c -1.439659,-0.592221 -2.160555,-1.252384 -2.901767,-2.6573 -0.361404,-0.685017 -0.396953,-0.897517 -0.396953,-2.372851 0,-1.475786 0.03675,-1.6952858 0.41163,-2.4586817 0.535869,-1.0912251 1.754624,-2.2082083 2.866597,-2.6272209 0.69966,-0.2636455 1.07663,-0.309028 2.172388,-0.261528 1.164657,0.050487 1.439108,0.1180822 2.257735,0.5560648 1.687943,0.9030855 2.648433,2.4297048 2.782833,4.4230818 0.130768,1.939493 -0.710405,3.739671 -2.239559,4.79284 -1.466601,1.010086 -3.396096,1.246007 -4.952904,0.605595 z m 3.653558,-2.248701 c 1.16647,-0.93771 1.639777,-2.558997 1.164655,-3.989457 -0.890126,-2.6799185 -4.315102,-2.9848143 -5.575768,-0.4963623 -0.712317,1.4060553 -0.505574,3.0327553 0.523065,4.1155843 0.689046,0.725346 1.200834,0.914267 2.341252,0.864248 0.844457,-0.03704 1.066592,-0.107983 1.546796,-0.494013 z" + id="path5328" + inkscape:connector-curvature="0" /> + <path + style="fill:#dadce0;fill-opacity:0;stroke:#1a73e8;stroke-width:0.42092341;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="M 3.7588617,39.742214 C 2.7434871,39.468647 2.1711297,39.11218 1.3945889,38.269732 0.42844335,37.221588 0.13699821,36.450285 0.14665102,34.967094 c 0.006563,-1.008469 0.0770533,-1.395522 0.36218888,-1.988738 0.5191587,-1.080096 1.671775,-2.172239 2.697566,-2.556037 l 0.849882,-0.317981 61.1647091,0.03753 61.164713,0.03753 0.77843,0.410145 c 1.9957,1.051511 3.04206,3.123768 2.65669,5.261441 -0.29425,1.632204 -1.31274,2.917822 -2.90184,3.662936 l -0.82791,0.388197 -60.766989,0.02759 C 12.45324,39.953695 4.4533772,39.929334 3.7588617,39.742214 Z" + id="path5330" + inkscape:connector-curvature="0" /> + <path + style="fill:#dadce0;fill-opacity:1;stroke:none;stroke-width:0.59527564;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0" + d="M 3.5863687,39.610766 C 3.201034,39.47132 2.5199554,39.050116 2.072861,38.674757 -0.6345187,36.401774 -0.1604641,32.205634 2.9805331,30.640409 L 4.0562879,30.104338 H 64.980795 c 45.632965,0 61.127055,0.06068 61.731505,0.241783 0.44385,0.13298 1.17305,0.555106 1.62044,0.938057 2.8374,2.428712 1.9498,7.048709 -1.59742,8.314586 -1.09987,0.392503 -122.0649315,0.404292 -123.1489513,0.012 z" + id="path5391" + inkscape:connector-curvature="0" /> +</svg>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css index 4e4a88ef..cdeab31 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.css +++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -1158,6 +1158,15 @@ width: 130px; } +.mini-header-colorful { + background-image: url(icons/colored_header.svg); + background-position: center; + background-repeat: no-repeat; + background-size: 100%; + height: 40px; + width: 130px; +} + .mini-shortcuts { -webkit-mask-image: url(icons/shortcut-circles.svg); -webkit-mask-repeat: no-repeat; @@ -1178,7 +1187,8 @@ padding-top: 32px; } -#backgrounds-default:not(.selected) .mini-header { +#backgrounds-default:not(.selected) .mini-header, +#backgrounds-default:not(.selected) .mini-header-colorful { height: 48px; width: 156px; }
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html index 3964a81..9f2e45da 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.html +++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -224,7 +224,7 @@ <div id="backgrounds-default" class="bg-sel-tile-bg"> <div id="backgrounds-default-icon" class="bg-sel-tile" tabindex="-1"> <div class="mini-page"> - <div class="mini-header"></div> + <div class="mini-header-colorful"></div> <div class="mini-shortcuts"></div> </div> </div>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html index f6f7a00..c79e375 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
@@ -23,7 +23,7 @@ } </style> <div class="settings-box first"> - <div class="start">$i18n{fontSize}</div> + <div class="start settings-box-text">$i18n{fontSize}</div> <settings-slider id="sizeSlider" pref="{{prefs.webkit.webprefs.default_font_size}}" ticks="[[fontSizeRange_]]" @@ -31,7 +31,7 @@ </settings-slider> </div> <div class="settings-box"> - <div class="start">$i18n{minimumFont}</div> + <div class="start settings-box-text">$i18n{minimumFont}</div> <div id="minimumSize"> <settings-slider pref="{{prefs.webkit.webprefs.minimum_font_size}}" ticks="[[minimumFontSizeRange_]]" label-min="$i18n{tiny}" @@ -59,7 +59,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> </div> - <div class="list-item" + <div class="list-item settings-box-text" style=" font-size:[[prefs.webkit.webprefs.default_font_size.value]]px; font-family: @@ -80,7 +80,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> </div> - <div class="list-item" + <div class="list-item settings-box-text" style=" font-size:[[prefs.webkit.webprefs.default_font_size.value]]px; font-family: @@ -101,7 +101,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> </div> - <div class="list-item" + <div class="list-item settings-box-text" style=" font-size:[[prefs.webkit.webprefs.default_font_size.value]]px; font-family: @@ -122,7 +122,7 @@ menu-options="[[fontOptions_]]"> </settings-dropdown-menu> </div> - <div class="list-item" + <div class="list-item settings-box-text" style=" font-size: [[prefs.webkit.webprefs.default_fixed_font_size.value]]px;
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html index dbf3fc4..9440932 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.html
@@ -46,6 +46,9 @@ z-index: 2; --cr-toolbar-left-spacer-width: var(--settings-menu-width); --cr-toolbar-center-basis: var(--settings-main-basis); + --cr-toolbar-search-field-background: var(--google-grey-refresh-100); + --cr-toolbar-search-field-border-radius: 4px; + --cr-toolbar-search-field-input-color: var(--google-grey-refresh-700); } #cr-container-shadow-top {
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer.cc b/chrome/browser/safe_browsing/download_protection/file_analyzer.cc index bd7b9db7..675b6c8 100644 --- a/chrome/browser/safe_browsing/download_protection/file_analyzer.cc +++ b/chrome/browser/safe_browsing/download_protection/file_analyzer.cc
@@ -69,7 +69,7 @@ } // namespace -FileAnalyzer::Results::Results() : file_count(0), directory_count(0) {} +FileAnalyzer::Results::Results() = default; FileAnalyzer::Results::~Results() {} FileAnalyzer::Results::Results(const FileAnalyzer::Results& other) = default;
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer.h b/chrome/browser/safe_browsing/download_protection/file_analyzer.h index 02ca9ba4..c66100b4 100644 --- a/chrome/browser/safe_browsing/download_protection/file_analyzer.h +++ b/chrome/browser/safe_browsing/download_protection/file_analyzer.h
@@ -46,11 +46,11 @@ // For archive files, whether the archive contains an executable. Has // unspecified contents for non-archive files. - bool archived_executable; + bool archived_executable = false; // For archive files, whether the archive contains an archive. Has // unspecified contents for non-archive files. - bool archived_archive; + bool archived_archive = false; // For archive files, the features extracted from each contained // archive/binary. @@ -74,10 +74,10 @@ #endif // For archive files, the number of contained files. - int file_count; + int file_count = 0; // For archive files, the number of contained directories. - int directory_count; + int directory_count = 0; }; explicit FileAnalyzer(
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service.cc b/chrome/browser/search/chrome_colors/chrome_colors_service.cc index f5ad71bc..c8890042 100644 --- a/chrome/browser/search/chrome_colors/chrome_colors_service.cc +++ b/chrome/browser/search/chrome_colors/chrome_colors_service.cc
@@ -13,27 +13,40 @@ ChromeColorsService::~ChromeColorsService() = default; -void ChromeColorsService::ApplyDefaultTheme() { - if (revert_theme_changes_.is_null()) - revert_theme_changes_ = theme_service_->GetRevertThemeCallback(); +void ChromeColorsService::ApplyDefaultTheme(content::WebContents* tab) { + SaveThemeRevertState(tab); theme_service_->UseDefaultTheme(); } -void ChromeColorsService::ApplyAutogeneratedTheme(SkColor color) { - if (revert_theme_changes_.is_null()) - revert_theme_changes_ = theme_service_->GetRevertThemeCallback(); +void ChromeColorsService::ApplyAutogeneratedTheme(SkColor color, + content::WebContents* tab) { + SaveThemeRevertState(tab); theme_service_->BuildFromColor(color); } +void ChromeColorsService::RevertThemeChangesForTab(content::WebContents* tab) { + if (dialog_tab_ == tab) + RevertThemeChanges(); +} + void ChromeColorsService::RevertThemeChanges() { if (!revert_theme_changes_.is_null()) { std::move(revert_theme_changes_).Run(); - revert_theme_changes_.Reset(); + ConfirmThemeChanges(); } } void ChromeColorsService::ConfirmThemeChanges() { revert_theme_changes_.Reset(); + dialog_tab_ = nullptr; +} + +void ChromeColorsService::SaveThemeRevertState(content::WebContents* tab) { + // TODO(crbug.com/980745): Support theme reverting for multiple tabs. + if (revert_theme_changes_.is_null()) { + revert_theme_changes_ = theme_service_->GetRevertThemeCallback(); + dialog_tab_ = tab; + } } void ChromeColorsService::Shutdown() {}
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service.h b/chrome/browser/search/chrome_colors/chrome_colors_service.h index 8fb73d9..55c71a4 100644 --- a/chrome/browser/search/chrome_colors/chrome_colors_service.h +++ b/chrome/browser/search/chrome_colors/chrome_colors_service.h
@@ -8,6 +8,7 @@ #include "base/callback.h" #include "chrome/browser/themes/theme_service.h" #include "components/keyed_service/core/keyed_service.h" +#include "content/public/browser/web_contents.h" #include "third_party/skia/include/core/SkColor.h" class TestChromeColorsService; @@ -23,14 +24,18 @@ explicit ChromeColorsService(Profile* profile); ~ChromeColorsService() override; - // Applies a theme that can be reverted. Saves the previous theme state if - // needed. - void ApplyDefaultTheme(); - void ApplyAutogeneratedTheme(SkColor color); + // Applies a theme that can be reverted by saving the previous theme state and + // the |tab| that changes are made from. + void ApplyDefaultTheme(content::WebContents* tab); + void ApplyAutogeneratedTheme(SkColor color, content::WebContents* tab); - // Reverts to the previous theme state before Apply* was used. + // Reverts to the previous theme state before first Apply* was used. void RevertThemeChanges(); + // Same as |RevertThemeChanges| but only reverts theme changes if they were + // made from the same tab. Used for reverting changes from a closing NTP. + void RevertThemeChangesForTab(content::WebContents* tab); + // Confirms current theme changes. Since the theme is already installed by // Apply*, this only clears the previously saved state. void ConfirmThemeChanges(); @@ -38,14 +43,23 @@ private: friend class ::TestChromeColorsService; + // Saves the necessary state(revert callback and the current tab) for + // performing theme change revert. Saves the state only if it is not set. + void SaveThemeRevertState(content::WebContents* tab); + // KeyedService implementation: void Shutdown() override; ThemeService* const theme_service_; + // The first tab that used Apply* and hasn't Confirm/Revert the changes. + content::WebContents* dialog_tab_ = nullptr; + // Callback that will revert the theme to the state it was at the time of this // callback's creation. base::OnceClosure revert_theme_changes_; + + DISALLOW_COPY_AND_ASSIGN(ChromeColorsService); }; } // namespace chrome_colors
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc b/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc index 5043a01..78a89008 100644 --- a/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc +++ b/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/test/base/browser_with_test_window_test.h" +#include "content/public/test/web_contents_tester.h" #include "testing/gtest/include/gtest/gtest.h" class TestChromeColorsService : public BrowserWithTestWindowTest { @@ -17,6 +18,9 @@ BrowserWithTestWindowTest::SetUp(); chrome_colors_service_ = chrome_colors::ChromeColorsFactory::GetForProfile(profile()); + + AddTab(browser(), GURL("chrome://newtab")); + tab_ = browser()->tab_strip_model()->GetActiveWebContents(); } bool HasThemeRevertCallback() { @@ -24,6 +28,7 @@ } chrome_colors::ChromeColorsService* chrome_colors_service_; + content::WebContents* tab_; }; TEST_F(TestChromeColorsService, ApplyAndConfirmAutogeneratedTheme) { @@ -31,12 +36,12 @@ ASSERT_TRUE(theme_service->UsingDefaultTheme()); SkColor theme_color1 = SkColorSetRGB(100, 0, 200); - chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1); + chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1, tab_); EXPECT_TRUE(theme_service->UsingAutogenerated()); EXPECT_TRUE(HasThemeRevertCallback()); SkColor theme_color2 = SkColorSetRGB(100, 0, 200); - chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2); + chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2, tab_); EXPECT_TRUE(theme_service->UsingAutogenerated()); EXPECT_TRUE(HasThemeRevertCallback()); @@ -52,12 +57,12 @@ ASSERT_TRUE(theme_service->UsingDefaultTheme()); SkColor theme_color1 = SkColorSetRGB(100, 0, 200); - chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1); + chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1, tab_); EXPECT_TRUE(theme_service->UsingAutogenerated()); EXPECT_TRUE(HasThemeRevertCallback()); SkColor theme_color2 = SkColorSetRGB(100, 0, 200); - chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2); + chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2, tab_); EXPECT_TRUE(theme_service->UsingAutogenerated()); EXPECT_TRUE(HasThemeRevertCallback()); @@ -75,7 +80,7 @@ ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor()); SkColor new_theme_color = SkColorSetRGB(100, 0, 200); - chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color); + chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color, tab_); EXPECT_EQ(new_theme_color, theme_service->GetThemeColor()); EXPECT_TRUE(HasThemeRevertCallback()); @@ -93,7 +98,7 @@ ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor()); SkColor new_theme_color = SkColorSetRGB(100, 0, 200); - chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color); + chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color, tab_); EXPECT_EQ(new_theme_color, theme_service->GetThemeColor()); EXPECT_TRUE(HasThemeRevertCallback()); @@ -110,7 +115,7 @@ ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor()); ASSERT_FALSE(theme_service->UsingDefaultTheme()); - chrome_colors_service_->ApplyDefaultTheme(); + chrome_colors_service_->ApplyDefaultTheme(tab_); EXPECT_TRUE(theme_service->UsingDefaultTheme()); EXPECT_TRUE(HasThemeRevertCallback()); @@ -127,7 +132,7 @@ ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor()); ASSERT_FALSE(theme_service->UsingDefaultTheme()); - chrome_colors_service_->ApplyDefaultTheme(); + chrome_colors_service_->ApplyDefaultTheme(tab_); EXPECT_TRUE(theme_service->UsingDefaultTheme()); EXPECT_TRUE(HasThemeRevertCallback()); @@ -136,3 +141,29 @@ EXPECT_EQ(prev_theme_color, theme_service->GetThemeColor()); EXPECT_FALSE(HasThemeRevertCallback()); } + +TEST_F(TestChromeColorsService, RevertThemeChangesForTab) { + ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile()); + ASSERT_TRUE(theme_service->UsingDefaultTheme()); + + SkColor theme_color = SkColorSetRGB(100, 0, 200); + chrome_colors_service_->ApplyAutogeneratedTheme(theme_color, tab_); + EXPECT_TRUE(theme_service->UsingAutogenerated()); + EXPECT_TRUE(HasThemeRevertCallback()); + + chrome_colors_service_->RevertThemeChangesForTab(nullptr); + EXPECT_TRUE(theme_service->UsingAutogenerated()); + EXPECT_TRUE(HasThemeRevertCallback()); + + AddTab(browser(), GURL("chrome://newtab")); + content::WebContents* second_tab = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_NE(tab_, second_tab); + chrome_colors_service_->RevertThemeChangesForTab(second_tab); + EXPECT_TRUE(theme_service->UsingAutogenerated()); + EXPECT_TRUE(HasThemeRevertCallback()); + + chrome_colors_service_->RevertThemeChangesForTab(tab_); + EXPECT_FALSE(theme_service->UsingAutogenerated()); + EXPECT_FALSE(HasThemeRevertCallback()); +}
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc index 04dbee0..a53102f5 100644 --- a/chrome/browser/sessions/session_restore.cc +++ b/chrome/browser/sessions/session_restore.cc
@@ -17,6 +17,7 @@ #include "base/callback.h" #include "base/command_line.h" #include "base/debug/alias.h" +#include "base/feature_list.h" #include "base/location.h" #include "base/macros.h" #include "base/metrics/field_trial.h" @@ -46,6 +47,7 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/startup/startup_browser_creator.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/common/extensions/extension_metrics.h" #include "chrome/common/url_constants.h" #include "components/keep_alive_registry/keep_alive_types.h" @@ -578,16 +580,20 @@ ->RecreateSessionStorage(tab.session_storage_persistent_id); } + // Apply the stored group if tab groups are enabled. + base::Optional<base::Token> group; + if (base::FeatureList::IsEnabled(features::kTabGroups)) + group = tab.group; + WebContents* web_contents = chrome::AddRestoredTab( browser, tab.navigations, tab_index, selected_index, - tab.extension_app_id, tab.group, is_selected_tab, tab.pinned, true, + tab.extension_app_id, group, is_selected_tab, tab.pinned, true, last_active_time, session_storage_namespace.get(), tab.user_agent_override, true /* from_session_restore */); DCHECK(web_contents); RestoredTab restored_tab(web_contents, is_selected_tab, - tab.extension_app_id.empty(), tab.pinned, - tab.group); + tab.extension_app_id.empty(), tab.pinned, group); created_contents->push_back(restored_tab); // If this isn't the selected tab, there's nothing else to do.
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index 3d9bcef0..e936f2a 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -17,6 +17,7 @@ #include "base/process/launch.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind_test_util.h" +#include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "base/time/time.h" #include "build/build_config.h" @@ -42,6 +43,7 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_group_id.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" @@ -947,6 +949,9 @@ } // namespace IN_PROC_BROWSER_TEST_F(SessionRestoreTest, TabsWithGroups) { + base::test::ScopedFeatureList feature_override; + feature_override.InitAndEnableFeature(features::kTabGroups); + constexpr int kNumTabs = 6; const std::array<base::Optional<int>, kNumTabs> group_spec = { 0, 0, base::nullopt, base::nullopt, 1, 1}; @@ -973,6 +978,9 @@ // Test that tab groups are restored correctly after the command set is rebuilt // from the browser state. IN_PROC_BROWSER_TEST_F(SessionRestoreTest, TabsWithGroupsCommandReset) { + base::test::ScopedFeatureList feature_override; + feature_override.InitAndEnableFeature(features::kTabGroups); + constexpr int kNumTabs = 6; const std::array<base::Optional<int>, kNumTabs> group_spec = { 0, 0, base::nullopt, base::nullopt, 1, 1}; @@ -1002,6 +1010,23 @@ EXPECT_EQ(groups, GetTabGroups(new_browser->tab_strip_model())); } +// Ensure tab groups aren't restored if |features::kTabGroups| is disabled. +// Regression test for crbug.com/983962. +IN_PROC_BROWSER_TEST_F(SessionRestoreTest, + GroupsNotRestoredWhenFeatureDisabled) { + auto feature_override = std::make_unique<base::test::ScopedFeatureList>(); + feature_override->InitAndEnableFeature(features::kTabGroups); + + ASSERT_EQ(1, browser()->tab_strip_model()->count()); + browser()->tab_strip_model()->AddToNewGroup({0}); + + feature_override = std::make_unique<base::test::ScopedFeatureList>(); + feature_override->InitAndDisableFeature(features::kTabGroups); + Browser* new_browser = QuitBrowserAndRestore(browser(), 1); + ASSERT_EQ(base::nullopt, + new_browser->tab_strip_model()->GetTabGroupForTab(0)); +} + IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreAfterDelete) { ui_test_utils::NavigateToURL(browser(), url1_); ui_test_utils::NavigateToURL(browser(), url2_);
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc index fced7a7..edbf923 100644 --- a/chrome/browser/sessions/tab_restore_browsertest.cc +++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "base/test/test_timeouts.h" #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" @@ -27,6 +28,7 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/find_bar/find_notification_details.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" @@ -884,6 +886,9 @@ } IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreGroupedTab) { + base::test::ScopedFeatureList feature_override; + feature_override.InitAndEnableFeature(features::kTabGroups); + const int tab_count = AddSomeTabs(browser(), 1); ASSERT_LE(2, tab_count); @@ -904,6 +909,9 @@ } IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreWindowWithGroupedTabs) { + base::test::ScopedFeatureList feature_override; + feature_override.InitAndEnableFeature(features::kTabGroups); + ui_test_utils::NavigateToURLWithDisposition( browser(), GURL(chrome::kChromeUINewTabURL), WindowOpenDisposition::NEW_WINDOW, @@ -933,3 +941,30 @@ base::make_optional(group2), restored_window->tab_strip_model()->GetTabGroupForTab(tab_count - 1)); } + +// Ensure tab groups aren't restored if |features::kTabGroups| is disabled. +// Regression test for crbug.com/983962. +IN_PROC_BROWSER_TEST_F(TabRestoreTest, GroupsNotRestoredWhenFeatureDisabled) { + auto feature_override = std::make_unique<base::test::ScopedFeatureList>(); + feature_override->InitAndEnableFeature(features::kTabGroups); + + ui_test_utils::NavigateToURLWithDisposition( + browser(), GURL(chrome::kChromeUINewTabURL), + WindowOpenDisposition::NEW_WINDOW, + ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); + ASSERT_EQ(2u, active_browser_list_->size()); + + browser()->tab_strip_model()->AddToNewGroup({0}); + CloseBrowserSynchronously(browser()); + ASSERT_EQ(1u, active_browser_list_->size()); + + feature_override = std::make_unique<base::test::ScopedFeatureList>(); + feature_override->InitAndDisableFeature(features::kTabGroups); + + chrome::RestoreTab(GetBrowser(0)); + ASSERT_EQ(2u, active_browser_list_->size()); + + Browser* restored_window = GetBrowser(1); + ASSERT_EQ(base::nullopt, + restored_window->tab_strip_model()->GetTabGroupForTab(0)); +}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_constants.h b/chrome/browser/sharing/click_to_call/click_to_call_constants.h index e1304af0..88200c00 100644 --- a/chrome/browser/sharing/click_to_call/click_to_call_constants.h +++ b/chrome/browser/sharing/click_to_call/click_to_call_constants.h
@@ -12,4 +12,14 @@ constexpr base::TimeDelta kSharingClickToCallMessageTTL = base::TimeDelta::FromMinutes(10); +// Maximum number of devices to be shown in dialog and context menu. +constexpr int kMaxDevicesShown = 10; + +// Command id for first device shown in submenu. +constexpr int kSubMenuFirstDeviceCommandId = 2150; + +// Command id for last device shown in submenu. +constexpr int kSubMenuLastDeviceCommandId = + kSubMenuFirstDeviceCommandId + kMaxDevicesShown - 1; + #endif // CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONSTANTS_H_
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.cc b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.cc new file mode 100644 index 0000000..67c4499 --- /dev/null +++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.cc
@@ -0,0 +1,164 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h" + +#include "base/bind.h" +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" +#include "chrome/app/chrome_command_ids.h" +#include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" +#include "chrome/browser/sharing/click_to_call/click_to_call_constants.h" +#include "chrome/browser/sharing/click_to_call/feature.h" +#include "chrome/browser/sharing/sharing_service.h" +#include "chrome/browser/sharing/sharing_service_factory.h" +#include "chrome/grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/color_palette.h" +#include "ui/gfx/paint_vector_icon.h" +#include "ui/native_theme/native_theme.h" +#include "ui/views/controls/menu/menu_config.h" +#include "url/url_constants.h" + +using SharingMessage = chrome_browser_sharing::SharingMessage; + +ClickToCallContextMenuObserver::SubMenuDelegate::SubMenuDelegate( + ClickToCallContextMenuObserver* parent) + : parent_(parent) {} + +ClickToCallContextMenuObserver::SubMenuDelegate::~SubMenuDelegate() = default; + +bool ClickToCallContextMenuObserver::SubMenuDelegate::IsCommandIdEnabled( + int command_id) const { + // All supported commands are enabled in sub menu. + return true; +} + +void ClickToCallContextMenuObserver::SubMenuDelegate::ExecuteCommand( + int command_id, + int event_flags) { + if (command_id < kSubMenuFirstDeviceCommandId || + command_id > kSubMenuLastDeviceCommandId) + return; + int device_index = command_id - kSubMenuFirstDeviceCommandId; + parent_->SendClickToCallMessage(device_index); +} + +ClickToCallContextMenuObserver::ClickToCallContextMenuObserver( + RenderViewContextMenuProxy* proxy) + : proxy_(proxy), + sharing_service_(SharingServiceFactory::GetForBrowserContext( + proxy_->GetBrowserContext())) {} + +ClickToCallContextMenuObserver::~ClickToCallContextMenuObserver() = default; + +void ClickToCallContextMenuObserver::InitMenu( + const content::ContextMenuParams& params) { + url_ = params.link_url; + devices_ = sharing_service_->GetDeviceCandidates( + static_cast<int>(SharingDeviceCapability::kTelephony)); + if (devices_.empty()) + return; + + proxy_->AddSeparator(); + if (devices_.size() == 1) { +#if defined(OS_MACOSX) + proxy_->AddMenuItem( + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, + l10n_util::GetStringFUTF16( + IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, + base::UTF8ToUTF16(devices_[0].human_readable_name()))); +#else + proxy_->AddMenuItemWithIcon( + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, + l10n_util::GetStringFUTF16( + IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, + base::UTF8ToUTF16(devices_[0].human_readable_name())), + GetContextMenuIcon()); +#endif + } else { + BuildSubMenu(); +#if defined(OS_MACOSX) + proxy_->AddSubMenu( + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, + l10n_util::GetStringUTF16( + IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES), + sub_menu_model_.get()); +#else + proxy_->AddSubMenuWithStringIdAndIcon( + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, + IDS_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, + sub_menu_model_.get(), GetContextMenuIcon()); +#endif + } +} + +void ClickToCallContextMenuObserver::BuildSubMenu() { + sub_menu_model_ = std::make_unique<ui::SimpleMenuModel>(&sub_menu_delegate_); + + int command_id = kSubMenuFirstDeviceCommandId; + for (const auto& device : devices_) { + if (command_id > kSubMenuLastDeviceCommandId) + break; + sub_menu_model_->AddItem(command_id++, + base::UTF8ToUTF16(device.human_readable_name())); + } +} + +bool ClickToCallContextMenuObserver::IsCommandIdSupported(int command_id) { + if (devices_.empty()) + return false; + + if (devices_.size() == 1) { + return command_id == + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE; + } else { + return command_id == + IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES; + } +} + +bool ClickToCallContextMenuObserver::IsCommandIdEnabled(int command_id) { + // All supported commands are enabled. + return true; +} + +void ClickToCallContextMenuObserver::ExecuteCommand(int command_id) { + if (command_id == IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE) { + DCHECK(devices_.size() == 1); + SendClickToCallMessage(0); + } +} + +void ClickToCallContextMenuObserver::SendClickToCallMessage( + int chosen_device_index) { + if (chosen_device_index >= static_cast<int>(devices_.size())) + return; + + SharingMessage sharing_message; + sharing_message.mutable_click_to_call_message()->set_phone_number( + url_.GetContent()); + + sharing_service_->SendMessageToDevice( + devices_[chosen_device_index].guid(), kSharingClickToCallMessageTTL, + sharing_message, + base::BindOnce(&ClickToCallContextMenuObserver::OnMessageSent, + AsWeakPtr())); +} + +void ClickToCallContextMenuObserver::OnMessageSent( + base::Optional<std::string> message_id) const { + // TODO(himanshujaju) Add metrics. +} + +gfx::ImageSkia ClickToCallContextMenuObserver::GetContextMenuIcon() const { + bool dark_mode_enabled = + ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeEnabled(); + const gfx::VectorIcon* vector_icon = &kHardwareSmartphoneIcon; + const views::MenuConfig& menu_config = views::MenuConfig::instance(); + return gfx::CreateVectorIcon( + *vector_icon, menu_config.touchable_icon_size, + dark_mode_enabled ? gfx::kGoogleGrey500 : gfx::kChromeIconGrey); +}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h new file mode 100644 index 0000000..44d622a6 --- /dev/null +++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h
@@ -0,0 +1,87 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONTEXT_MENU_OBSERVER_H_ +#define CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONTEXT_MENU_OBSERVER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/gtest_prod_util.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/optional.h" +#include "chrome/browser/sharing/sharing_device_info.h" +#include "components/renderer_context_menu/render_view_context_menu_observer.h" +#include "ui/base/models/simple_menu_model.h" +#include "url/gurl.h" + +namespace gfx { +class ImageSkia; +} + +class RenderViewContextMenuProxy; + +class SharingService; + +class ClickToCallContextMenuObserver + : public RenderViewContextMenuObserver, + public base::SupportsWeakPtr<ClickToCallContextMenuObserver> { + public: + class SubMenuDelegate : public ui::SimpleMenuModel::Delegate { + public: + explicit SubMenuDelegate(ClickToCallContextMenuObserver* parent); + ~SubMenuDelegate() override; + + bool IsCommandIdEnabled(int command_id) const override; + void ExecuteCommand(int command_id, int event_flags) override; + + private: + ClickToCallContextMenuObserver* const parent_; + + DISALLOW_COPY_AND_ASSIGN(SubMenuDelegate); + }; + + explicit ClickToCallContextMenuObserver(RenderViewContextMenuProxy* proxy); + ~ClickToCallContextMenuObserver() override; + + // RenderViewContextMenuObserver implementation. + void InitMenu(const content::ContextMenuParams& params) override; + bool IsCommandIdSupported(int command_id) override; + bool IsCommandIdEnabled(int command_id) override; + void ExecuteCommand(int command_id) override; + + private: + FRIEND_TEST_ALL_PREFIXES(ClickToCallContextMenuObserverTest, + SingleDevice_ShowMenu); + FRIEND_TEST_ALL_PREFIXES(ClickToCallContextMenuObserverTest, + MultipleDevices_ShowMenu); + FRIEND_TEST_ALL_PREFIXES(ClickToCallContextMenuObserverTest, + MultipleDevices_MoreThanMax_ShowMenu); + + void BuildSubMenu(); + + void SendClickToCallMessage(int chosen_device_index); + + void OnMessageSent(base::Optional<std::string> message_id) const; + + gfx::ImageSkia GetContextMenuIcon() const; + + RenderViewContextMenuProxy* proxy_ = nullptr; + + SharingService* sharing_service_ = nullptr; + + SubMenuDelegate sub_menu_delegate_{this}; + + GURL url_; + + std::vector<SharingDeviceInfo> devices_; + + std::unique_ptr<ui::SimpleMenuModel> sub_menu_model_; + + DISALLOW_COPY_AND_ASSIGN(ClickToCallContextMenuObserver); +}; + +#endif // CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_CONTEXT_MENU_OBSERVER_H_
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc new file mode 100644 index 0000000..b1ef91a7 --- /dev/null +++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc
@@ -0,0 +1,263 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h" + +#include <memory> +#include <string> +#include <vector> + +#include "base/macros.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" +#include "chrome/app/chrome_command_ids.h" +#include "chrome/browser/renderer_context_menu/mock_render_view_context_menu.h" +#include "chrome/browser/sharing/click_to_call/click_to_call_constants.h" +#include "chrome/browser/sharing/click_to_call/feature.h" +#include "chrome/browser/sharing/sharing_device_info.h" +#include "chrome/browser/sharing/sharing_fcm_handler.h" +#include "chrome/browser/sharing/sharing_fcm_sender.h" +#include "chrome/browser/sharing/sharing_service.h" +#include "chrome/browser/sharing/sharing_service_factory.h" +#include "chrome/browser/sharing/sharing_sync_preference.h" +#include "chrome/browser/sharing/vapid_key_manager.h" +#include "content/public/common/context_menu_params.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +using ::testing::_; +using ::testing::ByMove; +using ::testing::Eq; +using ::testing::NiceMock; +using ::testing::Return; + +using SharingMessage = chrome_browser_sharing::SharingMessage; + +namespace { + +const char kTelUrl[] = "tel:+9876543210"; + +constexpr int kSeparatorCommandId = -1; + +class MockSharingService : public SharingService { + public: + explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler) + : SharingService(nullptr, + nullptr, + nullptr, + nullptr, + std::move(fcm_handler), + nullptr, + nullptr, + nullptr) {} + + ~MockSharingService() override = default; + + MOCK_CONST_METHOD1(GetDeviceCandidates, + std::vector<SharingDeviceInfo>(int required_capabilities)); + + MOCK_METHOD4(SendMessageToDevice, + void(const std::string& device_guid, + base::TimeDelta time_to_live, + SharingMessage message, + SharingService::SendMessageCallback callback)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockSharingService); +}; + +class ClickToCallContextMenuObserverTest : public testing::Test { + public: + ClickToCallContextMenuObserverTest() = default; + + ~ClickToCallContextMenuObserverTest() override = default; + + void SetUp() override { + SharingServiceFactory::GetInstance()->SetTestingFactory( + menu_.GetBrowserContext(), + base::BindRepeating([](content::BrowserContext* context) + -> std::unique_ptr<KeyedService> { + return std::make_unique<NiceMock<MockSharingService>>( + std::make_unique<SharingFCMHandler>(nullptr, nullptr)); + })); + observer_ = std::make_unique<ClickToCallContextMenuObserver>(&menu_); + menu_.SetObserver(observer_.get()); + } + + void InitMenu(const GURL& url) { + content::ContextMenuParams params; + params.link_url = url; + observer_->InitMenu(params); + sharing_message.mutable_click_to_call_message()->set_phone_number( + url.GetContent()); + } + + std::vector<SharingDeviceInfo> CreateMockDevices(int count) { + std::vector<SharingDeviceInfo> devices; + for (int i = 0; i < count; i++) { + devices.emplace_back( + base::StrCat({"guid", base::NumberToString(i)}), + base::StrCat({"name", base::NumberToString(i)}), + sync_pb::SyncEnums::TYPE_PHONE, base::Time::Now(), + static_cast<int>(SharingDeviceCapability::kTelephony)); + } + return devices; + } + + protected: + NiceMock<MockSharingService>* service() { + return static_cast<NiceMock<MockSharingService>*>( + SharingServiceFactory::GetForBrowserContext(menu_.GetBrowserContext())); + } + + content::TestBrowserThreadBundle thread_bundle_; + MockRenderViewContextMenu menu_{/* incognito= */ false}; + std::unique_ptr<ClickToCallContextMenuObserver> observer_; + SharingMessage sharing_message; + + DISALLOW_COPY_AND_ASSIGN(ClickToCallContextMenuObserverTest); +}; + +} // namespace + +MATCHER_P(ProtoEquals, message, "") { + std::string expected_serialized, actual_serialized; + message.SerializeToString(&expected_serialized); + arg.SerializeToString(&actual_serialized); + return expected_serialized == actual_serialized; +} + +TEST_F(ClickToCallContextMenuObserverTest, NoDevices_DoNotShowMenu) { + auto devices = CreateMockDevices(0); + + EXPECT_CALL(*service(), GetDeviceCandidates(_)) + .WillOnce(Return(ByMove(std::move(devices)))); + + InitMenu(GURL(kTelUrl)); + + EXPECT_EQ(0U, menu_.GetMenuSize()); +} + +TEST_F(ClickToCallContextMenuObserverTest, SingleDevice_ShowMenu) { + auto devices = CreateMockDevices(1); + auto guid = devices[0].guid(); + + EXPECT_CALL(*service(), GetDeviceCandidates(_)) + .WillOnce(Return(ByMove(std::move(devices)))); + + InitMenu(GURL(kTelUrl)); + + // The first item is a separator and the second item is the device. + EXPECT_EQ(2U, menu_.GetMenuSize()); + + // Assert item ordering. + MockRenderViewContextMenu::MockMenuItem item; + ASSERT_TRUE(menu_.GetMenuItem(0, &item)); + EXPECT_EQ(kSeparatorCommandId, item.command_id); + + ASSERT_TRUE(menu_.GetMenuItem(1, &item)); + EXPECT_EQ(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, + item.command_id); + + // Emulate click on the device. + EXPECT_CALL(*service(), + SendMessageToDevice(Eq(guid), Eq(kSharingClickToCallMessageTTL), + ProtoEquals(sharing_message), _)) + .Times(1); + menu_.ExecuteCommand(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE, + 0); +} + +TEST_F(ClickToCallContextMenuObserverTest, MultipleDevices_ShowMenu) { + constexpr int device_count = 3; + auto devices = CreateMockDevices(device_count); + std::vector<std::string> guids; + for (auto& device : devices) + guids.push_back(device.guid()); + + EXPECT_CALL(*service(), GetDeviceCandidates(_)) + .WillOnce(Return(ByMove(std::move(devices)))); + + InitMenu(GURL(kTelUrl)); + + EXPECT_EQ(device_count + 2U, menu_.GetMenuSize()); + + // Assert item ordering. + MockRenderViewContextMenu::MockMenuItem item; + ASSERT_TRUE(menu_.GetMenuItem(0, &item)); + EXPECT_EQ(kSeparatorCommandId, item.command_id); + + ASSERT_TRUE(menu_.GetMenuItem(1, &item)); + EXPECT_EQ(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, + item.command_id); + + for (int i = 0; i < device_count; i++) { + ASSERT_TRUE(menu_.GetMenuItem(i + 2, &item)); + EXPECT_EQ(kSubMenuFirstDeviceCommandId + i, item.command_id); + } + + // Emulate clicks on all commands to check for commands with no device + // assigned. + for (int i = 0; i < kMaxDevicesShown; i++) { + if (i < device_count) { + EXPECT_CALL( + *service(), + SendMessageToDevice(Eq(guids[i]), Eq(kSharingClickToCallMessageTTL), + ProtoEquals(sharing_message), _)) + .Times(1); + } else { + EXPECT_CALL(*service(), SendMessageToDevice(_, _, _, _)).Times(0); + } + observer_->sub_menu_delegate_.ExecuteCommand( + kSubMenuFirstDeviceCommandId + i, 0); + } +} + +TEST_F(ClickToCallContextMenuObserverTest, + MultipleDevices_MoreThanMax_ShowMenu) { + int device_count = kMaxDevicesShown + 1; + auto devices = CreateMockDevices(device_count); + std::vector<std::string> guids; + for (auto& device : devices) + guids.push_back(device.guid()); + + EXPECT_CALL(*service(), GetDeviceCandidates(_)) + .WillOnce(Return(ByMove(std::move(devices)))); + + InitMenu(GURL(kTelUrl)); + + EXPECT_EQ(kMaxDevicesShown + 2U, menu_.GetMenuSize()); + + // Assert item ordering. + MockRenderViewContextMenu::MockMenuItem item; + ASSERT_TRUE(menu_.GetMenuItem(0, &item)); + EXPECT_EQ(kSeparatorCommandId, item.command_id); + + ASSERT_TRUE(menu_.GetMenuItem(1, &item)); + EXPECT_EQ(IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES, + item.command_id); + + for (int i = 0; i < kMaxDevicesShown; i++) { + ASSERT_TRUE(menu_.GetMenuItem(i + 2, &item)); + EXPECT_EQ(kSubMenuFirstDeviceCommandId + i, item.command_id); + } + + // Emulate clicks on all device commands to check for commands outside valid + // range too. + for (int i = 0; i < device_count; i++) { + if (i < kMaxDevicesShown) { + EXPECT_CALL( + *service(), + SendMessageToDevice(Eq(guids[i]), Eq(kSharingClickToCallMessageTTL), + ProtoEquals(sharing_message), _)) + .Times(1); + } else { + EXPECT_CALL(*service(), SendMessageToDevice(_, _, _, _)).Times(0); + } + observer_->sub_menu_delegate_.ExecuteCommand( + kSubMenuFirstDeviceCommandId + i, 0); + } +}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils.cc b/chrome/browser/sharing/click_to_call/click_to_call_utils.cc new file mode 100644 index 0000000..c0b43b2 --- /dev/null +++ b/chrome/browser/sharing/click_to_call/click_to_call_utils.cc
@@ -0,0 +1,21 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sharing/click_to_call/click_to_call_utils.h" + +#include "chrome/browser/sharing/click_to_call/feature.h" +#include "chrome/browser/sharing/sharing_service.h" +#include "chrome/browser/sharing/sharing_service_factory.h" +#include "content/public/browser/browser_context.h" +#include "url/url_constants.h" + +bool ShouldOfferClickToCall(content::BrowserContext* browser_context, + const GURL& url) { + SharingService* sharing_service = + SharingServiceFactory::GetForBrowserContext(browser_context); + return sharing_service && + (sharing_service->GetState() == SharingService::State::ACTIVE) && + base::FeatureList::IsEnabled(kClickToCallUI) && + url.SchemeIs(url::kTelScheme) && !url.GetContent().empty(); +}
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils.h b/chrome/browser/sharing/click_to_call/click_to_call_utils.h new file mode 100644 index 0000000..5b30ec1 --- /dev/null +++ b/chrome/browser/sharing/click_to_call/click_to_call_utils.h
@@ -0,0 +1,17 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_UTILS_H_ +#define CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_UTILS_H_ + +#include "url/gurl.h" + +namespace content { +class BrowserContext; +} // namespace content + +bool ShouldOfferClickToCall(content::BrowserContext* browser_context, + const GURL& url); + +#endif // CHROME_BROWSER_SHARING_CLICK_TO_CALL_CLICK_TO_CALL_UTILS_H_
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc new file mode 100644 index 0000000..dd521c6 --- /dev/null +++ b/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc
@@ -0,0 +1,119 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer.h" + +#include <memory> + +#include "base/macros.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/sharing/click_to_call/click_to_call_utils.h" +#include "chrome/browser/sharing/click_to_call/feature.h" +#include "chrome/browser/sharing/sharing_fcm_handler.h" +#include "chrome/browser/sharing/sharing_fcm_sender.h" +#include "chrome/browser/sharing/sharing_service.h" +#include "chrome/browser/sharing/sharing_service_factory.h" +#include "chrome/browser/sharing/sharing_sync_preference.h" +#include "chrome/browser/sharing/vapid_key_manager.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +using ::testing::_; +using ::testing::ByMove; +using ::testing::Eq; +using ::testing::NiceMock; +using ::testing::Return; + +using SharingMessage = chrome_browser_sharing::SharingMessage; + +namespace { + +const char kEmptyTelUrl[] = "tel:"; +const char kTelUrl[] = "tel:+9876543210"; +const char kNonTelUrl[] = "https://google.com"; + +class MockSharingService : public SharingService { + public: + explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler) + : SharingService(nullptr, + nullptr, + nullptr, + nullptr, + std::move(fcm_handler), + nullptr, + nullptr, + nullptr) {} + + ~MockSharingService() override = default; + + MOCK_CONST_METHOD0(GetState, State()); + + private: + DISALLOW_COPY_AND_ASSIGN(MockSharingService); +}; + +class ClickToCallUtilsTest : public testing::Test { + public: + ClickToCallUtilsTest() = default; + + ~ClickToCallUtilsTest() override = default; + + void SetUp() override { + SharingServiceFactory::GetInstance()->SetTestingFactory( + &profile_, base::BindRepeating([](content::BrowserContext* context) + -> std::unique_ptr<KeyedService> { + return std::make_unique<NiceMock<MockSharingService>>( + std::make_unique<SharingFCMHandler>(nullptr, nullptr)); + })); + } + + protected: + NiceMock<MockSharingService>* service() { + return static_cast<NiceMock<MockSharingService>*>( + SharingServiceFactory::GetForBrowserContext(&profile_)); + } + + base::test::ScopedFeatureList scoped_feature_list_; + content::TestBrowserThreadBundle thread_bundle_; + TestingProfile profile_; + + DISALLOW_COPY_AND_ASSIGN(ClickToCallUtilsTest); +}; + +} // namespace + +TEST_F(ClickToCallUtilsTest, NonTelProtocol_DoNotShowMenu) { + scoped_feature_list_.InitAndEnableFeature(kClickToCallUI); + EXPECT_CALL(*service(), GetState()) + .WillOnce(Return(SharingService::State::ACTIVE)); + + EXPECT_FALSE(ShouldOfferClickToCall(&profile_, GURL(kNonTelUrl))); +} + +TEST_F(ClickToCallUtilsTest, UIFlagDisabled_DoNotShowMenu) { + scoped_feature_list_.InitAndDisableFeature(kClickToCallUI); + EXPECT_CALL(*service(), GetState()) + .WillOnce(Return(SharingService::State::ACTIVE)); + + EXPECT_FALSE(ShouldOfferClickToCall(&profile_, GURL(kTelUrl))); +} + +TEST_F(ClickToCallUtilsTest, EmptyTelProtocol_DoNotShowMenu) { + scoped_feature_list_.InitAndEnableFeature(kClickToCallUI); + EXPECT_CALL(*service(), GetState()) + .WillOnce(Return(SharingService::State::ACTIVE)); + + EXPECT_FALSE(ShouldOfferClickToCall(&profile_, GURL(kEmptyTelUrl))); +} + +TEST_F(ClickToCallUtilsTest, TelProtocol_ShowMenu) { + scoped_feature_list_.InitAndEnableFeature(kClickToCallUI); + EXPECT_CALL(*service(), GetState()) + .WillOnce(Return(SharingService::State::ACTIVE)); + + EXPECT_TRUE(ShouldOfferClickToCall(&profile_, GURL(kTelUrl))); +}
diff --git a/chrome/browser/sharing/sharing_service.h b/chrome/browser/sharing/sharing_service.h index 242c5d33..b51f288 100644 --- a/chrome/browser/sharing/sharing_service.h +++ b/chrome/browser/sharing/sharing_service.h
@@ -88,7 +88,7 @@ SharingMessageHandler* handler); // Returns the current state of SharingService. - State GetState() const; + virtual State GetState() const; private: // Overrides for syncer::SyncServiceObserver.
diff --git a/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc b/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc index 2c1d6b4..1f6691cd 100644 --- a/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc +++ b/chrome/browser/ui/app_list/search/arc/arc_app_reinstall_app_result.cc
@@ -33,6 +33,8 @@ SetResultType(ash::SearchResultType::kPlayStoreReinstallApp); SetTitle(base::UTF8ToUTF16(mojom_data->title)); SetDisplayType(ash::SearchResultDisplayType::kRecommendation); + SetDisplayLocation(ash::SearchResultDisplayLocation::kTileListContainer); + SetDisplayIndex(ash::SearchResultDisplayIndex::kSixthIndex); set_relevance(kAppReinstallRelevance); SetNotifyVisibilityChange(true); SetIcon(skia_icon);
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc index b5b4b3d9..4ca944e7c 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc
@@ -363,11 +363,9 @@ keyboard_contents_.reset(); } -void ChromeKeyboardControllerClient::OnKeyboardContentsLoaded( - const gfx::Size& size) { - DVLOG(1) << "OnLoadKeyboardContentsRequested: " << size.ToString(); +void ChromeKeyboardControllerClient::OnKeyboardContentsLoaded() { + DVLOG(1) << "OnKeyboardContentsLoaded"; NotifyKeyboardLoaded(); - keyboard_controller_->KeyboardContentsLoaded(size); } void ChromeKeyboardControllerClient::OnSessionStateChanged() {
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h index 0f5200ea..df1f91e 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h
@@ -153,7 +153,8 @@ void OnLoadKeyboardContentsRequested() override; void OnKeyboardUIDestroyed() override; - void OnKeyboardContentsLoaded(const gfx::Size& size); + // Called when the keyboard contents have loaded. Notifies observers. + void OnKeyboardContentsLoaded(); // session_manager::SessionManagerObserver: void OnSessionStateChanged() override;
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc index 8156ee7..c45c7f5 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc
@@ -23,7 +23,6 @@ ~FakeKeyboardController() override = default; // ash::KeyboardController: - void KeyboardContentsLoaded(const gfx::Size& size) override {} keyboard::KeyboardConfig GetKeyboardConfig() override { return keyboard_config_; }
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc index 7481433..02e6718 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_ui.cc
@@ -49,7 +49,7 @@ browser_context_, ChromeKeyboardControllerClient::Get()->GetVirtualKeyboardUrl(), base::BindOnce( - [](LoadCallback callback, const gfx::Size&) { + [](LoadCallback callback) { ChromeKeyboardControllerClient::Get()->NotifyKeyboardLoaded(); std::move(callback).Run(); },
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc index 4661b8ca..cd826d9d 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
@@ -224,7 +224,7 @@ // TODO(https://crbug.com/845780): Change this to a DCHECK when we change // ReloadKeyboardIfNeeded to also have a callback. if (!load_callback_.is_null()) - std::move(load_callback_).Run(gfx::Size()); + std::move(load_callback_).Run(); } void ChromeKeyboardWebContents::LoadContents(const GURL& url) {
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h index 4bbfde70d..53f141c 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.h
@@ -29,7 +29,7 @@ class ChromeKeyboardWebContents : public content::WebContentsObserver, public aura::WindowObserver { public: - using LoadCallback = base::OnceCallback<void(const gfx::Size& size)>; + using LoadCallback = base::OnceCallback<void()>; using UnembedCallback = base::RepeatingClosure; // Immediately starts loading |url| in a WebContents. |load_callback| is
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 1adf835..f921fe6 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -2104,6 +2104,7 @@ chrome::NOTIFICATION_TAB_CLOSING, content::Source<NavigationController>(&contents->GetController()), content::NotificationService::NoDetails()); + SearchTabHelper::FromWebContents(contents)->OnTabClosing(); } void Browser::OnTabDetached(WebContents* contents, bool was_active) {
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc index 1bac48c2..ed0add4b 100644 --- a/chrome/browser/ui/search/local_ntp_browsertest.cc +++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -1226,39 +1226,6 @@ }; IN_PROC_BROWSER_TEST_F(LocalNTPExistingProfileSearchShortcutTest, - SearchShortcutAdded) { - TestInstantServiceObserver observer( - InstantServiceFactory::GetForProfile(browser()->profile())); - - content::WebContents* active_tab = - local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank")); - local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser()); - ASSERT_TRUE(search::IsInstantNTP(active_tab)); - content::RenderFrameHost* iframe = GetIframe(active_tab, kMostVisitedIframe); - EXPECT_FALSE(ContainsDefaultSearchTile(iframe)); - - // Navigate to a non-NTP URL, which should update most visited tiles. - ASSERT_TRUE(embedded_test_server()->Start()); - GURL url(embedded_test_server()->GetURL("/title2.html")); - ui_test_utils::NavigateToURL(browser(), url); - ASSERT_FALSE(search::IsInstantNTP(active_tab)); - - // Enable the feature to insert the search shortcut for existing profiles. - base::test::ScopedFeatureList scoped_feature_list_; - scoped_feature_list_.InitAndEnableFeature(ntp_tiles::kDefaultSearchShortcut); - ASSERT_TRUE(base::FeatureList::IsEnabled(ntp_tiles::kDefaultSearchShortcut)); - - // Two new tiles (the non-NTP URL and the search shortcut) should be added. - observer.WaitForMostVisitedItems(kDefaultMostVisitedItemCount + 2); - - active_tab = local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank")); - local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser()); - ASSERT_TRUE(search::IsInstantNTP(active_tab)); - iframe = GetIframe(active_tab, kMostVisitedIframe); - EXPECT_TRUE(ContainsDefaultSearchTile(iframe)); -} - -IN_PROC_BROWSER_TEST_F(LocalNTPExistingProfileSearchShortcutTest, PRE_FRESearchShortcutNotAddedForExistingUsers) { TestInstantServiceObserver observer( InstantServiceFactory::GetForProfile(browser()->profile())); @@ -1351,4 +1318,103 @@ EXPECT_THAT(request_headers, ::testing::HasSubstr("same-site-cookie=1")); } +// Verifies that Chrome won't spawn a separate renderer process for +// every single NTP tab. This behavior goes all the way back to +// the initial commit [1] which achieved that behavior by forcing +// process-per-site mode for NTP tabs. It seems desirable to preserve this +// behavior going forward. +// +// [1] https://chromium.googlesource.com/chromium/src/+/09911bf300f1a419907a9412154760efd0b7abc3/chrome/browser/browsing_instance.cc#55 +IN_PROC_BROWSER_TEST_F(LocalNTPTest, ProcessPerSite) { + GURL ntp_url("chrome-search://local-ntp/local-ntp.html"); + + // Open NTP in |tab1|. + content::WebContents* tab1; + { + content::WebContentsAddedObserver tab1_observer; + + // Try to simulate as closely as possible what would have happened in the + // real user interaction. In particular, do *not* use + // local_ntp_test_utils::OpenNewTab, which requires the caller to specify + // the URL of the new tab. + chrome::NewTab(browser()); + + // Wait for the new tab. + tab1 = tab1_observer.GetWebContents(); + ASSERT_TRUE(WaitForLoadStop(tab1)); + + // Sanity check: the NTP should be provided by |ntp_url| (and not by + // chrome-search://remote-ntp [3rd-party NTP] or chrome://ntp [incognito]). + std::string loc; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab1, "domAutomationController.send(window.location.href)", &loc)); + EXPECT_EQ(ntp_url, GURL(loc)); + } + + // Open another NTP in |tab2|. + content::WebContents* tab2; + { + content::WebContentsAddedObserver tab2_observer; + chrome::NewTab(browser()); + tab2 = tab2_observer.GetWebContents(); + ASSERT_TRUE(WaitForLoadStop(tab2)); + std::string loc; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab2, "domAutomationController.send(window.location.href)", &loc)); + EXPECT_EQ(ntp_url, GURL(loc)); + } + + // Verify that |tab1| and |tab2| share a process. + EXPECT_EQ(tab1->GetMainFrame()->GetProcess(), + tab2->GetMainFrame()->GetProcess()); +} + +// Just like LocalNTPTest.ProcessPerSite, but for an incognito window. +IN_PROC_BROWSER_TEST_F(LocalNTPTest, ProcessPerSite_Incognito) { + GURL ntp_url("chrome://newtab"); + Browser* incognito_browser = new Browser(Browser::CreateParams( + browser()->profile()->GetOffTheRecordProfile(), true)); + + // Open NTP in |tab1|. + content::WebContents* tab1; + { + content::WebContentsAddedObserver tab1_observer; + + // Try to simulate as closely as possible what would have happened in the + // real user interaction. In particular, do *not* use + // local_ntp_test_utils::OpenNewTab, which requires the caller to specify + // the URL of the new tab. + chrome::NewTab(incognito_browser); + + // Wait for the new tab. + tab1 = tab1_observer.GetWebContents(); + ASSERT_TRUE(WaitForLoadStop(tab1)); + + // Sanity check: the NTP should be provided by |ntp_url| (and not by + // chrome-search://local-ntp [1st-party, non-incognito NTP] or + // chrome-search://remote-ntp [3rd-party NTP]). + std::string loc; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab1, "domAutomationController.send(window.location.href)", &loc)); + EXPECT_EQ(ntp_url, GURL(loc)); + } + + // Open another NTP in |tab2|. + content::WebContents* tab2; + { + content::WebContentsAddedObserver tab2_observer; + chrome::NewTab(incognito_browser); + tab2 = tab2_observer.GetWebContents(); + ASSERT_TRUE(WaitForLoadStop(tab2)); + std::string loc; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + tab2, "domAutomationController.send(window.location.href)", &loc)); + EXPECT_EQ(ntp_url, GURL(loc)); + } + + // Verify that |tab1| and |tab2| share a process. + EXPECT_EQ(tab1->GetMainFrame()->GetProcess(), + tab2->GetMainFrame()->GetProcess()); +} + } // namespace
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc index e146376..706435c 100644 --- a/chrome/browser/ui/search/search_tab_helper.cc +++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -153,6 +153,11 @@ ipc_router_.OnTabDeactivated(); } +void SearchTabHelper::OnTabClosing() { + if (search::IsInstantNTP(web_contents_) && chrome_colors_service_) + chrome_colors_service_->RevertThemeChangesForTab(web_contents_); +} + void SearchTabHelper::DidStartNavigation( content::NavigationHandle* navigation_handle) { if (!navigation_handle->IsInMainFrame() || @@ -466,12 +471,12 @@ void SearchTabHelper::OnApplyDefaultTheme() { if (chrome_colors_service_) - chrome_colors_service_->ApplyDefaultTheme(); + chrome_colors_service_->ApplyDefaultTheme(web_contents_); } void SearchTabHelper::OnApplyAutogeneratedTheme(SkColor color) { if (chrome_colors_service_) - chrome_colors_service_->ApplyAutogeneratedTheme(color); + chrome_colors_service_->ApplyAutogeneratedTheme(color, web_contents_); } void SearchTabHelper::OnRevertThemeChanges() {
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h index 7360493d..7de6e6b 100644 --- a/chrome/browser/ui/search/search_tab_helper.h +++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -65,6 +65,9 @@ // Called when the tab corresponding to |this| instance is deactivated. void OnTabDeactivated(); + // Called when the tab corresponding to |this| instance is closing. + void OnTabClosing(); + SearchIPCRouter& ipc_router_for_testing() { return ipc_router_; } private:
diff --git a/chrome/browser/ui/search/third_party_ntp_browsertest.cc b/chrome/browser/ui/search/third_party_ntp_browsertest.cc index 83e24a4..be222660 100644 --- a/chrome/browser/ui/search/third_party_ntp_browsertest.cc +++ b/chrome/browser/ui/search/third_party_ntp_browsertest.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/search/instant_service.h" #include "chrome/browser/search/instant_service_factory.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/search/instant_test_base.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/in_process_browser_test.h" @@ -48,7 +49,6 @@ GURL ntp_url = https_test_server().GetURL("ntp.com", "/instant_extended_ntp.html"); InstantTestBase::Init(base_url, ntp_url, false); - SetupInstant(browser()); // Navigate to the NTP URL and verify that the resulting process is marked as @@ -81,3 +81,53 @@ &subframe_origin)); EXPECT_EQ("chrome-search://most-visited", subframe_origin); } + +// Verifies that Chrome won't spawn a separate renderer process for +// every single NTP tab. This behavior goes all the way back to +// the initial commit [1] which achieved that behavior by forcing +// process-per-site mode for NTP tabs. It seems desirable to preserve this +// behavior going forward. +// +// [1] https://chromium.googlesource.com/chromium/src/+/09911bf300f1a419907a9412154760efd0b7abc3/chrome/browser/browsing_instance.cc#55 +IN_PROC_BROWSER_TEST_F(ThirdPartyNTPBrowserTest, ProcessPerSite) { + GURL base_url = + https_test_server().GetURL("ntp.com", "/instant_extended.html"); + GURL ntp_url = + https_test_server().GetURL("ntp.com", "/instant_extended_ntp.html"); + InstantTestBase::Init(base_url, ntp_url, false); + SetupInstant(browser()); + + // Open NTP in |tab1|. + content::WebContents* tab1; + { + content::WebContentsAddedObserver tab1_observer; + + // Try to simulate as closely as possible what would have happened in the + // real user interaction. In particular, do *not* use + // local_ntp_test_utils::OpenNewTab, which requires the caller to specify + // the URL of the new tab. + chrome::NewTab(browser()); + + // Wait for the new tab. + tab1 = tab1_observer.GetWebContents(); + ASSERT_TRUE(WaitForLoadStop(tab1)); + + // Sanity check: the NTP should be provided by |ntp_url| (and not by + // chrome-search://local-ntp [1st-party NTP] or chrome://ntp [incognito]). + EXPECT_EQ(ntp_url, content::EvalJs(tab1, "window.location.href")); + } + + // Open another NTP in |tab2|. + content::WebContents* tab2; + { + content::WebContentsAddedObserver tab2_observer; + chrome::NewTab(browser()); + tab2 = tab2_observer.GetWebContents(); + ASSERT_TRUE(WaitForLoadStop(tab2)); + EXPECT_EQ(ntp_url, content::EvalJs(tab2, "window.location.href")); + } + + // Verify that |tab1| and |tab2| share a process. + EXPECT_EQ(tab1->GetMainFrame()->GetProcess(), + tab2->GetMainFrame()->GetProcess()); +}
diff --git a/chrome/browser/ui/views/hover_button.cc b/chrome/browser/ui/views/hover_button.cc index 63f89d2ac..2004c8c 100644 --- a/chrome/browser/ui/views/hover_button.cc +++ b/chrome/browser/ui/views/hover_button.cc
@@ -77,6 +77,8 @@ SetBorder(CreateBorderWithVerticalSpacing(vert_spacing)); SetInkDropMode(InkDropMode::ON); + + set_notify_action(Button::NOTIFY_ON_RELEASE); } HoverButton::HoverButton(views::ButtonListener* button_listener, @@ -236,20 +238,6 @@ Button::GetAccessibleNodeData(node_data); } -bool HoverButton::IsTriggerableEventType(const ui::Event& event) { - // Override MenuButton::IsTriggerableEventType so the HoverButton only - // triggers on mouse-button release, like normal buttons. - if (event.IsMouseEvent()) { - // The button listener must only be notified when the mouse was released. - // The event type must be explicitly checked here, since - // Button::IsTriggerableEvent() returns true on the mouse-down event. - return Button::IsTriggerableEvent(event) && - event.type() == ui::ET_MOUSE_RELEASED; - } - - return MenuButton::IsTriggerableEventType(event); -} - gfx::Insets HoverButton::GetInsets() const { if (insets_) return insets_.value();
diff --git a/chrome/browser/ui/views/hover_button.h b/chrome/browser/ui/views/hover_button.h index 820bf2a..168f30a 100644 --- a/chrome/browser/ui/views/hover_button.h +++ b/chrome/browser/ui/views/hover_button.h
@@ -66,7 +66,6 @@ bool OnKeyPressed(const ui::KeyEvent& event) override; void SetBorder(std::unique_ptr<views::Border> b) override; void GetAccessibleNodeData(ui::AXNodeData* node_data) override; - bool IsTriggerableEventType(const ui::Event& event) override; gfx::Insets GetInsets() const override; // Updates the title text, and applies the secondary style to the text
diff --git a/chrome/browser/ui/views/hover_button_unittest.cc b/chrome/browser/ui/views/hover_button_unittest.cc index 84150a80..8b72ce2f 100644 --- a/chrome/browser/ui/views/hover_button_unittest.cc +++ b/chrome/browser/ui/views/hover_button_unittest.cc
@@ -11,11 +11,13 @@ #include "chrome/test/views/chrome_views_test_base.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/ax_node_data.h" +#include "ui/events/test/event_generator.h" #include "ui/gfx/text_utils.h" #include "ui/views/controls/button/button.h" #include "ui/views/controls/label.h" #include "ui/views/test/views_test_base.h" #include "ui/views/view.h" +#include "ui/views/widget/widget_utils.h" namespace { @@ -45,17 +47,58 @@ public: HoverButtonTest() {} + void SetUp() override { + ChromeViewsTestBase::SetUp(); + CreateWidget(); + generator_ = std::make_unique<ui::test::EventGenerator>( + GetRootWindow(widget_.get()), widget_->GetNativeWindow()); + } + + void TearDown() override { + widget_.reset(); + generator_.reset(); + ChromeViewsTestBase::TearDown(); + } + std::unique_ptr<views::View> CreateIcon() { auto icon = std::make_unique<views::View>(); icon->SetPreferredSize(gfx::Size(16, 16)); return icon; } + ui::test::EventGenerator* generator() { return generator_.get(); } + views::Widget* widget() { return widget_.get(); } + + void CreateWidget() { + widget_ = std::make_unique<views::Widget>(); + views::Widget::InitParams params = + CreateParams(views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.bounds = gfx::Rect(100, 100, 200, 200); + widget_->Init(params); + } + private: + std::unique_ptr<views::Widget> widget_; + std::unique_ptr<ui::test::EventGenerator> generator_; DISALLOW_COPY_AND_ASSIGN(HoverButtonTest); }; -} // namespace +class TestButtonListener : public views::ButtonListener { + public: + TestButtonListener() = default; + ~TestButtonListener() override = default; + + void ButtonPressed(views::Button* sender, const ui::Event& event) override { + last_sender_ = sender; + } + + views::View* last_sender() { return last_sender_; } + + private: + views::View* last_sender_ = nullptr; + DISALLOW_COPY_AND_ASSIGN(TestButtonListener); +}; // Double check the length of the strings used for testing are either over or // under the width used for the following tests. @@ -160,3 +203,24 @@ EXPECT_TRUE(button.Contains(primary_icon_raw)); EXPECT_TRUE(button.Contains(secondary_icon_raw)); } + +// Tests that the listener is notified on mouse release rather than mouse press. +TEST_F(HoverButtonTest, ActivatesOnMouseReleased) { + TestButtonListener button_listener; + HoverButton button(&button_listener, CreateIcon(), + base::ASCIIToUTF16("Title"), base::string16()); + + button.SetBoundsRect(gfx::Rect(100, 100, 200, 200)); + widget()->SetContentsView(&button); + widget()->Show(); + + // ButtonListener should not be activated on press. + generator()->PressLeftButton(); + EXPECT_EQ(nullptr, button_listener.last_sender()); + + // ButtonListener should be activated on release. + generator()->ReleaseLeftButton(); + EXPECT_EQ(&button, button_listener.last_sender()); +} + +} // namespace
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc index 2a683cf..21cac69 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_bubble_view.cc
@@ -46,6 +46,8 @@ #endif namespace { +// Maximum number of lines that a title label occupies. +int kTitleMaxLines = 2; // Hover card and preview image dimensions. int GetPreferredTabHoverCardWidth() { @@ -298,7 +300,8 @@ new views::Label(base::string16(), CONTEXT_TAB_HOVER_CARD_TITLE, views::style::STYLE_PRIMARY); title_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - title_label_->SetMultiLine(false); + title_label_->SetMultiLine(true); + title_label_->SetMaxLines(kTitleMaxLines); AddChildView(title_label_); domain_label_ =
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc index 89b2cd3..6f6e5f0 100644 --- a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc +++ b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
@@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/location.h" -#include "base/metrics/histogram_macros.h" #include "base/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" @@ -225,20 +224,10 @@ bool alert_reopen_tab_items = promo_feature_ == InProductHelpFeature::kReopenTab; - base::TimeTicks menu_open_time = base::TimeTicks::Now(); - RunMenu( std::make_unique<AppMenuModel>(toolbar_view_, browser, toolbar_view_->app_menu_icon_controller()), browser, run_types, alert_reopen_tab_items); - - if (!(run_types & views::MenuRunner::FOR_DROP)) { - // Record the time-to-action for the menu. We don't record in the case of a - // drag-and-drop command because menus opened for drag-and-drop don't block - // the message loop. - UMA_HISTOGRAM_TIMES("Toolbar.AppMenuTimeToAction", - base::TimeTicks::Now() - menu_open_time); - } } void BrowserAppMenuButton::OnThemeChanged() {
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc index 73dabfe..0ad533c 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
@@ -126,7 +126,7 @@ // closed the menu, when this class handles via |suppress_next_release_|, so // it's not necessary. Bypass it by calling IsTriggerableEventType() instead // of IsTriggerableEvent(). - return views::MenuButton::IsTriggerableEventType(event); + return button_controller()->IsTriggerableEventType(event); } SkColor ToolbarActionView::GetInkDropBaseColor() const {
diff --git a/chrome/browser/ui/webui/OWNERS b/chrome/browser/ui/webui/OWNERS index 5e97af03..be3a2059 100644 --- a/chrome/browser/ui/webui/OWNERS +++ b/chrome/browser/ui/webui/OWNERS
@@ -25,5 +25,6 @@ per-file invalidations_message_handler.*=file://components/invalidation/OWNERS per-file policy*=file://chromeos/policy/OWNERS +per-file policy*=file://chrome/browser/policy/OWNERS # COMPONENT: UI>Browser>WebUI
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc index c1d71edb..85b71b8 100644 --- a/chrome/browser/ui/webui/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -926,7 +926,8 @@ return policy::GetAllPolicyValuesAsArray( web_ui()->GetWebContents()->GetBrowserContext(), true /* with_user_policies */, true /* convert_values */, - false /* with_device_data */, true /* is_pretty_print */); + false /* with_device_data */, true /* is_pretty_print */, + true /* convert_types */); } void PolicyUIHandler::SendStatus() { @@ -1033,7 +1034,7 @@ base::Value dict = policy::GetAllPolicyValuesAsDictionary( web_ui()->GetWebContents()->GetBrowserContext(), true /* with_user_policies */, false /* convert_values */, - false /* with_device_data */, is_pretty_print); + false /* with_device_data */, is_pretty_print, true /* convert_types */); base::Value chrome_metadata(base::Value::Type::DICTIONARY);
diff --git a/chrome/browser/ui/webui/settings/printing_handler.cc b/chrome/browser/ui/webui/settings/printing_handler.cc index 8647b2d..deaa3ab 100644 --- a/chrome/browser/ui/webui/settings/printing_handler.cc +++ b/chrome/browser/ui/webui/settings/printing_handler.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "chrome/browser/printing/printer_manager_dialog.h" +#include "chrome/browser/profiles/profile.h" #include "content/public/browser/web_ui.h" namespace settings { @@ -27,7 +28,8 @@ void PrintingHandler::OnJavascriptDisallowed() {} void PrintingHandler::HandleOpenSystemPrintDialog(const base::ListValue* args) { - printing::PrinterManagerDialog::ShowPrinterManagerDialog(); + printing::PrinterManagerDialog::ShowPrinterManagerDialog( + Profile::FromWebUI(web_ui())); } } // namespace settings
diff --git a/chrome/common/safe_browsing/zip_analyzer.cc b/chrome/common/safe_browsing/zip_analyzer.cc index 9353cca..1bf41d94f 100644 --- a/chrome/common/safe_browsing/zip_analyzer.cc +++ b/chrome/common/safe_browsing/zip_analyzer.cc
@@ -14,6 +14,7 @@ #include "base/macros.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/numerics/checked_math.h" #include "base/numerics/ranges.h" #include "base/rand_util.h" #include "base/time/time.h" @@ -57,6 +58,7 @@ bool advanced = true; results->file_count = 0; results->directory_count = 0; + base::CheckedNumeric<uint64_t> total_uncompressed_size = 0u; for (; reader.HasMore(); advanced = reader.AdvanceToNextEntry()) { if (!advanced) { DVLOG(1) << "Could not advance to next entry, aborting zip scan."; @@ -82,12 +84,28 @@ writer.file_length(), reader.current_entry_info()->is_encrypted(), results); + UMA_HISTOGRAM_MEMORY_LARGE_MB("SBClientDownload.ZipEntrySize", + writer.file_length()); + total_uncompressed_size += writer.file_length(); + if (reader.current_entry_info()->is_directory()) results->directory_count++; else results->file_count++; } + // We represent the size as a percent, so multiply by 100, then check for + // overflow. + total_uncompressed_size *= 100; + UMA_HISTOGRAM_BOOLEAN("SBClientDownload.ZipArchiveUncompressedSizeOverflow", + !total_uncompressed_size.IsValid()); + if (total_uncompressed_size.IsValid() && zip_file.GetLength() > 0) { + UMA_HISTOGRAM_COUNTS_10000( + "SBClientDownload.ZipCompressionRatio", + static_cast<uint64_t>(total_uncompressed_size.ValueOrDie()) / + zip_file.GetLength()); + } + results->success = !timeout; }
diff --git a/chrome/renderer/content_settings_observer_browsertest.cc b/chrome/renderer/content_settings_observer_browsertest.cc index b41d3ba..5d8d3b2 100644 --- a/chrome/renderer/content_settings_observer_browsertest.cc +++ b/chrome/renderer/content_settings_observer_browsertest.cc
@@ -29,14 +29,23 @@ namespace { -constexpr char kScriptHtml[] = - "<html>" - "<head>" - "<script src='data:foo'></script>" - "</head>" - "<body>" - "</body>" - "</html>"; +constexpr char kScriptHtml[] = R"HTML( + <html> + <head> + <script src='data:foo'></script> + </head> + <body></body> + </html>; +)HTML"; + +constexpr char kScriptWithSrcHtml[] = R"HTML( + <html> + <head> + <script src="http://www.example.com/script.js"></script> + </head> + <body></body> + </html> +)HTML"; class MockContentSettingsObserver : public ContentSettingsObserver { public: @@ -115,6 +124,11 @@ class ContentSettingsObserverBrowserTest : public ChromeRenderViewTest { void SetUp() override { ChromeRenderViewTest::SetUp(); + + // Set up a fake url loader factory to ensure that script loader can create + // a WebURLLoader. + CreateFakeWebURLLoaderFactory(); + // Unbind the ContentSettingsRenderer interface that would be registered by // the ContentSettingsObserver created when the render frame is created. view_->GetMainRenderFrame() @@ -366,6 +380,29 @@ ChromeViewHostMsg_ContentBlocked::ID)); } +TEST_F(ContentSettingsObserverBrowserTest, ContentSettingsAllowScriptsWithSrc) { + // Set the content settings for scripts. + RendererContentSettingRules content_setting_rules; + ContentSettingsForOneType& script_setting_rules = + content_setting_rules.script_rules; + script_setting_rules.push_back(ContentSettingPatternSource( + ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(), + base::Value::FromUniquePtrValue( + content_settings::ContentSettingToValue(CONTENT_SETTING_ALLOW)), + std::string(), false)); + + ContentSettingsObserver* observer = + ContentSettingsObserver::Get(view_->GetMainRenderFrame()); + observer->SetContentSettingRules(&content_setting_rules); + + // Load a page which contains a script. + LoadHTML(kScriptWithSrcHtml); + + // Verify that the script was not blocked. + EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching( + ChromeViewHostMsg_ContentBlocked::ID)); +} + // Regression test for crbug.com/232410: Load a page with JS blocked. Then, // allow JS and reload the page. In each case, only one of noscript or script // tags should be enabled, but never both.
diff --git a/chrome/services/cups_proxy/public/cpp/manifest.cc b/chrome/services/cups_proxy/public/cpp/manifest.cc index 0e33cb3..d43aac8f 100644 --- a/chrome/services/cups_proxy/public/cpp/manifest.cc +++ b/chrome/services/cups_proxy/public/cpp/manifest.cc
@@ -20,8 +20,7 @@ .WithOptions( service_manager::ManifestOptionsBuilder() .WithExecutionMode(service_manager::Manifest::ExecutionMode:: - kOutOfProcessBuiltin) - .WithSandboxType("utility") + kInProcessBuiltin) .WithInstanceSharingPolicy( service_manager::Manifest::InstanceSharingPolicy:: kSingleton)
diff --git a/chrome/services/media_gallery_util/OWNERS b/chrome/services/media_gallery_util/OWNERS index 7ccf0e0..65216a6b 100644 --- a/chrome/services/media_gallery_util/OWNERS +++ b/chrome/services/media_gallery_util/OWNERS
@@ -1 +1,2 @@ file://chrome/browser/media_galleries/OWNERS +# COMPONENT: Platform>Apps>MediaGalleries
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e1ce9d8..5f0edfc 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1307,6 +1307,7 @@ "origin_policy/origin_policy_browsertest.cc", "ppapi/ppapi_browsertest.cc", "ppapi/ppapi_filechooser_browsertest.cc", + "trustedtypes/trusted_types_browsertest.cc", "v8/wasm_trap_handler_browsertest.cc", ] @@ -3530,6 +3531,7 @@ "../browser/download/download_commands_unittest.cc", "../browser/download/download_shelf_unittest.cc", "../browser/enterprise_reporting/extension_info_unittest.cc", + "../browser/enterprise_reporting/policy_info_unittest.cc", "../browser/enterprise_reporting/profile_report_generator_unittest.cc", "../browser/enterprise_reporting/report_generator_unittest.cc", "../browser/enterprise_reporting/report_scheduler_unittest.cc", @@ -3865,9 +3867,13 @@ "../browser/media/webrtc/webrtc_rtp_dump_writer_unittest.cc", "../browser/policy/homepage_location_policy_handler_unittest.cc", "../browser/policy/local_sync_policy_handler_unittest.cc", + "../browser/renderer_context_menu/mock_render_view_context_menu.cc", + "../browser/renderer_context_menu/mock_render_view_context_menu.h", "../browser/renderer_context_menu/render_view_context_menu_test_util.cc", "../browser/renderer_context_menu/render_view_context_menu_test_util.h", + "../browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc", "../browser/sharing/click_to_call/click_to_call_sharing_dialog_controller_unittest.cc", + "../browser/sharing/click_to_call/click_to_call_utils_unittest.cc", "../browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc", "../browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc", "../browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc", @@ -3954,8 +3960,6 @@ "../browser/metrics/perf/process_type_collector_unittest.cc", "../browser/metrics/perf/profile_provider_chromeos_unittest.cc", "../browser/notifications/chrome_ash_message_center_client_unittest.cc", - "../browser/renderer_context_menu/mock_render_view_context_menu.cc", - "../browser/renderer_context_menu/mock_render_view_context_menu.h", "../browser/signin/signin_error_notifier_ash_unittest.cc", "../browser/speech/tts_chromeos_unittest.cc", "../browser/sync/sync_error_notifier_ash_unittest.cc",
diff --git a/chrome/test/chromedriver/client/chromedriver.py b/chrome/test/chromedriver/client/chromedriver.py index 9e5342d..7d7f5a7 100644 --- a/chrome/test/chromedriver/client/chromedriver.py +++ b/chrome/test/chromedriver/client/chromedriver.py
@@ -560,12 +560,6 @@ def GetAvailableLogTypes(self): return self.ExecuteCommand(Command.GET_AVAILABLE_LOG_TYPES) - def IsAutoReporting(self): - return self.ExecuteCommand(Command.IS_AUTO_REPORTING) - - def SetAutoReporting(self, enabled): - self.ExecuteCommand(Command.SET_AUTO_REPORTING, {'enabled': enabled}) - def SetNetworkConditions(self, latency, download_throughput, upload_throughput, offline=False): # Until http://crbug.com/456324 is resolved, we'll always set 'offline' to
diff --git a/chrome/test/chromedriver/client/command_executor.py b/chrome/test/chromedriver/client/command_executor.py index f3f49f3..c221d5b 100644 --- a/chrome/test/chromedriver/client/command_executor.py +++ b/chrome/test/chromedriver/client/command_executor.py
@@ -160,8 +160,6 @@ RELEASE_ACTIONS = (_Method.DELETE, '/session/:sessionId/actions') GET_LOG = (_Method.POST, '/session/:sessionId/se/log') GET_AVAILABLE_LOG_TYPES = (_Method.GET, '/session/:sessionId/se/log/types') - IS_AUTO_REPORTING = (_Method.GET, '/session/:sessionId/autoreport') - SET_AUTO_REPORTING = (_Method.POST, '/session/:sessionId/autoreport') GET_SESSION_LOGS = (_Method.POST, '/logs') STATUS = (_Method.GET, '/status') SET_NETWORK_CONNECTION = (
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc index 9f87c95..0cc8bd8 100644 --- a/chrome/test/chromedriver/commands.cc +++ b/chrome/test/chromedriver/commands.cc
@@ -314,11 +314,6 @@ } } - if (status.IsOk() && session->auto_reporting_enabled) { - std::string message = session->GetFirstBrowserError(); - if (!message.empty()) - status = Status(kUnknownError, message); - } } }
diff --git a/chrome/test/chromedriver/log_replay/client_replay.py b/chrome/test/chromedriver/log_replay/client_replay.py index 9471add..315eb06 100755 --- a/chrome/test/chromedriver/log_replay/client_replay.py +++ b/chrome/test/chromedriver/log_replay/client_replay.py
@@ -155,7 +155,6 @@ "HeapSnapshot": (Method.GET, "/session/:sessionId/chromium/heap_snapshot"), "InitSession": (Method.POST, "/session"), "IsAlertOpen": (Method.GET, "/session/:sessionId/alert"), - "IsAutoReporting": (Method.GET, "/session/:sessionId/autoreport"), "IsElementDisplayed": (Method.GET, "/session/:sessionId/element/:id/displayed"), "IsElementEnabled": (Method.GET, "/session/:sessionId/element/:id/enabled"), @@ -185,7 +184,6 @@ "SendCommandAndGetResult": (Method.POST, "/session/:sessionId/chromium/send_command_and_get_result"), "SetAlertPrompt": (Method.POST, "/session/:sessionId/alert_text"), - "SetAutoReporting": (Method.POST, "/session/:sessionId/autoreport"), "SetGeolocation": (Method.POST, "/session/:sessionId/location"), "SetImplicitWait": (Method.POST, "/session/:sessionId/timeouts/implicit_wait"),
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc index 04e39d51..84fa79e 100644 --- a/chrome/test/chromedriver/server/http_handler.cc +++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -859,18 +859,6 @@ kGet, "session/:sessionId/is_loading", WrapToCommand("IsLoading", base::BindRepeating(&ExecuteIsLoading))), - // - // Commands of unknown origins. - // - - CommandMapping( - kGet, "session/:sessionId/autoreport", - WrapToCommand("IsAutoReporting", - base::BindRepeating(&ExecuteIsAutoReporting))), - CommandMapping( - kPost, "session/:sessionId/autoreport", - WrapToCommand("SetAutoReporting", - base::BindRepeating(&ExecuteSetAutoReporting))), }; command_map_.reset(new CommandMap(commands, commands + base::size(commands))); }
diff --git a/chrome/test/chromedriver/session.cc b/chrome/test/chromedriver/session.cc index 50463cb..21dd7e8 100644 --- a/chrome/test/chromedriver/session.cc +++ b/chrome/test/chromedriver/session.cc
@@ -70,7 +70,6 @@ implicit_wait(kDefaultImplicitWaitTimeout), page_load_timeout(kDefaultPageLoadTimeout), script_timeout(kDefaultScriptTimeout), - auto_reporting_enabled(false), strict_file_interactability(false), click_count(0), mouse_click_timestamp(base::TimeTicks::Now()) {} @@ -87,7 +86,6 @@ implicit_wait(kDefaultImplicitWaitTimeout), page_load_timeout(kDefaultPageLoadTimeout), script_timeout(kDefaultScriptTimeout), - auto_reporting_enabled(false), strict_file_interactability(false), click_count(0), mouse_click_timestamp(base::TimeTicks::Now()) {} @@ -136,17 +134,6 @@ return logs; } -std::string Session::GetFirstBrowserError() const { - for (const auto& log : devtools_logs) { - if (log->type() == WebDriverLog::kBrowserType) { - std::string message = log->GetFirstErrorMessage(); - if (!message.empty()) - return message; - } - } - return std::string(); -} - Session* GetThreadLocalSession() { return lazy_tls_session.Pointer()->Get(); }
diff --git a/chrome/test/chromedriver/session.h b/chrome/test/chromedriver/session.h index 90d9df9..5dcc2fb 100644 --- a/chrome/test/chromedriver/session.h +++ b/chrome/test/chromedriver/session.h
@@ -80,7 +80,6 @@ const std::string& chromedriver_frame_id); std::string GetCurrentFrameId() const; std::vector<WebDriverLog*> GetAllLogs() const; - std::string GetFirstBrowserError() const; const std::string id; bool w3c_compliant; @@ -119,7 +118,6 @@ std::unique_ptr<WebDriverLog> driver_log; ScopedTempDirWithRetry temp_dir; std::unique_ptr<base::DictionaryValue> capabilities; - bool auto_reporting_enabled; // |command_listeners| should be declared after |chrome|. When the |Session| // is destroyed, |command_listeners| should be freed first, since some // |CommandListener|s might be |CommandListenerProxy|s that forward to
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index 86f8637..d9a26fe 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -1166,23 +1166,6 @@ return Status(kOk); } -Status ExecuteIsAutoReporting(Session* session, - const base::DictionaryValue& params, - std::unique_ptr<base::Value>* value) { - value->reset(new base::Value(session->auto_reporting_enabled)); - return Status(kOk); -} - -Status ExecuteSetAutoReporting(Session* session, - const base::DictionaryValue& params, - std::unique_ptr<base::Value>* value) { - bool enabled; - if (!params.GetBoolean("enabled", &enabled)) - return Status(kInvalidArgument, "missing parameter 'enabled'"); - session->auto_reporting_enabled = enabled; - return Status(kOk); -} - Status ExecuteUnimplementedCommand(Session* session, const base::DictionaryValue& params, std::unique_ptr<base::Value>* value) {
diff --git a/chrome/test/chromedriver/session_commands.h b/chrome/test/chromedriver/session_commands.h index 2b457fb..f0bfc08 100644 --- a/chrome/test/chromedriver/session_commands.h +++ b/chrome/test/chromedriver/session_commands.h
@@ -156,14 +156,6 @@ const base::DictionaryValue& params, std::unique_ptr<base::Value>* value); -Status ExecuteIsAutoReporting(Session* session, - const base::DictionaryValue& params, - std::unique_ptr<base::Value>* value); - -Status ExecuteSetAutoReporting(Session* session, - const base::DictionaryValue& params, - std::unique_ptr<base::Value>* value); - Status ExecuteUnimplementedCommand(Session* session, const base::DictionaryValue& params, std::unique_ptr<base::Value>* value);
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc index 8f0a9d6bb..ce189ca 100644 --- a/chrome/test/chromedriver/session_commands_unittest.cc +++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -422,47 +422,3 @@ std::unique_ptr<base::Value> value; ASSERT_EQ(kUnknownError, ExecuteQuit(false, &session, params, &value).code()); } - -TEST(SessionCommandsTest, AutoReporting) { - DetachChrome* chrome = new DetachChrome(); - Session session("id", std::unique_ptr<Chrome>(chrome)); - base::DictionaryValue params; - std::unique_ptr<base::Value> value; - StatusCode status_code; - bool enabled; - - // autoreporting should be disabled by default - status_code = ExecuteIsAutoReporting(&session, params, &value).code(); - ASSERT_EQ(kOk, status_code); - ASSERT_FALSE(session.auto_reporting_enabled); - ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); - ASSERT_FALSE(enabled); - - // an error should be given if the |enabled| parameter is not set - status_code = ExecuteSetAutoReporting(&session, params, &value).code(); - ASSERT_EQ(kInvalidArgument, status_code); - - // try to enable autoreporting - params.SetBoolean("enabled", true); - status_code = ExecuteSetAutoReporting(&session, params, &value).code(); - ASSERT_EQ(kOk, status_code); - ASSERT_TRUE(session.auto_reporting_enabled); - - // check that autoreporting was enabled successfully - status_code = ExecuteIsAutoReporting(&session, params, &value).code(); - ASSERT_EQ(kOk, status_code); - ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); - ASSERT_TRUE(enabled); - - // try to disable autoreporting - params.SetBoolean("enabled", false); - status_code = ExecuteSetAutoReporting(&session, params, &value).code(); - ASSERT_EQ(kOk, status_code); - ASSERT_FALSE(session.auto_reporting_enabled); - - // check that autoreporting was disabled successfully - status_code = ExecuteIsAutoReporting(&session, params, &value).code(); - ASSERT_EQ(kOk, status_code); - ASSERT_TRUE(value.get()->GetAsBoolean(&enabled)); - ASSERT_FALSE(enabled); -}
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 7e4f7da..52d8be7 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -1372,16 +1372,6 @@ except Exception as e: self.fail(e.message) - def testAutoReporting(self): - self.assertFalse(self._driver.IsAutoReporting()) - self._driver.SetAutoReporting(True) - self.assertTrue(self._driver.IsAutoReporting()) - url = self.GetHttpUrlForFile('/chromedriver/console_log.html') - self.assertRaisesRegexp( - chromedriver.UnknownError, - ".*Uncaught TypeError: Cannot read property 'y' of undefined.*", - self._driver.Load, url) - def testDoesntHangOnDebugger(self): self._driver.Load('about:blank') self._driver.ExecuteScript('debugger;')
diff --git a/chrome/test/data/local_ntp/local_ntp_browsertest.html b/chrome/test/data/local_ntp/local_ntp_browsertest.html index 51bac02..86596be 100644 --- a/chrome/test/data/local_ntp/local_ntp_browsertest.html +++ b/chrome/test/data/local_ntp/local_ntp_browsertest.html
@@ -216,7 +216,7 @@ <div id="backgrounds-default-icon" class="bg-sel-tile" tabindex="-1"> <div class="mini-page"> - <div class="mini-header"></div> + <div class="mini-header-colorful"></div> <div class="mini-shortcuts"></div> </div> </div>
diff --git a/chrome/test/trustedtypes/trusted_types_browsertest.cc b/chrome/test/trustedtypes/trusted_types_browsertest.cc new file mode 100644 index 0000000..0cf1672 --- /dev/null +++ b/chrome/test/trustedtypes/trusted_types_browsertest.cc
@@ -0,0 +1,211 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/common/content_features.h" +#include "net/http/http_status_code.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/embedded_test_server/http_request.h" +#include "net/test/embedded_test_server/http_response.h" + +namespace { +// Origin Trial tokens are bound to a specific origin (incl. port), so we need +// to force our test server to run on the same port that the test token has +// been generated for. +const int kServerPort = 54321; + +// We (thankfully) cannot generate origin trial tokens with the production key +// There is an origin trial 'test key' is documented of sorts, but does not +// have a standard API. +// Ref: docs/origin_trials_integration.md +// Ref: src/third_party/blink/common/origin_trials/trial_token_unittest.cc +constexpr char kOriginTrialTestPublicKey[] = + "dRCs+TocuKkocNKa0AtZ4awrt9XKH2SQCI6o4FY6BNA="; + +// Origin Trial Token for TrustedDOMTypes generated with: +// $ tools/origin_trials/generate_token.py \ +// https://127.0.0.1:54321/ \ +// "TrustedDOMTypes" \ +// --expire-timestamp=2000000000 +// (Token will expire ca. ~2033. See content/test/data/origin_trials/basic.html) +constexpr char kOriginTrialToken[] = + "AnRnI2yGt1XQTaKUvbAQ8nRas1bXSDIWwfjeEaDKtXvHgid7wigd4IMm4DkBWsFWM+" + "Cww0rgYOpQpBWPBPN8xQwAAABZeyJvcmlnaW4iOiAiaHR0cHM6Ly8xMjcuMC4wLjE6NTQzMjEi" + "LCAiZmVhdHVyZSI6ICJUcnVzdGVkRE9NVHlwZXMiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0="; +constexpr char kTrustedTypesCSP[] = "trusted-types *"; +constexpr char kDefaultResponseTemplate[] = R"( +<html> +<head> + <title>(starting)</title> + META + <script id="target"></script> + <script> + const tt_available = window.TrustedTypes ? "enabled" : "disabled"; + const target = document.getElementById("target"); + let tt_enforced = "dont know yet"; + try { + target.textContent = "2+2;"; + tt_enforced = "ignored"; + } catch (e) { + tt_enforced = "enforced"; + } + document.title = `Trusted Types: ${tt_available} and ${tt_enforced}`; + </script> +</head> +<body> + <p>Hello World!</p> + <p>This test sets the document title.</p> +</body> +</html> +)"; + +// The expected test page titles when Trusted Types are disabled or enabled: +constexpr char kTitleEnabled[] = "Trusted Types: enabled and enforced"; +constexpr char kTitleDisabled[] = "Trusted Types: disabled and ignored"; +constexpr char kTitleAvailable[] = "Trusted Types: enabled and ignored"; + +// Generate a test response, based on kDefaultResponseTemplate. +// If the request path contains: +// - "otheader"/"otmeta": Put Origin Trial in header/<meta> element. +// (Use the token from kOriginTrialToken.) +// - "cspheader"/"cspmeta": Put CSP into header/<meta> element. +// (Use the CSP from kTrustedTypesCSP. +// Return 404 for all paths not ending in ".html". +std::unique_ptr<net::test_server::HttpResponse> TrustedTypesTestHandler( + const net::test_server::HttpRequest& request) { + std::unique_ptr<net::test_server::BasicHttpResponse> response = + std::make_unique<net::test_server::BasicHttpResponse>(); + std::string url = request.GetURL().spec(); + if (!base::EndsWith(url, ".html", base::CompareCase::SENSITIVE)) { + response->set_code(net::HTTP_NOT_FOUND); + return response; + } + + std::string meta; + if (url.find("otheader") != std::string::npos) { + response->AddCustomHeader("origin-trial", kOriginTrialToken); + } else if (url.find("otmeta") != std::string::npos) { + meta.append(std::string() + R"(<meta http-equiv="origin-trial" content=")" + + kOriginTrialToken + R"(">)"); + } + if (url.find("cspheader") != std::string::npos) { + response->AddCustomHeader("Content-Security-Policy", kTrustedTypesCSP); + } else if (url.find("cspmeta") != std::string::npos) { + meta.append(std::string() + + R"(<meta http-equiv="Content-Security-Policy" content=")" + + kTrustedTypesCSP + R"(">)"); + } + + std::string contents = kDefaultResponseTemplate; + base::ReplaceFirstSubstringAfterOffset(&contents, 0, "META", meta); + response->set_content(contents); + response->set_content_type("text/html"); + response->set_code(net::HTTP_OK); + return response; +} + +} // namespace + +// TrustedTypesBrowserTest tests activation of Trusted Types via CSP and Origin +// Trial. (The tests for the actual TT functionality are found in +// external/wpt/trusted-types/*.) +class TrustedTypesBrowserTest : public InProcessBrowserTest { + public: + TrustedTypesBrowserTest() = default; + ~TrustedTypesBrowserTest() override = default; + + void SetUpInProcessBrowserTestFixture() override { + server_ = std::make_unique<net::test_server::EmbeddedTestServer>( + net::test_server::EmbeddedTestServer::TYPE_HTTPS); + server_->RegisterRequestHandler(base::Bind(&TrustedTypesTestHandler)); + EXPECT_TRUE(server()->Start(kServerPort)); + } + + void TearDownInProcessBrowserTestFixture() override { server_.reset(); } + + net::test_server::EmbeddedTestServer* server() { return server_.get(); } + + base::string16 NavigateToAndReturnTitle(const char* url) { + EXPECT_TRUE(server()); + ui_test_utils::NavigateToURL(browser(), GURL(server()->GetURL(url))); + base::string16 title; + ui_test_utils::GetCurrentTabTitle(browser(), &title); + return title; + } + + void SetUpDefaultCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpDefaultCommandLine(command_line); + command_line->AppendSwitchASCII(switches::kOriginTrialPublicKey, + kOriginTrialTestPublicKey); + } + + void SetUp() override { + // We need to explicitly disable the feature, so that our test cases can + // verify whether enabling it actually works. + feature_list_.InitAndDisableFeature(features::kTrustedDOMTypes); + InProcessBrowserTest::SetUp(); + } + + private: + std::unique_ptr<net::test_server::EmbeddedTestServer> server_; + base::test::ScopedFeatureList feature_list_; + + DISALLOW_COPY_AND_ASSIGN(TrustedTypesBrowserTest); +}; + +// Our test cases are effectively a 3x3 matrix of origin trial token (absent|in +// header|in <meta>) and content security policy (absent|in header|in <meta>). +// The test fixture will generate the appropriate page based on the URL path. + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PagePlainX) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleDisabled), + NavigateToAndReturnTitle("/page.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithTokenInHeader) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleAvailable), + NavigateToAndReturnTitle("/page-otheader.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithTokenInMeta) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleAvailable), + NavigateToAndReturnTitle("/page-otmeta.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPInHeaderX) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleDisabled), + NavigateToAndReturnTitle("/page-cspheader.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPAndTokenInHeader) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled), + NavigateToAndReturnTitle("/page-cspheader-otheader.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, + PageWithCSPInHeaderAndTokenInMeta) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled), + NavigateToAndReturnTitle("/page-cspheader-otmeta.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPInMetaX) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleDisabled), + NavigateToAndReturnTitle("/page-cspmeta.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, + PageWithCSPInMetaAndTokenInHeader) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled), + NavigateToAndReturnTitle("/page-cspmeta-otheader.html")); +} + +IN_PROC_BROWSER_TEST_F(TrustedTypesBrowserTest, PageWithCSPAndTokenInMeta) { + EXPECT_EQ(base::ASCIIToUTF16(kTitleEnabled), + NavigateToAndReturnTitle("/page-cspmeta-otmeta.html")); +}
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index 37e0094..e7867040b 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -36,7 +36,6 @@ #include "libassistant/shared/internal_api/assistant_manager_delegate.h" #include "libassistant/shared/internal_api/assistant_manager_internal.h" #include "libassistant/shared/public/media_manager.h" -#include "mojo/public/mojom/base/time.mojom.h" #include "services/media_session/public/mojom/constants.mojom.h" #include "services/media_session/public/mojom/media_session.mojom.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -610,11 +609,6 @@ notification_ptr->grouping_key = notification.grouping_key; notification_ptr->obfuscated_gaia_id = notification.obfuscated_gaia_id; - if (notification.expiry_timestamp_ms) { - notification_ptr->expiry_time = - base::Time::FromJavaTime(notification.expiry_timestamp_ms); - } - // The server sometimes sends an empty |notification_id|, but our client // requires a non-empty |client_id| for notifications. Known instances in // which the server sends an empty |notification_id| are for Reminders.
diff --git a/chromeos/services/assistant/media_session/assistant_media_session.cc b/chromeos/services/assistant/media_session/assistant_media_session.cc index 4559229..d90d2e8 100644 --- a/chromeos/services/assistant/media_session/assistant_media_session.cc +++ b/chromeos/services/assistant/media_session/assistant_media_session.cc
@@ -60,10 +60,16 @@ // TODO(b/135064564): Update StartDucking() and StopDucking() after volume // control API for media streams is implemented. void AssistantMediaSession::StartDucking() { + if (is_ducking_) + return; + is_ducking_ = true; Suspend(SuspendType::kSystem); } void AssistantMediaSession::StopDucking() { + if (!is_ducking_) + return; + is_ducking_ = false; Resume(SuspendType::kSystem); }
diff --git a/chromeos/services/assistant/media_session/assistant_media_session.h b/chromeos/services/assistant/media_session/assistant_media_session.h index b1c0498a..e583901 100644 --- a/chromeos/services/assistant/media_session/assistant_media_session.h +++ b/chromeos/services/assistant/media_session/assistant_media_session.h
@@ -114,6 +114,11 @@ // Holds a pointer to the MediaSessionService. media_session::mojom::AudioFocusManagerPtr audio_focus_ptr_; + // The ducking state of this media session. The initial value is |false|, and + // is set to |true| after StartDucking(), and will be set to |false| after + // StopDucking(). + bool is_ducking_ = false; + // If the media session has acquired audio focus then this will contain a // pointer to that requests AudioFocusRequestClient. media_session::mojom::AudioFocusRequestClientPtr request_client_ptr_;
diff --git a/chromeos/services/assistant/public/features.cc b/chromeos/services/assistant/public/features.cc index a3266510..c99d4bd 100644 --- a/chromeos/services/assistant/public/features.cc +++ b/chromeos/services/assistant/public/features.cc
@@ -16,9 +16,6 @@ const base::Feature kAssistantFeedbackUi{"AssistantFeedbackUi", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kAssistantVoiceMatch{"AssistantVoiceMatch", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kAssistantWarmerWelcomeFeature{ "AssistantWarmerWelcome", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chromeos/services/assistant/public/features.h b/chromeos/services/assistant/public/features.h index cc65645..5d9960b1 100644 --- a/chromeos/services/assistant/public/features.h +++ b/chromeos/services/assistant/public/features.h
@@ -20,10 +20,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kAssistantFeedbackUi; -// Enables Assistant voice match enrollment. -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) -extern const base::Feature kAssistantVoiceMatch; - // Enables Assistant warmer welcome. COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kAssistantWarmerWelcomeFeature;
diff --git a/chromeos/services/assistant/public/mojom/assistant.mojom b/chromeos/services/assistant/public/mojom/assistant.mojom index adb929c..0b8d098a 100644 --- a/chromeos/services/assistant/public/mojom/assistant.mojom +++ b/chromeos/services/assistant/public/mojom/assistant.mojom
@@ -295,10 +295,6 @@ // Whether this notification can turn on the display if it was off. bool is_high_priority = false; - - // When the notification should expire. - // Expressed as milliseconds since Unix Epoch. - mojo_base.mojom.Time? expiry_time; }; // Models status of an app.
diff --git a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc index f978f1d..c1a0a53 100644 --- a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc +++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
@@ -162,19 +162,24 @@ base::string16 AutofillSaveCardInfoBarDelegateMobile::GetButtonLabel( InfoBarButton button) const { - if (button != BUTTON_OK && button != BUTTON_CANCEL) { - NOTREACHED() << "Unsupported button label requested."; - return base::string16(); + if (button == BUTTON_OK) { + // Requesting name or expiration date from the user makes the save prompt a + // 2-step fix flow. + bool prompt_continue = options_.should_request_name_from_user || + options_.should_request_expiration_date_from_user; + return l10n_util::GetStringUTF16( + prompt_continue ? IDS_AUTOFILL_SAVE_CARD_PROMPT_CONTINUE + : IDS_AUTOFILL_SAVE_CARD_INFOBAR_ACCEPT); } + if (button == BUTTON_CANCEL) { - return l10n_util::GetStringUTF16(IDS_NO_THANKS); + return l10n_util::GetStringUTF16( + upload_ ? IDS_AUTOFILL_NO_THANKS_MOBILE_UPLOAD_SAVE + : IDS_AUTOFILL_NO_THANKS_MOBILE_LOCAL_SAVE); } - // Requesting name or expiration date from the user makes the save prompt a - // 2-step fix flow. - return options_.should_request_name_from_user || - options_.should_request_expiration_date_from_user - ? l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_PROMPT_CONTINUE) - : l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_CARD_INFOBAR_ACCEPT); + + NOTREACHED() << "Unsupported button label requested."; + return base::string16(); } bool AutofillSaveCardInfoBarDelegateMobile::Accept() {
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp index 58ef6ab5..b50d29c 100644 --- a/components/autofill_payments_strings.grdp +++ b/components/autofill_payments_strings.grdp
@@ -31,6 +31,25 @@ </message> </if> + <if expr="is_android or is_ios"> + <if expr="not use_titlecase"> + <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_LOCAL_SAVE" desc="The label for cancel button used in autofill credit card local save infobar on mobile."> + No thanks + </message> + <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_UPLOAD_SAVE" desc="The label for cancel button used in autofill credit card upload save infobar on mobile."> + No thanks + </message> + </if> + <if expr="use_titlecase"> + <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_LOCAL_SAVE" desc="In Title Case: The label for cancel button used in autofill credit card local save infobar on mobile."> + No Thanks + </message> + <message name="IDS_AUTOFILL_NO_THANKS_MOBILE_UPLOAD_SAVE" desc="In Title Case: The label for cancel button used in autofill credit card upload save infobar on mobile."> + No Thanks + </message> + </if> + </if> + <!-- Autofill Credit Card Assisted Filling Infobar --> <if expr="is_android"> <message name="IDS_AUTOFILL_CREDIT_CARD_FILLING_INFOBAR_TITLE" desc="Title text for the Autofill Credit Card Assisted Filling Infobar">
diff --git a/components/crash_strings_grdp/OWNERS b/components/crash_strings_grdp/OWNERS index 21fa106..05e3163 100644 --- a/components/crash_strings_grdp/OWNERS +++ b/components/crash_strings_grdp/OWNERS
@@ -1 +1,2 @@ file://components/crash/OWNERS +# COMPONENT: Internals>CrashReporting
diff --git a/components/download/internal/common/download_file_impl.cc b/components/download/internal/common/download_file_impl.cc index 45f6ea6..f0ebeb5 100644 --- a/components/download/internal/common/download_file_impl.cc +++ b/components/download/internal/common/download_file_impl.cc
@@ -31,6 +31,7 @@ #include "services/service_manager/public/cpp/connector.h" #if defined(OS_ANDROID) +#include "base/android/content_uri_utils.h" #include "components/download/internal/common/android/download_collection_bridge.h" #endif // defined(OS_ANDROID) @@ -368,16 +369,21 @@ } #if defined(OS_ANDROID) -void DownloadFileImpl::CreateIntermediateUriForPublish( +void DownloadFileImpl::RenameToIntermediateUri( const GURL& original_url, const GURL& referrer_url, const base::FilePath& file_name, const std::string& mime_type, + const base::FilePath& current_path, const RenameCompletionCallback& callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Create new content URI if |current_path| is not content URI + // or if it is already deleted. base::FilePath content_path = - DownloadCollectionBridge::CreateIntermediateUriForPublish( - original_url, referrer_url, file_name, mime_type); + current_path.IsContentUri() && base::ContentUriExists(current_path) + ? current_path + : DownloadCollectionBridge::CreateIntermediateUriForPublish( + original_url, referrer_url, file_name, mime_type); DownloadInterruptReason reason = DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; if (!content_path.empty()) { reason = file_.Rename(content_path);
diff --git a/components/download/internal/common/download_item_impl.cc b/components/download/internal/common/download_item_impl.cc index b3ee4ed..478d0c6 100644 --- a/components/download/internal/common/download_item_impl.cc +++ b/components/download/internal/common/download_item_impl.cc
@@ -1640,15 +1640,17 @@ base::Bind(&DownloadItemImpl::OnDownloadRenamedToIntermediateName, weak_ptr_factory_.GetWeakPtr()); #if defined(OS_ANDROID) - if (download_type_ == TYPE_ACTIVE_DOWNLOAD && - DownloadCollectionBridge::ShouldPublishDownload(GetTargetFilePath())) { + if ((download_type_ == TYPE_ACTIVE_DOWNLOAD && + DownloadCollectionBridge::ShouldPublishDownload(GetTargetFilePath())) || + GetTargetFilePath().IsContentUri()) { GetDownloadTaskRunner()->PostTask( FROM_HERE, - base::BindOnce(&DownloadFile::CreateIntermediateUriForPublish, + base::BindOnce(&DownloadFile::RenameToIntermediateUri, // Safe because we control download file lifetime. base::Unretained(download_file_.get()), GetOriginalUrl(), - GetReferrerUrl(), GetTargetFilePath().BaseName(), - GetMimeType(), std::move(callback))); + GetReferrerUrl(), GetFileNameToReportUser(), + GetMimeType(), GetTargetFilePath(), + std::move(callback))); return; } #endif // defined(OS_ANDROID)
diff --git a/components/download/public/common/download_file.h b/components/download/public/common/download_file.h index 98c5a1bd..6cfd902 100644 --- a/components/download/public/common/download_file.h +++ b/components/download/public/common/download_file.h
@@ -119,13 +119,16 @@ virtual void Resume() = 0; #if defined(OS_ANDROID) - // Create an intermediate URI to write the download file. Once completes, - // |callback| is called with a content URI to be written into. - virtual void CreateIntermediateUriForPublish( + // Renames the download file to an intermediate URI. If current_path is a + // content URI, it will be used for the renaming. Otherwise, A new + // intermediate URI will be created to write the download file. Once + // completes, |callback| is called with a content URI to be written into. + virtual void RenameToIntermediateUri( const GURL& original_url, const GURL& referrer_url, const base::FilePath& file_name, const std::string& mime_type, + const base::FilePath& current_path, const RenameCompletionCallback& callback) = 0; // Publishes the download to public. Once completes, |callback| is called with
diff --git a/components/download/public/common/download_file_impl.h b/components/download/public/common/download_file_impl.h index df161412..1b33f39d 100644 --- a/components/download/public/common/download_file_impl.h +++ b/components/download/public/common/download_file_impl.h
@@ -83,11 +83,12 @@ void Resume() override; #if defined(OS_ANDROID) - void CreateIntermediateUriForPublish( + void RenameToIntermediateUri( const GURL& original_url, const GURL& referrer_url, const base::FilePath& file_name, const std::string& mime_type, + const base::FilePath& current_path, const RenameCompletionCallback& callback) override; void PublishDownload(const RenameCompletionCallback& callback) override; base::FilePath GetDisplayName() override;
diff --git a/components/download/public/common/mock_download_file.h b/components/download/public/common/mock_download_file.h index 9c7df15e31..b0a7d25 100644 --- a/components/download/public/common/mock_download_file.h +++ b/components/download/public/common/mock_download_file.h
@@ -70,11 +70,12 @@ MOCK_METHOD0(Pause, void()); MOCK_METHOD0(Resume, void()); #if defined(OS_ANDROID) - MOCK_METHOD5(CreateIntermediateUriForPublish, + MOCK_METHOD6(RenameToIntermediateUri, void(const GURL& original_url, const GURL& referrer_url, const base::FilePath& file_name, const std::string& mime_type, + const base::FilePath& current_path, const RenameCompletionCallback& callback)); MOCK_METHOD1(PublishDownload, void(const RenameCompletionCallback& callback)); MOCK_METHOD0(GetDisplayName, base::FilePath());
diff --git a/components/policy/OWNERS b/components/policy/OWNERS index 6a7add43..83fca31 100644 --- a/components/policy/OWNERS +++ b/components/policy/OWNERS
@@ -6,5 +6,6 @@ pmarko@chromium.org poromov@chromium.org rsorokin@chromium.org +zmin@chromium.org # COMPONENT: Enterprise
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index bc3ba27..2aabf089 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -1260,6 +1260,9 @@ // The value of policy. optional string value = 5; + + // The error message of policy. + optional string error = 6; } // Extension policy information. @@ -1268,7 +1271,7 @@ optional string extension_id = 1; // The list of policies that extension currently uses. - repeated Policy policy_reports = 2; + repeated Policy policies = 2; } // Cloud policy last fetch time.
diff --git a/components/printing/OWNERS b/components/printing/OWNERS index 9b08c66..01ea38e 100644 --- a/components/printing/OWNERS +++ b/components/printing/OWNERS
@@ -1 +1,2 @@ file://printing/OWNERS +# COMPONENT: Internals>Printing
diff --git a/components/printing/browser/OWNERS b/components/printing/browser/OWNERS new file mode 100644 index 0000000..b1b8445d4 --- /dev/null +++ b/components/printing/browser/OWNERS
@@ -0,0 +1 @@ +# COMPONENT: Internals>Printing
diff --git a/components/printing/common/OWNERS b/components/printing/common/OWNERS index a7e6c89..c894089 100644 --- a/components/printing/common/OWNERS +++ b/components/printing/common/OWNERS
@@ -6,3 +6,4 @@ per-file *_param_traits*.*=set noparent per-file *_param_traits*.*=file://ipc/SECURITY_OWNERS +# COMPONENT: Internals>Printing
diff --git a/components/printing_component_strings_grdp/OWNERS b/components/printing_component_strings_grdp/OWNERS index 21ccd7b..4d633703 100644 --- a/components/printing_component_strings_grdp/OWNERS +++ b/components/printing_component_strings_grdp/OWNERS
@@ -1 +1,2 @@ file://components/printing/OWNERS +# COMPONENT: Internals>Printing
diff --git a/components/remote_cocoa/common/BUILD.gn b/components/remote_cocoa/common/BUILD.gn index 6d62fd12..f0a7ba3 100644 --- a/components/remote_cocoa/common/BUILD.gn +++ b/components/remote_cocoa/common/BUILD.gn
@@ -21,7 +21,7 @@ "//mojo/public/mojom/base", "//ui/base/accelerators/mojo:interfaces", "//ui/base/mojom", - "//ui/display/mojo:interfaces", + "//ui/display/mojom", "//ui/events/mojo:interfaces", "//ui/gfx/geometry/mojo", "//ui/gfx/mojo",
diff --git a/components/remote_cocoa/common/native_widget_ns_window_host.mojom b/components/remote_cocoa/common/native_widget_ns_window_host.mojom index ea69b02c..f9925fc1 100644 --- a/components/remote_cocoa/common/native_widget_ns_window_host.mojom +++ b/components/remote_cocoa/common/native_widget_ns_window_host.mojom
@@ -8,7 +8,7 @@ import "ui/base/accelerators/mojo/accelerator.mojom"; import "ui/base/mojom/ui_base_types.mojom"; import "ui/base/mojom/window_open_disposition.mojom"; -import "ui/display/mojo/display.mojom"; +import "ui/display/mojom/display.mojom"; import "ui/events/mojo/event.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/mojo/ca_layer_params.mojom";
diff --git a/components/renderer_context_menu/render_view_context_menu_base.cc b/components/renderer_context_menu/render_view_context_menu_base.cc index 1a55873b..7dc7465 100644 --- a/components/renderer_context_menu/render_view_context_menu_base.cc +++ b/components/renderer_context_menu/render_view_context_menu_base.cc
@@ -204,6 +204,13 @@ menu_model_.AddItem(command_id, title); } +void RenderViewContextMenuBase::AddMenuItemWithIcon( + int command_id, + const base::string16& title, + const gfx::ImageSkia& image) { + menu_model_.AddItemWithIcon(command_id, title, image); +} + void RenderViewContextMenuBase::AddCheckItem(int command_id, const base::string16& title) { menu_model_.AddCheckItem(command_id, title); @@ -219,6 +226,15 @@ menu_model_.AddSubMenu(command_id, label, model); } +void RenderViewContextMenuBase::AddSubMenuWithStringIdAndIcon( + int command_id, + int message_id, + ui::MenuModel* model, + const gfx::ImageSkia& image) { + menu_model_.AddSubMenuWithStringIdAndIcon(command_id, message_id, model, + image); +} + void RenderViewContextMenuBase::UpdateMenuItem(int command_id, bool enabled, bool hidden,
diff --git a/components/renderer_context_menu/render_view_context_menu_base.h b/components/renderer_context_menu/render_view_context_menu_base.h index 09ae71d5..7abdb03 100644 --- a/components/renderer_context_menu/render_view_context_menu_base.h +++ b/components/renderer_context_menu/render_view_context_menu_base.h
@@ -95,11 +95,18 @@ // RenderViewContextMenuProxy implementation. void AddMenuItem(int command_id, const base::string16& title) override; + void AddMenuItemWithIcon(int command_id, + const base::string16& title, + const gfx::ImageSkia& image) override; void AddCheckItem(int command_id, const base::string16& title) override; void AddSeparator() override; void AddSubMenu(int command_id, const base::string16& label, ui::MenuModel* model) override; + void AddSubMenuWithStringIdAndIcon(int command_id, + int message_id, + ui::MenuModel* model, + const gfx::ImageSkia& image) override; void UpdateMenuItem(int command_id, bool enabled, bool hidden,
diff --git a/components/renderer_context_menu/render_view_context_menu_proxy.h b/components/renderer_context_menu/render_view_context_menu_proxy.h index f094fae..2f3d25b 100644 --- a/components/renderer_context_menu/render_view_context_menu_proxy.h +++ b/components/renderer_context_menu/render_view_context_menu_proxy.h
@@ -15,6 +15,7 @@ namespace gfx { class Image; +class ImageSkia; } namespace ui { @@ -80,6 +81,9 @@ public: // Add a menu item to a context menu. virtual void AddMenuItem(int command_id, const base::string16& title) = 0; + virtual void AddMenuItemWithIcon(int command_id, + const base::string16& title, + const gfx::ImageSkia& image) = 0; virtual void AddCheckItem(int command_id, const base::string16& title) = 0; virtual void AddSeparator() = 0; @@ -87,6 +91,10 @@ virtual void AddSubMenu(int command_id, const base::string16& label, ui::MenuModel* model) = 0; + virtual void AddSubMenuWithStringIdAndIcon(int command_id, + int message_id, + ui::MenuModel* model, + const gfx::ImageSkia& image) = 0; // Update the status and text of the specified context-menu item. virtual void UpdateMenuItem(int command_id,
diff --git a/components/version_info/OWNERS b/components/version_info/OWNERS index d33a4b7d..a4b70b7 100644 --- a/components/version_info/OWNERS +++ b/components/version_info/OWNERS
@@ -2,3 +2,4 @@ sky@chromium.org thakis@chromium.org thestig@chromium.org +# COMPONENT: Internals
diff --git a/components/viz/service/display/renderer_perftest.cc b/components/viz/service/display/renderer_perftest.cc index 50bbbb5..6588ea4 100644 --- a/components/viz/service/display/renderer_perftest.cc +++ b/components/viz/service/display/renderer_perftest.cc
@@ -28,6 +28,7 @@ #include "components/viz/service/display/display.h" #include "components/viz/service/display/gl_renderer.h" #include "components/viz/service/display/output_surface_client.h" +#include "components/viz/service/display/skia_renderer.h" #include "components/viz/service/display_embedder/gl_output_surface_offscreen.h" #include "components/viz/service/display_embedder/in_process_gpu_memory_buffer_manager.h" #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 866b6ea..2a5247a 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -511,8 +511,6 @@ "background_sync/background_sync_metrics.h", "background_sync/background_sync_network_observer.cc", "background_sync/background_sync_network_observer.h", - "background_sync/background_sync_proxy.cc", - "background_sync/background_sync_proxy.h", "background_sync/background_sync_registration.cc", "background_sync/background_sync_registration.h", "background_sync/background_sync_registration_helper.cc",
diff --git a/content/browser/background_sync/background_sync_context_impl.cc b/content/browser/background_sync/background_sync_context_impl.cc index 9d4de6a..51ef58d9 100644 --- a/content/browser/background_sync/background_sync_context_impl.cc +++ b/content/browser/background_sync/background_sync_context_impl.cc
@@ -51,13 +51,12 @@ // static void BackgroundSyncContext::GetSoonestWakeupDeltaAcrossPartitions( - blink::mojom::BackgroundSyncType sync_type, BrowserContext* browser_context, base::OnceCallback<void(base::TimeDelta)> callback) { DCHECK(browser_context); DCHECK_CURRENTLY_ON(BrowserThread::UI); - BackgroundSyncLauncher::GetSoonestWakeupDelta(sync_type, browser_context, + BackgroundSyncLauncher::GetSoonestWakeupDelta(browser_context, std::move(callback)); } @@ -140,23 +139,18 @@ } void BackgroundSyncContextImpl::GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync, base::OnceCallback<void(base::TimeDelta)> callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); base::PostTaskWithTraitsAndReplyWithResult( FROM_HERE, {BrowserThread::IO}, base::BindOnce( - &BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread, this, - sync_type, last_browser_wakeup_for_periodic_sync), + &BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread, this), base::BindOnce(&BackgroundSyncContextImpl::DidGetSoonestWakeupDelta, this, std::move(callback))); } -base::TimeDelta BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync) { +base::TimeDelta BackgroundSyncContextImpl::GetSoonestWakeupDeltaOnIOThread() { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (!test_wakeup_delta_.is_max()) @@ -164,8 +158,9 @@ if (!background_sync_manager_) return base::TimeDelta::Max(); + // TODO(crbug.com/925297): Add a wakeup task for PERIODIC_SYNC registrations. return background_sync_manager_->GetSoonestWakeupDelta( - sync_type, last_browser_wakeup_for_periodic_sync); + blink::mojom::BackgroundSyncType::ONE_SHOT); } void BackgroundSyncContextImpl::DidGetSoonestWakeupDelta(
diff --git a/content/browser/background_sync/background_sync_context_impl.h b/content/browser/background_sync/background_sync_context_impl.h index ba54a87..a242fa35 100644 --- a/content/browser/background_sync/background_sync_context_impl.h +++ b/content/browser/background_sync/background_sync_context_impl.h
@@ -71,8 +71,6 @@ void FireBackgroundSyncEvents(blink::mojom::BackgroundSyncType sync_type, base::OnceClosure done_closure) override; void GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync, base::OnceCallback<void(base::TimeDelta)> callback) override; protected: @@ -88,7 +86,6 @@ friend class OneShotBackgroundSyncServiceImplTest; friend class PeriodicBackgroundSyncServiceImplTest; friend class BackgroundSyncLauncherTest; - friend class BackgroundSyncManagerTest; void FireBackgroundSyncEventsOnIOThread( blink::mojom::BackgroundSyncType sync_type, @@ -107,9 +104,7 @@ void ShutdownOnIO(); - base::TimeDelta GetSoonestWakeupDeltaOnIOThread( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync); + base::TimeDelta GetSoonestWakeupDeltaOnIOThread(); void DidGetSoonestWakeupDelta( base::OnceCallback<void(base::TimeDelta)> callback, base::TimeDelta soonest_wakeup_delta);
diff --git a/content/browser/background_sync/background_sync_launcher.cc b/content/browser/background_sync/background_sync_launcher.cc index 0f9c401..44074bb 100644 --- a/content/browser/background_sync/background_sync_launcher.cc +++ b/content/browser/background_sync/background_sync_launcher.cc
@@ -59,13 +59,11 @@ // static void BackgroundSyncLauncher::GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, BrowserContext* browser_context, base::OnceCallback<void(base::TimeDelta)> callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - Get()->GetSoonestWakeupDeltaImpl(sync_type, browser_context, - std::move(callback)); + Get()->GetSoonestWakeupDeltaImpl(browser_context, std::move(callback)); } // static @@ -77,17 +75,6 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(browser_context); - Get()->FireBackgroundSyncEventsImpl(browser_context, sync_type, j_runnable); -} - -void BackgroundSyncLauncher::FireBackgroundSyncEventsImpl( - BrowserContext* browser_context, - blink::mojom::BackgroundSyncType sync_type, - const base::android::JavaParamRef<jobject>& j_runnable) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - DCHECK(browser_context); - if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC) - last_browser_wakeup_for_periodic_sync_ = base::Time::Now(); base::RepeatingClosure done_closure = base::BarrierClosure( GetStoragePartitionCount(browser_context), base::BindOnce(base::android::RunRunnableAndroid, @@ -115,7 +102,6 @@ BackgroundSyncLauncher::~BackgroundSyncLauncher() = default; void BackgroundSyncLauncher::GetSoonestWakeupDeltaImpl( - blink::mojom::BackgroundSyncType sync_type, BrowserContext* browser_context, base::OnceCallback<void(base::TimeDelta)> callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -130,11 +116,10 @@ browser_context, base::BindRepeating( &BackgroundSyncLauncher::GetSoonestWakeupDeltaForStoragePartition, - base::Unretained(this), sync_type, std::move(done_closure))); + base::Unretained(this), std::move(done_closure))); } void BackgroundSyncLauncher::GetSoonestWakeupDeltaForStoragePartition( - blink::mojom::BackgroundSyncType sync_type, base::OnceClosure done_closure, StoragePartition* storage_partition) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -143,25 +128,20 @@ storage_partition->GetBackgroundSyncContext(); DCHECK(sync_context); - sync_context->GetSoonestWakeupDelta( - sync_type, last_browser_wakeup_for_periodic_sync_, - base::BindOnce( - [](base::OnceClosure done_closure, - base::TimeDelta* soonest_wakeup_delta, - base::TimeDelta wakeup_delta) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - *soonest_wakeup_delta = - std::min(*soonest_wakeup_delta, wakeup_delta); - std::move(done_closure).Run(); - }, - std::move(done_closure), &soonest_wakeup_delta_)); + sync_context->GetSoonestWakeupDelta(base::BindOnce( + [](base::OnceClosure done_closure, base::TimeDelta* soonest_wakeup_delta, + base::TimeDelta wakeup_delta) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + *soonest_wakeup_delta = std::min(*soonest_wakeup_delta, wakeup_delta); + std::move(done_closure).Run(); + }, + std::move(done_closure), &soonest_wakeup_delta_)); } void BackgroundSyncLauncher::SendSoonestWakeupDelta( base::OnceCallback<void(base::TimeDelta)> callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - std::move(callback).Run(soonest_wakeup_delta_); } -} // namespace content +} // namespace content \ No newline at end of file
diff --git a/content/browser/background_sync/background_sync_launcher.h b/content/browser/background_sync/background_sync_launcher.h index 39c06ba..6bdb47a 100644 --- a/content/browser/background_sync/background_sync_launcher.h +++ b/content/browser/background_sync/background_sync_launcher.h
@@ -27,7 +27,6 @@ public: static BackgroundSyncLauncher* Get(); static void GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, BrowserContext* browser_context, base::OnceCallback<void(base::TimeDelta)> callback); #if defined(OS_ANDROID) @@ -35,37 +34,26 @@ BrowserContext* browser_context, blink::mojom::BackgroundSyncType sync_type, const base::android::JavaParamRef<jobject>& j_runnable); - base::TimeDelta TimeSinceLastBrowserWakeUpForPeriodicSync(); #endif private: friend struct base::LazyInstanceTraitsBase<BackgroundSyncLauncher>; friend class BackgroundSyncLauncherTest; - friend class BackgroundSyncManagerTest; // Constructor and destructor marked private to enforce singleton. BackgroundSyncLauncher(); ~BackgroundSyncLauncher(); void GetSoonestWakeupDeltaImpl( - blink::mojom::BackgroundSyncType sync_type, BrowserContext* browser_context, base::OnceCallback<void(base::TimeDelta)> callback); -#if defined(OS_ANDROID) - void FireBackgroundSyncEventsImpl( - BrowserContext* browser_context, - blink::mojom::BackgroundSyncType sync_type, - const base::android::JavaParamRef<jobject>& j_runnable); -#endif void GetSoonestWakeupDeltaForStoragePartition( - blink::mojom::BackgroundSyncType sync_type, base::OnceClosure done_closure, StoragePartition* storage_partition); void SendSoonestWakeupDelta( base::OnceCallback<void(base::TimeDelta)> callback); base::TimeDelta soonest_wakeup_delta_ = base::TimeDelta::Max(); - base::Time last_browser_wakeup_for_periodic_sync_; DISALLOW_COPY_AND_ASSIGN(BackgroundSyncLauncher); };
diff --git a/content/browser/background_sync/background_sync_launcher_unittest.cc b/content/browser/background_sync/background_sync_launcher_unittest.cc index 60e4472..2d11ed1 100644 --- a/content/browser/background_sync/background_sync_launcher_unittest.cc +++ b/content/browser/background_sync/background_sync_launcher_unittest.cc
@@ -90,11 +90,10 @@ void TearDown() override { SetBrowserClientForTesting(original_client_); } - base::TimeDelta GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type) { + base::TimeDelta GetSoonestWakeupDelta() { base::TimeDelta to_return; BackgroundSyncLauncher::GetSoonestWakeupDelta( - sync_type, &test_browser_context_, + &test_browser_context_, base::BindLambdaForTesting( [&to_return](base::TimeDelta soonest_wakeup_delta) { to_return = soonest_wakeup_delta; @@ -152,8 +151,7 @@ // to base::TimeDelta::Max(). This will cause cancellation of the wakeup // task. SetUpBrowserContext(urls); - EXPECT_TRUE(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::ONE_SHOT) - .is_max()); + EXPECT_TRUE(GetSoonestWakeupDelta().is_max()); // Add two more storage partitions, this time with wakeup_deltas. // Verify that we pick the smaller of the two. @@ -163,9 +161,7 @@ wakeup_deltas[url] = delta_ms += 1000; SetUpBrowserContext(urls, wakeup_deltas); - EXPECT_EQ(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::ONE_SHOT) - .InMilliseconds(), - 1000); + EXPECT_EQ(GetSoonestWakeupDelta().InMilliseconds(), 1000); } #if defined(OS_ANDROID)
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc index 01c4233..05c6a51 100644 --- a/content/browser/background_sync/background_sync_manager.cc +++ b/content/browser/background_sync/background_sync_manager.cc
@@ -37,7 +37,6 @@ #if defined(OS_ANDROID) #include "content/browser/android/background_sync_network_observer_android.h" -#include "content/browser/background_sync/background_sync_launcher.h" #endif using blink::mojom::BackgroundSyncType; @@ -177,6 +176,17 @@ origin, status_code, num_attempts, max_attempts); } +void RunInBackgroundOnUIThread( + scoped_refptr<ServiceWorkerContextWrapper> sw_context_wrapper) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + BackgroundSyncController* background_sync_controller = + GetBackgroundSyncControllerOnUIThread(sw_context_wrapper); + if (background_sync_controller) { + background_sync_controller->RunInBackground(); + } +} + std::unique_ptr<BackgroundSyncParameters> GetControllerParameters( scoped_refptr<ServiceWorkerContextWrapper> sw_context_wrapper, std::unique_ptr<BackgroundSyncParameters> parameters) { @@ -487,7 +497,6 @@ : op_scheduler_(CacheStorageSchedulerClient::kBackgroundSync, base::ThreadTaskRunnerHandle::Get()), service_worker_context_(std::move(service_worker_context)), - proxy_(service_worker_context_), devtools_context_(std::move(devtools_context)), parameters_(std::make_unique<BackgroundSyncParameters>()), disabled_(false), @@ -495,7 +504,6 @@ clock_(base::DefaultClock::GetInstance()) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(devtools_context_); - DCHECK(service_worker_context_); service_worker_context_->AddObserver(this); @@ -855,7 +863,6 @@ } BackgroundSyncMetrics::CountUnregisterPeriodicSync(BACKGROUND_SYNC_STATUS_OK); - ScheduleDelayedProcessingOfRegistrations(BackgroundSyncType::PERIODIC); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), BACKGROUND_SYNC_STATUS_OK)); @@ -1002,7 +1009,8 @@ registration_could_fire, BackgroundSyncMetrics::REGISTRATION_IS_NOT_DUPLICATE); - ScheduleDelayedProcessingOfRegistrations(BackgroundSyncType::PERIODIC); + // TODO(crbug.com/925297): Schedule or update a wake up task for periodic + // Background Sync registrations. // Tell the client that the registration is ready. We won't fire it until the // client has resolved the registration event. @@ -1181,35 +1189,12 @@ // TODO(crbug.com/961238): Record Periodic Sync events for DevTools. } -base::CancelableOnceClosure& BackgroundSyncManager::get_delayed_task( - BackgroundSyncType sync_type) { - if (sync_type == BackgroundSyncType::ONE_SHOT) - return delayed_one_shot_sync_task_; - return delayed_periodic_sync_task_; -} - -void BackgroundSyncManager::ScheduleDelayedTask(BackgroundSyncType sync_type, +void BackgroundSyncManager::ScheduleDelayedTask(base::OnceClosure callback, base::TimeDelta delay) { - base::OnceClosure callback = get_delayed_task(sync_type).callback(); - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, std::move(callback), delay); } -void BackgroundSyncManager::ResetAndScheduleDelayedSyncTask( - BackgroundSyncType sync_type, - base::TimeDelta soonest_wakeup_delta) { - if (soonest_wakeup_delta.is_max() || soonest_wakeup_delta.is_zero()) - return; - - auto fire_events_callback = base::BindOnce( - &BackgroundSyncManager::FireReadyEvents, weak_ptr_factory_.GetWeakPtr(), - sync_type, MakeEmptyCompletion(), /* keepalive= */ nullptr); - - get_delayed_task(sync_type).Reset(std::move(fire_events_callback)); - ScheduleDelayedTask(sync_type, soonest_wakeup_delta); -} - void BackgroundSyncManager::HasMainFrameProviderHost(const url::Origin& origin, BoolCallback callback) { service_worker_context_->HasMainFrameProviderHost(origin.GetURL(), @@ -1279,11 +1264,9 @@ } base::TimeDelta BackgroundSyncManager::GetSoonestWakeupDelta( - BackgroundSyncType sync_type, - base::Time last_browser_wakeup_time) { + BackgroundSyncType sync_type) { DCHECK_CURRENTLY_ON(BrowserThread::IO); base::TimeDelta soonest_wakeup_delta = base::TimeDelta::Max(); - bool need_retries = false; for (const auto& sw_reg_id_and_registrations : active_registrations_) { for (const auto& key_and_registration : sw_reg_id_and_registrations.second.registration_map) { @@ -1291,10 +1274,6 @@ key_and_registration.second; if (registration.sync_type() != sync_type) continue; - if (registration.num_attempts() > 0 && - registration.num_attempts() < registration.max_attempts()) { - need_retries = true; - } if (registration.sync_state() == blink::mojom::BackgroundSyncState::PENDING) { if (clock_->Now() >= registration.delay_until()) { @@ -1311,49 +1290,37 @@ // If the browser is closed while firing events, the browser needs a task to // wake it back up and try again. - if (num_firing_registrations_ > 0 && + if (sync_type == BackgroundSyncType::ONE_SHOT && + num_firing_registrations_ > 0 && soonest_wakeup_delta > parameters_->min_sync_recovery_time) { soonest_wakeup_delta = parameters_->min_sync_recovery_time; } - // The browser may impose a hard limit on how often it can be woken up to - // process periodic Background Sync registrations. This excludes retries. - if (sync_type == BackgroundSyncType::PERIODIC && !need_retries) { - soonest_wakeup_delta = MaybeApplyBrowserWakeupCountLimit( - soonest_wakeup_delta, last_browser_wakeup_time); - } return soonest_wakeup_delta; } -base::TimeDelta BackgroundSyncManager::MaybeApplyBrowserWakeupCountLimit( - base::TimeDelta soonest_wakeup_delta, - base::Time last_browser_wakeup_time) { +// TODO(crbug.com/925297): Update to also schedule a wakeup task for Periodic +// Background Sync. +void BackgroundSyncManager::RunInBackgroundIfNecessary() { DCHECK_CURRENTLY_ON(BrowserThread::IO); - if (last_browser_wakeup_time.is_null()) - return soonest_wakeup_delta; - base::TimeDelta time_since_last_browser_wakeup = - clock_->Now() - last_browser_wakeup_time; - if (time_since_last_browser_wakeup >= - parameters_->min_periodic_sync_events_interval) { - return soonest_wakeup_delta; + base::TimeDelta soonest_wakeup_delta = + GetSoonestWakeupDelta(BackgroundSyncType::ONE_SHOT); + + // Try firing again after the wakeup delta. + if (!soonest_wakeup_delta.is_max() && !soonest_wakeup_delta.is_zero()) { + delayed_sync_task_.Reset(base::BindOnce( + &BackgroundSyncManager::FireReadyEvents, weak_ptr_factory_.GetWeakPtr(), + BackgroundSyncType::ONE_SHOT, MakeEmptyCompletion(), + /* keepalive= */ nullptr)); + ScheduleDelayedTask(delayed_sync_task_.callback(), soonest_wakeup_delta); } - base::TimeDelta time_till_next_allowed_browser_wakeup = - parameters_->min_periodic_sync_events_interval - - time_since_last_browser_wakeup; - return std::max(soonest_wakeup_delta, time_till_next_allowed_browser_wakeup); -} - -void BackgroundSyncManager::ScheduleDelayedProcessingOfRegistrations( - blink::mojom::BackgroundSyncType sync_type) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - ResetAndScheduleDelayedSyncTask( - sync_type, - GetSoonestWakeupDelta(sync_type, - /* last_browser_wakeup_time= */ base::Time())); - proxy_.ScheduleBrowserWakeUp(sync_type); + // In case the browser closes (or to prevent it from closing), call + // RunInBackground to wake up the browser at the wakeup delta. + base::PostTaskWithTraits( + FROM_HERE, {BrowserThread::UI}, + base::BindOnce(RunInBackgroundOnUIThread, service_worker_context_)); } void BackgroundSyncManager::FireReadyEvents( @@ -1411,7 +1378,7 @@ } if (to_fire.empty()) { - ScheduleDelayedProcessingOfRegistrations(sync_type); + RunInBackgroundIfNecessary(); base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); return; @@ -1424,8 +1391,7 @@ base::RepeatingClosure events_fired_barrier_closure = base::BarrierClosure( to_fire.size(), base::BindOnce(&BackgroundSyncManager::FireReadyEventsAllEventsFiring, - weak_ptr_factory_.GetWeakPtr(), sync_type, - std::move(callback))); + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); // Record the total time taken after all events have run to completion. base::RepeatingClosure events_completed_barrier_closure = @@ -1523,10 +1489,10 @@ } void BackgroundSyncManager::FireReadyEventsAllEventsFiring( - BackgroundSyncType sync_type, base::OnceClosure callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - ScheduleDelayedProcessingOfRegistrations(sync_type); + + RunInBackgroundIfNecessary(); base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); } @@ -1727,8 +1693,10 @@ } // Fire any ready events and call RunInBackground if anything is waiting. + // We don't need to do this for periodic Background Sync registrations, since + // once all events have been dispatched, we'll schedule a delayed task to + // (wake up Chrome and) fire the next set of periodicsync events. FireReadyEvents(BackgroundSyncType::ONE_SHOT, MakeEmptyCompletion()); - FireReadyEvents(BackgroundSyncType::PERIODIC, MakeEmptyCompletion()); base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); }
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h index 87c2819..c9beff4 100644 --- a/content/browser/background_sync/background_sync_manager.h +++ b/content/browser/background_sync/background_sync_manager.h
@@ -21,7 +21,6 @@ #include "base/time/clock.h" #include "base/time/time.h" #include "content/browser/background_sync/background_sync.pb.h" -#include "content/browser/background_sync/background_sync_proxy.h" #include "content/browser/background_sync/background_sync_registration.h" #include "content/browser/background_sync/background_sync_status.h" #include "content/browser/cache_storage/cache_storage_scheduler.h" @@ -148,23 +147,8 @@ // Gets the soonest delta after which the browser should be woken up to send // a Background Sync event. If set to max, the browser won't be woken up. // Only registrations of type |sync_type| are considered. - // Browsers can have a hard limit on how often to wake themselves up to - // process Periodic Background Sync registrations. We apply this limit if - // |last_browser_wakeup_time| is not null. - // This limit is only applied when calculating the soonest wake up delta to - // wake up Chrome. It's not applied when calculating the time after which a - // delayed task should be run to process Background Sync registrations. virtual base::TimeDelta GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_time); - - // Browsers can have a hard limit on how often to wake themselves up to - // process Periodic Background Sync registrations. If the browser can't be - // woken up after |wakeup_delta| to do so, returns an updated delta after - // which it's safe to wake the browser. This limit doesn't apply to retries. - base::TimeDelta MaybeApplyBrowserWakeupCountLimit( - base::TimeDelta wakeup_delta, - base::Time last_browser_wakeup_time); + blink::mojom::BackgroundSyncType sync_type); protected: BackgroundSyncManager( @@ -193,7 +177,7 @@ const std::string& tag, scoped_refptr<ServiceWorkerVersion> active_version, ServiceWorkerVersion::StatusCallback callback); - virtual void ScheduleDelayedTask(blink::mojom::BackgroundSyncType sync_type, + virtual void ScheduleDelayedTask(base::OnceClosure callback, base::TimeDelta delay); virtual void HasMainFrameProviderHost(const url::Origin& origin, BoolCallback callback); @@ -316,21 +300,12 @@ // Assumes that all registrations in the pending state are not currently ready // to fire. Therefore this should not be called directly and should only be // called by FireReadyEvents. - void ScheduleDelayedProcessingOfRegistrations( - blink::mojom::BackgroundSyncType sync_type); - - base::CancelableOnceClosure& get_delayed_task( - blink::mojom::BackgroundSyncType sync_type); - - void ResetAndScheduleDelayedSyncTask( - blink::mojom::BackgroundSyncType sync_type, - base::TimeDelta soonest_wakeup_delta); + void RunInBackgroundIfNecessary(); void FireReadyEventsImpl( blink::mojom::BackgroundSyncType sync_type, base::OnceClosure callback, std::unique_ptr<BackgroundSyncEventKeepAlive> keepalive); - void FireReadyEventsDidFindRegistration( blink::mojom::BackgroundSyncRegistrationInfoPtr registration_info, std::unique_ptr<BackgroundSyncEventKeepAlive> keepalive, @@ -338,9 +313,7 @@ base::OnceClosure event_completed_callback, blink::ServiceWorkerStatusCode service_worker_status, scoped_refptr<ServiceWorkerRegistration> service_worker_registration); - void FireReadyEventsAllEventsFiring( - blink::mojom::BackgroundSyncType sync_type, - base::OnceClosure callback); + void FireReadyEventsAllEventsFiring(base::OnceClosure callback); // Called when a sync event has completed. void EventComplete( @@ -396,9 +369,8 @@ CacheStorageScheduler op_scheduler_; scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_; - BackgroundSyncProxy proxy_; - scoped_refptr<DevToolsBackgroundServicesContextImpl> devtools_context_; + std::unique_ptr<BackgroundSyncParameters> parameters_; // True if the manager is disabled and registrations should fail. @@ -407,8 +379,7 @@ // The number of registrations currently in the firing state. int num_firing_registrations_; - base::CancelableOnceClosure delayed_one_shot_sync_task_; - base::CancelableOnceClosure delayed_periodic_sync_task_; + base::CancelableOnceClosure delayed_sync_task_; std::unique_ptr<BackgroundSyncNetworkObserver> network_observer_;
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index ff1f498..c35e11c 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -23,8 +23,6 @@ #include "base/test/mock_entropy_provider.h" #include "base/test/simple_test_clock.h" #include "base/threading/thread_task_runner_handle.h" -#include "build/build_config.h" -#include "content/browser/background_sync/background_sync_launcher.h" #include "content/browser/background_sync/background_sync_network_observer.h" #include "content/browser/background_sync/background_sync_status.h" #include "content/browser/devtools/devtools_background_services_context_impl.h" @@ -42,7 +40,6 @@ #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_utils.h" #include "content/test/mock_background_sync_controller.h" -#include "content/test/test_background_sync_context.h" #include "content/test/test_background_sync_manager.h" #include "services/network/test/test_network_connection_tracker.h" #include "testing/gmock/include/gmock/gmock.h" @@ -132,10 +129,11 @@ // Create a StoragePartition with the correct BrowserContext so that the // BackgroundSyncManager can find the BrowserContext through it. - storage_partition_impl_ = static_cast<StoragePartitionImpl*>( - BrowserContext::GetStoragePartitionForSite( - helper_->browser_context(), GURL("https://example.com"))); - helper_->context_wrapper()->set_storage_partition(storage_partition_impl_); + storage_partition_impl_ = StoragePartitionImpl::Create( + helper_->browser_context(), /* in_memory= */ true, base::FilePath(), + /* partition_domain= */ ""); + helper_->context_wrapper()->set_storage_partition( + storage_partition_impl_.get()); SetMaxSyncAttemptsAndRestartManager(1); @@ -153,7 +151,6 @@ ->RemoveObserver(this); // Restore the network observer functionality for subsequent tests. background_sync_test_util::SetIgnoreNetworkChanges(false); - background_sync_context_->Shutdown(); } void RegisterServiceWorkers() { @@ -195,9 +192,9 @@ void SetNetwork(network::mojom::ConnectionType connection_type) { network::TestNetworkConnectionTracker::GetInstance()->SetConnectionType( connection_type); - if (test_background_sync_manager()) { + if (test_background_sync_manager_) { BackgroundSyncNetworkObserver* network_observer = - test_background_sync_manager()->GetNetworkObserverForTesting(); + test_background_sync_manager_->GetNetworkObserverForTesting(); network_observer->NotifyManagerIfConnectionChangedForTesting( connection_type); base::RunLoop().RunUntilIdle(); @@ -245,16 +242,9 @@ callback_status_ = status; } - TestBackgroundSyncManager* test_background_sync_manager() { - return static_cast<TestBackgroundSyncManager*>( - background_sync_context_->background_sync_manager()); - } - base::TimeDelta GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync) { - return test_background_sync_manager()->GetSoonestWakeupDelta( - sync_type, last_browser_wakeup_for_periodic_sync); + blink::mojom::BackgroundSyncType sync_type) { + return test_background_sync_manager_->GetSoonestWakeupDelta(sync_type); } protected: @@ -264,24 +254,11 @@ void(bool, devtools::proto::BackgroundService)); void CreateBackgroundSyncManager() { - if (background_sync_context_) { - background_sync_context_->Shutdown(); - base::RunLoop().RunUntilIdle(); - } - - background_sync_context_ = - base::MakeRefCounted<TestBackgroundSyncContext>(); - background_sync_context_->Init( + test_background_sync_manager_ = std::make_unique<TestBackgroundSyncManager>( helper_->context_wrapper(), storage_partition_impl_->GetDevToolsBackgroundServicesContext()); - base::RunLoop().RunUntilIdle(); - storage_partition_impl_->ShutdownBackgroundSyncContextForTesting(); - base::RunLoop().RunUntilIdle(); - storage_partition_impl_->OverrideBackgroundSyncContextForTesting( - background_sync_context_.get()); - - test_background_sync_manager()->set_clock(&test_clock_); + test_background_sync_manager_->set_clock(&test_clock_); // Many tests do not expect the sync event to fire immediately after // register (and cleanup up the sync registrations). Tests can control when @@ -292,7 +269,7 @@ } void InitBackgroundSyncManager() { - test_background_sync_manager()->DoInit(); + test_background_sync_manager_->DoInit(); base::RunLoop().RunUntilIdle(); } @@ -303,19 +280,18 @@ void SetupCorruptBackgroundSyncManager() { CreateBackgroundSyncManager(); - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); InitBackgroundSyncManager(); } void SetupDelayedBackgroundSyncManager() { CreateBackgroundSyncManager(); - test_background_sync_manager()->set_delay_backend(true); + test_background_sync_manager_->set_delay_backend(true); InitBackgroundSyncManager(); } void DeleteBackgroundSyncManager() { - storage_partition_impl_->GetBackgroundSyncContext() - ->set_background_sync_manager_for_testing(nullptr); + test_background_sync_manager_ = nullptr; } bool Register(blink::mojom::SyncRegistrationOptions sync_options) { @@ -335,14 +311,14 @@ BackgroundSyncStatus* callback_status; if (GetBackgroundSyncType(options) == blink::mojom::BackgroundSyncType::ONE_SHOT) { - test_background_sync_manager()->Register( + test_background_sync_manager_->Register( sw_registration_id, std::move(options), base::BindOnce(&BackgroundSyncManagerTest:: StatusAndOneShotSyncRegistrationCallback, base::Unretained(this), &was_called)); callback_status = &one_shot_sync_callback_status_; } else { - test_background_sync_manager()->Register( + test_background_sync_manager_->Register( sw_registration_id, std::move(options), base::BindOnce(&BackgroundSyncManagerTest:: StatusAndPeriodicSyncRegistrationCallback, @@ -356,7 +332,7 @@ // Mock the client receiving the response and calling // DidResolveRegistration. if (*callback_status == BACKGROUND_SYNC_STATUS_OK) { - test_background_sync_manager()->DidResolveRegistration( + test_background_sync_manager_->DidResolveRegistration( blink::mojom::BackgroundSyncRegistrationInfo::New( sw_registration_id, options.tag, GetBackgroundSyncType(options))); base::RunLoop().RunUntilIdle(); @@ -375,7 +351,7 @@ } bool was_called = false; - test_background_sync_manager()->UnregisterPeriodicSync( + test_background_sync_manager_->UnregisterPeriodicSync( sw_registration_id, options.tag, base::BindOnce(&BackgroundSyncManagerTest::StatusCallback, base::Unretained(this), &was_called)); @@ -406,7 +382,7 @@ blink::mojom::SyncRegistrationOptions registration_options) { bool was_called = false; - test_background_sync_manager()->GetOneShotSyncRegistrations( + test_background_sync_manager_->GetOneShotSyncRegistrations( sw_registration_id, base::BindOnce(&BackgroundSyncManagerTest:: StatusAndOneShotSyncRegistrationsCallback, @@ -438,7 +414,7 @@ blink::mojom::SyncRegistrationOptions registration_options) { bool was_called = false; - test_background_sync_manager()->GetPeriodicSyncRegistrations( + test_background_sync_manager_->GetPeriodicSyncRegistrations( sw_registration_id, base::BindOnce(&BackgroundSyncManagerTest:: StatusAndPeriodicSyncRegistrationsCallback, @@ -467,7 +443,7 @@ bool GetOneShotSyncRegistrations() { bool was_called = false; - test_background_sync_manager()->GetOneShotSyncRegistrations( + test_background_sync_manager_->GetOneShotSyncRegistrations( sw_registration_id_1_, base::BindOnce(&BackgroundSyncManagerTest:: StatusAndOneShotSyncRegistrationsCallback, @@ -480,7 +456,7 @@ bool GetPeriodicSyncRegistrations() { bool was_called = false; - test_background_sync_manager()->GetPeriodicSyncRegistrations( + test_background_sync_manager_->GetPeriodicSyncRegistrations( sw_registration_id_1_, base::BindOnce(&BackgroundSyncManagerTest:: StatusAndPeriodicSyncRegistrationsCallback, @@ -517,13 +493,13 @@ void SetupForSyncEvent( const TestBackgroundSyncManager::DispatchSyncCallback& callback) { - test_background_sync_manager()->set_dispatch_sync_callback(callback); + test_background_sync_manager_->set_dispatch_sync_callback(callback); SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI); } void SetupForPeriodicSyncEvent( const TestBackgroundSyncManager::DispatchSyncCallback& callback) { - test_background_sync_manager()->set_dispatch_periodic_sync_callback( + test_background_sync_manager_->set_dispatch_periodic_sync_callback( callback); SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI); } @@ -570,25 +546,12 @@ sync_fired_callback_ = std::move(callback); } - void DispatchPeriodicSyncDelayedCallback( - scoped_refptr<ServiceWorkerVersion> active_version, - ServiceWorkerVersion::StatusCallback callback) { - periodic_sync_events_called_++; - periodic_sync_fired_callback_ = std::move(callback); - } - void InitDelayedSyncEventTest() { SetupForSyncEvent(base::BindRepeating( &BackgroundSyncManagerTest::DispatchSyncDelayedCallback, base::Unretained(this))); } - void InitDelayedPeriodicSyncEventTest() { - SetupForPeriodicSyncEvent(base::BindRepeating( - &BackgroundSyncManagerTest::DispatchPeriodicSyncDelayedCallback, - base::Unretained(this))); - } - void RegisterAndVerifySyncEventDelayed( blink::mojom::SyncRegistrationOptions sync_options) { int count_sync_events = sync_events_called_; @@ -619,27 +582,17 @@ SetupBackgroundSyncManager(); } - void SetPeriodicSyncEventsMinIntervalAndRestartManager( - base::TimeDelta periodic_sync_events_min_interval) { - BackgroundSyncParameters* parameters = - GetController()->background_sync_parameters(); - parameters->min_periodic_sync_events_interval = - periodic_sync_events_min_interval; - - // Restart the BackgroundSyncManager so that it updates its parameters. - SetupBackgroundSyncManager(); - } - - void FireReadyEvents() { test_background_sync_manager()->OnNetworkChanged(); } + void FireReadyEvents() { test_background_sync_manager_->OnNetworkChanged(); } bool AreOptionConditionsMet() { - return test_background_sync_manager()->AreOptionConditionsMet(); + return test_background_sync_manager_->AreOptionConditionsMet(); } TestBrowserThreadBundle browser_thread_bundle_; std::unique_ptr<EmbeddedWorkerTestHelper> helper_; - StoragePartitionImpl* storage_partition_impl_; - scoped_refptr<BackgroundSyncContextImpl> background_sync_context_; + std::unique_ptr<StoragePartitionImpl> storage_partition_impl_; + std::unique_ptr<TestBackgroundSyncManager> test_background_sync_manager_ = + nullptr; base::SimpleTestClock test_clock_; int64_t sw_registration_id_1_; @@ -669,7 +622,6 @@ int sync_events_called_ = 0; int periodic_sync_events_called_ = 0; ServiceWorkerVersion::StatusCallback sync_fired_callback_; - ServiceWorkerVersion::StatusCallback periodic_sync_fired_callback_; }; TEST_F(BackgroundSyncManagerTest, Register) { @@ -695,7 +647,7 @@ EXPECT_TRUE(GetRegistration(sync_options_2_)); // Disable manager. Unregister should fail. - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Unregister(sync_options_2_)); SetupBackgroundSyncManager(); EXPECT_TRUE(Unregister(sync_options_2_)); @@ -728,7 +680,7 @@ TEST_F(BackgroundSyncManagerTest, RegisterAndWaitToFireUntilResolved) { InitSyncEventTest(); bool was_called = false; - test_background_sync_manager()->Register( + test_background_sync_manager_->Register( sw_registration_id_1_, sync_options_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback, @@ -740,7 +692,7 @@ // client to acknowledge with DidResolveRegistration. EXPECT_EQ(0, sync_events_called_); - test_background_sync_manager()->DidResolveRegistration( + test_background_sync_manager_->DidResolveRegistration( blink::mojom::BackgroundSyncRegistrationInfo::New( sw_registration_id_1_, sync_options_1_.tag, GetBackgroundSyncType(sync_options_1_))); @@ -751,7 +703,7 @@ TEST_F(BackgroundSyncManagerTest, ResolveInvalidRegistration) { InitSyncEventTest(); bool was_called = false; - test_background_sync_manager()->Register( + test_background_sync_manager_->Register( sw_registration_id_1_, sync_options_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback, @@ -764,7 +716,7 @@ EXPECT_EQ(0, sync_events_called_); // Resolve a non-existing registration. - test_background_sync_manager()->DidResolveRegistration( + test_background_sync_manager_->DidResolveRegistration( blink::mojom::BackgroundSyncRegistrationInfo::New( sw_registration_id_1_, "unknown_tag", GetBackgroundSyncType(sync_options_1_))); @@ -811,9 +763,9 @@ } TEST_F(BackgroundSyncManagerTest, RegisterBadBackend) { - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Register(sync_options_1_)); - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); EXPECT_FALSE(Register(sync_options_1_)); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -883,13 +835,13 @@ TEST_F(BackgroundSyncManagerTest, GetRegistrationBadBackend) { EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_FALSE(Register(sync_options_2_)); // Registration should have discovered the bad backend and disabled the // BackgroundSyncManager. EXPECT_FALSE(GetRegistration(sync_options_1_)); - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -935,13 +887,13 @@ TEST_F(BackgroundSyncManagerTest, GetRegistrationsBadBackend) { EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_TRUE(GetOneShotSyncRegistrations()); EXPECT_FALSE(Register(sync_options_2_)); // Registration should have discovered the bad backend and disabled the // BackgroundSyncManager. EXPECT_FALSE(GetOneShotSyncRegistrations()); - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); EXPECT_FALSE(GetOneShotSyncRegistrations()); } @@ -1031,12 +983,12 @@ bool register_called = false; bool get_registrations_called = false; - test_background_sync_manager()->Register( + test_background_sync_manager_->Register( sw_registration_id_1_, sync_options_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback, base::Unretained(this), ®ister_called)); - test_background_sync_manager()->GetOneShotSyncRegistrations( + test_background_sync_manager_->GetOneShotSyncRegistrations( sw_registration_id_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationsCallback, @@ -1047,13 +999,13 @@ EXPECT_FALSE(register_called); EXPECT_FALSE(get_registrations_called); - test_background_sync_manager()->ResumeBackendOperation(); + test_background_sync_manager_->ResumeBackendOperation(); base::RunLoop().RunUntilIdle(); // Register should be blocked while storing to the backend. EXPECT_FALSE(register_called); EXPECT_FALSE(get_registrations_called); - test_background_sync_manager()->ResumeBackendOperation(); + test_background_sync_manager_->ResumeBackendOperation(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(register_called); EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK, one_shot_sync_callback_status_); @@ -1072,9 +1024,9 @@ EXPECT_TRUE(Register(sync_options_1_)); sync_options_2_.min_interval = 3600; - test_background_sync_manager()->set_delay_backend(true); + test_background_sync_manager_->set_delay_backend(true); bool callback_called = false; - test_background_sync_manager()->Register( + test_background_sync_manager_->Register( sw_registration_id_1_, sync_options_2_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndPeriodicSyncRegistrationCallback, @@ -1084,13 +1036,13 @@ EXPECT_FALSE(callback_called); UnregisterServiceWorker(sw_registration_id_1_); - test_background_sync_manager()->ResumeBackendOperation(); + test_background_sync_manager_->ResumeBackendOperation(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(callback_called); EXPECT_EQ(BACKGROUND_SYNC_STATUS_STORAGE_ERROR, periodic_sync_callback_status_); - test_background_sync_manager()->set_delay_backend(false); + test_background_sync_manager_->set_delay_backend(false); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -1102,12 +1054,12 @@ TEST_F(BackgroundSyncManagerTest, DisabledManagerWorksAfterBrowserRestart) { EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Register(sync_options_2_)); // The manager is now disabled and not accepting new requests until browser // restart or notification that the storage has been wiped. - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); EXPECT_FALSE(GetRegistration(sync_options_1_)); EXPECT_FALSE(Register(sync_options_2_)); @@ -1119,12 +1071,12 @@ TEST_F(BackgroundSyncManagerTest, DisabledManagerWorksAfterDeleteAndStartOver) { EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Register(sync_options_2_)); // The manager is now disabled and not accepting new requests until browser // restart or notification that the storage has been wiped. - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); DeleteServiceWorkerAndStartOver(); RegisterServiceWorkers(); @@ -1287,10 +1239,10 @@ // Corrupting the backend should result in the manager disabling itself on the // next operation. - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Register(sync_options_2_)); - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI); base::RunLoop().RunUntilIdle(); EXPECT_EQ(0, sync_events_called_); @@ -1304,9 +1256,9 @@ // Corrupting the backend should result in the manager disabling itself on the // next operation. - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); EXPECT_FALSE(Register(sync_options_2_)); - test_background_sync_manager()->set_corrupt_backend(false); + test_background_sync_manager_->set_corrupt_backend(false); // Successfully complete the firing event. We can't verify that it actually // completed but at least we can test that it doesn't crash. @@ -1411,7 +1363,7 @@ RegisterAndVerifySyncEventDelayed(sync_options_1_); - test_background_sync_manager()->set_corrupt_backend(true); + test_background_sync_manager_->set_corrupt_backend(true); ASSERT_TRUE(sync_fired_callback_); std::move(sync_fired_callback_).Run(blink::ServiceWorkerStatusCode::kOk); base::RunLoop().RunUntilIdle(); @@ -1453,13 +1405,13 @@ } TEST_F(BackgroundSyncManagerTest, RegisterWithoutMainFrame) { - test_background_sync_manager()->set_has_main_frame_provider_host(false); + test_background_sync_manager_->set_has_main_frame_provider_host(false); EXPECT_FALSE(Register(sync_options_1_)); } TEST_F(BackgroundSyncManagerTest, RegisterExistingWithoutMainFrame) { EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager()->set_has_main_frame_provider_host(false); + test_background_sync_manager_->set_has_main_frame_provider_host(false); EXPECT_FALSE(Register(sync_options_1_)); } @@ -1469,7 +1421,7 @@ SetupBackgroundSyncManager(); EXPECT_EQ(BackgroundSyncParameters(), - *test_background_sync_manager()->background_sync_parameters()); + *test_background_sync_manager_->background_sync_parameters()); } TEST_F(BackgroundSyncManagerTest, OverrideParameters) { @@ -1491,7 +1443,7 @@ one_shot_sync_callback_status_); const BackgroundSyncParameters* manager_parameters = - test_background_sync_manager()->background_sync_parameters(); + test_background_sync_manager_->background_sync_parameters(); EXPECT_EQ(*parameters, *manager_parameters); } @@ -1545,92 +1497,36 @@ GetController()->registration_origin()); } -TEST_F(BackgroundSyncManagerTest, WakeBrowserCalledForOneShotSync) { +TEST_F(BackgroundSyncManagerTest, WakeBrowserCalled) { SetupBackgroundSyncManager(); InitDelayedSyncEventTest(); // The BackgroundSyncManager should declare in initialization // that it doesn't need to be woken up since it has no registrations. EXPECT_LT(0, GetController()->run_in_background_count()); - EXPECT_FALSE( - test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled()); + EXPECT_FALSE(test_background_sync_manager_->IsBrowserWakeupScheduled()); SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE); - EXPECT_FALSE( - test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled()); + EXPECT_FALSE(test_background_sync_manager_->IsBrowserWakeupScheduled()); // Register a one-shot but it can't fire due to lack of network, wake up is // required. Register(sync_options_1_); - EXPECT_TRUE( - test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled()); + EXPECT_TRUE(test_background_sync_manager_->IsBrowserWakeupScheduled()); // Start the event but it will pause mid-sync due to // InitDelayedSyncEventTest() above. SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI); - EXPECT_TRUE( - test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled()); - EXPECT_TRUE(test_background_sync_manager()->EqualsSoonestOneShotWakeupDelta( - test_background_sync_manager() - ->background_sync_parameters() + EXPECT_TRUE(test_background_sync_manager_->IsBrowserWakeupScheduled()); + EXPECT_TRUE(test_background_sync_manager_->EqualsSoonestOneShotWakeupDelta( + test_background_sync_manager_->background_sync_parameters() ->min_sync_recovery_time)); // Finish the sync. ASSERT_TRUE(sync_fired_callback_); std::move(sync_fired_callback_).Run(blink::ServiceWorkerStatusCode::kOk); base::RunLoop().RunUntilIdle(); - EXPECT_FALSE( - test_background_sync_manager()->IsBrowserWakeupForOneShotSyncScheduled()); -} - -TEST_F(BackgroundSyncManagerTest, WakeBrowserCalledForPeriodicSync) { - SetupBackgroundSyncManager(); - InitDelayedPeriodicSyncEventTest(); - - // The BackgroundSyncManager should declare in initialization - // that it doesn't need to be woken up since it has no registrations. - EXPECT_LT(0, GetController()->run_in_background_periodic_sync_count()); - EXPECT_FALSE(test_background_sync_manager() - ->IsBrowserWakeupForPeriodicSyncScheduled()); - - SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE); - - // Register a periodic Background Sync but it can't fire due to lack of - // network, wake up is required. - base::TimeDelta thirteen_hours = base::TimeDelta::FromHours(13); - sync_options_1_.min_interval = thirteen_hours.InMilliseconds(); - Register(sync_options_1_); - EXPECT_TRUE(test_background_sync_manager() - ->IsBrowserWakeupForPeriodicSyncScheduled()); - EXPECT_TRUE( - test_background_sync_manager()->EqualsSoonestPeriodicSyncWakeupDelta( - thirteen_hours)); - - // Advance clock. - test_clock_.Advance( - base::TimeDelta::FromMilliseconds(thirteen_hours.InMilliseconds())); - - // Start the event but it will pause mid-sync due to - // InitDelayedPeriodicSyncEventTest() above. - SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI); - EXPECT_TRUE(test_background_sync_manager() - ->IsBrowserWakeupForPeriodicSyncScheduled()); - EXPECT_TRUE( - test_background_sync_manager()->EqualsSoonestPeriodicSyncWakeupDelta( - test_background_sync_manager() - ->background_sync_parameters() - ->min_sync_recovery_time)); - - // Finish the sync. - ASSERT_TRUE(periodic_sync_fired_callback_); - std::move(periodic_sync_fired_callback_) - .Run(blink::ServiceWorkerStatusCode::kOk); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(test_background_sync_manager() - ->IsBrowserWakeupForPeriodicSyncScheduled()); - EXPECT_TRUE( - test_background_sync_manager()->EqualsSoonestPeriodicSyncWakeupDelta( - thirteen_hours)); + EXPECT_FALSE(test_background_sync_manager_->IsBrowserWakeupScheduled()); } TEST_F(BackgroundSyncManagerTest, GetSoonestWakeupDeltaConsidersSyncType) { @@ -1643,13 +1539,9 @@ EXPECT_TRUE(Register(sync_options_2_)); EXPECT_TRUE(GetRegistration(sync_options_2_)); - EXPECT_EQ(GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::ONE_SHOT, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()), + EXPECT_EQ(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::ONE_SHOT), base::TimeDelta()); - EXPECT_EQ(GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()), + EXPECT_EQ(GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC), base::TimeDelta::FromMilliseconds(sync_options_2_.min_interval)); } @@ -1660,69 +1552,26 @@ EXPECT_TRUE(Register(sync_options_2_)); EXPECT_TRUE(GetRegistration(sync_options_2_)); - base::TimeDelta soonest_wakeup_delta_1 = GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()); + base::TimeDelta soonest_wakeup_delta_1 = + GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC); test_clock_.Advance(base::TimeDelta::FromMilliseconds(thirteen_hours_ms)); - base::TimeDelta soonest_wakeup_delta_2 = GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()); + base::TimeDelta soonest_wakeup_delta_2 = + GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC); test_clock_.Advance(base::TimeDelta::FromMilliseconds(thirteen_hours_ms)); - base::TimeDelta soonest_wakeup_delta_3 = GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()); + base::TimeDelta soonest_wakeup_delta_3 = + GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC); test_clock_.Advance(base::TimeDelta::FromMilliseconds(thirteen_hours_ms)); - base::TimeDelta soonest_wakeup_delta_4 = GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()); + base::TimeDelta soonest_wakeup_delta_4 = + GetSoonestWakeupDelta(blink::mojom::BackgroundSyncType::PERIODIC); EXPECT_GT(soonest_wakeup_delta_1, soonest_wakeup_delta_2); EXPECT_GT(soonest_wakeup_delta_2, soonest_wakeup_delta_3); EXPECT_GT(soonest_wakeup_delta_3, soonest_wakeup_delta_4); } -TEST_F(BackgroundSyncManagerTest, SoonestWakeupDeltaAppliesBrowserWakeupLimit) { - base::TimeDelta twelve_hours = base::TimeDelta::FromHours(12); - SetPeriodicSyncEventsMinIntervalAndRestartManager(twelve_hours); - - // Register a periodic sync. - // Hour zero. - base::TimeDelta thirteen_hours = base::TimeDelta::FromHours(13); - sync_options_1_.min_interval = thirteen_hours.InMilliseconds(); - EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_EQ(GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()), - thirteen_hours); - - // Advance the clock by an hour. - // Hour 1. Expect soonest_wakeup_delta to now be 12. - base::TimeDelta one_hour = base::TimeDelta::FromHours(1); - test_clock_.Advance(one_hour); - EXPECT_EQ(GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()), - twelve_hours); - // Advance the clock by 12 hours. Hour 13. - test_clock_.Advance(base::TimeDelta::FromHours(9)); - base::Time browser_wakeup_time = test_clock_.Now(); - test_clock_.Advance(base::TimeDelta::FromHours(3)); - EXPECT_EQ( - GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ browser_wakeup_time), - base::TimeDelta::FromHours(9)); - EXPECT_EQ(GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType::PERIODIC, - /* last_browser_wakeup_for_periodic_sync= */ base::Time()), - base::TimeDelta()); - Unregister(sync_options_1_); -} - TEST_F(BackgroundSyncManagerTest, OneAttempt) { SetMaxSyncAttemptsAndRestartManager(1); InitFailedSyncEventTest(); @@ -1739,19 +1588,17 @@ // The first run will fail but it will setup a timer to try again. EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_TRUE( - test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()); + EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled()); // Make sure the delay is reasonable. EXPECT_LT(base::TimeDelta::FromMinutes(1), - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + test_background_sync_manager_->delayed_task_delta()); EXPECT_GT(base::TimeDelta::FromHours(1), - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + test_background_sync_manager_->delayed_task_delta()); // Fire again and this time it should permanently fail. - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -1763,26 +1610,22 @@ // The first run will fail but it will setup a timer to try again. EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_TRUE( - test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()); + EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled()); // The second run will fail but it will setup a timer to try again. base::TimeDelta first_delta = - test_background_sync_manager()->delayed_one_shot_sync_task_delta(); - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_background_sync_manager_->delayed_task_delta(); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(GetRegistration(sync_options_1_)); // Verify that the delta grows for each attempt. - EXPECT_LT(first_delta, - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + EXPECT_LT(first_delta, test_background_sync_manager_->delayed_task_delta()); // The third run will permanently fail. - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -1794,23 +1637,21 @@ // The first run will fail but it will setup a timer to try again. EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_TRUE( - test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()); + EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled()); // Fire again one second before it's ready to retry. Expect it to reschedule // the delay timer for one more second. - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta() - - base::TimeDelta::FromSeconds(1)); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta() - + base::TimeDelta::FromSeconds(1)); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_EQ(base::TimeDelta::FromSeconds(1), - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + test_background_sync_manager_->delayed_task_delta()); // Fire one second later and it should fail permanently. test_clock_.Advance(base::TimeDelta::FromSeconds(1)); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -1824,8 +1665,7 @@ EXPECT_TRUE(GetRegistration(sync_options_1_)); // Simulate restarting the browser after sufficient time has passed. - base::TimeDelta delta = - test_background_sync_manager()->delayed_one_shot_sync_task_delta(); + base::TimeDelta delta = test_background_sync_manager_->delayed_task_delta(); CreateBackgroundSyncManager(); InitFailedSyncEventTest(); test_clock_.Advance(delta); @@ -1843,8 +1683,7 @@ EXPECT_TRUE(GetRegistration(sync_options_1_)); // Simulate restarting the browser before the retry timer has expired. - base::TimeDelta delta = - test_background_sync_manager()->delayed_one_shot_sync_task_delta(); + base::TimeDelta delta = test_background_sync_manager_->delayed_task_delta(); CreateBackgroundSyncManager(); InitFailedSyncEventTest(); test_clock_.Advance(delta - base::TimeDelta::FromSeconds(1)); @@ -1852,7 +1691,7 @@ base::RunLoop().RunUntilIdle(); EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_EQ(base::TimeDelta::FromSeconds(1), - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + test_background_sync_manager_->delayed_task_delta()); } TEST_F(BackgroundSyncManagerTest, RetryIfClosedMidSync) { @@ -1860,8 +1699,7 @@ RegisterAndVerifySyncEventDelayed(sync_options_1_); // The time delta is the recovery timer. - base::TimeDelta delta = - test_background_sync_manager()->delayed_one_shot_sync_task_delta(); + base::TimeDelta delta = test_background_sync_manager_->delayed_task_delta(); // Simulate restarting the browser after the recovery time, the event should // fire once and then fail permanently. @@ -1881,25 +1719,21 @@ EXPECT_TRUE(Register(sync_options_1_)); // Run it a second time. - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); base::TimeDelta delay_delta = - test_background_sync_manager()->delayed_one_shot_sync_task_delta(); + test_background_sync_manager_->delayed_task_delta(); // Create a second registration, which will fail and setup a timer. EXPECT_TRUE(Register(sync_options_2_)); - EXPECT_GT(delay_delta, - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + EXPECT_GT(delay_delta, test_background_sync_manager_->delayed_task_delta()); - while (test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()) { - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); - EXPECT_FALSE( - test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()); + while (test_background_sync_manager_->IsDelayedTaskScheduled()) { + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); + test_background_sync_manager_->RunDelayedTask(); + EXPECT_FALSE(test_background_sync_manager_->IsDelayedTaskScheduled()); base::RunLoop().RunUntilIdle(); } @@ -1912,28 +1746,27 @@ InitFailedSyncEventTest(); EXPECT_TRUE(Register(sync_options_1_)); - EXPECT_FALSE(test_background_sync_manager()->last_chance()); + EXPECT_FALSE(test_background_sync_manager_->last_chance()); EXPECT_TRUE(GetRegistration(sync_options_1_)); // Run it again. - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_1_)); - EXPECT_TRUE(test_background_sync_manager()->last_chance()); + EXPECT_TRUE(test_background_sync_manager_->last_chance()); } TEST_F(BackgroundSyncManagerTest, EmulateOfflineSingleClient) { InitSyncEventTest(); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, true); EXPECT_TRUE(Register(sync_options_1_)); EXPECT_EQ(0, sync_events_called_); EXPECT_TRUE(GetRegistration(sync_options_1_)); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, false); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1, sync_events_called_); @@ -1947,27 +1780,27 @@ TEST_F(BackgroundSyncManagerTest, EmulateOfflineMultipleClients) { InitSyncEventTest(); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, true); EXPECT_TRUE(Register(sync_options_1_)); EXPECT_EQ(0, sync_events_called_); EXPECT_TRUE(GetRegistration(sync_options_1_)); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, true); EXPECT_TRUE(Register(sync_options_2_)); EXPECT_EQ(0, sync_events_called_); EXPECT_TRUE(GetRegistration(sync_options_2_)); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, false); base::RunLoop().RunUntilIdle(); EXPECT_EQ(0, sync_events_called_); EXPECT_TRUE(GetRegistration(sync_options_1_)); EXPECT_TRUE(GetRegistration(sync_options_2_)); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, false); base::RunLoop().RunUntilIdle(); @@ -1989,7 +1822,7 @@ bool was_called = false; blink::ServiceWorkerStatusCode code = blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected; - test_background_sync_manager()->EmulateDispatchSyncEvent( + test_background_sync_manager_->EmulateDispatchSyncEvent( "emulated_tag", sw_registration_1_->active_version(), false, base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code)); base::RunLoop().RunUntilIdle(); @@ -1998,24 +1831,24 @@ EXPECT_EQ(1, sync_events_called_); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, true); was_called = false; - test_background_sync_manager()->EmulateDispatchSyncEvent( + test_background_sync_manager_->EmulateDispatchSyncEvent( "emulated_tag", sw_registration_1_->active_version(), false, base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(was_called); EXPECT_EQ(blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected, code); - test_background_sync_manager()->EmulateServiceWorkerOffline( + test_background_sync_manager_->EmulateServiceWorkerOffline( sw_registration_id_1_, false); SetNetwork(network::mojom::ConnectionType::CONNECTION_NONE); was_called = false; code = blink::ServiceWorkerStatusCode::kOk; - test_background_sync_manager()->EmulateDispatchSyncEvent( + test_background_sync_manager_->EmulateDispatchSyncEvent( "emulated_tag", sw_registration_1_->active_version(), false, base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code)); base::RunLoop().RunUntilIdle(); @@ -2024,7 +1857,7 @@ SetNetwork(network::mojom::ConnectionType::CONNECTION_WIFI); was_called = false; - test_background_sync_manager()->EmulateDispatchSyncEvent( + test_background_sync_manager_->EmulateDispatchSyncEvent( "emulated_tag", sw_registration_1_->active_version(), false, base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code)); base::RunLoop().RunUntilIdle(); @@ -2042,7 +1875,7 @@ bool was_called = false; blink::ServiceWorkerStatusCode code = blink::ServiceWorkerStatusCode::kErrorEventWaitUntilRejected; - test_background_sync_manager()->DispatchPeriodicSyncEvent( + test_background_sync_manager_->DispatchPeriodicSyncEvent( "test_tag", sw_registration_1_->active_version(), base::BindOnce(EmulateDispatchSyncEventCallback, &was_called, &code)); base::RunLoop().RunUntilIdle(); @@ -2067,16 +1900,14 @@ // The first run will fail but it will setup a timer to try again. EXPECT_TRUE(Register(sync_options_1_)); EXPECT_TRUE(GetRegistration(sync_options_1_)); - EXPECT_TRUE( - test_background_sync_manager()->IsDelayedTaskScheduledOneShotSync()); + EXPECT_TRUE(test_background_sync_manager_->IsDelayedTaskScheduled()); } - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); { // Expect another "Fail" event. EXPECT_CALL(*this, OnEventReceived(_)).Times(1); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(GetRegistration(sync_options_1_)); } @@ -2084,12 +1915,11 @@ // The event should succeed now. InitSyncEventTest(); - test_clock_.Advance( - test_background_sync_manager()->delayed_one_shot_sync_task_delta()); + test_clock_.Advance(test_background_sync_manager_->delayed_task_delta()); { // Expect a "Completion" event. EXPECT_CALL(*this, OnEventReceived(_)).Times(1); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_1_)); } @@ -2102,7 +1932,7 @@ EXPECT_TRUE(Register(sync_options_1_)); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_1_)); @@ -2122,7 +1952,7 @@ EXPECT_TRUE(Register(sync_options_2_)); - test_background_sync_manager()->RunOneShotSyncDelayedTask(); + test_background_sync_manager_->RunDelayedTask(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(GetRegistration(sync_options_2_));
diff --git a/content/browser/background_sync/background_sync_proxy.cc b/content/browser/background_sync/background_sync_proxy.cc deleted file mode 100644 index 1ddaf7e..0000000 --- a/content/browser/background_sync/background_sync_proxy.cc +++ /dev/null
@@ -1,98 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/background_sync/background_sync_proxy.h" - -#include <utility> - -#include "base/bind.h" -#include "base/location.h" -#include "base/macros.h" -#include "base/task/post_task.h" -#include "base/task/task_traits.h" -#include "content/browser/service_worker/service_worker_context_wrapper.h" -#include "content/browser/storage_partition_impl.h" -#include "content/public/browser/background_sync_context.h" -#include "content/public/browser/background_sync_controller.h" -#include "content/public/browser/browser_context.h" -#include "content/public/browser/browser_task_traits.h" - -namespace content { - -class BackgroundSyncProxy::Core { - public: - Core(const base::WeakPtr<BackgroundSyncProxy>& io_parent, - scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) - : io_parent_(io_parent), - service_worker_context_(std::move(service_worker_context)), - weak_ptr_factory_(this) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(service_worker_context_); - } - - ~Core() { DCHECK_CURRENTLY_ON(BrowserThread::UI); } - - base::WeakPtr<Core> GetWeakPtrOnIO() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - return weak_ptr_factory_.GetWeakPtr(); - } - - BrowserContext* browser_context() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!service_worker_context_) - return nullptr; - - StoragePartitionImpl* storage_partition_impl = - service_worker_context_->storage_partition(); - if (!storage_partition_impl) // may be null in tests - return nullptr; - - return storage_partition_impl->browser_context(); - } - - // TODO(crbug.com/982378): Schedule a task to periodically revive suspended - // periodic Background Sync registrations. - void ScheduleBrowserWakeUp(blink::mojom::BackgroundSyncType sync_type) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - if (!browser_context()) - return; - - auto* controller = browser_context()->GetBackgroundSyncController(); - DCHECK(controller); - - controller->ScheduleBrowserWakeUp(sync_type); - } - - private: - base::WeakPtr<BackgroundSyncProxy> io_parent_; - scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_; - base::WeakPtrFactory<Core> weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(Core); -}; - -BackgroundSyncProxy::BackgroundSyncProxy( - scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) - : weak_ptr_factory_(this) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - DCHECK(service_worker_context); - ui_core_ = std::unique_ptr<Core, BrowserThread::DeleteOnUIThread>(new Core( - weak_ptr_factory_.GetWeakPtr(), std::move(service_worker_context))); - ui_core_weak_ptr_ = ui_core_->GetWeakPtrOnIO(); -} - -BackgroundSyncProxy::~BackgroundSyncProxy() = default; - -void BackgroundSyncProxy::ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - // Schedule Chrome wakeup. - base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&Core::ScheduleBrowserWakeUp, - ui_core_weak_ptr_, sync_type)); -} - -} // namespace content
diff --git a/content/browser/background_sync/background_sync_proxy.h b/content/browser/background_sync/background_sync_proxy.h deleted file mode 100644 index 01c72cd6..0000000 --- a/content/browser/background_sync/background_sync_proxy.h +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_PROXY_H_ -#define CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_PROXY_H_ - -#include <memory> - -#include "base/callback.h" -#include "base/memory/weak_ptr.h" -#include "base/time/time.h" -#include "content/common/content_export.h" -#include "content/public/browser/browser_thread.h" -#include "third_party/blink/public/mojom/background_sync/background_sync.mojom.h" - -namespace content { - -class ServiceWorkerContextWrapper; - -// This class is used to take messages from BackgroundSyncManager on the IO -// thread and pass them on BackgroundSyncController on the UI thread through -// its Core class which lives on the UI thread. -// This is owned by the BackgroundSyncManager. -class CONTENT_EXPORT BackgroundSyncProxy { - public: - explicit BackgroundSyncProxy( - scoped_refptr<ServiceWorkerContextWrapper> service_worker_context); - ~BackgroundSyncProxy(); - - void ScheduleBrowserWakeUp(blink::mojom::BackgroundSyncType sync_type); - - private: - // Constructed on the IO thread, lives and dies on the UI thread. - class Core; - - std::unique_ptr<Core, BrowserThread::DeleteOnUIThread> ui_core_; - base::WeakPtr<Core> ui_core_weak_ptr_; - base::WeakPtrFactory<BackgroundSyncProxy> weak_ptr_factory_; - - DISALLOW_COPY_AND_ASSIGN(BackgroundSyncProxy); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_BACKGROUND_SYNC_BACKGROUND_SYNC_PROXY_H_
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc index a56c8d6..2cd3b2ed 100644 --- a/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc +++ b/content/browser/cache_storage/legacy/legacy_cache_storage_cache.cc
@@ -1149,6 +1149,7 @@ if (!match->response) { entry->Doom(); + query_cache_context->matches->pop_back(); QueryCacheOpenNextEntry(std::move(query_cache_context)); return; }
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc index 2a465d3e..9a7e084 100644 --- a/content/browser/frame_host/navigation_request.cc +++ b/content/browser/frame_host/navigation_request.cc
@@ -1725,6 +1725,8 @@ // If this is a top-frame navigation, then use the origin of the url (and // update it as redirects happen). If this is a sub-frame navigation, get the // URL from the top frame. + // TODO(crbug.com/979296): Consider changing this code to copy an origin + // instead of creating one from a URL which lacks opacity information. GURL top_frame_url = frame_tree_node_->IsMainFrame() ? common_params_.url @@ -1741,8 +1743,9 @@ browser_context, browser_context->GetResourceContext(), partition, std::make_unique<NavigationRequestInfo>( common_params_, begin_params_.Clone(), site_for_cookies, - top_frame_origin, frame_tree_node_->IsMainFrame(), - parent_is_main_frame, IsSecureFrame(frame_tree_node_->parent()), + net::NetworkIsolationKey(top_frame_origin), + frame_tree_node_->IsMainFrame(), parent_is_main_frame, + IsSecureFrame(frame_tree_node_->parent()), frame_tree_node_->frame_tree_node_id(), is_for_guests_only, report_raw_headers, navigating_frame_host->GetVisibilityState() ==
diff --git a/content/browser/frame_host/navigation_request_info.cc b/content/browser/frame_host/navigation_request_info.cc index 32c56e2..e4491f8 100644 --- a/content/browser/frame_host/navigation_request_info.cc +++ b/content/browser/frame_host/navigation_request_info.cc
@@ -10,7 +10,7 @@ const CommonNavigationParams& common_params, mojom::BeginNavigationParamsPtr begin_params, const GURL& site_for_cookies, - const base::Optional<url::Origin>& top_frame_origin, + const net::NetworkIsolationKey& network_isolation_key, bool is_main_frame, bool parent_is_main_frame, bool are_ancestors_secure, @@ -26,7 +26,7 @@ : common_params(common_params), begin_params(std::move(begin_params)), site_for_cookies(site_for_cookies), - top_frame_origin(top_frame_origin), + network_isolation_key(network_isolation_key), is_main_frame(is_main_frame), parent_is_main_frame(parent_is_main_frame), are_ancestors_secure(are_ancestors_secure),
diff --git a/content/browser/frame_host/navigation_request_info.h b/content/browser/frame_host/navigation_request_info.h index 42fef93..78dd2a2 100644 --- a/content/browser/frame_host/navigation_request_info.h +++ b/content/browser/frame_host/navigation_request_info.h
@@ -26,7 +26,7 @@ NavigationRequestInfo(const CommonNavigationParams& common_params, mojom::BeginNavigationParamsPtr begin_params, const GURL& site_for_cookies, - const base::Optional<url::Origin>& top_frame_origin, + const net::NetworkIsolationKey& network_isolation_key, bool is_main_frame, bool parent_is_main_frame, bool are_ancestors_secure, @@ -49,11 +49,9 @@ // checked by the third-party cookie blocking policy. const GURL site_for_cookies; - // The origin of the navigation if top frame, else the origin of the top - // frame. - // TODO(crbug.com/910716) Make this required. I believe we just need to add - // support for signed exchange redirects. - const base::Optional<url::Origin> top_frame_origin; + // Navigation resource requests will be keyed using |network_isolation_key| + // for accessing shared network resources like the http cache. + const net::NetworkIsolationKey network_isolation_key; const bool is_main_frame; const bool parent_is_main_frame;
diff --git a/content/browser/frame_host/navigator_impl_unittest.cc b/content/browser/frame_host/navigator_impl_unittest.cc index 8680202..bfb50dbe 100644 --- a/content/browser/frame_host/navigator_impl_unittest.cc +++ b/content/browser/frame_host/navigator_impl_unittest.cc
@@ -290,8 +290,8 @@ EXPECT_EQ(kUrl2, subframe_loader->request_info()->common_params.url); // First party for cookies url should be that of the main frame. EXPECT_EQ(kUrl1, subframe_loader->request_info()->site_for_cookies); - EXPECT_EQ(url::Origin::Create(kUrl1), - subframe_loader->request_info()->top_frame_origin); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(kUrl1)), + subframe_loader->request_info()->network_isolation_key); EXPECT_FALSE(subframe_loader->request_info()->is_main_frame); EXPECT_TRUE(subframe_loader->request_info()->parent_is_main_frame); EXPECT_TRUE(subframe_request->browser_initiated());
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index 696ef2b..145bfe5 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -4264,7 +4264,13 @@ } registry_->AddInterface(base::BindRepeating( - &media::MediaMetricsProvider::Create, frame_tree_node_->IsMainFrame(), + &media::MediaMetricsProvider::Create, + GetProcess()->GetBrowserContext()->IsOffTheRecord() + ? media::MediaMetricsProvider::BrowsingMode::kIncognito + : media::MediaMetricsProvider::BrowsingMode::kNormal, + frame_tree_node_->IsMainFrame() + ? media::MediaMetricsProvider::FrameStatus::kTopFrame + : media::MediaMetricsProvider::FrameStatus::kNotTopFrame, base::BindRepeating( &RenderFrameHostDelegate::GetUkmSourceIdForLastCommittedSource, // This callback is only executed when Create() is called, during @@ -4321,18 +4327,13 @@ registry_->AddInterface(base::BindRepeating( [](RenderFrameHostImpl* frame, blink::mojom::NativeFileSystemManagerRequest request) { - scoped_refptr<NativeFileSystemManagerImpl> manager = + NativeFileSystemManagerImpl::BindRequestFromUIThread( static_cast<StoragePartitionImpl*>( - frame->GetProcess()->GetStoragePartition()) - ->GetNativeFileSystemManager(); - base::PostTaskWithTraits( - FROM_HERE, {BrowserThread::IO}, - base::BindOnce( - &NativeFileSystemManagerImpl::BindRequest, std::move(manager), - NativeFileSystemManagerImpl::BindingContext( - frame->GetLastCommittedOrigin(), - frame->GetProcess()->GetID(), frame->GetRoutingID()), - std::move(request))); + frame->GetProcess()->GetStoragePartition()), + NativeFileSystemManagerImpl::BindingContext( + frame->GetLastCommittedOrigin(), frame->GetProcess()->GetID(), + frame->GetRoutingID()), + std::move(request)); }, base::Unretained(this))); } @@ -4881,6 +4882,8 @@ // common_params.url currently leads to an opaque origin to be created. Once // this is fixed, the origin which these navigations eventually get committed // to will be available here as well. + // TODO(crbug.com/979296): Consider changing this code to copy an origin + // instead of creating one from a URL which lacks opacity information. if (!is_same_document) { base::Optional<url::Origin> top_frame_origin = frame_tree_node_->IsMainFrame() ? url::Origin::Create(common_params.url)
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index c559dbc2..9e3bb5b 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -459,7 +459,7 @@ // then do that same thing in another tab, that the two resulting pages have // different SiteInstances, BrowsingInstances, and RenderProcessHosts. This is // a regression test for bug 9364. -TEST_F(RenderFrameHostManagerTest, NewTabPageProcesses) { +TEST_F(RenderFrameHostManagerTest, ChromeSchemeProcesses) { set_should_create_webui(true); const GURL kChromeUrl(GetWebUIURL("foo")); const GURL kDestUrl("http://www.google.com/"); @@ -503,8 +503,8 @@ EXPECT_FALSE(dest_rfh2->GetSiteInstance()->IsRelatedSiteInstance( contents()->GetMainFrame()->GetSiteInstance())); - // Navigate both to the new tab page, and verify that they share a - // RenderProcessHost (not a SiteInstance). + // Navigate both to a chrome://... URL, and verify that they have a separate + // RenderProcessHost and a separate SiteInstance. NavigationSimulator::NavigateAndCommitFromBrowser(contents(), kChromeUrl); EXPECT_FALSE(contents()->GetPendingMainFrame()); @@ -513,7 +513,7 @@ EXPECT_NE(contents()->GetMainFrame()->GetSiteInstance(), contents2->GetMainFrame()->GetSiteInstance()); - EXPECT_EQ(contents()->GetMainFrame()->GetSiteInstance()->GetProcess(), + EXPECT_NE(contents()->GetMainFrame()->GetSiteInstance()->GetProcess(), contents2->GetMainFrame()->GetSiteInstance()->GetProcess()); }
diff --git a/content/browser/indexed_db/database_impl.cc b/content/browser/indexed_db/database_impl.cc index 1894904bb..42413a7 100644 --- a/content/browser/indexed_db/database_impl.cc +++ b/content/browser/indexed_db/database_impl.cc
@@ -33,6 +33,7 @@ namespace content { namespace { +const char kBadTransactionMode[] = "Bad transaction mode"; const char kTransactionAlreadyExists[] = "Transaction already exists"; } // namespace @@ -91,6 +92,12 @@ if (!connection_->IsConnected()) return; + if (mode != blink::mojom::IDBTransactionMode::ReadOnly && + mode != blink::mojom::IDBTransactionMode::ReadWrite) { + mojo::ReportBadMessage(kBadTransactionMode); + return; + } + if (connection_->GetTransaction(transaction_id)) { mojo::ReportBadMessage(kTransactionAlreadyExists); return;
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index 5eb338c..26e18d241 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -195,7 +195,14 @@ new_request->method = request_info->common_params.method; new_request->url = request_info->common_params.url; new_request->site_for_cookies = request_info->site_for_cookies; - new_request->top_frame_origin = request_info->top_frame_origin; + new_request->trusted_network_isolation_key = + request_info->network_isolation_key; + + if (request_info->is_main_frame) { + new_request->update_network_isolation_key_on_redirect = + network::mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin; + } net::RequestPriority net_priority = net::HIGHEST; if (!request_info->is_main_frame && @@ -276,7 +283,7 @@ return std::make_unique<NavigationRequestInfo>( std::move(new_common_params), std::move(new_begin_params), updated_resource_request.site_for_cookies, - updated_resource_request.top_frame_origin, + updated_resource_request.trusted_network_isolation_key, previous_request_info.is_main_frame, previous_request_info.parent_is_main_frame, previous_request_info.are_ancestors_secure, @@ -1112,7 +1119,17 @@ resource_request_->url = redirect_info_.new_url; resource_request_->method = redirect_info_.new_method; resource_request_->site_for_cookies = redirect_info_.new_site_for_cookies; - resource_request_->top_frame_origin = redirect_info_.new_top_frame_origin; + + // See if navigation network isolation key needs to be updated. + // TODO(crbug.com/950069): Also add the case for ResourceType::kSubFrame. + if (resource_request_->resource_type == + static_cast<int>(ResourceType::kMainFrame)) { + base::Optional<url::Origin> origin = + url::Origin::Create(resource_request_->url); + resource_request_->trusted_network_isolation_key = + net::NetworkIsolationKey(origin, origin); + } + resource_request_->referrer = GURL(redirect_info_.new_referrer); resource_request_->referrer_policy = redirect_info_.new_referrer_policy; resource_request_->previews_state = new_previews_state;
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc index b1351d10c..5ac8fb9 100644 --- a/content/browser/loader/navigation_url_loader_impl_unittest.cc +++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -186,7 +186,7 @@ std::unique_ptr<NavigationRequestInfo> request_info( new NavigationRequestInfo( common_params, std::move(begin_params), url, - url::Origin::Create(url), is_main_frame, + net::NetworkIsolationKey(url::Origin::Create(url)), is_main_frame, false /* parent_is_main_frame */, false /* are_ancestors_secure */, -1 /* frame_tree_node_id */, false /* is_for_guests_only */, false /* report_raw_headers */, false /* is_prerenering */, @@ -314,7 +314,7 @@ NavigateAndReturnRequestPriority(url, false /* is_main_frame */)); } -TEST_F(NavigationURLLoaderImplTest, TopFrameOriginOfMainFrameNavigation) { +TEST_F(NavigationURLLoaderImplTest, NetworkIsolationKeyOfMainFrameNavigation) { ASSERT_TRUE(http_test_server_.Start()); const GURL url = http_test_server_.GetURL("/foo"); @@ -329,12 +329,12 @@ delegate.WaitForRequestStarted(); ASSERT_TRUE(most_recent_resource_request_); - EXPECT_EQ(url::Origin::Create(url), - *most_recent_resource_request_->top_frame_origin); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)), + most_recent_resource_request_->trusted_network_isolation_key); } TEST_F(NavigationURLLoaderImplTest, - TopFrameOriginOfRedirectedMainFrameNavigation) { + NetworkIsolationKeyOfRedirectedMainFrameNavigation) { ASSERT_TRUE(http_test_server_.Start()); const GURL url = http_test_server_.GetURL("/redirect301-to-echo"); @@ -342,8 +342,8 @@ HTTPRedirectOriginHeaderTest(url, "GET", "GET", url.GetOrigin().spec()); - EXPECT_EQ(url::Origin::Create(final_url), - *most_recent_resource_request_->top_frame_origin); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(final_url)), + most_recent_resource_request_->trusted_network_isolation_key); } TEST_F(NavigationURLLoaderImplTest, Redirect301Tests) {
diff --git a/content/browser/loader/navigation_url_loader_unittest.cc b/content/browser/loader/navigation_url_loader_unittest.cc index 24640725..a97c47d 100644 --- a/content/browser/loader/navigation_url_loader_unittest.cc +++ b/content/browser/loader/navigation_url_loader_unittest.cc
@@ -100,11 +100,12 @@ common_params.initiator_origin = url::Origin::Create(url); std::unique_ptr<NavigationRequestInfo> request_info( - new NavigationRequestInfo(common_params, std::move(begin_params), url, - url::Origin::Create(url), true, false, false, - -1, false, false, false, false, nullptr, - base::UnguessableToken::Create(), - base::UnguessableToken::Create())); + new NavigationRequestInfo( + common_params, std::move(begin_params), url, + net::NetworkIsolationKey(url::Origin::Create(url)), true, false, + false, -1, false, false, false, false, nullptr, + base::UnguessableToken::Create(), + base::UnguessableToken::Create())); return NavigationURLLoader::Create( browser_context_.get(), browser_context_->GetResourceContext(), BrowserContext::GetDefaultStoragePartition(browser_context_.get()),
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc index c257dec..a87b6a6 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.cc +++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -1439,7 +1439,7 @@ new_request->set_method(info.common_params.method); new_request->set_site_for_cookies(info.site_for_cookies); - new_request->set_top_frame_origin(info.top_frame_origin); + new_request->set_network_isolation_key(info.network_isolation_key); new_request->set_initiator(info.common_params.initiator_origin); new_request->set_upgrade_if_insecure(info.upgrade_if_insecure); if (info.is_main_frame) {
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc index 642aebf4..bb9a7847 100644 --- a/content/browser/loader/resource_dispatcher_host_unittest.cc +++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -839,11 +839,12 @@ common_params.initiator_origin = url::Origin::Create(url); std::unique_ptr<NavigationRequestInfo> request_info( - new NavigationRequestInfo(common_params, std::move(begin_params), url, - url::Origin::Create(url), true, false, false, - -1, false, false, false, false, nullptr, - base::UnguessableToken::Create(), - base::UnguessableToken::Create())); + new NavigationRequestInfo( + common_params, std::move(begin_params), url, + net::NetworkIsolationKey(url::Origin::Create(url)), true, false, + false, -1, false, false, false, false, nullptr, + base::UnguessableToken::Create(), + base::UnguessableToken::Create())); std::unique_ptr<NavigationURLLoader> test_loader = NavigationURLLoader::Create( browser_context_.get(), browser_context_->GetResourceContext(),
diff --git a/content/browser/media/cdm_file_impl.cc b/content/browser/media/cdm_file_impl.cc index d20c292..ceb8c58 100644 --- a/content/browser/media/cdm_file_impl.cc +++ b/content/browser/media/cdm_file_impl.cc
@@ -13,6 +13,12 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" #include "base/task/post_task.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "media/base/bind_to_current_loop.h" +#include "net/base/io_buffer.h" +#include "net/base/net_errors.h" +#include "storage/browser/fileapi/file_stream_reader.h" #include "storage/browser/fileapi/file_system_context.h" #include "storage/browser/fileapi/file_system_operation_context.h" #include "storage/browser/fileapi/file_system_url.h" @@ -109,55 +115,6 @@ return file_lock_map; } -// Read the contents of |file| and return it. On success, returns kSuccess and -// |data| is updated with the contents of the file. On failure kFailure is -// returned. This method owns |file| and it will be closed at the end. -CdmFileImpl::Status ReadFile(base::File file, std::vector<uint8_t>* data) { - DCHECK(data->empty()); - - // Determine the size of the file (so we know how many bytes to read). - // Negative bytes mean failure, so problem with the file. - int64_t num_bytes = file.GetLength(); - if (num_bytes < 0) { - DLOG(WARNING) << __func__ - << " Unable to get file length. result = " << num_bytes; - return CdmFileImpl::Status::kFailure; - } - - // Files are limited in size, so fail if file too big. - if (num_bytes > kMaxFileSizeBytes) { - DLOG(WARNING) << __func__ - << " Too much data to read. #bytes = " << num_bytes; - return CdmFileImpl::Status::kFailure; - } - - // If the file has 0 bytes, no need to read anything. - if (num_bytes == 0) { - return CdmFileImpl::Status::kSuccess; - } - - // Read the contents of the file. Read() sizes (provided and returned) are - // type int, so cast appropriately. - int bytes_to_read = base::checked_cast<int>(num_bytes); - data->resize(num_bytes); - - TRACE_EVENT0("media", "CdmFileReadFile"); - base::TimeTicks start = base::TimeTicks::Now(); - int bytes_read = - file.Read(0, reinterpret_cast<char*>(data->data()), bytes_to_read); - base::TimeDelta read_time = base::TimeTicks::Now() - start; - if (bytes_to_read != bytes_read) { - // Unable to read the contents of the file. - DLOG(WARNING) << "Failed to read file. Requested " << bytes_to_read - << " bytes, got " << bytes_read; - return CdmFileImpl::Status::kFailure; - } - - // Only report reading time for successful reads. - UMA_HISTOGRAM_TIMES("Media.EME.CdmFileIO.ReadTime", read_time); - return CdmFileImpl::Status::kSuccess; -} - // Write |data| to |file|. Returns kSuccess if everything works, kFailure // otherwise. This method owns |file| and it will be closed at the end. CdmFileImpl::Status WriteFile(base::File file, std::vector<uint8_t> data) { @@ -182,8 +139,152 @@ return CdmFileImpl::Status::kSuccess; } +// File stream operations need an IOBuffer to hold the data. This class stores +// the data in a std::vector<uint8_t> to match what is used in the +// mojom::CdmFile API. +class CdmFileIOBuffer : public net::IOBuffer { + public: + // Create an empty buffer of size |size|. + explicit CdmFileIOBuffer(size_t size) : buffer_(size) { + data_ = reinterpret_cast<char*>(buffer_.data()); + } + + // Returns ownership of |buffer_| to the caller. + std::vector<uint8_t>&& TakeData() { return std::move(buffer_); } + + protected: + ~CdmFileIOBuffer() override { data_ = nullptr; } + + private: + std::vector<uint8_t> buffer_; +}; + } // namespace +// Read a file using FileStreamReader. Implemented as a separate class so that +// it can be run on the IO thread. +class CdmFileImpl::FileReader { + public: + // Returns whether the read operation succeeded or not. If |result| = true, + // then |data| is the contents of the file. + using ReadDoneCB = + base::OnceCallback<void(bool result, std::vector<uint8_t> data)>; + + FileReader() = default; + + // Reads the contents of |file_url| and calls |callback| with the result + // (file contents on success, empty data on error). + void Read(scoped_refptr<storage::FileSystemContext> file_system_context, + const storage::FileSystemURL& file_url, + ReadDoneCB callback) { + DVLOG(3) << __func__ << " url: " << file_url.DebugString(); + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(!callback_); + DCHECK(!file_stream_reader_); + + callback_ = std::move(callback); + + file_stream_reader_ = file_system_context->CreateFileStreamReader( + file_url, 0, kMaxFileSizeBytes, base::Time()); + auto result = file_stream_reader_->GetLength( + base::BindOnce(&FileReader::OnGetLength, weak_factory_.GetWeakPtr())); + DVLOG(3) << __func__ << " GetLength(): " << result; + + // If GetLength() is running asynchronously, simply return. + if (result == net::ERR_IO_PENDING) + return; + + // GetLength() was synchronous, so pass the result on. + OnGetLength(result); + } + + private: + // Called when the size of the file to be read is known. Allocates a buffer + // large enough to hold the contents, then attempts to read the contents into + // the buffer. |result| will be the length of the file (if >= 0) or a net:: + // error on failure (if < 0). + void OnGetLength(int64_t result) { + DVLOG(3) << __func__ << " result: " << result; + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(callback_); + DCHECK(file_stream_reader_); + + // If the file doesn't exist, then pretend it is empty. + if (result == net::ERR_FILE_NOT_FOUND) { + std::move(callback_).Run(true, {}); + return; + } + + // Any other failure is an error. + if (result < 0) { + DLOG(WARNING) << __func__ + << " Unable to get file length. result = " << result; + std::move(callback_).Run(false, {}); + return; + } + + // Files are limited in size, so fail if file too big. + if (result > kMaxFileSizeBytes) { + DLOG(WARNING) << __func__ + << " Too much data to read. #bytes = " << result; + std::move(callback_).Run(false, {}); + return; + } + + // Read() sizes (provided and returned) are type int, so cast appropriately. + int bytes_to_read = base::checked_cast<int>(result); + auto buffer = base::MakeRefCounted<CdmFileIOBuffer>( + base::checked_cast<size_t>(bytes_to_read)); + + // Read the contents of the file into |buffer|. + result = file_stream_reader_->Read( + buffer.get(), bytes_to_read, + base::BindOnce(&FileReader::OnRead, weak_factory_.GetWeakPtr(), buffer, + bytes_to_read)); + DVLOG(3) << __func__ << " Read(): " << result; + + // If Read() is running asynchronously, simply return. + if (result == net::ERR_IO_PENDING) + return; + + // Read() was synchronous, so pass the result on. + OnRead(std::move(buffer), bytes_to_read, result); + } + + // Called when the file has been read and returns the result to the callback + // provided to Read(). |result| will be the number of bytes read (if >= 0) or + // a net:: error on failure (if < 0). + void OnRead(scoped_refptr<CdmFileIOBuffer> buffer, + int bytes_to_read, + int result) { + DVLOG(3) << __func__ << " Requested " << bytes_to_read << " bytes, got " + << result; + DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(callback_); + DCHECK(file_stream_reader_); + + if (result != bytes_to_read) { + // Unable to read the contents of the file completely. + DLOG(WARNING) << "Failed to read file. Requested " << bytes_to_read + << " bytes, got " << result; + std::move(callback_).Run(false, {}); + return; + } + + // Successful read. Return the bytes read. + std::move(callback_).Run(true, std::move(buffer->TakeData())); + } + + // Called when the read operation is done. + ReadDoneCB callback_; + + // Used to read the stream. + std::unique_ptr<storage::FileStreamReader> file_stream_reader_; + + base::WeakPtrFactory<FileReader> weak_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(FileReader); +}; + // static bool CdmFileImpl::IsValidName(const std::string& name) { // File names must only contain letters (A-Za-z), digits(0-9), or "._-", @@ -224,6 +325,15 @@ DVLOG(3) << __func__ << " " << file_name_; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + if (read_callback_) + std::move(read_callback_).Run(Status::kFailure, {}); + + if (file_reader_) { + // |file_reader_| must be deleted on the IO thread. + base::CreateSequencedTaskRunner({BrowserThread::IO}) + ->DeleteSoon(FROM_HERE, std::move(file_reader_)); + } + if (file_locked_) ReleaseFileLock(file_name_); } @@ -250,13 +360,45 @@ DVLOG(3) << __func__ << " file: " << file_name_; DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(file_locked_); - DCHECK(data_.empty()); - // Open the file for reading. This may fail if the file does not currently - // exist, which needs to be handled. - OpenFile(file_name_, base::File::FLAG_OPEN | base::File::FLAG_READ, - base::BindOnce(&CdmFileImpl::OnFileOpenedForReading, - weak_factory_.GetWeakPtr(), std::move(callback))); + // Save |callback| for later use. + read_callback_ = std::move(callback); + + // As reading is done on the IO thread, when it's done ReadDone() needs to be + // called back on this thread. + auto read_done_cb = media::BindToCurrentLoop( + base::BindOnce(&CdmFileImpl::ReadDone, weak_factory_.GetWeakPtr())); + + // Create the file reader that runs on the IO thread, and then call Read() on + // the IO thread. Use of base::Unretained() is OK as the reader is owned by + // |this|, and if |this| is destructed it will destroy the file reader on the + // IO thread. + file_reader_ = std::make_unique<FileReader>(); + base::PostTaskWithTraits( + FROM_HERE, {BrowserThread::IO}, + base::BindOnce(&FileReader::Read, base::Unretained(file_reader_.get()), + file_system_context_, CreateFileSystemURL(file_name_), + std::move(read_done_cb))); +} + +void CdmFileImpl::ReadDone(bool success, std::vector<uint8_t> data) { + DVLOG(3) << __func__ << " file: " << file_name_ + << ", success: " << (success ? "yes" : "no"); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(file_locked_); + DCHECK(file_reader_); + DCHECK(read_callback_); + + // We are done with the reader, so destroy it. + file_reader_.reset(); + + if (!success) { + // Unable to read the contents of the file. + std::move(read_callback_).Run(Status::kFailure, {}); + return; + } + + std::move(read_callback_).Run(Status::kSuccess, std::move(data)); } void CdmFileImpl::OpenFile(const std::string& file_name, @@ -279,52 +421,11 @@ std::move(callback)); } -void CdmFileImpl::OnFileOpenedForReading(ReadCallback callback, - base::File file, - base::OnceClosure on_close_callback) { - DVLOG(3) << __func__ << " file: " << file_name_; - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(file_locked_); - - if (!file.IsValid()) { - // File is invalid, so assume that it is empty. - DVLOG(2) << "Unable to open file " << file_name_ - << ", error: " << base::File::ErrorToString(file.error_details()); - std::move(callback).Run( - file.error_details() == base::File::FILE_ERROR_NOT_FOUND - ? Status::kSuccess - : Status::kFailure, - std::vector<uint8_t>()); - return; - } - - // Reading |file| must be done on a thread that allows blocking, so post a - // task to do the read on a separate thread. When that completes simply call - // |callback| with the results. - base::PostTaskWithTraitsAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(&ReadFile, std::move(file), &data_), - base::BindOnce(&CdmFileImpl::OnFileRead, weak_factory_.GetWeakPtr(), - std::move(callback))); -} - -void CdmFileImpl::OnFileRead(ReadCallback callback, Status status) { - DVLOG(3) << __func__ << " file: " << file_name_; - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(file_locked_); - - std::vector<uint8_t> data; - data.swap(data_); - std::move(callback).Run(status, std::move(data)); -} - void CdmFileImpl::Write(const std::vector<uint8_t>& data, WriteCallback callback) { DVLOG(3) << __func__ << " file: " << file_name_ << ", size: " << data.size(); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(file_locked_); - DCHECK(data_.empty()); // If there is no data to write, delete the file to save space. if (data.empty()) {
diff --git a/content/browser/media/cdm_file_impl.h b/content/browser/media/cdm_file_impl.h index 1133508..5eeb5f81 100644 --- a/content/browser/media/cdm_file_impl.h +++ b/content/browser/media/cdm_file_impl.h
@@ -50,6 +50,8 @@ void Write(const std::vector<uint8_t>& data, WriteCallback callback) final; private: + class FileReader; + using CreateOrOpenCallback = storage::AsyncFileUtil::CreateOrOpenCallback; // Open the file |file_name| using the flags provided in |file_flags|. @@ -58,12 +60,9 @@ uint32_t file_flags, CreateOrOpenCallback callback); - // Called when the file has been opened for reading, so it reads the contents - // of |file| and passes them to |callback|. |file| is closed after reading. - void OnFileOpenedForReading(ReadCallback callback, - base::File file, - base::OnceClosure on_close_callback); - void OnFileRead(ReadCallback callback, Status status); + // Called when the file is read. If |success| is true, |data| is the contents + // of the file read. + void ReadDone(bool success, std::vector<uint8_t> data); // Called when |temp_file_name_| has been opened for writing. Writes // |data| to |file|, closes |file|, and then kicks off a rename of @@ -106,8 +105,9 @@ // |temp_file_name| is not required. bool file_locked_ = false; - // Buffer used when reading the file. - std::vector<uint8_t> data_; + // Used when reading the file. |file_reader_| lives on the IO thread. + ReadCallback read_callback_; + std::unique_ptr<FileReader> file_reader_; THREAD_CHECKER(thread_checker_); base::WeakPtrFactory<CdmFileImpl> weak_factory_{this};
diff --git a/content/browser/media/cdm_storage_impl_unittest.cc b/content/browser/media/cdm_storage_impl_unittest.cc index 7f9743f..b6a8f9a 100644 --- a/content/browser/media/cdm_storage_impl_unittest.cc +++ b/content/browser/media/cdm_storage_impl_unittest.cc
@@ -44,6 +44,11 @@ } // namespace class CdmStorageTest : public RenderViewHostTestHarness { + public: + CdmStorageTest() + : RenderViewHostTestHarness( + content::TestBrowserThreadBundle::REAL_IO_THREAD) {} + protected: void SetUp() final { RenderViewHostTestHarness::SetUp();
diff --git a/content/browser/media/media_internals.cc b/content/browser/media/media_internals.cc index 3e2b27a..e9c9d4f 100644 --- a/content/browser/media/media_internals.cc +++ b/content/browser/media/media_internals.cc
@@ -105,23 +105,6 @@ return "unknown"; } -// Whether the player is in incognito mode or ChromeOS guest mode. -bool IsIncognito(int render_process_id) { - content::RenderProcessHost* render_process_host = - content::RenderProcessHost::FromID(render_process_id); - if (!render_process_host) { - // This could happen in tests. - LOG(ERROR) << "Cannot get RenderProcessHost"; - return false; - } - - content::BrowserContext* browser_context = - render_process_host->GetBrowserContext(); - DCHECK(browser_context); - - return browser_context->IsOffTheRecord(); -} - const char kAudioLogStatusKey[] = "status"; const char kAudioLogUpdateFunction[] = "media.updateAudioComponent"; @@ -318,272 +301,12 @@ dict->SetInteger("component_type", component_); } -// This class lives on the browser UI thread. -class MediaInternals::MediaInternalsUMAHandler { - public: - MediaInternalsUMAHandler(); - - // Called when a render process is terminated. Reports the pipeline status to - // UMA for every player associated with the renderer process and then deletes - // the player state. - void OnProcessTerminated(int render_process_id); - - // Helper function to save the event payload to RendererPlayerMap. - void SavePlayerState(int render_process_id, - const media::MediaLogEvent& event); - - private: - struct PipelineInfo { - explicit PipelineInfo(bool is_incognito) : is_incognito(is_incognito) {} - - bool has_pipeline = false; - bool has_ever_played = false; - bool has_reached_have_enough = false; - media::PipelineStatus last_pipeline_status = media::PIPELINE_OK; - bool has_audio = false; - bool has_video = false; - bool video_dds = false; - bool video_decoder_changed = false; - bool has_cdm = false; - bool is_incognito = false; - std::string video_codec_name; - std::string video_decoder; - bool is_platform_video_decoder = false; - }; - - // Helper function to report PipelineStatus associated with a player to UMA. - void ReportUMAForPipelineStatus(const PipelineInfo& player_info); - - // Helper to generate PipelineStatus UMA name for AudioVideo streams. - std::string GetUMANameForAVStream(const PipelineInfo& player_info); - - // Key is player id. - typedef std::map<int, PipelineInfo> PlayerInfoMap; - - // Key is renderer id. - typedef std::map<int, PlayerInfoMap> RendererPlayerMap; - - // Stores player information per renderer. - RendererPlayerMap renderer_info_; - - DISALLOW_COPY_AND_ASSIGN(MediaInternalsUMAHandler); -}; - -MediaInternals::MediaInternalsUMAHandler::MediaInternalsUMAHandler() {} - -void MediaInternals::MediaInternalsUMAHandler::SavePlayerState( - int render_process_id, - const media::MediaLogEvent& event) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - PlayerInfoMap& player_info_map = renderer_info_[render_process_id]; - - auto it = player_info_map.find(event.id); - if (it == player_info_map.end()) { - if (event.type != media::MediaLogEvent::WEBMEDIAPLAYER_CREATED) { - // Due to the asynchronous cleanup order of PipelineImpl and WMPI, - // sometimes a kStopped / kStopping event can sneak in after - // WEBMEDIAPLAYER_DESTROYED. This causes a new memory leak because the - // newly created PipelineImpl would never get cleaned up. - // As a result, we should be dropping any event that would target a - // player that hasn't already been created. - return; - } - bool success = false; - std::tie(it, success) = player_info_map.emplace( - std::make_pair(event.id, PipelineInfo(IsIncognito(render_process_id)))); - if (!success) { - LOG(ERROR) << "Failed to insert a new PipelineInfo."; - return; - } - } - - PipelineInfo& player_info = it->second; - - switch (event.type) { - case media::MediaLogEvent::PLAY: { - player_info.has_ever_played = true; - break; - } - case media::MediaLogEvent::PIPELINE_STATE_CHANGED: { - player_info.has_pipeline = true; - break; - } - case media::MediaLogEvent::PIPELINE_ERROR: { - int status = static_cast<media::PipelineStatus>(media::PIPELINE_OK); - event.params.GetInteger("pipeline_error", &status); - player_info.last_pipeline_status = - static_cast<media::PipelineStatus>(status); - break; - } - case media::MediaLogEvent::PROPERTY_CHANGE: - if (event.params.HasKey("found_audio_stream")) { - event.params.GetBoolean("found_audio_stream", &player_info.has_audio); - } - if (event.params.HasKey("found_video_stream")) { - event.params.GetBoolean("found_video_stream", &player_info.has_video); - } - if (event.params.HasKey("video_codec_name")) { - event.params.GetString("video_codec_name", - &player_info.video_codec_name); - } - if (event.params.HasKey("video_decoder")) { - std::string previous_video_decoder(player_info.video_decoder); - event.params.GetString("video_decoder", &player_info.video_decoder); - if (!previous_video_decoder.empty() && - previous_video_decoder != player_info.video_decoder) { - player_info.video_decoder_changed = true; - } - } - if (event.params.HasKey("is_platform_video_decoder")) { - event.params.GetBoolean("is_platform_video_decoder", - &player_info.is_platform_video_decoder); - } - if (event.params.HasKey("video_dds")) { - event.params.GetBoolean("video_dds", &player_info.video_dds); - } - if (event.params.HasKey("has_cdm")) { - event.params.GetBoolean("has_cdm", &player_info.has_cdm); - } - if (event.params.HasKey("pipeline_buffering_state")) { - std::string buffering_state; - event.params.GetString("pipeline_buffering_state", &buffering_state); - - bool for_suspended_start; - event.params.GetBoolean("for_suspended_start", &for_suspended_start); - - // Ignore the BUFFERING_HAVE_ENOUGH event if it was for a suspended - // start. Otherwise we won't reflect reductions to the HasEverPlayed - // statistic. - if (buffering_state == "BUFFERING_HAVE_ENOUGH" && !for_suspended_start) - player_info.has_reached_have_enough = true; - } - break; - case media::MediaLogEvent::Type::WEBMEDIAPLAYER_DESTROYED: { - // Upon player destruction report UMA data; if the player is not torn down - // before process exit, it will be logged during OnProcessTerminated(). - ReportUMAForPipelineStatus(player_info); - player_info_map.erase(it); - break; - } - default: - break; - } - return; -} - -std::string MediaInternals::MediaInternalsUMAHandler::GetUMANameForAVStream( - const PipelineInfo& player_info) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - static const char kPipelineUmaPrefix[] = "Media.PipelineStatus.AudioVideo."; - std::string uma_name = kPipelineUmaPrefix; - if (player_info.video_codec_name == "vp8") { - uma_name += "VP8."; - } else if (player_info.video_codec_name == "vp9") { - uma_name += "VP9."; - } else if (player_info.video_codec_name == "h264") { - uma_name += "H264."; - } else if (player_info.video_codec_name == "av1") { - uma_name += "AV1."; - } else { - return uma_name + "Other"; - } - -#if !defined(OS_ANDROID) - if (player_info.video_decoder == - media::DecryptingVideoDecoder::kDecoderName) { - return uma_name + "DVD"; - } -#endif - - if (player_info.video_dds) { - uma_name += "DDS."; - } - - // Note that HW essentailly means 'platform' anyway. MediaCodec has been - // reported as HW forever, regardless of the underlying platform - // implementation. - if (player_info.is_platform_video_decoder) { - uma_name += "HW"; - } else { - uma_name += "SW"; - } - return uma_name; -} - -// TODO(xhwang): This function reports more metrics than just pipeline status -// and should be renamed. Similarly, PipelineInfo should be PlayerInfo. -void MediaInternals::MediaInternalsUMAHandler::ReportUMAForPipelineStatus( - const PipelineInfo& player_info) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - // Don't log pipeline status for players which don't actually have a pipeline; - // e.g., the Android MediaSourcePlayer implementation. - if (!player_info.has_pipeline) - return; - - if (player_info.has_video && player_info.has_audio) { - base::UmaHistogramExactLinear(GetUMANameForAVStream(player_info), - player_info.last_pipeline_status, - media::PIPELINE_STATUS_MAX); - } else if (player_info.has_audio) { - UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.AudioOnly", - player_info.last_pipeline_status, - media::PIPELINE_STATUS_MAX + 1); - } else if (player_info.has_video) { - UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.VideoOnly", - player_info.last_pipeline_status, - media::PIPELINE_STATUS_MAX + 1); - } else { - // Note: This metric can be recorded as a result of normal operation with - // Media Source Extensions. If a site creates a MediaSource object but never - // creates a source buffer or appends data, PIPELINE_OK will be recorded. - UMA_HISTOGRAM_ENUMERATION("Media.PipelineStatus.Unsupported", - player_info.last_pipeline_status, - media::PIPELINE_STATUS_MAX + 1); - } - // Report whether video decoder fallback happened, but only if a video decoder - // was reported. - if (!player_info.video_decoder.empty()) { - UMA_HISTOGRAM_BOOLEAN("Media.VideoDecoderFallback", - player_info.video_decoder_changed); - } - - // Report whether this player ever saw a playback event. Used to measure the - // effectiveness of efforts to reduce loaded-but-never-used players. - if (player_info.has_reached_have_enough) - UMA_HISTOGRAM_BOOLEAN("Media.HasEverPlayed", player_info.has_ever_played); - - // Report whether an encrypted playback is in incognito window, excluding - // never-used players. - if (player_info.has_cdm && player_info.has_ever_played) - UMA_HISTOGRAM_BOOLEAN("Media.EME.IsIncognito", player_info.is_incognito); -} - -void MediaInternals::MediaInternalsUMAHandler::OnProcessTerminated( - int render_process_id) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - auto players_it = renderer_info_.find(render_process_id); - if (players_it == renderer_info_.end()) - return; - auto it = players_it->second.begin(); - while (it != players_it->second.end()) { - ReportUMAForPipelineStatus(it->second); - players_it->second.erase(it++); - } - renderer_info_.erase(players_it); -} - MediaInternals* MediaInternals::GetInstance() { static content::MediaInternals* internals = new content::MediaInternals(); return internals; } -MediaInternals::MediaInternals() - : can_update_(false), - owner_ids_(), - uma_handler_(new MediaInternalsUMAHandler()) { +MediaInternals::MediaInternals() : can_update_(false), owner_ids_() { // TODO(sandersd): Is there ever a relevant case where TERMINATED is sent // without CLOSED also being sent? registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, @@ -599,7 +322,6 @@ const NotificationDetails& details) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderProcessHost* process = Source<RenderProcessHost>(source).ptr(); - uma_handler_->OnProcessTerminated(process->GetID()); // TODO(sandersd): Send a termination event before clearing the log. saved_events_by_process_.erase(process->GetID()); } @@ -652,7 +374,6 @@ SendUpdate(update); } SaveEvent(render_process_id, event); - uma_handler_->SavePlayerState(render_process_id, event); } } @@ -835,10 +556,6 @@ render_frame_id); } -void MediaInternals::OnProcessTerminatedForTesting(int process_id) { - uma_handler_->OnProcessTerminated(process_id); -} - void MediaInternals::SendUpdate(const base::string16& update) { // SendUpdate() may be called from any thread, but must run on the UI thread. if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
diff --git a/content/browser/media/media_internals.h b/content/browser/media/media_internals.h index 8fe7a781..3acdbfd 100644 --- a/content/browser/media/media_internals.h +++ b/content/browser/media/media_internals.h
@@ -113,8 +113,6 @@ int render_process_id = -1, int render_frame_id = MSG_ROUTING_NONE); - void OnProcessTerminatedForTesting(int process_id); - private: // Needs access to SendUpdate. friend class MediaInternalsAudioFocusHelper; @@ -169,7 +167,6 @@ bool can_update_; base::DictionaryValue audio_streams_cached_data_; int owner_ids_[media::AudioLogFactory::AUDIO_COMPONENT_MAX]; - std::unique_ptr<MediaInternalsUMAHandler> uma_handler_; DISALLOW_COPY_AND_ASSIGN(MediaInternals); };
diff --git a/content/browser/native_file_system/native_file_system_handle_base.cc b/content/browser/native_file_system/native_file_system_handle_base.cc index 6887c3cb..4a48421 100644 --- a/content/browser/native_file_system/native_file_system_handle_base.cc +++ b/content/browser/native_file_system/native_file_system_handle_base.cc
@@ -132,7 +132,15 @@ base::OnceCallback<void(PermissionStatus)> callback) { PermissionStatus current_status = writable ? GetWritePermissionStatus() : GetReadPermissionStatus(); - if (current_status != PermissionStatus::ASK) { + // If we already have a valid permission status, just return that. Also just + // return the current permission status if this is called from a worker, as we + // don't support prompting for increased permissions from workers. + // + // Currently the worker check here is redundant because there is no way for + // workers to get native file system handles. While workers will never be able + // to call chooseEntries(), they will be able to receive existing handles from + // windows via postMessage() and IndexedDB. + if (current_status != PermissionStatus::ASK || context_.is_worker()) { std::move(callback).Run(current_status); return; }
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.cc b/content/browser/native_file_system/native_file_system_manager_impl.cc index 799845d..e3057f0a 100644 --- a/content/browser/native_file_system/native_file_system_manager_impl.cc +++ b/content/browser/native_file_system/native_file_system_manager_impl.cc
@@ -12,11 +12,13 @@ #include "content/browser/native_file_system/native_file_system_file_handle_impl.h" #include "content/browser/native_file_system/native_file_system_file_writer_impl.h" #include "content/browser/native_file_system/native_file_system_transfer_token_impl.h" +#include "content/browser/storage_partition_impl.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" #include "mojo/public/cpp/bindings/callback_helpers.h" +#include "services/network/public/cpp/is_potentially_trustworthy.h" #include "storage/browser/fileapi/file_system_context.h" #include "storage/browser/fileapi/file_system_operation_runner.h" #include "storage/browser/fileapi/file_system_url.h" @@ -125,9 +127,29 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK(network::IsOriginPotentiallyTrustworthy(binding_context.origin)); bindings_.AddBinding(this, std::move(request), binding_context); } +// static +void NativeFileSystemManagerImpl::BindRequestFromUIThread( + StoragePartitionImpl* storage_partition, + const BindingContext& binding_context, + blink::mojom::NativeFileSystemManagerRequest request) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!network::IsOriginPotentiallyTrustworthy(binding_context.origin)) { + mojo::ReportBadMessage("Native File System access from Unsecure Origin"); + return; + } + + auto* manager = storage_partition->GetNativeFileSystemManager(); + base::PostTaskWithTraits( + FROM_HERE, {BrowserThread::IO}, + base::BindOnce(&NativeFileSystemManagerImpl::BindRequest, + base::Unretained(manager), binding_context, + std::move(request))); +} + void NativeFileSystemManagerImpl::GetSandboxedFileSystem( GetSandboxedFileSystemCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -149,6 +171,13 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); const BindingContext& context = bindings_.dispatch_context(); + // ChooseEntries API is only available to windows, as we need a frame to + // anchor the picker to. + if (context.is_worker()) { + bindings_.ReportBadMessage("ChooseEntries called from a worker"); + return; + } + base::PostTaskWithTraits( FROM_HERE, {BrowserThread::UI}, base::BindOnce(
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.h b/content/browser/native_file_system/native_file_system_manager_impl.h index ba04c5c49..dc5b946 100644 --- a/content/browser/native_file_system/native_file_system_manager_impl.h +++ b/content/browser/native_file_system/native_file_system_manager_impl.h
@@ -29,6 +29,7 @@ class NativeFileSystemFileHandleImpl; class NativeFileSystemDirectoryHandleImpl; class NativeFileSystemTransferTokenImpl; +class StoragePartitionImpl; // This is the browser side implementation of the // NativeFileSystemManager mojom interface. This is the main entry point for @@ -78,6 +79,11 @@ void BindRequest(const BindingContext& binding_context, blink::mojom::NativeFileSystemManagerRequest request); + static void BindRequestFromUIThread( + StoragePartitionImpl* storage_partition, + const BindingContext& binding_context, + blink::mojom::NativeFileSystemManagerRequest request); + // blink::mojom::NativeFileSystemManager: void GetSandboxedFileSystem(GetSandboxedFileSystemCallback callback) override; void ChooseEntries(
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index d150c51..ffbc55f 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -62,6 +62,7 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/url_request/url_request_failed_job.h" #include "services/network/public/cpp/features.h" +#include "services/network/public/mojom/url_loader.mojom.h" #include "url/gurl.h" namespace content { @@ -253,13 +254,15 @@ } // Navigate to |url| and for each ResourceRequest record its - // top_frame_origin. Stop listening after |final_resource| has been - // detected. The output is recorded in |top_frame_origins|. - void NavigateAndRecordTopFrameOrigins( + // trusted_network_isolation_key. Stop listening after |final_resource| has + // been detected. The output is recorded in |network_isolation_keys|. + void NavigateAndRecordNetworkIsolationKeys( const GURL& url, const GURL& final_resource, bool from_renderer, - std::map<GURL, url::Origin>* top_frame_origins) { + std::map<GURL, net::NetworkIsolationKey>* network_isolation_keys, + std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect>* + update_network_isolation_key_on_redirects) { if (from_renderer) EXPECT_TRUE(NavigateToURL(shell(), GURL("about:blank"))); @@ -270,8 +273,11 @@ URLLoaderInterceptor interceptor(base::BindLambdaForTesting( [&](URLLoaderInterceptor::RequestParams* params) -> bool { base::AutoLock top_frame_origins_lock(lock); - (*top_frame_origins)[params->url_request.url] = - *params->url_request.top_frame_origin; + (*network_isolation_keys)[params->url_request.url] = + params->url_request.trusted_network_isolation_key; + (*update_network_isolation_key_on_redirects)[params->url_request + .url] = + params->url_request.update_network_isolation_key_on_redirect; if (params->url_request.url == final_resource) run_loop.Quit(); @@ -825,50 +831,59 @@ EXPECT_EQ("\"done\"", done); } -IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, BrowserNavigationTopFrameOrigin) { - std::map<GURL, url::Origin> top_frame_origins; +IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, + BrowserNavigationNetworkIsolationKey) { + std::map<GURL, net::NetworkIsolationKey> network_isolation_keys; + std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect> + update_network_isolation_key_on_redirects; GURL url(embedded_test_server()->GetURL("/title1.html")); - NavigateAndRecordTopFrameOrigins(url, url /* final_resource */, - false /* from_renderer */, - &top_frame_origins); - EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]); + NavigateAndRecordNetworkIsolationKeys( + url, url /* final_resource */, false /* from_renderer */, + &network_isolation_keys, &update_network_isolation_key_on_redirects); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)), + network_isolation_keys[url]); + EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin, + update_network_isolation_key_on_redirects[url]); } -IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, RenderNavigationTopFrameOrigin) { - std::map<GURL, url::Origin> top_frame_origins; +IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, + RenderNavigationNetworkIsolationKey) { + std::map<GURL, net::NetworkIsolationKey> network_isolation_keys; + std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect> + update_network_isolation_key_on_redirects; GURL url(embedded_test_server()->GetURL("/title2.html")); - NavigateAndRecordTopFrameOrigins(url, url /* final_resource */, - true /* from_renderer */, - &top_frame_origins); - EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]); + NavigateAndRecordNetworkIsolationKeys( + url, url /* final_resource */, true /* from_renderer */, + &network_isolation_keys, &update_network_isolation_key_on_redirects); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)), + network_isolation_keys[url]); + EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin, + update_network_isolation_key_on_redirects[url]); } -IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, SubframeTopFrameOrigin) { - std::map<GURL, url::Origin> top_frame_origins; +IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, SubframeNetworkIsolationKey) { + std::map<GURL, net::NetworkIsolationKey> network_isolation_keys; + std::map<GURL, network::mojom::UpdateNetworkIsolationKeyOnRedirect> + update_network_isolation_key_on_redirects; GURL url(embedded_test_server()->GetURL("/page_with_iframe.html")); GURL iframe_document = embedded_test_server()->GetURL("/title1.html"); - NavigateAndRecordTopFrameOrigins(url, iframe_document /* final_resource */, - false /* from_renderer */, - &top_frame_origins); - EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]); - EXPECT_EQ(url::Origin::Create(url), top_frame_origins[iframe_document]); -} - -IN_PROC_BROWSER_TEST_P(NavigationBrowserTest, SubresourceTopFrameOrigin) { - std::map<GURL, url::Origin> top_frame_origins; - GURL url(embedded_test_server()->GetURL("/page_with_iframe_and_image.html")); - GURL blank_image = embedded_test_server()->GetURL("/blank.jpg"); - - NavigateAndRecordTopFrameOrigins(url, blank_image /* final_resource */, - false /* from_renderer */, - &top_frame_origins); - EXPECT_EQ(url::Origin::Create(url), top_frame_origins[url]); - EXPECT_EQ(url::Origin::Create(url), - top_frame_origins[embedded_test_server()->GetURL("/image.jpg")]); - EXPECT_EQ(url::Origin::Create(url), top_frame_origins[blank_image]); + NavigateAndRecordNetworkIsolationKeys( + url, iframe_document /* final_resource */, false /* from_renderer */, + &network_isolation_keys, &update_network_isolation_key_on_redirects); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)), + network_isolation_keys[url]); + EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin, + update_network_isolation_key_on_redirects[url]); + EXPECT_EQ(net::NetworkIsolationKey(url::Origin::Create(url)), + network_isolation_keys[iframe_document]); + EXPECT_EQ(network::mojom::UpdateNetworkIsolationKeyOnRedirect::kDoNotUpdate, + update_network_isolation_key_on_redirects[iframe_document]); } // Helper class to extract the initiator values from URLLoaderFactory calls
diff --git a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc index 2fae4d0..8ea6f50 100644 --- a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc +++ b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
@@ -427,7 +427,7 @@ if (FAILED(hr)) return; - DCHECK(system_font_set->GetFontCount() > 0); + DCHECK_GT(system_font_set->GetFontCount(), 0U); mswr::ComPtr<IDWriteFontSet> filtered_set; @@ -435,8 +435,7 @@ &unique_font_name](DWRITE_FONT_PROPERTY_ID property_id) { TRACE_EVENT0("dwrite,fonts", "DWriteFontProxyImpl::MatchUniqueFont::filter_set"); - std::wstring unique_font_name_wide = - base::UTF16ToWide(unique_font_name).c_str(); + std::wstring unique_font_name_wide = base::UTF16ToWide(unique_font_name); DWRITE_FONT_PROPERTY search_property = {property_id, unique_font_name_wide.c_str(), L""}; // GetMatchingFonts() matches all languages according to:
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index f680ed83..716ce08 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3867,15 +3867,6 @@ if (url.SchemeIs(kChromeErrorScheme)) return true; - // We want to consolidate particular sites like WebUI even when we are using - // the process-per-tab or process-per-site-instance models. - // Note: DevTools pages have WebUI type but should not reuse the same host. - if (WebUIControllerFactoryRegistry::GetInstance()->UseWebUIForURL( - browser_context, url) && - !url.SchemeIs(kChromeDevToolsScheme)) { - return true; - } - // Otherwise let the content client decide, defaulting to false. return GetContentClient()->browser()->ShouldUseProcessPerSite(browser_context, url);
diff --git a/content/browser/renderer_interface_binders.cc b/content/browser/renderer_interface_binders.cc index 442280a2..c7c8e498 100644 --- a/content/browser/renderer_interface_binders.cc +++ b/content/browser/renderer_interface_binders.cc
@@ -165,19 +165,14 @@ parameterized_binder_registry_.AddInterface(base::BindRepeating( [](blink::mojom::NativeFileSystemManagerRequest request, RenderProcessHost* host, const url::Origin& origin) { - auto* manager = - static_cast<StoragePartitionImpl*>(host->GetStoragePartition()) - ->GetNativeFileSystemManager(); // This code path is only for workers, hence always pass in // MSG_ROUTING_NONE as frame ID. Frames themselves go through // RenderFrameHostImpl instead. - base::PostTaskWithTraits( - FROM_HERE, {BrowserThread::IO}, - base::BindOnce(&NativeFileSystemManagerImpl::BindRequest, - base::Unretained(manager), - NativeFileSystemManagerImpl::BindingContext( - origin, host->GetID(), MSG_ROUTING_NONE), - std::move(request))); + NativeFileSystemManagerImpl::BindRequestFromUIThread( + static_cast<StoragePartitionImpl*>(host->GetStoragePartition()), + NativeFileSystemManagerImpl::BindingContext(origin, host->GetID(), + MSG_ROUTING_NONE), + std::move(request)); })); } parameterized_binder_registry_.AddInterface(
diff --git a/content/browser/service_worker/service_worker_request_handler_unittest.cc b/content/browser/service_worker/service_worker_request_handler_unittest.cc index 386bfc54..481d1019 100644 --- a/content/browser/service_worker/service_worker_request_handler_unittest.cc +++ b/content/browser/service_worker/service_worker_request_handler_unittest.cc
@@ -84,7 +84,8 @@ begin_params->request_context_type = blink::mojom::RequestContextType::HYPERLINK; NavigationRequestInfo request_info( - common_params, std::move(begin_params), gurl, url::Origin::Create(gurl), + common_params, std::move(begin_params), gurl, + net::NetworkIsolationKey(url::Origin::Create(gurl)), true /* is_main_frame */, false /* parent_is_main_frame */, true /* are_ancestors_secure */, -1 /* frame_tree_node_id */, false /* is_for_guests_only */, false /* report_raw_headers */,
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index ed5cc90..186174c5 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -1680,18 +1680,6 @@ special_storage_policy_ = special_storage_policy; } -void StoragePartitionImpl::ShutdownBackgroundSyncContextForTesting() { - if (GetBackgroundSyncContext()) - GetBackgroundSyncContext()->Shutdown(); -} - -void StoragePartitionImpl::OverrideBackgroundSyncContextForTesting( - BackgroundSyncContextImpl* background_sync_context) { - DCHECK(!GetBackgroundSyncContext() || - !GetBackgroundSyncContext()->background_sync_manager()); - background_sync_context_ = background_sync_context; -} - void StoragePartitionImpl::SetURLRequestContext( net::URLRequestContextGetter* url_request_context) { url_request_context_ = url_request_context;
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h index 68e591f..10a6041e 100644 --- a/content/browser/storage_partition_impl.h +++ b/content/browser/storage_partition_impl.h
@@ -85,9 +85,6 @@ storage::QuotaManager* quota_manager); void OverrideSpecialStoragePolicyForTesting( storage::SpecialStoragePolicy* special_storage_policy); - void ShutdownBackgroundSyncContextForTesting(); - void OverrideBackgroundSyncContextForTesting( - BackgroundSyncContextImpl* background_sync_context); // StoragePartition interface. base::FilePath GetPath() override;
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc index 079285e2..b85e0c98 100644 --- a/content/browser/web_contents/web_contents_impl_browsertest.cc +++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -955,6 +955,15 @@ return http_response; } + // Make the document resource cacheable. + if (absolute_url.path() == "/title1.html") { + auto http_response = + std::make_unique<net::test_server::BasicHttpResponse>(); + http_response->set_code(net::HTTP_OK); + http_response->AddCustomHeader("Cache-Control", "max-age=100000"); + return http_response; + } + // A worker that loads a nested /worker.js on an origin provided as a query // param. if (absolute_url.path() == "/embedding_worker.js") { @@ -1080,6 +1089,42 @@ return (*observer.FindResource(resource))->was_cached; } + // Navigates to |url| and returns if the navigation resource was fetched from + // the cache or not. + bool NavigationResourceCached(const GURL& url, + const GURL& sub_frame, + bool subframe_navigation_resource_cached) { + // Do a cross-process navigation to clear the in-memory cache. + // We assume that we don't start this call from "chrome://gpu", as + // otherwise it won't be a cross-process navigation. We are relying + // on this navigation to discard the old process. + EXPECT_TRUE(NavigateToURL(shell(), GetWebUIURL("gpu"))); + + // Observe network requests. + ResourceLoadObserver observer(shell()); + + NavigateToURL(shell(), url); + + RenderFrameHostImpl* main_frame = static_cast<RenderFrameHostImpl*>( + shell()->web_contents()->GetMainFrame()); + + GURL main_url = main_frame->frame_tree_node()->current_url(); + observer.WaitForResourceCompletion(main_url); + + if (sub_frame.is_valid()) { + EXPECT_EQ(1U, main_frame->frame_tree_node()->child_count()); + NavigateFrameToURL(main_frame->frame_tree_node()->child_at(0), sub_frame); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + GURL sub_frame_url = + main_frame->frame_tree_node()->child_at(0)->current_url(); + observer.WaitForResourceCompletion(sub_frame_url); + EXPECT_EQ(subframe_navigation_resource_cached, + (*observer.FindResource(sub_frame_url))->was_cached); + } + + return (*observer.FindResource(main_url))->was_cached; + } + GURL GenURL(const std::string& host, const std::string& path) { return embedded_test_server()->GetURL(host, path); } @@ -1147,6 +1192,10 @@ // the resource shouldn't be cached because now we're on d.com. EXPECT_FALSE(TestResourceLoad(GenURL("a.com", "/redirect_to_d"), GURL())); + // Navigate to d.com directly. The main resource should be cached due to the + // earlier navigation. + EXPECT_TRUE(TestResourceLoad(GenURL("d.com", "/title1.html"), GURL())); + // Load the resource from a same-origin iframe on a page where it's already // cached. It should still be cached. EXPECT_TRUE(TestResourceLoad(GenURL("a.com", "/title1.html"), @@ -1207,6 +1256,39 @@ } IN_PROC_BROWSER_TEST_P(WebContentsSplitCacheBrowserTestEnabled, + NavigationResources) { + // Navigate for the first time, and it's not cached. + EXPECT_FALSE( + NavigationResourceCached(GenURL("a.com", "/title1.html"), GURL(), false)); + + // The second time, it's cached. + EXPECT_TRUE( + NavigationResourceCached(GenURL("a.com", "/title1.html"), GURL(), false)); + + // Navigate to a.com/redirect_to_d which redirects to d.com/title1.html. + EXPECT_FALSE(NavigationResourceCached(GenURL("a.com", "/redirect_to_d"), + GURL(), false)); + + // Navigate to d.com directly. The main resource should be cached due to the + // earlier redirected navigation. + EXPECT_TRUE( + NavigationResourceCached(GenURL("d.com", "/title1.html"), GURL(), false)); + + // Navigate to a subframe with the same top frame origin as in an earlier + // navigation and same url as already navigated to earlier in a main frame + // navigation. It should be a cache hit for the subframe resource. + EXPECT_FALSE(NavigationResourceCached( + GenURL("a.com", "/navigation_controller/page_with_iframe.html"), + GenURL("a.com", "/title1.html"), true)); + + // Navigate to the same subframe document from a different top frame top frame + // origin. It should be a cache miss. + EXPECT_FALSE(NavigationResourceCached( + GenURL("b.com", "/navigation_controller/page_with_iframe.html"), + GenURL("a.com", "/title1.html"), false)); +} + +IN_PROC_BROWSER_TEST_P(WebContentsSplitCacheBrowserTestEnabled, SplitCacheDedicatedWorkers) { // Load 3p.com/script from a.com's worker. The first time it's loaded from the // network and the second it's cached.
diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc index c7f7a27e..fb06c33 100644 --- a/content/browser/webui/web_ui_mojo_browsertest.cc +++ b/content/browser/webui/web_ui_mojo_browsertest.cc
@@ -303,28 +303,59 @@ if (!IsGeneratedResourceAvailable( "content/test/data/web_ui_test_mojo_bindings.mojom-lite.js")) return; - - g_got_message = false; - base::RunLoop run_loop; - factory()->set_run_loop(&run_loop); GURL test_url(GetWebUIURL("mojo-web-ui/web_ui_mojo.html?ping")); - NavigateToURL(shell(), test_url); - // RunLoop is quit when message received from page. - run_loop.Run(); - EXPECT_TRUE(g_got_message); - // Check that a second render frame in the same renderer process works - // correctly. - Shell* other_shell = CreateBrowser(); - g_got_message = false; - base::RunLoop other_run_loop; - factory()->set_run_loop(&other_run_loop); - NavigateToURL(other_shell, test_url); - // RunLoop is quit when message received from page. - other_run_loop.Run(); - EXPECT_TRUE(g_got_message); - EXPECT_EQ(shell()->web_contents()->GetMainFrame()->GetProcess(), - other_shell->web_contents()->GetMainFrame()->GetProcess()); + { + g_got_message = false; + base::RunLoop run_loop; + factory()->set_run_loop(&run_loop); + NavigateToURL(shell(), test_url); + // RunLoop is quit when message received from page. + run_loop.Run(); + EXPECT_TRUE(g_got_message); + } + + { + // Check that a second shell works correctly. + Shell* other_shell = CreateBrowser(); + g_got_message = false; + base::RunLoop other_run_loop; + factory()->set_run_loop(&other_run_loop); + NavigateToURL(other_shell, test_url); + // RunLoop is quit when message received from page. + other_run_loop.Run(); + EXPECT_TRUE(g_got_message); + + // We expect two independent chrome://foo tabs/shells to use a separate + // process. + EXPECT_NE(shell()->web_contents()->GetMainFrame()->GetProcess(), + other_shell->web_contents()->GetMainFrame()->GetProcess()); + + // Close the second shell and wait until its process exits. + RenderProcessHostWatcher process_watcher( + other_shell->web_contents()->GetMainFrame()->GetProcess(), + RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); + other_shell->Close(); + process_watcher.Wait(); + } + + { + // Check that a third shell works correctly, even if we force it to share a + // process with the first shell, by forcing an artificially low process + // limit. + RenderProcessHost::SetMaxRendererProcessCount(1); + + Shell* other_shell = CreateBrowser(); + g_got_message = false; + base::RunLoop other_run_loop; + factory()->set_run_loop(&other_run_loop); + NavigateToURL(other_shell, test_url); + // RunLoop is quit when message received from page. + other_run_loop.Run(); + EXPECT_TRUE(g_got_message); + EXPECT_EQ(shell()->web_contents()->GetMainFrame()->GetProcess(), + other_shell->web_contents()->GetMainFrame()->GetProcess()); + } } // Disabled due to flakiness: crbug.com/860385.
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index b4ed1fa..3bcd0517 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -543,7 +543,7 @@ "sandbox_support_mac.mojom", "web_contents_ns_view_bridge.mojom", ] - public_deps += [ "//ui/display/mojo:interfaces" ] + public_deps += [ "//ui/display/mojom" ] } overridden_deps = [ "//third_party/blink/public/mojom:mojom_core" ]
diff --git a/content/common/render_widget_host_ns_view.mojom b/content/common/render_widget_host_ns_view.mojom index 1a11dd4..9cb2c59 100644 --- a/content/common/render_widget_host_ns_view.mojom +++ b/content/common/render_widget_host_ns_view.mojom
@@ -8,7 +8,7 @@ import "content/common/input/input_handler.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "ui/base/ime/mojo/ime_types.mojom"; -import "ui/display/mojo/display.mojom"; +import "ui/display/mojom/display.mojom"; import "ui/events/mojo/event.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/mojo/ca_layer_params.mojom";
diff --git a/content/public/browser/background_sync_context.h b/content/public/browser/background_sync_context.h index d2237b8..0273ceb 100644 --- a/content/public/browser/background_sync_context.h +++ b/content/public/browser/background_sync_context.h
@@ -29,10 +29,9 @@ class CONTENT_EXPORT BackgroundSyncContext { public: // Gets the soonest time delta from now, when the browser should be woken up - // to fire Background Sync events of |sync_type|, across all storage - // partitions in |browser_context|, and invokes |callback| with it. + // to fire any Background Sync events, across all storage partitions in + // |browser_context|, and invokes |callback| with it. static void GetSoonestWakeupDeltaAcrossPartitions( - blink::mojom::BackgroundSyncType sync_type, BrowserContext* browser_context, base::OnceCallback<void(base::TimeDelta)> callback); @@ -59,8 +58,6 @@ // Gets the soonest time delta from now, when the browser should be woken up // to fire any Background Sync events. Calls |callback| with this value. virtual void GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync, base::OnceCallback<void(base::TimeDelta)> callback) = 0; protected:
diff --git a/content/public/browser/background_sync_controller.h b/content/public/browser/background_sync_controller.h index 1a67cdd..c402b7f2 100644 --- a/content/public/browser/background_sync_controller.h +++ b/content/public/browser/background_sync_controller.h
@@ -57,10 +57,8 @@ int max_attempts) {} // Calculates the soonest wakeup delta across all storage partitions and - // schedules a background task to wake up the browser to process - // Background Sync registrations. - virtual void ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) {} + // schedules a background task to wake up the browser. + virtual void RunInBackground() {} // Calculates the delay after which the next sync event should be fired // for a BackgroundSync registration. The delay is based on the |sync_type|.
diff --git a/content/public/browser/native_file_system_entry_factory.h b/content/public/browser/native_file_system_entry_factory.h index 8ccb498..38fcc33b9 100644 --- a/content/public/browser/native_file_system_entry_factory.h +++ b/content/public/browser/native_file_system_entry_factory.h
@@ -9,6 +9,7 @@ #include "base/memory/ref_counted.h" #include "content/common/content_export.h" #include "content/public/browser/browser_thread.h" +#include "ipc/ipc_message.h" #include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom-forward.h" #include "url/origin.h" @@ -19,12 +20,17 @@ : public base::RefCountedThreadSafe<NativeFileSystemEntryFactory, BrowserThread::DeleteOnIOThread> { public: + // Context from which a created handle is going to be used. This is used for + // security and permission checks. Pass in MSG_ROUTING_NONE as frame_id if + // the context is a worker, otherwise use the routing id of the relevant + // RenderFrameHost. struct CONTENT_EXPORT BindingContext { BindingContext(const url::Origin& origin, int process_id, int frame_id) : origin(origin), process_id(process_id), frame_id(frame_id) {} url::Origin origin; int process_id; int frame_id; + bool is_worker() const { return frame_id == MSG_ROUTING_NONE; } }; // Creates a new NativeFileSystemEntryPtr from the path to a file. Assumes the
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index 3915614..6e1fea1 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -31,6 +31,7 @@ #include "content/public/renderer/render_view_visitor.h" #include "content/public/test/frame_load_waiter.h" #include "content/renderer/history_serialization.h" +#include "content/renderer/loader/resource_dispatcher.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" #include "content/renderer/renderer_blink_platform_impl.h" @@ -48,6 +49,7 @@ #include "third_party/blink/public/platform/web_gesture_event.h" #include "third_party/blink/public/platform/web_input_event.h" #include "third_party/blink/public/platform/web_mouse_event.h" +#include "third_party/blink/public/platform/web_url_loader_client.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/public/web/blink.h" #include "third_party/blink/public/web/web_document.h" @@ -103,6 +105,70 @@ DISALLOW_COPY_AND_ASSIGN(CloseMessageSendingRenderViewVisitor); }; +class FakeWebURLLoader : public blink::WebURLLoader { + public: + FakeWebURLLoader( + std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle> + task_runner_handle) + : task_runner_handle_(std::move(task_runner_handle)) {} + + void LoadSynchronously(const WebURLRequest& request, + blink::WebURLLoaderClient* client, + blink::WebURLResponse&, + base::Optional<blink::WebURLError>&, + blink::WebData&, + int64_t&, + int64_t&, + blink::WebBlobInfo&) override { + client->DidFail(blink::WebURLError(kFailureReason, request.Url()), 0, 0, 0); + } + + void LoadAsynchronously(const WebURLRequest& request, + blink::WebURLLoaderClient* client) override { + DCHECK(task_runner_handle_); + async_client_ = client; + task_runner_handle_->GetTaskRunner()->PostTask( + FROM_HERE, + base::BindOnce(&FakeWebURLLoader::DidFail, weak_factory_.GetWeakPtr(), + blink::WebURLError(kFailureReason, request.Url()), 0, 0, + 0)); + } + + void SetDefersLoading(bool) override {} + void DidChangePriority(WebURLRequest::Priority, int) override {} + scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() override { + return nullptr; + } + + void DidFail(const blink::WebURLError& error, + int64_t total_encoded_data_length, + int64_t total_encoded_body_length, + int64_t total_decoded_body_length) { + DCHECK(async_client_); + async_client_->DidFail(error, total_encoded_data_length, + total_encoded_body_length, + total_decoded_body_length); + } + + private: + static const int kFailureReason = net::ERR_FAILED; + std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle> + task_runner_handle_; + blink::WebURLLoaderClient* async_client_ = nullptr; + + base::WeakPtrFactory<FakeWebURLLoader> weak_factory_{this}; +}; + +class FakeWebURLLoaderFactory : public blink::WebURLLoaderFactory { + public: + std::unique_ptr<blink::WebURLLoader> CreateURLLoader( + const WebURLRequest&, + std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle> + task_runner_handle) override { + return std::make_unique<FakeWebURLLoader>(std::move(task_runner_handle)); + } +}; + // Converts |ascii_character| into |key_code| and returns true on success. // Handles only the characters needed by tests. bool GetWindowsKeyCode(char ascii_character, int* key_code) { @@ -747,4 +813,11 @@ blink::WebWidget::LifecycleUpdateReason::kTest); } +void RenderViewTest::CreateFakeWebURLLoaderFactory() { + auto* frame_impl = static_cast<RenderViewImpl*>(view_)->GetMainRenderFrame(); + DCHECK(frame_impl); + frame_impl->SetWebURLLoaderFactoryOverrideForTest( + std::make_unique<FakeWebURLLoaderFactory>()); +} + } // namespace content
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h index 7c4f3d1..9ae805d 100644 --- a/content/public/test/render_view_test.h +++ b/content/public/test/render_view_test.h
@@ -202,6 +202,9 @@ void TearDown() override; + // Install a fake URL loader factory for the RenderFrameImpl. + void CreateFakeWebURLLoaderFactory(); + base::test::ScopedTaskEnvironment scoped_task_environment_; std::unique_ptr<CompositorDependencies> compositor_deps_;
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc index 5cda56b..176343f 100644 --- a/content/renderer/loader/web_url_loader_impl.cc +++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -352,11 +352,6 @@ WebURLLoaderFactoryImpl::~WebURLLoaderFactoryImpl() = default; -std::unique_ptr<WebURLLoaderFactoryImpl> -WebURLLoaderFactoryImpl::CreateTestOnlyFactory() { - return std::make_unique<WebURLLoaderFactoryImpl>(nullptr, nullptr); -} - std::unique_ptr<blink::WebURLLoader> WebURLLoaderFactoryImpl::CreateURLLoader( const blink::WebURLRequest& request, std::unique_ptr<WebResourceLoadingTaskRunnerHandle> task_runner_handle) {
diff --git a/content/renderer/loader/web_url_loader_impl.h b/content/renderer/loader/web_url_loader_impl.h index 9ce10668..c5b97159 100644 --- a/content/renderer/loader/web_url_loader_impl.h +++ b/content/renderer/loader/web_url_loader_impl.h
@@ -35,9 +35,6 @@ scoped_refptr<network::SharedURLLoaderFactory> loader_factory); ~WebURLLoaderFactoryImpl() override; - // Creates a test-only factory which can be used only for data URLs. - static std::unique_ptr<WebURLLoaderFactoryImpl> CreateTestOnlyFactory(); - std::unique_ptr<blink::WebURLLoader> CreateURLLoader( const blink::WebURLRequest& request, std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 13bedee..dfac9d0 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -7402,8 +7402,9 @@ RenderFrameImpl::CreateURLLoaderFactory() { if (!RenderThreadImpl::current()) { // Some tests (e.g. RenderViewTests) do not have RenderThreadImpl, - // use the platform's default WebURLLoaderFactoryImpl for them. - return WebURLLoaderFactoryImpl::CreateTestOnlyFactory(); + // and must create a factory override instead. + DCHECK(web_url_loader_factory_override_for_test_); + return std::move(web_url_loader_factory_override_for_test_); } return std::make_unique<FrameURLLoaderFactory>(weak_factory_.GetWeakPtr()); } @@ -7703,4 +7704,9 @@ frame_->AddMessageToConsole(wcm, discard_duplicates); } +void RenderFrameImpl::SetWebURLLoaderFactoryOverrideForTest( + std::unique_ptr<blink::WebURLLoaderFactory> factory) { + web_url_loader_factory_override_for_test_ = std::move(factory); +} + } // namespace content
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index dc8171af..9e059c3 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -997,6 +997,11 @@ void SetDocumentInterfaceBrokerForTesting( blink::mojom::DocumentInterfaceBrokerPtr test_broker); + // Used in tests to install a fake WebURLLoaderFactory via + // RenderViewTest::CreateFakeWebURLLoaderFactory(). + void SetWebURLLoaderFactoryOverrideForTest( + std::unique_ptr<blink::WebURLLoaderFactory> factory); + protected: explicit RenderFrameImpl(CreateParams params); @@ -1773,6 +1778,9 @@ class MHTMLBodyLoaderClient; std::unique_ptr<MHTMLBodyLoaderClient> mhtml_body_loader_client_; + std::unique_ptr<blink::WebURLLoaderFactory> + web_url_loader_factory_override_for_test_; + base::WeakPtrFactory<RenderFrameImpl> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl);
diff --git a/content/shell/renderer/web_test/blink_test_runner.cc b/content/shell/renderer/web_test/blink_test_runner.cc index dabd9e4..0cd46067 100644 --- a/content/shell/renderer/web_test/blink_test_runner.cc +++ b/content/shell/renderer/web_test/blink_test_runner.cc
@@ -415,8 +415,7 @@ if (!interfaces->TestIsRunning()) return; - RenderThread::Get()->Send( - new WebTestHostMsg_WebTestRuntimeFlagsChanged(changed_values)); + Send(new WebTestHostMsg_WebTestRuntimeFlagsChanged(changed_values)); } void BlinkTestRunner::TestFinished() { @@ -431,8 +430,7 @@ // If we're not in the main frame, then ask the browser to redirect the call // to the main frame instead. if (!is_main_window_ || !render_view()->GetMainRenderFrame()) { - RenderThread::Get()->Send( - new WebTestHostMsg_TestFinishedInSecondaryRenderer()); + Send(new WebTestHostMsg_TestFinishedInSecondaryRenderer()); return; }
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 30b7f7e..ff3023f 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -175,9 +175,8 @@ # Mark all webview tests as RetryOnFailure due to Nexus 5x driver bug. crbug.com/950932 [ android-webview-instrumentation qualcomm-adreno-(tm)-418 ] * [ RetryOnFailure ] -# Failing on Nexus 5 -crbug.com/957714 [ android no-skia-renderer qualcomm-adreno-(tm)-330 ] Pixel_Canvas2DRedBox [ Failure ] -crbug.com/900706 [ android qualcomm-adreno-(tm)-330 ] Pixel_CanvasLowLatency2D [ Failure ] +# Producing black images on Nexus 5Xs in Android Webview. +crbug.com/984352 [ android android-webview-instrumentation qualcomm-adreno-(tm)-418 ] Pixel_CanvasLowLatency2D [ Failure ] # Failing on Pixel 2 FYI. crbug.com/966069 [ android qualcomm-adreno-(tm)-540 ] Pixel_CanvasLowLatency2D [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 0be21e1..5451ec0 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -345,6 +345,9 @@ crbug.com/483282 [ mac nvidia-0xfe9 ] deqp/functional/gles3/fboinvalidate/format_02.html [ Failure ] crbug.com/483282 [ mac nvidia-0xfe9 ] deqp/functional/gles3/negativeshaderapi.html [ Failure ] crbug.com/483282 [ mac nvidia-0xfe9 ] deqp/functional/gles3/vertexarrays/multiple_attributes.output.html [ RetryOnFailure ] +crbug.com/984588 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_06.html [ Failure ] +crbug.com/984588 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_21.html [ Failure ] +crbug.com/984588 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_26.html [ Failure ] crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_28.html [ Failure ] crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_30.html [ Failure ] crbug.com/654187 [ mac nvidia-0xfe9 ] deqp/functional/gles3/framebufferblit/conversion_31.html [ Failure ]
diff --git a/content/test/mock_background_sync_controller.cc b/content/test/mock_background_sync_controller.cc index 6e27341..e722604 100644 --- a/content/test/mock_background_sync_controller.cc +++ b/content/test/mock_background_sync_controller.cc
@@ -14,13 +14,8 @@ registration_origin_ = origin; } -void MockBackgroundSyncController::ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) { - if (sync_type == blink::mojom::BackgroundSyncType::PERIODIC) { - run_in_background_for_periodic_sync_count_ += 1; - return; - } - run_in_background_for_one_shot_sync_count_ += 1; +void MockBackgroundSyncController::RunInBackground() { + run_in_background_count_ += 1; } void MockBackgroundSyncController::GetParameterOverrides(
diff --git a/content/test/mock_background_sync_controller.h b/content/test/mock_background_sync_controller.h index 3300aa3..7f87e00 100644 --- a/content/test/mock_background_sync_controller.h +++ b/content/test/mock_background_sync_controller.h
@@ -27,8 +27,7 @@ void NotifyBackgroundSyncRegistered(const url::Origin& origin, bool can_fire, bool is_reregistered) override; - void ScheduleBrowserWakeUp( - blink::mojom::BackgroundSyncType sync_type) override; + void RunInBackground() override; void GetParameterOverrides(BackgroundSyncParameters* parameters) override; base::TimeDelta GetNextEventDelay( const url::Origin& origin, @@ -43,12 +42,7 @@ const url::Origin& registration_origin() const { return registration_origin_; } - int run_in_background_count() const { - return run_in_background_for_one_shot_sync_count_; - } - int run_in_background_periodic_sync_count() const { - return run_in_background_for_periodic_sync_count_; - } + int run_in_background_count() const { return run_in_background_count_; } BackgroundSyncParameters* background_sync_parameters() { return &background_sync_parameters_; } @@ -57,8 +51,7 @@ int registration_count_ = 0; url::Origin registration_origin_; - int run_in_background_for_one_shot_sync_count_ = 0; - int run_in_background_for_periodic_sync_count_ = 0; + int run_in_background_count_ = 0; BackgroundSyncParameters background_sync_parameters_; DISALLOW_COPY_AND_ASSIGN(MockBackgroundSyncController);
diff --git a/content/test/test_background_sync_manager.cc b/content/test/test_background_sync_manager.cc index c360281c..67b30bd 100644 --- a/content/test/test_background_sync_manager.cc +++ b/content/test/test_background_sync_manager.cc
@@ -31,6 +31,10 @@ std::move(continuation_).Run(); } +void TestBackgroundSyncManager::ClearDelayedTask() { + delayed_task_.Reset(); +} + void TestBackgroundSyncManager::StoreDataInBackend( int64_t sw_registration_id, const url::Origin& origin, @@ -94,13 +98,10 @@ dispatch_periodic_sync_callback_.Run(active_version, std::move(callback)); } -void TestBackgroundSyncManager::ScheduleDelayedTask( - blink::mojom::BackgroundSyncType sync_type, - base::TimeDelta delay) { - if (sync_type == blink::mojom::BackgroundSyncType::ONE_SHOT) - delayed_one_shot_sync_task_delta_ = delay; - else - delayed_periodic_sync_task_delta_ = delay; +void TestBackgroundSyncManager::ScheduleDelayedTask(base::OnceClosure callback, + base::TimeDelta delay) { + delayed_task_ = std::move(callback); + delayed_task_delta_ = delay; } void TestBackgroundSyncManager::HasMainFrameProviderHost( @@ -126,15 +127,11 @@ } base::TimeDelta TestBackgroundSyncManager::GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync) { + blink::mojom::BackgroundSyncType sync_type) { base::TimeDelta soonest_wakeup_delta = - BackgroundSyncManager::GetSoonestWakeupDelta( - sync_type, last_browser_wakeup_for_periodic_sync); + BackgroundSyncManager::GetSoonestWakeupDelta(sync_type); if (sync_type == blink::mojom::BackgroundSyncType::ONE_SHOT) - soonest_one_shot_sync_wakeup_delta_ = soonest_wakeup_delta; - else - soonest_periodic_sync_wakeup_delta_ = soonest_wakeup_delta; + soonest_one_shot_wakeup_delta_ = soonest_wakeup_delta; return soonest_wakeup_delta; }
diff --git a/content/test/test_background_sync_manager.h b/content/test/test_background_sync_manager.h index 519b4cb..58f5217 100644 --- a/content/test/test_background_sync_manager.h +++ b/content/test/test_background_sync_manager.h
@@ -83,45 +83,22 @@ has_main_frame_provider_host_ = value; } - bool IsDelayedTaskScheduledOneShotSync() const { - return !delayed_one_shot_sync_task_.callback().is_null(); - } - bool IsDelayedTaskScheduledPeriodicSync() const { - return !delayed_periodic_sync_task_.callback().is_null(); - } - void RunOneShotSyncDelayedTask() { - std::move(delayed_one_shot_sync_task_.callback()).Run(); - } - void RunPeriodicSyncDelayedTask() { - std::move(delayed_periodic_sync_task_.callback()).Run(); - } + bool IsDelayedTaskScheduled() const { return !delayed_task_.is_null(); } + void RunDelayedTask() { std::move(delayed_task_).Run(); } // Accessors to internal state - base::TimeDelta delayed_one_shot_sync_task_delta() const { - return delayed_one_shot_sync_task_delta_; - } - base::TimeDelta delayed_periodic_sync_task_delta() const { - return delayed_periodic_sync_task_delta_; - } + base::TimeDelta delayed_task_delta() const { return delayed_task_delta_; } bool last_chance() const { return last_chance_; } const BackgroundSyncParameters* background_sync_parameters() const { return parameters_.get(); } - bool IsBrowserWakeupForOneShotSyncScheduled() const { - return !soonest_one_shot_sync_wakeup_delta_.is_max(); - } - - bool IsBrowserWakeupForPeriodicSyncScheduled() const { - return !soonest_periodic_sync_wakeup_delta_.is_max(); + bool IsBrowserWakeupScheduled() const { + return !soonest_one_shot_wakeup_delta_.is_max(); } bool EqualsSoonestOneShotWakeupDelta(base::TimeDelta compare_to) const { - return soonest_one_shot_sync_wakeup_delta_ == compare_to; - } - - bool EqualsSoonestPeriodicSyncWakeupDelta(base::TimeDelta compare_to) const { - return soonest_periodic_sync_wakeup_delta_ == compare_to; + return soonest_one_shot_wakeup_delta_ == compare_to; } void DispatchPeriodicSyncEvent( @@ -131,8 +108,7 @@ // Override to allow the test to cache the result. base::TimeDelta GetSoonestWakeupDelta( - blink::mojom::BackgroundSyncType sync_type, - base::Time last_browser_wakeup_for_periodic_sync) override; + blink::mojom::BackgroundSyncType sync_type) override; protected: // Override to allow delays to be injected by tests. @@ -159,7 +135,7 @@ // Override to just store delayed task, and allow tests to control the clock // and when delayed tasks are executed. - void ScheduleDelayedTask(blink::mojom::BackgroundSyncType sync_type, + void ScheduleDelayedTask(base::OnceClosure callback, base::TimeDelta delay) override; // Override to avoid actual check for main frame, instead return the value set @@ -190,10 +166,9 @@ base::OnceClosure continuation_; DispatchSyncCallback dispatch_sync_callback_; DispatchSyncCallback dispatch_periodic_sync_callback_; - base::TimeDelta delayed_one_shot_sync_task_delta_; - base::TimeDelta delayed_periodic_sync_task_delta_; - base::TimeDelta soonest_one_shot_sync_wakeup_delta_; - base::TimeDelta soonest_periodic_sync_wakeup_delta_; + base::OnceClosure delayed_task_; + base::TimeDelta delayed_task_delta_; + base::TimeDelta soonest_one_shot_wakeup_delta_; DISALLOW_COPY_AND_ASSIGN(TestBackgroundSyncManager); };
diff --git a/device/vr/public/mojom/BUILD.gn b/device/vr/public/mojom/BUILD.gn index 1e1b080c..69db524 100644 --- a/device/vr/public/mojom/BUILD.gn +++ b/device/vr/public/mojom/BUILD.gn
@@ -18,7 +18,7 @@ "//device/gamepad/public/mojom", "//gpu/ipc/common:interfaces", "//mojo/public/mojom/base", - "//ui/display/mojo:interfaces", + "//ui/display/mojom:mojom", "//ui/gfx/geometry/mojo", "//ui/gfx/mojo:mojo", ]
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom index 70f7d3a..87edade 100644 --- a/device/vr/public/mojom/vr_service.mojom +++ b/device/vr/public/mojom/vr_service.mojom
@@ -8,7 +8,7 @@ import "mojo/public/mojom/base/time.mojom"; import "gpu/ipc/common/mailbox_holder.mojom"; import "gpu/ipc/common/sync_token.mojom"; -import "ui/display/mojo/display.mojom"; +import "ui/display/mojom/display.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/mojo/gpu_fence_handle.mojom"; import "ui/gfx/mojo/transform.mojom";
diff --git a/docs/callback.md b/docs/callback.md index 4d76389..99de0a1 100644 --- a/docs/callback.md +++ b/docs/callback.md
@@ -355,13 +355,13 @@ ```cpp class MyClass { public: - MyClass() : weak_factory_(this) { + MyClass() { weak_this_ = weak_factory_.GetWeakPtr(); } private: base::WeakPtr<MyClass> weak_this_; // MyClass member variables go here. - base::WeakPtrFactory<MyClass> weak_factory_; + base::WeakPtrFactory<MyClass> weak_factory_{this}; }; ```
diff --git a/docs/threading_and_tasks.md b/docs/threading_and_tasks.md index 5e85d2a..c393ab8 100644 --- a/docs/threading_and_tasks.md +++ b/docs/threading_and_tasks.md
@@ -588,8 +588,6 @@ class A { public: - A() : weak_ptr_factory_(this) {} - void ComputeAndStore() { // Schedule a call to Compute() in a thread pool followed by // a call to A::Store() on the current sequence. The call to @@ -604,7 +602,7 @@ void Store(int value) { value_ = value; } int value_; - base::WeakPtrFactory<A> weak_ptr_factory_; + base::WeakPtrFactory<A> weak_ptr_factory_{this}; }; ```
diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc index 1e8b4e5..56e02351 100644 --- a/google_apis/gaia/gaia_auth_fetcher.cc +++ b/google_apis/gaia/gaia_auth_fetcher.cc
@@ -47,6 +47,11 @@ const size_t kMaxMessageSize = 1024 * 1024; // 1MB +constexpr char kBadAuthenticationError[] = "BadAuthentication"; +constexpr char kBadAuthenticationShortError[] = "badauth"; +constexpr char kServiceUnavailableError[] = "ServiceUnavailable"; +constexpr char kServiceUnavailableShortError[] = "ire"; + std::unique_ptr<const GaiaAuthConsumer::ClientOAuthResult> ExtractOAuth2TokenPairResponse(const std::string& data) { std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated(data); @@ -175,10 +180,6 @@ const char GaiaAuthFetcher::kOAuthLoginFormat[] = "service=%s&source=%s"; -const char GaiaAuthFetcher::kBadAuthenticationError[] = "BadAuthentication"; -// static -const char GaiaAuthFetcher::kServiceUnavailableError[] = - "ServiceUnavailable"; // static const char GaiaAuthFetcher::kErrorParam[] = "Error"; // static @@ -871,13 +872,15 @@ ParseClientLoginFailure(data, &error, &url); DLOG(WARNING) << "ClientLogin failed with " << error; - if (error == kBadAuthenticationError) { + if (error == kBadAuthenticationShortError || + error == kBadAuthenticationError) { return GoogleServiceAuthError( GoogleServiceAuthError::FromInvalidGaiaCredentialsReason( GoogleServiceAuthError::InvalidGaiaCredentialsReason:: CREDENTIALS_REJECTED_BY_SERVER)); } - if (error == kServiceUnavailableError) { + if (error == kServiceUnavailableShortError || + error == kServiceUnavailableError) { return GoogleServiceAuthError( GoogleServiceAuthError::SERVICE_UNAVAILABLE); }
diff --git a/google_apis/gaia/gaia_auth_fetcher.h b/google_apis/gaia/gaia_auth_fetcher.h index 7cf915e..ffb869e 100644 --- a/google_apis/gaia/gaia_auth_fetcher.h +++ b/google_apis/gaia/gaia_auth_fetcher.h
@@ -233,10 +233,6 @@ static const char kOAuthLoginFormat[]; // Constants for parsing ClientLogin errors. - static const char kBadAuthenticationError[]; - static const char kBadAuthenticationErrorCode[]; - static const char kServiceUnavailableError[]; - static const char kServiceUnavailableErrorCode[]; static const char kErrorParam[]; static const char kErrorUrlParam[]; @@ -365,8 +361,10 @@ friend class GaiaAuthFetcherTest; FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, CaptchaParse); FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, BadAuthenticationError); + FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, BadAuthenticationShortError); FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, IncomprehensibleError); FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, ServiceUnavailableError); + FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, ServiceUnavailableShortError); FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, CheckNormalErrorCode); FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, CheckTwoFactorResponse); FRIEND_TEST_ALL_PREFIXES(GaiaAuthFetcherTest, LoginNetFailure);
diff --git a/google_apis/gaia/gaia_auth_fetcher_unittest.cc b/google_apis/gaia/gaia_auth_fetcher_unittest.cc index 579a52f6..b0163e7 100644 --- a/google_apis/gaia/gaia_auth_fetcher_unittest.cc +++ b/google_apis/gaia/gaia_auth_fetcher_unittest.cc
@@ -246,6 +246,13 @@ EXPECT_EQ(error.state(), GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); } +TEST_F(GaiaAuthFetcherTest, BadAuthenticationShortError) { + std::string data = "Error=badauth\n"; + GoogleServiceAuthError error = + GaiaAuthFetcher::GenerateAuthError(data, net::OK); + EXPECT_EQ(error.state(), GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); +} + TEST_F(GaiaAuthFetcherTest, IncomprehensibleError) { std::string data = "Error=Gobbledygook\n"; GoogleServiceAuthError error = @@ -260,6 +267,13 @@ EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE); } +TEST_F(GaiaAuthFetcherTest, ServiceUnavailableShortError) { + std::string data = "Error=ire\n"; + GoogleServiceAuthError error = + GaiaAuthFetcher::GenerateAuthError(data, net::OK); + EXPECT_EQ(error.state(), GoogleServiceAuthError::SERVICE_UNAVAILABLE); +} + TEST_F(GaiaAuthFetcherTest, StartAuthCodeForOAuth2TokenExchange_Success) { MockGaiaConsumer consumer; EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(0);
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg index 56f1ce3..db38360 100644 --- a/infra/config/cr-buildbucket.cfg +++ b/infra/config/cr-buildbucket.cfg
@@ -64,6 +64,11 @@ identity: "findit-for-me@appspot.gserviceaccount.com" } acls { + # Allow Pinpoint to trigger builds for bisection. + role: SCHEDULER + group: "service-account-chromeperf" + } + acls { role: WRITER group: "service-account-chromium-tryserver" }
diff --git a/ios/chrome/browser/installation_notifier.mm b/ios/chrome/browser/installation_notifier.mm index 6c08994..9541a5a 100644 --- a/ios/chrome/browser/installation_notifier.mm +++ b/ios/chrome/browser/installation_notifier.mm
@@ -141,7 +141,6 @@ [observers removeObject:weakReferenceToObserver]; if ([observers count] == 0) { [_installedAppObservers removeObjectForKey:scheme]; - UMA_HISTOGRAM_BOOLEAN("NativeAppLauncher.InstallationDetected", NO); } } } @@ -190,7 +189,6 @@ } if (![keysToDelete containsObject:scheme]) { [keysToDelete addObject:scheme]; - UMA_HISTOGRAM_BOOLEAN("NativeAppLauncher.InstallationDetected", YES); } } else { keepPolling = YES;
diff --git a/ios/chrome/browser/installation_notifier_unittest.mm b/ios/chrome/browser/installation_notifier_unittest.mm index 23784b0..669986f 100644 --- a/ios/chrome/browser/installation_notifier_unittest.mm +++ b/ios/chrome/browser/installation_notifier_unittest.mm
@@ -9,7 +9,6 @@ #include "base/ios/block_types.h" #include "base/message_loop/message_loop.h" -#include "base/test/metrics/histogram_tester.h" #include "ios/web/public/test/test_web_thread.h" #include "net/base/backoff_entry.h" #include "testing/platform_test.h" @@ -106,7 +105,6 @@ application_ = OCMClassMock([UIApplication class]); OCMStub([application_ sharedApplication]).andReturn(application_); [installationNotifier_ setDispatcher:dispatcher_]; - histogramTester_.reset(new base::HistogramTester()); } ~InstallationNotifierTest() override { @@ -114,15 +112,6 @@ [application_ stopMocking]; } - void VerifyHistogramValidity(int expectedYes, int expectedNo) { - histogramTester_->ExpectTotalCount("NativeAppLauncher.InstallationDetected", - expectedYes + expectedNo); - histogramTester_->ExpectBucketCount( - "NativeAppLauncher.InstallationDetected", YES, expectedYes); - histogramTester_->ExpectBucketCount( - "NativeAppLauncher.InstallationDetected", NO, expectedNo); - } - void VerifyDelay(int pollingIteration) { double delayInMSec = [dispatcher_ lastDelayInNSec] / NSEC_PER_MSEC; double initialDelayInMSec = @@ -143,7 +132,6 @@ MockNotificationReceiver* notificationReceiver1_; MockNotificationReceiver* notificationReceiver2_; id application_; - std::unique_ptr<base::HistogramTester> histogramTester_; }; TEST_F(InstallationNotifierTest, RegisterWithAppAlreadyInstalled) { @@ -158,7 +146,6 @@ withSelector:@selector(receivedNotification) forScheme:@"foo-scheme"]; EXPECT_EQ(2, [notificationReceiver1_ notificationCount]); - VerifyHistogramValidity(2, 0); } TEST_F(InstallationNotifierTest, RegisterWithAppInstalledAfterSomeTime) { @@ -172,7 +159,6 @@ withSelector:@selector(receivedNotification) forScheme:@"foo-scheme"]; EXPECT_EQ(1, [notificationReceiver1_ notificationCount]); - VerifyHistogramValidity(1, 0); } TEST_F(InstallationNotifierTest, RegisterForTwoInstallations) { @@ -199,7 +185,6 @@ [installationNotifier_ dispatchInstallationNotifierBlock]; EXPECT_EQ(1, [notificationReceiver1_ notificationCount]); EXPECT_EQ(2, [notificationReceiver2_ notificationCount]); - VerifyHistogramValidity(2, 0); } TEST_F(InstallationNotifierTest, RegisterAndThenUnregister) { @@ -214,7 +199,6 @@ withSelector:@selector(receivedNotification) forScheme:@"foo-scheme"]; EXPECT_EQ(0, [notificationReceiver1_ notificationCount]); - VerifyHistogramValidity(0, 1); } TEST_F(InstallationNotifierTest, TestExponentialBackoff) { @@ -258,7 +242,6 @@ registerForInstallationNotifications:notificationReceiver1_ withSelector:@selector(receivedNotification) forScheme:@"foo-scheme"]; - VerifyHistogramValidity(0, 2); } TEST_F(InstallationNotifierTest, TestThatEmptySchemeDoesntCrashChrome) {
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h index 4b522e27..9794fd3 100644 --- a/media/base/mock_filters.h +++ b/media/base/mock_filters.h
@@ -64,8 +64,8 @@ MOCK_METHOD1(OnVideoNaturalSizeChange, void(const gfx::Size&)); MOCK_METHOD1(OnVideoOpacityChange, void(bool)); MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void()); - MOCK_METHOD1(OnAudioDecoderChange, void(const std::string&)); - MOCK_METHOD1(OnVideoDecoderChange, void(const std::string&)); + MOCK_METHOD1(OnAudioDecoderChange, void(const PipelineDecoderInfo&)); + MOCK_METHOD1(OnVideoDecoderChange, void(const PipelineDecoderInfo&)); MOCK_METHOD1(OnRemotePlayStateChange, void(MediaStatus::State state)); };
diff --git a/media/base/pipeline.h b/media/base/pipeline.h index 3b40aee7..9352574 100644 --- a/media/base/pipeline.h +++ b/media/base/pipeline.h
@@ -78,8 +78,8 @@ // Executed whenever the underlying AudioDecoder or VideoDecoder changes // during playback. - virtual void OnAudioDecoderChange(const std::string& name) = 0; - virtual void OnVideoDecoderChange(const std::string& name) = 0; + virtual void OnAudioDecoderChange(const PipelineDecoderInfo& info) = 0; + virtual void OnVideoDecoderChange(const PipelineDecoderInfo& info) = 0; }; virtual ~Pipeline() {}
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index be3b70c..5204727 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc
@@ -666,19 +666,22 @@ shared_state_.statistics.audio_memory_usage += stats.audio_memory_usage; shared_state_.statistics.video_memory_usage += stats.video_memory_usage; - if (!stats.audio_decoder_name.empty() && - shared_state_.statistics.audio_decoder_name != stats.audio_decoder_name) { - shared_state_.statistics.audio_decoder_name = stats.audio_decoder_name; + if (!stats.audio_decoder_info.decoder_name.empty() && + stats.audio_decoder_info != shared_state_.statistics.audio_decoder_info) { + shared_state_.statistics.audio_decoder_info.decoder_name = + stats.audio_decoder_info.decoder_name; main_task_runner_->PostTask( FROM_HERE, base::BindOnce(&PipelineImpl::OnAudioDecoderChange, - weak_pipeline_, stats.audio_decoder_name)); + weak_pipeline_, stats.audio_decoder_info)); } - if (!stats.video_decoder_name.empty() && - shared_state_.statistics.video_decoder_name != stats.video_decoder_name) { - shared_state_.statistics.video_decoder_name = stats.video_decoder_name; + + if (!stats.video_decoder_info.decoder_name.empty() && + stats.video_decoder_info != shared_state_.statistics.video_decoder_info) { + shared_state_.statistics.video_decoder_info.decoder_name = + stats.video_decoder_info.decoder_name; main_task_runner_->PostTask( FROM_HERE, base::BindOnce(&PipelineImpl::OnVideoDecoderChange, - weak_pipeline_, stats.video_decoder_name)); + weak_pipeline_, stats.video_decoder_info)); } if (stats.video_frame_duration_average != kNoTimestamp) { @@ -1370,22 +1373,22 @@ client_->OnVideoAverageKeyframeDistanceUpdate(); } -void PipelineImpl::OnAudioDecoderChange(const std::string& name) { +void PipelineImpl::OnAudioDecoderChange(const PipelineDecoderInfo& info) { DVLOG(2) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(IsRunning()); DCHECK(client_); - client_->OnAudioDecoderChange(name); + client_->OnAudioDecoderChange(info); } -void PipelineImpl::OnVideoDecoderChange(const std::string& name) { +void PipelineImpl::OnVideoDecoderChange(const PipelineDecoderInfo& info) { DVLOG(2) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(IsRunning()); DCHECK(client_); - client_->OnVideoDecoderChange(name); + client_->OnVideoDecoderChange(info); } void PipelineImpl::OnSeekDone(bool is_suspended) {
diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h index a9fa32d..66384b12 100644 --- a/media/base/pipeline_impl.h +++ b/media/base/pipeline_impl.h
@@ -144,8 +144,8 @@ void OnVideoNaturalSizeChange(const gfx::Size& size); void OnVideoOpacityChange(bool opaque); void OnVideoAverageKeyframeDistanceUpdate(); - void OnAudioDecoderChange(const std::string& name); - void OnVideoDecoderChange(const std::string& name); + void OnAudioDecoderChange(const PipelineDecoderInfo& info); + void OnVideoDecoderChange(const PipelineDecoderInfo& info); void OnRemotePlayStateChange(MediaStatus::State state); // Task completion callbacks from RendererWrapper.
diff --git a/media/base/pipeline_status.cc b/media/base/pipeline_status.cc index bd64b4e..ea7c663 100644 --- a/media/base/pipeline_status.cc +++ b/media/base/pipeline_status.cc
@@ -25,8 +25,8 @@ second.video_keyframe_distance_average && first.video_frame_duration_average == second.video_frame_duration_average && - first.audio_decoder_name == second.audio_decoder_name && - first.video_decoder_name == second.video_decoder_name; + first.video_decoder_info == second.video_decoder_info && + first.audio_decoder_info == second.audio_decoder_info; } bool operator!=(const PipelineStatistics& first, @@ -34,4 +34,17 @@ return !(first == second); } +bool operator==(const PipelineDecoderInfo& first, + const PipelineDecoderInfo& second) { + return first.decoder_name == second.decoder_name && + first.is_platform_decoder == second.is_platform_decoder && + first.is_decrypting_demuxer_stream == + second.is_decrypting_demuxer_stream; +} + +bool operator!=(const PipelineDecoderInfo& first, + const PipelineDecoderInfo& second) { + return !(first == second); +} + } // namespace media
diff --git a/media/base/pipeline_status.h b/media/base/pipeline_status.h index 11cc0e8c..d6eb5aa 100644 --- a/media/base/pipeline_status.h +++ b/media/base/pipeline_status.h
@@ -60,6 +60,17 @@ typedef base::Callback<void(PipelineStatus)> PipelineStatusCB; +struct PipelineDecoderInfo { + bool is_platform_decoder = false; + bool is_decrypting_demuxer_stream = false; + std::string decoder_name; +}; + +MEDIA_EXPORT bool operator==(const PipelineDecoderInfo& first, + const PipelineDecoderInfo& second); +MEDIA_EXPORT bool operator!=(const PipelineDecoderInfo& first, + const PipelineDecoderInfo& second); + struct MEDIA_EXPORT PipelineStatistics { PipelineStatistics(); PipelineStatistics(const PipelineStatistics& other); @@ -79,11 +90,10 @@ // NOTE: frame duration should reflect changes to playback rate. base::TimeDelta video_frame_duration_average = kNoTimestamp; - // Name of the audio or video decoder (if present). Note: Keep these fields at - // the end of the structure, if you move them you need to also update the test - // ProtoUtilsTest::PipelineStatisticsConversion. - std::string video_decoder_name; - std::string audio_decoder_name; + // Note: Keep these fields at the end of the structure, if you move them you + // need to also update the test ProtoUtilsTest::PipelineStatisticsConversion. + PipelineDecoderInfo audio_decoder_info; + PipelineDecoderInfo video_decoder_info; // NOTE: always update operator== implementation in pipeline_status.cc when // adding a field to this struct. Leave this comment at the end.
diff --git a/media/base/win/d3d11_mocks.cc b/media/base/win/d3d11_mocks.cc index bfaf6e5..4dddc97 100644 --- a/media/base/win/d3d11_mocks.cc +++ b/media/base/win/d3d11_mocks.cc
@@ -18,9 +18,15 @@ D3D11DeviceMock::D3D11DeviceMock() = default; D3D11DeviceMock::~D3D11DeviceMock() = default; +DXGIDeviceMock::DXGIDeviceMock() = default; +DXGIDeviceMock::~DXGIDeviceMock() = default; + DXGIDevice2Mock::DXGIDevice2Mock() = default; DXGIDevice2Mock::~DXGIDevice2Mock() = default; +DXGIAdapterMock::DXGIAdapterMock() = default; +DXGIAdapterMock::~DXGIAdapterMock() = default; + DXGIAdapter3Mock::DXGIAdapter3Mock() = default; DXGIAdapter3Mock::~DXGIAdapter3Mock() = default;
diff --git a/media/base/win/d3d11_mocks.h b/media/base/win/d3d11_mocks.h index 554daac..58b47d44 100644 --- a/media/base/win/d3d11_mocks.h +++ b/media/base/win/d3d11_mocks.h
@@ -297,6 +297,29 @@ MOCK_STDCALL_METHOD0(GetExceptionMode, UINT()); }; +class DXGIDeviceMock : public MockCOMInterface<IDXGIDevice> { + public: + DXGIDeviceMock(); + ~DXGIDeviceMock() override; + + MOCK_STDCALL_METHOD5(CreateSurface, + HRESULT(const DXGI_SURFACE_DESC*, + UINT, + DXGI_USAGE, + const DXGI_SHARED_RESOURCE*, + IDXGISurface**)); + MOCK_STDCALL_METHOD1(GetAdapter, HRESULT(IDXGIAdapter**)); + MOCK_STDCALL_METHOD1(GetGPUThreadPriority, HRESULT(INT*)); + MOCK_STDCALL_METHOD3(QueryResourceResidency, + HRESULT(IUnknown* const*, DXGI_RESIDENCY*, UINT)); + MOCK_STDCALL_METHOD1(SetGPUThreadPriority, HRESULT(INT)); + MOCK_STDCALL_METHOD3(SetPrivateData, HRESULT(REFGUID, UINT, const void*)); + MOCK_STDCALL_METHOD2(SetPrivateDataInterface, + HRESULT(REFGUID, const IUnknown*)); + MOCK_STDCALL_METHOD2(GetParent, HRESULT(REFIID, void**)); + MOCK_STDCALL_METHOD3(GetPrivateData, HRESULT(REFGUID, UINT*, void*)); +}; + class DXGIDevice2Mock : public MockCOMInterface<IDXGIDevice2> { public: DXGIDevice2Mock(); @@ -362,6 +385,37 @@ HRESULT(REFGUID, const IUnknown*)); }; +class DXGIAdapterMock : public MockCOMInterface<IDXGIAdapter> { + public: + DXGIAdapterMock(); + ~DXGIAdapterMock() override; + + MOCK_STDCALL_METHOD3(QueryVideoMemoryInfo, + HRESULT(UINT, + DXGI_MEMORY_SEGMENT_GROUP, + DXGI_QUERY_VIDEO_MEMORY_INFO*)); + MOCK_STDCALL_METHOD2(RegisterHardwareContentProtectionTeardownStatusEvent, + HRESULT(HANDLE, DWORD*)); + MOCK_STDCALL_METHOD2(RegisterVideoMemoryBudgetChangeNotificationEvent, + HRESULT(HANDLE, DWORD*)); + MOCK_STDCALL_METHOD3(SetVideoMemoryReservation, + HRESULT(UINT, DXGI_MEMORY_SEGMENT_GROUP, UINT64)); + MOCK_STDCALL_METHOD1(UnregisterHardwareContentProtectionTeardownStatus, + void(DWORD)); + MOCK_STDCALL_METHOD1(UnregisterVideoMemoryBudgetChangeNotification, + void(DWORD)); + MOCK_STDCALL_METHOD1(GetDesc2, HRESULT(DXGI_ADAPTER_DESC2*)); + MOCK_STDCALL_METHOD1(GetDesc1, HRESULT(DXGI_ADAPTER_DESC1*)); + MOCK_STDCALL_METHOD2(CheckInterfaceSupport, HRESULT(REFGUID, LARGE_INTEGER*)); + MOCK_STDCALL_METHOD2(EnumOutputs, HRESULT(UINT, IDXGIOutput**)); + MOCK_STDCALL_METHOD1(GetDesc, HRESULT(DXGI_ADAPTER_DESC*)); + MOCK_STDCALL_METHOD2(GetParent, HRESULT(REFIID, void**)); + MOCK_STDCALL_METHOD3(GetPrivateData, HRESULT(REFGUID, UINT*, void*)); + MOCK_STDCALL_METHOD3(SetPrivateData, HRESULT(REFGUID, UINT, const void*)); + MOCK_STDCALL_METHOD2(SetPrivateDataInterface, + HRESULT(REFGUID, const IUnknown*)); +}; + // TODO(crbug.com/788880): This may not be necessary. Tyr out and see if // D3D11VideoDevice1Mock is sufficient. and if so, remove this. class D3D11VideoDeviceMock : public MockCOMInterface<ID3D11VideoDevice> {
diff --git a/media/blink/watch_time_reporter_unittest.cc b/media/blink/watch_time_reporter_unittest.cc index d7173d2..5a1564f 100644 --- a/media/blink/watch_time_reporter_unittest.cc +++ b/media/blink/watch_time_reporter_unittest.cc
@@ -248,6 +248,12 @@ void SetContainerName( container_names::MediaContainerName container_name) override {} void AddBytesReceived(uint64_t bytes_received) override {} + void SetHasPlayed() override {} + void SetHaveEnough() override {} + void SetHasAudio(AudioCodec audio_codec) override {} + void SetHasVideo(VideoCodec video_codec) override {} + void SetVideoPipelineInfo(const PipelineDecoderInfo& info) override {} + void SetAudioPipelineInfo(const PipelineDecoderInfo& info) override {} private: WatchTimeReporterTest* parent_;
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index 0655c33..ebf2436 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -770,6 +770,7 @@ if (video_decode_stats_reporter_) video_decode_stats_reporter_->OnPlaying(); + media_metrics_provider_->SetHasPlayed(); media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PLAY)); MaybeUpdateBufferSizesForPlayback(); @@ -1808,11 +1809,13 @@ VIDEO_ROTATION_MAX + 1); if (HasAudio()) { + media_metrics_provider_->SetHasAudio(metadata.audio_decoder_config.codec()); RecordEncryptionScheme("Audio", metadata.audio_decoder_config.encryption_scheme()); } if (HasVideo()) { + media_metrics_provider_->SetHasVideo(metadata.video_decoder_config.codec()); RecordEncryptionScheme("Video", metadata.video_decoder_config.encryption_scheme()); @@ -2010,6 +2013,9 @@ log_event->params.SetBoolean("for_suspended_start", for_suspended_start); media_log_->AddEvent(std::move(log_event)); + if (state == BUFFERING_HAVE_ENOUGH && !for_suspended_start) + media_metrics_provider_->SetHaveEnough(); + if (state == BUFFERING_HAVE_ENOUGH) { TRACE_EVENT1("media", "WebMediaPlayerImpl::BufferingHaveEnough", "id", media_log_->id()); @@ -2237,11 +2243,12 @@ UpdateBackgroundVideoOptimizationState(); } -void WebMediaPlayerImpl::OnAudioDecoderChange(const std::string& name) { - if (name == audio_decoder_name_) +void WebMediaPlayerImpl::OnAudioDecoderChange(const PipelineDecoderInfo& info) { + media_metrics_provider_->SetAudioPipelineInfo(info); + if (info.decoder_name == audio_decoder_name_) return; - audio_decoder_name_ = name; + audio_decoder_name_ = info.decoder_name; // If there's no current reporter, there's nothing to be done. if (!watch_time_reporter_) @@ -2250,11 +2257,12 @@ UpdateSecondaryProperties(); } -void WebMediaPlayerImpl::OnVideoDecoderChange(const std::string& name) { - if (name == video_decoder_name_) +void WebMediaPlayerImpl::OnVideoDecoderChange(const PipelineDecoderInfo& info) { + media_metrics_provider_->SetVideoPipelineInfo(info); + if (info.decoder_name == video_decoder_name_) return; - video_decoder_name_ = name; + video_decoder_name_ = info.decoder_name; // If there's no current reporter, there's nothing to be done. if (!watch_time_reporter_)
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h index 276ca9f..1408b6d 100644 --- a/media/blink/webmediaplayer_impl.h +++ b/media/blink/webmediaplayer_impl.h
@@ -346,8 +346,8 @@ void OnVideoNaturalSizeChange(const gfx::Size& size) override; void OnVideoOpacityChange(bool opaque) override; void OnVideoAverageKeyframeDistanceUpdate() override; - void OnAudioDecoderChange(const std::string& name) override; - void OnVideoDecoderChange(const std::string& name) override; + void OnAudioDecoderChange(const PipelineDecoderInfo& info) override; + void OnVideoDecoderChange(const PipelineDecoderInfo& info) override; // Actually seek. Avoids causing |should_notify_time_changed_| to be set when // |time_updated| is false.
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 32ac014..22db4908 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -339,7 +339,9 @@ mojom::MediaMetricsProviderPtr provider; MediaMetricsProvider::Create( - false, base::BindRepeating([]() { return ukm::kInvalidSourceId; }), + MediaMetricsProvider::BrowsingMode::kNormal, + MediaMetricsProvider::FrameStatus::kNotTopFrame, + base::BindRepeating([]() { return ukm::kInvalidSourceId; }), base::BindRepeating([]() { return learning::FeatureValue(0); }), VideoDecodePerfHistory::SaveCallback(), mojo::MakeRequest(&provider));
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc index 0b84a019..c2cf3da8 100644 --- a/media/filters/decoder_stream.cc +++ b/media/filters/decoder_stream.cc
@@ -384,7 +384,10 @@ } // Send logs and statistics updates including the decoder name. + traits_->SetIsPlatformDecoder(decoder_->IsPlatformDecoder()); + traits_->SetIsDecryptingDemuxerStream(!!decrypting_demuxer_stream_); traits_->ReportStatistics(statistics_cb_, 0); + media_log_->SetBooleanProperty(GetStreamTypeString() + "_dds", !!decrypting_demuxer_stream_); media_log_->SetStringProperty(GetStreamTypeString() + "_decoder",
diff --git a/media/filters/decoder_stream_traits.cc b/media/filters/decoder_stream_traits.cc index 69886c7..e917f92 100644 --- a/media/filters/decoder_stream_traits.cc +++ b/media/filters/decoder_stream_traits.cc
@@ -35,6 +35,16 @@ return OutputType::CreateEOSBuffer(); } +void DecoderStreamTraits<DemuxerStream::AUDIO>::SetIsPlatformDecoder( + bool is_platform_decoder) { + stats_.audio_decoder_info.is_platform_decoder = is_platform_decoder; +} + +void DecoderStreamTraits<DemuxerStream::AUDIO>::SetIsDecryptingDemuxerStream( + bool is_dds) { + stats_.audio_decoder_info.is_decrypting_demuxer_stream = is_dds; +} + DecoderStreamTraits<DemuxerStream::AUDIO>::DecoderStreamTraits( MediaLog* media_log, ChannelLayout initial_hw_layout) @@ -70,7 +80,7 @@ OnConfigChanged(config); config_ = config; - stats_.audio_decoder_name = decoder->GetDisplayName(); + stats_.audio_decoder_info.decoder_name = decoder->GetDisplayName(); decoder->Initialize(config, cdm_context, std::move(init_cb), output_cb, waiting_cb); } @@ -121,6 +131,16 @@ return OutputType::CreateEOSFrame(); } +void DecoderStreamTraits<DemuxerStream::VIDEO>::SetIsPlatformDecoder( + bool is_platform_decoder) { + stats_.video_decoder_info.is_platform_decoder = is_platform_decoder; +} + +void DecoderStreamTraits<DemuxerStream::VIDEO>::SetIsDecryptingDemuxerStream( + bool is_dds) { + stats_.video_decoder_info.is_decrypting_demuxer_stream = is_dds; +} + DecoderStreamTraits<DemuxerStream::VIDEO>::DecoderStreamTraits( MediaLog* media_log) // Randomly selected number of samples to keep. @@ -158,8 +178,8 @@ const OutputCB& output_cb, const WaitingCB& waiting_cb) { DCHECK(config.IsValidConfig()); - stats_.video_decoder_name = decoder->GetDisplayName(); - DVLOG(2) << stats_.video_decoder_name; + stats_.video_decoder_info.decoder_name = decoder->GetDisplayName(); + DVLOG(2) << stats_.video_decoder_info.decoder_name; decoder->Initialize(config, low_delay, cdm_context, std::move(init_cb), output_cb, waiting_cb); }
diff --git a/media/filters/decoder_stream_traits.h b/media/filters/decoder_stream_traits.h index 4c54717..aef034b6 100644 --- a/media/filters/decoder_stream_traits.h +++ b/media/filters/decoder_stream_traits.h
@@ -1,10 +1,13 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_FILTERS_DECODER_STREAM_TRAITS_H_ #define MEDIA_FILTERS_DECODER_STREAM_TRAITS_H_ +#include <memory> +#include <string> + #include "base/containers/flat_map.h" #include "base/time/time.h" #include "media/base/audio_decoder.h" @@ -46,6 +49,8 @@ DecoderStreamTraits(MediaLog* media_log, ChannelLayout initial_hw_layout); void ReportStatistics(const StatisticsCB& statistics_cb, int bytes_decoded); + void SetIsPlatformDecoder(bool is_platform_decoder); + void SetIsDecryptingDemuxerStream(bool is_dds); void InitializeDecoder(DecoderType* decoder, const DecoderConfigType& config, bool low_delay, @@ -90,6 +95,8 @@ DecoderConfigType GetDecoderConfig(DemuxerStream* stream); void ReportStatistics(const StatisticsCB& statistics_cb, int bytes_decoded); + void SetIsPlatformDecoder(bool is_platform_decoder); + void SetIsDecryptingDemuxerStream(bool is_dds); void InitializeDecoder(DecoderType* decoder, const DecoderConfigType& config, bool low_delay,
diff --git a/media/filters/pipeline_controller_unittest.cc b/media/filters/pipeline_controller_unittest.cc index 0aab5b98..85e8223 100644 --- a/media/filters/pipeline_controller_unittest.cc +++ b/media/filters/pipeline_controller_unittest.cc
@@ -154,8 +154,8 @@ void OnVideoConfigChange(const VideoDecoderConfig& config) override {} void OnVideoOpacityChange(bool opaque) override {} void OnVideoAverageKeyframeDistanceUpdate() override {} - void OnAudioDecoderChange(const std::string& name) override {} - void OnVideoDecoderChange(const std::string& name) override {} + void OnAudioDecoderChange(const PipelineDecoderInfo& info) override {} + void OnVideoDecoderChange(const PipelineDecoderInfo& info) override {} base::test::ScopedTaskEnvironment scoped_task_environment_;
diff --git a/media/gpu/chromeos/chromeos_video_decoder_factory.cc b/media/gpu/chromeos/chromeos_video_decoder_factory.cc index 80c0318..8497e37 100644 --- a/media/gpu/chromeos/chromeos_video_decoder_factory.cc +++ b/media/gpu/chromeos/chromeos_video_decoder_factory.cc
@@ -11,7 +11,6 @@ #include "media/gpu/buildflags.h" #include "media/gpu/linux/mailbox_video_frame_converter.h" #include "media/gpu/linux/platform_video_frame_pool.h" -#include "media/gpu/linux/video_decoder_pipeline.h" #if BUILDFLAG(USE_VAAPI) #include "media/gpu/vaapi/vaapi_video_decoder.h" @@ -21,6 +20,10 @@ #include "media/gpu/v4l2/v4l2_slice_video_decoder.h" #endif +#if BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC) +#include "media/gpu/linux/video_decoder_pipeline.h" +#endif + namespace media { // static @@ -65,12 +68,13 @@ V4L2SliceVideoDecoder::Create(client_task_runner, std::move(frame_pool)); #endif - if (!decoder) - return nullptr; - +#if BUILDFLAG(USE_VAAPI) || BUILDFLAG(USE_V4L2_CODEC) return std::make_unique<VideoDecoderPipeline>(std::move(client_task_runner), std::move(decoder), std::move(frame_converter)); +#else + return nullptr; +#endif } } // namespace media
diff --git a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc index 47188be..bc3c86d 100644 --- a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
@@ -160,7 +160,7 @@ vaapi_wrapper_->DestroyContext(); va_format_ = 0; input_size_ = gfx::Size(); - const bool success = vaapi_wrapper_->CreateContext(va_format, input_size); + const bool success = vaapi_wrapper_->CreateContext(input_size); if (!success) { VLOGF(1) << "Failed to create context"; vaapi_wrapper_->DestroyContext();
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc index d328fd3..c4831ed 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
@@ -680,7 +680,7 @@ if (buffer_allocation_mode_ == BufferAllocationMode::kNone) { DCHECK(!va_surface_ids.empty()); RETURN_AND_NOTIFY_ON_FAILURE( - vaapi_wrapper_->CreateContext(va_surface_format_, requested_pic_size_), + vaapi_wrapper_->CreateContext(requested_pic_size_), "Failed creating VA Context", PLATFORM_FAILURE, ); DCHECK_EQ(va_surface_ids.size(), buffers.size()); } else {
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc index 8dc6f4bf..8392596 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -72,7 +72,7 @@ MOCK_METHOD4( CreateContextAndSurfaces, bool(unsigned int, const gfx::Size&, size_t, std::vector<VASurfaceID>*)); - MOCK_METHOD2(CreateContext, bool(unsigned int, const gfx::Size&)); + MOCK_METHOD1(CreateContext, bool(const gfx::Size&)); MOCK_METHOD1(DestroyContextAndSurfaces, void(std::vector<VASurfaceID>)); private: @@ -280,7 +280,7 @@ // |decode_using_client_picture_buffers| determines the concrete method for // creation of context, surfaces and VaapiPictures. if (GetParam().decode_using_client_picture_buffers) { - EXPECT_CALL(*mock_vaapi_wrapper_, CreateContext(_, picture_size)) + EXPECT_CALL(*mock_vaapi_wrapper_, CreateContext(picture_size)) .WillOnce(Return(true)); EXPECT_CALL( *mock_vaapi_picture_factory_,
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc index 1078648..208f085c 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.cc +++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -532,8 +532,7 @@ // All pending decode operations will be completed before triggering a // resolution change, so we can safely destroy the context here. vaapi_wrapper_->DestroyContext(); - vaapi_wrapper_->CreateContext(GetVaFormatForVideoCodecProfile(profile_), - pic_size); + vaapi_wrapper_->CreateContext(pic_size); // Retry the current decode task. decoder_thread_task_runner_->PostTask(
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc index 5e21cb2..80ba10a 100644 --- a/media/gpu/vaapi/vaapi_wrapper.cc +++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -1296,7 +1296,7 @@ if (!CreateSurfaces(va_format, size, num_surfaces, va_surfaces)) return false; - const bool success = CreateContext(va_format, size); + const bool success = CreateContext(size); if (!success) DestroyContextAndSurfaces(*va_surfaces); return success; @@ -1316,7 +1316,7 @@ if (!scoped_va_surface) return nullptr; - if (CreateContext(va_format, size)) + if (CreateContext(size)) return scoped_va_surface; DestroyContext(); @@ -1329,8 +1329,7 @@ DestroySurfaces(va_surfaces); } -bool VaapiWrapper::CreateContext(unsigned int va_format, - const gfx::Size& size) { +bool VaapiWrapper::CreateContext(const gfx::Size& size) { base::AutoLock auto_lock(*va_lock_); // vaCreateContext() doesn't really need an array of VASurfaceIDs (see
diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h index 8253cfa6..82950b26 100644 --- a/media/gpu/vaapi/vaapi_wrapper.h +++ b/media/gpu/vaapi/vaapi_wrapper.h
@@ -151,8 +151,8 @@ static uint32_t BufferFormatToVARTFormat(gfx::BufferFormat fmt); // Creates |num_surfaces| VASurfaceIDs of |va_format| and |size| and, if - // successful, creates a |va_context_id_| of the same format and size. Returns - // true if successful, with the created IDs in |va_surfaces|. The client is + // successful, creates a |va_context_id_| of the same size. Returns true if + // successful, with the created IDs in |va_surfaces|. The client is // responsible for destroying |va_surfaces| via DestroyContextAndSurfaces() to // free the allocated surfaces. virtual bool CreateContextAndSurfaces(unsigned int va_format, @@ -160,10 +160,10 @@ size_t num_surfaces, std::vector<VASurfaceID>* va_surfaces); - // Creates a single VASurfaceID of |va_format| and |size| and, if - // successful, creates a |va_context_id_| of the same format and size. Returns - // a ScopedVASurface containing the created VASurfaceID, the |va_format|, and - // |size|, or nullptr if creation failed. + // Creates a single VASurfaceID of |va_format| and |size| and, if successful, + // creates a |va_context_id_| of the same size. Returns a ScopedVASurface + // containing the created VASurfaceID, the |va_format|, and |size|, or nullptr + // if creation failed. std::unique_ptr<ScopedVASurface> CreateContextAndScopedVASurface( unsigned int va_format, const gfx::Size& size); @@ -171,12 +171,11 @@ // Releases the |va_surfaces| and destroys |va_context_id_|. virtual void DestroyContextAndSurfaces(std::vector<VASurfaceID> va_surfaces); - // Creates a VA Context of |va_format| and |size|, and sets |va_context_id_|. - // The client is responsible for releasing it via DestroyContext() or + // Creates a VA Context of |size| and sets |va_context_id_|. The client is + // responsible for releasing it via DestroyContext() or // DestroyContextAndSurfaces(), or it will be released on dtor. - // TODO(crbug.com/981080): |va_format| is not used within the function - // definition and should be removed. - virtual bool CreateContext(unsigned int va_format, const gfx::Size& size); + virtual bool CreateContext(const gfx::Size& size); + // Destroys the context identified by |va_context_id_|. void DestroyContext();
diff --git a/media/gpu/windows/d3d11_cdm_proxy_unittest.cc b/media/gpu/windows/d3d11_cdm_proxy_unittest.cc index 781a72c..374f9a9 100644 --- a/media/gpu/windows/d3d11_cdm_proxy_unittest.cc +++ b/media/gpu/windows/d3d11_cdm_proxy_unittest.cc
@@ -139,6 +139,11 @@ base::Unretained(&create_device_mock_))); } + void TearDown() override { + proxy_.reset(); + base::PowerMonitor::ShutdownForTesting(); + } + // Sets up ON_CALLs for the mock objects. These can be overriden with // EXPECT_CALLs. // |content_protection_caps_| should be set.
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc index a14c0e1..c94bc88 100644 --- a/media/gpu/windows/d3d11_video_decoder.cc +++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -25,6 +25,7 @@ #include "media/gpu/windows/d3d11_picture_buffer.h" #include "media/gpu/windows/d3d11_video_context_wrapper.h" #include "media/gpu/windows/d3d11_video_decoder_impl.h" +#include "media/gpu/windows/supported_profile_helpers.h" #include "ui/gl/gl_angle_util_win.h" #include "ui/gl/gl_switches.h" @@ -752,40 +753,74 @@ base::FeatureList::IsEnabled(kHardwareSecureDecryption); std::vector<SupportedVideoDecoderConfig> configs; - - // Now check specific configs. - // For now, just return something that matches everything, since that's - // effectively what the workaround in mojo_video_decoder does. Eventually, we - // should check resolutions and guids from the device we just created for both - // portrait and landscape orientations. + // VP9 has no default resolutions since it may not even be supported. + ResolutionPair max_h264_resolutions(gfx::Size(1920, 1088), gfx::Size()); + ResolutionPair max_vp9_profile0_resolutions; + ResolutionPair max_vp9_profile2_resolutions; const gfx::Size min_resolution(64, 64); - const gfx::Size max_resolution(8192, 8192); // Profile or landscape 8k - // Push H264 configs, except HIGH10. - configs.push_back(SupportedVideoDecoderConfig( - H264PROFILE_MIN, // profile_min - static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE - - 1), // profile_max - min_resolution, // coded_size_min - max_resolution, // coded_size_max - allow_encrypted, // allow_encrypted - false)); // require_encrypted - configs.push_back(SupportedVideoDecoderConfig( - static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE + - 1), // profile_min - H264PROFILE_MAX, // profile_max - min_resolution, // coded_size_min - max_resolution, // coded_size_max - allow_encrypted, // allow_encrypted - false)); // require_encrypted + GetResolutionsForDecoders( + {D3D11_DECODER_PROFILE_H264_VLD_NOFGT}, d3d11_device, gpu_workarounds, + &max_h264_resolutions, &max_vp9_profile0_resolutions, + &max_vp9_profile2_resolutions); - configs.push_back( - SupportedVideoDecoderConfig(VP9PROFILE_PROFILE0, // profile_min - VP9PROFILE_PROFILE0, // profile_max - min_resolution, // coded_size_min - max_resolution, // coded_size_max - allow_encrypted, // allow_encrypted - false)); // require_encrypted + if (max_h264_resolutions.first.width() > 0) { + // Push H264 configs, except HIGH10. + // landscape + configs.push_back(SupportedVideoDecoderConfig( + H264PROFILE_MIN, // profile_min + static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE - + 1), // profile_max + min_resolution, // coded_size_min + max_h264_resolutions.first, // coded_size_max + allow_encrypted, // allow_encrypted + false)); // require_encrypted + configs.push_back(SupportedVideoDecoderConfig( + static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE + + 1), // profile_min + H264PROFILE_MAX, // profile_max + min_resolution, // coded_size_min + max_h264_resolutions.first, // coded_size_max + allow_encrypted, // allow_encrypted + false)); // require_encrypted + + // portrait + configs.push_back(SupportedVideoDecoderConfig( + H264PROFILE_MIN, // profile_min + static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE - + 1), // profile_max + min_resolution, // coded_size_min + max_h264_resolutions.second, // coded_size_max + allow_encrypted, // allow_encrypted + false)); // require_encrypted + configs.push_back(SupportedVideoDecoderConfig( + static_cast<VideoCodecProfile>(H264PROFILE_HIGH10PROFILE + + 1), // profile_min + H264PROFILE_MAX, // profile_max + min_resolution, // coded_size_min + max_h264_resolutions.second, // coded_size_max + allow_encrypted, // allow_encrypted + false)); // require_encrypted + } + + if (max_vp9_profile0_resolutions.first.width()) { + // landscape + configs.push_back(SupportedVideoDecoderConfig( + VP9PROFILE_PROFILE0, // profile_min + VP9PROFILE_PROFILE0, // profile_max + min_resolution, // coded_size_min + max_vp9_profile0_resolutions.first, // coded_size_max + allow_encrypted, // allow_encrypted + false)); // require_encrypted + // portrait + configs.push_back(SupportedVideoDecoderConfig( + VP9PROFILE_PROFILE0, // profile_min + VP9PROFILE_PROFILE0, // profile_max + min_resolution, // coded_size_min + max_vp9_profile0_resolutions.second, // coded_size_max + allow_encrypted, // allow_encrypted + false)); // require_encrypted + } // TODO(liberato): Should we separate out h264, vp9, and encrypted? UMA_HISTOGRAM_ENUMERATION(uma_name, NotSupportedReason::kVideoIsSupported);
diff --git a/media/gpu/windows/d3d11_video_decoder_unittest.cc b/media/gpu/windows/d3d11_video_decoder_unittest.cc index ba940fe..8803fda7 100644 --- a/media/gpu/windows/d3d11_video_decoder_unittest.cc +++ b/media/gpu/windows/d3d11_video_decoder_unittest.cc
@@ -17,6 +17,7 @@ #include "base/test/scoped_task_environment.h" #include "base/threading/thread_task_runner_handle.h" #include "base/win/scoped_com_initializer.h" +#include "base/win/windows_version.h" #include "media/base/decoder_buffer.h" #include "media/base/media_log.h" #include "media/base/media_switches.h" @@ -53,6 +54,16 @@ class D3D11VideoDecoderTest : public ::testing::Test { public: + enum InitExpectation { + kExpectFailure = false, + kExpectSuccess = true, + }; + + const std::pair<uint16_t, uint16_t> LegacyIntelGPU = {0x8086, 0x102}; + const std::pair<uint16_t, uint16_t> RecentIntelGPU = {0x8086, 0x100}; + const std::pair<uint16_t, uint16_t> LegacyAMDGPU = {0x1022, 0x130f}; + const std::pair<uint16_t, uint16_t> RecentAMDGPU = {0x1022, 0x130e}; + void SetUp() override { // Set up some sane defaults. gpu_preferences_.enable_zero_copy_dxgi_video = true; @@ -61,7 +72,7 @@ // Create a mock D3D11 device that supports 11.0. Note that if you change // this, then you probably also want VideoDevice1 and friends, below. - mock_d3d11_device_ = CreateD3D11Mock<D3D11DeviceMock>(); + mock_d3d11_device_ = CreateD3D11Mock<NiceMock<D3D11DeviceMock>>(); ON_CALL(*mock_d3d11_device_.Get(), GetFeatureLevel) .WillByDefault(Return(D3D_FEATURE_LEVEL_11_0)); @@ -72,10 +83,11 @@ // Set up an D3D11VideoDevice rather than ...Device1, since Initialize uses // Device for checking decoder GUIDs. // TODO(liberato): Try to use Device1 more often. - mock_d3d11_video_device_ = CreateD3D11Mock<D3D11VideoDeviceMock>(); + mock_d3d11_video_device_ = + CreateD3D11Mock<NiceMock<D3D11VideoDeviceMock>>(); ON_CALL(*mock_d3d11_device_.Get(), QueryInterface(IID_ID3D11VideoDevice, _)) - .WillByDefault(DoAll(SetComPointee<1>(mock_d3d11_video_device_.Get()), - Return(S_OK))); + .WillByDefault( + SetComPointeeAndReturnOk<1>(mock_d3d11_video_device_.Get())); EnableDecoder(D3D11_DECODER_PROFILE_H264_VLD_NOFGT); @@ -89,6 +101,29 @@ QueryInterface(IID_ID3D11VideoContext, _)) .WillByDefault( SetComPointeeAndReturnOk<1>(mock_d3d11_video_context_.Get())); + + SetUpAdapters(); + } + + void SetGPUProfile(std::pair<uint16_t, uint16_t> vendor_and_gpu) { + mock_adapter_desc_.DeviceId = static_cast<UINT>(vendor_and_gpu.second); + mock_adapter_desc_.VendorId = static_cast<UINT>(vendor_and_gpu.first); + + ON_CALL(*mock_dxgi_adapter_.Get(), GetDesc(_)) + .WillByDefault( + DoAll(SetArgPointee<0>(mock_adapter_desc_), Return(S_OK))); + } + + void SetUpAdapters() { + mock_dxgi_device_ = CreateD3D11Mock<NiceMock<DXGIDeviceMock>>(); + ON_CALL(*mock_d3d11_device_.Get(), QueryInterface(IID_IDXGIDevice, _)) + .WillByDefault(SetComPointeeAndReturnOk<1>(mock_dxgi_device_.Get())); + + mock_dxgi_adapter_ = CreateD3D11Mock<NiceMock<DXGIAdapterMock>>(); + ON_CALL(*mock_dxgi_device_.Get(), GetAdapter(_)) + .WillByDefault(SetComPointeeAndReturnOk<0>(mock_dxgi_adapter_.Get())); + + SetGPUProfile(RecentIntelGPU); } // Enable a decoder for the given GUID. Only one decoder may be enabled at a @@ -174,11 +209,6 @@ get_device_cb, *supported_configs)); } - enum InitExpectation { - kExpectFailure = false, - kExpectSuccess = true, - }; - void InitializeDecoder(const VideoDecoderConfig& config, InitExpectation expectation) { const bool low_delay = false; @@ -214,6 +244,10 @@ Microsoft::WRL::ComPtr<D3D11VideoDeviceMock> mock_d3d11_video_device_; Microsoft::WRL::ComPtr<D3D11VideoDecoderMock> mock_d3d11_video_decoder_; Microsoft::WRL::ComPtr<D3D11VideoContextMock> mock_d3d11_video_context_; + Microsoft::WRL::ComPtr<DXGIDeviceMock> mock_dxgi_device_; + Microsoft::WRL::ComPtr<DXGIAdapterMock> mock_dxgi_adapter_; + + DXGI_ADAPTER_DESC mock_adapter_desc_; base::Optional<base::test::ScopedFeatureList> scoped_feature_list_; base::win::ScopedCOMInitializer com_initializer_; @@ -225,7 +259,32 @@ EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0); CreateDecoder(); - InitializeDecoder(configuration, kExpectSuccess); + // We don't support vp9 on windows 7 and below. + if (base::win::GetVersion() <= base::win::Version::WIN7) { + InitializeDecoder(configuration, kExpectFailure); + } else { + InitializeDecoder(configuration, kExpectSuccess); + } +} + +TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithLegacyGPU) { + SetGPUProfile(LegacyIntelGPU); + VideoDecoderConfig configuration = + TestVideoConfig::NormalCodecProfile(kCodecVP9, VP9PROFILE_PROFILE0); + + EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0); + CreateDecoder(); + InitializeDecoder(configuration, kExpectFailure); +} + +TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithGPUWorkaroundDisableVPX) { + gpu_workarounds_.disable_accelerated_vpx_decode = true; + VideoDecoderConfig configuration = + TestVideoConfig::NormalCodecProfile(kCodecVP9, VP9PROFILE_PROFILE0); + + EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0); + CreateDecoder(); + InitializeDecoder(configuration, kExpectFailure); } TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithoutDecoderEnabled) {
diff --git a/media/gpu/windows/supported_profile_helpers.h b/media/gpu/windows/supported_profile_helpers.h index 62d77480..ae2a6a8 100644 --- a/media/gpu/windows/supported_profile_helpers.h +++ b/media/gpu/windows/supported_profile_helpers.h
@@ -15,6 +15,8 @@ #include "media/gpu/windows/d3d11_com_defs.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rect.h" + namespace media { using ResolutionPair = std::pair<gfx::Size, gfx::Size>;
diff --git a/media/mojo/interfaces/media_metrics_provider.mojom b/media/mojo/interfaces/media_metrics_provider.mojom index c08f817..9fccba4 100644 --- a/media/mojo/interfaces/media_metrics_provider.mojom +++ b/media/mojo/interfaces/media_metrics_provider.mojom
@@ -42,6 +42,8 @@ OnError(PipelineStatus status); // Setters for various one-time lazily generated metrics or properties. + SetHasPlayed(); + SetHaveEnough(); SetIsAdMedia(); SetIsEME(); SetTimeToMetadata(mojo_base.mojom.TimeDelta elapsed); @@ -61,4 +63,10 @@ // Reports that bytes have been received by the media player. AddBytesReceived(uint64 bytes_received); + + // Can be called multiple times to set properties about a playback. + SetHasAudio(AudioCodec codec); + SetHasVideo(VideoCodec codec); + SetVideoPipelineInfo(PipelineDecoderInfo info); + SetAudioPipelineInfo(PipelineDecoderInfo info); };
diff --git a/media/mojo/interfaces/media_types.mojom b/media/mojo/interfaces/media_types.mojom index 4ce1268..207bcb0f 100644 --- a/media/mojo/interfaces/media_types.mojom +++ b/media/mojo/interfaces/media_types.mojom
@@ -340,3 +340,9 @@ uint32 frames_power_efficient = 0; }; +// See media/base/pipeline/status.h for descriptions. +struct PipelineDecoderInfo { + string decoder_name; + bool is_platform_decoder = false; + bool is_decrypting_demuxer_stream = false; +};
diff --git a/media/mojo/interfaces/pipeline_statistics.typemap b/media/mojo/interfaces/pipeline_statistics.typemap deleted file mode 100644 index 72b6951..0000000 --- a/media/mojo/interfaces/pipeline_statistics.typemap +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -mojom = "//media/mojo/interfaces/media_types.mojom" -public_headers = [ "//media/base/pipeline_status.h" ] -traits_headers = - [ "//media/mojo/interfaces/pipeline_statistics_struct_traits.h" ] -type_mappings = [ "media.mojom.PipelineStatistics=media::PipelineStatistics" ]
diff --git a/media/mojo/interfaces/pipeline_status.typemap b/media/mojo/interfaces/pipeline_status.typemap new file mode 100644 index 0000000..cb730c3b --- /dev/null +++ b/media/mojo/interfaces/pipeline_status.typemap
@@ -0,0 +1,11 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//media/mojo/interfaces/media_types.mojom" +public_headers = [ "//media/base/pipeline_status.h" ] +traits_headers = [ "//media/mojo/interfaces/pipeline_status_struct_traits.h" ] +type_mappings = [ + "media.mojom.PipelineStatistics=media::PipelineStatistics", + "media.mojom.PipelineDecoderInfo=media::PipelineDecoderInfo", +]
diff --git a/media/mojo/interfaces/pipeline_statistics_struct_traits.h b/media/mojo/interfaces/pipeline_status_struct_traits.h similarity index 61% rename from media/mojo/interfaces/pipeline_statistics_struct_traits.h rename to media/mojo/interfaces/pipeline_status_struct_traits.h index 82eed288..f5a0d69 100644 --- a/media/mojo/interfaces/pipeline_statistics_struct_traits.h +++ b/media/mojo/interfaces/pipeline_status_struct_traits.h
@@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MEDIA_MOJO_INTERFACES_PIPELINE_STATISTICS_STRUCT_TRAITS_H_ -#define MEDIA_MOJO_INTERFACES_PIPELINE_STATISTICS_STRUCT_TRAITS_H_ +#ifndef MEDIA_MOJO_INTERFACES_PIPELINE_STATUS_STRUCT_TRAITS_H_ +#define MEDIA_MOJO_INTERFACES_PIPELINE_STATUS_STRUCT_TRAITS_H_ + +#include <string> #include "media/base/pipeline_status.h" #include "media/mojo/interfaces/media_types.mojom.h" @@ -44,6 +46,30 @@ } }; +template <> +struct StructTraits<media::mojom::PipelineDecoderInfoDataView, + media::PipelineDecoderInfo> { + static std::string decoder_name(const media::PipelineDecoderInfo& input) { + return input.decoder_name; + } + + static bool is_platform_decoder(const media::PipelineDecoderInfo& input) { + return input.is_platform_decoder; + } + + static bool is_decrypting_demuxer_stream( + const media::PipelineDecoderInfo& input) { + return input.is_decrypting_demuxer_stream; + } + + static bool Read(media::mojom::PipelineDecoderInfoDataView data, + media::PipelineDecoderInfo* output) { + output->is_platform_decoder = data.is_platform_decoder(); + output->is_decrypting_demuxer_stream = data.is_decrypting_demuxer_stream(); + return data.ReadDecoderName(&output->decoder_name); + } +}; + } // namespace mojo -#endif // MEDIA_MOJO_INTERFACES_PIPELINE_STATISTICS_STRUCT_TRAITS_H_ +#endif // MEDIA_MOJO_INTERFACES_PIPELINE_STATUS_STRUCT_TRAITS_H_
diff --git a/media/mojo/interfaces/typemaps.gni b/media/mojo/interfaces/typemaps.gni index 1de4153b..d0c6945 100644 --- a/media/mojo/interfaces/typemaps.gni +++ b/media/mojo/interfaces/typemaps.gni
@@ -14,7 +14,7 @@ "//media/mojo/interfaces/hdr_metadata.typemap", "//media/mojo/interfaces/media_drm_storage.typemap", "//media/mojo/interfaces/media_types.typemap", - "//media/mojo/interfaces/pipeline_statistics.typemap", + "//media/mojo/interfaces/pipeline_status.typemap", "//media/mojo/interfaces/video_color_space.typemap", "//media/mojo/interfaces/video_decoder.typemap", "//media/mojo/interfaces/video_decoder_config.typemap",
diff --git a/media/mojo/services/media_metrics_provider.cc b/media/mojo/services/media_metrics_provider.cc index d55d2fe..e671c6ae 100644 --- a/media/mojo/services/media_metrics_provider.cc +++ b/media/mojo/services/media_metrics_provider.cc
@@ -9,28 +9,41 @@ #include "base/logging.h" #include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" +#include "build/build_config.h" #include "media/mojo/services/video_decode_stats_recorder.h" #include "media/mojo/services/watch_time_recorder.h" #include "mojo/public/cpp/bindings/strong_binding.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" +#if !defined(OS_ANDROID) +#include "media/filters/decrypting_video_decoder.h" +#endif + namespace media { constexpr char kInvalidInitialize[] = "Initialize() was not called correctly."; static uint64_t g_player_id = 0; +MediaMetricsProvider::PipelineInfo::PipelineInfo(bool is_incognito) + : is_incognito(is_incognito) {} + +MediaMetricsProvider::PipelineInfo::~PipelineInfo() = default; + MediaMetricsProvider::MediaMetricsProvider( - bool is_top_frame, + BrowsingMode is_incognito, + FrameStatus is_top_frame, ukm::SourceId source_id, learning::FeatureValue origin, VideoDecodePerfHistory::SaveCallback save_cb) : player_id_(g_player_id++), - is_top_frame_(is_top_frame), + is_top_frame_(is_top_frame == FrameStatus::kTopFrame), source_id_(source_id), origin_(origin), - save_cb_(std::move(save_cb)) {} + save_cb_(std::move(save_cb)), + uma_info_(is_incognito == BrowsingMode::kIncognito) {} MediaMetricsProvider::~MediaMetricsProvider() { // UKM may be unavailable in content_shell or other non-chrome/ builds; it @@ -43,9 +56,9 @@ ukm::builders::Media_WebMediaPlayerState builder(source_id_); builder.SetPlayerID(player_id_); builder.SetIsTopFrame(is_top_frame_); - builder.SetIsEME(is_eme_); + builder.SetIsEME(uma_info_.is_eme); builder.SetIsMSE(is_mse_); - builder.SetFinalPipelineStatus(pipeline_status_); + builder.SetFinalPipelineStatus(uma_info_.last_pipeline_status); if (!is_mse_) { builder.SetURLScheme(static_cast<int64_t>(url_scheme_)); if (container_name_) @@ -63,7 +76,7 @@ // Buffered bytes are reported from a different source for EME/MSE. std::string suffix; - if (is_eme_) + if (uma_info_.is_eme) suffix = "EME"; else if (is_mse_) suffix = "MSE"; @@ -77,18 +90,132 @@ base::UmaHistogramMemoryKB("Ads.Media.BytesReceived." + suffix, total_bytes_received_ >> 10); } + + ReportPipelineUMA(); +} + +std::string MediaMetricsProvider::GetUMANameForAVStream( + const PipelineInfo& player_info) { + constexpr char kPipelineUmaPrefix[] = "Media.PipelineStatus.AudioVideo."; + std::string uma_name = kPipelineUmaPrefix; + if (player_info.video_codec == kCodecVP8) { + uma_name += "VP8."; + } else if (player_info.video_codec == kCodecVP9) { + uma_name += "VP9."; + } else if (player_info.video_codec == kCodecH264) { + uma_name += "H264."; + } else if (player_info.video_codec == kCodecAV1) { + uma_name += "AV1."; + } else { + return uma_name + "Other"; + } + +#if !defined(OS_ANDROID) + if (player_info.video_pipeline_info.decoder_name == + media::DecryptingVideoDecoder::kDecoderName) { + return uma_name + "DVD"; + } +#endif + + if (player_info.video_pipeline_info.is_decrypting_demuxer_stream) { + uma_name += "DDS."; + } + + // Note that HW essentially means 'platform' anyway. MediaCodec has been + // reported as HW forever, regardless of the underlying platform + // implementation. + if (player_info.video_pipeline_info.is_platform_decoder) { + uma_name += "HW"; + } else { + uma_name += "SW"; + } + return uma_name; +} + +void MediaMetricsProvider::ReportPipelineUMA() { + if (uma_info_.has_video && uma_info_.has_audio) { + base::UmaHistogramExactLinear(GetUMANameForAVStream(uma_info_), + uma_info_.last_pipeline_status, + media::PIPELINE_STATUS_MAX + 1); + } else if (uma_info_.has_audio) { + base::UmaHistogramExactLinear("Media.PipelineStatus.AudioOnly", + uma_info_.last_pipeline_status, + media::PIPELINE_STATUS_MAX + 1); + } else if (uma_info_.has_video) { + base::UmaHistogramExactLinear("Media.PipelineStatus.VideoOnly", + uma_info_.last_pipeline_status, + media::PIPELINE_STATUS_MAX + 1); + } else { + // Note: This metric can be recorded as a result of normal operation with + // Media Source Extensions. If a site creates a MediaSource object but never + // creates a source buffer or appends data, PIPELINE_OK will be recorded. + base::UmaHistogramExactLinear("Media.PipelineStatus.Unsupported", + uma_info_.last_pipeline_status, + media::PIPELINE_STATUS_MAX + 1); + } + + // Report whether video decoder fallback happened, but only if a video decoder + // was reported. + if (!uma_info_.video_pipeline_info.decoder_name.empty()) { + base::UmaHistogramBoolean("Media.VideoDecoderFallback", + uma_info_.video_decoder_changed); + } + + // Report whether this player ever saw a playback event. Used to measure the + // effectiveness of efforts to reduce loaded-but-never-used players. + if (uma_info_.has_reached_have_enough) { + base::UmaHistogramBoolean("Media.HasEverPlayed", uma_info_.has_ever_played); + } + + // Report whether an encrypted playback is in incognito window, excluding + // never-used players. + if (uma_info_.is_eme && uma_info_.has_ever_played) { + base::UmaHistogramBoolean("Media.EME.IsIncognito", uma_info_.is_incognito); + } } // static -void MediaMetricsProvider::Create(bool is_top_frame, +void MediaMetricsProvider::Create(BrowsingMode is_incognito, + FrameStatus is_top_frame, GetSourceIdCallback get_source_id_cb, GetOriginCallback get_origin_cb, VideoDecodePerfHistory::SaveCallback save_cb, mojom::MediaMetricsProviderRequest request) { - mojo::MakeStrongBinding(std::make_unique<MediaMetricsProvider>( - is_top_frame, get_source_id_cb.Run(), - get_origin_cb.Run(), std::move(save_cb)), - std::move(request)); + mojo::MakeStrongBinding( + std::make_unique<MediaMetricsProvider>( + is_incognito, is_top_frame, get_source_id_cb.Run(), + get_origin_cb.Run(), std::move(save_cb)), + std::move(request)); +} + +void MediaMetricsProvider::SetHasPlayed() { + uma_info_.has_ever_played = true; +} + +void MediaMetricsProvider::SetHasAudio(AudioCodec audio_codec) { + uma_info_.audio_codec = audio_codec; + uma_info_.has_audio = true; +} + +void MediaMetricsProvider::SetHasVideo(VideoCodec video_codec) { + uma_info_.video_codec = video_codec; + uma_info_.has_video = true; +} + +void MediaMetricsProvider::SetHaveEnough() { + uma_info_.has_reached_have_enough = true; +} + +void MediaMetricsProvider::SetVideoPipelineInfo( + const PipelineDecoderInfo& info) { + if (!uma_info_.video_pipeline_info.decoder_name.empty()) + uma_info_.video_decoder_changed = true; + uma_info_.video_pipeline_info = info; +} + +void MediaMetricsProvider::SetAudioPipelineInfo( + const PipelineDecoderInfo& info) { + uma_info_.audio_pipeline_info = info; } void MediaMetricsProvider::Initialize(bool is_mse, @@ -105,7 +232,7 @@ void MediaMetricsProvider::OnError(PipelineStatus status) { DCHECK(initialized_); - pipeline_status_ = status; + uma_info_.last_pipeline_status = status; } void MediaMetricsProvider::SetIsAdMedia() { @@ -115,7 +242,7 @@ void MediaMetricsProvider::SetIsEME() { // This may be called before Initialize(). - is_eme_ = true; + uma_info_.is_eme = true; } void MediaMetricsProvider::SetTimeToMetadata(base::TimeDelta elapsed) {
diff --git a/media/mojo/services/media_metrics_provider.h b/media/mojo/services/media_metrics_provider.h index 25c04df..5199d51 100644 --- a/media/mojo/services/media_metrics_provider.h +++ b/media/mojo/services/media_metrics_provider.h
@@ -6,6 +6,7 @@ #define MEDIA_MOJO_SERVICES_MEDIA_METRICS_PROVIDER_H_ #include <stdint.h> +#include <string> #include "media/base/container_names.h" #include "media/base/pipeline_status.h" @@ -17,13 +18,19 @@ #include "services/metrics/public/cpp/ukm_source_id.h" namespace media { + class VideoDecodePerfHistory; // See mojom::MediaMetricsProvider for documentation. class MEDIA_MOJO_EXPORT MediaMetricsProvider : public mojom::MediaMetricsProvider { public: - MediaMetricsProvider(bool is_top_frame, + enum class BrowsingMode : bool { kIncognito, kNormal }; + + enum class FrameStatus : bool { kTopFrame, kNotTopFrame }; + + MediaMetricsProvider(BrowsingMode is_incognito, + FrameStatus is_top_frame, ukm::SourceId source_id, learning::FeatureValue origin, VideoDecodePerfHistory::SaveCallback save_cb); @@ -45,23 +52,48 @@ // returns. The intention is that they'll be run to produce the constructor // arguments for MediaMetricsProvider synchronously. They should not be // copied or moved for later. - static void Create(bool is_top_frame, + static void Create(BrowsingMode is_incognito, + FrameStatus is_top_frame, GetSourceIdCallback get_source_id_cb, GetOriginCallback get_origin_cb, VideoDecodePerfHistory::SaveCallback save_cb, mojom::MediaMetricsProviderRequest request); private: + struct PipelineInfo { + PipelineInfo(bool is_incognito); + ~PipelineInfo(); + bool is_incognito; + bool has_ever_played = false; + bool has_reached_have_enough = false; + bool has_audio = false; + bool has_video = false; + bool is_eme = false; + bool video_decoder_changed = false; + AudioCodec audio_codec; + VideoCodec video_codec; + PipelineDecoderInfo video_pipeline_info; + PipelineDecoderInfo audio_pipeline_info; + PipelineStatus last_pipeline_status = PIPELINE_OK; + }; + // mojom::MediaMetricsProvider implementation: void Initialize(bool is_mse, mojom::MediaURLScheme url_scheme) override; void OnError(PipelineStatus status) override; + void SetAudioPipelineInfo(const PipelineDecoderInfo& info) override; + void SetContainerName( + container_names::MediaContainerName container_name) override; + void SetHasAudio(AudioCodec audio_codec) override; + void SetHasPlayed() override; + void SetHasVideo(VideoCodec video_codec) override; + void SetHaveEnough() override; void SetIsAdMedia() override; void SetIsEME() override; void SetTimeToMetadata(base::TimeDelta elapsed) override; void SetTimeToFirstFrame(base::TimeDelta elapsed) override; void SetTimeToPlayReady(base::TimeDelta elapsed) override; - void SetContainerName( - container_names::MediaContainerName container_name) override; + void SetVideoPipelineInfo(const PipelineDecoderInfo& info) override; + void AcquireWatchTimeRecorder( mojom::PlaybackPropertiesPtr properties, mojom::WatchTimeRecorderRequest request) override; @@ -69,6 +101,9 @@ mojom::VideoDecodeStatsRecorderRequest request) override; void AddBytesReceived(uint64_t bytes_received) override; + void ReportPipelineUMA(); + std::string GetUMANameForAVStream(const PipelineInfo& player_info); + // Session unique ID which maps to a given WebMediaPlayerImpl instances. Used // to coordinate multiply logged events with a singly logged metric. const uint64_t player_id_; @@ -81,9 +116,10 @@ const VideoDecodePerfHistory::SaveCallback save_cb_; + // UMA pipeline packaged data + PipelineInfo uma_info_; + // These values are not always sent but have known defaults. - PipelineStatus pipeline_status_ = PIPELINE_OK; - bool is_eme_ = false; bool is_ad_media_ = false; // The values below are only set if |initialized_| is true.
diff --git a/media/mojo/services/media_metrics_provider_unittest.cc b/media/mojo/services/media_metrics_provider_unittest.cc index 5198b28..c069105 100644 --- a/media/mojo/services/media_metrics_provider_unittest.cc +++ b/media/mojo/services/media_metrics_provider_unittest.cc
@@ -2,9 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "media/mojo/services/watch_time_recorder.h" - #include <stddef.h> +#include <memory> #include "base/bind.h" #include "base/bind_helpers.h" @@ -13,6 +12,7 @@ #include "base/test/test_message_loop.h" #include "components/ukm/test_ukm_recorder.h" #include "media/mojo/services/media_metrics_provider.h" +#include "media/mojo/services/watch_time_recorder.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -31,6 +31,7 @@ ~MediaMetricsProviderTest() override { base::RunLoop().RunUntilIdle(); } void Initialize(bool is_mse, + bool is_incognito, bool is_top_frame, const std::string& origin, mojom::MediaURLScheme scheme) { @@ -38,7 +39,10 @@ test_recorder_->UpdateSourceURL(source_id_, GURL(origin)); MediaMetricsProvider::Create( - is_top_frame, + (is_incognito ? MediaMetricsProvider::BrowsingMode::kIncognito + : MediaMetricsProvider::BrowsingMode::kNormal), + (is_top_frame ? MediaMetricsProvider::FrameStatus::kTopFrame + : MediaMetricsProvider::FrameStatus::kNotTopFrame), base::BindRepeating(&MediaMetricsProviderTest::GetSourceId, base::Unretained(this)), base::BindRepeating([]() { return learning::FeatureValue(0); }), @@ -71,7 +75,7 @@ EXPECT_TRUE(test_recorder_->EntryHasMetric(entry, name)); TEST_F(MediaMetricsProviderTest, TestUkm) { - Initialize(true, true, kTestOrigin, mojom::MediaURLScheme::kHttp); + Initialize(true, false, true, kTestOrigin, mojom::MediaURLScheme::kHttp); provider_.reset(); base::RunLoop().RunUntilIdle(); @@ -106,7 +110,7 @@ const base::TimeDelta kPlayReadyTime = base::TimeDelta::FromSeconds(3); ResetMetricRecorders(); - Initialize(false, false, kTestOrigin2, mojom::MediaURLScheme::kHttps); + Initialize(false, false, false, kTestOrigin2, mojom::MediaURLScheme::kHttps); provider_->SetIsEME(); provider_->SetTimeToMetadata(kMetadataTime); provider_->SetTimeToFirstFrame(kFirstFrameTime); @@ -141,7 +145,7 @@ TEST_F(MediaMetricsProviderTest, TestBytesReceivedUMA) { base::HistogramTester histogram_tester; - Initialize(false, false, kTestOrigin, mojom::MediaURLScheme::kHttp); + Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttp); provider_->AddBytesReceived(1 << 10); provider_.reset(); base::RunLoop().RunUntilIdle(); @@ -152,7 +156,7 @@ histogram_tester.ExpectTotalCount("Ads.Media.BytesReceived", 0); // EME is recorded in before MSE/SRC. - Initialize(true, false, kTestOrigin, mojom::MediaURLScheme::kHttp); + Initialize(true, false, false, kTestOrigin, mojom::MediaURLScheme::kHttp); provider_->AddBytesReceived(1 << 10); provider_->SetIsEME(); provider_->SetIsAdMedia(); @@ -165,7 +169,7 @@ histogram_tester.ExpectBucketCount("Ads.Media.BytesReceived.EME", 1, 1); histogram_tester.ExpectTotalCount("Ads.Media.BytesReceived.MSE", 0); - Initialize(true, false, kTestOrigin, mojom::MediaURLScheme::kHttp); + Initialize(true, false, false, kTestOrigin, mojom::MediaURLScheme::kHttp); provider_->AddBytesReceived(1 << 10); provider_->SetIsAdMedia(); provider_.reset(); @@ -176,6 +180,59 @@ histogram_tester.ExpectBucketCount("Ads.Media.BytesReceived", 1, 2); } +TEST_F(MediaMetricsProviderTest, TestPipelineUMA) { + base::HistogramTester histogram_tester; + Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttps); + provider_->SetAudioPipelineInfo({false, false, "TestAudioDecoder"}); + provider_->SetVideoPipelineInfo({false, false, "TestVideoDecoder"}); + provider_->SetHasAudio(AudioCodec::kCodecVorbis); + provider_->SetHasVideo(VideoCodec::kCodecVP9); + provider_->SetHasPlayed(); + provider_->SetHaveEnough(); + provider_.reset(); + base::RunLoop().RunUntilIdle(); + histogram_tester.ExpectBucketCount("Media.PipelineStatus.AudioVideo.VP9.SW", + PIPELINE_OK, 1); + histogram_tester.ExpectBucketCount("Media.VideoDecoderFallback", false, 1); + histogram_tester.ExpectBucketCount("Media.HasEverPlayed", true, 1); +} + +TEST_F(MediaMetricsProviderTest, TestPipelineUMANoAudioEMEHW) { + base::HistogramTester histogram_tester; + Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttps); + provider_->SetIsEME(); + provider_->SetVideoPipelineInfo({true, true, "TestEMEVideoDecoder"}); + provider_->SetHasVideo(VideoCodec::kCodecAV1); + provider_->SetHasPlayed(); + provider_->SetHaveEnough(); + provider_.reset(); + base::RunLoop().RunUntilIdle(); + histogram_tester.ExpectBucketCount("Media.PipelineStatus.VideoOnly", + PIPELINE_OK, 1); + histogram_tester.ExpectBucketCount("Media.VideoDecoderFallback", false, 1); + histogram_tester.ExpectBucketCount("Media.HasEverPlayed", true, 1); + histogram_tester.ExpectBucketCount("Media.EME.IsIncognito", false, 1); +} + +TEST_F(MediaMetricsProviderTest, TestPipelineUMADecoderFallback) { + base::HistogramTester histogram_tester; + Initialize(false, false, false, kTestOrigin, mojom::MediaURLScheme::kHttps); + provider_->SetIsEME(); + provider_->SetAudioPipelineInfo({false, false, "TestAudioDecoder"}); + provider_->SetVideoPipelineInfo({true, false, "D3D11VideoDecoder"}); + provider_->SetHasVideo(VideoCodec::kCodecVP9); + provider_->SetHasAudio(AudioCodec::kCodecVorbis); + provider_->SetHasPlayed(); + provider_->SetHaveEnough(); + provider_->SetVideoPipelineInfo({true, false, "DXVAVideoDecoder"}); + provider_.reset(); + base::RunLoop().RunUntilIdle(); + histogram_tester.ExpectBucketCount("Media.PipelineStatus.AudioVideo.VP9.HW", + PIPELINE_OK, 1); + histogram_tester.ExpectBucketCount("Media.VideoDecoderFallback", true, 1); + histogram_tester.ExpectBucketCount("Media.HasEverPlayed", true, 1); +} + // Note: Tests for various Acquire* methods are contained with the unittests for // their respective classes.
diff --git a/media/mojo/services/watch_time_recorder_unittest.cc b/media/mojo/services/watch_time_recorder_unittest.cc index 026f662..225daedc 100644 --- a/media/mojo/services/watch_time_recorder_unittest.cc +++ b/media/mojo/services/watch_time_recorder_unittest.cc
@@ -5,6 +5,9 @@ #include "media/mojo/services/watch_time_recorder.h" #include <stddef.h> +#include <memory> +#include <utility> +#include <vector> #include "base/bind.h" #include "base/bind_helpers.h" @@ -54,7 +57,8 @@ source_id_ = test_recorder_->GetNewSourceID(); ResetMetricRecorders(); MediaMetricsProvider::Create( - true /* is_top_frame */, + MediaMetricsProvider::BrowsingMode::kIncognito, + MediaMetricsProvider::FrameStatus::kTopFrame, base::BindRepeating(&WatchTimeRecorderTest::GetSourceId, base::Unretained(this)), base::BindRepeating(
diff --git a/media/remoting/courier_renderer_unittest.cc b/media/remoting/courier_renderer_unittest.cc index 017683f..37ba14af 100644 --- a/media/remoting/courier_renderer_unittest.cc +++ b/media/remoting/courier_renderer_unittest.cc
@@ -49,6 +49,8 @@ stats.audio_memory_usage = 5678; stats.video_memory_usage = 6789; stats.video_keyframe_distance_average = base::TimeDelta::Max(); + stats.audio_decoder_info = {false, false, "Default"}; + stats.video_decoder_info = {false, false, "Default"}; return stats; } @@ -350,6 +352,18 @@ message->set_video_frames_dropped(stats.video_frames_dropped); message->set_audio_memory_usage(stats.audio_memory_usage); message->set_video_memory_usage(stats.video_memory_usage); + message->mutable_audio_decoder_info()->set_is_platform_decoder( + stats.audio_decoder_info.is_platform_decoder); + message->mutable_audio_decoder_info()->set_is_decrypting_demuxer_stream( + stats.audio_decoder_info.is_decrypting_demuxer_stream); + message->mutable_audio_decoder_info()->set_decoder_name( + stats.audio_decoder_info.decoder_name); + message->mutable_video_decoder_info()->set_is_platform_decoder( + stats.video_decoder_info.is_platform_decoder); + message->mutable_video_decoder_info()->set_is_decrypting_demuxer_stream( + stats.video_decoder_info.is_decrypting_demuxer_stream); + message->mutable_video_decoder_info()->set_decoder_name( + stats.video_decoder_info.decoder_name); OnReceivedRpc(std::move(rpc)); RunPendingTasks(); }
diff --git a/media/remoting/media_remoting_rpc.proto b/media/remoting/media_remoting_rpc.proto index ebf5881..2abb9b3 100644 --- a/media/remoting/media_remoting_rpc.proto +++ b/media/remoting/media_remoting_rpc.proto
@@ -270,6 +270,12 @@ optional uint32 skip_byte_block = 6; } +message PipelineDecoderInfo { + optional string decoder_name = 1; + optional bool is_platform_decoder = 2; + optional bool is_decrypting_demuxer_stream = 3; +}; + message PipelineStatistics { optional uint64 audio_bytes_decoded = 1; optional uint64 video_bytes_decoded = 2; @@ -278,8 +284,8 @@ optional int64 audio_memory_usage = 5; optional int64 video_memory_usage = 6; optional int64 video_frame_duration_average_usec = 7; - optional string audio_decoder_name = 8; - optional string video_decoder_name = 9; + optional PipelineDecoderInfo audio_decoder_info = 8; + optional PipelineDecoderInfo video_decoder_info = 9; }; message CdmKeyInformation {
diff --git a/media/remoting/proto_utils.cc b/media/remoting/proto_utils.cc index 4fca7e8c9..6d34554c 100644 --- a/media/remoting/proto_utils.cc +++ b/media/remoting/proto_utils.cc
@@ -415,10 +415,22 @@ // The following fields were added after the initial message definition. Check // that sender provided the values. - if (stats_message.has_audio_decoder_name()) - stats->audio_decoder_name = stats_message.audio_decoder_name(); - if (stats_message.has_video_decoder_name()) - stats->video_decoder_name = stats_message.video_decoder_name(); + if (stats_message.has_audio_decoder_info()) { + auto audio_info = stats_message.audio_decoder_info(); + stats->audio_decoder_info.decoder_name = audio_info.decoder_name(); + stats->audio_decoder_info.is_platform_decoder = + audio_info.is_platform_decoder(); + stats->audio_decoder_info.is_decrypting_demuxer_stream = + audio_info.is_decrypting_demuxer_stream(); + } + if (stats_message.has_video_decoder_info()) { + auto video_info = stats_message.video_decoder_info(); + stats->video_decoder_info.decoder_name = video_info.decoder_name(); + stats->video_decoder_info.is_platform_decoder = + video_info.is_platform_decoder(); + stats->video_decoder_info.is_decrypting_demuxer_stream = + video_info.is_decrypting_demuxer_stream(); + } if (stats_message.has_video_frame_duration_average_usec()) { stats->video_frame_duration_average = base::TimeDelta::FromMicroseconds( stats_message.video_frame_duration_average_usec());
diff --git a/media/remoting/proto_utils_unittest.cc b/media/remoting/proto_utils_unittest.cc index 0dd9d133..b20c4bb 100644 --- a/media/remoting/proto_utils_unittest.cc +++ b/media/remoting/proto_utils_unittest.cc
@@ -144,11 +144,15 @@ original.video_memory_usage = 43; original.video_keyframe_distance_average = base::TimeDelta::Max(); original.video_frame_duration_average = base::TimeDelta::Max(); - original.audio_decoder_name = "TestAudioDecoder"; - original.video_decoder_name = "TestVideoDecoder"; + original.audio_decoder_info = {false, false, "TestAudioDecoder"}; + original.video_decoder_info = {false, false, "TestVideoDecoder"}; // There is no convert-to-proto function, so just do that here. pb::PipelineStatistics pb_stats; + pb::PipelineDecoderInfo* pb_video_info = + pb_stats.mutable_video_decoder_info(); + pb::PipelineDecoderInfo* pb_audio_info = + pb_stats.mutable_audio_decoder_info(); pb_stats.set_audio_bytes_decoded(original.audio_bytes_decoded); pb_stats.set_video_bytes_decoded(original.video_bytes_decoded); pb_stats.set_video_frames_decoded(original.video_frames_decoded); @@ -157,15 +161,30 @@ pb_stats.set_video_memory_usage(original.video_memory_usage); pb_stats.set_video_frame_duration_average_usec( original.video_frame_duration_average.InMicroseconds()); - pb_stats.set_audio_decoder_name(original.audio_decoder_name); - pb_stats.set_video_decoder_name(original.video_decoder_name); + + pb_video_info->set_decoder_name(original.video_decoder_info.decoder_name); + pb_video_info->set_is_platform_decoder( + original.video_decoder_info.is_platform_decoder); + pb_video_info->set_is_decrypting_demuxer_stream( + original.video_decoder_info.is_decrypting_demuxer_stream); + + pb_audio_info->set_decoder_name(original.audio_decoder_info.decoder_name); + pb_audio_info->set_is_platform_decoder( + original.audio_decoder_info.is_platform_decoder); + pb_audio_info->set_is_decrypting_demuxer_stream( + original.audio_decoder_info.is_decrypting_demuxer_stream); PipelineStatistics converted; + // NOTE: fields will all be initialized with 0xcd. Forcing the conversion to - // properly assigned them. Don't memset() over non-primitive types like - // std::string since this will trigger corruption. - memset(&converted, 0xcd, sizeof(converted) - sizeof(std::string) * 2); - converted.video_decoder_name = converted.audio_decoder_name = "0xcdcdcdcd"; + // properly assigned them. Since nested structs have strings, memsetting must + // be done infividually for them. + memset(&converted, 0xcd, sizeof(converted) - sizeof(PipelineDecoderInfo) * 2); + memset(&converted.audio_decoder_info, 0xcd, + sizeof(PipelineDecoderInfo) - sizeof(std::string)); + memset(&converted.video_decoder_info, 0xcd, + sizeof(PipelineDecoderInfo) - sizeof(std::string)); + ConvertProtoToPipelineStatistics(pb_stats, &converted); // If this fails, did media::PipelineStatistics add/change fields that are not
diff --git a/media/test/pipeline_integration_test_base.h b/media/test/pipeline_integration_test_base.h index b5beb72..b5ce726 100644 --- a/media/test/pipeline_integration_test_base.h +++ b/media/test/pipeline_integration_test_base.h
@@ -241,8 +241,8 @@ MOCK_METHOD1(OnAudioConfigChange, void(const AudioDecoderConfig&)); MOCK_METHOD1(OnVideoOpacityChange, void(bool)); MOCK_METHOD0(OnVideoAverageKeyframeDistanceUpdate, void()); - MOCK_METHOD1(OnAudioDecoderChange, void(const std::string&)); - MOCK_METHOD1(OnVideoDecoderChange, void(const std::string&)); + MOCK_METHOD1(OnAudioDecoderChange, void(const PipelineDecoderInfo&)); + MOCK_METHOD1(OnVideoDecoderChange, void(const PipelineDecoderInfo&)); MOCK_METHOD1(OnRemotePlayStateChange, void(MediaStatus::State state)); private:
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni index 8c7df7d..ebc83d3 100644 --- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni +++ b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
@@ -52,7 +52,7 @@ "//ui/base/accelerators/mojo/typemaps.gni", "//ui/base/ime/mojo/typemaps.gni", "//ui/base/mojom/typemaps.gni", - "//ui/display/mojo/typemaps.gni", + "//ui/display/mojom/typemaps.gni", "//ui/events/mojo/typemaps.gni", "//ui/gfx/typemaps.gni", "//ui/latency/mojo/typemaps.gni",
diff --git a/net/BUILD.gn b/net/BUILD.gn index 011a4b9b..8ee047b 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1219,8 +1219,6 @@ "ssl/ssl_platform_key_util.cc", "ssl/ssl_platform_key_util.h", "ssl/ssl_platform_key_win.cc", - "ssl/test_ssl_private_key.cc", - "ssl/test_ssl_private_key.h", "ssl/threaded_ssl_private_key.cc", "ssl/threaded_ssl_private_key.h", "third_party/mozilla_security_manager/nsNSSCertificateDB.cpp", @@ -2784,6 +2782,8 @@ "ssl/client_cert_identity_test_util.h", "ssl/ssl_private_key_test_util.cc", "ssl/ssl_private_key_test_util.h", + "ssl/test_ssl_private_key.cc", + "ssl/test_ssl_private_key.h", "test/cert_test_util.cc", "test/cert_test_util.h", "test/cert_test_util_nss.cc",
diff --git a/net/base/port_util.h b/net/base/port_util.h index 72d4b39..b64b137 100644 --- a/net/base/port_util.h +++ b/net/base/port_util.h
@@ -21,7 +21,7 @@ // Returns true if the port is in the range [0, 1023]. These ports are // registered by IANA and typically need root access to listen on. -bool IsWellKnownPort(int port); +NET_EXPORT bool IsWellKnownPort(int port); // Checks if the port is allowed for the specified scheme. Ports set as allowed // with SetExplicitlyAllowedPorts() or by using ScopedPortException() will be
diff --git a/net/disk_cache/memory/mem_entry_impl.cc b/net/disk_cache/memory/mem_entry_impl.cc index 71a34737..6315d815 100644 --- a/net/disk_cache/memory/mem_entry_impl.cc +++ b/net/disk_cache/memory/mem_entry_impl.cc
@@ -36,20 +36,6 @@ // Sparse entry children have maximum size of 4KB. const int kMaxChildEntrySize = 1 << kMaxChildEntryBits; -// This enum is used for histograms, so only append to the end. -enum MemEntryWriteResult { - MEM_ENTRY_WRITE_RESULT_SUCCESS = 0, - MEM_ENTRY_WRITE_RESULT_INVALID_ARGUMENT = 1, - MEM_ENTRY_WRITE_RESULT_OVER_MAX_ENTRY_SIZE = 2, - MEM_ENTRY_WRITE_RESULT_EXCEEDED_CACHE_STORAGE_SIZE = 3, - MEM_ENTRY_WRITE_RESULT_MAX = 4, -}; - -void RecordWriteResult(MemEntryWriteResult result) { - UMA_HISTOGRAM_ENUMERATION("MemCache.WriteResult", result, - MEM_ENTRY_WRITE_RESULT_MAX); -} - // Convert global offset to child index. int64_t ToChildIndex(int64_t offset) { return offset >> kMaxChildEntryBits; @@ -373,22 +359,14 @@ int MemEntryImpl::InternalWriteData(int index, int offset, IOBuffer* buf, int buf_len, bool truncate) { DCHECK(type() == PARENT_ENTRY || index == kSparseData); - if (!backend_) { - // We have to fail writes after the backend is destroyed since we can't - // ensure we wouldn't use too much memory if it's gone. - RecordWriteResult(MEM_ENTRY_WRITE_RESULT_EXCEEDED_CACHE_STORAGE_SIZE); + if (!backend_) return net::ERR_INSUFFICIENT_RESOURCES; - } - if (index < 0 || index >= kNumStreams) { - RecordWriteResult(MEM_ENTRY_WRITE_RESULT_INVALID_ARGUMENT); + if (index < 0 || index >= kNumStreams) return net::ERR_INVALID_ARGUMENT; - } - if (offset < 0 || buf_len < 0) { - RecordWriteResult(MEM_ENTRY_WRITE_RESULT_INVALID_ARGUMENT); + if (offset < 0 || buf_len < 0) return net::ERR_INVALID_ARGUMENT; - } int max_file_size = backend_->MaxFileSize(); @@ -396,7 +374,6 @@ if (offset > max_file_size || buf_len > max_file_size || !base::CheckAdd(offset, buf_len).AssignIfValid(&end_offset) || end_offset > max_file_size) { - RecordWriteResult(MEM_ENTRY_WRITE_RESULT_OVER_MAX_ENTRY_SIZE); return net::ERR_FAILED; } @@ -406,7 +383,6 @@ backend_->ModifyStorageSize(delta); if (backend_->HasExceededStorageSize()) { backend_->ModifyStorageSize(-delta); - RecordWriteResult(MEM_ENTRY_WRITE_RESULT_EXCEEDED_CACHE_STORAGE_SIZE); return net::ERR_INSUFFICIENT_RESOURCES; } @@ -420,7 +396,6 @@ } UpdateStateOnUse(ENTRY_WAS_MODIFIED); - RecordWriteResult(MEM_ENTRY_WRITE_RESULT_SUCCESS); if (!buf_len) return 0;
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc index 6c76aff..7b3a3aa8 100644 --- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc +++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -392,7 +392,7 @@ base::Unretained(this)), net_log.bound()); base::RunLoop run_loop; - net_log.SetCaptureMode(NetLogCaptureMode::kDefault); + net_log.SetObserverCaptureMode(NetLogCaptureMode::kDefault); store_->LoadCookiesForKey( "aaa.com", base::Bind(&SQLitePersistentCookieStoreTest::OnKeyLoaded, base::Unretained(this), run_loop.QuitClosure()));
diff --git a/net/http/bidirectional_stream_unittest.cc b/net/http/bidirectional_stream_unittest.cc index 76cb401..c0bb843d 100644 --- a/net/http/bidirectional_stream_unittest.cc +++ b/net/http/bidirectional_stream_unittest.cc
@@ -408,7 +408,7 @@ ssl_data_.next_proto = kProtoHTTP2; ssl_data_.ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"); - net_log_.SetCaptureMode(NetLogCaptureMode::kEverything); + net_log_.SetObserverCaptureMode(NetLogCaptureMode::kEverything); socket_factory_ = new MockTaggingClientSocketFactory(); session_deps_.socket_factory.reset(socket_factory_); }
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc index 7938452..ada5de2 100644 --- a/net/http/http_cache_transaction.cc +++ b/net/http/http_cache_transaction.cc
@@ -88,20 +88,9 @@ } // namespace -#define CACHE_STATUS_HISTOGRAMS(type) \ - do { \ - UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern" type, cache_entry_status_, \ - CacheEntryStatus::ENTRY_MAX); \ - if (validation_request) { \ - UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause" type, \ - validation_cause_, VALIDATION_CAUSE_MAX); \ - } \ - if (stale_request) { \ - UMA_HISTOGRAM_COUNTS_1M( \ - "HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed" type, \ - freshness_periods_since_last_used); \ - } \ - } while (0) +#define CACHE_STATUS_HISTOGRAMS(type) \ + UMA_HISTOGRAM_ENUMERATION("HttpCache.Pattern" type, cache_entry_status_, \ + CacheEntryStatus::ENTRY_MAX) struct HeaderNameAndValue { const char* name; @@ -1030,7 +1019,7 @@ mode_ = NONE; // Keep track of the fraction of requests that we can double-key. - UMA_HISTOGRAM_BOOLEAN("HttpCache.TopFrameOriginPresent", + UMA_HISTOGRAM_BOOLEAN("HttpCache.NetworkIsolationKeyPresent", request_->network_isolation_key.IsFullyPopulated()); if (!ShouldPassThrough()) { @@ -2716,10 +2705,6 @@ validation_cause_ = VALIDATION_CAUSE_ZERO_FRESHNESS; } else { validation_cause_ = VALIDATION_CAUSE_STALE; - stale_entry_freshness_ = lifetimes.freshness; - stale_entry_age_ = response_.headers->GetCurrentAge( - response_.request_time, response_.response_time, - cache_->clock_->Now()); } } @@ -3378,45 +3363,6 @@ cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED || cache_entry_status_ == CacheEntryStatus::ENTRY_UPDATED; - bool stale_request = - validation_cause_ == VALIDATION_CAUSE_STALE && - (validation_request || - cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE); - int64_t freshness_periods_since_last_used = 0; - - if (stale_request && !open_entry_last_used_.is_null()) { - // Note that we are not able to capture those transactions' histograms which - // when added to entry, the response was being written by another - // transaction because getting the last used timestamp might lead to a data - // race in that case. TODO(crbug.com/713354). - - // For stale entries, record how many freshness periods have elapsed since - // the entry was last used. - DCHECK(!stale_entry_freshness_.is_zero()); - base::TimeDelta time_since_use = base::Time::Now() - open_entry_last_used_; - freshness_periods_since_last_used = - (time_since_use * 1000) / stale_entry_freshness_; - - if (validation_request) { - int64_t age_in_freshness_periods = - (stale_entry_age_ * 100) / stale_entry_freshness_; - if (cache_entry_status_ == CacheEntryStatus::ENTRY_VALIDATED) { - UMA_HISTOGRAM_COUNTS_1M("HttpCache.StaleEntry.Validated.Age", - stale_entry_age_.InSeconds()); - UMA_HISTOGRAM_COUNTS_1M( - "HttpCache.StaleEntry.Validated.AgeInFreshnessPeriods", - age_in_freshness_periods); - - } else { - UMA_HISTOGRAM_COUNTS_1M("HttpCache.StaleEntry.Updated.Age", - stale_entry_age_.InSeconds()); - UMA_HISTOGRAM_COUNTS_1M( - "HttpCache.StaleEntry.Updated.AgeInFreshnessPeriods", - age_in_freshness_periods); - } - } - } - std::string mime_type; HttpResponseHeaders* response_headers = GetResponseInfo()->headers.get(); if (response_headers && response_headers->GetMimeType(&mime_type)) { @@ -3456,6 +3402,10 @@ } CACHE_STATUS_HISTOGRAMS(""); + if (validation_request) { + UMA_HISTOGRAM_ENUMERATION("HttpCache.ValidationCause", validation_cause_, + VALIDATION_CAUSE_MAX); + } if (cache_entry_status_ == CacheEntryStatus::ENTRY_CANT_CONDITIONALIZE) { UMA_HISTOGRAM_ENUMERATION("HttpCache.CantConditionalizeCause",
diff --git a/net/http/http_cache_transaction.h b/net/http/http_cache_transaction.h index da341f2..bedd502 100644 --- a/net/http/http_cache_transaction.h +++ b/net/http/http_cache_transaction.h
@@ -620,8 +620,6 @@ base::TimeTicks send_request_since_; base::TimeTicks read_headers_since_; base::Time open_entry_last_used_; - base::TimeDelta stale_entry_freshness_; - base::TimeDelta stale_entry_age_; bool cant_conditionalize_zero_freshness_from_memhint_; bool recorded_histograms_; ParallelWritingPattern parallel_writing_pattern_;
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc index 172a86b..38a334daa 100644 --- a/net/http/http_cache_unittest.cc +++ b/net/http/http_cache_unittest.cc
@@ -9635,7 +9635,8 @@ RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction, trans_info, &response); EXPECT_FALSE(response.was_cached); - histograms.ExpectUniqueSample("HttpCache.TopFrameOriginPresent", false, 1); + histograms.ExpectUniqueSample("HttpCache.NetworkIsolationKeyPresent", false, + 1); RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction, trans_info, &response); @@ -9647,8 +9648,8 @@ RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction, trans_info, &response); EXPECT_FALSE(response.was_cached); - histograms.ExpectBucketCount("HttpCache.TopFrameOriginPresent", true, 1); - histograms.ExpectTotalCount("HttpCache.TopFrameOriginPresent", 3); + histograms.ExpectBucketCount("HttpCache.NetworkIsolationKeyPresent", true, 1); + histograms.ExpectTotalCount("HttpCache.NetworkIsolationKeyPresent", 3); // The second request should be cached. RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction, @@ -9730,8 +9731,8 @@ RunTransactionTestWithRequest(cache.http_cache(), kSimpleGET_Transaction, trans_info, &response); EXPECT_TRUE(response.was_cached); - histograms.ExpectBucketCount("HttpCache.TopFrameOriginPresent", true, 1); - histograms.ExpectTotalCount("HttpCache.TopFrameOriginPresent", 3); + histograms.ExpectBucketCount("HttpCache.NetworkIsolationKeyPresent", true, 1); + histograms.ExpectTotalCount("HttpCache.NetworkIsolationKeyPresent", 3); } TEST_F(HttpCacheTest, SkipVaryCheck) {
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 346b8e84..e88fd253 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -101,6 +101,7 @@ #include "net/spdy/spdy_test_util_common.h" #include "net/ssl/client_cert_identity_test_util.h" #include "net/ssl/ssl_cert_request_info.h" +#include "net/ssl/ssl_config.h" #include "net/ssl/ssl_config_service.h" #include "net/ssl/ssl_info.h" #include "net/ssl/ssl_private_key.h" @@ -360,6 +361,11 @@ return false; } + void UpdateSSLConfigAndNotify(const SSLConfig& config) { + config_ = config; + NotifySSLConfigChange(); + } + private: SSLConfig config_; }; @@ -21449,4 +21455,148 @@ trans2.reset(); } +// Test that SSLConfig changes from SSLConfigService are picked up even when +// there are live sockets. +TEST_F(HttpNetworkTransactionTest, SSLConfigChanged) { + SSLConfig ssl_config; + ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_3; + auto ssl_config_service = std::make_unique<TestSSLConfigService>(ssl_config); + TestSSLConfigService* ssl_config_service_raw = ssl_config_service.get(); + + session_deps_.ssl_config_service = std::move(ssl_config_service); + + // Make three requests. Between the second and third, the SSL config will + // change. + HttpRequestInfo request1; + request1.method = "GET"; + request1.url = GURL("https://foo.test/1"); + request1.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + + HttpRequestInfo request2; + request2.method = "GET"; + request2.url = GURL("https://foo.test/2"); + request2.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + + HttpRequestInfo request3; + request3.method = "GET"; + request3.url = GURL("https://foo.test/3"); + request3.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + + const MockWrite kWrites1[] = { + MockWrite("GET /1 HTTP/1.1\r\n" + "Host: foo.test\r\n" + "Connection: keep-alive\r\n\r\n"), + MockWrite("GET /2 HTTP/1.1\r\n" + "Host: foo.test\r\n" + "Connection: keep-alive\r\n\r\n"), + }; + + const MockRead kReads1[] = { + MockRead("HTTP/1.1 200 OK\r\n" + "Connection: keep-alive\r\n" + "Content-Length: 1\r\n\r\n" + "1"), + MockRead("HTTP/1.1 200 OK\r\n" + "Connection: keep-alive\r\n" + "Content-Length: 1\r\n\r\n" + "2"), + }; + + // The third request goes on a different socket because the SSL config has + // changed. + const MockWrite kWrites2[] = { + MockWrite("GET /3 HTTP/1.1\r\n" + "Host: foo.test\r\n" + "Connection: keep-alive\r\n\r\n")}; + + const MockRead kReads2[] = { + MockRead("HTTP/1.1 200 OK\r\n" + "Connection: keep-alive\r\n" + "Content-Length: 1\r\n\r\n" + "3")}; + + StaticSocketDataProvider data1(kReads1, kWrites1); + StaticSocketDataProvider data2(kReads2, kWrites2); + session_deps_.socket_factory->AddSocketDataProvider(&data1); + session_deps_.socket_factory->AddSocketDataProvider(&data2); + + SSLSocketDataProvider ssl1(ASYNC, OK); + ssl1.expected_ssl_version_max = SSL_PROTOCOL_VERSION_TLS1_3; + SSLSocketDataProvider ssl2(ASYNC, OK); + ssl2.expected_ssl_version_max = SSL_PROTOCOL_VERSION_TLS1_2; + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1); + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl2); + + std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_); + + TestCompletionCallback callback; + auto trans1 = + std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); + int rv = trans1->Start(&request1, callback.callback(), NetLogWithSource()); + EXPECT_THAT(callback.GetResult(rv), IsOk()); + std::string response_data1; + EXPECT_THAT(ReadTransaction(trans1.get(), &response_data1), IsOk()); + EXPECT_EQ("1", response_data1); + trans1.reset(); + + auto trans2 = + std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); + rv = trans2->Start(&request2, callback.callback(), NetLogWithSource()); + EXPECT_THAT(callback.GetResult(rv), IsOk()); + std::string response_data2; + EXPECT_THAT(ReadTransaction(trans2.get(), &response_data2), IsOk()); + EXPECT_EQ("2", response_data2); + trans2.reset(); + + ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2; + ssl_config_service_raw->UpdateSSLConfigAndNotify(ssl_config); + + auto trans3 = + std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); + rv = trans3->Start(&request3, callback.callback(), NetLogWithSource()); + EXPECT_THAT(callback.GetResult(rv), IsOk()); + std::string response_data3; + EXPECT_THAT(ReadTransaction(trans3.get(), &response_data3), IsOk()); + EXPECT_EQ("3", response_data3); + trans3.reset(); +} + +TEST_F(HttpNetworkTransactionTest, SSLConfigChangedPendingConnect) { + SSLConfig ssl_config; + ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_3; + auto ssl_config_service = std::make_unique<TestSSLConfigService>(ssl_config); + TestSSLConfigService* ssl_config_service_raw = ssl_config_service.get(); + + session_deps_.ssl_config_service = std::move(ssl_config_service); + + HttpRequestInfo request; + request.method = "GET"; + request.url = GURL("https://foo.test/1"); + request.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + + // Make a socket which never connects. + StaticSocketDataProvider data({}, {}); + session_deps_.socket_factory->AddSocketDataProvider(&data); + SSLSocketDataProvider ssl_data(SYNCHRONOUS, ERR_IO_PENDING); + ssl_data.expected_ssl_version_max = SSL_PROTOCOL_VERSION_TLS1_3; + session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data); + + std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_); + + TestCompletionCallback callback; + auto trans = + std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); + int rv = trans->Start(&request, callback.callback(), NetLogWithSource()); + EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); + + ssl_config.version_max = SSL_PROTOCOL_VERSION_TLS1_2; + ssl_config_service_raw->UpdateSSLConfigAndNotify(ssl_config); + + EXPECT_THAT(callback.GetResult(rv), IsError(ERR_NETWORK_CHANGED)); +} + } // namespace net
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index b3f13b1..1c4d90d 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -2525,7 +2525,6 @@ { "name": "bit-sentinel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitnet.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "buildkite.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "calvin.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cklie.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ckliemann.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ckliemann.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3767,7 +3766,6 @@ { "name": "atgseed.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "atgseed.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "authint.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "basnoslovno.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "basnoslovno.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bettrlifeapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "billninja.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3870,7 +3868,6 @@ { "name": "perfektesgewicht.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "perfektesgewicht.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "perplex.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pettsy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "please-deny.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pm13.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "postbox.life", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3890,7 +3887,6 @@ { "name": "ryansmithphotography.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "schnell-gold.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "selectel.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "sevsopr.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "silver-heart.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "slamix.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "smartpolicingplatform.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6027,7 +6023,6 @@ { "name": "kirara.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kirschbaum.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kirstin-peters.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "kisalt.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "klausimas.lt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kolaykaydet.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "konata.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6688,13 +6683,11 @@ { "name": "enteente.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "enveloppenopmaat.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "epanurse.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "erawanarifnugroho.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "erotalia.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "erp-band.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "erp.band", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "erpband.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "errolz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "estan.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "esteam.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "euanbaines.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "eulenleben.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7441,7 +7434,6 @@ { "name": "mediawikicn.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mikeg.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nalao-company.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nodi.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pekoe.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "php-tuning.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "prytkov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7449,7 +7441,6 @@ { "name": "s13d.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "saorsat.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sazuz.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "scotbirchfield.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sectia22.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shiftplanning.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "shinju.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7700,7 +7691,6 @@ { "name": "jennybeaned.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jr5proxdoug.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "juhakoho.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "kairion.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kaisers.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "karmaplatform.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "katekligys.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9505,7 +9495,6 @@ { "name": "missrain.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mixposure.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mizi.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "mjcaffarattilaw.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mkes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mkp-deutschland.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mktemp.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9667,7 +9656,6 @@ { "name": "olymp-arts.world", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "omniasl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "onefour.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "oneminute.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oneweb.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oneworldbank.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "onguardonline.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11245,7 +11233,6 @@ { "name": "nukute.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "numero-aleatorio.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ockendenhemming.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "oh14.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ojls.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ons.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "onearth.one", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13146,7 +13133,6 @@ { "name": "kartec.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kasadara.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kashmirobserver.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "kat.al", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kateduggan.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kati-raumplaner.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "katproxy.al", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -16008,7 +15994,6 @@ { "name": "clubeohara.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "curtissmith.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "curtis-smith.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "danbarrett.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cleanmta.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bityes.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "correct.horse", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -18852,7 +18837,6 @@ { "name": "schwarztrade.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "scoolcode.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sciencemonster.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "seccom.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pchospital.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "serverlauget.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "security-thoughts.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19210,7 +19194,6 @@ { "name": "valeriansaliou.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "viosey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vorangerie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "vldkn.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "visikom.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vicenage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vodpay.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -19686,7 +19669,6 @@ { "name": "blogconcours.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "black.host", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blogabout.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "biscoint.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "boss.az", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biovalue.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "britneyclause.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -20926,7 +20908,6 @@ { "name": "netdex.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "murz.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "neoclick.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nexthop.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nidsuber.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "noncombatant.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nellen.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -20940,7 +20921,6 @@ { "name": "netapps.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nginxyii.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "numbercult.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nexthop.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nylonfeetporn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nyanpasu.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "neolaudia.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22275,7 +22255,6 @@ { "name": "grusenmeyer.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gtcprojects.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "guesthouse-namaste.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "guide-peche-cantal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "guim.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "guineafruitcorp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gulleyperformancecenter.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22451,7 +22430,6 @@ { "name": "maxibanki.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "maximdens.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "maximiliankaul.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "maximov.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "maxkaul.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "may24.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mbs-journey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22671,7 +22649,6 @@ { "name": "scriptgates.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sebastian-janich.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "secondbyte.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "secretsanta.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "section-31.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "secwise.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seeworkdone.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -22877,7 +22854,6 @@ { "name": "witneywaterpolo.org.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wlci.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wmkowa.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "wohnbegleitung.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wolfram.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wollekorb.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wpsharks.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23116,7 +23092,6 @@ { "name": "aliwebstore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aljammaz.holdings", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aljmz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "allaboutbelgaum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "allamericanmuslim.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "allcovered.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "allensun.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -23692,7 +23667,6 @@ { "name": "croco.vision", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crop-alert.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "croquette.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "crossorig.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cruzeiropedia.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cryothanasia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crypted.chat", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -26447,7 +26421,6 @@ { "name": "www-746.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "www-771122.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "www-jinshavip.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "wxrlab.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wygibanki.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wygluszanie.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wygodnie.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -26912,7 +26885,6 @@ { "name": "betterworldinternational.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "berlin-flirt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "berthelier.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "better.fyi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bentphotos.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biaggeo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beraru.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -28339,7 +28311,6 @@ { "name": "lovetravel360.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "loyaleco.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lodgesdureynou.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "lordofthebrick.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lucid-light.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lojasviavento.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lojamascate.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -30883,12 +30854,10 @@ { "name": "ispsoft.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "joaosampaio.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "josemikkola.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "invisibles.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "inflexsys.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jawnelodzkie.org.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "italyinspires.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jose.eti.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ivyshop.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jpmelos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jpmelos.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "janaundgeorgsagenja.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -31693,7 +31662,6 @@ { "name": "stavros.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stephensol.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stephensolisrey.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "springfieldbricks.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "steph3n.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sunshinesf.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sonoecoracao.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -33469,7 +33437,6 @@ { "name": "arethsu.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ariba.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arizonaautomobileclub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "arjanvaartjes.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arjunasdaughter.pub", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "armeni-jewellery.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "arnoudraeven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -38332,7 +38299,6 @@ { "name": "servers4all.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shellj.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shellshock.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shoxmusic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sigma-signalisation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "significantbanter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simpleindianrecipes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -40952,7 +40918,6 @@ { "name": "ybscareers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yenibilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yetishirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yimgo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yocchan1513.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yoga-alliance-teacher-training.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yongbin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -41150,7 +41115,6 @@ { "name": "chatzimanolis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "checkmypsoriasis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cheesehosting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chicagolug.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chilio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chrislane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "christianpeltier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -43419,7 +43383,6 @@ { "name": "wallacehigh.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wallacequinn.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "waterdrop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "webgaff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weedcircles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wella-download-center.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "welpo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47693,7 +47656,6 @@ { "name": "urcentral.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "use.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uwelilienthal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vacationsbyvip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "varztupasaulis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "varztupasaulis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "varztupasaulis.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48171,7 +48133,6 @@ { "name": "intelhost.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "invuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipssl.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "irgendeine.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isabellavandijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isarklinikum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isastylish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48855,7 +48816,6 @@ { "name": "discord4j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dkstage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dns-swiss.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "domain-swiss.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "domeconseil.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "donkennedyandsons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doomtech.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49081,7 +49041,6 @@ { "name": "klebeband.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koe.hn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "koyo.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kroy.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kunstschule-krabax.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kyoto-sake.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lagodny.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50386,7 +50345,6 @@ { "name": "mivzakim.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mivzakim.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mivzakim.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mixinglight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mmaps.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mo2021.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52219,7 +52177,6 @@ { "name": "thebinarys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thebulletin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thecookiejar.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thefourthmoira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thefuckingtide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thehoryzon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thelatedcult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52371,7 +52328,6 @@ { "name": "xoonth.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yellowfly.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yhfou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yiheng.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yogahealsinc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourtrainingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yrjanheikki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -52431,7 +52387,6 @@ { "name": "aquelarreweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arnevankauter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arose.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "arrowheadflats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atelierfantazie.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "austinlockout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "austintxacrepairtoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53142,7 +53097,6 @@ { "name": "cursossena.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybercrime.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cypherpunk.observer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "deadinsi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "denwauranailab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devnull.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devragu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53244,7 +53198,6 @@ { "name": "lormansas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lucafontana.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lumminary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lunastrail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "m-gh.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "magic-cards.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "magiccards.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55314,7 +55267,6 @@ { "name": "trustedbody.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "truyenfull.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tuev-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tuimprenta.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tweedehandslaptophardenberg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uaci.edu.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ubcani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55560,7 +55512,6 @@ { "name": "fateitalia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "faultlines.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fbi.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fccarbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "feeeei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "feuerwehr-gebirge.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "finkmartin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55606,7 +55557,6 @@ { "name": "indiecongdr.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "info-screen-usercontent.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "interpol.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "introverted.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "invasivespeciesinfo.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "invinoaustria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "invinoaustria.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57369,7 +57319,6 @@ { "name": "tonigallagherinteriors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toomy.pri.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toool.nyc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tot-radio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totaldragonshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "touchstone.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradeshowfreightservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59059,7 +59008,6 @@ { "name": "vinigas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vitalium-therme.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vocescruzadasbcs.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "volqanic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vsl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vulyk-medu.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w889-line.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59454,7 +59402,6 @@ { "name": "sicurezzalavoro24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "siemencaes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "skateaustria.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "skywalkers.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slatko.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smitug.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smokefreerowan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60922,7 +60869,6 @@ { "name": "grenlandkiropraktor.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grupodatco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gtn-pravda.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "guchengf.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gx3.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gyakori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gzriedstadt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61380,7 +61326,6 @@ { "name": "plastic-id.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plumbercincoranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plusminus30.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "plutonx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ponio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ponxel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "porncompanions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -61819,7 +61764,6 @@ { "name": "bezposrednio.net.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bicycleuniverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bioastin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "biopronut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blackbyte.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blatnice.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blatnice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62334,7 +62278,6 @@ { "name": "ninjasquad.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nomaster.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nomik.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "o0o.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onesearay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oolsa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oroscopodelmese.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -63847,7 +63790,6 @@ { "name": "jesiensredniowiecza.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jmwap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jobbuddy.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jpoirierlavoie.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kappie.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kapsalonlinds.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keez.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64881,7 +64823,6 @@ { "name": "tvteam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twwd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ugy.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unknown.kyoto", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vdio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "venzagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "veronicaphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65211,7 +65152,6 @@ { "name": "tanovar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tauflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tchverheul.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tech-banker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thc-stadvdzon.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thecyberaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tmadev.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65219,7 +65159,6 @@ { "name": "topshelf.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totalaccessnicaragua.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "touhou.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tradavenue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trastornoevitacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tronlaserarena.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tsrv.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65389,7 +65328,6 @@ { "name": "flexve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "floodsmart.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "floristmou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "forever.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forthetoys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "founderio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fuzenet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65683,7 +65621,6 @@ { "name": "acp-integrative.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adarshcloud.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aditibhatia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aduthapa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "advancedelectricalservicesqld.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ae86x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "afree.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65932,7 +65869,6 @@ { "name": "notequal.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nxcd.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "odden.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "onair.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlinehaircuts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "orthodocspro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ourocg.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66237,7 +66173,6 @@ { "name": "b2families.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bachkhoa.net.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "badedesign.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "baldy.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ban.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "batiskaf.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "batteryboys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66472,7 +66407,6 @@ { "name": "elgrecohotel.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elitsa.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ell888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "email-pipeline.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emigratieplanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emiliobonelli.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enderle.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66652,7 +66586,6 @@ { "name": "k8668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaloni.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kartbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "karuna.community", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "katieriker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaypasocks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb09.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -68133,7 +68066,6 @@ { "name": "hingston.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hm5189.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "houhaoyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "howson.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hpvtimmerwerken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "html2gutenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hugonote.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71671,11 +71603,8 @@ { "name": "109k8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "113k8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "13-th.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "130ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "133ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "135416.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "137kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "155ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "159ks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "160763.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1661618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71734,7 +71663,6 @@ { "name": "918eej.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918ia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "918yy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "966ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "97735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "977kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9800.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72032,7 +71960,6 @@ { "name": "ks2000.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks28.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks28.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks308.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks32.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks36.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks55.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -72698,7 +72625,6 @@ { "name": "233hub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "23lhb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "291.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "360marketlaunch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "501117.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7893.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7894.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73210,7 +73136,6 @@ { "name": "ariyaoil.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arizana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "assaabloygaragedoors.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "asticon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asyikbelanja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "augehost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aurbrowser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73294,7 +73219,6 @@ { "name": "dtmbx.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dtmbx.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dtmbx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eclypsium.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eddy.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "educativetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edwardsgrounds.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73656,7 +73580,6 @@ { "name": "uglycat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uglycat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unadonna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unipart.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unityvox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "upbeatrobot.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "upbeatrobot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73682,7 +73605,6 @@ { "name": "vthebest9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vuasinhly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w-architectes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wallpapereg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wanekat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webcaptive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webtex.limited", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73710,7 +73632,6 @@ { "name": "0013d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0014d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0015d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "0018d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0020d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "002d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "003d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73719,7 +73640,6 @@ { "name": "007d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "00d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "022kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "027ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "02d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "03d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "03d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73766,7 +73686,6 @@ { "name": "1120317.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120319.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1120322.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120324.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120326.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120327.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73789,7 +73708,6 @@ { "name": "1120348.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1120350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "113kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1220301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1220302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1220303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73834,12 +73752,9 @@ { "name": "1220349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1220350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "127ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "130kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "131ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "132kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "134ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "136ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "150ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "151ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1520301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1520302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73877,13 +73792,8 @@ { "name": "1520348.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1520349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1520350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "152ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "153ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "153z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "154ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "156ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "157kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "157ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1620301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1620302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1620303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73927,8 +73837,6 @@ { "name": "1620343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1620350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1661618.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "170kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "171kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1720301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1720302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1720303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74020,8 +73928,6 @@ { "name": "182kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "182ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "182zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "183kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "184kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "185zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "187kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "188zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74032,7 +73938,6 @@ { "name": "1920305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2030404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "222zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "22kb88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3040507.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3040508.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3040517.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74053,11 +73958,9 @@ { "name": "47d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "48d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "518zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "555kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "555zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "588e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "58w66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "598ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "618btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "61d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "62222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74066,7 +73969,6 @@ { "name": "65d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "666zlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "66d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "66kb88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "70872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "70d88.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "74d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74077,7 +73979,6 @@ { "name": "8006d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8007d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8008d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8009d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8010d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8011d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8012d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74085,7 +73986,6 @@ { "name": "8015d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8016d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8017d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8018d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8019d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8021d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8022d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74104,31 +74004,14 @@ { "name": "8077d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8078d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8092d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8097d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8100d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8102d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8102d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8105d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8109d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8113d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8113d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8116d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8116d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8121d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8121d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8153d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8159d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8160d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8160d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8161d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8161d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8163d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8165d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8167d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8170d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8173d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8182d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8183d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8197d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8198d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8200d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74145,8 +74028,6 @@ { "name": "8802ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8805ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8809ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8820ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "8825ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "8830ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "886666d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74240,7 +74121,6 @@ { "name": "amtsinfo.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andrewjphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "animekaizoku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "anti-spy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anxietyspecialistsofatlanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anythinggraphic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aptekakolska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74293,7 +74173,6 @@ { "name": "calendriergn.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "careerdirectionsltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccuuu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cellphonemiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cheapsharedhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cheapsharedhost.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chicourologist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74301,7 +74180,6 @@ { "name": "chrisseoguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "christianmoore.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "churchofsaintbenedict.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ciel.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ciliberto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "claimflights.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "claimflights.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74319,7 +74197,6 @@ { "name": "computerguardians.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corsisicurezza.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cuteselfie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cyber-shield.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d8812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d8812.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d8813.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74449,7 +74326,6 @@ { "name": "doesinfotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "donghochinhhang.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dragontours.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "driver-updater.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dsreal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dzu.fund", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "e901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74461,7 +74337,6 @@ { "name": "ecmatching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eiadaladel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elranchofeliz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "engelmann.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enigmadjradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eos-utvalget.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ermessecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74474,9 +74349,7 @@ { "name": "fireflyiii.spdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "firerain.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "firmajulegaver.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "first-aid-kit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fite.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "forensic-system.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "funkydealz.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gardensquaredental.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gay-personal-ads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74499,7 +74372,6 @@ { "name": "hua-chuan.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hua-chuan.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icasebr.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "identity-inspector.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iflyi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ikisser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilovestickers.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74519,7 +74391,6 @@ { "name": "itdutchie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jaculus.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "japansm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jcphotography.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jehelpdesk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeps.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jeroendev.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74530,12 +74401,9 @@ { "name": "karimunsejahtera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kartikmohta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kashbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kashpoker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb4393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kb88111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb882.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kb88555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb8878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb88818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kb8885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74550,7 +74418,6 @@ { "name": "kiousis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kirkwood-smith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kisser.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kletswereld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klupper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "korob-ok.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kreyolgym.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74560,10 +74427,8 @@ { "name": "ks1519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks162.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks181.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks201.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks202.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks206.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks382.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks5888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74574,31 +74439,20 @@ { "name": "ks8805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8809.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8810.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks8821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8832.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks8835.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks8836.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks8852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8859.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8860.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks8865.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks8883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ks906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks920.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ks996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ksbet168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ksvip01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ksvip03.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ksvip10.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ksvip11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ksvip15.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kuscheln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "larpkalender.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74609,7 +74463,6 @@ { "name": "lilai5566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lilai838.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lilai99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lilaiw66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linosky.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "littles.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lkw-servis.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74619,7 +74472,6 @@ { "name": "lofstad.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loheprobado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long-8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "long-9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long113.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long139.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74628,7 +74480,6 @@ { "name": "long266.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long510.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "long566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long566.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long68.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "long688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74665,9 +74516,7 @@ { "name": "monsitemoncommerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moorelawfirmaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "motornaolja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "moviejack.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mrnathanpowell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "myformatconverter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysasiedzi.bialystok.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myunicornshops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "n886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74704,8 +74553,6 @@ { "name": "petrovich.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "philanima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phongthuyanthinh.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "photo-blowup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "photomizer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "photosaloncontest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pignus.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "podsvojostreho.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74814,7 +74661,6 @@ { "name": "vinmmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voevm.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "volvoconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w0181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w0185.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w0189.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w0191.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74837,7 +74683,6 @@ { "name": "w66918.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w6698.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w6886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w81518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wallisch.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wearefrantic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "websiteboost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76370,6 +76215,4602 @@ { "name": "zlhgc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zlhuodong.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zltymacau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "00004048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000a9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000x2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "000x3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "001yapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "00228.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0022bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "009597.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "00b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "01234048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "012345678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0138365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0139365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0165365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0175365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0185365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "018663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0195365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "038456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "038663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0393ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0393gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0393hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0393ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "03region.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "040552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "041552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "042552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "046552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "049552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050a1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050a2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050a3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050a4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050a5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "050a6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "051552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "054552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "065l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0681z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "068552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "068663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "071552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0737399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0768ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "078663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "083832.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "084552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "085851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "093113.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1-345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1003365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "100pudov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "100visits.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "107996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1112365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1116365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1119365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "111b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1120344.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1188bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1190america.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1199bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "11b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1220323.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234365z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "12344048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "12345678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1234a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "123seo.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "12n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "131365qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "142552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "146552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "146773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "148663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1517598.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1517668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1517669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1517883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1517886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1517889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "153kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "154552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "154922.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "16-qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "16qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "16region.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "178btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1831365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1832365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1834365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1837365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "188kb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1981365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "19990zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1baks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1cprosto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1hfree.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1malaysian.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2-678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2012review.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2013review.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2015review.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2018fifaworldcup.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "202jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2033z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "205jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "207ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "207vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "209vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "20n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2155hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "216vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22245j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22256j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22267j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22289j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "222b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "228668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2288bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "23454048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "23732.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "240vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "241552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "242552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "246773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2484811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2484822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2484833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2484855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848a.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848b.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848c.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848d.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848e.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848v.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848w.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848x.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848y.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848z.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "24848zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "248663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "25may.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "27878zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "284365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2kvn.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2lovebirdsblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3-789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3-800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3006789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "30n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3165365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3175365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317811111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "31782222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317822222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "31783333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317833333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "31784444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317844444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317855555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "31786666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317866666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178666666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317877777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178888888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "31789999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "317899999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3178yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3265623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "333b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3344985.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "335a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "33b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "33n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "348663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "350vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "351365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3539783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3557365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3558365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3559365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "360365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "362590.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3650607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3658200.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588834.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588845.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588856.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "36588890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365888dddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3659801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3659867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3659868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3659869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3659980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eiv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365eiw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365nnn.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365nnnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365r.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365rr.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365xxx.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y00.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365y99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365ypw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365zg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365zg.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "365zzz.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "369-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "37987.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3800611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "380111888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3809955.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "382228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3837z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "38irkutsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "391231.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "392365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3957z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "396301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "396302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "396303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "396304.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "396305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3963aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3963bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3963cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3963ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3963ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970200.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970300.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970400.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970700.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970900.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3970zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "39news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3danimation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3djava.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3w-solutions.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4001365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4002365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4003365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4004365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4005365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025361.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025362.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025363.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025364.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025366.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025367.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025368.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025369.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4025y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40481234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40482345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40484567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40485678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40486789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048kkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048lll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048mmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048ooo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048ppp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048qqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048rrr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048sss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048ttt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048vvv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048www.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048xxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048yyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4048zzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "408663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "40n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "416365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "418663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233331.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233332.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233334.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233335.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233336.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4233339.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "426773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4345.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "436773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "438663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "443658.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "444b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4455bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "44b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "451365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "456-3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "45674048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "458663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "476773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "486773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "497552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "498663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4best.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4dillusion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4tgw34.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5-600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5-890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "500wordessay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5017503.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5055990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "51365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "52002y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "520xpjxpj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "538vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "55554048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "555b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5566bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "55b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "55ks.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "55n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "56784048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5898657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "593-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59759vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59759z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981644.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981667.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981844.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5981z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59859h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59859j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59859k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59859l.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59859y.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59859z.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "598877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "59rus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5ilg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6-600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6-800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "605vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "60n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "611121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "611125.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "611165.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "611195.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "616675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "616btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "621nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "621vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "628vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "635-488.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "635-588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "635-788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "635-888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "635-988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365am.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365bj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365fj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365gd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365gs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365gx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365gz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365hb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365hk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365hlj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365hn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365jl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365js.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365jx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365ln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365nmg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365nx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365qh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365sc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365sd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365sh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365sx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365tj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365tw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365xj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365xz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365yn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6365zj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63960000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63961111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639611111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63962222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639622222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63963333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639633333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63964444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639644444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63965555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639655555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639666666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63967777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639677777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63968888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639688888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "63969999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "639699999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6396jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6520265.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "657843.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66321z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365a.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365b.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365c.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365d.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365e.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365f.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365g.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365i.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "663365k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "664048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666111bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666222bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666333bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666555bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66664048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666777bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666888bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66689j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6669255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666999bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "666btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6671365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6672365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6673365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6677bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "66b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677314.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677340.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677341.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677346.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677347.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677354.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677364.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "677384.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "678365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "678678365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "67894048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "67y7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "681vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68522c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68522k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68522m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68522s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68622a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68622b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "6863070.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "68722.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7-890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "70365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "70n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7111365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "71365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "721aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "733575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "73365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "74365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "753-9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "75365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755243.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755246.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755249.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755274.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755284.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755294.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "76365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "76678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "769k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77018aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77018bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77018cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77018dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77018ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77774048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "777btt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7788bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "77b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7888813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7888815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7888821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78904048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "789451.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "789453.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "789455.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "791188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "792ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "793ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "80365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "805vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "80651a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "80n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "811121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "812221.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "81365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "82781111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "82783333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "82784444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "82785555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "82786666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "82789999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8278yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8286hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8289hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "83365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "842365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "846773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "848663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "852-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8521.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8521.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8602013.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "860vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "861365z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866300.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866304.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866305.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866308.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866314.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866341.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866346.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866349.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866374.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "866394.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "87365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878365nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "878989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8810ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8836ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8855650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8855950.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8866012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88740z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8881234j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8882345j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888234j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8883456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888345j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8884567j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888567j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8886789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88884048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "888b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "88n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8914499.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8b8888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8btt.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8me.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9009019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "906vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "908vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "90920.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "90n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9110365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9111365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918-siteinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918101.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918aait.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918aav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918aff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918agr.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918arr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918baa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bbg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bip.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bis.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918bzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ccq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ccs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ccu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ccv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ccw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ccz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cgg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918crr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918css.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ctt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cvv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918cxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918dbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918dcc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918dde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ddx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918dkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918dpp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ebb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ecc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918edd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eef.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918een.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eeq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918eez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ejj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918emm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918epp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918err.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918euu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918fdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918fee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ffn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918hi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918hw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918iwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918jt.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918jwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918lwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918mh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918mo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918mz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918mzoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918pt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918qg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918qi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918rs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918rt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918sj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "918ze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "91d91.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "940365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "946773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "953-7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "956jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "96002.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "961705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "96678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "966ty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "97736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "97737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "97738.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "97739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9836952.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "988316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "99123j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "99456j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9977432.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "99789j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9988551.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9988959.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "99994048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "999b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "99n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a365vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a365vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a365vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a365vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a365vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a365vip9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a66.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6621.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6627.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6631.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6651.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6652.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6659.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6671.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6672.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6682.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6683.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6687.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6691.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "a6695.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aa4888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aa7666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aa793.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aadv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abanilla.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abc-solutions.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abc001.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abcode.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abdullahzubayerofficial.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abdurrahmangazidis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abdurrehman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abhishekkabdijain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abitech.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "about-bangladesh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aboutshakil.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abrahametalero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abrightspark.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abth.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "academy-awards.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accesoriosviaje.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accordable.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "achinsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acrobatic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acyclovir-cream.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "addnewsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "addyourlink.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adrian-riemer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adriatrans.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adrino.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adsviews.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adventry.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advokat-malinovskii.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advokaty-onlajn.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advokaty-yuristy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "affektblog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afganistan.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afghan.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aflebedevo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "africalebanon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ag66321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ag878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agarioforum.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agenux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agiosthomas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks116.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks135.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks139.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agks998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agrargruppe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agroplas.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agul.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aido.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airwolf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ajman-realty.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ajs5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akhabar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alantica.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alargarlavida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alaskarsbc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alatkesehatan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "albalatedelarzobispo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "albaniaonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alcamilo.cloudns.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aleftinka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alevi-forum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alevi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alexsandrasverden.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alfonsostriano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alisondavenport.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aliziolaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alko-stop.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alkor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allaboutreligions.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allcat.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allenwillis.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allfaucet.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alliance-clan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allo-luxembourg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allopurinol300mg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allright.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allwiki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alpha-centauri.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alsops.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altergalaxy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altisnet.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amberoad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ambrosio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amitriptyline-hydrochloride.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amphost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anachronis.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anagramma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andrewmcfarlane.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anekdot-pr.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "angepsychedelices.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "animalz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anime-drift.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "animedon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anirvalle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anonaddy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anonser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anothermusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antalyaescortyaren.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antarctica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antarctida.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antarktida.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anti-nsa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antihistory.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antijob.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antonoff.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apart-hotel-weimar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aperturelabs.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apkpokemongo.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "appworld.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apustaja.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aquabyte.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aquadecor.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arabia-news.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aral.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arandinacf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arcanetides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "archbishop.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "archwood.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "argumentative-essay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arheh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arielpereira.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ariixmex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aripiprazolee.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arithmetic.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armcar.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armeniaweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "armtopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arpumpsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "art-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artcaly.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artcar24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arti-islam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artificialplants.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artitbe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asdyx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiasmi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asjas.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "assemblage.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "assignacii.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atayia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atfstudios.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "attractieparken.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "augesen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "australianonlineappliances.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auto-skills.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autokeyinaustin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autorama.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoresponder.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoschool.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autotyreprest.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autovesti.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aviconverter.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avto-signal.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avtoucheba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avtoyurist.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "awningsydney.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aypotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azenot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azerinews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azora.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b-honey.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0000.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0305.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0306.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0307.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0308.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0309.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b03aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b03bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b03cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b0708.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b1111.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b3177.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b31aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b31bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b31cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b31dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b31ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b31ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b3333.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b3390.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b3391.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b3392.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b33app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36513.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36516.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36517.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b36520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b538.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5706.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5707.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5708.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5709.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b57bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b57cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b58365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b58appb58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b58appb58appb58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5903.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5908.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5909.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b5910.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b62h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6701.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6702.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6703.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6704.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6710.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6720.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6730.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6740.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b6750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b67771.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b67772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b67773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b67774.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b67775.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b68.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7306.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b73app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b73bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b73dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b73ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b73ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7501.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7502.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7503.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7507.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7508.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b7509.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b830.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b83kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b8831.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b88ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b89ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b89gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b89hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b960.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9912.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9954.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9961.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9967.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b9976.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baby-massage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "babybuddah.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "backgroundscreenersofamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bactrim-antibiotic.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bactrim.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "balaganlimited.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "balakovo-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ballast.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baloncestolliria.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baranmovie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barao.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barganhanaweb.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baseerapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "basketball-malavan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bazar.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bb057.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bb087.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bb211.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bb321.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bb882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "be4lead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beachpoint.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beatuprobot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beautyspot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beaver-creek.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beebeads.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bellecarmen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bellevueowners.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "belquant.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bembee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benatherton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benazir-reaction.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "benetcasablancas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berksnetworking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bernudrebes.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "best-book.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestboot.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestechgadgets.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "besthemes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestkeys.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestmedsmmj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestofbooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "besttrade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestwebcams.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet01vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet02vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet03vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet04vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet05vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet062.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet064.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet06vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet074.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet07vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet08vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet09vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet10vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet261.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet290.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet3602.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet3607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet3639.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365bc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365cnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365g8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365n1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365n2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365n6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365n8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365n9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365q0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365q6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365q8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365q9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365r8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365vip9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet365x9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet599.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet66669999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet666888.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet721.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bet916.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betaa9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betb33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betb73.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betxx1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betxx2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beverly.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beylkin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biaxin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigdiscounts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigprintinglasvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigthunder.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biletvkrym.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "billcompare.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "billcomparison.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "binf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biodobavki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biomeris.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bionicman.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biosearch.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bisix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitgain-leverage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitmag.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitstage.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biz-secrety.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biz-secrety.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biz-seecrets.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biznes-sekrety.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biznes-sekrety.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biznes-sekrety.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biznet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackoutzone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blacktubes.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blic-zajm.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blogaram.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blogcosmeticsurgeon.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bloodpop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluesnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bobcoffee.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodaneiranunez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boffin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bogwitch.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bolsa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bonaemi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bookslibrarybooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bordo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boredhousewifeconfessions.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bornreality.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bosattondskap.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boxdropcc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boykovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bozhok.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brainobeat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brainshare.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "branode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brasiltopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bratunaconline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bravica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breakcraft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brest-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brestnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brezani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brianvalente.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brianwilson.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridalweddingshow.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bringingbackthesweatervest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "britania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brosay-legko.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bruce-springsteen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brusselsexpoloft.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brusselsexpostudio.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bryanarmijomd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bt3655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bt3657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bt3658.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bta22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bta88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bte365app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bteapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt0101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt0505.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt0606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt11.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt1515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt175.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt187.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt216.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt221.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt222g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt226.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt2323a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt236.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt238.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt2525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt273g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt2929a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt494g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt583g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt6363a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt6868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt690g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt7272a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt7878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt829.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt830g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt8787a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt888g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt889g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt918958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btt9494.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btta16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "btta26.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bttp7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buddy-acceptance-authentication-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buddy-acceptance-profiles-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buddy-acceptance-users-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "budgetboats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bulgariablog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bulgariya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bulvar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bungabuket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buquesdeguerra.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buselefante.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bushland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "business-secreti.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "business-secreti.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "butterhost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-an-essay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-essay-online.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-lasix-without-a-doctor-s-prescription.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-los-angeles-auto-insurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-neurontin-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-seroquel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-sildalis.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buy-zofran.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buycitalopram.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buydiflucan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buydiflucan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buyfluoxetineonline.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buylasix.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buylevaquin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buymethotrexate.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buyrogaine.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "byemeds.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bystryj-zajm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "c30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cabecera-descendimiento.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cabelgrano.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cabezadelcaballo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cafenix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calaverasmedicalcannabis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calcioragusa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calposa.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cambodiainfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cameraslyphotography.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "camisado.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "canhq.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cantosdisidentes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "car-speed.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carfinans.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caribuku.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carmeni.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carolicious.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carousel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carrabiners.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carsshop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cartfilm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casalcrevillent.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casalinghedisperate.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casalribeiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "castalie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "castle.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "castleoblivion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "castrillodelavega.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "catalojic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caterbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "catiadecastro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccblicense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ccc88.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cctv-supraveghere.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdlinares.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "celadas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "celebritytopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centrum-edukacji.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cesium.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chardik.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chaussurerunning.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chaussuresmarche.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheap-life-insurance-quote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheapmedrol.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chefpablito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chezbernard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chinastory.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chispita.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chitinfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christianblog.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chrixonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chuvashia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cilacapnews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cinemadoma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cinexmachina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "city-forums.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clickforum.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clickphobia.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cliffburton.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "climatizzatore.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clipperses.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudninelandscapedesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "club-leondehuanuco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cm-loures.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codeidea.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codesgroup.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coeurdesushi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coginti.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colchonminicuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colley.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comeoneileen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comlipa.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "communist-party.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comprarcarteras.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compu-ofertas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compusrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "computeradvance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "condit.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "configurat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conflicting.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consoleuniverse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coolmath.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coomonte.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "copycenter.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "copywriting-on-demand.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "correctionsfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "corvee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cosmetique-totale.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coth.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "countrysidemarquees.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cpegypt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cpsa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cracksnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crafttalk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "craig-mullins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crapmail.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crazyhost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creditif.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creditor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cristals.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cristianonascimento.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cross-culture.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cubanchino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cubigames.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cucaracha.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cursomarketingdigitalmx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "customessaystation.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "customradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cutlinks.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cutmylink.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyber-yaroslavl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybercat-tver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybercave.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybergame-host.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberium-planet.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybermaniac.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberpanel.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberphoenix.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberquest.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybersound.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cytat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d-consultant.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d-soft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d588.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d88.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daemon-hentai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dahobo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dailynewsclubs.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dairikab.go.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dajiadu8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dakota-spain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dale-bancruz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danceylove.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dannygaidateraelgar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dannyjota.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dapoxetinagenerico.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dassolutions.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dataman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datenendlager.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datingsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dcareer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "de-mossadeq.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deantiguos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "debauchery.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "debitterballetjes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deblocking.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dedmoroz.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "defektologiya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "defifa.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "defterikebir.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deine-gitarre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deinelakaien.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deionized.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "delcan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "delcan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dellacasapizzasemassas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dementieva-pennetta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demicrofonos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demirdokum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "democracy-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denegmnogo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denejki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dengivdom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dentals.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denvernews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "departmentofoncology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "depelteau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "depleteduranium.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "depositomerci.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "derango.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deshevle-net.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "desportvriendenoverijse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "destroymc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detiks.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detki.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detreannamaria.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detyamobuv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "detyobuv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devcore.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devildog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devils-co.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "df5ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dfc52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dieta-figura.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "differentgirleveryday.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dimitrovi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "directed.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "directlendingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dirk-dogs.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disabuse.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "discodery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disconnect.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "distancelove.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dities.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "divistart.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dixi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dj16888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dj16888a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dj16888b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dj16888c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dj16888d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "djfafafa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dji-ars.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "djlove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "djslash.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dlyaribalki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doc-baza.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dockysearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "docogo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doctornaima.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doddy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dodikod.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dolce-vita-mia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doll.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domain-skachat.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domainforfree.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domainhostingcompany.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domlist.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domoset.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "donaldtrump.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doradoscampeon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dorogaminina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dostav.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dosyanet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doubleness.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "downloadfiles.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doxycyclineprices.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dragon31.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dranik.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dream-pools.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dreamcrack.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dreamwork.financial", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dreamworldstudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drianpublishing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "driv.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drivingacademy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drunkendropkes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dubaizone.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dubrava.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "durcal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "duxi-s-feromonami.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dy1d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dynamofanforum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dzus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-diabolo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-fishing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-informatyk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-peets.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-yachts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "earningthatis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "earthcorporation.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easyshare.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easywin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eblog.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eburg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecbt.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eco-flowplumbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eden-project-insight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edgarz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "educationtree.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee362.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee367.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee371.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee372.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee397.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee631.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee651.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee652.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee653.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee735.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ee973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "egonix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elcin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "electroforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "electromagnetism.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "electronicssrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "electroworld.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elektromotor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elephantia.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elikers.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elite-design.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elriacdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "em888.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emersoncanada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "endlesswebsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enerypa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "englandschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eniziolab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enoisdaturma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enrack.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enrique-monroy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "entertainmentblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enwikipedia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "epal.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "epicenter.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erasure.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erevan-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eridas.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ersinbiltekin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "escueladego.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "esmejor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "essay-writing-topics-fce.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "essaymaker.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "essenerbaeder.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "estaryshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "euman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "euroshop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eusarse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "evadental.institute", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eveaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eventosformativos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "everberg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "everglowtrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "examsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "examticket.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exciters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exotic-bengal-cattery.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expert-voronezh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expertpaintersvt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "explosionstereo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expouniverse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exsanio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "extremfrank.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eyetooth.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ezik-ido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9850.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9854.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9880.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9882.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9884.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f9885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "factslider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fairyth.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fake-show.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fakes-ru.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fakt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fall.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fanclubrbdmaniaromania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fantasyfoot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "farberplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "farmaspeed.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fashionlistify.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fasturl.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "festivalpopayan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ffvideo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "filesuffix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fimozin.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fimp.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "finance-news.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "findlocalproduce.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "finestrabatalera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "finlito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fioritic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "firenews.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fizadvocaten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fkraiem.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flamengopi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flashgamedev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "floorballphilippines.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "florenciasabio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flyawaybirds.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "folar.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "footballsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ford-mustang.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forfeit.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forum-egypte.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forum-gilee.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forum-noginska.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forumirc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forumpakistan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fotofon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fourscore.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frail.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fralippolippi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frankieburkeactor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frankieruiz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "free-bitco.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "free-generate.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "free-traff.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freebegames.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freedogecrypt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freedombankva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freedomisslavery.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freemotion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freetrung.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freifall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freiwuppertal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fruit-farm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fukt.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fungomoscow.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "futbol-tv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fyss.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g3homefoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g47.web.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gablesportsga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gabryjeluk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gadgetstock.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaelico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gagramore.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galaktika-znakomstv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galaxyplex.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gamerspost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gameserver-admin.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gamingx.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gammaphibeta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gastronom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gathegi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gazoz.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gdesemena.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "genen.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geoffnussmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geonice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "georgekaraoglanis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gerbang-singkolo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geroiplavska.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geschaeftsideen-ebook.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "get-california-real-estate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "getpromo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gfac.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gfronline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giovannarossi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "givepenny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glebov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gnezdo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "go-kuwait.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "godall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gogomail.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goldenage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goquiqstatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gorodrostov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gosaavd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goug1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goug3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goug6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goug7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gougeaway.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gpswebsoft.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gpz500s.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grafik.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greeknewspapers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grekiskagudar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "griffinsrfc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grilllness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grokandtonic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grumpyseb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grupdedansa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grupoauxteclic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gruzoperevozki.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gugs.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guidethailande.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guillen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guitarangel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gunerds.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guzelforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gvitebsk.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gymnastic.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gyroscopicinvesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h6852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h6853.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h6895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h6913.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h9386.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "habernet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hackthat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hair-guide.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haircutideas.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hakimova.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "halilweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handymanbypolli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hardrock.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hb6365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "health24world.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healthystyle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heijmans.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "helbreath.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "helloafrica.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "herqqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hexsafe.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg2018hg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg61388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg62388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg67388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg67855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg67877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg72988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg97188.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg97288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg97388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg97588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hg97688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hiddenimage.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hieisuki.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hightechreviews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hilarious.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hindibaba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hindu-temple.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "holini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hollywoodstars.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homophobia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "honeybrooklibrary.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hongki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hongorw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hongosdemexico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hoon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "host4me.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hostingdirectory.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hotelsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hotmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "housedesigninfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "houstongaragedoorsrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "huaxingui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hydrasecurity.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy80.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy81.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy82.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy83.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy85.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy89.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyhy98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i36588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i7sas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iamwill.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "icelandic.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ient.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ifconfig.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ifiveglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ifolder.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ignatij.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ikari-san.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ikx.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilg.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iligang.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iligang.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iligang.net.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilovesamara.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iloveyoutoo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilug-ktm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilumantio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imolights.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inalvittile.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inbound.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indexmarket.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indiafm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indianapolisnews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indianerschmuck24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indigobooks.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indigostudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indonesian-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indospot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infinitelightofbeing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "info-bolivia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "informat.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inglesencanada.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inin.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inlineskating.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "innico.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "insiberia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intercrosse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internet42.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internetmagaz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intimznakomstvo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ip40.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irajsingh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iranfilmcity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iranonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iraqinews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ireland.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irob.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ironraven.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isae-supaero.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isae.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "islamabadcourt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "islamnewss.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ismadgeintrouble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "israelnewswire.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "it4sure.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "italiatopnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "italik.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itezu.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ittgame.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itzkavin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iweathernet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32661.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32662.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32664.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32665.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32771.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32774.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j32775.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j5563.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j5573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j70111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j70222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j70333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j70444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j7051.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j7052.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j7053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j70555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j8846.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j9943.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jackrussel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "janelle-jamer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "janellequintana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japantravel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "javaexpert.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "javiermascherano.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jennifertilly.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jerisandoval.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jesseonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jesusvasquez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jino.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha1234567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha12345678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha168.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha2228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha2288.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha66669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha6969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha8888888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinsha99999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johan-koffeman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnpenny.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnpenny.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jolfamarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jomsolat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jongcaxent.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jongtonghapkido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jose-latino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "joseenriquegonzalez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "josefernandomorilloardila.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "journeyfitness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jovenescontraelaburrimiento.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jqk918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js636.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "js638.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jsidefox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "julia-clarete.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jungyonghwa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juppy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "just-heberg.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "just-keep-swimming.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "justknigi.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "k1958.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "k30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaatsen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kabachok.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kafel-ufa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kai-ruecker.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi001.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi03.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi06.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaishi998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kak-pohudet-legko.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kalashnikov.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaliningrad.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kalsa.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kandhamal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karantholdings.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karapuzz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kashbet666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katalog-serverov.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katalog-tovarov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kathleendeisher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb0303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb035.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb036.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb06.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb07.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb1515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb2727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb283.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb3131.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb3434.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb3535.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb4141.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb4242.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb4343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb4747.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb5252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb5656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb5pt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb673.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb702.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb7070.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb7474.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb7676.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb786.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb864.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8881.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb8898.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88dc01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88dc03.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88dc11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88dc24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88dc27.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88dc29.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88md07.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88md13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88md18.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88md19.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb88md30.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb896.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb930.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb963.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb965.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb9696.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kb975.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kbhgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kbty0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kbxlu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kegelschiene.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kemerovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keramed.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ketoconazole.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kevinvanderperren.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keyworth-meadow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khakasiya.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khakasiya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khakassia.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khakassia.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khakassia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khakassia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kilo-files.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kimberleythomson.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinglier.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kino-doma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinodrom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinosha.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinovsem.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinozone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kirov.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kirovcity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kirovgrad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kismy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kleinhaneveld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koba.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "korancode.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koroleva.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "korund.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "krakozyabra.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kravmagaangers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kresimir-blazevic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kryptologie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks-19.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks-39.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks-49.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks-59.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks-79.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks01.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks016.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks02.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks023.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks038.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks05.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks051.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks06.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0660.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks07.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0768.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0770.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0778.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks08.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks080.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks082.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks083.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0838.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks085.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks087.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0878.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks09.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0977.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks0996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks1010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks143.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks156.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks191.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks196.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks209.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks210.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks213.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks214.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks256.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks257.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks2626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks281.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks282.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks288.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks2888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks2888.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks296.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks298.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks299.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks335.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks338.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks339.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks3535.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks3737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks380.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks381.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks385.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks386.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks388.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks3939.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks4040.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks4242.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks5014.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks5050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks516.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks5353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks541.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks549.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks556.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks556.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks5606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks596.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks597.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks6.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks600.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks602.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks626.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks6363.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks641.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks6565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks6690.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks6767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks687.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks69.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks692.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks7272.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks7373.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks79.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8186.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks88.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8820.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8826.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks883.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8839.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8869.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8884.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks89.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks8989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks9.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks915.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks9393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks960.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks9696.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks9797.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks9888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks99.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks996.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kst-service.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ksvip02.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ksvip04.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ksvip09.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kswinwin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ktuluweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kukeri-karlovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kupislivki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kurd-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kurgancity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuznica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kylie-pomada.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kyrylych.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "l30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "l3l365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "la-paco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "labandadelamente.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lablnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lada-granta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laencina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laramewa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasdelgadas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lavozdelamusicachilena.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lbc-podcast.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ld66999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ld699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ld6999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "learnhowtoplayguitar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "learningladderacademy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lesbianlovers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "letaman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "letdownloads.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leu365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lg.gz.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "li.gz.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liberty-city.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "librarium.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libruis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifekirov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liftmastercloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lightcraftmc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lightfoot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "limbaido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "limitlessinteractive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lindgrenracing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linestriperdepot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linkwheel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linonin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lion7.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lipacom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lisadelbo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "littlelucifercafe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "livelink.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "livenewsrussia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locabir.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lockerroomstories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locksmithservice-humble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locksmithssanmarcostx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locksmithstaffordtx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locomen.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "london-mafia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "long8079.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lorimullins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lorisfnotary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loveismystyle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lucarautti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ludolust.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luizlopes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lukaszuk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lukaszuk.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lukezweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lux-house.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luxhome.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lyna.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "m30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "m365m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "macon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "madeira.gov.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "madgeandpaul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "madgech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "madgeisawesome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maewongaming.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magaconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maggot.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magic-cheerleading.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magisternegi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mailinabox.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maladie-autoimmune.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malariaadvice.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maleperformancepills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maltasite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maltaultrastifo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mangaworld.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marblemosaics.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "margolis.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mariahandnasty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marufmusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvaco.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "masalaband.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "masdemariette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mass.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mathiteia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mati.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matthieuchedidweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matuslab.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mauriceje.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maveeranpasupathi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max-apk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max-phone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max00365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max0365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max11365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max1365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max22365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max2365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max33365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max3365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max4365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max44365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max5365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max55365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max6365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max66365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max7365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max77365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max8365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max88365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "max9365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maxclean.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mayito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mayre-idol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mazavto.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbetb33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbetb73.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbetbtt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbte365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbtt365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "me-news.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "med-line.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medalofvalor.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mediagetnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medichat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medivox.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "megawebsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mehibo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "melatonin.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "melda-agustin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meliyb.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mesabi.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metaljournal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metalliran.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metrodemaracaibo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mevsim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mezedokamomata.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "micontractortraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mido.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miguelito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "milan-news.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "milavica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "militarysrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "milkmoovement.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mill.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minaio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minibrewery.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mink-coat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miragg.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mirkvartir.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mitiad.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mix-channel.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miyanaga.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mkbet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mmcalc.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobileague.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobinst.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobsitin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobtop.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moburst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mogica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moldova-online.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moldovanka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moldovawall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "molodost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "momocrats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moneta-rossii.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mongolbox.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "monkeysorce.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mononom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moonwolfwiccanschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moraldehornuez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moroccanews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moroccotodaynews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mortengamstpedersen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moscow-moscow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moscow-new.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mosnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mostlymuttz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motoscascos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motun.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrlove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "muhabbet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mullinsfarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "multigamers-net.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "multischool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "murmansk.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "musicradio.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mutualmoney.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "my-bratsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "my-tunisia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myarcade.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mychamberlain.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mychamberlain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mychamberlain.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mychemromance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mygreatwebsite.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mykursumlija.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myliftmaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myliftmaster.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mylight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mylkguys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mymerlin.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mymerlin.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mypenza.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mypfp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mypvhc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myqbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myraboats.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mystore24.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myxxxsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "n30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "na-kipre.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nabeez.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nabokov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nacocu.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nakedinkas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nameshield.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nameshield.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nancyzone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nandito.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "napominanie.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "narrabeenlakesbikehire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naruto-best.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nataez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "natasabekvalac.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naturalcosmetics.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naturelk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nay.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nazarenoviso.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nba-officecenter.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neboley.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neofilia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neoverso.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nert.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netrabota.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nevergirl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "new-smile.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newillusion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newimage.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newlovers.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newlovers.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newlytricks.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "news-sy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "news123.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "news12elite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "news53today.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "news54.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsbali.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsbusiness.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newscultural.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsinkansas.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsinpolitics.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsireland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsuk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newsvideo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorknews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nextpost.company", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nicoleta-prestescu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nightwishchile.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "niituva.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nika-travel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nikitenko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nikolahost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nikolai-schmidt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nina-woerz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "no-real.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nocturnus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nokya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nontonfilem.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nopajam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "norala.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nordicsrit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "northkoreainsider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nou9ta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novak.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novanetwork.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novokuznetsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novoselie.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "now101atm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nullscripts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "numericall.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nurmio.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "o30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "o365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "o3c.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oakparkmedicalcentre.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oaktravel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "obmen-viz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "obnalichka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "occultisme.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "odysseytraining.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ogamerezine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oghost.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ogo-knigi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oimexico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ok118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ok7779.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "okpo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldaine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldbkcom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldcity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldfieldmusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldiesmusicguide.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldriver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olesaradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olivejs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ollo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omretreats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "one-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlineautodealered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinecasinolisboa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onurerhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ooo-santal.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "operanavigation.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opncld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oposicionesprofesores.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orangtua.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orel-sait.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "organise.earth", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ortaev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "otdyh-v-abhazii.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "otoplenie-ufa.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ouwerling.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oxymail.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ozonstyle.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p2d.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58201.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58202.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58203.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p58205.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p888010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9120.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9125.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9136.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9162.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9165.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9167.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9195.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9196.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91ab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91ac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91ad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91ae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91af.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91ag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p91aj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p9cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paintbrush.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pakistan24.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pamc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panamatravel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panangelium.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pandithaya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panoramahurtowni.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "papakonstantinou.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paperplatefun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paramaquetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paranoidandroid.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parfumer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parkefficient.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parrocchiadimeana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pasnederland.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pasteht.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pastorello.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "patioroof.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pattayafruitgarden.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paulandmadge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pavelitus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcbmarketing.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcisecuritystandards.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcissc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pdc.wales", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peacekeeper.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pearcom.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peliculasonline1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "penholder.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pensioner-1000.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pentamexicali.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "penza-on-line.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "penza-today.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "penzaonline.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perevedut.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perevirka.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perewall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perpetual.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "personvernnemnda.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perulinks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pervoklass.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "petrotrustlibya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "petrozavodsk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peturnashes.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pharmaceuticalcannabis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philarmonic-abaza.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philippinenewsvanguard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philosophers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phuket-nash.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pierreterrien.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pigb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pilesyk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pinchuk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pionieren.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pipenav.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pivbar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pivotanimation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pizzariapartiupizza.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21499.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21566.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21599.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21887.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21991.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21992.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21993.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21994.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21995.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21997.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pj21z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pjshop.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pkq5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planeta-remontika.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "playingvideojuegos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pleasanton-daycare-childcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pleasantonmobilenotary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plenkanaotrez.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poetenblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poker4all.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pokeram.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polimer39.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polisipati.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "politicsandnews.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "politicsnews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polliconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polskienewsy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pomorskibereg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "popova.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "postoyanstvo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "potgrowersunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "potkani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pozharnyi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pp234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pradeek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "praiss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pravoslavie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pravoslavnayarus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pravosudie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "preference.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "premised.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "presidentdirectory.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prevention-formation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pridnestrovye.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "progeste.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "programmatv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "projectfreehosting.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prostitutki-narvskaja.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prosto-dengi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "protek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prototyping-computer.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psihotest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psixotest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psixotesty.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psw-training.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ptupapers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "public-measures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pucogid.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "purchasescooters.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "purrfectlove.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "putana.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "putanypitera.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "q30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "q365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "q88588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qdrat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qq6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qqq6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qqq63.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qqq67.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quantumfinance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qubhockey.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "queirozmiotto.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quiqstatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "r30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "raballder.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "racaliz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radioh.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radionrg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radiopharereims.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radiorainbow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radmehrco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rainbowsmoothies.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rajaealhoceima.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ralix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rapport.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rascals.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ratgeber-guide.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "razgon.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "razvlekuha.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "razvlekuhablog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rdviitd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reallycooljobs.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "realpaella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "recherchegruppe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redeyeguatemala.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redunion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "refluxogastroesofagico.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "regata2015.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "region-vologda.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rejido.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "remedee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reminisceaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "remont-kvartirvmoskve.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "requena.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rescuer.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reshka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "retailing.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reut42.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "revisoronline.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "revizor-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rezka-burenie.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rgpdkit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riba-lov.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riddickthemovie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rido.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ridvan-vllasaliu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roadtripusa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roamfreun.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robertoullan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robuxemporium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rockslideengineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rodinka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rolandozarate.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roofer.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roomee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rosa-spain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rosbiznes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rosstroj-balashiha.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rotaractclubtucuman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rothbruederlein.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roxburytech.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rssfeedonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rubbaduckee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruchka-mashinka.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruexpert.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rufartabs.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruffnecks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruknguk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rumenka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "runame.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruoskachile.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rusexmany.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rushmyessay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "russian-page.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rust.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruthiehallarsis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ryabinushka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "s30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sabians.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sacians.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sadoun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "safefreehost.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "safesoundcounselingllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sainshand.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saint-peterburg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saint-petersburg.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saint-petersburg.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saint-petersburg.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saintip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saintpetersburg.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saintpetersburg.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saintpetersburg.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salesactivities.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salvadorinfantil.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sambuchanan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samiratv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samvui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sandwichcouncil.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanfranciscopersonalinjuryattorney.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sangen.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanluisdequillota.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "santibanezdetera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "santjoandevilassar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sapibatam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saratov24.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saratovlive.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saratovnews.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saratovtime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sarhua.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sbgroup.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sc21.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scandinaviancorner.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scarinex.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schellebelle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schoolroom.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schoolstats.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schwarzenberg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scooter-experts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scotthelmesucks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scoutsanbartolome.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scrapbookdecorations.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scriptomania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scurtam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seabrooklocksmith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "second-life-partner-ichien.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "secretagentclub.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "secumailer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "secumailer.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "secumailer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selimcerkezi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selo-cer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "senhorst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seo-obmen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seo-phpbb.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seo-piar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seoonline.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seoserfing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seoviziti50.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seozel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "septonol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serverninja.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serviefectivo.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "setevik.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sevastopol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shadowfight2.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shanhay.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sharik-msk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shaytan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shechipin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sheffield-wednesday-fc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shelehov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shenderman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shijij.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shirevirtual.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiriforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiva-temple.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shola.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shop-slivki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shopera.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shouldbetaught.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "showmethegadgets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "showslivki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shrapnel.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sidmax.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sikaranbrotherhood.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "silvertorrents.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sim-mobile.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simsimi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sincronizateconlosmilagros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sinews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sinluzvenezuela.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sion-colony.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sirandorung.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "siscompbolivia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "site-ua.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "site.mu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sitekatalog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sitesdesign.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skaiman.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skante.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skateswagger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skirts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sky-live.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slipknot-site.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartcover.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartleads.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartphone-blog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smcasino.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smcasino.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smiblog.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sms-pro.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "snatch-note.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sngnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "snowboardforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "snsirius.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sochionline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "socialair.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sociedadsostenible.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softbit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sokak-sanati.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soldierangels.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solidsteel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solunci-loznica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "someserver.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "somosabc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "son-onlajn.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "son-tolkovatel.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sonodrom.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sosaka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sot-te.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soundtube.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spacewallpaperhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spaenny.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sparkl.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sparklesvt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sparklingessentials.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spartancoin.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spiritous.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sporemasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sports-sites.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spotzlight.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "springhow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sritalaska.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sritcities.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "srithunters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sritidaho.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sritspanish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sritvermont.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "standartgost.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "starsandmanifolds.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stealthpressurewashers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stebenkov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stefchapman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sterlitamak.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stevemario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stevemason.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stilsvadba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stonetribute.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stoplossoff.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "storefront.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strikers.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stroiproect.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "studio-abok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stupidthoughts.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stupino-stroy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stylebeat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "subdivider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "successemails.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sucessclick.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sudanindependent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sudanindependent.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suecaunitedfc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sugatime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sugos.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suicide.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sumatrabarat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sumatrautara.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sumatriptan365.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "summarized.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sunshilin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sunshinelife.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suomenkielisetnettikasinot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superbestpalsclub.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superdrillers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supermagna.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superservers.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superstargossip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superstarhost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supertrade.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surnganet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surveer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suseki.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swissurf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sy635.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8809.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8817.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t8830.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88vip7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t88yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taanishsaifu.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tabacundo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tablerocksbestrealtors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tadalafilindia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taggigkaktus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taigamehack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tambov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tamoxifen-citrate.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tarotistasvidentes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tatary.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tattoo-art.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tauriscia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taxce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamrevolution.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teazer.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "technowise.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techserve.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techwalker.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teka.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telephoni-cdma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tempdomain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "templete.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "temporarysanity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "terengganudaily.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "termoidraulico.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "test-school.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "testthis.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "textpages.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo0000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo0088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo1111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo2222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo3333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo4444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo5555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo6688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo7777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo7788.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo8899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgo9988.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgoaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgoall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tgoasia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thaiboystory.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thaihotmodels.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thaiportal.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "the51news.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theandroidsoul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thebacteriafight.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thebestlaos.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thecarpenters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theknockout.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theminiacs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thenest.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theparoxetine.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theproject.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thetopmovie.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thewashingmachine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thomastestor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thomsons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "threepercentrealty.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thuongtravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiagosimao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tierarzt-karlsruhe-durlach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tigerfm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tigergroup.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tihvin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiles-for-facing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "time-business.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "time-hotel.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timerace.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timgame.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timich.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timmi6790.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tips4india.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tirteafuera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "titanforged.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tixio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tobiasfischer.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tolerance-zero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tomsk.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tonorosario.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "top-russian.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "top10media.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topknot.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topspin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topurls.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tormox.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "torontonews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "torrance.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "totalhost.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "touchka.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tourism-exegetai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toursinvietnam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toyschina.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toysplace.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tracking-app.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tradebotcompany.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "traderinside.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trafic-wap.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trapkitchen.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelphilippines.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelwithsearats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trazodononline.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treatmentforkennelcough.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trials.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tribalwarsstyles.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tribistovo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tricountyathome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tridentmedia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trilogyforce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "triplicate.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "troop89medfield.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trotter.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trusthook.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tryingtotakeovertheworld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt0766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt0866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt0966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt2866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt2966.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt3666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt3699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt3766.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt3999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt7199.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt7299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt7399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt8166.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt8266.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt8366.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tt9799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tula-city.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tula-news.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tuneotune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tunisiapress.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turbosuflantecluj.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turciya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turkey-portal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turkishhackers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turkmannews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turtlehead.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tutdevki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tutorialcoding.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tvoia-dietka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twainhartehotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twodrinksaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty513.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty529.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty561.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty562.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty573.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty583.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty587.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty613.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty632.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty679.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty715.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty716.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty723.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty756.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty785.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty793.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty835.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty853.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty857.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty935.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty937.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty953.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty965.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ty980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tyumen.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tyva.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tyva.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "u30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uareferat.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uberhorny.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uborka-kvartir-moskva.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ucmatedeveloper.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "udbina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "udien.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ulsters.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ultimate-fireworks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ultimatebabyshowergifts.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ultrafine.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unasim.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unbolt.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unboxed.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "undertow.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unexpectedcompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unitir.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uniuni.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "universidadcatolica.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unixhost.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unxcoconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uplinkgame.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uppfinnarenc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ural-emal.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urlfly.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "usercompare.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utahrealestatepodcast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utbosbeekhuuske.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utevai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uu378.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uzbekkizlari.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uzbektumblers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uzhas-uzhasny.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v05666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v1.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v10006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v10008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v1951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v3025.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v33v33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v44v44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v5075.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55530.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55580.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55590.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v55v55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v6021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v6170.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v6350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v6506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66557.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66615.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66629.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66635.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v66638.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v6752.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v6791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v700a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v700b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v700w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v76555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v88299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v88511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v88559.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v88656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v88799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9820.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v9831.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vacati0n.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valencianisme.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valeravi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vardenafilhcl.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "varianto25.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "varjo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vasheradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vatav.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vbm11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vbm22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vbm33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vegetarier-sind-moerder.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veggies.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vektlofting.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "velib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "venezianischemasken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vengriya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veredadelaestrella.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verstka.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vestlundbolargen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veusveus.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "victorcarrasco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "victorhorta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vidassemfronteiras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vietnam-tours.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vildlaithailand.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "villablino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vinit.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vip-moda.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vipcp.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visionxcreative.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visit-thailand.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visiter-tunis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visual-design.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vitaliyshepotkov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vkarpaty.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vladimir.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vlcentre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vmf365.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vneftekamske.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns168.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns377j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns5151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns5353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns5656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns5757.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns5858.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns5959.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6262.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6363.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6767.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns68611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns68655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns68669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6868.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns68722.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vns6969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vnsr112233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voetbalclubinfo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "volosnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vovkamagazine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vremyachko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vrostove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs106.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs107.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs1177.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs1717.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs2277.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs2828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs5050.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs5151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs601.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs603.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs6060.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs6161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs680.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs7711.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs8899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs9911.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vs9977.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vsaratove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vsem-privet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vstavropole.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vulcancycling.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vulgar-teens.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vysokoe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w000999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w123123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w234234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w456456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w567567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w66w66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w678678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w789789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w888099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w9710.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w9720.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w9730.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w9740.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w9750.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97app2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97app3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "w97cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waermekabine.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waimanu.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wajs1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wajs2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wangshengze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wapbet365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wapnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wash-house.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "water-polo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wealthcreationsolutions.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "web-format.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "web-test.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webdesignersinchennai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webinator.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weblights.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webmaster16.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webranking.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "websitedesignersmalappuram.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "websitedesignprice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "websitepromotion.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wellnesshotel-weimar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "west-raptors.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whisperwashonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whiterabbit.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wicontractortraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wien52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wikisorg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wildandwonderfulbodycare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wildberries.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wilgo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wing-tsun.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wither.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wizardschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wkhs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns68123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns6852.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns6862.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns68622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns6865.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns68666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wns6872.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wnsr3970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wolflambert.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wonderlab.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woorocket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wordops.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wordpresssetup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worldcarding.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worldoflegion.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wulfrun-invicta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ww6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x10006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x2816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3515.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3802.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3803.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3804.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3805.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3816.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x3927.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x58z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5902.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5903.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5906.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5907.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5908.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x5910.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7713.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7715.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7716.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7719.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7782.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7785.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x7795.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x77ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8100000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8111111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8122222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8133333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8144444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8155555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8166666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8177777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8188888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x8199999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81mm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81nn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81oo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81pp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81rr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81ss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81tt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81uu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81vv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x81zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x9015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x9701.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x98z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x993.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab199.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab678a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab678b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab678c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab678d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xab899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xaba.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xacker.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xarangallomangallo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xenical.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xerdeso.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xh7xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xloud.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xmyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--4brt03c.xn--io0a7i", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--7or43h.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--bcher-bestseller-jzb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--bcherbestseller-zvb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--eebao6b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--schcke-yxa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj000444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj000555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj000666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj567088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj567288.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj567388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj567888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpj678678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpjai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpjbeting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xpjcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xucha.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xx6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09app.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y09x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y3650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y36500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y3651.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y36511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y3653.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y3654.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y3656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y36577.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y6180.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68am.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68bj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68cd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68fj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68gd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68gl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68gs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68gx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68gz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68heb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68hf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68hk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68hlj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68hn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68hz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68jl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68jn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68jx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68ln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68nj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68nm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68nx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68qh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sjz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68sz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68tj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68tw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68xg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68xj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68xz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68yn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y68zj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y70101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y70102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y70103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y70104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y70105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y7091.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y7092.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y7093.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y890000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y891111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y892222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y893333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y894444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y895555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y896666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y897777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y898888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89aaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89ddd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89fff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89ggg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y89zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yagoda-malina.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yangfamily.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yantox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan365.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapan999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapanwang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yaws.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yellowsquid.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yemenlink.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yenbainet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yeniexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yepmom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yerbasbuenas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yesteryear-chronicle.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yiluup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yoloyolo.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yordanisp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youcanhelp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youla.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youngmodelsagency.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "your-forum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "your-greece.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youreward.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yourmagicstory.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yuandan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yukoslibrary.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yy153.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yy393.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yy6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "z30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zackiarfan.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zadrot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zagruz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zaija.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zaim15min.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zajm-ehkspress.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zajmy-contact.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zajmy-contact.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zajmy-contact.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zajmy-contact.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zala.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zambianewsforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zamenim.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zandra.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zappingarahal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zapreaders.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zaruhi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zcrypto.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zd8883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zegriesalmansa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zemlyaki.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zen-zone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zepter.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zepter.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zero-knigi.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhivoj-dom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zinabnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zindan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ziroux.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zizibook.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zl8585.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zl8873.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zloybot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "znanje.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "znich.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zoepolitics.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zok-ambicija.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zoko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zonaperu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zowe.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zsoltbereczki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zumberak.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zverskij-site.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zzzz365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/log/net_log.cc b/net/log/net_log.cc index 040173eb..9fbe4e6 100644 --- a/net/log/net_log.cc +++ b/net/log/net_log.cc
@@ -76,16 +76,6 @@ UpdateObserverCaptureModes(); } -void NetLog::SetObserverCaptureMode(NetLog::ThreadSafeObserver* observer, - NetLogCaptureMode capture_mode) { - base::AutoLock lock(lock_); - - DCHECK(HasObserver(observer)); - DCHECK_EQ(this, observer->net_log_); - observer->capture_mode_ = capture_mode; - UpdateObserverCaptureModes(); -} - void NetLog::RemoveObserver(NetLog::ThreadSafeObserver* observer) { base::AutoLock lock(lock_);
diff --git a/net/log/net_log.h b/net/log/net_log.h index 6c2c9d21..dd04c0ec 100644 --- a/net/log/net_log.h +++ b/net/log/net_log.h
@@ -245,13 +245,6 @@ void AddObserver(ThreadSafeObserver* observer, NetLogCaptureMode capture_mode); - // Sets the log capture mode of |observer| to |capture_mode|. |observer| must - // be watching |this|. - // TODO(eroman): Remove the capability to dynamically change observer's - // capture mode. - void SetObserverCaptureMode(ThreadSafeObserver* observer, - NetLogCaptureMode capture_mode); - // Removes an observer. // // For thread safety reasons, it is recommended that this not be called in
diff --git a/net/log/net_log_unittest.cc b/net/log/net_log_unittest.cc index 8e009c8..38b2fe8 100644 --- a/net/log/net_log_unittest.cc +++ b/net/log/net_log_unittest.cc
@@ -65,7 +65,7 @@ TestNetLog net_log; for (NetLogCaptureMode mode : kModes) { - net_log.SetCaptureMode(mode); + net_log.SetObserverCaptureMode(mode); EXPECT_EQ(mode, net_log.GetObserver()->capture_mode()); net_log.AddGlobalEntry(NetLogEventType::SOCKET_ALIVE, @@ -208,11 +208,6 @@ ASSERT_EQ(net_log_, observer_.net_log()); ASSERT_EQ(NetLogCaptureMode::kIncludeSensitive, observer_.capture_mode()); - net_log_->SetObserverCaptureMode(&observer_, - NetLogCaptureMode::kEverything); - ASSERT_EQ(net_log_, observer_.net_log()); - ASSERT_EQ(NetLogCaptureMode::kEverything, observer_.capture_mode()); - net_log_->RemoveObserver(&observer_); ASSERT_TRUE(!observer_.net_log()); } @@ -284,12 +279,6 @@ AddEvent(&net_log); EXPECT_EQ(1, observer.count()); - // Change the observer's logging level and add an event. - net_log.SetObserverCaptureMode(&observer, NetLogCaptureMode::kEverything); - EXPECT_EQ(&net_log, observer.net_log()); - EXPECT_EQ(NetLogCaptureMode::kEverything, observer.capture_mode()); - EXPECT_TRUE(net_log.IsCapturing()); - AddEvent(&net_log); EXPECT_EQ(2, observer.count()); @@ -301,7 +290,8 @@ AddEvent(&net_log); EXPECT_EQ(2, observer.count()); - // Add the observer a final time, and add an event. + // Add the observer a final time, this time with a different capture mdoe, and + // add an event. net_log.AddObserver(&observer, NetLogCaptureMode::kEverything); EXPECT_EQ(&net_log, observer.net_log()); EXPECT_EQ(NetLogCaptureMode::kEverything, observer.capture_mode());
diff --git a/net/log/test_net_log.cc b/net/log/test_net_log.cc index adf29b94..3c345dc 100644 --- a/net/log/test_net_log.cc +++ b/net/log/test_net_log.cc
@@ -14,96 +14,60 @@ namespace net { -// TestNetLog::Observer is an implementation of NetLog::ThreadSafeObserver -// that saves messages to a buffer. -class TestNetLog::Observer : public NetLog::ThreadSafeObserver { - public: - Observer() = default; - ~Observer() override = default; - - // Returns the list of all entries in the log. - void GetEntries(TestNetLogEntry::List* entry_list) const { - base::AutoLock lock(lock_); - *entry_list = entry_list_; - } - - // Fills |entry_list| with all entries in the log from the specified Source. - void GetEntriesForSource(NetLogSource source, - TestNetLogEntry::List* entry_list) const { - base::AutoLock lock(lock_); - entry_list->clear(); - for (const auto& entry : entry_list_) { - if (entry.source.id == source.id) - entry_list->push_back(entry); - } - } - - // Returns the number of entries in the log. - size_t GetSize() const { - base::AutoLock lock(lock_); - return entry_list_.size(); - } - - void Clear() { - base::AutoLock lock(lock_); - entry_list_.clear(); - } - - private: - // ThreadSafeObserver implementation: - void OnAddEntry(const NetLogEntry& entry) override { - // Using Dictionaries instead of Values makes checking values a little - // simpler. - std::unique_ptr<base::DictionaryValue> param_dict = - base::DictionaryValue::From( - base::Value::ToUniquePtrValue(entry.params.Clone())); - - // Only need to acquire the lock when accessing class variables. - base::AutoLock lock(lock_); - entry_list_.push_back(TestNetLogEntry(entry.type, base::TimeTicks::Now(), - entry.source, entry.phase, - std::move(param_dict))); - } - - // Needs to be "mutable" to use it in GetEntries(). - mutable base::Lock lock_; - - TestNetLogEntry::List entry_list_; - - DISALLOW_COPY_AND_ASSIGN(Observer); -}; - -TestNetLog::TestNetLog() : observer_(new Observer()) { - AddObserver(observer_.get(), NetLogCaptureMode::kIncludeSensitive); +TestNetLog::TestNetLog() { + AddObserver(this, NetLogCaptureMode::kIncludeSensitive); } TestNetLog::~TestNetLog() { - RemoveObserver(observer_.get()); -} - -void TestNetLog::SetCaptureMode(NetLogCaptureMode capture_mode) { - SetObserverCaptureMode(observer_.get(), capture_mode); + RemoveObserver(this); } void TestNetLog::GetEntries(TestNetLogEntry::List* entry_list) const { - observer_->GetEntries(entry_list); + base::AutoLock lock(lock_); + *entry_list = entry_list_; } void TestNetLog::GetEntriesForSource(NetLogSource source, TestNetLogEntry::List* entry_list) const { - observer_->GetEntriesForSource(source, entry_list); + base::AutoLock lock(lock_); + entry_list->clear(); + for (const auto& entry : entry_list_) { + if (entry.source.id == source.id) + entry_list->push_back(entry); + } } size_t TestNetLog::GetSize() const { - return observer_->GetSize(); + base::AutoLock lock(lock_); + return entry_list_.size(); } void TestNetLog::Clear() { - observer_->Clear(); + base::AutoLock lock(lock_); + entry_list_.clear(); } -NetLog::ThreadSafeObserver* TestNetLog::GetObserver() const { - return observer_.get(); +void TestNetLog::OnAddEntry(const NetLogEntry& entry) { + // Using Dictionaries instead of Values makes checking values a little + // simpler. + std::unique_ptr<base::DictionaryValue> param_dict = + base::DictionaryValue::From( + base::Value::ToUniquePtrValue(entry.params.Clone())); + + // Only need to acquire the lock when accessing class variables. + base::AutoLock lock(lock_); + entry_list_.push_back(TestNetLogEntry(entry.type, base::TimeTicks::Now(), + entry.source, entry.phase, + std::move(param_dict))); +} + +NetLog::ThreadSafeObserver* TestNetLog::GetObserver() { + return this; +} + +void TestNetLog::SetObserverCaptureMode(NetLogCaptureMode capture_mode) { + RemoveObserver(this); + AddObserver(this, capture_mode); } BoundTestNetLog::BoundTestNetLog() @@ -130,8 +94,8 @@ test_net_log_.Clear(); } -void BoundTestNetLog::SetCaptureMode(NetLogCaptureMode capture_mode) { - test_net_log_.SetCaptureMode(capture_mode); +void BoundTestNetLog::SetObserverCaptureMode(NetLogCaptureMode capture_mode) { + test_net_log_.SetObserverCaptureMode(capture_mode); } } // namespace net
diff --git a/net/log/test_net_log.h b/net/log/test_net_log.h index d13c34dc0..68ae88a 100644 --- a/net/log/test_net_log.h +++ b/net/log/test_net_log.h
@@ -20,33 +20,42 @@ struct NetLogSource; -// TestNetLog is NetLog subclass which records all NetLog events that occur and -// their parameters. It is intended for testing only, and is part of the -// net_test_support project. -class TestNetLog : public NetLog { +// NetLog subclass that attaches a single observer (this) to record NetLog +// events and their parameters into an in-memory buffer. The NetLog is observed +// at kSensitive level by default, however can be changed with +// SetObserverCaptureMode(). +// +// This class is for testing only. +class TestNetLog : public NetLog, public NetLog::ThreadSafeObserver { public: TestNetLog(); ~TestNetLog() override; - void SetCaptureMode(NetLogCaptureMode capture_mode); + void SetObserverCaptureMode(NetLogCaptureMode capture_mode); - // Below methods are forwarded to test_net_log_observer_. + // ThreadSafeObserver implementation: + void OnAddEntry(const NetLogEntry& entry) override; + + // Returns the list of all observed NetLog entries. void GetEntries(TestNetLogEntry::List* entry_list) const; + + // Fills |entry_list| with all entries in the log from the specified Source. void GetEntriesForSource(NetLogSource source, TestNetLogEntry::List* entry_list) const; + + // Returns the number of entries in the log. size_t GetSize() const; + void Clear(); - // Returns a NetLog observer that will write entries to the TestNetLog's event - // store. For testing code that bypasses NetLogs and adds events directly to + // Returns the NetLog observer responsible for recording the NetLog event + // stream. For testing code that bypasses NetLogs and adds events directly to // an observer. - NetLog::ThreadSafeObserver* GetObserver() const; + NetLog::ThreadSafeObserver* GetObserver(); private: - // The underlying observer class that does all the work. - class Observer; - - std::unique_ptr<Observer> observer_; + mutable base::Lock lock_; + TestNetLogEntry::List entry_list_; DISALLOW_COPY_AND_ASSIGN(TestNetLog); }; @@ -76,8 +85,8 @@ void Clear(); - // Sets the capture mode of the underlying TestNetLog. - void SetCaptureMode(NetLogCaptureMode capture_mode); + // Sets the observer capture mode of the underlying TestNetLog. + void SetObserverCaptureMode(NetLogCaptureMode capture_mode); private: TestNetLog test_net_log_;
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc index e30e647..e8cc93be 100644 --- a/net/socket/ssl_client_socket_unittest.cc +++ b/net/socket/ssl_client_socket_unittest.cc
@@ -2387,7 +2387,7 @@ TestCompletionCallback callback; TestNetLog log; - log.SetCaptureMode(NetLogCaptureMode::kEverything); + log.SetObserverCaptureMode(NetLogCaptureMode::kEverything); std::unique_ptr<StreamSocket> transport( new TCPClientSocket(addr(), nullptr, &log, NetLogSource())); int rv = callback.GetResult(transport->Connect(callback.callback()));
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc index b89b518b..fef88b2 100644 --- a/net/socket/udp_socket_unittest.cc +++ b/net/socket/udp_socket_unittest.cc
@@ -651,8 +651,6 @@ socket.Close(); } -#if !defined(OS_FUCHSIA) -// TODO(https://crbug.com/900709): SO_REUSEPORT doesn't work on Fuchsia. #if defined(OS_IOS) // TODO(https://crbug.com/947115): failing on device on iOS 12.2. #define MAYBE_SharedMulticastAddress DISABLED_SharedMulticastAddress @@ -711,7 +709,6 @@ EXPECT_EQ(kMessage, RecvFromSocket(&socket2)); #endif // !defined(OS_CHROMEOS) } -#endif // !defined(OS_FUCHSIA) #endif // !defined(OS_ANDROID) TEST_F(UDPSocketTest, MulticastOptions) {
diff --git a/net/ssl/ssl_platform_key_util.h b/net/ssl/ssl_platform_key_util.h index eaf9ccc..02729fec 100644 --- a/net/ssl/ssl_platform_key_util.h +++ b/net/ssl/ssl_platform_key_util.h
@@ -25,7 +25,8 @@ // background thread to avoid problems with buggy smartcards. Its underlying // Thread is non-joinable and as such provides // TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN semantics. -scoped_refptr<base::SingleThreadTaskRunner> GetSSLPlatformKeyTaskRunner(); +NET_EXPORT_PRIVATE scoped_refptr<base::SingleThreadTaskRunner> +GetSSLPlatformKeyTaskRunner(); // Returns the public key of |certificate| as an |EVP_PKEY| or nullptr on error. bssl::UniquePtr<EVP_PKEY> GetClientCertPublicKey(
diff --git a/net/ssl/test_ssl_private_key.h b/net/ssl/test_ssl_private_key.h index 2fa6c1a..2201594 100644 --- a/net/ssl/test_ssl_private_key.h +++ b/net/ssl/test_ssl_private_key.h
@@ -6,7 +6,6 @@ #define NET_SSL_TEST_SSL_PRIVATE_KEY_H_ #include "base/memory/ref_counted.h" -#include "net/base/net_export.h" #include "third_party/boringssl/src/include/openssl/base.h" namespace crypto { @@ -19,11 +18,11 @@ // Returns a new SSLPrivateKey which uses |key| for signing operations or // nullptr on error. -NET_EXPORT scoped_refptr<SSLPrivateKey> WrapOpenSSLPrivateKey( +scoped_refptr<SSLPrivateKey> WrapOpenSSLPrivateKey( bssl::UniquePtr<EVP_PKEY> key); -NET_EXPORT scoped_refptr<SSLPrivateKey> WrapRSAPrivateKey( +scoped_refptr<SSLPrivateKey> WrapRSAPrivateKey( crypto::RSAPrivateKey* rsa_private_key); -NET_EXPORT scoped_refptr<SSLPrivateKey> CreateFailSigningSSLPrivateKey(); +scoped_refptr<SSLPrivateKey> CreateFailSigningSSLPrivateKey(); } // namespace net
diff --git a/net/ssl/threaded_ssl_private_key.h b/net/ssl/threaded_ssl_private_key.h index 21c0483..a769331 100644 --- a/net/ssl/threaded_ssl_private_key.h +++ b/net/ssl/threaded_ssl_private_key.h
@@ -15,6 +15,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "net/base/net_export.h" #include "net/ssl/ssl_private_key.h" namespace base { @@ -25,7 +26,7 @@ // An SSLPrivateKey implementation which offloads key operations to a background // task runner. -class ThreadedSSLPrivateKey : public SSLPrivateKey { +class NET_EXPORT ThreadedSSLPrivateKey : public SSLPrivateKey { public: // Interface for consumers to implement to perform the actual signing // operation.
diff --git a/net/url_request/redirect_info.h b/net/url_request/redirect_info.h index 524adf95..0984bd0 100644 --- a/net/url_request/redirect_info.h +++ b/net/url_request/redirect_info.h
@@ -63,6 +63,8 @@ // The new first-party URL for cookies. GURL new_site_for_cookies; + // DEPRECATED TODO: Remove this as it was introduced for the cache key and can + // be removed now that |network_isolation_key| is set for the redirect cases. base::Optional<url::Origin> new_top_frame_origin; // The new HTTP referrer header.
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc index ab88571..dee56a4 100644 --- a/net/url_request/url_request_http_job.cc +++ b/net/url_request/url_request_http_job.cc
@@ -323,12 +323,6 @@ request_info_.method = request_->method(); request_info_.network_isolation_key = request_->network_isolation_key(); - // TODO(crbug.com/963476): Remove this when network_isolation_key is being set - // in request_ for most cases. - if (!request_info_.network_isolation_key.IsFullyPopulated()) { - request_info_.network_isolation_key = - NetworkIsolationKey(request_->top_frame_origin()); - } request_info_.load_flags = request_->load_flags(); request_info_.traffic_annotation =
diff --git a/pdf/draw_utils/coordinates.cc b/pdf/draw_utils/coordinates.cc index d3ed045..e7d6138 100644 --- a/pdf/draw_utils/coordinates.cc +++ b/pdf/draw_utils/coordinates.cc
@@ -12,6 +12,11 @@ namespace chrome_pdf { namespace draw_utils { +void ExpandDocumentSize(const pp::Size& rect_size, pp::Size* doc_size) { + int width_diff = std::max(0, rect_size.width() - doc_size->width()); + doc_size->Enlarge(width_diff, rect_size.height()); +} + pp::Rect GetScreenRect(const pp::Rect& rect, const pp::Point& position, double zoom) { @@ -24,5 +29,27 @@ return pp::Rect(x, y, right - x, bottom - y); } +pp::Rect GetLeftRectForTwoUpView(const pp::Size& rect_size, + const pp::Point& position, + const PageInsetSizes& page_insets) { + DCHECK_LE(rect_size.width(), position.x()); + + pp::Rect left_rect(position.x() - rect_size.width(), position.y(), + rect_size.width(), rect_size.height()); + left_rect.Inset(page_insets.left, page_insets.top, page_insets.right, + page_insets.bottom); + return left_rect; +} + +pp::Rect GetRightRectForTwoUpView(const pp::Size& rect_size, + const pp::Point& position, + const PageInsetSizes& page_insets) { + pp::Rect right_rect(position.x(), position.y(), rect_size.width(), + rect_size.height()); + right_rect.Inset(page_insets.left, page_insets.top, page_insets.right, + page_insets.bottom); + return right_rect; +} + } // namespace draw_utils } // namespace chrome_pdf
diff --git a/pdf/draw_utils/coordinates.h b/pdf/draw_utils/coordinates.h index a11424f..0e2586d 100644 --- a/pdf/draw_utils/coordinates.h +++ b/pdf/draw_utils/coordinates.h
@@ -14,6 +14,21 @@ namespace chrome_pdf { namespace draw_utils { +// Struct for sending the sizes of the insets applied to the page to accommodate +// for shadows/separators. I.e. the left component corresponds to the amount a +// page was inset on the left side. +struct PageInsetSizes { + int left; + int right; + int top; + int bottom; +}; + +// Given |rect_size|, sets the width of |doc_size| to the max of |rect_size|'s +// width and |doc_size|'s width. Also adds the height of |rect_size| to +// |doc_size|'s height. +void ExpandDocumentSize(const pp::Size& rect_size, pp::Size* doc_size); + // Given |rect| in document coordinates, a |position| in screen coordinates, and // a |zoom| factor, returns the rectangle in screen coordinates (i.e. 0,0 is top // left corner of plugin area). @@ -23,6 +38,22 @@ const pp::Point& position, double zoom); +// Given |rect_size|, create a pp::Rect where the top-right corner lies at +// |position|, and then inset it with the corresponding values of |page_insets|, +// i.e. inset on left side with |page_insets.left|. +// The width of |rect_size| must be less than or equal to the x value for +// |position|. +pp::Rect GetLeftRectForTwoUpView(const pp::Size& rect_size, + const pp::Point& position, + const PageInsetSizes& page_insets); + +// Given |rect_size|, create a pp::Rect where the top-left corner lies at +// |position|, and then inset it with the corresponding values of |page_insets|, +// i.e. inset on left side with |page_insets.left|. +pp::Rect GetRightRectForTwoUpView(const pp::Size& rect_size, + const pp::Point& position, + const PageInsetSizes& page_insets); + } // namespace draw_utils } // namespace chrome_pdf
diff --git a/pdf/draw_utils/coordinates_unittest.cc b/pdf/draw_utils/coordinates_unittest.cc index af4424a5..897e40e 100644 --- a/pdf/draw_utils/coordinates_unittest.cc +++ b/pdf/draw_utils/coordinates_unittest.cc
@@ -10,6 +10,38 @@ namespace chrome_pdf { namespace draw_utils { +namespace { + +constexpr PageInsetSizes kLeftInsets{5, 1, 3, 7}; +constexpr PageInsetSizes kRightInsets{1, 5, 3, 7}; + +} // namespace + +TEST(CoordinateTest, ExpandDocumentSize) { + pp::Size doc_size(100, 400); + + // Test various expansion sizes. + pp::Size rect_size(100, 200); + ExpandDocumentSize(rect_size, &doc_size); + EXPECT_EQ(100, doc_size.width()); + EXPECT_EQ(600, doc_size.height()); + + rect_size.SetSize(200, 150); + ExpandDocumentSize(rect_size, &doc_size); + EXPECT_EQ(200, doc_size.width()); + EXPECT_EQ(750, doc_size.height()); + + rect_size.SetSize(100, 300); + ExpandDocumentSize(rect_size, &doc_size); + EXPECT_EQ(200, doc_size.width()); + EXPECT_EQ(1050, doc_size.height()); + + rect_size.SetSize(250, 400); + ExpandDocumentSize(rect_size, &doc_size); + EXPECT_EQ(250, doc_size.width()); + EXPECT_EQ(1450, doc_size.height()); +} + TEST(CoordinateTest, GetScreenRect) { pp::Rect screen_rect; const pp::Rect rect(10, 20, 200, 300); @@ -92,5 +124,124 @@ EXPECT_EQ(0, screen_rect.height()); } +TEST(CoordinateTest, GetLeftRectForTwoUpView) { + pp::Rect left_rect; + + left_rect = GetLeftRectForTwoUpView({200, 400}, {300, 100}, kLeftInsets); + EXPECT_EQ(105, left_rect.x()); + EXPECT_EQ(103, left_rect.y()); + EXPECT_EQ(194, left_rect.width()); + EXPECT_EQ(390, left_rect.height()); + + left_rect = GetLeftRectForTwoUpView({300, 400}, {300, 0}, kLeftInsets); + EXPECT_EQ(5, left_rect.x()); + EXPECT_EQ(3, left_rect.y()); + EXPECT_EQ(294, left_rect.width()); + EXPECT_EQ(390, left_rect.height()); + + // Test rect smaller than shadow insets returns empty rect. + left_rect = GetLeftRectForTwoUpView({5, 5}, {10, 0}, kLeftInsets); + EXPECT_EQ(10, left_rect.x()); + EXPECT_EQ(3, left_rect.y()); + EXPECT_EQ(0, left_rect.width()); + EXPECT_EQ(0, left_rect.height()); + + // Test empty rect gets positioned. + left_rect = GetLeftRectForTwoUpView({0, 0}, {100, 0}, kLeftInsets); + EXPECT_EQ(105, left_rect.x()); + EXPECT_EQ(3, left_rect.y()); + EXPECT_EQ(0, left_rect.width()); + EXPECT_EQ(0, left_rect.height()); +} + +TEST(CoordinateTest, GetRightRectForTwoUpView) { + pp::Rect right_rect; + + right_rect = GetRightRectForTwoUpView({200, 400}, {300, 100}, kRightInsets); + EXPECT_EQ(301, right_rect.x()); + EXPECT_EQ(103, right_rect.y()); + EXPECT_EQ(194, right_rect.width()); + EXPECT_EQ(390, right_rect.height()); + + right_rect = GetRightRectForTwoUpView({300, 400}, {300, 0}, kRightInsets); + EXPECT_EQ(301, right_rect.x()); + EXPECT_EQ(3, right_rect.y()); + EXPECT_EQ(294, right_rect.width()); + EXPECT_EQ(390, right_rect.height()); + + // Test rect smaller than shadow insets returns empty rect. + right_rect = GetRightRectForTwoUpView({5, 5}, {10, 0}, kRightInsets); + EXPECT_EQ(11, right_rect.x()); + EXPECT_EQ(3, right_rect.y()); + EXPECT_EQ(0, right_rect.width()); + EXPECT_EQ(0, right_rect.height()); + + // Test empty rect gets positioned. + right_rect = GetRightRectForTwoUpView({0, 0}, {100, 0}, kRightInsets); + EXPECT_EQ(101, right_rect.x()); + EXPECT_EQ(3, right_rect.y()); + EXPECT_EQ(0, right_rect.width()); + EXPECT_EQ(0, right_rect.height()); +} + +TEST(CoordinateTest, TwoUpViewLayout) { + pp::Rect left_rect; + pp::Rect right_rect; + pp::Point position(1066, 0); + + // Test layout when the widest page is on the left. + left_rect = GetLeftRectForTwoUpView({826, 1066}, position, kLeftInsets); + EXPECT_EQ(245, left_rect.x()); + EXPECT_EQ(3, left_rect.y()); + EXPECT_EQ(820, left_rect.width()); + EXPECT_EQ(1056, left_rect.height()); + + right_rect = GetRightRectForTwoUpView({1066, 826}, position, kRightInsets); + EXPECT_EQ(1067, right_rect.x()); + EXPECT_EQ(3, right_rect.y()); + EXPECT_EQ(1060, right_rect.width()); + EXPECT_EQ(816, right_rect.height()); + + position.set_y(1066); + left_rect = GetLeftRectForTwoUpView({826, 1066}, position, kLeftInsets); + EXPECT_EQ(245, left_rect.x()); + EXPECT_EQ(1069, left_rect.y()); + EXPECT_EQ(820, left_rect.width()); + EXPECT_EQ(1056, left_rect.height()); + + right_rect = GetRightRectForTwoUpView({826, 900}, position, kRightInsets); + EXPECT_EQ(1067, right_rect.x()); + EXPECT_EQ(1069, right_rect.y()); + EXPECT_EQ(820, right_rect.width()); + EXPECT_EQ(890, right_rect.height()); + + // Test layout when the widest page is on the right. + position.set_y(0); + left_rect = GetLeftRectForTwoUpView({1066, 826}, position, kLeftInsets); + EXPECT_EQ(5, left_rect.x()); + EXPECT_EQ(3, left_rect.y()); + EXPECT_EQ(1060, left_rect.width()); + EXPECT_EQ(816, left_rect.height()); + + right_rect = GetRightRectForTwoUpView({826, 1066}, position, kRightInsets); + EXPECT_EQ(1067, right_rect.x()); + EXPECT_EQ(3, right_rect.y()); + EXPECT_EQ(820, right_rect.width()); + EXPECT_EQ(1056, right_rect.height()); + + position.set_y(1066); + left_rect = GetLeftRectForTwoUpView({826, 900}, position, kLeftInsets); + EXPECT_EQ(245, left_rect.x()); + EXPECT_EQ(1069, left_rect.y()); + EXPECT_EQ(820, left_rect.width()); + EXPECT_EQ(890, left_rect.height()); + + right_rect = GetRightRectForTwoUpView({826, 1066}, position, kRightInsets); + EXPECT_EQ(1067, right_rect.x()); + EXPECT_EQ(1069, right_rect.y()); + EXPECT_EQ(820, right_rect.width()); + EXPECT_EQ(1056, right_rect.height()); +} + } // namespace draw_utils } // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index 4fbca922..3e01cdf 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -2639,10 +2639,7 @@ pp::Rect rect(pp::Point(0, document_size_.height()), size); page_rects.push_back(rect); - if (size.width() > document_size_.width()) - document_size_.set_width(size.width()); - - document_size_.Enlarge(0, size.height()); + draw_utils::ExpandDocumentSize(size, &document_size_); } for (size_t i = 0; i < new_page_count; ++i) {
diff --git a/services/audio/loopback_stream.cc b/services/audio/loopback_stream.cc index 2160fc3..c30ec22e 100644 --- a/services/audio/loopback_stream.cc +++ b/services/audio/loopback_stream.cc
@@ -68,43 +68,32 @@ observer_.set_disconnect_handler( base::BindOnce(&LoopbackStream::OnError, base::Unretained(this))); - // As of this writing, only machines older than about 10 years won't be able - // to produce high-resolution timestamps. In order to avoid adding extra - // complexity to the implementation, simply refuse to operate without that - // basic level of hardware support. - // // Construct the components of the AudioDataPipe, for delivering the data to // the consumer. If successful, create the FlowNetwork too. - if (base::TimeTicks::IsHighResolution()) { - base::CancelableSyncSocket foreign_socket; - std::unique_ptr<InputSyncWriter> writer = InputSyncWriter::Create( - base::BindRepeating( - [](const std::string& message) { VLOG(1) << message; }), - shared_memory_count, params, &foreign_socket); - if (writer) { - base::ReadOnlySharedMemoryRegion shared_memory_region = - writer->TakeSharedMemoryRegion(); - mojo::ScopedHandle socket_handle; - if (shared_memory_region.IsValid()) { - socket_handle = mojo::WrapPlatformFile(foreign_socket.Release()); - if (socket_handle.is_valid()) { - std::move(created_callback) - .Run({base::in_place, std::move(shared_memory_region), - std::move(socket_handle)}); - network_.reset(new FlowNetwork(std::move(flow_task_runner), params, - std::move(writer))); - return; // Success! - } + base::CancelableSyncSocket foreign_socket; + std::unique_ptr<InputSyncWriter> writer = InputSyncWriter::Create( + base::BindRepeating( + [](const std::string& message) { VLOG(1) << message; }), + shared_memory_count, params, &foreign_socket); + if (writer) { + base::ReadOnlySharedMemoryRegion shared_memory_region = + writer->TakeSharedMemoryRegion(); + mojo::ScopedHandle socket_handle; + if (shared_memory_region.IsValid()) { + socket_handle = mojo::WrapPlatformFile(foreign_socket.Release()); + if (socket_handle.is_valid()) { + std::move(created_callback) + .Run({base::in_place, std::move(shared_memory_region), + std::move(socket_handle)}); + network_.reset(new FlowNetwork(std::move(flow_task_runner), params, + std::move(writer))); + return; // Success! } } - } else /* if (!base::TimeTicks::IsHighResolution()) */ { - LOG(ERROR) << "Refusing to start loop-back because this machine cannot " - "provide high-resolution timestamps."; } - // If this point is reached, either the TimeTicks clock is not high resolution - // or one or more AudioDataPipe components failed to initialize. Report the - // error. + // If this point is reached, one or more AudioDataPipe components failed to + // initialize. Report the error. std::move(created_callback).Run(nullptr); OnError(); } @@ -174,6 +163,17 @@ return; } + if (!base::TimeTicks::IsHighResolution()) { + // As of this writing, only machines manufactured before 2008 won't be able + // to produce high-resolution timestamps. Since the buffer management logic + // (to mitigate overruns/underruns) depends on them to function correctly, + // simply return early (i.e., never start snooping on the |member|). + TRACE_EVENT_INSTANT0("audio", + "LoopbackStream::OnMemberJoinedGroup Rejected", + TRACE_EVENT_SCOPE_THREAD); + return; + } + TRACE_EVENT1("audio", "LoopbackStream::OnMemberJoinedGroup", "member", member); @@ -194,10 +194,14 @@ return; } + const auto snoop_it = snoopers_.find(member); + if (snoop_it == snoopers_.end()) { + // See comments about "high-resolution timestamps" in OnMemberJoinedGroup(). + return; + } + TRACE_EVENT1("audio", "LoopbackStream::OnMemberLeftGroup", "member", member); - const auto snoop_it = snoopers_.find(member); - DCHECK(snoop_it != snoopers_.end()); SnooperNode* const snooper = &(snoop_it->second); member->StopSnooping(snooper); network_->RemoveInput(snooper);
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc index c6c0fa3..43e5f5e 100644 --- a/services/network/public/cpp/features.cc +++ b/services/network/public/cpp/features.cc
@@ -81,6 +81,13 @@ const base::Feature kCORBProtectionSniffing{"CORBProtectionSniffing", base::FEATURE_ENABLED_BY_DEFAULT}; +// When kProactivelyThrottleLowPriorityRequests is enabled, +// resource scheduler proactively throttles low priority requests to avoid +// network contention with high priority requests that may arrive soon. +const base::Feature kProactivelyThrottleLowPriorityRequests{ + "ProactivelyThrottleLowPriorityRequests", + base::FEATURE_DISABLED_BY_DEFAULT}; + bool ShouldEnableOutOfBlinkCors() { // OOR-CORS requires NetworkService. if (!base::FeatureList::IsEnabled(features::kNetworkService))
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h index 7e5f77d8..39108a4 100644 --- a/services/network/public/cpp/features.h +++ b/services/network/public/cpp/features.h
@@ -35,6 +35,8 @@ extern const base::Feature kPauseBrowserInitiatedHeavyTrafficForP2P; COMPONENT_EXPORT(NETWORK_CPP) extern const base::Feature kCORBProtectionSniffing; +COMPONENT_EXPORT(NETWORK_CPP) +extern const base::Feature kProactivelyThrottleLowPriorityRequests; COMPONENT_EXPORT(NETWORK_CPP) bool ShouldEnableOutOfBlinkCors();
diff --git a/services/network/public/cpp/resource_request.cc b/services/network/public/cpp/resource_request.cc index 738a7d0..4a38b79 100644 --- a/services/network/public/cpp/resource_request.cc +++ b/services/network/public/cpp/resource_request.cc
@@ -16,6 +16,10 @@ return method == request.method && url == request.url && site_for_cookies == request.site_for_cookies && top_frame_origin == request.top_frame_origin && + trusted_network_isolation_key == + request.trusted_network_isolation_key && + update_network_isolation_key_on_redirect == + request.update_network_isolation_key_on_redirect && attach_same_site_cookies == request.attach_same_site_cookies && update_first_party_url_on_redirect == request.update_first_party_url_on_redirect &&
diff --git a/services/network/public/cpp/resource_request.h b/services/network/public/cpp/resource_request.h index ffcdef9e2..5e4a713 100644 --- a/services/network/public/cpp/resource_request.h +++ b/services/network/public/cpp/resource_request.h
@@ -12,6 +12,7 @@ #include "base/memory/ref_counted.h" #include "base/optional.h" #include "base/unguessable_token.h" +#include "net/base/network_isolation_key.h" #include "net/base/request_priority.h" #include "net/http/http_request_headers.h" #include "net/url_request/url_request.h" @@ -40,6 +41,10 @@ GURL url; GURL site_for_cookies; base::Optional<url::Origin> top_frame_origin; + net::NetworkIsolationKey trusted_network_isolation_key; + mojom::UpdateNetworkIsolationKeyOnRedirect + update_network_isolation_key_on_redirect = + network::mojom::UpdateNetworkIsolationKeyOnRedirect::kDoNotUpdate; bool attach_same_site_cookies = false; bool update_first_party_url_on_redirect = false; base::Optional<url::Origin> request_initiator;
diff --git a/services/network/public/cpp/simple_url_loader_unittest.cc b/services/network/public/cpp/simple_url_loader_unittest.cc index 0374341..64494c3b 100644 --- a/services/network/public/cpp/simple_url_loader_unittest.cc +++ b/services/network/public/cpp/simple_url_loader_unittest.cc
@@ -1691,7 +1691,7 @@ kClientPipeClosed, kBodyBufferClosed, // Advances time by 1 second. Only callable when the test environment is - // configured to be MainThreadType::MOCK_TIME. + // configured to be TimeSource::MOCK_TIME. kAdvanceOneSecond, }; @@ -2973,7 +2973,7 @@ } // Don't inherit from SimpleURLLoaderTestBase so that we can initialize our -// |scoped_task_environment_| different namely with MainThreadType::MOCK_TIME. +// |scoped_task_environment_| different namely with TimeSource::MOCK_TIME. class SimpleURLLoaderMockTimeTest : public testing::Test { public: SimpleURLLoaderMockTimeTest()
diff --git a/services/network/public/cpp/url_request.typemap b/services/network/public/cpp/url_request.typemap index 65a94f4..d0be46d 100644 --- a/services/network/public/cpp/url_request.typemap +++ b/services/network/public/cpp/url_request.typemap
@@ -12,6 +12,7 @@ traits_headers = [ "//services/network/public/cpp/network_ipc_param_traits.h", "//services/network/public/cpp/url_request_mojom_traits.h", + "//services/network/public/cpp/network_isolation_key_mojom_traits.h", ] public_deps = [ "//base",
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc index b3d6138..27df040 100644 --- a/services/network/public/cpp/url_request_mojom_traits.cc +++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -157,6 +157,8 @@ if (!data.ReadMethod(&out->method) || !data.ReadUrl(&out->url) || !data.ReadSiteForCookies(&out->site_for_cookies) || !data.ReadTopFrameOrigin(&out->top_frame_origin) || + !data.ReadTrustedNetworkIsolationKey( + &out->trusted_network_isolation_key) || !data.ReadRequestInitiator(&out->request_initiator) || !data.ReadReferrer(&out->referrer) || !data.ReadReferrerPolicy(&out->referrer_policy) || @@ -180,6 +182,8 @@ return false; } + out->update_network_isolation_key_on_redirect = + data.update_network_isolation_key_on_redirect(); out->attach_same_site_cookies = data.attach_same_site_cookies(); out->update_first_party_url_on_redirect = data.update_first_party_url_on_redirect();
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h index ab4d8fc..03688ba 100644 --- a/services/network/public/cpp/url_request_mojom_traits.h +++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -17,6 +17,7 @@ #include "mojo/public/cpp/bindings/struct_traits.h" #include "net/base/request_priority.h" #include "services/network/public/cpp/data_element.h" +#include "services/network/public/cpp/network_isolation_key_mojom_traits.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/resource_request_body.h" #include "services/network/public/mojom/chunked_data_pipe_getter.mojom.h" @@ -59,6 +60,15 @@ const network::ResourceRequest& request) { return request.top_frame_origin; } + static network::mojom::UpdateNetworkIsolationKeyOnRedirect + update_network_isolation_key_on_redirect( + const network::ResourceRequest& request) { + return request.update_network_isolation_key_on_redirect; + } + static const net::NetworkIsolationKey& trusted_network_isolation_key( + const network::ResourceRequest& request) { + return request.trusted_network_isolation_key; + } static bool attach_same_site_cookies( const network::ResourceRequest& request) { return request.attach_same_site_cookies;
diff --git a/services/network/public/cpp/url_request_mojom_traits_unittest.cc b/services/network/public/cpp/url_request_mojom_traits_unittest.cc index 26a8a8f..ebbab850 100644 --- a/services/network/public/cpp/url_request_mojom_traits_unittest.cc +++ b/services/network/public/cpp/url_request_mojom_traits_unittest.cc
@@ -49,6 +49,11 @@ original.url = GURL("https://example.com/resources/dummy.xml"); original.site_for_cookies = GURL("https://example.com/index.html"); original.top_frame_origin = url::Origin::Create(original.url); + original.trusted_network_isolation_key = + net::NetworkIsolationKey(url::Origin::Create(original.url)); + original.update_network_isolation_key_on_redirect = + network::mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin; original.attach_same_site_cookies = true; original.update_first_party_url_on_redirect = false; original.request_initiator = url::Origin::Create(original.url);
diff --git a/services/network/public/mojom/url_loader.mojom b/services/network/public/mojom/url_loader.mojom index 9c5238d2d..fcf08a6 100644 --- a/services/network/public/mojom/url_loader.mojom +++ b/services/network/public/mojom/url_loader.mojom
@@ -14,6 +14,7 @@ import "services/network/public/mojom/data_pipe_getter.mojom"; import "services/network/public/mojom/fetch_api.mojom"; import "services/network/public/mojom/http_request_headers.mojom"; +import "services/network/public/mojom/network_isolation_key.mojom"; import "services/network/public/mojom/network_param.mojom"; import "url/mojom/origin.mojom"; import "url/mojom/url.mojom"; @@ -70,6 +71,21 @@ kBytes, }; +// Used to determine if URLRequest::trusted_network_isolation_key should be +// updated on redirect. +enum UpdateNetworkIsolationKeyOnRedirect { + kDoNotUpdate, + + // The updated network isolation key will take the redirected url's origin as + // the top frame origin and initiating frame origin. + kUpdateTopFrameAndInitiatingFrameOrigin, + + // The updated network isolation key will take existing + // |trusted_network_isolation_key|'s top frame origin and redirected url's + // origin as the initiating frame origin. + kUpdateInitiatingFrameOrigin +}; + // Typemapped to network::ResourceRequest. struct URLRequest { // The request method: GET, POST, etc. @@ -101,10 +117,22 @@ // // Note that this is experimental. // - // TODO(crbug.com/911299): This field will most likely be removed at some - // point. + // TODO(crbug.com/911299, crbug.com/978968): This field will most likely be + // removed at some point. url.mojom.Origin? top_frame_origin; + // This resource request will be keyed using |trusted_network_isolation_key| + // for accessing shared network resources like the http cache. This must only + // be populated from a trusted process. Optional since it is not filled for + // all requests e.g. those coming from a less trusted process. This parameter + // may only be set if the URLLoaderFactory was not created with a pre-bound + // network isolation key, and it is an error to do otherwise. + NetworkIsolationKey? trusted_network_isolation_key; + + // Whether or not the network isolation key needs to be recomputed on + // redirects. Typically this is only done for navigations. + UpdateNetworkIsolationKeyOnRedirect update_network_isolation_key_on_redirect; + // Boolean indicating whether SameSite cookies are allowed to be attached // to the request. It should be used as additional input to network side // checks.
diff --git a/services/network/resource_scheduler_params_manager.cc b/services/network/resource_scheduler_params_manager.cc index 15dc7de..db16883e 100644 --- a/services/network/resource_scheduler_params_manager.cc +++ b/services/network/resource_scheduler_params_manager.cc
@@ -218,6 +218,38 @@ } } + if (base::FeatureList::IsEnabled( + features::kProactivelyThrottleLowPriorityRequests)) { + for (net::EffectiveConnectionType effective_connection_type = + net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G; + effective_connection_type <= net::EFFECTIVE_CONNECTION_TYPE_4G; + effective_connection_type = static_cast<net::EffectiveConnectionType>( + effective_connection_type + 1)) { + std::string param_name = "http_rtt_multiplier_for_proactive_throttling_" + + std::string(GetNameForEffectiveConnectionType( + effective_connection_type)); + + double http_rtt_multiplier = base::GetFieldTrialParamByFeatureAsDouble( + features::kProactivelyThrottleLowPriorityRequests, param_name, -1); + + if (http_rtt_multiplier < 0) + continue; + + ResourceSchedulerParamsManager::ParamsForNetworkQualityContainer::iterator + iter = result.find(effective_connection_type); + + if (iter == result.end()) { + // Add a default ParamsForNetworkQuality object to |result|. + result.emplace(std::make_pair( + effective_connection_type, + ResourceSchedulerParamsManager::ParamsForNetworkQuality())); + } + iter = result.find(effective_connection_type); + iter->second.http_rtt_multiplier_for_proactive_throttling = + http_rtt_multiplier; + } + } + return result; } @@ -247,6 +279,10 @@ const ResourceSchedulerParamsManager::ParamsForNetworkQuality& other) = default; +ResourceSchedulerParamsManager::ParamsForNetworkQuality& +ResourceSchedulerParamsManager::ParamsForNetworkQuality::operator=( + const ParamsForNetworkQuality& other) = default; + ResourceSchedulerParamsManager::ResourceSchedulerParamsManager() : ResourceSchedulerParamsManager(GetParamsForNetworkQualityContainer()) {}
diff --git a/services/network/resource_scheduler_params_manager.h b/services/network/resource_scheduler_params_manager.h index 99ec21b..71f9de9 100644 --- a/services/network/resource_scheduler_params_manager.h +++ b/services/network/resource_scheduler_params_manager.h
@@ -35,6 +35,8 @@ ParamsForNetworkQuality(const ParamsForNetworkQuality& other); + ParamsForNetworkQuality& operator=(const ParamsForNetworkQuality& other); + // The maximum number of delayable requests allowed. size_t max_delayable_requests; @@ -49,6 +51,13 @@ // The maximum duration for which a request is queued after after which the // request is dispatched to the network. base::Optional<base::TimeDelta> max_queuing_time; + + // If a non-delayable request is in-flight, then delayable requests are + // proactively throttled for duration = + // http_rtt_multiplier_for_proactive_throttling multiplied by current HTTP + // RTT estimate. The throttling duration is computed since the start of the + // most recent non-delayable request. + base::Optional<double> http_rtt_multiplier_for_proactive_throttling; }; ResourceSchedulerParamsManager();
diff --git a/services/network/resource_scheduler_params_manager_unittest.cc b/services/network/resource_scheduler_params_manager_unittest.cc index 146775c4..d32151b4 100644 --- a/services/network/resource_scheduler_params_manager_unittest.cc +++ b/services/network/resource_scheduler_params_manager_unittest.cc
@@ -99,6 +99,10 @@ resource_scheduler_params_manager .GetParamsForEffectiveConnectionType(effective_connection_type) .max_queuing_time.has_value()); + EXPECT_FALSE( + resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType(effective_connection_type) + .http_rtt_multiplier_for_proactive_throttling); return; case net::EFFECTIVE_CONNECTION_TYPE_3G: @@ -118,6 +122,10 @@ resource_scheduler_params_manager .GetParamsForEffectiveConnectionType(effective_connection_type) .max_queuing_time.has_value()); + EXPECT_FALSE( + resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType(effective_connection_type) + .http_rtt_multiplier_for_proactive_throttling); return; case net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G: @@ -138,6 +146,10 @@ resource_scheduler_params_manager .GetParamsForEffectiveConnectionType(effective_connection_type) .max_queuing_time.has_value()); + EXPECT_FALSE( + resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType(effective_connection_type) + .http_rtt_multiplier_for_proactive_throttling); return; case net::EFFECTIVE_CONNECTION_TYPE_LAST: @@ -521,6 +533,46 @@ net::EFFECTIVE_CONNECTION_TYPE_4G); } +TEST_F(ResourceSchedulerParamsManagerTest, + ProactivelyThrottleLowPriorityRequests) { + const double kDelaySlow2G = 1.5; + const double kDelay2G = 1.6; + const double kDelay4G = 0.5; + + base::test::ScopedFeatureList scoped_feature_list; + + base::FieldTrialParams params; + params["http_rtt_multiplier_for_proactive_throttling_Slow-2G"] = + base::NumberToString(kDelaySlow2G); + params["http_rtt_multiplier_for_proactive_throttling_2G"] = + base::NumberToString(kDelay2G); + params["http_rtt_multiplier_for_proactive_throttling_4G"] = + base::NumberToString(kDelay4G); + + scoped_feature_list.InitAndEnableFeatureWithParameters( + features::kProactivelyThrottleLowPriorityRequests, params); + + ResourceSchedulerParamsManager resource_scheduler_params_manager; + + EXPECT_EQ(kDelaySlow2G, resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType( + net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G) + .http_rtt_multiplier_for_proactive_throttling); + EXPECT_EQ(kDelay2G, resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType( + net::EFFECTIVE_CONNECTION_TYPE_2G) + .http_rtt_multiplier_for_proactive_throttling); + EXPECT_FALSE(resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType( + net::EFFECTIVE_CONNECTION_TYPE_3G) + .http_rtt_multiplier_for_proactive_throttling.has_value()); + EXPECT_EQ(kDelay4G, + resource_scheduler_params_manager + .GetParamsForEffectiveConnectionType( + net::EFFECTIVE_CONNECTION_TYPE_4G) + .http_rtt_multiplier_for_proactive_throttling.value()); +} + } // unnamed namespace } // namespace network
diff --git a/services/network/session_cleanup_cookie_store_unittest.cc b/services/network/session_cleanup_cookie_store_unittest.cc index 24e3158..0d680bb0 100644 --- a/services/network/session_cleanup_cookie_store_unittest.cc +++ b/services/network/session_cleanup_cookie_store_unittest.cc
@@ -167,7 +167,7 @@ base::Time t = base::Time::Now(); AddCookie("A", "B", "nonpersistent.com", "/", t); - net_log_.SetCaptureMode(net::NetLogCaptureMode::kDefault); + net_log_.SetObserverCaptureMode(net::NetLogCaptureMode::kDefault); // Cookies from "nonpersistent.com" should be deleted. store_->DeleteSessionCookies( base::BindRepeating([](const std::string& domain, bool is_https) {
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index 97b75021..442789b8e 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -374,14 +374,16 @@ custom_proxy_post_cache_headers_(request.custom_proxy_post_cache_headers), custom_proxy_use_alternate_proxy_list_( request.custom_proxy_use_alternate_proxy_list), - fetch_window_id_(request.fetch_window_id) { + fetch_window_id_(request.fetch_window_id), + update_network_isolation_key_on_redirect_( + request.update_network_isolation_key_on_redirect) { DCHECK(delete_callback_); DCHECK(factory_params_); if (!base::FeatureList::IsEnabled(features::kNetworkService)) { CHECK(!url_loader_client_.internal_state() - ->handle() - .QuerySignalsState() - .peer_remote()) + ->handle() + .QuerySignalsState() + .peer_remote()) << "URLLoader must not be used by the renderer when network service is " << "disabled, as that skips security checks in ResourceDispatcherHost. " << "The only acceptable usage is the browser using SimpleURLLoader."; @@ -411,7 +413,15 @@ url_request_->set_referrer_policy(request.referrer_policy); url_request_->set_upgrade_if_insecure(request.upgrade_if_insecure); + // Populate network isolation key from the factory params or from the resource + // request for navigation resources. + if (!request.trusted_network_isolation_key.IsEmpty()) { + DCHECK(!factory_params_->network_isolation_key); + url_request_->set_network_isolation_key( + request.trusted_network_isolation_key); + } if (factory_params_->network_isolation_key) { + DCHECK(request.trusted_network_isolation_key.IsEmpty()); url_request_->set_network_isolation_key( factory_params_->network_isolation_key.value()); } @@ -686,6 +696,20 @@ LogConcerningRequestHeaders(modified_headers, true /* added_during_redirect */); + // See if network isolation key needs to be updated. + // TODO(crbug.com/979296): Consider changing this code to copy an origin + // instead of creating one from a URL which lacks opacity information + // TODO(crbug.com/950069): Also add the case for kUpdateInitiatingFrameOrigin. + if ((update_network_isolation_key_on_redirect_ == + mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin) && + !url_request_->network_isolation_key().IsEmpty()) { + url::Origin new_origin = url::Origin::Create(*(deferred_redirect_url_)); + url_request_->set_network_isolation_key( + net::NetworkIsolationKey(new_origin /* top frame origin */, + new_origin /* initiating frame origin */)); + } + deferred_redirect_url_.reset(); new_redirect_url_ = new_url;
diff --git a/services/network/url_loader.h b/services/network/url_loader.h index 5e9c7f4..25965a7 100644 --- a/services/network/url_loader.h +++ b/services/network/url_loader.h
@@ -353,6 +353,11 @@ std::unique_ptr<FileOpenerForUpload> file_opener_for_upload_; + // See detailed comment in + // mojom::network::URLRequest::update_network_isolation_key_on_redirect. + mojom::UpdateNetworkIsolationKeyOnRedirect + update_network_isolation_key_on_redirect_; + base::WeakPtrFactory<URLLoader> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(URLLoader);
diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc index e92ded52..ecf52de 100644 --- a/services/network/url_loader_factory.cc +++ b/services/network/url_loader_factory.cc
@@ -132,6 +132,21 @@ return; } + // For navigation and worker script resources, the network isolation key may + // be set in the resource request and for sub-resources, it is set in params_. + // Fail if it is set in both as that could imply a compromised less trusted + // process filling up the resource request's trusted_network_isolation_key (It + // should only be filled up by a trusted process). + if (params_->network_isolation_key && + !url_request.trusted_network_isolation_key.IsEmpty()) { + URLLoaderCompletionStatus status; + status.error_code = net::ERR_INVALID_ARGUMENT; + status.exists_in_cache = false; + status.completion_time = base::TimeTicks::Now(); + client->OnComplete(status); + return; + } + auto loader = std::make_unique<URLLoader>( context_->url_request_context(), network_service_client, context_->client(),
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index 9ac7c6e6..870f9a3 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -756,7 +756,9 @@ void LoadAndVerifyCached(const GURL& url, const net::NetworkIsolationKey& key, - bool was_cached) { + bool was_cached, + bool is_navigation, + bool expect_redirect = false) { ResourceRequest request = CreateResourceRequest("GET", url); request.load_flags |= net::LOAD_SKIP_CACHE_VALIDATION; @@ -764,10 +766,18 @@ base::RunLoop delete_run_loop; mojom::URLLoaderPtr loader; std::unique_ptr<URLLoader> url_loader; - static mojom::URLLoaderFactoryParams params; + mojom::URLLoaderFactoryParams params; params.process_id = mojom::kBrowserProcessId; params.is_corb_enabled = false; - params.network_isolation_key = key; + + if (is_navigation) { + request.trusted_network_isolation_key = key; + request.update_network_isolation_key_on_redirect = + mojom::UpdateNetworkIsolationKeyOnRedirect:: + kUpdateTopFrameAndInitiatingFrameOrigin; + } else { + params.network_isolation_key = key; + } url_loader = std::make_unique<URLLoader>( context(), nullptr /* network_service_client */, nullptr /* network_context_client */, @@ -777,6 +787,11 @@ resource_scheduler_client(), nullptr, nullptr /* network_usage_accumulator */, nullptr /* header_client */); + if (expect_redirect) { + client.RunUntilRedirectReceived(); + loader->FollowRedirect({}, {}, base::nullopt); + } + client.RunUntilComplete(); delete_run_loop.Run(); @@ -3055,16 +3070,63 @@ GURL url = test_server()->GetURL("/resource"); url::Origin origin_a = url::Origin::Create(GURL("http://a.test/")); net::NetworkIsolationKey key_a(origin_a); - LoadAndVerifyCached(url, key_a, false /* was_cached */); + LoadAndVerifyCached(url, key_a, false /* was_cached */, + false /* is_navigation */); // Load again with a different isolation key. The cached entry should not be // loaded. url::Origin origin_b = url::Origin::Create(GURL("http://b.test/")); net::NetworkIsolationKey key_b(origin_b); - LoadAndVerifyCached(url, key_b, false /* was_cached */); + LoadAndVerifyCached(url, key_b, false /* was_cached */, + false /* is_navigation */); // Load again with the same isolation key. The cached entry should be loaded. - LoadAndVerifyCached(url, key_b, true /* was_cached */); + LoadAndVerifyCached(url, key_b, true /* was_cached */, + false /* is_navigation */); +} + +TEST_F(URLLoaderNetworkIsolationTest, + NavigationResourceCachedUsingNetworkIsolationKey) { + GURL url = test_server()->GetURL("othersite.test", "/main.html"); + net::NetworkIsolationKey key_a(url::Origin::Create(url)); + LoadAndVerifyCached(url, key_a, false /* was_cached */, + true /* is_navigation */); + + // Load again with a different isolation key. The cached entry should not be + // loaded. + GURL url_b = test_server()->GetURL("/main.html"); + net::NetworkIsolationKey key_b(url::Origin::Create(url_b)); + LoadAndVerifyCached(url_b, key_b, false /* was_cached */, + true /* is_navigation */); + + // Load again with the same isolation key. The cached entry should be loaded. + LoadAndVerifyCached(url_b, key_b, true /* was_cached */, + true /* is_navigation */); +} + +TEST_F(URLLoaderNetworkIsolationTest, + NavigationResourceRedirectNetworkIsolationKey) { + // Create a request that redirects to d.com/title1.html. + GURL url = test_server()->GetURL( + "/server-redirect-301?" + + test_server()->GetURL("othersite.test", "/title1.html").spec()); + net::NetworkIsolationKey key(url::Origin::Create(url)); + LoadAndVerifyCached(url, key, false /* was_cached */, + true /* is_navigation */, true /* expect_redirect */); + + // Now directly load now with the key using the redirected URL. This should be + // a cache hit. + GURL redirected_url = test_server()->GetURL("othersite.test", "/title1.html"); + LoadAndVerifyCached( + redirected_url, + net::NetworkIsolationKey(url::Origin::Create(redirected_url)), + true /* was_cached */, true /* is_navigation */); + + // A non-navigation resource with the same key and url should also be cached. + LoadAndVerifyCached( + redirected_url, + net::NetworkIsolationKey(url::Origin::Create(redirected_url)), + true /* was_cached */, false /* is_navigation */); } class TestSSLPrivateKey : public net::SSLPrivateKey {
diff --git a/storage/browser/fileapi/plugin_private_file_system_backend.cc b/storage/browser/fileapi/plugin_private_file_system_backend.cc index d1e6a5d..fa76c81 100644 --- a/storage/browser/fileapi/plugin_private_file_system_backend.cc +++ b/storage/browser/fileapi/plugin_private_file_system_backend.cc
@@ -13,6 +13,7 @@ #include "base/bind.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" +#include "base/memory/ptr_util.h" #include "base/stl_util.h" #include "base/synchronization/lock.h" #include "base/task_runner_util.h" @@ -196,14 +197,15 @@ return false; } -std::unique_ptr<storage::FileStreamReader> +std::unique_ptr<FileStreamReader> PluginPrivateFileSystemBackend::CreateFileStreamReader( const FileSystemURL& url, int64_t offset, int64_t max_bytes_to_read, const base::Time& expected_modification_time, FileSystemContext* context) const { - return std::unique_ptr<storage::FileStreamReader>(); + return base::WrapUnique(FileStreamReader::CreateForFileSystemFile( + context, url, offset, expected_modification_time)); } std::unique_ptr<FileStreamWriter>
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index e17aa446..33c54e4e 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -4488,6 +4488,60 @@ "--build-revision", "${got_revision}", "--test-machine-name", + "${buildername}", + "--use-skia-gold" + ], + "experiment_percentage": 100, + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "android_webview_pixel_skia_gold_test", + "non_precommit_args": [ + "--upload-refimg-to-cloud-storage" + ], + "precommit_args": [ + "--download-refimg-from-cloud-storage", + "--review-patch-issue", + "${patch_issue}", + "--review-patch-set", + "${patch_set}", + "--buildbucket-build-id", + "${buildbucket_build_id}" + ], + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "device_os": "MMB29Q", + "device_os_type": "userdebug", + "device_type": "bullhead", + "os": "Android" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + } + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=android-webview-instrumentation", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--dont-restore-color-profile-after-test", + "--refimg-cloud-storage-bucket", + "chromium-gpu-archive/reference-images", + "--os-type", + "android", + "--build-revision", + "${got_revision}", + "--test-machine-name", "${buildername}" ], "isolate_name": "telemetry_gpu_integration_test", @@ -6762,6 +6816,61 @@ "--build-revision", "${got_revision}", "--test-machine-name", + "${buildername}", + "--use-skia-gold" + ], + "experiment_percentage": 100, + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "pixel_skia_gold_test", + "non_precommit_args": [ + "--upload-refimg-to-cloud-storage" + ], + "precommit_args": [ + "--download-refimg-from-cloud-storage", + "--review-patch-issue", + "${patch_issue}", + "--review-patch-set", + "${patch_set}", + "--buildbucket-build-id", + "${buildbucket_build_id}" + ], + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "device_os": "P", + "device_os_type": "userdebug", + "device_type": "walleye", + "os": "Android", + "pool": "Chrome-GPU" + } + ], + "idempotent": false, + "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com" + } + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=android-chromium", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc \"--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer\"", + "--dont-restore-color-profile-after-test", + "--refimg-cloud-storage-bucket", + "chromium-gpu-archive/reference-images", + "--os-type", + "android", + "--build-revision", + "${got_revision}", + "--test-machine-name", "${buildername}" ], "isolate_name": "telemetry_gpu_integration_test",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 82b8bb7..cc7c46f3 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -2158,8 +2158,7 @@ { "isolate_coverage_data": true, "name": "check_network_annotations", - "script": "check_network_annotations.py", - "swarming": {} + "script": "check_network_annotations.py" } ] },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index de514d9e..45b80257 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -175,6 +175,41 @@ '--download-refimg-from-cloud-storage', ], }, + 'pixel_skia': { + 'name': 'android_webview_pixel_skia_gold_test', + 'args': [ + '--dont-restore-color-profile-after-test', + '--refimg-cloud-storage-bucket', + 'chromium-gpu-archive/reference-images', + '--os-type', + '${os_type}', + '--build-revision', + '${got_revision}', + '--test-machine-name', + '${buildername}', + '--use-skia-gold', + ], + 'non_precommit_args': [ + '--upload-refimg-to-cloud-storage', + ], + 'precommit_args': [ + '--download-refimg-from-cloud-storage', + # Gerrit issue ID + '--review-patch-issue', + '${patch_issue}', + # Patch set number + '--review-patch-set', + '${patch_set}', + # Buildbucket ID + '--buildbucket-build-id', + '${buildbucket_build_id}', + ], + 'swarming': { + 'service_account': 'chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com' + }, + 'experiment_percentage': 100, + 'telemetry_test_name': 'pixel', + }, }, 'aura_gtests': { @@ -3631,6 +3666,42 @@ '--download-refimg-from-cloud-storage', ], }, + 'pixel_skia': { + 'name': 'pixel_skia_gold_test', + 'args': [ + '--dont-restore-color-profile-after-test', + '--refimg-cloud-storage-bucket', + 'chromium-gpu-archive/reference-images', + '--os-type', + '${os_type}', + '--build-revision', + '${got_revision}', + '--test-machine-name', + '${buildername}', + '--use-skia-gold', + '--extra-browser-args="--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer"', + ], + 'non_precommit_args': [ + '--upload-refimg-to-cloud-storage', + ], + 'precommit_args': [ + '--download-refimg-from-cloud-storage', + # Gerrit issue ID + '--review-patch-issue', + '${patch_issue}', + # Patch set number + '--review-patch-set', + '${patch_set}', + # Buildbucket ID + '--buildbucket-build-id', + '${buildbucket_build_id}', + ], + 'swarming': { + 'service_account': 'chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com' + }, + 'experiment_percentage': 100, + 'telemetry_test_name': 'pixel', + }, }, 'gpu_swiftshader_gtests': {
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 3b500ea..d70c8b3 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -110,7 +110,6 @@ 'linux-archive-rel': { 'mixins': [ 'linux-archive-rel-args', - 'linux-trusty', ], 'additional_compile_targets': [ 'all', @@ -3345,7 +3344,6 @@ # linux-rel or ended up not being able to fold. 'Linux Builder Code Coverage': { 'mixins': [ - 'linux-trusty', 'code-coverage', ], 'additional_compile_targets': [
diff --git a/testing/merge_scripts/code_coverage/merge_results.py b/testing/merge_scripts/code_coverage/merge_results.py index e07005df..3bb9b2f 100755 --- a/testing/merge_scripts/code_coverage/merge_results.py +++ b/testing/merge_scripts/code_coverage/merge_results.py
@@ -131,17 +131,30 @@ return 1 if (failed or bool(invalid_profiles)) else 0 def mark_invalid_shards(bad_shards, summary_file, output_file): + if not bad_shards: + return shard_indices = [] - with open(summary_file) as f: - summary = json.load(f) + try: + with open(summary_file) as f: + summary = json.load(f) + except (OSError, ValueError): + logging.warning('Could not read summary.json, not marking invalid shards') + return for i in range(len(summary['shards'])): - shard_id = summary['shards'][i]['task_id'] - if shard_id in bad_shards: + shard_info = summary['shards'][i] + shard_id = (shard_info['task_id'] + if shard_info and 'task_id' in shard_info + else 'unknown') + if shard_id in bad_shards or shard_id == 'unknown': shard_indices.append(i) - with open(output_file) as f: - output = json.load(f) + try: + with open(output_file) as f: + output = json.load(f) + except (OSError, ValueError): + logging.warning('Invalid/missing output.json, overwriting') + output = {} output.setdefault('missing_shards', []) output['missing_shards'].extend(shard_indices) with open(output_file, 'w') as f:
diff --git a/testing/merge_scripts/code_coverage/merge_results_test.py b/testing/merge_scripts/code_coverage/merge_results_test.py index ce982c2..9a360be 100755 --- a/testing/merge_scripts/code_coverage/merge_results_test.py +++ b/testing/merge_scripts/code_coverage/merge_results_test.py
@@ -225,6 +225,39 @@ self.assertIn('missing_shards', written) self.assertEqual(written['missing_shards'], [0]) + @mock.patch('__builtin__.open', + new_callable=mock.mock_open, + read_data='invalid data') + def test_mark_invalid_shards_bad_summary(self, _mo): + # Should not raise an exception. + raised_exception = False + try: + merge_results.mark_invalid_shards(['1234567890abcdeff'], 'dummy.json', + 'o.json') + except: # pylint: disable=bare-except + raised_exception = True + self.assertFalse(raised_exception, 'unexpected exception') + + @mock.patch('__builtin__.open', + new_callable=mock.mock_open, + read_data=json.dumps( + {'shards': [{'task_id': '1234567890abcdeff'}]})) + def test_mark_invalid_shards_bad_output(self, mo): + mock_result = mock.mock_open() + mock_write = mock.MagicMock() + mock_result.return_value.write = mock_write + mo.side_effect = ( + mo.return_value, + mock.mock_open(read_data='invalid_data').return_value, + mock_result.return_value, + ) + # Should succeed anyway. + merge_results.mark_invalid_shards(['1234567890abcdeff'], 'dummy.json', + 'o.json') + written = json.loads(''.join(c[0][0] for c in mock_write.call_args_list)) + self.assertIn('missing_shards', written) + self.assertEqual(written['missing_shards'], [0]) + def test_get_shards_to_retry(self): bad_profiles = [ '/b/s/w/ir/tmp/t/tmpSvBRii/44b643576cf39f10/profraw/default-1.profraw',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 777df3f..0df50616 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -4177,7 +4177,7 @@ ], "experiments": [ { - "name": "Enabled_Pool_Four_Fifths_Origin_ThreeQuarters_20190430", + "name": "Enabled_Pool_Four_Fifths_Origin_ThreeQuarters_20190710", "params": { "PerHostRatio": "0.75", "PoolSizeRatio": "0.8"
diff --git a/third_party/blink/public/blink_typemaps.gni b/third_party/blink/public/blink_typemaps.gni index 492f006..4d4b14d 100644 --- a/third_party/blink/public/blink_typemaps.gni +++ b/third_party/blink/public/blink_typemaps.gni
@@ -23,6 +23,6 @@ "//services/viz/public/cpp/compositing/surface_id.typemap", "//services/viz/public/cpp/compositing/surface_info.typemap", "//skia/public/interfaces/skbitmap_for_blink.typemap", - "//ui/display/mojo/display_rotation_for_blink.typemap", + "//ui/display/mojom/display_rotation_for_blink.typemap", "//ui/gfx/mojo/gpu_fence_handle_for_blink.typemap", ]
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index 04e115b..1409102 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2183,7 +2183,7 @@ kV8HTMLMediaElement_Remote_AttributeGetter = 2779, kV8RemotePlayback_WatchAvailability_Method = 2780, kV8RemotePlayback_Prompt_Method = 2781, - kLayoutJankExplicitlyRequested = 2782, + kLayoutShiftExplicitlyRequested = 2782, kMediaSessionSkipAd = 2783, kAdFrameSizeIntervention = 2784, kV8UserActivation_HasBeenActive_AttributeGetter = 2785,
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index 0609b012..ee870d8 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -91,11 +91,6 @@ : nullptr; } -bool IsBaselineKeyword(CSSValueID id) { - return css_property_parser_helpers::IdentMatches< - CSSValueID::kFirst, CSSValueID::kLast, CSSValueID::kBaseline>(id); -} - CSSValueID GetBaselineKeyword(CSSValue& value) { auto* value_pair = DynamicTo<CSSValuePair>(value); if (!value_pair) { @@ -429,6 +424,11 @@ } // namespace +bool IsBaselineKeyword(CSSValueID id) { + return css_property_parser_helpers::IdentMatches< + CSSValueID::kFirst, CSSValueID::kLast, CSSValueID::kBaseline>(id); +} + bool IsSelfPositionKeyword(CSSValueID id) { return css_property_parser_helpers::IdentMatches< CSSValueID::kStart, CSSValueID::kEnd, CSSValueID::kCenter,
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h index a1af42a..dbb113f 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
@@ -41,6 +41,7 @@ constexpr size_t kMaxNumAnimationLonghands = 8; +bool IsBaselineKeyword(CSSValueID id); bool IsSelfPositionKeyword(CSSValueID); bool IsSelfPositionOrLeftOrRightKeyword(CSSValueID); bool IsContentPositionKeyword(CSSValueID);
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc index b25a1e8..0ddf9c8 100644 --- a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/stl_util.h" +#include "third_party/blink/renderer/core/css/css_content_distribution_value.h" #include "third_party/blink/renderer/core/css/css_font_family_value.h" #include "third_party/blink/renderer/core/css/css_identifier_value.h" #include "third_party/blink/renderer/core/css/css_initial_value.h" @@ -2542,18 +2543,28 @@ DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceContent).length(), 2u); CSSParserTokenRange range_copy = range; + bool is_baseline = css_parsing_utils::IsBaselineKeyword(range.Peek().Id()); const CSSValue* align_content_value = To<Longhand>(GetCSSPropertyAlignContent()) .ParseSingleValue(range, context, local_context); if (!align_content_value) return false; - if (range.AtEnd()) - range = range_copy; + const CSSValue* justify_content_value = nullptr; + if (range.AtEnd()) { + if (is_baseline) { + justify_content_value = MakeGarbageCollected<CSSContentDistributionValue>( + CSSValueID::kInvalid, CSSValueID::kStart, CSSValueID::kInvalid); + } else { + range = range_copy; + } + } + if (!justify_content_value) { + justify_content_value = + To<Longhand>(GetCSSPropertyJustifyContent()) + .ParseSingleValue(range, context, local_context); + } - const CSSValue* justify_content_value = - To<Longhand>(GetCSSPropertyJustifyContent()) - .ParseSingleValue(range, context, local_context); if (!justify_content_value || !range.AtEnd()) return false;
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 181f0871..7ae4b5e 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2357,10 +2357,10 @@ #define PROPAGATE_FROM(source, getter, setter) \ PROPAGATE_VALUE(source->getter(), getter, setter); -#define PROPAGATE_VALUE(value, getter, setter) \ - if ((viewport_style.getter()) != (value)) { \ - new_viewport_style->setter(value); \ - changed = true; \ +#define PROPAGATE_VALUE(value, getter, setter) \ + if ((new_viewport_style->getter()) != (value)) { \ + new_viewport_style->setter(value); \ + changed = true; \ } // Writing mode and direction @@ -2473,7 +2473,6 @@ PROPAGATE_VALUE(overflow_y, OverflowY, SetOverflowY) PROPAGATE_VALUE(overflow_anchor, OverflowAnchor, SetOverflowAnchor); - // TODO: Should this even be here? if (IsInMainFrame()) { using OverscrollBehaviorType = cc::OverscrollBehavior::OverscrollBehaviorType; @@ -4328,8 +4327,7 @@ } bool Document::IsTrustedTypesEnabledForDoc() const { - return SecurityContext::RequireTrustedTypes() && - RuntimeEnabledFeatures::TrustedDOMTypesEnabled(this); + return ExecutionContext::RequireTrustedTypes(); } void Document::write(v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc index 8f1ae9a..c173865 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.cc +++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -309,4 +309,9 @@ return false; } +bool ExecutionContext::RequireTrustedTypes() const { + return GetSecurityContext().TrustedTypesRequiredByPolicy() && + RuntimeEnabledFeatures::TrustedDOMTypesEnabled(this); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h index 73bd1fa..084fdb38 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.h +++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -312,6 +312,8 @@ bool FeaturePolicyFeatureObserved( mojom::FeaturePolicyFeature feature) override; + bool RequireTrustedTypes() const; + protected: ExecutionContext(v8::Isolate* isolate, Agent* agent,
diff --git a/third_party/blink/renderer/core/execution_context/security_context.cc b/third_party/blink/renderer/core/execution_context/security_context.cc index 479b162..b87c486a 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.cc +++ b/third_party/blink/renderer/core/execution_context/security_context.cc
@@ -176,7 +176,7 @@ require_safe_types_ = true; } -bool SecurityContext::RequireTrustedTypes() const { +bool SecurityContext::TrustedTypesRequiredByPolicy() const { return require_safe_types_; }
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h index a376caf..0324d2a 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.h +++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -98,8 +98,8 @@ String addressSpaceForBindings() const; void SetRequireTrustedTypes(); - bool RequireTrustedTypes() const; void SetRequireTrustedTypesForTesting(); // Skips sanity checks. + bool TrustedTypesRequiredByPolicy() const; // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-insecure-navigations-set void SetInsecureNavigationsSet(const WebVector<unsigned>& set) {
diff --git a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc index c4a1c22..2521361 100644 --- a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc +++ b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
@@ -69,8 +69,7 @@ } void ExecutionContextCSPDelegate::SetRequireTrustedTypes() { - if (RuntimeEnabledFeatures::TrustedDOMTypesEnabled(execution_context_)) - GetSecurityContext().SetRequireTrustedTypes(); + GetSecurityContext().SetRequireTrustedTypes(); } void ExecutionContextCSPDelegate::AddInsecureRequestPolicy(
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.cc b/third_party/blink/renderer/core/inspector/inspect_tools.cc index 287de15..9adeb94 100644 --- a/third_party/blink/renderer/core/inspector/inspect_tools.cc +++ b/third_party/blink/renderer/core/inspector/inspect_tools.cc
@@ -100,10 +100,9 @@ SearchingForNodeTool::SearchingForNodeTool(InspectorDOMAgent* dom_agent, bool ua_shadow, - const String& config) + const std::vector<uint8_t>& config) : dom_agent_(dom_agent), ua_shadow_(ua_shadow) { - std::unique_ptr<protocol::Value> value = - protocol::StringUtil::parseJSON(config); + auto value = protocol::Value::parseBinary(config.data(), config.size()); if (!value) return; protocol::ErrorSupport errors;
diff --git a/third_party/blink/renderer/core/inspector/inspect_tools.h b/third_party/blink/renderer/core/inspector/inspect_tools.h index da47234f..ede4dec 100644 --- a/third_party/blink/renderer/core/inspector/inspect_tools.h +++ b/third_party/blink/renderer/core/inspector/inspect_tools.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECT_TOOLS_H_ +#include <vector> #include <v8-inspector.h> #include "base/macros.h" #include "third_party/blink/renderer/core/inspector/inspector_overlay_agent.h" @@ -20,7 +21,7 @@ public: SearchingForNodeTool(InspectorDOMAgent* dom_agent, bool ua_shadow, - const String& highlight_config); + const std::vector<uint8_t>& highlight_config); private: bool HandleInputEvent(LocalFrameView* frame_view,
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index 1913052..99bf4d3c 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -336,7 +336,7 @@ show_size_on_resize_(&agent_state_, false), paused_in_debugger_message_(&agent_state_, String()), inspect_mode_(&agent_state_, protocol::Overlay::InspectModeEnum::None), - inspect_mode_protocol_config_(&agent_state_, String()) {} + inspect_mode_protocol_config_(&agent_state_, std::vector<uint8_t>()) {} InspectorOverlayAgent::~InspectorOverlayAgent() { DCHECK(!overlay_page_); @@ -397,7 +397,7 @@ setShowViewportSizeOnResize(false); paused_in_debugger_message_.Clear(); inspect_mode_.Set(protocol::Overlay::InspectModeEnum::None); - inspect_mode_protocol_config_.Set(String()); + inspect_mode_protocol_config_.Set(std::vector<uint8_t>()); if (overlay_page_) { overlay_page_->WillBeDestroyed(); overlay_page_.Clear(); @@ -1082,10 +1082,11 @@ String("Unknown mode \"" + mode + "\" was provided.")); } - String serialized_config = - highlight_inspector_object.isJust() - ? highlight_inspector_object.fromJust()->toJSON() - : String(); + std::vector<uint8_t> serialized_config; + if (highlight_inspector_object.isJust()) { + serialized_config = + highlight_inspector_object.fromJust()->serializeToBinary(); + } std::unique_ptr<InspectorHighlightConfig> config; Response response = HighlightConfigFromInspectorObject( std::move(highlight_inspector_object), &config);
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h index 4abc8d7c..ab0b77fb 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.h
@@ -240,7 +240,7 @@ InspectorAgentState::Boolean show_size_on_resize_; InspectorAgentState::String paused_in_debugger_message_; InspectorAgentState::String inspect_mode_; - InspectorAgentState::String inspect_mode_protocol_config_; + InspectorAgentState::Bytes inspect_mode_protocol_config_; DISALLOW_COPY_AND_ASSIGN(InspectorOverlayAgent); };
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 cf33ac9..731fce0e 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
@@ -1054,8 +1054,20 @@ // Deal with marker's margin. It happens only when marker needs to occupy // the whole line. DCHECK(child.ListMarkerOccupiesWholeLine()); + // Because the marker is laid out as a normal block child, its inline size + // is extended to fill up the space. Compute the regular marker size from + // the first child. + const NGPhysicalContainerFragment& marker_fragment = + layout_result->PhysicalFragment(); + DCHECK(!marker_fragment.Children().empty()); + const NGPhysicalFragment& marker_child_fragment = + *marker_fragment.Children().front(); + LayoutUnit marker_inline_size = + marker_child_fragment.Size() + .ConvertToLogical(ConstraintSpace().GetWritingMode()) + .inline_size; auto_margins.inline_start = NGUnpositionedListMarker(To<NGBlockNode>(child)) - .InlineOffset(fragment.InlineSize()); + .InlineOffset(marker_inline_size); auto_margins.inline_end = opportunity.rect.InlineSize() - fragment.InlineSize() - auto_margins.inline_start; } else {
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc index 1a9feed0..aeb0d040 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
@@ -839,6 +839,10 @@ return kSizeAvailable; } +bool SVGImage::IsSizeAvailable() { + return SvgRootElement(page_.Get()); +} + String SVGImage::FilenameExtension() const { return "svg"; }
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.h b/third_party/blink/renderer/core/svg/graphics/svg_image.h index 1b2232c..29fe1bf 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.h +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.h
@@ -126,7 +126,7 @@ protected: // Whether or not size is available yet. - bool IsSizeAvailable() override { return !!page_; } + bool IsSizeAvailable() override; private: // Accesses m_page. @@ -247,6 +247,7 @@ FRIEND_TEST_ALL_PREFIXES(SVGImageTest, SupportsSubsequenceCaching); FRIEND_TEST_ALL_PREFIXES(SVGImageTest, LayoutShiftTrackerDisabled); FRIEND_TEST_ALL_PREFIXES(SVGImageTest, SetSizeOnVisualViewport); + FRIEND_TEST_ALL_PREFIXES(SVGImageTest, IsSizeAvailable); }; DEFINE_IMAGE_TYPE_CASTS(SVGImage);
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc b/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc index 90f51f29..078ece6 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image_test.cc
@@ -197,6 +197,18 @@ GetImage().GetPageForTesting()->GetVisualViewport().Size()); } +TEST_F(SVGImageTest, IsSizeAvailable) { + const bool kShouldPause = false; + Load("<svg xmlns='http://www.w3.org/2000/svg'></svg>", kShouldPause); + EXPECT_TRUE(GetImage().IsSizeAvailable()); + + Load("<notsvg></notsvg>", kShouldPause); + EXPECT_FALSE(GetImage().IsSizeAvailable()); + + Load("<notsvg xmlns='http://www.w3.org/2000/svg'></notsvg>", kShouldPause); + EXPECT_FALSE(GetImage().IsSizeAvailable()); +} + class SVGImageSimTest : public SimTest {}; TEST_F(SVGImageSimTest, PageVisibilityHiddenToVisible) {
diff --git a/third_party/blink/renderer/core/timing/layout_shift.cc b/third_party/blink/renderer/core/timing/layout_shift.cc index b11ba21..fd22888 100644 --- a/third_party/blink/renderer/core/timing/layout_shift.cc +++ b/third_party/blink/renderer/core/timing/layout_shift.cc
@@ -26,7 +26,7 @@ } PerformanceEntryType LayoutShift::EntryTypeEnum() const { - return PerformanceEntry::EntryType::kLayoutJank; + return PerformanceEntry::EntryType::kLayoutShift; } void LayoutShift::BuildJSONValue(V8ObjectBuilder& builder) const {
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc index 965ed76c..c3d009b 100644 --- a/third_party/blink/renderer/core/timing/performance.cc +++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -248,9 +248,7 @@ break; case PerformanceEntry::kTaskAttribution: break; - case PerformanceEntry::kLayoutJank: - UseCounter::Count(GetExecutionContext(), - WebFeature::kLayoutJankExplicitlyRequested); + case PerformanceEntry::kLayoutShift: for (const auto& layout_jank : layout_jank_buffer_) entries.push_back(layout_jank); break;
diff --git a/third_party/blink/renderer/core/timing/performance_entry.cc b/third_party/blink/renderer/core/timing/performance_entry.cc index 862b03e..67aa2304 100644 --- a/third_party/blink/renderer/core/timing/performance_entry.cc +++ b/third_party/blink/renderer/core/timing/performance_entry.cc
@@ -82,7 +82,7 @@ if (entry_type == performance_entry_names::kElement) return kElement; if (entry_type == performance_entry_names::kLayoutShift) - return kLayoutJank; + return kLayoutShift; if (entry_type == performance_entry_names::kLargestContentfulPaint) return kLargestContentfulPaint; 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 1b73d28b..68c90d3 100644 --- a/third_party/blink/renderer/core/timing/performance_entry.h +++ b/third_party/blink/renderer/core/timing/performance_entry.h
@@ -65,7 +65,7 @@ kEvent = 1 << 7, kFirstInput = 1 << 8, kElement = 1 << 9, - kLayoutJank = 1 << 10, + kLayoutShift = 1 << 10, kLargestContentfulPaint = 1 << 11, };
diff --git a/third_party/blink/renderer/core/timing/performance_observer.cc b/third_party/blink/renderer/core/timing/performance_observer.cc index ec1dc4c..bb135403 100644 --- a/third_party/blink/renderer/core/timing/performance_observer.cc +++ b/third_party/blink/renderer/core/timing/performance_observer.cc
@@ -196,9 +196,9 @@ } filter_options_ |= entry_type; } - if (filter_options_ & PerformanceEntry::kLayoutJank) { + if (filter_options_ & PerformanceEntry::kLayoutShift) { UseCounter::Count(GetExecutionContext(), - WebFeature::kLayoutJankExplicitlyRequested); + WebFeature::kLayoutShiftExplicitlyRequested); } if (is_registered_) performance_->UpdatePerformanceObserverFilterOptions();
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc index 99336cd5..a7c70f6 100644 --- a/third_party/blink/renderer/core/timing/window_performance.cc +++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -434,7 +434,7 @@ now(), jank_fraction, input_detected, input_detected ? MonotonicTimeToDOMHighResTimeStamp(input_timestamp) : 0.0); - if (HasObserverFor(PerformanceEntry::kLayoutJank)) + if (HasObserverFor(PerformanceEntry::kLayoutShift)) NotifyObserversOfEntry(*entry); AddLayoutJankBuffer(*entry); }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc index 499b062..e2bfaeb 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_types_util.cc
@@ -117,8 +117,7 @@ } // namespace bool RequireTrustedTypesCheck(const ExecutionContext* execution_context) { - return execution_context && - execution_context->GetSecurityContext().RequireTrustedTypes(); + return execution_context && execution_context->RequireTrustedTypes(); } String GetStringFromTrustedType(
diff --git a/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js b/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js index 4e6d28b4..b17f92a3 100644 --- a/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js +++ b/third_party/blink/renderer/devtools/front_end/audits/AuditsStartView.js
@@ -25,8 +25,7 @@ if (!runtimeSetting || !runtimeSetting.options) throw new Error(`${settingName} is not a setting with options`); - const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting); - control.element.title = runtimeSetting.description; + const control = new Audits.RadioSetting(runtimeSetting.options, runtimeSetting.setting, runtimeSetting.description); parentElement.appendChild(control.element); }
diff --git a/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js b/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js index fabf8aab..7d85dbd 100644 --- a/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js +++ b/third_party/blink/renderer/devtools/front_end/audits/RadioSetting.js
@@ -6,12 +6,15 @@ /** * @param {!Array<!{value: string, label: string}>} options * @param {!Common.Setting} setting + * @param {string} description */ - constructor(options, setting) { + constructor(options, setting, description) { this._setting = setting; this._options = options; this.element = createElement('div', 'audits-radio-group'); + this.element.title = description; + UI.ARIAUtils.setDescription(this.element, description); this._radioElements = []; for (const option of this._options) {
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc index af06a4e..3ea1a9d6 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl.cc
@@ -631,8 +631,6 @@ volume_control_container_->ParserAppendChild(mute_button_); button_panel->ParserAppendChild(volume_control_container_); - MaybeParserAppendChild(button_panel, picture_in_picture_button_); - button_panel->ParserAppendChild(fullscreen_button_); button_panel->ParserAppendChild(overflow_menu_); @@ -1214,9 +1212,7 @@ std::make_pair(fullscreen_button_.Get(), true), std::make_pair(current_time_display_.Get(), true), std::make_pair(duration_display_.Get(), true), - picture_in_picture_button_.Get() - ? std::make_pair(picture_in_picture_button_.Get(), false) - : std::make_pair(nullptr, false), + std::make_pair(picture_in_picture_button_.Get(), false), std::make_pair(cast_button_.Get(), false), std::make_pair(download_button_.Get(), false), std::make_pair(toggle_closed_captions_button_.Get(), false), @@ -1942,8 +1938,7 @@ mute_button_.Get(), volume_slider_.Get(), toggle_closed_captions_button_.Get(), - picture_in_picture_button_.Get() ? picture_in_picture_button_.Get() - : nullptr, + picture_in_picture_button_.Get(), cast_button_.Get(), current_time_display_.Get(), duration_display_.Get(),
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl b/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl index 1e96b32..5cb829a 100644 --- a/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl +++ b/third_party/blink/renderer/modules/native_file_system/file_system_directory_handle.idl
@@ -5,6 +5,7 @@ // https://wicg.github.io/native-file-system/#filesystemdirectoryhandle [ Exposed=(Window,Worker), + SecureContext, RuntimeEnabled=NativeFileSystem, ImplementedAs=NativeFileSystemDirectoryHandle ] interface FileSystemDirectoryHandle : FileSystemHandle {
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl b/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl index bd4170e7..2dc91c5c 100644 --- a/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl +++ b/third_party/blink/renderer/modules/native_file_system/file_system_file_handle.idl
@@ -5,6 +5,7 @@ // https://wicg.github.io/native-file-system/#filesystemfilehandle [ Exposed=(Window,Worker), + SecureContext, RuntimeEnabled=NativeFileSystem, ImplementedAs=NativeFileSystemFileHandle ] interface FileSystemFileHandle : FileSystemHandle {
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl b/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl index 97d0efd..39c7edc 100644 --- a/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl +++ b/third_party/blink/renderer/modules/native_file_system/file_system_handle.idl
@@ -5,6 +5,7 @@ // https://wicg.github.io/native-file-system/#filesystemhandle [ Exposed=(Window,Worker), + SecureContext, RuntimeEnabled=NativeFileSystem, ImplementedAs=NativeFileSystemHandle ] interface FileSystemHandle {
diff --git a/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl b/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl index 52ebb44e..8fb8589 100644 --- a/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl +++ b/third_party/blink/renderer/modules/native_file_system/file_system_writer.idl
@@ -5,6 +5,7 @@ // https://wicg.github.io/native-file-system/#filesystemwriter [ Exposed=(Window,Worker), + SecureContext, ImplementedAs=NativeFileSystemWriter, RuntimeEnabled=NativeFileSystem ] interface FileSystemWriter {
diff --git a/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl b/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl index 574d4b5..f17cd62 100644 --- a/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl +++ b/third_party/blink/renderer/modules/native_file_system/window_native_file_system.idl
@@ -4,10 +4,11 @@ // https://wicg.github.io/native-file-system/#api-choosefilesystementries [ + SecureContext, RuntimeEnabled=NativeFileSystem, ImplementedAs=WindowNativeFileSystem ] partial interface Window { - [CallWith=ScriptState, SecureContext] + [CallWith=ScriptState] Promise<(FileSystemHandle or sequence<FileSystemHandle>)> chooseFileSystemEntries(optional ChooseFileSystemEntriesOptions options); };
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc index 836cb17..9cdb191 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -886,6 +886,13 @@ context_provider_wrapper_, owning_thread_id_, is_origin_top_left_, std::move(release_callback)); + // The StaticBitmapImage is used for readbacks which may modify the texture + // params. We reset this when the image is destroyed but it is important to + // also do it here in case we try to send the resource to the display + // compositor while the |image| is still alive. + if (!is_cross_thread()) + owning_thread_data().needs_gl_filter_reset = true; + DCHECK(image); return image; }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc index 4d5d2d37f..2af2d18c 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -553,8 +553,14 @@ if (!IsValid()) return nullptr; - EndWriteAccess(); - return resource_->Bitmap(); + if (!cached_snapshot_) { + EndWriteAccess(); + cached_snapshot_ = resource_->Bitmap(); + } + + DCHECK(cached_snapshot_); + DCHECK(!current_resource_has_write_access_); + return cached_snapshot_; } void WillDraw() override { @@ -563,6 +569,11 @@ if (IsGpuContextLost()) return; + // Since the resource will be updated, the cached snapshot is no longer + // valid. Note that it is important to release this reference here to not + // trigger copy-on-write below from the resource ref in the snapshot. + cached_snapshot_.reset(); + if (DoCopyOnWrite()) { DCHECK(!current_resource_has_write_access_) << "Write access must be released before sharing the resource"; @@ -692,6 +703,7 @@ const bool is_overlay_candidate_; bool current_resource_has_write_access_ = false; scoped_refptr<CanvasResource> resource_; + scoped_refptr<StaticBitmapImage> cached_snapshot_; }; // This class does nothing except answering to ProduceCanvasResource() by piping
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 2a4cd20..8c3458b 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -543,6 +543,14 @@ ], }, { + 'paths': ['third_party/blink/renderer/core/inspector'], + 'allowed': [ + # Devtools binary protocol uses std::vector<uint8_t> for serialized + # objects. + 'std::vector', + ], + }, + { 'paths': ['third_party/blink/renderer/core/inspector/inspector_performance_agent.cc'], 'allowed': [ 'base::subtle::TimeTicksNowIgnoringOverride',
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json index fb39edd..78b77ff2 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -476677,7 +476677,7 @@ "support" ], "tools/wptrunner/wptrunner/browsers/chrome_android.py": [ - "3c277a567d7f06f39dfc02cb18d5229c7570a131", + "31ae7995b4010a6fcef0c585eed1128815837fcb", "support" ], "tools/wptrunner/wptrunner/browsers/edge.py": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-invalid.html new file mode 100644 index 0000000..3fcd9a8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-invalid.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Box Alignment Level 3: parsing place-content with invalid values</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content"> +<meta name="assert" content="place-content supports only the grammar '<align-content> <justify-content>?'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("place-content", "auto"); + +test_invalid_value("place-content", "self-end unsafe"); +test_invalid_value("place-content", "self-start"); + +test_invalid_value("place-content", "left"); +test_invalid_value("place-content", "unsafe right"); +test_invalid_value("place-content", "left normal"); +test_invalid_value("place-content", "unsafe right stretch"); + +test_invalid_value("place-content", "normal flex-start baseline"); +test_invalid_value("place-content", "first baseline first baseline"); + +test_invalid_value("place-content", "baseline safe"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-valid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-valid.html new file mode 100644 index 0000000..a83aa4c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-content-valid.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Box Alignment Level 3: parsing place-content with valid values</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-content"> +<meta name="assert" content="place-content supports the full grammar '<align-content> <justify-content>?'."> +<meta name="assert" content="<baseline-position> and <baseline-position> start are equivalent."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value("place-content", "normal normal", "normal"); + +test_valid_value("place-content", "first baseline", "baseline start"); +test_valid_value("place-content", "baseline", "baseline start"); +test_valid_value("place-content", "first baseline start", "baseline start"); +test_valid_value("place-content", "last baseline", "last baseline start"); +test_valid_value("place-content", "first baseline stretch", "baseline stretch"); +test_valid_value("place-content", "last baseline flex-start"); + +test_valid_value("place-content", "baseline stretch"); + +test_valid_value("place-content", "space-between"); +test_valid_value("place-content", "space-around"); +test_valid_value("place-content", "space-evenly"); +test_valid_value("place-content", "stretch"); + +test_valid_value("place-content", "center"); +test_valid_value("place-content", "end"); +test_valid_value("place-content", "flex-start flex-start", "flex-start"); +test_valid_value("place-content", "unsafe end unsafe end", "unsafe end"); +test_valid_value("place-content", "safe flex-start"); + +test_valid_value("place-content", "normal stretch"); +test_valid_value("place-content", "baseline space-around"); +test_valid_value("place-content", "space-evenly unsafe end"); +test_valid_value("place-content", "center normal"); + +test_valid_value("place-content", "normal right"); +test_valid_value("place-content", "baseline unsafe left"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-invalid.html new file mode 100644 index 0000000..9468d30 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-invalid.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Box Alignment Level 3: parsing place-items with invalid values</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items"> +<meta name="assert" content="place-items supports only the grammar '<align-items> <justify-items>?'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("place-items", "auto"); + +test_invalid_value("place-items", "space-around"); +test_invalid_value("place-items", "space-between"); +test_invalid_value("place-items", "space-evenly"); + +test_invalid_value("place-items", "left"); +test_invalid_value("place-items", "unsafe right"); +test_invalid_value("place-items", "left baseline"); +test_invalid_value("place-items", "unsafe right flex-end"); + +test_invalid_value("place-items", "legacy center"); +test_invalid_value("place-items", "legacy left"); +test_invalid_value("place-items", "legacy"); +test_invalid_value("place-items", "legacy right flex-start"); +test_invalid_value("place-items", "legacy normal"); + +test_invalid_value("place-items", "normal flex-start baseline"); + +test_invalid_value("place-items", "baseline safe"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-valid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-valid.html new file mode 100644 index 0000000..72179bf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-items-valid.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Box Alignment Level 3: parsing place-items with valid values</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-items"> +<meta name="assert" content="place-items supports the full grammar '<align-items> <justify-items>?'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value("place-items", "normal"); +test_valid_value("place-items", "stretch stretch", "stretch"); + +test_valid_value("place-items", "first baseline", "baseline"); +test_valid_value("place-items", "last baseline last baseline", "last baseline"); + +test_valid_value("place-items", "center"); +test_valid_value("place-items", "end end", "end"); +test_valid_value("place-items", "self-start"); +test_valid_value("place-items", "flex-end"); +test_valid_value("place-items", "unsafe center unsafe center", "unsafe center"); +test_valid_value("place-items", "safe self-end"); + +test_valid_value("place-items", "stretch baseline"); +test_valid_value("place-items", "last baseline center"); +test_valid_value("place-items", "safe self-end normal"); + +test_valid_value("place-items", "normal right"); +test_valid_value("place-items", "baseline unsafe left"); + +test_valid_value("place-items", "flex-end legacy"); +test_valid_value("place-items", "stretch legacy left"); +test_valid_value("place-items", "first baseline right legacy", "baseline legacy right"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-invalid.html new file mode 100644 index 0000000..8a7a2ab --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-invalid.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Box Alignment Level 3: parsing place-self with invalid values</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self"> +<meta name="assert" content="place-self supports only the grammar '<align-self> <justify-self>?'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_invalid_value("place-self", "space-around"); +test_invalid_value("place-self", "space-between"); +test_invalid_value("place-self", "space-evenly"); + +test_invalid_value("place-self", "right"); +test_invalid_value("place-self", "unsafe left"); +test_invalid_value("place-self", "right start"); +test_invalid_value("place-self", "unsafe left stretch"); + +test_invalid_value("place-self", "normal flex-start baseline"); + +test_invalid_value("place-self", "baseline safe"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-valid.html b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-valid.html new file mode 100644 index 0000000..36a8bd5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-align/parsing/place-self-valid.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Box Alignment Level 3: parsing place-self with valid values</title> +<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-place-self"> +<meta name="assert" content="place-self supports the full grammar '<align-self> <justify-self>?'."> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/css/support/parsing-testcommon.js"></script> +</head> +<body> +<script> +test_valid_value("place-self", "auto auto", "auto"); +test_valid_value("place-self", "normal"); +test_valid_value("place-self", "stretch"); + +test_valid_value("place-self", "first baseline", "baseline"); +test_valid_value("place-self", "last baseline last baseline", "last baseline"); + +test_valid_value("place-self", "center center", "center"); +test_valid_value("place-self", "start"); +test_valid_value("place-self", "self-start"); +test_valid_value("place-self", "flex-end"); +test_valid_value("place-self", "unsafe center"); +test_valid_value("place-self", "safe self-end safe self-end", "safe self-end"); + +test_valid_value("place-self", "auto last baseline"); +test_valid_value("place-self", "baseline flex-end"); +test_valid_value("place-self", "unsafe center stretch"); + +test_valid_value("place-self", "normal right"); +test_valid_value("place-self", "baseline unsafe left"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js similarity index 100% rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.window.js rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemBaseHandle-remove.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js similarity index 100% rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.window.js rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getDirectory.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js similarity index 100% rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.window.js rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemDirectoryHandle-getFile.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.https.window.js similarity index 100% rename from third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.window.js rename to third_party/blink/web_tests/external/wpt/native-file-system/FileSystemWriter.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.window.js b/third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js similarity index 100% rename from third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.window.js rename to third_party/blink/web_tests/external/wpt/native-file-system/NativeFileSystemWritableFileStream.tentative.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js index 88227cb..16a859a 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -580,7 +580,9 @@ this.setGripOrigin(fakeInputSourceInit.gripOrigin); } - this.gamepad_ = null; + // This properly handles if supportedButtons were not specified. + this.setSupportedButtons(fakeInputSourceInit.supportedButtons); + this.emulated_position_ = false; this.desc_dirty_ = true; } @@ -633,6 +635,10 @@ startSelection() { this.primary_input_pressed_ = true; + if (this.gamepad_) { + this.gamepad_.buttons[0].pressed = true; + this.gamepad_.buttons[0].touched = true; + } } endSelection() { @@ -642,12 +648,89 @@ this.primary_input_pressed_ = false; this.primary_input_clicked_ = true; + + if (this.gamepad_) { + this.gamepad_.buttons[0].pressed = false; + this.gamepad_.buttons[0].touched = false; + } } simulateSelect() { this.primary_input_clicked_ = true; } + setSupportedButtons(supportedButtons) { + this.gamepad_ = null; + this.supported_buttons_ = []; + + // If there are no supported buttons, we can stop now. + if (supportedButtons == null || supportedButtons.length < 1) { + return; + } + + let supported_button_map = {}; + this.gamepad_ = this.getEmptyGamepad(); + for (let i = 0; i < supportedButtons.length; i++) { + let buttonType = supportedButtons[i].buttonType; + this.supported_buttons_.push(buttonType); + supported_button_map[buttonType] = supportedButtons[i]; + } + + // Let's start by building the button state in order of priority: + // Primary button is index 0. + this.gamepad_.buttons.push({ + pressed: this.primary_input_pressed_, + touched: this.primary_input_pressed_, + value: this.primary_input_pressed_ ? 1.0 : 0.0 + }); + + // Now add the rest of our buttons + this.addGamepadButton(supported_button_map['grip']); + this.addGamepadButton(supported_button_map['touchpad']); + this.addGamepadButton(supported_button_map['thumbstick']); + this.addGamepadButton(supported_button_map['optional-button']); + this.addGamepadButton(supported_button_map['optional-thumbstick']); + + // Finally, back-fill placeholder buttons/axes + for (let i = 0; i < this.gamepad_.buttons.length; i++) { + if (this.gamepad_.buttons[i] == null) { + this.gamepad_.buttons[i] = { + pressed: false, + touched: false, + value: 0 + } + } + } + + for (let i=0; i < this.gamepad_.axes.length; i++) { + if (this.gamepad_.axes[i] == null) { + this.gamepad_.axes[i] = 0; + } + } + } + + updateButtonState(buttonState) { + if (this.supported_buttons_.indexOf(buttonState.buttonType) == -1) { + throw new Error("Tried to update state on an unsupported button"); + } + + let buttonIndex = this.getButtonIndex(buttonState.buttonType); + let axesStartIndex = this.getAxesStartIndex(buttonState.buttonType); + + if (buttonIndex == -1) { + throw new Error("Unknown Button Type!"); + } + + this.gamepad_.buttons[buttonIndex].pressed = buttonState.pressed; + this.gamepad_.buttons[buttonIndex].touched = buttonState.touched; + this.gamepad_.buttons[buttonIndex].value = buttonState.pressedValue; + + if (axesStartIndex != -1) { + this.gamepad_.axes[axesStartIndex] = buttonState.xValue == null ? 0.0 : buttonState.xValue; + this.gamepad_.axes[axesStartIndex + 1] = buttonState.yValue == null ? 0.0 : buttonState.yValue; + } + } + // Helpers for Mojom getInputSourceState() { let input_state = new device.mojom.XRInputSourceState(); @@ -696,6 +779,89 @@ return input_state; } + + getEmptyGamepad() { + // Mojo complains if some of the properties on Gamepad are null, so set + // everything to reasonable defaults that tests can override. + let gamepad = new device.mojom.Gamepad(); + gamepad.connected = true; + gamepad.id = ""; + gamepad.timestamp = 0; + gamepad.axes = []; + gamepad.buttons = []; + gamepad.mapping = "xr-standard"; + gamepad.display_id = 0; + + switch (this.handedness_) { + case 'left': + gamepad.hand = device.mojom.GamepadHand.GamepadHandLeft; + break; + case 'right': + gamepad.hand = device.mojom.GamepadHand.GamepadHandRight; + break; + default: + gamepad.hand = device.mojom.GamepadHand.GamepadHandNone; + break; + } + + return gamepad; + } + + addGamepadButton(buttonState) { + if (buttonState == null) { + return; + } + + let buttonIndex = this.getButtonIndex(buttonState.buttonType); + let axesStartIndex = this.getAxesStartIndex(buttonState.buttonType); + + if (buttonIndex == -1) { + throw new Error("Unknown Button Type!"); + } + + this.gamepad_.buttons[buttonIndex] = { + pressed: buttonState.pressed, + touched: buttonState.touched, + value: buttonState.pressedValue + }; + + // Add x/y value if supported. + if (axesStartIndex != -1) { + this.gamepad_.axes[axesStartIndex] = (buttonState.xValue == null ? 0.0 : buttonSate.xValue); + this.gamepad_.axes[axesStartIndex + 1] = (buttonState.yValue == null ? 0.0 : buttonSate.yValue); + } + } + + // General Helper methods + getButtonIndex(buttonType) { + switch (buttonType) { + case 'grip': + return 1; + case 'touchpad': + return 2; + case 'thumbstick': + return 3; + case 'optional-button': + return 4; + case 'optional-thumbstick': + return 5; + default: + return -1; + } + } + + getAxesStartIndex(buttonType) { + switch (buttonType) { + case 'touchpad': + return 0; + case 'thumbstick': + return 2; + case 'optional-thumbstick': + return 4; + default: + return -1; + } + } } // Mojo helper classes
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py index 3c277a5..31ae799 100644 --- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py +++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -48,18 +48,18 @@ **kwargs) executor_kwargs["close_after_done"] = True capabilities = dict(DesiredCapabilities.CHROME.items()) - capabilities["chromeOptions"] = {} - # required to start on mobile - capabilities["chromeOptions"]["androidPackage"] = "com.google.android.apps.chrome" + capabilities["goog:chromeOptions"] = {} + # TODO(chrome): browser_channel should be properly supported. + package_name = "com.android.chrome" # stable channel + # Required to start on mobile + capabilities["goog:chromeOptions"]["androidPackage"] = package_name for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]: if kwargs[kwarg] is not None: - capabilities["chromeOptions"][capability] = kwargs[kwarg] + capabilities["goog:chromeOptions"][capability] = kwargs[kwarg] if test_type == "testharness": capabilities["useAutomationExtension"] = False capabilities["excludeSwitches"] = ["enable-automation"] - if test_type == "wdspec": - capabilities["chromeOptions"]["w3c"] = True executor_kwargs["capabilities"] = capabilities return executor_kwargs @@ -86,15 +86,17 @@ self.server = ChromeDriverServer(self.logger, binary=webdriver_binary, args=webdriver_args) + self.setup_adb_reverse() def _adb_run(self, args): self.logger.info('adb ' + ' '.join(args)) subprocess.check_call(['adb'] + args) - def setup(self): + def setup_adb_reverse(self): self._adb_run(['wait-for-device']) self._adb_run(['forward', '--remove-all']) self._adb_run(['reverse', '--remove-all']) + # "adb reverse" forwards network connection from device to host. for port in _wptserve_ports: self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
diff --git a/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js b/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js index 7961674..671852f 100644 --- a/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js +++ b/third_party/blink/web_tests/external/wpt/wake-lock/wakelock-abortsignal.https.any.js
@@ -14,7 +14,7 @@ ]; for (let signal of invalidSignals) { - await promise_rejects(t, new TypeError(), WakeLock.request('screen', { signal: signal })); + await promise_rejects(t, new TypeError(), WakeLock.request('system', { signal: signal })); } }, "'TypeError' is thrown when the signal option is not an AbortSignal"); @@ -24,7 +24,7 @@ abortController.abort(); assert_true(abortSignal.aborted); - return promise_rejects(t, "AbortError", WakeLock.request('screen', { signal: abortSignal })); + return promise_rejects(t, "AbortError", WakeLock.request('system', { signal: abortSignal })); }, "A WakeLock request with an AbortSignal whose abort flag is set always aborts"); promise_test(async t => { @@ -33,8 +33,8 @@ abortController.abort(); assert_true(abortSignal.aborted); - const lock1 = WakeLock.request('screen', { signal: abortSignal }); - const lock2 = WakeLock.request('screen', { signal: abortSignal }); + const lock1 = WakeLock.request('system', { signal: abortSignal }); + const lock2 = WakeLock.request('system', { signal: abortSignal }); const lock3 = WakeLock.request('system', { signal: abortSignal }); await promise_rejects(t, "AbortError", lock1);
diff --git a/third_party/blink/web_tests/xr/events_input_source_recreation.html b/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html similarity index 81% rename from third_party/blink/web_tests/xr/events_input_source_recreation.html rename to third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html index 347c9bb..ab78d9d8 100644 --- a/third_party/blink/web_tests/xr/events_input_source_recreation.html +++ b/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -15,9 +12,7 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - -let testFunction = function(session, t, fakeDeviceController) { +let testFunction = function(session, fakeDeviceController, t) { let eventWatcher = new EventWatcher(t, session, ["watcherdone"]); let eventPromise = eventWatcher.wait_for(["watcherdone"]); @@ -94,9 +89,6 @@ session.addEventListener('inputsourceschange', onInputSourcesChange, false); - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - // Create a gaze based input source with no handedness that we can change // to validate SameObject properties. let input_source = fakeDeviceController.simulateInputSourceConnection({ @@ -121,5 +113,5 @@ }; xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/events_input_sources_change.html b/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html similarity index 78% rename from third_party/blink/web_tests/xr/events_input_sources_change.html rename to third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html index e2bbedc1..bc2b2a9 100644 --- a/third_party/blink/web_tests/xr/events_input_sources_change.html +++ b/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -15,9 +12,7 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - -let testFunction = function(session, t, fakeDeviceController) { +let testFunction = function(session, fakeDeviceController, t) { let eventWatcher = new EventWatcher( t, session, ["inputsourceschange", "selectstart", "select", "selectend", "watcherdone"]); let eventPromise = eventWatcher.wait_for( @@ -76,9 +71,6 @@ session.addEventListener('inputsourceschange', onInputSourcesChange, false); - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - // Create our input source and immediately toggle the primary input so that // it appears as already needing to send a click event when it appears. let input_source = fakeDeviceController.simulateInputSourceConnection({ @@ -100,5 +92,5 @@ }; xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/events_session_select.html b/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html similarity index 77% rename from third_party/blink/web_tests/xr/events_session_select.html rename to third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html index 688ff6e..b74d5ea 100644 --- a/third_party/blink/web_tests/xr/events_session_select.html +++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -16,11 +13,9 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - let xrViewerSpace = null; -let testFunction = function(session, t, fakeDeviceController) { +let testFunction = function(session, fakeDeviceController, t) { let eventWatcher = new EventWatcher( t, session, ["selectstart", "select", "selectend", "watcherdone"]); let eventPromise = eventWatcher.wait_for( @@ -70,9 +65,6 @@ session.addEventListener("selectend", onSessionSelectEnd, false); session.addEventListener("select", onSessionSelect, false); - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - let input_source = fakeDeviceController.simulateInputSourceConnection(VALID_CONTROLLER); let currentReferenceSpace = null; @@ -102,6 +94,6 @@ }; xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/events_session_select_subframe.html b/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html similarity index 69% rename from third_party/blink/web_tests/xr/events_session_select_subframe.html rename to third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html index 395b962..0e2c2342 100644 --- a/third_party/blink/web_tests/xr/events_session_select_subframe.html +++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -17,9 +14,7 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - -let testFunction = function(session, t, fakeDeviceController) { +let testFunction = function(session, fakeDeviceController, t) { let eventWatcher = new EventWatcher( t, session, ["selectstart", "selectend", "select", "watcherdone"]); let eventPromise = eventWatcher.wait_for( @@ -53,9 +48,6 @@ session.addEventListener("selectend", onSessionSelectEnd, false); session.addEventListener("select", onSessionSelect, false); - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - let input_source = fakeDeviceController.simulateInputSourceConnection(VALID_CONTROLLER); // Press the primary input button and then release it a short time later. @@ -69,6 +61,6 @@ }; xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/getInputPose_handedness.html b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html similarity index 70% rename from third_party/blink/web_tests/xr/getInputPose_handedness.html rename to third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html index ecf462f..5a310c6 100644 --- a/third_party/blink/web_tests/xr/getInputPose_handedness.html +++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -14,13 +11,8 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - let testFunction = - (session, t, fakeDeviceController) => new Promise((resolve) => { - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - + (session, fakeDeviceController, t) => new Promise((resolve) => { let input_source = fakeDeviceController.simulateInputSourceConnection({ handedness: "none", targetRayMode: "tracked-pointer", @@ -87,6 +79,6 @@ }); xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/getInputPose_hand.html b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html similarity index 71% rename from third_party/blink/web_tests/xr/getInputPose_hand.html rename to third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html index d257638..c8545999 100644 --- a/third_party/blink/web_tests/xr/getInputPose_hand.html +++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html
@@ -1,11 +1,9 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -15,14 +13,8 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - let testFunction = - (session, t, fakeDeviceController) => new Promise((resolve) => { - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - - + (session, fakeDeviceController, t) => new Promise((resolve) => { let input_source = fakeDeviceController.simulateInputSourceConnection({ handedness: "right", targetRayMode: "tracked-pointer", @@ -62,9 +54,9 @@ // When a grip matrix is present but no pointer offset is specified, // the grip and pointer matrices should be the same. assert_not_equals(grip_pose, null); - assert_matrices_approx_equal(grip_pose.transform.matrix, VALID_GRIP, + assert_matrix_approx_equals(grip_pose.transform.matrix, VALID_GRIP, FLOAT_EPSILON, "Grip matrix is not equal to input."); - assert_matrices_approx_equal(input_pose.transform.matrix, + assert_matrix_approx_equals(input_pose.transform.matrix, grip_pose.transform.matrix, FLOAT_EPSILON, "Grip matrix is not equal to target ray matrix."); }); @@ -85,9 +77,9 @@ // pointer matrix should be grip matrix multiplied with the pointer // offset. assert_not_equals(grip_pose, null); - assert_matrices_approx_equal(grip_pose.transform.matrix, VALID_GRIP, + assert_matrix_approx_equals(grip_pose.transform.matrix, VALID_GRIP, FLOAT_EPSILON, "Grip matrix is not equal to input valid grip."); - assert_matrices_approx_equal(input_pose.transform.matrix, + assert_matrix_approx_equals(input_pose.transform.matrix, VALID_GRIP_WITH_POINTER_OFFSET, FLOAT_EPSILON, "Grip matrix not multipled properly."); }); @@ -101,6 +93,6 @@ }); xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js index 2253ffc..36524211 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js +++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_asserts.js
@@ -1,10 +1,11 @@ // Utility assert functions. // Relies on resources/testharness.js to be included before this file. +// Relies on webxr_test_constants.js to be included before this file. // |p1|, |p2| - objects with x, y, z, w components that are floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_point_approx_equals = function(p1, p2, epsilon, prefix = "") { +let assert_point_approx_equals = function(p1, p2, epsilon = FLOAT_EPSILON, prefix = "") { assert_approx_equals(p1.x, p2.x, epsilon, prefix + "xs must match"); assert_approx_equals(p1.y, p2.y, epsilon, prefix + "ys must match"); assert_approx_equals(p1.z, p2.z, epsilon, prefix + "zs must match"); @@ -14,7 +15,7 @@ // |m1|, |m2| - arrays of floating point numbers // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_matrix_approx_equals = function(m1, m2, epsilon, prefix = "") { +let assert_matrix_approx_equals = function(m1, m2, epsilon = FLOAT_EPSILON, prefix = "") { assert_equals(m1.length, m2.length, prefix + "Matrix lengths should match"); for(var i = 0; i < m1.length; ++i) { assert_approx_equals(m1[i], m2[i], epsilon, prefix + "Component number " + i + " should match"); @@ -24,7 +25,7 @@ // |r1|, |r2| - XRRay objects // |epsilon| - float specifying precision // |prefix| - string used as a prefix for logging -let assert_ray_approx_equals = function(r1, r2, epsilon, prefix = "") { +let assert_ray_approx_equals = function(r1, r2, epsilon = FLOAT_EPSILON, prefix = "") { assert_point_approx_equals(r1.origin, r2.origin, epsilon, prefix + "origin:"); assert_point_approx_equals(r1.direction, r2.direction, epsilon, prefix + "direction:"); assert_matrix_approx_equals(r1.matrix, r2.matrix, epsilon, prefix + "matrix:");
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js index fd6d0fb1..a0b0e27 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js +++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js
@@ -50,8 +50,10 @@ orientation: [0, 0, 0, 1] }; -const VALID_GRIP_WITH_POINTER_OFFSET = - [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 4, 3, 3, 1]; +const VALID_GRIP_WITH_POINTER_OFFSET = [1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 4, 3, 3, 1]; // A Valid Local to floor matrix/transform for when we don't care about specific // values. Note that these should be identical, just different representations.
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js index 54a91c8..3a6a6c9 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js +++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js
@@ -121,7 +121,7 @@ '/gen/mojo/public/mojom/base/time.mojom.js', '/gen/gpu/ipc/common/mailbox_holder.mojom.js', '/gen/gpu/ipc/common/sync_token.mojom.js', - '/gen/ui/display/mojo/display.mojom.js', + '/gen/ui/display/mojom/display.mojom.js', '/gen/ui/gfx/geometry/mojo/geometry.mojom.js', '/gen/ui/gfx/mojo/gpu_fence_handle.mojom.js', '/gen/ui/gfx/mojo/transform.mojom.js',
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/xr-test-asserts.js b/third_party/blink/web_tests/external/wpt/webxr/resources/xr-test-asserts.js deleted file mode 100644 index 2253ffc..0000000 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/xr-test-asserts.js +++ /dev/null
@@ -1,31 +0,0 @@ -// Utility assert functions. -// Relies on resources/testharness.js to be included before this file. - -// |p1|, |p2| - objects with x, y, z, w components that are floating point numbers -// |epsilon| - float specifying precision -// |prefix| - string used as a prefix for logging -let assert_point_approx_equals = function(p1, p2, epsilon, prefix = "") { - assert_approx_equals(p1.x, p2.x, epsilon, prefix + "xs must match"); - assert_approx_equals(p1.y, p2.y, epsilon, prefix + "ys must match"); - assert_approx_equals(p1.z, p2.z, epsilon, prefix + "zs must match"); - assert_approx_equals(p1.w, p2.w, epsilon, prefix + "ws must match"); -}; - -// |m1|, |m2| - arrays of floating point numbers -// |epsilon| - float specifying precision -// |prefix| - string used as a prefix for logging -let assert_matrix_approx_equals = function(m1, m2, epsilon, prefix = "") { - assert_equals(m1.length, m2.length, prefix + "Matrix lengths should match"); - for(var i = 0; i < m1.length; ++i) { - assert_approx_equals(m1[i], m2[i], epsilon, prefix + "Component number " + i + " should match"); - } -} - -// |r1|, |r2| - XRRay objects -// |epsilon| - float specifying precision -// |prefix| - string used as a prefix for logging -let assert_ray_approx_equals = function(r1, r2, epsilon, prefix = "") { - assert_point_approx_equals(r1.origin, r2.origin, epsilon, prefix + "origin:"); - assert_point_approx_equals(r1.direction, r2.direction, epsilon, prefix + "direction:"); - assert_matrix_approx_equals(r1.matrix, r2.matrix, epsilon, prefix + "matrix:"); -}
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html index e2920b1..2f84d64 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html
@@ -3,7 +3,7 @@ <script src=/resources/testharnessreport.js></script> <script src="resources/webxr_util.js"></script> <script src="resources/webxr_test_constants.js"></script> -<script src="resources/xr-test-asserts.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas></canvas> <script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html index 50e8abf1..2c79126 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html
@@ -3,7 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="resources/webxr_test_constants.js"></script> <script src="resources/webxr_util.js"></script> -<script src="resources/xr-test-asserts.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas></canvas> <script>
diff --git a/third_party/blink/web_tests/xr/xrInputSource_add_remove.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html similarity index 68% rename from third_party/blink/web_tests/xr/xrInputSource_add_remove.html rename to third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html index 51a9b5c8..4c50670 100644 --- a/third_party/blink/web_tests/xr/xrInputSource_add_remove.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -15,12 +12,7 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - -let testFunction = (session, t, fakeDeviceController) => new Promise((resolve) => { - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - +let testFunction = (session, fakeDeviceController, t) => new Promise((resolve) => { let input_sources = session.inputSources; t.step( () => { @@ -72,6 +64,6 @@ }); xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/xrInputSource_gamepad_disconnect.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_disconnect.https.html similarity index 80% rename from third_party/blink/web_tests/xr/xrInputSource_gamepad_disconnect.html rename to third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_disconnect.https.html index fd22ecb1..a43bdaa 100644 --- a/third_party/blink/web_tests/xr/xrInputSource_gamepad_disconnect.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_disconnect.https.html
@@ -1,12 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-internal-device-mocking.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -16,9 +12,7 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - -let testFunction = function(session, t, fakeDeviceController) { +let testFunction = function(session, fakeDeviceController, t) { let eventWatcher = new EventWatcher(t, session, ["watcherdone"]); let eventPromise = eventWatcher.wait_for(["watcherdone"]); @@ -96,13 +90,30 @@ session.addEventListener('inputsourceschange', onInputSourcesChange, false); - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); + // A set of supported buttons which should cause the runtime to treat the + // controller as supporting a gamepad. + let gamepadButtons = [ + { + buttonType: 'grip', + pressed: false, + touched: false, + pressedValue: 0 + }, + { + buttonType: 'touchpad', + pressed: false, + touched: false, + pressedValue: 0 + } + ]; - // Create our input source and immediately toggle the primary input so that - // it appears as already needing to send a click event when it appears. - let input_source = fakeDeviceController.simulateInputSourceConnection(RIGHT_CONTROLLER); - input_source.connectGamepad(); + let input_source = fakeDeviceController.simulateInputSourceConnection({ + handedness: "right", + targetRayMode: "tracked-pointer", + pointerOrigin: VALID_POINTER_TRANSFORM, + profiles: [], + supportedButtons: gamepadButtons + }); // Input events need one frame to propagate, so this does (in order and running // a rAF after each step: @@ -114,9 +125,9 @@ // session, at which point the controller should be disconnected. return new Promise((resolve) => { session.requestAnimationFrame(() => { - input_source.disconnectGamepad(); + input_source.setSupportedButtons([]); session.requestAnimationFrame(() => { - input_source.connectGamepad(); + input_source.setSupportedButtons(gamepadButtons); session.requestAnimationFrame(() => { input_source.disconnect(); session.requestAnimationFrame(() => { @@ -137,5 +148,5 @@ }; xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_input_registered.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_input_registered.https.html new file mode 100644 index 0000000..f3e0c75a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_gamepad_input_registered.https.html
@@ -0,0 +1,124 @@ +<!DOCTYPE html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<canvas id="webgl-canvas"></canvas> + +<script> +let testName = "WebXR InputSource's gamepad properly registers input"; + +let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; + +let testFunction = function(session, fakeDeviceController, t) { + + // There should only be one input source change event, which is from adding + // the input source at the start of the test. + let inputChangeEvents = 0; + function onInputSourcesChange(event) { + assert_equals(inputChangeEvents, 0, + "Gamepad button or input axis value changes should not fire an input source change event."); + inputChangeEvents++; + } + + session.addEventListener('inputsourceschange', onInputSourcesChange, false); + + // Create our input source and immediately toggle the primary input so that + // it appears as already needing to send a click event when it appears. + let input_source = fakeDeviceController.simulateInputSourceConnection({ + handedness: "right", + targetRayMode: "tracked-pointer", + pointerOrigin: VALID_POINTER_TRANSFORM, + profiles: [], + supportedButtons: [ + { + buttonType: 'grip', + pressed: false, + touched: false, + pressedValue: 0 + }, + { + buttonType: 'touchpad', + pressed: false, + touched: false, + pressedValue: 0 + } + ] + }); + + let cached_input_source = null; + let cached_gamepad = null; + + function assertSameObjects() { + assert_equals(session.inputSources[0], cached_input_source); + assert_equals(cached_input_source.gamepad, cached_gamepad); + } + + // Input events and gamepad state changes (button presses, axis movements) + // need one frame to propagate, so this does (in order and running a rAF after + // each step): + // 1) Press the mock gamepad's button (so we can verify the button press makes + // its way to the WebXR gamepad and that it does not fire an + // inputsourceschange event). + // 2) Update the mock gamepad's input axes values (so we can verify the + // updated values make their way to the WebXR gamepad and that it does not + // fire an inputsourceschange event). + return new Promise((resolve) => { + session.requestAnimationFrame(() => { + // Make sure the exposed gamepad has the number of buttons and axes we + // requested. + // 3 Buttons: trigger, grip, touchpad + // 2 Axes from the touchpad + cached_input_source = session.inputSources[0]; + cached_gamepad = cached_input_source.gamepad; + t.step(() => { + assert_equals(cached_gamepad.buttons.length, 3); + assert_equals(cached_gamepad.axes.length, 2); + // Initially, the button should not be pressed and the axes values should + // be set to 0. + assert_false(cached_gamepad.buttons[1].pressed); + assert_equals(cached_gamepad.axes[0], 0); + assert_equals(cached_gamepad.axes[1], 0); + }, "Verify initial state"); + // Simulate button press. + input_source.updateButtonState({ + buttonType: 'grip', + pressed: true, + touched: true, + value: 1.0 + }); + session.requestAnimationFrame(() => { + t.step(() => { + assertSameObjects(); + assert_true(cached_gamepad.buttons[1].pressed); + }, "Gamepad is updated in place when a button is pressed"); + + // Simulate input axes movement. + input_source.updateButtonState({ + buttonType: 'touchpad', + pressed: false, + touched: true, + value: 0, + xValue: 0.5, + yValue: -0.5 + }); + session.requestAnimationFrame(() => { + // Input source and gamepad should not be re-created. They should be + // updated in place when input axes values change. + t.step(() => { + assertSameObjects(); + assert_equals(cached_gamepad.axes[0], 0.5); + assert_equals(cached_gamepad.axes[1], -0.5); + // Button that was pressed last frame should still be pressed. + assert_true(cached_gamepad.buttons[1].pressed); + }, "Gamepad is updated in place when axes values change"); + resolve(); + }); + }); + }); + }); +}; + +xr_session_promise_test( + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); +</script>
diff --git a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html similarity index 77% rename from third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html rename to third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html index ef82377..b4e1c8e 100644 --- a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffset.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html
@@ -1,17 +1,12 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas id="webgl-canvas"></canvas> <script> - -// Can't go in external WPT tests because this test uses MockXRInputSource which -// is not available there. let testName = "Updating XRReferenceSpace origin offset updates view and input matrices."; const VIEW_OFFSET_WITH_ROTATION = { @@ -37,13 +32,8 @@ views: VIEWS_WITH_OFFSET }; -let requestSessionModes = ['immersive-vr']; - let testFunction = - (session, t, fakeDeviceController) => new Promise((resolve) => { - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - + (session, fakeDeviceController, t) => new Promise((resolve) => { const GRIP_TRANSFORM_WITH_ROTATION = { position: [1, 2, 3], orientation: [0, 0.7071, 0, 0.7071] @@ -91,9 +81,9 @@ let grip_matrix = grip_pose.transform.matrix; let ray_matrix = input_pose.transform.matrix; - assert_matrices_approx_equal(view_matrix, expected_view_matrix); - assert_matrices_approx_equal(grip_matrix, expected_grip_matrix); - assert_matrices_approx_equal(ray_matrix, expected_ray_matrix); + assert_matrix_approx_equals(view_matrix, expected_view_matrix); + assert_matrix_approx_equals(grip_matrix, expected_grip_matrix); + assert_matrix_approx_equals(ray_matrix, expected_ray_matrix); }); } @@ -138,6 +128,6 @@ }); xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html similarity index 83% rename from third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html rename to third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html index 0c477cb..f76c3c4 100644 --- a/third_party/blink/web_tests/xr/xrReferenceSpace_originOffsetBounded.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html
@@ -1,17 +1,13 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas id="webgl-canvas"></canvas> <script> -// Can't go in external WPT tests because this test uses MockXRInputSource which -// is not available there. const testName = "Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry."; const INITIAL_VIEW_OFFSET = { @@ -49,12 +45,7 @@ ] }; -const requestSessionModes = ['immersive-vr']; - -function testFunction(session, t, fakeDeviceController) { - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - +function testFunction(session, fakeDeviceController, t) { const INITIAL_GRIP_TRANSFORM = { position: [1, 2, 3], orientation: [0, 0, 0, 1] @@ -94,13 +85,13 @@ let grip_matrix = grip_pose.transform.matrix; let ray_matrix = input_pose.transform.matrix; - assert_matrices_approx_equal(expected_view_matrix, view_matrix); - assert_matrices_approx_equal(expected_grip_matrix, grip_matrix); - assert_matrices_approx_equal(expected_ray_matrix, ray_matrix); + assert_matrix_approx_equals(expected_view_matrix, view_matrix); + assert_matrix_approx_equals(expected_grip_matrix, grip_matrix); + assert_matrix_approx_equals(expected_ray_matrix, ray_matrix); assert_equals(reference_space.boundsGeometry.length, expected_bounds_geometry.length); for (var i = 0; i < reference_space.boundsGeometry.length; ++i) { - assert_points_approx_equal(reference_space.boundsGeometry[i], expected_bounds_geometry[i]); + assert_point_approx_equals(reference_space.boundsGeometry[i], expected_bounds_geometry[i]); } }); } @@ -246,6 +237,7 @@ }); }; -xr_session_promise_test(testFunction, fakeDeviceInitParams, requestSessionModes, testName); +xr_session_promise_test( + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/xr/xrSession_input_events_end.html b/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html similarity index 72% rename from third_party/blink/web_tests/xr/xrSession_input_events_end.html rename to third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html index 31d0593..37e0206 100644 --- a/third_party/blink/web_tests/xr/xrSession_input_events_end.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html
@@ -1,11 +1,8 @@ <!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/webxr_util.js"></script> +<script src="resources/webxr_test_constants.js"></script> <canvas id="webgl-canvas"></canvas> <script> @@ -13,11 +10,9 @@ let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; -let requestSessionModes = ['immersive-vr']; - function requestImmersiveSession() { return new Promise((resolve, reject) => { - runWithUserGesture(() => { + navigator.xr.test.simulateUserActivation(() => { navigator.xr.requestSession('immersive-vr').then((session) => { resolve(session); }, (err) => { @@ -27,7 +22,7 @@ }); } -let testFunction = function(session, t, fakeDeviceController) { +let testFunction = function(session, fakeDeviceController, t) { // helper method to send a click and then request a dummy animation frame to // ensure that the click propagates. We're doing everything in these tests @@ -50,9 +45,6 @@ ["inputsourceschange", "selectstart", "select", "selectend", "end"]); let eventPromise = eventWatcher.wait_for(eventOrder); - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - session.addEventListener(endEvent, ()=> { session.end(); }, false); @@ -77,6 +69,6 @@ }; xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); + testName, testFunction, fakeDeviceInitParams, 'immersive-vr'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html index f858779..bdb5edd 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html
@@ -4,7 +4,7 @@ <script src=/resources/testharnessreport.js></script> <script src="resources/webxr_util.js"></script> <script src="resources/webxr_test_constants.js"></script> - <script src="resources/xr-test-asserts.js"></script> + <script src="resources/webxr_test_asserts.js"></script> <canvas></canvas> <script> @@ -54,7 +54,7 @@ let poseMatrix = pose.transform.matrix; assert_not_equals(poseMatrix, null); - assert_matrix_approx_equals(poseMatrix, expectedPoseMatrix, FLOAT_EPSILON); + assert_matrix_approx_equals(poseMatrix, expectedPoseMatrix); }); // Finished.
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html index 06a2566..aa3c1b8 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html
@@ -3,7 +3,7 @@ <script src=/resources/testharnessreport.js></script> <script src="resources/webxr_util.js"></script> <script src="resources/webxr_test_constants.js"></script> -<script src="resources/xr-test-asserts.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas></canvas> <script> @@ -49,7 +49,7 @@ assert_not_equals(pose, null); let poseMatrix = pose.transform.matrix; - assert_matrix_approx_equals(poseMatrix, VALID_FLOOR_ORIGIN_MATRIX, FLOAT_EPSILON); + assert_matrix_approx_equals(poseMatrix, VALID_FLOOR_ORIGIN_MATRIX); }); // Finished.
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html index 4ff22ff..956edba 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html
@@ -3,7 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="resources/webxr_test_constants.js"></script> <script src="resources/webxr_util.js"></script> -<script src="resources/xr-test-asserts.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas></canvas> <script>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html index 247e3b7..9553a44 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html
@@ -3,7 +3,7 @@ <script src="/resources/testharnessreport.js"></script> <script src="resources/webxr_test_constants.js"></script> <script src="resources/webxr_util.js"></script> -<script src="resources/xr-test-asserts.js"></script> +<script src="resources/webxr_test_asserts.js"></script> <canvas></canvas> <script>
diff --git a/third_party/blink/web_tests/fast/alignment/parse-place-content.html b/third_party/blink/web_tests/fast/alignment/parse-place-content.html index a2bd3fe..dda9f800 100644 --- a/third_party/blink/web_tests/fast/alignment/parse-place-content.html +++ b/third_party/blink/web_tests/fast/alignment/parse-place-content.html
@@ -206,9 +206,9 @@ }, "Test setting 'start safe' as incorrect value through CSS."); test(function() { - checkValues(placeContentBaseline, "placeContent", "place-content", "", "normal normal"); - checkPlaceContentValues(placeContentBaseline, "", "normal", "normal"); -}, "Test setting 'baseline' as incorrect value through CSS."); + checkValues(placeContentBaseline, "placeContent", "place-content", "", "baseline start"); + checkPlaceContentValues(placeContentBaseline, "", "baseline", "start"); +}, "Test setting 'baseline' as 'baseline start'."); test(function() { checkValues(placeContentBaselineSafe, "placeContent", "place-content", "", "normal normal");
diff --git a/third_party/blink/web_tests/fast/lists/nested-list-quirks-expected.html b/third_party/blink/web_tests/fast/lists/nested-list-quirks-expected.html new file mode 100644 index 0000000..3ae41d08 --- /dev/null +++ b/third_party/blink/web_tests/fast/lists/nested-list-quirks-expected.html
@@ -0,0 +1,17 @@ +<ul> + <li> + <ol> + <li>item</li> + <li>item</li> + </ol> + </li> +</ul> + +<ol> + <li> + <ol> + <li>item</li> + <li>item</li> + </ol> + </li> +</ol>
diff --git a/third_party/blink/web_tests/fast/lists/nested-list-quirks.html b/third_party/blink/web_tests/fast/lists/nested-list-quirks.html new file mode 100644 index 0000000..bf3ca17 --- /dev/null +++ b/third_party/blink/web_tests/fast/lists/nested-list-quirks.html
@@ -0,0 +1,17 @@ +<ul> + <li> + <ol> + <li>item</li> + <li>item</li> + </ol> + </li> +</ul> + +<ol> + <li> + <ol> + <li>item</li> + <li>item</li> + </ol> + </li> +</ol>
diff --git a/third_party/blink/web_tests/xr/getInputPose_ray.html b/third_party/blink/web_tests/xr/getInputPose_ray.html deleted file mode 100644 index f7151db0..0000000 --- a/third_party/blink/web_tests/xr/getInputPose_ray.html +++ /dev/null
@@ -1,104 +0,0 @@ -<!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> -<canvas id="webgl-canvas"></canvas> - -<script> - -let testName = "XRInputSources produce valid target rays"; - -let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; - -let requestSessionModes = ['immersive-vr']; - -let testFunction = - (session, t, fakeDeviceController) => new Promise((resolve) => { - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - - let input_source = fakeDeviceController.simulateInputSourceConnection({ - handedness: "right", - targetRayMode: "tracked-pointer", - pointerOrigin: IDENTITY_TRANSFORM, - profiles: [], - gripOrigin: VALID_GRIP_TRANSFORM - }); - - // Must have a reference space to get input poses. eye-level doesn't apply - // any transforms to the given matrix. - session.requestReferenceSpace('local').then( (referenceSpace) => { - - function CheckTargetRayNoOffset(time, xrFrame) { - let source = session.inputSources[0]; - - let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace); - assert_not_equals(grip_pose, null); - - let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace); - assert_not_equals(input_pose, null); - let targetRay = new XRRay(input_pose.transform); - - t.step( () => { - assert_matrices_approx_equal(targetRay.matrix, - grip_pose.transform.matrix, FLOAT_EPSILON, - "Target ray matrix is incorrect."); - - assert_equals(targetRay.origin.x, 4.0); - assert_equals(targetRay.origin.y, 3.0); - assert_equals(targetRay.origin.z, 2.0); - assert_equals(targetRay.origin.w, 1.0); - - assert_equals(targetRay.direction.x, 0.0); - assert_equals(targetRay.direction.y, 0.0); - assert_equals(targetRay.direction.z, -1.0); - assert_equals(targetRay.direction.w, 0.0); - }, "Target ray computed properly with no pointer offset"); - - input_source.setPointerOrigin(VALID_POINTER_TRANSFORM); - - session.requestAnimationFrame(CheckTargetRayOffset); - } - - function CheckTargetRayOffset(time, xrFrame) { - let source = session.inputSources[0]; - - let grip_pose = xrFrame.getPose(source.gripSpace, referenceSpace); - assert_not_equals(grip_pose, null); - - let input_pose = xrFrame.getPose(source.targetRaySpace, referenceSpace); - assert_not_equals(input_pose, null); - let targetRay = new XRRay(input_pose.transform); - - t.step( () => { - assert_matrices_approx_equal(targetRay.matrix, - VALID_GRIP_WITH_POINTER_OFFSET, FLOAT_EPSILON, - "Target ray matrix is not offset properly."); - - assert_equals(targetRay.origin.x, 4.0); - assert_equals(targetRay.origin.y, 3.0); - assert_equals(targetRay.origin.z, 3.0); - assert_equals(targetRay.origin.w, 1.0); - - assert_equals(targetRay.direction.x, 0.0); - assert_equals(targetRay.direction.y, 0.0); - assert_equals(targetRay.direction.z, -1.0); - assert_equals(targetRay.direction.w, 0.0); - }, "Target ray computed properly with a pointer offset"); - - resolve(); - } - - // Can only request input poses in an xr frame. - session.requestAnimationFrame(CheckTargetRayNoOffset); - }); - }); - -xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); - -</script>
diff --git a/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js b/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js index a480bc1..99313cd0 100644 --- a/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js +++ b/third_party/blink/web_tests/xr/resources/xr-internal-device-mocking.js
@@ -37,43 +37,3 @@ MockRuntime.prototype.getMissingFrameCount = function() { return this.presentation_provider_.missing_frame_count_; }; - -MockXRInputSource.prototype.connectGamepad = function() { - // Mojo complains if some of the properties on Gamepad are null, so set - // everything to reasonable defaults that tests can override. - this.gamepad_ = new device.mojom.Gamepad(); - this.gamepad_.connected = true; - this.gamepad_.id = "unknown"; - this.gamepad_.timestamp = 0; - this.gamepad_.axes = []; - this.gamepad_.buttons = []; - this.gamepad_.mapping = ""; - this.gamepad_.display_id = 0; - this.gamepad_.hand = device.mojom.GamepadHand.GamepadHandNone; -}; - -MockXRInputSource.prototype.disconnectGamepad = function() { - this.gamepad_ = null; -}; - -MockXRInputSource.prototype.setGamepadButtonCount = function(button_count) { - this.gamepad_.buttons = []; - for (let i = 0; i < button_count; ++i) { - this.gamepad_.buttons.push(new device.mojom.GamepadButton()); - } -}; - -MockXRInputSource.prototype.setGamepadAxesCount = function(axes_count) { - this.gamepad_.axes = []; - for (let i = 0; i < axes_count; ++i) { - this.gamepad_.axes.push(0); - } -}; - -MockXRInputSource.prototype.setGamepadButtonPressed = function(button_index, is_pressed) { - this.gamepad_.buttons[button_index].pressed = is_pressed; -}; - -MockXRInputSource.prototype.setGamepadAxisValue = function(index, value) { - this.gamepad_.axes[index] = value; -};
diff --git a/third_party/blink/web_tests/xr/xrInputSource_gamepad_input_registered.html b/third_party/blink/web_tests/xr/xrInputSource_gamepad_input_registered.html deleted file mode 100644 index b25675b..0000000 --- a/third_party/blink/web_tests/xr/xrInputSource_gamepad_input_registered.html +++ /dev/null
@@ -1,99 +0,0 @@ -<!DOCTYPE html> -<script src="../resources/testharness.js"></script> -<script src="../resources/testharnessreport.js"></script> -<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> -<script src="file:///gen/device/vr/public/mojom/vr_service.mojom.js"></script> -<script src="../external/wpt/resources/chromium/webxr-test.js"></script> -<script src="../external/wpt/webxr/resources/webxr_test_constants.js"></script> -<script src="../xr/resources/xr-internal-device-mocking.js"></script> -<script src="../xr/resources/xr-test-utils.js"></script> -<canvas id="webgl-canvas"></canvas> - -<script> -let testName = "WebXR InputSource's gamepad properly registers input"; - -let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; - -let requestSessionModes = ['immersive-vr']; - -let testFunction = function(session, t, fakeDeviceController) { - - // There should only be one input source change event, which is from adding - // the input source at the start of the test. - let inputChangeEvents = 0; - function onInputSourcesChange(event) { - assert_equals(inputChangeEvents, 0, - "Gamepad button or input axis value changes should not fire an input source change event."); - inputChangeEvents++; - } - - session.addEventListener('inputsourceschange', onInputSourcesChange, false); - - // Session must have a baseLayer or frame requests will be ignored. - session.updateRenderState({ baseLayer: new XRWebGLLayer(session, gl) }); - - // Create our input source and immediately toggle the primary input so that - // it appears as already needing to send a click event when it appears. - let input_source = fakeDeviceController.simulateInputSourceConnection(RIGHT_CONTROLLER); - input_source.connectGamepad(); - input_source.setGamepadButtonCount(1); - input_source.setGamepadAxesCount(2); - - let cached_input_source = null; - let cached_gamepad = null; - - function assertSameObjects() { - assert_equals(session.inputSources[0], cached_input_source); - assert_equals(cached_input_source.gamepad, cached_gamepad); - } - - // Input events and gamepad state changes (button presses, axis movements) - // need one frame to propagate, so this does (in order and running a rAF after - // each step): - // 1) Press the mock gamepad's button (so we can verify the button press makes - // its way to the WebXR gamepad and that it does not fire an - // inputsourceschange event). - // 2) Update the mock gamepad's input axes values (so we can verify the - // updated values make their way to the WebXR gamepad and that it does not - // fire an inputsourceschange event). - return new Promise((resolve) => { - session.requestAnimationFrame(() => { - // Make sure the exposed gamepad has the number of buttons and axes we - // requested. - cached_input_source = session.inputSources[0]; - cached_gamepad = cached_input_source.gamepad; - assert_equals(cached_gamepad.buttons.length, 1); - assert_equals(cached_gamepad.axes.length, 2); - // Initially, the button should not be pressed and the axes values should - // be set to 0. - assert_false(cached_gamepad.buttons[0].pressed); - assert_equals(cached_gamepad.axes[0], 0); - assert_equals(cached_gamepad.axes[1], 0); - // Simulate button press. - input_source.setGamepadButtonPressed(0, true); - session.requestAnimationFrame(() => { - // Input source and gamepad should not be re-created. They should be - // updated in place when a button is pressed. - assertSameObjects(); - assert_true(cached_gamepad.buttons[0].pressed); - // Simulate input axes movement. - input_source.setGamepadAxisValue(0, 0.5); - input_source.setGamepadAxisValue(1, -0.5); - session.requestAnimationFrame(() => { - // Input source and gamepad should not be re-created. They should be - // updated in place when input axes values change. - assertSameObjects(); - assert_equals(cached_gamepad.axes[0], 0.5); - assert_equals(cached_gamepad.axes[1], -0.5); - // Button that was pressed last frame should still be pressed. - assert_true(cached_gamepad.buttons[0].pressed); - resolve(); - }); - }); - }); - }); -}; - -xr_session_promise_test( - testFunction, fakeDeviceInitParams, requestSessionModes, testName); -</script>
diff --git a/third_party/devscripts/OWNERS b/third_party/devscripts/OWNERS index 1967bf5..48b47ad0 100644 --- a/third_party/devscripts/OWNERS +++ b/third_party/devscripts/OWNERS
@@ -1 +1,2 @@ thestig@chromium.org +# COMPONENT: Internals
diff --git a/third_party/grpc/METADATA b/third_party/grpc/METADATA index 114036a..e758fbc 100644 --- a/third_party/grpc/METADATA +++ b/third_party/grpc/METADATA
@@ -13,7 +13,7 @@ type: GIT value: "https://github.com/grpc/grpc" } - version: "c007642f109a2f50b8ed3e4626880539ba55aca5" - last_upgrade_date { year: 2019 month: 7 day: 15 } + version: "74b981a6a3d9ba17f3acae1d72b9109325ef656d" + last_upgrade_date { year: 2019 month: 7 day: 16 } license_type: NOTICE }
diff --git a/third_party/grpc/README.chromium b/third_party/grpc/README.chromium index 9558694..7dd35c0a 100644 --- a/third_party/grpc/README.chromium +++ b/third_party/grpc/README.chromium
@@ -1,8 +1,8 @@ Name: gRPC URL: https://github.com/grpc/grpc Version: 0 -Date: Jul 15, 2019 -Revision: c007642f109a2f50b8ed3e4626880539ba55aca5 +Date: Jul 16, 2019 +Revision: 74b981a6a3d9ba17f3acae1d72b9109325ef656d License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 634e4d6..6ef008f7 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -6201,6 +6201,11 @@ <int value="1" label="Needs normalization"/> </enum> +<enum name="BooleanNetworkIsolationKeyPresent"> + <int value="0" label="Network Isolation Key Not Present"/> + <int value="1" label="Network Isolation Key Present"/> +</enum> + <enum name="BooleanNetworkQuietBeforeSwap"> <int value="0" label="FMP OK, network not yet quiet"/> <int value="1" label="FMP not OK, network was already quiet"/> @@ -23708,7 +23713,7 @@ <int value="2779" label="V8HTMLMediaElement_Remote_AttributeGetter"/> <int value="2780" label="V8RemotePlayback_WatchAvailability_Method"/> <int value="2781" label="V8RemotePlayback_Prompt_Method"/> - <int value="2782" label="LayoutJankExplicitlyRequested"/> + <int value="2782" label="LayoutShiftExplicitlyRequested"/> <int value="2783" label="MediaSessionSkipAd"/> <int value="2784" label="AdFrameSizeIntervention"/> <int value="2785" label="V8UserActivation_HasBeenActive_AttributeGetter"/> @@ -50394,6 +50399,12 @@ <int value="101" label="IDC_CONTENT_CONTEXT_ACCESSIBILITY_LABELS"/> <int value="102" label="IDC_SEND_TO_MY_DEVICES"/> <int value="103" label="IDC_CONTENT_LINK_SEND_TAB_TO_SELF"/> + <int value="104" label="IDC_SEND_TAB_TO_SELF_SINGLE_TARGET"/> + <int value="105" label="IDC_CONTENT_LINK_SEND_TAB_TO_SELF_SINGLE_TARGET"/> + <int value="106" + label="IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_SINGLE_DEVICE"/> + <int value="107" + label="IDC_CONTENT_CONTEXT_SHARING_CLICK_TO_CALL_MULTIPLE_DEVICES"/> </enum> <enum name="ReopenTabPromoStepAtDismissal">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 9c524ec3..4e0fe20 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -3386,6 +3386,9 @@ <histogram name="Android.StrictMode.WebappSharedPrefs" units="ms" expires_after="M77"> + <obsolete> + Removed from code July 2019. + </obsolete> <owner>hartmanng@chromium.org</owner> <owner>yfriedman@chromium.org</owner> <summary> @@ -26934,7 +26937,7 @@ </histogram> <histogram name="DevTools.BackgroundService.ClearEvents" - enum="ServiceWorkerStatusCode" expires_after="M78"> + enum="ServiceWorkerStatusCode" expires_after="M80"> <owner>dgozman@chromium.org</owner> <owner>rayankans@chromium.org</owner> <summary> @@ -26945,7 +26948,7 @@ </histogram> <histogram name="DevTools.BackgroundService.GetEvents" - enum="ServiceWorkerStatusCode" expires_after="M78"> + enum="ServiceWorkerStatusCode" expires_after="M80"> <owner>dgozman@chromium.org</owner> <owner>rayankans@chromium.org</owner> <summary> @@ -26955,7 +26958,7 @@ </histogram> <histogram name="DevTools.BackgroundService.LogEvent" - enum="ServiceWorkerStatusCode" expires_after="M78"> + enum="ServiceWorkerStatusCode" expires_after="M80"> <owner>dgozman@chromium.org</owner> <owner>rayankans@chromium.org</owner> <summary> @@ -26966,7 +26969,7 @@ </histogram> <histogram name="DevTools.BackgroundService.StartRecording" - enum="DevToolsBackgroundService" expires_after="M78"> + enum="DevToolsBackgroundService" expires_after="M80"> <owner>dgozman@chromium.org</owner> <owner>rayankans@chromium.org</owner> <summary> @@ -40666,7 +40669,7 @@ </histogram> <histogram name="Extensions.HasPermissions_WebStoreInstall3" enum="Boolean" - expires_after="M77"> + expires_after="2020-06-01"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -40694,7 +40697,7 @@ </histogram> <histogram name="Extensions.HasPermissions_WebStoreInstallCancel3" - enum="Boolean" expires_after="M77"> + enum="Boolean" expires_after="2020-06-01"> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -42086,9 +42089,14 @@ </histogram> <histogram name="Extensions.SandboxUnpackFailureReason" - enum="ExtensionUnpackFailureReason" expires_after="M77"> + enum="ExtensionUnpackFailureReason" expires_after="never"> +<!-- expires-never: Monitors core extension installation flows. --> + + <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> - <summary>What caused a sandboxed extension unpack to fail?</summary> + <summary> + The reason an extension failed to unpack, recorded when a failure occurs. + </summary> </histogram> <histogram name="Extensions.SandboxUnpackFailureTime" @@ -42455,7 +42463,10 @@ </histogram> <histogram name="Extensions.UnpackFailureInstallCause" - enum="ExtensionInstallCause" expires_after="M77"> + enum="ExtensionInstallCause"> + <obsolete> + Stopped recording 2019-07. + </obsolete> <owner>extensions-core@chromium.org</owner> <summary> Count failing CRX installs, grouped by the way an extension can be @@ -42464,16 +42475,20 @@ </histogram> <histogram name="Extensions.UnpackFailureInstallSource" - enum="ExtensionLocation" expires_after="M77"> + enum="ExtensionLocation" expires_after="2020-06-01"> + <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> - Count successful CRX installs, grouped by the location property in prefs. - installed. + The install source of an extension that failed to unpack correctly. Emitted + each time an extension fails to unpack from the CrxInstaller. </summary> </histogram> <histogram name="Extensions.UnpackSuccessInstallCause" - enum="ExtensionInstallCause" expires_after="M77"> + enum="ExtensionInstallCause"> + <obsolete> + Stopped recording 2019-07. + </obsolete> <owner>extensions-core@chromium.org</owner> <summary> Count successful CRX installs, grouped by the cause of the install. @@ -42481,10 +42496,12 @@ </histogram> <histogram name="Extensions.UnpackSuccessInstallSource" - enum="ExtensionLocation" expires_after="M77"> + enum="ExtensionLocation" expires_after="2020-06-01"> + <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> - Count successful CRX installs, grouped by the location property in prefs. + The install source of an extension that succeeded in unpacking correctly. + Emitted each time an extension successfully unpacks from the CrxInstaller. </summary> </histogram> @@ -44431,7 +44448,8 @@ </histogram> <histogram name="FirstRun.IOSFirebaseConfigured" enum="FirebaseConfiguredState" - expires_after="M77"> + expires_after="M87"> + <owner>ghendel@chromium.org</owner> <owner>pkl@chromium.org</owner> <summary>Track whether Firebase is enabled or not at app startup.</summary> </histogram> @@ -49213,7 +49231,7 @@ </summary> </histogram> -<histogram name="HttpCache.EntryLockWait" units="ms" expires_after="M77"> +<histogram name="HttpCache.EntryLockWait" units="ms" expires_after="M87"> <owner>jkarlin@chromium.org</owner> <owner>morlovich@chromium.org</owner> <summary> @@ -49235,6 +49253,16 @@ </summary> </histogram> +<histogram name="HttpCache.NetworkIsolationKeyPresent" + enum="BooleanNetworkIsolationKeyPresent" expires_after="2020-02-26"> + <owner>jkarlin@chromium.org</owner> + <owner>shivanisha@chromium.org</owner> + <summary> + Records whether a cache request has a network isolation key set or not, + which is used for double-keying. + </summary> +</histogram> + <histogram name="HttpCache.OfflineStatus" enum="OfflineStatus" expires_after="2015-04-27"> <obsolete> @@ -49288,6 +49316,10 @@ <histogram name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed" expires_after="M77"> + <obsolete> + Removed in M77. One day Android results: 25.00% 1033 50.00% 4945 75.00% + 42023 95.00% Infinity + </obsolete> <owner>jkarlin@chromium.org</owner> <summary> For each http cache transaction for which a cache entry exists but it cannot @@ -49298,6 +49330,10 @@ <histogram name="HttpCache.StaleEntry.Updated.Age" units="seconds" expires_after="M77"> + <obsolete> + Removed in M77. One day percentiles on Android: 25.00% 16146 50.00% 101342 + 75.00% 372632 95.00% Infinity + </obsolete> <owner>jkarlin@chromium.org</owner> <summary> For each http cache transaction for which a validation attempt is made due @@ -49308,6 +49344,10 @@ <histogram name="HttpCache.StaleEntry.Updated.AgeInFreshnessPeriods" units="%" expires_after="M77"> + <obsolete> + Removed in M77. One day percentiles on Android: 25.00% 246.3 50.00% 1353 + 75.00% 9142 95.00% 147572 99.00% Infinity + </obsolete> <owner>jkarlin@chromium.org</owner> <summary> For each http cache transaction for which a validation attempt is made due @@ -49318,6 +49358,10 @@ <histogram name="HttpCache.StaleEntry.Validated.Age" units="seconds" expires_after="M77"> + <obsolete> + Removed in M77. One day percentiles on Android: 25.00% 10791 50.00% 70285 + 75.00% 223571 95.00% Infinity + </obsolete> <owner>jkarlin@chromium.org</owner> <summary> For each http cache transaction for which a validation attempt is made due @@ -49328,6 +49372,10 @@ <histogram name="HttpCache.StaleEntry.Validated.AgeInFreshnessPeriods" units="%" expires_after="M77"> + <obsolete> + Removed in M77. One day percentiles on Android: 25.00% 169.5 50.00% 476.3 + 75.00% 2451 95.00% 43218 99.00% 474791 99.50% Infinity + </obsolete> <owner>jkarlin@chromium.org</owner> <summary> For each http cache transaction for which a validation attempt is made due @@ -49338,6 +49386,9 @@ <histogram name="HttpCache.TopFrameOriginPresent" enum="BooleanTopFrameOriginPresent" expires_after="2020-02-26"> + <obsolete> + Deprecated 07/2019 and replaced by HttpCache.NetworkIsolationKeyPresent. + </obsolete> <owner>jkarlin@chromium.org</owner> <owner>shivanisha@chromium.org</owner> <summary> @@ -60817,6 +60868,11 @@ <histogram name="MemCache.WriteResult" enum="MemCacheWriteResult" expires_after="M77"> + <obsolete> + Deprecated in M77. One day results for Android were 99.99% success, .01% + Exceeded Cache Size, and an even smaller fraction Exceeded Single Entry + Size. + </obsolete> <owner>jkarlin@chromium.org</owner> <summary>The outcome of Entry::WriteData in the memory cache.</summary> </histogram> @@ -63850,7 +63906,7 @@ </histogram> <histogram name="Mobile.CanonicalURLResult" enum="CanonicalURLResult" - expires_after="M77"> + expires_after="M87"> <owner>pkl@chromium.org</owner> <owner>tedchoc@chromium.org</owner> <summary> @@ -66133,7 +66189,11 @@ <histogram name="NativeAppLauncher.InstallationDetected" enum="BooleanInstalled" expires_after="2019-12-31"> - <owner>jif@chromium.org</owner> + <obsolete> + Removed in M77. This metric is not sufficiently used. + </obsolete> + <owner>eugenebut@chromium.org</owner> + <owner>pkl@chromium.org</owner> <summary> The number of times that Chrome detected that a request to download and install another Google iOS app completed successfully. @@ -72160,7 +72220,7 @@ </histogram> <histogram name="Net.MainFrameNoStore" enum="MainFrameStorable" - expires_after="M77"> + expires_after="M87"> <owner>jkarlin@chromium.org</owner> <summary> The distribution of storable vs "cache-control: no-store" @@ -72687,7 +72747,7 @@ </summary> </histogram> -<histogram name="Net.Prefetch.HitBytes" units="bytes" expires_after="M77"> +<histogram name="Net.Prefetch.HitBytes" units="bytes" expires_after="M87"> <owner>jkarlin@chromium.org</owner> <summary> Bytes read for requests that were served from a cache entry whose @@ -114685,6 +114745,36 @@ </summary> </histogram> +<histogram name="SBClientDownload.ZipArchiveUncompressedSizeOverflow" + enum="Boolean" expires_after="M79"> + <owner>drubery@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Records whether the total uncompressed size of a ZIP overflowed our total. + This is logged once per ZIP file scanned. + </summary> +</histogram> + +<histogram name="SBClientDownload.ZipCompressionRatio" units="%" + expires_after="M79"> + <owner>drubery@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Records the compression ratio for each scanned ZIP archive. This is logged + once per ZIP file scanned, unless + SBClientDownload.ZipArchiveUncompressedSizeOverflow is true. + </summary> +</histogram> + +<histogram name="SBClientDownload.ZipEntrySize" units="MB" expires_after="M79"> + <owner>drubery@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Records the uncompressed size of each entry in a scanned ZIP file. This + histogram is logged once per entry in the ZIP. + </summary> +</histogram> + <histogram name="SBClientDownload.ZipFileArchivedBinariesCount" units="count"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> @@ -138136,7 +138226,10 @@ </summary> </histogram> -<histogram name="Toolbar.AppMenuTimeToAction" units="ms" expires_after="M77"> +<histogram name="Toolbar.AppMenuTimeToAction" units="ms"> + <obsolete> + Stopped recording 2019-07. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <summary> The number of millseconds between when the user opens the app menu and when @@ -153679,9 +153772,16 @@ <suffix name="Video" label="Showing cache patterns only for video resources."/> <affected-histogram name="HttpCache.Pattern"/> - <affected-histogram - name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed"/> - <affected-histogram name="HttpCache.ValidationCause"/> + <affected-histogram name="HttpCache.StaleEntry.FreshnessPeriodsSinceLastUsed"> + <obsolete> + Deprecated in M77. + </obsolete> + </affected-histogram> + <affected-histogram name="HttpCache.ValidationCause"> + <obsolete> + Deprecated in M77. + </obsolete> + </affected-histogram> </histogram_suffixes> <histogram_suffixes name="CacheInstance" separator="." ordering="prefix">
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index 6208d3e..bb3c912 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -95,6 +95,9 @@ # Benchmark: blink_perf.shadow_dom crbug.com/702319 [ Nexus_5X ] blink_perf.shadow_dom/* [ Skip ] +# Benchmark: dromaeo +crbug.com/984578 [ Linux ] dromaeo/http://dromaeo.com?dom-modify [ Skip ] + # Benchmark: dummy_benchmark crbug.com/848900 [ Win ] dummy_benchmark.histogram_benchmark_1/dummy_page.html [ Skip ] crbug.com/848900 [ Win ] dummy_benchmark.stable_benchmark_1/dummy_page.html [ Skip ] @@ -273,6 +276,7 @@ crbug.com/948789 [ Nexus_5X ] startup.mobile/maps_pwa:with_http_cache [ Skip ] # Benchmark: system_health.common_desktop +crbug.com/984599 [ Linux ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ] crbug.com/773084 [ Mac ] system_health.common_desktop/browse:tools:maps [ Skip ] crbug.com/903417 [ Mac ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ] crbug.com/903417 [ Win ] system_health.common_desktop/long_running:tools:gmail-foreground [ Skip ] @@ -299,6 +303,7 @@ crbug.com/979786 [ Nexus5X_Webview ] system_health.common_mobile/browse:news:cricbuzz [ Skip ] # Benchmark: system_health.memory_desktop +crbug.com/984599 [ Linux ] system_health.memory_desktop/long_running:tools:gmail-foreground [ Skip ] crbug.com/649392 [ All ] system_health.memory_desktop/play:media:google_play_music [ Skip ] crbug.com/742475 [ Mac ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ] crbug.com/946495 [ Mac ] system_health.memory_desktop/multitab:misc:typical24:2018 [ Skip ]
diff --git a/ui/accessibility/accessibility_switches.cc b/ui/accessibility/accessibility_switches.cc index 563912d..4f88eb12 100644 --- a/ui/accessibility/accessibility_switches.cc +++ b/ui/accessibility/accessibility_switches.cc
@@ -54,6 +54,11 @@ ::switches::kEnableExperimentalAccessibilityLanguageDetection); } +bool IsExperimentalAccessibilitySwitchAccessTextEnabled() { + return base::CommandLine::ForCurrentProcess()->HasSwitch( + ::switches::kEnableExperimentalAccessibilitySwitchAccessText); +} + #if defined(OS_WIN) // Toggles between IAccessible and UI Automation platform API. const char kEnableExperimentalUIAutomation[] =
diff --git a/ui/accessibility/accessibility_switches.h b/ui/accessibility/accessibility_switches.h index 831e5df..191cee55 100644 --- a/ui/accessibility/accessibility_switches.h +++ b/ui/accessibility/accessibility_switches.h
@@ -28,6 +28,9 @@ // Returns true if experimental accessibility language detection is enabled. AX_EXPORT bool IsExperimentalAccessibilityLanguageDetectionEnabled(); +// Returns true if experimental accessibility switch access text is enabled. +AX_EXPORT bool IsExperimentalAccessibilitySwitchAccessTextEnabled(); + #if defined(OS_WIN) AX_EXPORT extern const char kEnableExperimentalUIAutomation[]; #endif
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn index 6e33f489..ffb7da2 100644 --- a/ui/display/BUILD.gn +++ b/ui/display/BUILD.gn
@@ -168,7 +168,7 @@ "manager/display_manager_utilities_unittest.cc", "manager/json_converter_unittest.cc", "manager/managed_display_info_unittest.cc", - "mojo/display_struct_traits_unittest.cc", + "mojom/display_mojom_traits_unittest.cc", "screen_unittest.cc", "unified_desktop_utils_unittests.cc", "util/display_util_unittest.cc", @@ -204,7 +204,7 @@ "//testing/gtest", "//ui/display/fake", "//ui/display/manager", - "//ui/display/mojo:interfaces", + "//ui/display/mojom:mojom", "//ui/display/types", "//ui/display/util", "//ui/events:test_support",
diff --git a/ui/display/manager/BUILD.gn b/ui/display/manager/BUILD.gn index c1ccba7..c158f65 100644 --- a/ui/display/manager/BUILD.gn +++ b/ui/display/manager/BUILD.gn
@@ -59,7 +59,7 @@ deps = [ "//base", "//ui/base", - "//ui/display/mojo:interfaces", + "//ui/display/mojom:mojom", "//ui/display/util", "//ui/events:platform_event", "//ui/events/devices",
diff --git a/ui/display/mojo/display_mode.typemap b/ui/display/mojo/display_mode.typemap deleted file mode 100644 index fc1f37d4..0000000 --- a/ui/display/mojo/display_mode.typemap +++ /dev/null
@@ -1,17 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -mojom = "//ui/display/mojo/display_mode.mojom" -public_headers = [ "//ui/display/types/display_mode.h" ] -traits_headers = [ "//ui/display/mojo/display_mode_struct_traits.h" ] -sources = [ - "//ui/display/mojo/display_mode_struct_traits.cc", -] -public_deps = [ - "//ui/display", -] -deps = [ - "//ui/gfx/geometry", -] -type_mappings = [ "display.mojom.DisplayMode=std::unique_ptr<display::DisplayMode>[move_only]" ]
diff --git a/ui/display/mojo/typemaps.gni b/ui/display/mojo/typemaps.gni deleted file mode 100644 index e352a044..0000000 --- a/ui/display/mojo/typemaps.gni +++ /dev/null
@@ -1,12 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -typemaps = [ - "//ui/display/mojo/display.typemap", - "//ui/display/mojo/display_constants.typemap", - "//ui/display/mojo/display_layout.typemap", - "//ui/display/mojo/display_mode.typemap", - "//ui/display/mojo/display_snapshot.typemap", - "//ui/display/mojo/gamma_ramp_rgb_entry.typemap", -]
diff --git a/ui/display/mojo/BUILD.gn b/ui/display/mojom/BUILD.gn similarity index 95% rename from ui/display/mojo/BUILD.gn rename to ui/display/mojom/BUILD.gn index c60046c..fb7b9649 100644 --- a/ui/display/mojo/BUILD.gn +++ b/ui/display/mojom/BUILD.gn
@@ -4,7 +4,7 @@ import("//mojo/public/tools/bindings/mojom.gni") -mojom("interfaces") { +mojom("mojom") { sources = [ "display.mojom", "display_constants.mojom",
diff --git a/ui/display/mojo/OWNERS b/ui/display/mojom/OWNERS similarity index 61% rename from ui/display/mojo/OWNERS rename to ui/display/mojom/OWNERS index e75daf74..7ed4e44 100644 --- a/ui/display/mojo/OWNERS +++ b/ui/display/mojom/OWNERS
@@ -1,5 +1,5 @@ -per-file *_struct_traits*.*=set noparent -per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS +per-file *_mojom_traits*.*=set noparent +per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/ui/display/mojo/display.mojom b/ui/display/mojom/display.mojom similarity index 100% rename from ui/display/mojo/display.mojom rename to ui/display/mojom/display.mojom
diff --git a/ui/display/mojo/display.typemap b/ui/display/mojom/display.typemap similarity index 79% rename from ui/display/mojo/display.typemap rename to ui/display/mojom/display.typemap index 7bf184f..0625a2e 100644 --- a/ui/display/mojo/display.typemap +++ b/ui/display/mojom/display.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//ui/display/mojo/display.mojom" +mojom = "//ui/display/mojom/display.mojom" public_headers = [ "//ui/display/display.h" ] -traits_headers = [ "//ui/display/mojo/display_struct_traits.h" ] +traits_headers = [ "//ui/display/mojom/display_mojom_traits.h" ] sources = [ - "//ui/display/mojo/display_struct_traits.cc", + "//ui/display/mojom/display_mojom_traits.cc", ] public_deps = [ "//ui/display",
diff --git a/ui/display/mojo/display_constants.mojom b/ui/display/mojom/display_constants.mojom similarity index 100% rename from ui/display/mojo/display_constants.mojom rename to ui/display/mojom/display_constants.mojom
diff --git a/ui/display/mojo/display_constants.typemap b/ui/display/mojom/display_constants.typemap similarity index 70% rename from ui/display/mojo/display_constants.typemap rename to ui/display/mojom/display_constants.typemap index 4c0b4ae1..fcefbac 100644 --- a/ui/display/mojo/display_constants.typemap +++ b/ui/display/mojom/display_constants.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//ui/display/mojo/display_constants.mojom" +mojom = "//ui/display/mojom/display_constants.mojom" public_headers = [ "//ui/display/types/display_constants.h" ] -traits_headers = [ "//ui/display/mojo/display_constants_struct_traits.h" ] +traits_headers = [ "//ui/display/mojom/display_constants_mojom_traits.h" ] sources = [ - "//ui/display/mojo/display_constants_struct_traits.cc", + "//ui/display/mojom/display_constants_mojom_traits.cc", ] public_deps = [ "//ui/display",
diff --git a/ui/display/mojo/display_constants_struct_traits.cc b/ui/display/mojom/display_constants_mojom_traits.cc similarity index 98% rename from ui/display/mojo/display_constants_struct_traits.cc rename to ui/display/mojom/display_constants_mojom_traits.cc index c5cc013..a34a657 100644 --- a/ui/display/mojo/display_constants_struct_traits.cc +++ b/ui/display/mojom/display_constants_mojom_traits.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 "ui/display/mojo/display_constants_struct_traits.h" +#include "ui/display/mojom/display_constants_mojom_traits.h" namespace mojo {
diff --git a/ui/display/mojo/display_constants_struct_traits.h b/ui/display/mojom/display_constants_mojom_traits.h similarity index 78% rename from ui/display/mojo/display_constants_struct_traits.h rename to ui/display/mojom/display_constants_mojom_traits.h index 9ecf7cc..24ab48d 100644 --- a/ui/display/mojo/display_constants_struct_traits.h +++ b/ui/display/mojom/display_constants_mojom_traits.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_MOJO_DISPLAY_CONSTANTS_STRUCT_TRAITS_H_ -#define UI_DISPLAY_MOJO_DISPLAY_CONSTANTS_STRUCT_TRAITS_H_ +#ifndef UI_DISPLAY_MOJOM_DISPLAY_CONSTANTS_MOJOM_TRAITS_H_ +#define UI_DISPLAY_MOJOM_DISPLAY_CONSTANTS_MOJOM_TRAITS_H_ -#include "ui/display/mojo/display_constants.mojom.h" +#include "ui/display/mojom/display_constants.mojom.h" #include "ui/display/types/display_constants.h" namespace mojo { @@ -28,4 +28,4 @@ } // namespace mojo -#endif // UI_DISPLAY_MOJO_DISPLAY_CONSTANTS_STRUCT_TRAITS_H_ +#endif // UI_DISPLAY_MOJOM_DISPLAY_CONSTANTS_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_layout.mojom b/ui/display/mojom/display_layout.mojom similarity index 100% rename from ui/display/mojo/display_layout.mojom rename to ui/display/mojom/display_layout.mojom
diff --git a/ui/display/mojo/display_layout.typemap b/ui/display/mojom/display_layout.typemap similarity index 77% rename from ui/display/mojo/display_layout.typemap rename to ui/display/mojom/display_layout.typemap index d524e562..652ffb2 100644 --- a/ui/display/mojo/display_layout.typemap +++ b/ui/display/mojom/display_layout.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//ui/display/mojo/display_layout.mojom" +mojom = "//ui/display/mojom/display_layout.mojom" public_headers = [ "//ui/display/display_layout.h" ] -traits_headers = [ "//ui/display/mojo/display_layout_struct_traits.h" ] +traits_headers = [ "//ui/display/mojom/display_layout_mojom_traits.h" ] sources = [ - "//ui/display/mojo/display_layout_struct_traits.cc", + "//ui/display/mojom/display_layout_mojom_traits.cc", ] public_deps = [ "//ui/display",
diff --git a/ui/display/mojo/display_layout_struct_traits.cc b/ui/display/mojom/display_layout_mojom_traits.cc similarity index 97% rename from ui/display/mojo/display_layout_struct_traits.cc rename to ui/display/mojom/display_layout_mojom_traits.cc index 24a9d87..af247ab1 100644 --- a/ui/display/mojo/display_layout_struct_traits.cc +++ b/ui/display/mojom/display_layout_mojom_traits.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 "ui/display/mojo/display_layout_struct_traits.h" +#include "ui/display/mojom/display_layout_mojom_traits.h" namespace mojo {
diff --git a/ui/display/mojo/display_layout_struct_traits.h b/ui/display/mojom/display_layout_mojom_traits.h similarity index 91% rename from ui/display/mojo/display_layout_struct_traits.h rename to ui/display/mojom/display_layout_mojom_traits.h index 45b109ad..cf161dc4 100644 --- a/ui/display/mojo/display_layout_struct_traits.h +++ b/ui/display/mojom/display_layout_mojom_traits.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_MOJO_DISPLAY_LAYOUT_STRUCT_TRAITS_H_ -#define UI_DISPLAY_MOJO_DISPLAY_LAYOUT_STRUCT_TRAITS_H_ +#ifndef UI_DISPLAY_MOJOM_DISPLAY_LAYOUT_MOJOM_TRAITS_H_ +#define UI_DISPLAY_MOJOM_DISPLAY_LAYOUT_MOJOM_TRAITS_H_ #include <memory> #include <vector> #include "ui/display/display_layout.h" -#include "ui/display/mojo/display_layout.mojom.h" +#include "ui/display/mojom/display_layout.mojom.h" namespace mojo { @@ -84,4 +84,4 @@ } // namespace mojo -#endif // UI_DISPLAY_MOJO_DISPLAY_LAYOUT_STRUCT_TRAITS_H_ +#endif // UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_mode.mojom b/ui/display/mojom/display_mode.mojom similarity index 100% rename from ui/display/mojo/display_mode.mojom rename to ui/display/mojom/display_mode.mojom
diff --git a/ui/display/mojom/display_mode.typemap b/ui/display/mojom/display_mode.typemap new file mode 100644 index 0000000..3cbe5f3 --- /dev/null +++ b/ui/display/mojom/display_mode.typemap
@@ -0,0 +1,19 @@ +# 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. + +mojom = "//ui/display/mojom/display_mode.mojom" +public_headers = [ "//ui/display/types/display_mode.h" ] +traits_headers = [ "//ui/display/mojom/display_mode_mojom_traits.h" ] +sources = [ + "//ui/display/mojom/display_mode_mojom_traits.cc", +] +public_deps = [ + "//ui/display", +] +deps = [ + "//ui/gfx/geometry", +] +type_mappings = [ + "display.mojom.DisplayMode=std::unique_ptr<display::DisplayMode>[move_only]", +]
diff --git a/ui/display/mojo/display_mode_struct_traits.cc b/ui/display/mojom/display_mode_mojom_traits.cc similarity index 92% rename from ui/display/mojo/display_mode_struct_traits.cc rename to ui/display/mojom/display_mode_mojom_traits.cc index 7c65a2d..688d435 100644 --- a/ui/display/mojo/display_mode_struct_traits.cc +++ b/ui/display/mojom/display_mode_mojom_traits.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 "ui/display/mojo/display_mode_struct_traits.h" +#include "ui/display/mojom/display_mode_mojom_traits.h" #include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
diff --git a/ui/display/mojo/display_mode_struct_traits.h b/ui/display/mojom/display_mode_mojom_traits.h similarity index 81% rename from ui/display/mojo/display_mode_struct_traits.h rename to ui/display/mojom/display_mode_mojom_traits.h index 2990846d..a47c72a 100644 --- a/ui/display/mojo/display_mode_struct_traits.h +++ b/ui/display/mojom/display_mode_mojom_traits.h
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_MOJO_DISPLAY_MODE_STRUCT_TRAITS_H_ -#define UI_DISPLAY_MOJO_DISPLAY_MODE_STRUCT_TRAITS_H_ +#ifndef UI_DISPLAY_MOJOM_DISPLAY_MODE_MOJOM_TRAITS_H_ +#define UI_DISPLAY_MOJOM_DISPLAY_MODE_MOJOM_TRAITS_H_ +#include "ui/display/mojom/display_mode.mojom.h" #include "ui/display/types/display_mode.h" -#include "ui/display/mojo/display_mode.mojom.h" #include "ui/gfx/geometry/size.h" namespace mojo { @@ -35,4 +35,4 @@ } // namespace mojo -#endif // UI_DISPLAY_MOJO_DISPLAY_MODE_STRUCT_TRAITS_H_ +#endif // UI_DISPLAY_MOJOM_DISPLAY_MODE_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_struct_traits.cc b/ui/display/mojom/display_mojom_traits.cc similarity index 98% rename from ui/display/mojo/display_struct_traits.cc rename to ui/display/mojom/display_mojom_traits.cc index acbcaab..0df6fc4 100644 --- a/ui/display/mojo/display_struct_traits.cc +++ b/ui/display/mojom/display_mojom_traits.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 "ui/display/mojo/display_struct_traits.h" +#include "ui/display/mojom/display_mojom_traits.h" namespace mojo {
diff --git a/ui/display/mojo/display_struct_traits.h b/ui/display/mojom/display_mojom_traits.h similarity index 93% rename from ui/display/mojo/display_struct_traits.h rename to ui/display/mojom/display_mojom_traits.h index 055cd8b..2937b936 100644 --- a/ui/display/mojo/display_struct_traits.h +++ b/ui/display/mojom/display_mojom_traits.h
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_MOJO_DISPLAY_STRUCT_TRAITS_H_ -#define UI_DISPLAY_MOJO_DISPLAY_STRUCT_TRAITS_H_ +#ifndef UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_ +#define UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_ #include "ui/display/display.h" -#include "ui/display/mojo/display.mojom.h" +#include "ui/display/mojom/display.mojom.h" #include "ui/gfx/geometry/mojo/geometry_struct_traits.h" namespace mojo { @@ -95,4 +95,4 @@ } // namespace mojo -#endif // UI_DISPLAY_MOJO_DISPLAY_STRUCT_TRAITS_H_ +#endif // UI_DISPLAY_MOJOM_DISPLAY_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/display_struct_traits_unittest.cc b/ui/display/mojom/display_mojom_traits_unittest.cc similarity index 97% rename from ui/display/mojo/display_struct_traits_unittest.cc rename to ui/display/mojom/display_mojom_traits_unittest.cc index b4c0b3b..5038f2a2 100644 --- a/ui/display/mojo/display_struct_traits_unittest.cc +++ b/ui/display/mojom/display_mojom_traits_unittest.cc
@@ -12,11 +12,11 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/display/display.h" #include "ui/display/display_layout.h" -#include "ui/display/mojo/display_layout_struct_traits.h" -#include "ui/display/mojo/display_mode_struct_traits.h" -#include "ui/display/mojo/display_snapshot_struct_traits.h" -#include "ui/display/mojo/display_struct_traits.h" -#include "ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h" +#include "ui/display/mojom/display_layout_mojom_traits.h" +#include "ui/display/mojom/display_mode_mojom_traits.h" +#include "ui/display/mojom/display_mojom_traits.h" +#include "ui/display/mojom/display_snapshot_mojom_traits.h" +#include "ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h" #include "ui/display/types/display_constants.h" #include "ui/display/types/display_mode.h" #include "ui/display/types/display_snapshot.h"
diff --git a/ui/display/mojo/display_rotation_for_blink.typemap b/ui/display/mojom/display_rotation_for_blink.typemap similarity index 69% rename from ui/display/mojo/display_rotation_for_blink.typemap rename to ui/display/mojom/display_rotation_for_blink.typemap index 9e8394b..78d24b36 100644 --- a/ui/display/mojo/display_rotation_for_blink.typemap +++ b/ui/display/mojom/display_rotation_for_blink.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//ui/display/mojo/display.mojom" +mojom = "//ui/display/mojom/display.mojom" public_headers = [ "//ui/display/display.h" ] -traits_headers = [ "//ui/display/mojo/display_struct_traits.h" ] +traits_headers = [ "//ui/display/mojom/display_mojom_traits.h" ] public_deps = [ "//ui/display", - "//ui/display/mojo:interfaces", + "//ui/display/mojom:mojom", ] type_mappings = [ "display.mojom.Rotation=display::Display::Rotation" ]
diff --git a/ui/display/mojo/display_snapshot.mojom b/ui/display/mojom/display_snapshot.mojom similarity index 91% rename from ui/display/mojo/display_snapshot.mojom rename to ui/display/mojom/display_snapshot.mojom index 9c358b5..95c32cb 100644 --- a/ui/display/mojo/display_snapshot.mojom +++ b/ui/display/mojom/display_snapshot.mojom
@@ -5,8 +5,8 @@ module display.mojom; import "mojo/public/mojom/base/file_path.mojom"; -import "ui/display/mojo/display_constants.mojom"; -import "ui/display/mojo/display_mode.mojom"; +import "ui/display/mojom/display_constants.mojom"; +import "ui/display/mojom/display_mode.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/mojo/color_space.mojom";
diff --git a/ui/display/mojo/display_snapshot.typemap b/ui/display/mojom/display_snapshot.typemap similarity index 70% rename from ui/display/mojo/display_snapshot.typemap rename to ui/display/mojom/display_snapshot.typemap index 4668070..f9d8d07 100644 --- a/ui/display/mojo/display_snapshot.typemap +++ b/ui/display/mojom/display_snapshot.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//ui/display/mojo/display_snapshot.mojom" +mojom = "//ui/display/mojom/display_snapshot.mojom" public_headers = [ "//ui/display/types/display_snapshot.h" ] -traits_headers = [ "//ui/display/mojo/display_snapshot_struct_traits.h" ] +traits_headers = [ "//ui/display/mojom/display_snapshot_mojom_traits.h" ] sources = [ - "//ui/display/mojo/display_snapshot_struct_traits.cc", + "//ui/display/mojom/display_snapshot_mojom_traits.cc", ] public_deps = [ "//ui/display",
diff --git a/ui/display/mojo/display_snapshot_struct_traits.cc b/ui/display/mojom/display_snapshot_mojom_traits.cc similarity index 98% rename from ui/display/mojo/display_snapshot_struct_traits.cc rename to ui/display/mojom/display_snapshot_mojom_traits.cc index 21eb7044..0c5373e 100644 --- a/ui/display/mojo/display_snapshot_struct_traits.cc +++ b/ui/display/mojom/display_snapshot_mojom_traits.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 "ui/display/mojo/display_snapshot_struct_traits.h" +#include "ui/display/mojom/display_snapshot_mojom_traits.h" #include "mojo/public/cpp/base/file_path_mojom_traits.h" #include "ui/display/types/display_constants.h"
diff --git a/ui/display/mojo/display_snapshot_struct_traits.h b/ui/display/mojom/display_snapshot_mojom_traits.h similarity index 90% rename from ui/display/mojo/display_snapshot_struct_traits.h rename to ui/display/mojom/display_snapshot_mojom_traits.h index 0267d56c..55c1579 100644 --- a/ui/display/mojo/display_snapshot_struct_traits.h +++ b/ui/display/mojom/display_snapshot_mojom_traits.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_MOJO_DISPLAY_SNAPSHOT_MOJO_STRUCT_TRAITS_H_ -#define UI_DISPLAY_MOJO_DISPLAY_SNAPSHOT_MOJO_STRUCT_TRAITS_H_ +#ifndef UI_DISPLAY_MOJOM_DISPLAY_SNAPSHOT_MOJOM_TRAITS_H_ +#define UI_DISPLAY_MOJOM_DISPLAY_SNAPSHOT_MOJOM_TRAITS_H_ #include "ipc/ipc_message_utils.h" -#include "ui/display/mojo/display_constants_struct_traits.h" -#include "ui/display/mojo/display_mode_struct_traits.h" -#include "ui/display/mojo/display_snapshot.mojom.h" +#include "ui/display/mojom/display_constants_mojom_traits.h" +#include "ui/display/mojom/display_mode_mojom_traits.h" +#include "ui/display/mojom/display_snapshot.mojom.h" #include "ui/display/types/display_mode.h" #include "ui/display/types/display_snapshot.h" #include "ui/gfx/geometry/mojo/geometry_struct_traits.h" @@ -119,4 +119,4 @@ } // namespace mojo -#endif // UI_DISPLAY_MOJO_DISPLAY_SNAPSHOT_MOJO_STRUCT_TRAITS_H_ +#endif // UI_DISPLAY_MOJOM_DISPLAY_SNAPSHOT_MOJOM_TRAITS_H_
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry.mojom b/ui/display/mojom/gamma_ramp_rgb_entry.mojom similarity index 100% rename from ui/display/mojo/gamma_ramp_rgb_entry.mojom rename to ui/display/mojom/gamma_ramp_rgb_entry.mojom
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry.typemap b/ui/display/mojom/gamma_ramp_rgb_entry.typemap similarity index 64% rename from ui/display/mojo/gamma_ramp_rgb_entry.typemap rename to ui/display/mojom/gamma_ramp_rgb_entry.typemap index 2618fe9..d93d295 100644 --- a/ui/display/mojo/gamma_ramp_rgb_entry.typemap +++ b/ui/display/mojom/gamma_ramp_rgb_entry.typemap
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//ui/display/mojo/gamma_ramp_rgb_entry.mojom" +mojom = "//ui/display/mojom/gamma_ramp_rgb_entry.mojom" public_headers = [ "//ui/display/types/gamma_ramp_rgb_entry.h" ] -traits_headers = [ "//ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h" ] +traits_headers = [ "//ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h" ] sources = [ - "//ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc", + "//ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc", ] public_deps = [ "//ui/display",
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc similarity index 88% rename from ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc rename to ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.cc index 6ac8ecb..19a34fc 100644 --- a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.cc +++ b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.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 "ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h" +#include "ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h" namespace mojo {
diff --git a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h similarity index 77% rename from ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h rename to ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h index 68c19f5..30c4c1a 100644 --- a/ui/display/mojo/gamma_ramp_rgb_entry_struct_traits.h +++ b/ui/display/mojom/gamma_ramp_rgb_entry_mojom_traits.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_DISPLAY_MOJO_GAMMA_RAMP_RGB_ENTRY_STRUCT_TRAITS_H_ -#define UI_DISPLAY_MOJO_GAMMA_RAMP_RGB_ENTRY_STRUCT_TRAITS_H_ +#ifndef UI_DISPLAY_MOJOM_GAMMA_RAMP_RGB_ENTRY_MOJOM_TRAITS_H_ +#define UI_DISPLAY_MOJOM_GAMMA_RAMP_RGB_ENTRY_MOJOM_TRAITS_H_ -#include "ui/display/mojo/gamma_ramp_rgb_entry.mojom.h" +#include "ui/display/mojom/gamma_ramp_rgb_entry.mojom.h" #include "ui/display/types/gamma_ramp_rgb_entry.h" namespace mojo { @@ -31,4 +31,4 @@ } // namespace mojo -#endif // UI_DISPLAY_MOJO_GAMMA_RAMP_RGB_ENTRY_STRUCT_TRAITS_H_ +#endif // UI_DISPLAY_MOJOM_GAMMA_RAMP_RGB_ENTRY_MOJOM_TRAITS_H_
diff --git a/ui/display/mojom/typemaps.gni b/ui/display/mojom/typemaps.gni new file mode 100644 index 0000000..1cbc47b1 --- /dev/null +++ b/ui/display/mojom/typemaps.gni
@@ -0,0 +1,12 @@ +# 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. + +typemaps = [ + "//ui/display/mojom/display.typemap", + "//ui/display/mojom/display_constants.typemap", + "//ui/display/mojom/display_layout.typemap", + "//ui/display/mojom/display_mode.typemap", + "//ui/display/mojom/display_snapshot.typemap", + "//ui/display/mojom/gamma_ramp_rgb_entry.typemap", +]
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc index 65bee0e..468a330 100644 --- a/ui/message_center/views/message_view.cc +++ b/ui/message_center/views/message_view.cc
@@ -9,9 +9,9 @@ #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/compositor/paint_recorder.h" #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/gfx/canvas.h" +#include "ui/gfx/color_palette.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/shadow_util.h" #include "ui/gfx/shadow_value.h" @@ -26,6 +26,8 @@ #include "ui/views/controls/image_view.h" #include "ui/views/controls/scroll_view.h" #include "ui/views/focus/focus_manager.h" +#include "ui/views/style/platform_style.h" +#include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" #if defined(OS_WIN) @@ -72,14 +74,15 @@ MessageView::MessageView(const Notification& notification) : notification_id_(notification.id()), slide_out_controller_(this, this) { SetFocusBehavior(FocusBehavior::ALWAYS); + focus_ring_ = views::FocusRing::Install(this); + + // TODO(amehfooz): Remove explicit color setting after native theme changes. + focus_ring_->SetColor(gfx::kGoogleBlue500); // Paint to a dedicated layer to make the layer non-opaque. SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); - focus_painter_ = views::Painter::CreateSolidFocusPainter( - kFocusBorderColor, gfx::Insets(0, 0, 1, 1)); - UpdateWithNotification(notification); UpdateCornerRadius(0, 0); @@ -155,12 +158,41 @@ } void MessageView::UpdateCornerRadius(int top_radius, int bottom_radius) { + SetCornerRadius(top_radius, bottom_radius); SetBackground(views::CreateBackgroundFromPainter( std::make_unique<NotificationBackgroundPainter>(top_radius, bottom_radius))); SchedulePaint(); } +void MessageView::UpdateFocusHighlight() { + gfx::Rect rect(GetBoundsInScreen().size()); + // Shrink focus ring size by -kFocusHaloInset on each side to draw + // them on top of the notifications. We need to do this because TrayBubbleView + // has a layer that masks to bounds due to which the focus ring can not extend + // outside the view. This is not required on the bottom most notification's + // bottom side. + int inset = -views::PlatformStyle::kFocusHaloInset; + int bottom_inset = bottom_radius_ == 0 ? inset : 0; + rect.Inset(gfx::Insets(inset, inset, bottom_inset, inset)); + + int top_radius = std::max(0, top_radius_ - inset); + int bottom_radius = std::max(0, bottom_radius_ - inset); + SkScalar radii[8] = {top_radius, top_radius, // top-left + top_radius, top_radius, // top-right + bottom_radius, bottom_radius, // bottom-right + bottom_radius, bottom_radius}; // bottom-left + + auto path = std::make_unique<SkPath>(); + path->addRoundRect(gfx::RectToSkRect(rect), radii); + SetProperty(views::kHighlightPathKey, path.release()); +} + +void MessageView::OnBoundsChanged(const gfx::Rect& previous_bounds) { + views::InkDropHostView::OnBoundsChanged(previous_bounds); + UpdateFocusHighlight(); +} + void MessageView::OnContainerAnimationStarted() { // Not implemented by default. } @@ -220,15 +252,6 @@ return true; } -void MessageView::PaintChildren(const views::PaintInfo& paint_info) { - views::View::PaintChildren(paint_info); - - // Paint focus ring on top of all the children. - ui::PaintRecorder recorder(paint_info.context(), size()); - views::Painter::PaintFocusPainter(this, recorder.canvas(), - focus_painter_.get()); -} - void MessageView::OnPaint(gfx::Canvas* canvas) { if (ShouldShowAeroShadowBorder()) { // If the border is shadow, paint border first. @@ -241,12 +264,6 @@ } } -void MessageView::OnFocus() { - views::View::OnFocus(); - // We paint a focus indicator. - SchedulePaint(); -} - void MessageView::OnBlur() { views::View::OnBlur(); // We paint a focus indicator. @@ -390,6 +407,11 @@ slide_out_controller_.SetSwipeControlWidth(control_button_width); } +void MessageView::SetCornerRadius(int top_radius, int bottom_radius) { + top_radius_ = top_radius; + bottom_radius_ = bottom_radius; +} + void MessageView::OnCloseButtonPressed() { MessageCenter::Get()->RemoveNotification(notification_id_, true /* by_user */);
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h index c9f0809..59a20ec9 100644 --- a/ui/message_center/views/message_view.h +++ b/ui/message_center/views/message_view.h
@@ -20,11 +20,11 @@ #include "ui/message_center/public/cpp/notification_delegate.h" #include "ui/message_center/views/slide_out_controller.h" #include "ui/views/animation/ink_drop_host_view.h" +#include "ui/views/controls/focus_ring.h" #include "ui/views/focus/focus_manager.h" #include "ui/views/view.h" namespace views { -class Painter; class ScrollView; } // namespace views @@ -118,9 +118,8 @@ void OnMouseReleased(const ui::MouseEvent& event) override; bool OnKeyPressed(const ui::KeyEvent& event) override; bool OnKeyReleased(const ui::KeyEvent& event) override; - void PaintChildren(const views::PaintInfo& paint_info) override; void OnPaint(gfx::Canvas* canvas) override; - void OnFocus() override; + void OnBoundsChanged(const gfx::Rect& previous_bounds) override; void OnBlur() override; void OnGestureEvent(ui::GestureEvent* event) override; void RemovedFromWidget() override; @@ -165,6 +164,13 @@ // Changes the background color and schedules a paint. virtual void SetDrawBackgroundAsActive(bool active); + // Update the focus ring highlight for the notification. + // Adds a highlight path based on the notification's bounds + // and corner radii. + void UpdateFocusHighlight(); + + void SetCornerRadius(int top_radius, int bottom_radius); + views::ScrollView* scroller() { return scroller_; } bool is_nested() const { return is_nested_; } @@ -190,8 +196,6 @@ // "fixed" mode flag. See the comment in MessageView::Mode for detail. bool setting_mode_ = false; - std::unique_ptr<views::Painter> focus_painter_; - SlideOutController slide_out_controller_; base::ObserverList<SlideObserver>::Unchecked slide_observers_; @@ -203,6 +207,12 @@ bool disable_slide_ = false; views::FocusManager* focus_manager_ = nullptr; + std::unique_ptr<views::FocusRing> focus_ring_; + + // Radius values used to determine the rounding for the rounded rectangular + // shape of the notification. + int top_radius_ = 0; + int bottom_radius_ = 0; DISALLOW_COPY_AND_ASSIGN(MessageView); };
diff --git a/ui/ozone/public/interfaces/BUILD.gn b/ui/ozone/public/interfaces/BUILD.gn index 59433b6..6fa3384d 100644 --- a/ui/ozone/public/interfaces/BUILD.gn +++ b/ui/ozone/public/interfaces/BUILD.gn
@@ -16,7 +16,7 @@ public_deps = [ "//mojo/public/mojom/base", "//skia/public/interfaces:interfaces", - "//ui/display/mojo:interfaces", + "//ui/display/mojom", "//ui/gfx/geometry/mojo", "//ui/gfx/mojo", ]
diff --git a/ui/ozone/public/interfaces/drm_device.mojom b/ui/ozone/public/interfaces/drm_device.mojom index d6ae55e..511d4a2 100644 --- a/ui/ozone/public/interfaces/drm_device.mojom +++ b/ui/ozone/public/interfaces/drm_device.mojom
@@ -6,10 +6,10 @@ import "mojo/public/mojom/base/file.mojom"; import "mojo/public/mojom/base/file_path.mojom"; -import "ui/display/mojo/display_constants.mojom"; -import "ui/display/mojo/display_mode.mojom"; -import "ui/display/mojo/display_snapshot.mojom"; -import "ui/display/mojo/gamma_ramp_rgb_entry.mojom"; +import "ui/display/mojom/display_constants.mojom"; +import "ui/display/mojom/display_mode.mojom"; +import "ui/display/mojom/display_snapshot.mojom"; +import "ui/display/mojom/gamma_ramp_rgb_entry.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/mojo/accelerated_widget.mojom"; import "ui/ozone/public/interfaces/device_cursor.mojom";
diff --git a/ui/ozone/testhelpers/BUILD.gn b/ui/ozone/testhelpers/BUILD.gn new file mode 100644 index 0000000..6c874a73 --- /dev/null +++ b/ui/ozone/testhelpers/BUILD.gn
@@ -0,0 +1,15 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +static_library("mock_gesture_properties_service") { + testonly = true + sources = [ + "mock_gesture_properties_service.h", + ] + public_deps = [ + "//testing/gmock", + "//third_party/googletest:gmock", + "//ui/ozone/public/interfaces:gesture_properties_service", + ] +}
diff --git a/ui/ozone/testhelpers/DEPS b/ui/ozone/testhelpers/DEPS new file mode 100644 index 0000000..86cba92 --- /dev/null +++ b/ui/ozone/testhelpers/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+gmock", +]
diff --git a/ui/ozone/testhelpers/README.md b/ui/ozone/testhelpers/README.md new file mode 100644 index 0000000..5203b88e --- /dev/null +++ b/ui/ozone/testhelpers/README.md
@@ -0,0 +1,3 @@ +This directory contains code that Ozone consumers might find useful for building +tests (such as mock classes for public interfaces). Code for testing Ozone +itself should be placed elsewhere.
diff --git a/ui/ozone/testhelpers/mock_gesture_properties_service.h b/ui/ozone/testhelpers/mock_gesture_properties_service.h new file mode 100644 index 0000000..55af852 --- /dev/null +++ b/ui/ozone/testhelpers/mock_gesture_properties_service.h
@@ -0,0 +1,34 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_OZONE_TESTHELPERS_MOCK_GESTURE_PROPERTIES_SERVICE_H_ +#define UI_OZONE_TESTHELPERS_MOCK_GESTURE_PROPERTIES_SERVICE_H_ + +#include "gmock/gmock.h" +#include "ui/ozone/public/interfaces/gesture_properties_service.mojom.h" + +// Mock of GesturePropertiesService's C++ bindings, useful for tests. +class MockGesturePropertiesService + : public ui::ozone::mojom::GesturePropertiesService { + public: + MockGesturePropertiesService(); + ~MockGesturePropertiesService(); + + MOCK_METHOD1(ListDevices, void(ListDevicesCallback)); + MOCK_METHOD2(ListProperties, void(int32_t, ListPropertiesCallback)); + MOCK_METHOD3(GetProperty, + void(int32_t, const std::string&, GetPropertyCallback)); + MOCK_METHOD4(SetProperty, + void(int32_t, + const std::string&, + ui::ozone::mojom::GesturePropValuePtr, + SetPropertyCallback)); +}; + +// Work around the compile error '[chromium-style] Complex class/struct needs an +// explicit out-of-line constructor.' +inline MockGesturePropertiesService::MockGesturePropertiesService() = default; +inline MockGesturePropertiesService::~MockGesturePropertiesService() = default; + +#endif // UI_OZONE_TESTHELPERS_MOCK_GESTURE_PROPERTIES_SERVICE_H_
diff --git a/ui/views/animation/ink_drop_host_view.cc b/ui/views/animation/ink_drop_host_view.cc index a6fcea7..5f8a9ac 100644 --- a/ui/views/animation/ink_drop_host_view.cc +++ b/ui/views/animation/ink_drop_host_view.cc
@@ -105,7 +105,7 @@ void InkDropHostView::AnimateInkDrop(InkDropState state, const ui::LocatedEvent* event) { - ink_drop_event_handler_.AnimateInkDrop(state, event); + GetEventHandler()->AnimateInkDrop(state, event); } std::unique_ptr<InkDropImpl> InkDropHostView::CreateDefaultInkDropImpl() { @@ -170,9 +170,8 @@ } gfx::Point InkDropHostView::GetInkDropCenterBasedOnLastEvent() const { - return ink_drop_event_handler_.GetLastRippleTriggeringEvent() - ? ink_drop_event_handler_.GetLastRippleTriggeringEvent() - ->location() + return GetEventHandler()->GetLastRippleTriggeringEvent() + ? GetEventHandler()->GetLastRippleTriggeringEvent()->location() : GetMirroredRect(GetContentsBounds()).CenterPoint(); } @@ -195,6 +194,17 @@ return gfx::ScaleToCeiledSize(gfx::Size(small_size), kLargeInkDropScale); } +const InkDropEventHandler* InkDropHostView::GetEventHandler() const { + if (ink_drop_event_handler_override_) + return ink_drop_event_handler_override_; + return &ink_drop_event_handler_; +} + +InkDropEventHandler* InkDropHostView::GetEventHandler() { + return const_cast<InkDropEventHandler*>( + const_cast<const InkDropHostView*>(this)->GetEventHandler()); +} + BEGIN_METADATA(InkDropHostView) METADATA_PARENT_CLASS(View) END_METADATA()
diff --git a/ui/views/animation/ink_drop_host_view.h b/ui/views/animation/ink_drop_host_view.h index fce6c3d..c410d9fb 100644 --- a/ui/views/animation/ink_drop_host_view.h +++ b/ui/views/animation/ink_drop_host_view.h
@@ -113,6 +113,16 @@ return ink_drop_large_corner_radius_; } + // Allows InstallableInkDrop to override our InkDropEventHandler + // instance. + // + // TODO(crbug.com/931964): Remove this, either by finishing refactor or by + // giving up. + void set_ink_drop_event_handler_override( + InkDropEventHandler* ink_drop_event_handler_override) { + ink_drop_event_handler_override_ = ink_drop_event_handler_override; + } + // Animates |ink_drop_| to the desired |ink_drop_state|. Caches |event| as the // last_ripple_triggering_event(). // @@ -206,6 +216,9 @@ InkDropHostView* const host_view_; }; + const InkDropEventHandler* GetEventHandler() const; + InkDropEventHandler* GetEventHandler(); + // Defines what type of |ink_drop_| to create. InkDropMode ink_drop_mode_ = InkDropMode::OFF; @@ -217,6 +230,8 @@ InkDropHostViewEventHandlerDelegate ink_drop_event_handler_delegate_; InkDropEventHandler ink_drop_event_handler_; + InkDropEventHandler* ink_drop_event_handler_override_ = nullptr; + float ink_drop_visible_opacity_ = 0.175f; // TODO(pbos): Audit call sites to make sure highlight opacity is either
diff --git a/ui/views/animation/installable_ink_drop.cc b/ui/views/animation/installable_ink_drop.cc index 89ecb2f..3580d476 100644 --- a/ui/views/animation/installable_ink_drop.cc +++ b/ui/views/animation/installable_ink_drop.cc
@@ -21,6 +21,7 @@ #include "ui/gfx/geometry/size.h" #include "ui/gfx/skia_util.h" #include "ui/views/animation/compositor_animation_runner.h" +#include "ui/views/animation/ink_drop_host_view.h" #include "ui/views/view.h" #include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" @@ -63,8 +64,17 @@ } } +InstallableInkDrop::InstallableInkDrop(InkDropHostView* ink_drop_host_view) + : InstallableInkDrop(static_cast<View*>(ink_drop_host_view)) { + // To get all events, we must override InkDropHostView's event handler. + ink_drop_host_view->set_ink_drop_event_handler_override(&event_handler_); + ink_drop_host_view_ = ink_drop_host_view; +} + InstallableInkDrop::~InstallableInkDrop() { view_->RemoveLayerBeneathView(layer_.get()); + if (ink_drop_host_view_) + ink_drop_host_view_->set_ink_drop_event_handler_override(nullptr); if (DCHECK_IS_ON()) view_->RemoveObserver(this); }
diff --git a/ui/views/animation/installable_ink_drop.h b/ui/views/animation/installable_ink_drop.h index 13d3e5f2..9bba4e3 100644 --- a/ui/views/animation/installable_ink_drop.h +++ b/ui/views/animation/installable_ink_drop.h
@@ -32,6 +32,7 @@ namespace views { +class InkDropHostView; class View; extern const VIEWS_EXPORT base::Feature kInstallableInkDropFeature; @@ -48,6 +49,12 @@ // Create ink drop for |view|. Note that |view| must live longer than us. explicit InstallableInkDrop(View* view); + // Overload for working within the InkDropHostView hierarchy. Similar to + // above, |ink_drop_host_view| must outlive us. + // + // TODO(crbug.com/931964): Remove this. + explicit InstallableInkDrop(InkDropHostView* ink_drop_host_view); + InstallableInkDrop(const InstallableInkDrop&) = delete; InstallableInkDrop(InstallableInkDrop&&) = delete; @@ -96,6 +103,10 @@ // visual state. View* const view_; + // If we were installed on an InkDropHostView, this will be non-null. We store + // this to to remove our InkDropEventHandler override. + InkDropHostView* ink_drop_host_view_ = nullptr; + // The layer we paint to. std::unique_ptr<ui::Layer> layer_;
diff --git a/ui/views/controls/button/menu_button.cc b/ui/views/controls/button/menu_button.cc index 895da043..3b073c9f 100644 --- a/ui/views/controls/button/menu_button.cc +++ b/ui/views/controls/button/menu_button.cc
@@ -22,6 +22,11 @@ CreateButtonControllerDelegate()); menu_button_controller_ = menu_button_controller.get(); SetButtonController(std::move(menu_button_controller)); + + // Triggers on button press by default, unless drag-and-drop is enabled, see + // MenuButtonController::IsTriggerableEventType. + // TODO(cyan): Investigate using PlatformStyle::kMenuNotifyActivationAction. + set_notify_action(Button::NOTIFY_ON_PRESS); } MenuButton::~MenuButton() = default; @@ -29,10 +34,6 @@ return button_controller()->Activate(event); } -bool MenuButton::IsTriggerableEventType(const ui::Event& event) { - return button_controller()->IsTriggerableEventType(event); -} - void MenuButton::NotifyClick(const ui::Event& event) { // Notify MenuButtonListener via MenuButtonController, instead of // ButtonListener::ButtonPressed.
diff --git a/ui/views/controls/button/menu_button.h b/ui/views/controls/button/menu_button.h index 71afb70f..d55a47526 100644 --- a/ui/views/controls/button/menu_button.h +++ b/ui/views/controls/button/menu_button.h
@@ -41,9 +41,6 @@ bool Activate(const ui::Event* event); - // TODO(cyan): Remove this method and move into MenuButtonController. - virtual bool IsTriggerableEventType(const ui::Event& event); - protected: // Button: void NotifyClick(const ui::Event& event) final;
diff --git a/ui/views/controls/button/menu_button_controller.cc b/ui/views/controls/button/menu_button_controller.cc index 3a741cc..2ac2b89 100644 --- a/ui/views/controls/button/menu_button_controller.cc +++ b/ui/views/controls/button/menu_button_controller.cc
@@ -20,6 +20,17 @@ namespace views { +namespace { +ui::EventType NotifyActionToMouseEventType(Button::NotifyAction notify_action) { + switch (notify_action) { + case Button::NOTIFY_ON_PRESS: + return ui::ET_MOUSE_PRESSED; + case Button::NOTIFY_ON_RELEASE: + return ui::ET_MOUSE_RELEASED; + } +} +} // namespace + //////////////////////////////////////////////////////////////////////////////// // // MenuButtonController::PressedLock @@ -267,13 +278,14 @@ // would also activate a context menu. if (!(mouse_event->button_flags() & button()->triggerable_event_flags())) return false; - // If dragging is supported activate on release, otherwise activate on - // pressed. + + // Activate on release if dragging, otherwise activate based on + // notify_action. ui::EventType active_on = - delegate()->GetDragOperations(mouse_event->location()) == + delegate()->GetDragOperations(mouse_event->location()) != ui::DragDropTypes::DRAG_NONE - ? ui::ET_MOUSE_PRESSED - : ui::ET_MOUSE_RELEASED; + ? ui::ET_MOUSE_RELEASED + : NotifyActionToMouseEventType(button()->notify_action()); return event.type() == active_on; } return event.type() == ui::ET_GESTURE_TAP;
diff --git a/ui/views/examples/examples_main.cc b/ui/views/examples/examples_main.cc index cb3e145a..65ba7c8 100644 --- a/ui/views/examples/examples_main.cc +++ b/ui/views/examples/examples_main.cc
@@ -56,7 +56,7 @@ int main(int argc, char** argv) { #if defined(OS_WIN) - ui::ScopedOleInitializer ole_initializer_; + ui::ScopedOleInitializer ole_initializer; #endif base::CommandLine::Init(argc, argv);
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 6e100a7..e9182c3 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -628,6 +628,8 @@ const ui::Layer* layer = GetLayer(); TRACE_EVENT1("views", "Widget::Show", "layer", layer ? layer->name() : "none"); + ui::WindowShowState preferred_show_state = + CanActivate() ? ui::SHOW_STATE_NORMAL : ui::SHOW_STATE_INACTIVE; if (non_client_view_) { // While initializing, the kiosk mode will go to full screen before the // widget gets shown. In that case we stay in full screen mode, regardless @@ -644,11 +646,9 @@ // |saved_show_state_| only applies the first time the window is shown. // If we don't reset the value the window may be shown maximized every time // it is subsequently shown after being hidden. - saved_show_state_ = ui::SHOW_STATE_NORMAL; + saved_show_state_ = preferred_show_state; } else { - native_widget_->Show( - CanActivate() ? ui::SHOW_STATE_NORMAL : ui::SHOW_STATE_INACTIVE, - gfx::Rect()); + native_widget_->Show(preferred_show_state, gfx::Rect()); } }
diff --git a/ui/webui/resources/cr_elements/cr_icons_css.html b/ui/webui/resources/cr_elements/cr_icons_css.html index 4e7ea75..f3fdcfb 100644 --- a/ui/webui/resources/cr_elements/cr_icons_css.html +++ b/ui/webui/resources/cr_elements/cr_icons_css.html
@@ -42,15 +42,6 @@ } } - :-webkit-any(cr-icon-button, .cr-icon).icon-toolbar-cancel { - background-image: url(../images/icon_toolbar_cancel.svg); - } - @media (prefers-color-scheme: dark) { - :-webkit-any(cr-icon-button, .cr-icon).icon-toolbar-cancel { - background-image: url(../images/dark/icon_toolbar_cancel.svg); - } - } - :-webkit-any(cr-icon-button, .cr-icon).icon-clear { background-image: url(../images/icon_clear.svg); }
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html index 3619422a..7d4d186 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -5,6 +5,7 @@ <link rel="import" href="../cr_search_field/cr_search_field_behavior.html"> <link rel="import" href="../icons.html"> <link rel="import" href="../shared_style_css.html"> +<link rel="import" href="../shared_vars_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html"> <dom-module id="cr-toolbar-search-field"> @@ -31,6 +32,15 @@ @media (prefers-color-scheme: light) { cr-icon-button { --cr-icon-button-color: currentColor; + --iron-icon-fill-color: + var(--cr-toolbar-search-field-input-color, white); + } + } + + @media (prefers-color-scheme: dark) { + cr-icon-button { + --iron-icon-fill-color: var(--cr-toolbar-search-field-input-color, + var(--google-grey-refresh-500)); } } @@ -51,7 +61,8 @@ paper-spinner-lite { @apply --cr-icon-height-width; - --paper-spinner-color: white; + --paper-spinner-color: + var(--cr-toolbar-search-field-input-color, white); margin: 0 6px; opacity: 0; padding: 6px; @@ -96,7 +107,7 @@ -webkit-appearance: none; background: transparent; border: none; - color: white; + color: var(--cr-toolbar-search-field-input-color, white); font: inherit; outline: none; padding: 0; @@ -111,8 +122,10 @@ /** Wide layout. */ :host(:not([narrow])) { - background: rgba(0, 0, 0, 0.22); - border-radius: 2px; + background: + var(--cr-toolbar-search-field-background, rgba(0, 0, 0, 0.22)); + border-radius: + var(--cr-toolbar-search-field-border-radius, 2px); cursor: text; padding-inline-end: 0; width: var(--cr-toolbar-field-width, 680px); @@ -166,7 +179,7 @@ spellcheck="false"> </div> <template is="dom-if" if="[[hasSearchText]]"> - <cr-icon-button class="icon-toolbar-cancel" id="clearSearch" + <cr-icon-button id="clearSearch" iron-icon="cr:cancel" title="[[clearLabel]]" on-click="clearSearch_"></cr-icon-button> </template> </template>
diff --git a/ui/webui/resources/cr_elements/icons.html b/ui/webui/resources/cr_elements/icons.html index d0648870..2679bc3d 100644 --- a/ui/webui/resources/cr_elements/icons.html +++ b/ui/webui/resources/cr_elements/icons.html
@@ -40,6 +40,7 @@ <g id="bluetooth"><path d="M17.71 7.71L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88z"></path></g> <g id="camera-alt"><circle cx="12" cy="12" r="3.2"></circle><path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"></path></g> </if> + <g id="cancel"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"></path></g> <g id="check"><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"></path></g> <g id="chevron-right"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path></g> <g id="clear"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"></path></g>
diff --git a/ui/webui/resources/cr_elements_images.grdp b/ui/webui/resources/cr_elements_images.grdp index 397b634..7c12c157 100644 --- a/ui/webui/resources/cr_elements_images.grdp +++ b/ui/webui/resources/cr_elements_images.grdp
@@ -43,9 +43,6 @@ compress="gzip" /> <include name="IDR_WEBUI_IMAGES_DARK_ICON_SEARCH" file="images/dark/icon_search.svg" type="BINDATA" compress="gzip" /> - <include name="IDR_WEBUI_IMAGES_DARK_ICON_TOOLBAR_CANCEL" - file="images/dark/icon_toolbar_cancel.svg" type="BINDATA" - compress="gzip" /> <include name="IDR_WEBUI_IMAGES_DARK_ICON_VISIBILITY" file="images/dark/icon_visibility.svg" type="BINDATA" compress="gzip" /> @@ -80,9 +77,6 @@ file="images/icon_search.svg" type="BINDATA" compress="gzip" /> <include name="IDR_WEBUI_IMAGES_ICON_SETTINGS" file="images/icon_settings.svg" type="BINDATA" compress="gzip" /> - <include name="IDR_WEBUI_IMAGES_ICON_TOOLBAR_CANCEL" - file="images/icon_toolbar_cancel.svg" type="BINDATA" - compress="gzip" /> <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY" file="images/icon_visibility.svg" type="BINDATA" compress="gzip" /> <include name="IDR_WEBUI_IMAGES_ICON_VISIBILITY_OFF"
diff --git a/ui/webui/resources/images/dark/icon_toolbar_cancel.svg b/ui/webui/resources/images/dark/icon_toolbar_cancel.svg deleted file mode 100644 index 4b22724..0000000 --- a/ui/webui/resources/images/dark/icon_toolbar_cancel.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 2 4" fill="#9aa0a6"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg>
diff --git a/ui/webui/resources/images/icon_toolbar_cancel.svg b/ui/webui/resources/images/icon_toolbar_cancel.svg deleted file mode 100644 index 9765afcf..0000000 --- a/ui/webui/resources/images/icon_toolbar_cancel.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 2 4" fill="#fff"><path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/></svg> \ No newline at end of file
diff --git a/url/url_constants.cc b/url/url_constants.cc index e39b8c5..3540240 100644 --- a/url/url_constants.cc +++ b/url/url_constants.cc
@@ -25,6 +25,7 @@ const char kHttpsScheme[] = "https"; const char kJavaScriptScheme[] = "javascript"; const char kMailToScheme[] = "mailto"; +const char kTelScheme[] = "tel"; const char kWsScheme[] = "ws"; const char kWssScheme[] = "wss";
diff --git a/url/url_constants.h b/url/url_constants.h index 15f0190..d538e4dc 100644 --- a/url/url_constants.h +++ b/url/url_constants.h
@@ -31,6 +31,7 @@ COMPONENT_EXPORT(URL) extern const char kHttpsScheme[]; COMPONENT_EXPORT(URL) extern const char kJavaScriptScheme[]; COMPONENT_EXPORT(URL) extern const char kMailToScheme[]; +COMPONENT_EXPORT(URL) extern const char kTelScheme[]; COMPONENT_EXPORT(URL) extern const char kWsScheme[]; COMPONENT_EXPORT(URL) extern const char kWssScheme[];