diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-03 13:42:47 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-05-15 10:27:51 +0000 |
commit | 8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec (patch) | |
tree | d29d987c4d7b173cf853279b79a51598f104b403 /chromium/chrome/browser/extensions | |
parent | 830c9e163d31a9180fadca926b3e1d7dfffb5021 (diff) | |
download | qtwebengine-chromium-8c5c43c7b138c9b4b0bf56d946e61d3bbc111bec.tar.gz |
BASELINE: Update Chromium to 66.0.3359.156
Change-Id: I0c9831ad39911a086b6377b16f995ad75a51e441
Reviewed-by: Michal Klocek <michal.klocek@qt.io>
Diffstat (limited to 'chromium/chrome/browser/extensions')
159 files changed, 2283 insertions, 1696 deletions
diff --git a/chromium/chrome/browser/extensions/BUILD.gn b/chromium/chrome/browser/extensions/BUILD.gn index 6e19b623bae..cc5ef3e33eb 100644 --- a/chromium/chrome/browser/extensions/BUILD.gn +++ b/chromium/chrome/browser/extensions/BUILD.gn @@ -179,10 +179,6 @@ static_library("extensions") { "api/easy_unlock_private/easy_unlock_private_connection_manager.h", "api/easy_unlock_private/easy_unlock_private_crypto_delegate.h", "api/easy_unlock_private/easy_unlock_private_crypto_delegate_chromeos.cc", - "api/experience_sampling_private/experience_sampling.cc", - "api/experience_sampling_private/experience_sampling.h", - "api/experience_sampling_private/experience_sampling_private_api.cc", - "api/experience_sampling_private/experience_sampling_private_api.h", "api/extension_action/extension_action_api.cc", "api/extension_action/extension_action_api.h", "api/extension_action/extension_page_actions_api_constants.cc", @@ -339,8 +335,6 @@ static_library("extensions") { "api/resources_private/resources_private_api.h", "api/runtime/chrome_runtime_api_delegate.cc", "api/runtime/chrome_runtime_api_delegate.h", - "api/screenlock_private/screenlock_private_api.cc", - "api/screenlock_private/screenlock_private_api.h", "api/sessions/session_id.cc", "api/sessions/session_id.h", "api/sessions/sessions_api.cc", @@ -462,7 +456,6 @@ static_library("extensions") { "bookmark_app_helper.h", "bookmark_app_navigation_throttle.cc", "bookmark_app_navigation_throttle.h", - "browser_action_test_util.h", "browser_context_keyed_service_factories.cc", "browser_context_keyed_service_factories.h", "browser_extension_window_controller.cc", @@ -504,6 +497,8 @@ static_library("extensions") { "chrome_process_manager_delegate.h", "chrome_url_request_util.cc", "chrome_url_request_util.h", + "chrome_zipfile_installer.cc", + "chrome_zipfile_installer.h", "clipboard_extension_helper_chromeos.cc", "clipboard_extension_helper_chromeos.h", "component_extensions_whitelist/whitelist.cc", @@ -558,10 +553,6 @@ static_library("extensions") { "extension_context_menu_model.h", "extension_cookie_notifier.cc", "extension_cookie_notifier.h", - "extension_creator.cc", - "extension_creator.h", - "extension_creator_filter.cc", - "extension_creator_filter.h", "extension_disabled_ui.cc", "extension_disabled_ui.h", "extension_error_controller.cc", @@ -775,8 +766,6 @@ static_library("extensions") { "window_controller_list.cc", "window_controller_list.h", "window_controller_list_observer.h", - "zipfile_installer.cc", - "zipfile_installer.h", ] configs += [ @@ -815,7 +804,7 @@ static_library("extensions") { "//chrome/common/extensions/api:extensions_features", "//chrome/common/safe_browsing:proto", "//chrome/services/media_gallery_util/public/cpp", - "//chrome/services/removable_storage_writer/public/interfaces", + "//chrome/services/removable_storage_writer/public/mojom", "//components/app_modal", "//components/autofill/content/browser", "//components/bookmarks/browser", @@ -825,11 +814,11 @@ static_library("extensions") { "//components/bubble", "//components/content_settings/core/browser", "//components/crx_file", - "//components/crx_file:crx_creator", "//components/cryptauth", "//components/data_reduction_proxy/core/browser", "//components/dom_distiller/core", "//components/download/content/public", + "//components/download/public/common:public", "//components/drive", "//components/favicon/content", "//components/feedback", @@ -838,8 +827,9 @@ static_library("extensions") { "//components/history/core/browser", "//components/infobars/core", "//components/keyed_service/content", - "//components/language/core/browser:browser", - "//components/nacl/common:features", + "//components/language/core/browser", + "//components/language/core/common", + "//components/nacl/common:buildflags", "//components/navigation_interception", "//components/net_log", "//components/omnibox/browser", @@ -892,12 +882,13 @@ static_library("extensions") { "//ppapi/features", "//printing/features", "//rlz/features", + "//services/audio/public/cpp", "//services/data_decoder/public/cpp", - "//services/device/public/interfaces", - "//services/identity/public/interfaces", - "//services/network/public/interfaces", + "//services/device/public/mojom", + "//services/identity/public/mojom", + "//services/network/public/mojom", "//services/service_manager/public/cpp", - "//services/service_manager/public/interfaces", + "//services/service_manager/public/mojom", "//skia", "//sql", "//storage/browser", @@ -909,9 +900,8 @@ static_library("extensions") { "//third_party/leveldatabase", "//third_party/libaddressinput:util", "//third_party/re2", - "//third_party/webrtc/modules/desktop_capture", "//third_party/zlib/google:zip", - "//ui/accessibility:ax_gen", + "//ui/accessibility:ax_enums_mojo", "//ui/base", "//ui/base/ime", "//ui/display/manager", @@ -957,6 +947,8 @@ static_library("extensions") { "api/platform_keys/platform_keys_api.h", "api/platform_keys/verify_trust_api.cc", "api/platform_keys/verify_trust_api.h", + "api/screenlock_private/screenlock_private_api.cc", + "api/screenlock_private/screenlock_private_api.h", "api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.cc", "api/settings_private/chromeos_resolve_time_zone_by_geolocation_method_short.h", "api/settings_private/chromeos_resolve_time_zone_by_geolocation_on_off.cc", @@ -1092,7 +1084,7 @@ static_library("extensions") { if (is_win) { deps += [ - "//chrome/services/wifi_util_win/public/interfaces", + "//chrome/services/wifi_util_win/public/mojom", "//third_party/iaccessible2", "//third_party/isimpledom", ] @@ -1119,6 +1111,7 @@ static_library("extensions") { "api/cloud_print_private/cloud_print_private_api.cc", "api/cloud_print_private/cloud_print_private_api.h", ] + deps += [ "//chrome/common:service_process_mojom" ] } if (enable_service_discovery) { diff --git a/chromium/chrome/browser/extensions/api/DEPS b/chromium/chrome/browser/extensions/api/DEPS index fea8d34597f..e6dcb249500 100644 --- a/chromium/chrome/browser/extensions/api/DEPS +++ b/chromium/chrome/browser/extensions/api/DEPS @@ -8,7 +8,7 @@ include_rules = [ # Enable remote assistance on Chrome OS "+remoting/base", "+remoting/host", - "+services/network/public/interfaces", + "+services/network", ] specific_include_rules = { diff --git a/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc b/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc index 81b27277daa..12183657a08 100644 --- a/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc +++ b/chromium/chrome/browser/extensions/api/automation/automation_apitest.cc @@ -120,7 +120,13 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, Actions) { << message_; } -IN_PROC_BROWSER_TEST_F(AutomationApiTest, Location) { +// TODO(https://crbug.com/622387): Disabled due to flakiness. +#if defined(OS_CHROMEOS) && defined(NDEBUG) +#define MAYBE_Location DISABLED_Location +#else +#define MAYBE_Location Location +#endif +IN_PROC_BROWSER_TEST_F(AutomationApiTest, MAYBE_Location) { StartEmbeddedTestServer(); ASSERT_TRUE(RunExtensionSubtest("automation/tests/tabs", "location.html")) << message_; @@ -174,14 +180,14 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, TabsAutomationHostsPermissions) { } #if defined(USE_AURA) -// Flaky, see http://crbug.com/637525 +// TODO(https://crbug.com/754870): Disabled due to flakiness. IN_PROC_BROWSER_TEST_F(AutomationApiTest, DISABLED_Desktop) { ASSERT_TRUE(RunExtensionSubtest("automation/tests/desktop", "desktop.html")) << message_; } #if defined(OS_CHROMEOS) -// TODO(crbug.com/615908): Flaky on CrOS sanitizers. +// TODO(https://crbug.com/754870): Flaky on CrOS sanitizers. IN_PROC_BROWSER_TEST_F(AutomationApiTest, DISABLED_DesktopInitialFocus) { ASSERT_TRUE( RunExtensionSubtest("automation/tests/desktop", "initial_focus.html")) @@ -194,8 +200,7 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopFocusWeb) { << message_; } -// Flaky, see https://crbug.com/724923. -IN_PROC_BROWSER_TEST_F(AutomationApiTest, DISABLED_DesktopFocusIframe) { +IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopFocusIframe) { StartEmbeddedTestServer(); ASSERT_TRUE( RunExtensionSubtest("automation/tests/desktop", "focus_iframe.html")) @@ -247,7 +252,7 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, DesktopHitTest) { << message_; } -// Flaky, see http://crbug.com/435449 +// TODO(https://crbug.com/754870): flaky. IN_PROC_BROWSER_TEST_F(AutomationApiTest, DISABLED_DesktopLoadTabs) { ASSERT_TRUE(RunExtensionSubtest("automation/tests/desktop", "load_tabs.html")) << message_; @@ -280,13 +285,19 @@ IN_PROC_BROWSER_TEST_F(AutomationApiTest, Find) { << message_; } -// TODO(crbug.com/725420) Flaky IN_PROC_BROWSER_TEST_F(AutomationApiTest, Attributes) { StartEmbeddedTestServer(); ASSERT_TRUE(RunExtensionSubtest("automation/tests/tabs", "attributes.html")) << message_; } +IN_PROC_BROWSER_TEST_F(AutomationApiTest, ReverseRelations) { + StartEmbeddedTestServer(); + ASSERT_TRUE( + RunExtensionSubtest("automation/tests/tabs", "reverse_relations.html")) + << message_; +} + IN_PROC_BROWSER_TEST_F(AutomationApiTest, TreeChange) { StartEmbeddedTestServer(); ASSERT_TRUE(RunExtensionSubtest("automation/tests/tabs", "tree_change.html")) diff --git a/chromium/chrome/browser/extensions/api/automation_internal/automation_event_router.cc b/chromium/chrome/browser/extensions/api/automation_internal/automation_event_router.cc index b54484f9b58..b87d67a8227 100644 --- a/chromium/chrome/browser/extensions/api/automation_internal/automation_event_router.cc +++ b/chromium/chrome/browser/extensions/api/automation_internal/automation_event_router.cc @@ -23,7 +23,7 @@ #include "extensions/browser/event_router.h" #include "extensions/common/extension.h" #include "ui/accessibility/ax_action_data.h" -#include "ui/accessibility/ax_enums.h" +#include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc b/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc index c468f587436..e8309a03a77 100644 --- a/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc +++ b/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.cc @@ -15,6 +15,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/extensions/api/automation_internal/automation_event_router.h" #include "chrome/browser/extensions/api/tabs/tabs_constants.h" +#include "chrome/browser/extensions/chrome_extension_function_details.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -37,6 +38,7 @@ #include "extensions/common/extension_messages.h" #include "extensions/common/permissions/permissions_data.h" #include "ui/accessibility/ax_action_data.h" +#include "ui/accessibility/ax_enum_util.h" #include "ui/accessibility/ax_host_delegate.h" #include "ui/accessibility/ax_tree_id_registry.h" @@ -208,7 +210,7 @@ class AutomationWebContentsObserver std::vector<content::AXEventNotificationDetails> details; content::AXEventNotificationDetails detail; detail.ax_tree_id = id.first->GetAXTreeID(); - detail.event_type = ui::AX_EVENT_MEDIA_STARTED_PLAYING; + detail.event_type = ax::mojom::Event::kMediaStartedPlaying; details.push_back(detail); AccessibilityEventReceived(details); } @@ -220,7 +222,7 @@ class AutomationWebContentsObserver std::vector<content::AXEventNotificationDetails> details; content::AXEventNotificationDetails detail; detail.ax_tree_id = id.first->GetAXTreeID(); - detail.event_type = ui::AX_EVENT_MEDIA_STOPPED_PLAYING; + detail.event_type = ax::mojom::Event::kMediaStoppedPlaying; details.push_back(detail); AccessibilityEventReceived(details); } @@ -239,7 +241,7 @@ class AutomationWebContentsObserver content::AXEventNotificationDetails detail; detail.ax_tree_id = rfh->GetAXTreeID(); - detail.event_type = ui::AX_EVENT_MEDIA_STARTED_PLAYING; + detail.event_type = ax::mojom::Event::kMediaStartedPlaying; details.push_back(detail); AccessibilityEventReceived(details); } @@ -261,18 +263,19 @@ AutomationInternalEnableTabFunction::Run() { content::WebContents* contents = NULL; if (params->args.tab_id.get()) { int tab_id = *params->args.tab_id; - if (!ExtensionTabUtil::GetTabById(tab_id, - GetProfile(), - include_incognito(), - NULL, /* browser out param*/ - NULL, /* tab_strip out param */ - &contents, - NULL /* tab_index out param */)) { + if (!ExtensionTabUtil::GetTabById( + tab_id, browser_context(), include_incognito(), + NULL, /* browser out param*/ + NULL, /* tab_strip out param */ + &contents, NULL /* tab_index out param */)) { return RespondNow( Error(tabs_constants::kTabNotFoundError, base::IntToString(tab_id))); } } else { - contents = GetCurrentBrowser()->tab_strip_model()->GetActiveWebContents(); + contents = ChromeExtensionFunctionDetails(this) + .GetCurrentBrowser() + ->tab_strip_model() + ->GetActiveWebContents(); if (!contents) return RespondNow(Error("No active tab")); } @@ -336,17 +339,17 @@ AutomationInternalPerformActionFunction::ConvertToAXActionData( action->request_id = request_id ? *request_id : -1; switch (params->args.action_type) { case api::automation_internal::ACTION_TYPE_DODEFAULT: - action->action = ui::AX_ACTION_DO_DEFAULT; + action->action = ax::mojom::Action::kDoDefault; break; case api::automation_internal::ACTION_TYPE_FOCUS: - action->action = ui::AX_ACTION_FOCUS; + action->action = ax::mojom::Action::kFocus; break; case api::automation_internal::ACTION_TYPE_GETIMAGEDATA: { api::automation_internal::GetImageDataParams get_image_data_params; EXTENSION_FUNCTION_VALIDATE( api::automation_internal::GetImageDataParams::Populate( params->opt_args.additional_properties, &get_image_data_params)); - action->action = ui::AX_ACTION_GET_IMAGE_DATA; + action->action = ax::mojom::Action::kGetImageData; action->target_rect = gfx::Rect(0, 0, get_image_data_params.max_width, get_image_data_params.max_height); break; @@ -356,34 +359,34 @@ AutomationInternalPerformActionFunction::ConvertToAXActionData( EXTENSION_FUNCTION_VALIDATE( api::automation_internal::HitTestParams::Populate( params->opt_args.additional_properties, &hit_test_params)); - action->action = ui::AX_ACTION_HIT_TEST; + action->action = ax::mojom::Action::kHitTest; action->target_point = gfx::Point(hit_test_params.x, hit_test_params.y); action->hit_test_event_to_fire = - ui::ParseAXEvent(hit_test_params.event_to_fire); - if (action->hit_test_event_to_fire == ui::AX_EVENT_NONE) + ui::ParseEvent(hit_test_params.event_to_fire.c_str()); + if (action->hit_test_event_to_fire == ax::mojom::Event::kNone) return RespondNow(NoArguments()); break; } case api::automation_internal::ACTION_TYPE_MAKEVISIBLE: - action->action = ui::AX_ACTION_SCROLL_TO_MAKE_VISIBLE; + action->action = ax::mojom::Action::kScrollToMakeVisible; break; case api::automation_internal::ACTION_TYPE_SCROLLBACKWARD: - action->action = ui::AX_ACTION_SCROLL_BACKWARD; + action->action = ax::mojom::Action::kScrollBackward; break; case api::automation_internal::ACTION_TYPE_SCROLLFORWARD: - action->action = ui::AX_ACTION_SCROLL_FORWARD; + action->action = ax::mojom::Action::kScrollForward; break; case api::automation_internal::ACTION_TYPE_SCROLLUP: - action->action = ui::AX_ACTION_SCROLL_UP; + action->action = ax::mojom::Action::kScrollUp; break; case api::automation_internal::ACTION_TYPE_SCROLLDOWN: - action->action = ui::AX_ACTION_SCROLL_DOWN; + action->action = ax::mojom::Action::kScrollDown; break; case api::automation_internal::ACTION_TYPE_SCROLLLEFT: - action->action = ui::AX_ACTION_SCROLL_LEFT; + action->action = ax::mojom::Action::kScrollLeft; break; case api::automation_internal::ACTION_TYPE_SCROLLRIGHT: - action->action = ui::AX_ACTION_SCROLL_RIGHT; + action->action = ax::mojom::Action::kScrollRight; break; case api::automation_internal::ACTION_TYPE_SETSELECTION: { api::automation_internal::SetSelectionParams selection_params; @@ -394,17 +397,17 @@ AutomationInternalPerformActionFunction::ConvertToAXActionData( action->anchor_offset = selection_params.anchor_offset; action->focus_node_id = selection_params.focus_node_id; action->focus_offset = selection_params.focus_offset; - action->action = ui::AX_ACTION_SET_SELECTION; + action->action = ax::mojom::Action::kSetSelection; break; } case api::automation_internal::ACTION_TYPE_SHOWCONTEXTMENU: { - action->action = ui::AX_ACTION_SHOW_CONTEXT_MENU; + action->action = ax::mojom::Action::kShowContextMenu; break; } case api::automation_internal:: ACTION_TYPE_SETSEQUENTIALFOCUSNAVIGATIONSTARTINGPOINT: { action->action = - ui::AX_ACTION_SET_SEQUENTIAL_FOCUS_NAVIGATION_STARTING_POINT; + ax::mojom::Action::kSetSequentialFocusNavigationStartingPoint; break; } case api::automation_internal::ACTION_TYPE_CUSTOMACTION: { @@ -414,7 +417,7 @@ AutomationInternalPerformActionFunction::ConvertToAXActionData( api::automation_internal::PerformCustomActionParams::Populate( params->opt_args.additional_properties, &perform_custom_action_params)); - action->action = ui::AX_ACTION_CUSTOM_ACTION; + action->action = ax::mojom::Action::kCustomAction; action->custom_action_id = perform_custom_action_params.custom_action_id; break; } diff --git a/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.h b/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.h index ffce688fc36..2971910dca3 100644 --- a/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.h +++ b/chromium/chrome/browser/extensions/api/automation_internal/automation_internal_api.h @@ -7,9 +7,9 @@ #include <string> -#include "chrome/browser/extensions/chrome_extension_function.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" +#include "extensions/browser/extension_function.h" namespace extensions { @@ -29,8 +29,7 @@ struct AXActionData; namespace extensions { // Implementation of the chrome.automation API. -class AutomationInternalEnableTabFunction - : public ChromeUIThreadExtensionFunction { +class AutomationInternalEnableTabFunction : public UIThreadExtensionFunction { DECLARE_EXTENSION_FUNCTION("automationInternal.enableTab", AUTOMATIONINTERNAL_ENABLETAB) protected: diff --git a/chromium/chrome/browser/extensions/api/autotest_private/DEPS b/chromium/chrome/browser/extensions/api/autotest_private/DEPS new file mode 100644 index 00000000000..b21e182ab37 --- /dev/null +++ b/chromium/chrome/browser/extensions/api/autotest_private/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+ui/message_center", +] diff --git a/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc b/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc index 7a2179a278f..8bdc5a72567 100644 --- a/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc +++ b/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.cc @@ -37,7 +37,7 @@ #include "chromeos/printing/printer_configuration.h" #include "components/user_manager/user_manager.h" #include "ui/message_center/message_center.h" -#include "ui/message_center/notification.h" +#include "ui/message_center/public/cpp/notification.h" #endif namespace extensions { @@ -396,6 +396,10 @@ AutotestPrivateGetVisibleNotificationsFunction::Run() { DVLOG(1) << "AutotestPrivateGetVisibleNotificationsFunction"; std::unique_ptr<base::ListValue> values(new base::ListValue); #if defined(OS_CHROMEOS) + // TODO(estade): we can't rely on the message center being available in the + // browser process (in mash). Make autotests that use it fail loudly. See + // crbug.com/804570 + CHECK(message_center::MessageCenter::Get()); for (auto* notification : message_center::MessageCenter::Get()->GetVisibleNotifications()) { auto result = std::make_unique<base::DictionaryValue>(); diff --git a/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.h b/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.h index 7f55a387113..7eb44055070 100644 --- a/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.h +++ b/chromium/chrome/browser/extensions/api/autotest_private/autotest_private_api.h @@ -10,7 +10,7 @@ #include "base/compiler_specific.h" #include "chrome/browser/extensions/chrome_extension_function.h" #include "extensions/browser/browser_context_keyed_api_factory.h" -#include "ui/message_center/notification_types.h" +#include "ui/message_center/public/cpp/notification_types.h" #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/printing/cups_printers_manager.h" diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc index 8717bf94ac3..c4cdaf3aa3b 100644 --- a/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc +++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmark_apitest.cc @@ -21,13 +21,7 @@ using bookmarks::BookmarkModel; -// Flaky on Windows and Linux. http://crbug.com/383452 -#if defined(OS_WIN) || defined(OS_LINUX) -#define MAYBE_Bookmarks DISABLED_Bookmarks -#else -#define MAYBE_Bookmarks Bookmarks -#endif -IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_Bookmarks) { +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Bookmarks) { // Add test managed bookmarks to verify that the bookmarks API can read them // and can't modify them. Profile* profile = browser()->profile(); diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc index 397e6f924bf..1e93c03bfd7 100644 --- a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc +++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc @@ -555,7 +555,7 @@ bool BookmarksSearchFunction::RunOnReady() { return true; } -bool BookmarksRemoveFunction::RunOnReady() { +bool BookmarksRemoveFunctionBase::RunOnReady() { if (!EditBookmarksEnabled()) return false; @@ -567,15 +567,21 @@ bool BookmarksRemoveFunction::RunOnReady() { if (!GetBookmarkIdAsInt64(params->id, &id)) return false; - bool recursive = false; - if (name() == BookmarksRemoveTreeFunction::function_name()) - recursive = true; - BookmarkModel* model = GetBookmarkModel(); ManagedBookmarkService* managed = GetManagedBookmarkService(); - if (!bookmark_api_helpers::RemoveNode(model, managed, id, recursive, &error_)) + if (!bookmark_api_helpers::RemoveNode(model, managed, id, is_recursive(), + &error_)) { return false; + } + + return true; +} + +bool BookmarksRemoveFunction::is_recursive() const { + return false; +} +bool BookmarksRemoveTreeFunction::is_recursive() const { return true; } diff --git a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h index f67548f71c8..610c6410c80 100644 --- a/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h +++ b/chromium/chrome/browser/extensions/api/bookmarks/bookmarks_api.h @@ -244,23 +244,36 @@ class BookmarksSearchFunction : public BookmarksFunction { bool RunOnReady() override; }; -class BookmarksRemoveFunction : public BookmarksFunction { +class BookmarksRemoveFunctionBase : public BookmarksFunction { + protected: + ~BookmarksRemoveFunctionBase() override {} + + virtual bool is_recursive() const = 0; + + // BookmarksFunction: + bool RunOnReady() override; +}; + +class BookmarksRemoveFunction : public BookmarksRemoveFunctionBase { public: - DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE) + DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE); protected: ~BookmarksRemoveFunction() override {} - // BookmarksFunction: - bool RunOnReady() override; + // BookmarksRemoveFunctionBase: + bool is_recursive() const override; }; -class BookmarksRemoveTreeFunction : public BookmarksRemoveFunction { +class BookmarksRemoveTreeFunction : public BookmarksRemoveFunctionBase { public: DECLARE_EXTENSION_FUNCTION("bookmarks.removeTree", BOOKMARKS_REMOVETREE) protected: ~BookmarksRemoveTreeFunction() override {} + + // BookmarksRemoveFunctionBase: + bool is_recursive() const override; }; class BookmarksCreateFunction : public BookmarksFunction { diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc index c16ed76a1da..244be025170 100644 --- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc +++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc @@ -136,11 +136,8 @@ bool BrowsingDataSettingsFunction::isDataTypeSelected( ExtensionFunction::ResponseAction BrowsingDataSettingsFunction::Run() { prefs_ = Profile::FromBrowserContext(browser_context())->GetPrefs(); - ClearBrowsingDataTab tab = - base::FeatureList::IsEnabled(features::kTabsInCbd) - ? static_cast<ClearBrowsingDataTab>(prefs_->GetInteger( - browsing_data::prefs::kLastClearBrowsingDataTab)) - : ClearBrowsingDataTab::ADVANCED; + ClearBrowsingDataTab tab = static_cast<ClearBrowsingDataTab>( + prefs_->GetInteger(browsing_data::prefs::kLastClearBrowsingDataTab)); // Fill origin types. // The "cookies" and "hosted apps" UI checkboxes both map to diff --git a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc index d777b98d233..f0e724e64a3 100644 --- a/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc +++ b/chromium/chrome/browser/extensions/api/browsing_data/browsing_data_test.cc @@ -9,7 +9,6 @@ #include "base/memory/ref_counted.h" #include "base/strings/pattern.h" #include "base/strings/string_util.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/browsing_data/browsing_data_helper.h" #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h" @@ -17,7 +16,6 @@ #include "chrome/browser/extensions/extension_function_test_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "components/browsing_data/core/browsing_data_utils.h" @@ -62,7 +60,6 @@ class ExtensionBrowsingDataTest : public InProcessBrowserTest { protected: void SetUp() override { - feature_list_.InitAndEnableFeature(features::kTabsInCbd); InProcessBrowserTest::SetUp(); } @@ -297,7 +294,6 @@ class ExtensionBrowsingDataTest : public InProcessBrowserTest { } private: - base::test::ScopedFeatureList feature_list_; // Cached pointer to BrowsingDataRemover for access to testing methods. content::BrowsingDataRemover* remover_; }; diff --git a/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc b/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc index 8a53d8a19aa..3a6d2f4f736 100644 --- a/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc +++ b/chromium/chrome/browser/extensions/api/cast_streaming/performance_test.cc @@ -68,13 +68,9 @@ constexpr size_t kTrimEvents = 24; // 1 sec at 24fps, or 0.4 sec at 60 fps. constexpr size_t kMinDataPoints = 100; // 1 sec of audio, or ~5 sec at 24fps. enum TestFlags { - // TODO(miu): Remove kUseGpu (since the GPU is required), and maybe - // kDisableVsync. http://crbug.com/567848 kUseGpu = 1 << 0, // Only execute test if --enable-gpu was given // on the command line. This is required for // tests that run on GPU. - kDisableVsync = 1 << 1, // Do not limit framerate to vertical refresh. - // when on GPU, nor to 60hz when not on GPU. kSmallWindow = 1 << 2, // Window size: 1 = 800x600, 0 = 2000x1000 k24fps = 1 << 3, // Use 24 fps video. k30fps = 1 << 4, // Use 30 fps video. @@ -368,8 +364,6 @@ class CastV2PerformanceTest std::string suffix; if (HasFlag(kUseGpu)) suffix += "_gpu"; - if (HasFlag(kDisableVsync)) - suffix += "_novsync"; if (HasFlag(kSmallWindow)) suffix += "_small"; if (HasFlag(k24fps)) @@ -406,6 +400,8 @@ class CastV2PerformanceTest void SetUp() override { EnablePixelOutput(); + if (!HasFlag(kUseGpu)) + UseSoftwareCompositing(); ExtensionApiTest::SetUp(); } @@ -425,12 +421,10 @@ class CastV2PerformanceTest if (!HasFlag(kUseGpu)) command_line->AppendSwitch(switches::kDisableGpu); - if (HasFlag(kDisableVsync)) - command_line->AppendSwitch(switches::kDisableGpuVsync); - command_line->AppendSwitchASCII( extensions::switches::kWhitelistedExtensionID, kExtensionId); + ExtensionApiTest::SetUpCommandLine(command_line); } @@ -721,7 +715,6 @@ INSTANTIATE_TEST_CASE_P( testing::Values(kUseGpu | k24fps, kUseGpu | k30fps, kUseGpu | k60fps, - kUseGpu | k24fps | kDisableVsync, kUseGpu | k30fps | kProxyWifi, kUseGpu | k30fps | kProxyBad, kUseGpu | k30fps | kSlowClock, diff --git a/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc b/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc index 90c1889cb5e..17dbddd0d73 100644 --- a/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc +++ b/chromium/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.cc @@ -7,7 +7,6 @@ #include <memory> #include <string> -#include "base/threading/sequenced_worker_pool.h" #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h" #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h" #include "chrome/common/extensions/api/cloud_print_private.h" diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.cc b/chromium/chrome/browser/extensions/api/commands/command_service.cc index 3f3661f362e..362c8e4bf5a 100644 --- a/chromium/chrome/browser/extensions/api/commands/command_service.cc +++ b/chromium/chrome/browser/extensions/api/commands/command_service.cc @@ -133,8 +133,8 @@ void CommandService::RegisterProfilePrefs( CommandService::CommandService(content::BrowserContext* context) : profile_(Profile::FromBrowserContext(context)), extension_registry_observer_(this) { - ExtensionFunctionRegistry::GetInstance()-> - RegisterFunction<GetAllCommandsFunction>(); + ExtensionFunctionRegistry::GetInstance() + .RegisterFunction<GetAllCommandsFunction>(); extension_registry_observer_.Add(ExtensionRegistry::Get(profile_)); } @@ -177,16 +177,16 @@ bool CommandService::GetBrowserActionCommand(const std::string& extension_id, QueryType type, Command* command, bool* active) const { - return GetExtensionActionCommand( - extension_id, type, command, active, BROWSER_ACTION); + return GetExtensionActionCommand(extension_id, type, command, active, + Command::Type::kBrowserAction); } bool CommandService::GetPageActionCommand(const std::string& extension_id, QueryType type, Command* command, bool* active) const { - return GetExtensionActionCommand( - extension_id, type, command, active, PAGE_ACTION); + return GetExtensionActionCommand(extension_id, type, command, active, + Command::Type::kPageAction); } bool CommandService::GetNamedCommands(const std::string& extension_id, @@ -403,8 +403,7 @@ Command CommandService::FindCommandByName(const std::string& extension_id, bool CommandService::GetSuggestedExtensionCommand( const std::string& extension_id, const ui::Accelerator& accelerator, - Command* command, - ExtensionCommandType* command_type) const { + Command* command) const { const Extension* extension = ExtensionRegistry::Get(profile_) ->GetExtensionById(extension_id, ExtensionRegistry::ENABLED); @@ -419,8 +418,6 @@ bool CommandService::GetSuggestedExtensionCommand( accelerator == prospective_command.accelerator()) { if (command) *command = prospective_command; - if (command_type) - *command_type = BROWSER_ACTION; return true; } else if (GetPageActionCommand(extension_id, CommandService::SUGGESTED, @@ -429,8 +426,6 @@ bool CommandService::GetSuggestedExtensionCommand( accelerator == prospective_command.accelerator()) { if (command) *command = prospective_command; - if (command_type) - *command_type = PAGE_ACTION; return true; } else if (GetNamedCommands(extension_id, CommandService::SUGGESTED, @@ -442,8 +437,6 @@ bool CommandService::GetSuggestedExtensionCommand( if (accelerator == it->second.accelerator()) { if (command) *command = it->second; - if (command_type) - *command_type = NAMED; return true; } } @@ -454,11 +447,10 @@ bool CommandService::GetSuggestedExtensionCommand( bool CommandService::RequestsBookmarkShortcutOverride( const Extension* extension) const { return RemovesBookmarkShortcut(extension) && - GetSuggestedExtensionCommand( - extension->id(), - chrome::GetPrimaryChromeAcceleratorForCommandId(IDC_BOOKMARK_PAGE), - NULL, - NULL); + GetSuggestedExtensionCommand( + extension->id(), + chrome::GetPrimaryChromeAcceleratorForCommandId(IDC_BOOKMARK_PAGE), + nullptr); } void CommandService::AddObserver(Observer* observer) { @@ -858,7 +850,7 @@ bool CommandService::GetExtensionActionCommand( QueryType query_type, Command* command, bool* active, - ExtensionCommandType action_type) const { + Command::Type action_type) const { const ExtensionSet& extensions = ExtensionRegistry::Get(profile_)->enabled_extensions(); const Extension* extension = extensions.GetByID(extension_id); @@ -869,13 +861,13 @@ bool CommandService::GetExtensionActionCommand( const Command* requested_command = NULL; switch (action_type) { - case BROWSER_ACTION: + case Command::Type::kBrowserAction: requested_command = CommandsInfo::GetBrowserActionCommand(extension); break; - case PAGE_ACTION: + case Command::Type::kPageAction: requested_command = CommandsInfo::GetPageActionCommand(extension); break; - case NAMED: + case Command::Type::kNamed: NOTREACHED(); return false; } diff --git a/chromium/chrome/browser/extensions/api/commands/command_service.h b/chromium/chrome/browser/extensions/api/commands/command_service.h index ebff2853236..378922ae5fe 100644 --- a/chromium/chrome/browser/extensions/api/commands/command_service.h +++ b/chromium/chrome/browser/extensions/api/commands/command_service.h @@ -68,13 +68,6 @@ class CommandService : public BrowserContextKeyedAPI, ANY_SCOPE, // All commands, regardless of scope (used when querying). }; - // An enum specifying the types of commands that can be used by an extension. - enum ExtensionCommandType { - NAMED, - BROWSER_ACTION, - PAGE_ACTION - }; - class Observer { public: // Called when an extension command is added. @@ -186,8 +179,7 @@ class CommandService : public BrowserContextKeyedAPI, // assigns the type to *|command_type| if non-null. bool GetSuggestedExtensionCommand(const std::string& extension_id, const ui::Accelerator& accelerator, - Command* command, - ExtensionCommandType* command_type) const; + Command* command) const; // Returns true if |extension| requests to override the bookmark shortcut key // and should be allowed to do so. @@ -265,7 +257,7 @@ class CommandService : public BrowserContextKeyedAPI, QueryType query_type, Command* command, bool* active, - ExtensionCommandType action_type) const; + Command::Type type) const; // A weak pointer to the profile we are associated with. Not owned by us. Profile* profile_; diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc b/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc index f77080331df..13790f2f9eb 100644 --- a/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc +++ b/chromium/chrome/browser/extensions/api/cookies/cookies_api.cc @@ -33,7 +33,7 @@ #include "extensions/common/permissions/permissions_data.h" #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_constants.h" -#include "services/network/public/interfaces/network_service.mojom.h" +#include "services/network/public/mojom/network_service.mojom.h" using content::BrowserThread; @@ -87,7 +87,8 @@ network::mojom::CookieManager* ParseStoreCookieManager( // GetCurrentBrowser() already takes into account incognito settings. // TODO(rdevlin.cronin): Relying on the current execution context is // almost never the right answer; clean this up. - Browser* current_browser = function->GetCurrentBrowser(); + Browser* current_browser = + ChromeExtensionFunctionDetails(function).GetCurrentBrowser(); if (!current_browser) { function->SetError(keys::kNoCookieStoreFoundError); return nullptr; diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_api.h b/chromium/chrome/browser/extensions/api/cookies/cookies_api.h index b5a5ad044f1..991fb466e53 100644 --- a/chromium/chrome/browser/extensions/api/cookies/cookies_api.h +++ b/chromium/chrome/browser/extensions/api/cookies/cookies_api.h @@ -22,7 +22,7 @@ #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/event_router.h" #include "net/cookies/canonical_cookie.h" -#include "services/network/public/interfaces/cookie_manager.mojom.h" +#include "services/network/public/mojom/cookie_manager.mojom.h" #include "url/gurl.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.h b/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.h index ec287ffbce9..0b21eb056db 100644 --- a/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.h +++ b/chromium/chrome/browser/extensions/api/cookies/cookies_helpers.h @@ -18,7 +18,7 @@ #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_monster.h" #include "net/cookies/cookie_options.h" -#include "services/network/public/interfaces/cookie_manager.mojom.h" +#include "services/network/public/mojom/cookie_manager.mojom.h" class Browser; class Profile; diff --git a/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc b/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc index 6e99d232a39..6b95797c994 100644 --- a/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc +++ b/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc @@ -10,20 +10,18 @@ #include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" -#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/extensions/extension_tab_util.h" -#include "chrome/browser/permissions/permission_request.h" +#include "chrome/browser/permissions/attestation_permission_request.h" #include "chrome/browser/permissions/permission_request_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" -#include "chrome/grit/generated_resources.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "crypto/sha2.h" #include "extensions/common/error_utils.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" -#include "ui/base/l10n/l10n_util.h" +#include "url/origin.h" namespace { @@ -57,52 +55,6 @@ bool ContainsAppIdByHash(const base::ListValue& list, return false; } -// AttestationPermissionRequest is a delegate class that provides information -// and callbacks to the PermissionRequestManager. -// -// PermissionRequestManager has a reference to this object and so this object -// must outlive it. Since attestation requests are never canceled, -// PermissionRequestManager guarentees that |RequestFinished| will always, -// eventually, be called. This object uses that fact to delete itself during -// |RequestFinished| and thus owns itself. -class AttestationPermissionRequest : public PermissionRequest { - public: - AttestationPermissionRequest(const GURL& app_id, - base::OnceCallback<void(bool)> callback) - : app_id_(app_id), callback_(std::move(callback)) {} - - PermissionRequest::IconId GetIconId() const override { - return kUsbSecurityKeyIcon; - } - - base::string16 GetMessageTextFragment() const override { - return l10n_util::GetStringUTF16( - IDS_SECURITY_KEY_ATTESTATION_PERMISSION_FRAGMENT); - } - GURL GetOrigin() const override { return app_id_; } - void PermissionGranted() override { std::move(callback_).Run(true); } - void PermissionDenied() override { std::move(callback_).Run(false); } - void Cancelled() override { std::move(callback_).Run(false); } - - void RequestFinished() override { - if (callback_) - std::move(callback_).Run(false); - delete this; - } - - PermissionRequestType GetPermissionRequestType() const override { - return PermissionRequestType::PERMISSION_SECURITY_KEY_ATTESTATION; - } - - private: - ~AttestationPermissionRequest() override = default; - - const GURL app_id_; - base::OnceCallback<void(bool)> callback_; - - DISALLOW_COPY_AND_ASSIGN(AttestationPermissionRequest); -}; - } // namespace namespace extensions { @@ -241,8 +193,9 @@ CryptotokenPrivateCanAppIdGetAttestationFunction::Run() { } // The created AttestationPermissionRequest deletes itself once complete. - permission_request_manager->AddRequest(new AttestationPermissionRequest( - app_id_url, + const url::Origin origin(url::Origin::Create(app_id_url)); + permission_request_manager->AddRequest(NewAttestationPermissionRequest( + origin, base::BindOnce( &CryptotokenPrivateCanAppIdGetAttestationFunction::Complete, this))); return RespondLater(); diff --git a/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc index a88874bd102..3c912638980 100644 --- a/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc @@ -69,8 +69,7 @@ class CryptoTokenPrivateApiTest : public extensions::ExtensionApiUnittest { args->AppendString(app_id); if (!extension_function_test_utils::RunFunction( - function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)) { + function.get(), std::move(args), browser(), api_test_utils::NONE)) { return false; } @@ -89,7 +88,7 @@ class CryptoTokenPrivateApiTest : public extensions::ExtensionApiUnittest { if (!extension_function_test_utils::RunFunction( function.get(), base::ListValue::From(std::move(args)), browser(), - extension_function_test_utils::NONE)) { + api_test_utils::NONE)) { return false; } @@ -214,8 +213,7 @@ class CryptoTokenPermissionTest : public ExtensionApiUnittest { auto args_list = base::ListValue::From(std::move(args)); extension_function_test_utils::RunFunction( - function.get(), std::move(args_list), browser(), - extension_function_test_utils::NONE); + function.get(), std::move(args_list), browser(), api_test_utils::NONE); return GetSingleBooleanResult(function.get(), out_result); } diff --git a/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc b/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc index c7d8abdb460..c2bb77b851e 100644 --- a/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc +++ b/chromium/chrome/browser/extensions/api/dashboard_private/dashboard_private_api.cc @@ -78,7 +78,8 @@ DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::Run() { if (!icon_url.is_empty()) { loader_factory = content::BrowserContext::GetDefaultStoragePartition(browser_context()) - ->GetURLLoaderFactoryForBrowserProcess(); + ->GetURLLoaderFactoryForBrowserProcess() + .get(); } scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper( diff --git a/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc b/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc index 615ee3a7276..92fae3336a0 100644 --- a/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc +++ b/chromium/chrome/browser/extensions/api/debugger/debugger_apitest.cc @@ -126,20 +126,20 @@ testing::AssertionResult DebuggerApiTest::RunAttachFunctionOnTarget( attach_function->set_extension(extension_.get()); std::string actual_error; - if (!RunFunction(attach_function.get(), - base::StringPrintf("[%s, \"1.1\"]", debuggee_target.c_str()), - browser(), - extension_function_test_utils::NONE)) { + if (!extension_function_test_utils::RunFunction( + attach_function.get(), + base::StringPrintf("[%s, \"1.1\"]", debuggee_target.c_str()), + browser(), api_test_utils::NONE)) { actual_error = attach_function->GetError(); } else { // Clean up and detach. scoped_refptr<DebuggerDetachFunction> detach_function = new DebuggerDetachFunction(); detach_function->set_extension(extension_.get()); - if (!RunFunction(detach_function.get(), - base::StringPrintf("[%s]", debuggee_target.c_str()), - browser(), - extension_function_test_utils::NONE)) { + if (!extension_function_test_utils::RunFunction( + detach_function.get(), + base::StringPrintf("[%s]", debuggee_target.c_str()), browser(), + api_test_utils::NONE)) { return testing::AssertionFailure() << "Could not detach from " << debuggee_target << " : " << detach_function->GetError(); } @@ -212,10 +212,10 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { // Attach should create infobars in both browsers. attach_function = new DebuggerAttachFunction(); attach_function->set_extension(extension()); - ASSERT_TRUE( - RunFunction(attach_function.get(), - base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + attach_function.get(), + base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id), browser(), + api_test_utils::NONE)); EXPECT_EQ(1u, service1->infobar_count()); EXPECT_EQ(1u, service2->infobar_count()); EXPECT_EQ(1u, service3->infobar_count()); @@ -223,10 +223,10 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { // Second attach should not create infobars. attach_function = new DebuggerAttachFunction(); attach_function->set_extension(extension()); - ASSERT_TRUE( - RunFunction(attach_function.get(), - base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id2), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + attach_function.get(), + base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id2), browser(), + api_test_utils::NONE)); EXPECT_EQ(1u, service1->infobar_count()); EXPECT_EQ(1u, service2->infobar_count()); EXPECT_EQ(1u, service3->infobar_count()); @@ -234,9 +234,9 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { // Detach from one of the tabs should not remove infobars. detach_function = new DebuggerDetachFunction(); detach_function->set_extension(extension()); - ASSERT_TRUE(RunFunction(detach_function.get(), - base::StringPrintf("[{\"tabId\": %d}]", tab_id2), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id2), + browser(), api_test_utils::NONE)); EXPECT_EQ(1u, service1->infobar_count()); EXPECT_EQ(1u, service2->infobar_count()); EXPECT_EQ(1u, service3->infobar_count()); @@ -244,9 +244,9 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { // Detach should remove all infobars. detach_function = new DebuggerDetachFunction(); detach_function->set_extension(extension()); - ASSERT_TRUE(RunFunction(detach_function.get(), - base::StringPrintf("[{\"tabId\": %d}]", tab_id), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id), + browser(), api_test_utils::NONE)); EXPECT_EQ(0u, service1->infobar_count()); EXPECT_EQ(0u, service2->infobar_count()); EXPECT_EQ(0u, service3->infobar_count()); @@ -254,10 +254,10 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { // Attach again. attach_function = new DebuggerAttachFunction(); attach_function->set_extension(extension()); - ASSERT_TRUE( - RunFunction(attach_function.get(), - base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + attach_function.get(), + base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id), browser(), + api_test_utils::NONE)); EXPECT_EQ(1u, service1->infobar_count()); EXPECT_EQ(1u, service2->infobar_count()); EXPECT_EQ(1u, service3->infobar_count()); @@ -275,17 +275,17 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { detach_function = new DebuggerDetachFunction(); detach_function->set_extension(extension()); // Cannot detach again. - ASSERT_FALSE(RunFunction(detach_function.get(), - base::StringPrintf("[{\"tabId\": %d}]", tab_id), - browser(), extension_function_test_utils::NONE)); + ASSERT_FALSE(extension_function_test_utils::RunFunction( + detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id), + browser(), api_test_utils::NONE)); // And again... attach_function = new DebuggerAttachFunction(); attach_function->set_extension(extension()); - ASSERT_TRUE( - RunFunction(attach_function.get(), - base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + attach_function.get(), + base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id), browser(), + api_test_utils::NONE)); EXPECT_EQ(1u, service1->infobar_count()); EXPECT_EQ(1u, service2->infobar_count()); EXPECT_EQ(1u, service3->infobar_count()); @@ -305,9 +305,9 @@ IN_PROC_BROWSER_TEST_F(DebuggerApiTest, InfoBar) { // Detach should remove the remaining infobar. detach_function = new DebuggerDetachFunction(); detach_function->set_extension(extension()); - ASSERT_TRUE(RunFunction(detach_function.get(), - base::StringPrintf("[{\"tabId\": %d}]", tab_id), - browser(), extension_function_test_utils::NONE)); + ASSERT_TRUE(extension_function_test_utils::RunFunction( + detach_function.get(), base::StringPrintf("[{\"tabId\": %d}]", tab_id), + browser(), api_test_utils::NONE)); EXPECT_EQ(0u, service1->infobar_count()); } diff --git a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc index 6b187e3a93c..41b8582f234 100644 --- a/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc +++ b/chromium/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc @@ -26,7 +26,6 @@ class ExtensionDevToolsInfoBarDelegate : public ConfirmInfoBarDelegate { ~ExtensionDevToolsInfoBarDelegate() override; // ConfirmInfoBarDelegate: - Type GetInfoBarType() const override; infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; bool ShouldExpire(const NavigationDetails& details) const override; void InfoBarDismissed() override; @@ -50,11 +49,6 @@ ExtensionDevToolsInfoBarDelegate::ExtensionDevToolsInfoBarDelegate( ExtensionDevToolsInfoBarDelegate::~ExtensionDevToolsInfoBarDelegate() {} -infobars::InfoBarDelegate::Type -ExtensionDevToolsInfoBarDelegate::GetInfoBarType() const { - return WARNING_TYPE; -} - infobars::InfoBarDelegate::InfoBarIdentifier ExtensionDevToolsInfoBarDelegate::GetIdentifier() const { return EXTENSION_DEV_TOOLS_INFOBAR_DELEGATE; diff --git a/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc b/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc index 21fe2a8754a..24f23e44620 100644 --- a/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc +++ b/chromium/chrome/browser/extensions/api/declarative/declarative_apitest.cc @@ -13,7 +13,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/thread_test_helper.h" #include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/ui_test_utils.h" @@ -24,6 +23,7 @@ #include "extensions/browser/extension_prefs.h" #include "extensions/common/extension.h" #include "extensions/test/extension_test_message_listener.h" +#include "extensions/test/test_extension_dir.h" using content::BrowserThread; diff --git a/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc b/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc index d9059dbe147..53906599f6b 100644 --- a/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc +++ b/chromium/chrome/browser/extensions/api/declarative/rules_registry_with_cache_unittest.cc @@ -44,7 +44,8 @@ const int kRulesRegistryID = RulesRegistryService::kDefaultRulesRegistryID; class RulesRegistryWithCacheTest : public testing::Test { public: RulesRegistryWithCacheTest() - : cache_delegate_(/*log_storage_init_delay=*/false), + : cache_delegate_(RulesCacheDelegate::Type::kPersistent, + /*log_storage_init_delay=*/false), registry_(new TestRulesRegistry(profile(), /*event_name=*/"", content::BrowserThread::UI, @@ -233,8 +234,8 @@ TEST_F(RulesRegistryWithCacheTest, DeclarativeRulesStored) { const std::string rules_stored_key( RulesCacheDelegate::GetRulesStoredKey( event_name, profile()->IsOffTheRecord())); - std::unique_ptr<RulesCacheDelegate> cache_delegate( - new RulesCacheDelegate(false)); + auto cache_delegate = std::make_unique<RulesCacheDelegate>( + RulesCacheDelegate::Type::kPersistent, false); scoped_refptr<RulesRegistry> registry( new TestRulesRegistry(profile(), event_name, content::BrowserThread::UI, cache_delegate.get(), kRulesRegistryID)); @@ -252,9 +253,11 @@ TEST_F(RulesRegistryWithCacheTest, DeclarativeRulesStored) { EXPECT_TRUE(cache_delegate->GetDeclarativeRulesStored(extension1_->id())); // 2. Test writing behavior. - std::unique_ptr<base::ListValue> value(new base::ListValue); - value->AppendBoolean(true); - cache_delegate->WriteToStorage(extension1_->id(), std::move(value)); + { + base::Value value(base::Value::Type::LIST); + value.GetList().push_back(base::Value(true)); + cache_delegate->UpdateRules(extension1_->id(), std::move(value)); + } EXPECT_TRUE(cache_delegate->GetDeclarativeRulesStored(extension1_->id())); content::RunAllTasksUntilIdle(); TestingValueStore* store = env_.GetExtensionSystem()->value_store(); @@ -262,17 +265,21 @@ TEST_F(RulesRegistryWithCacheTest, DeclarativeRulesStored) { EXPECT_EQ(1, store->write_count()); int write_count = store->write_count(); - value.reset(new base::ListValue); - cache_delegate->WriteToStorage(extension1_->id(), std::move(value)); - EXPECT_FALSE(cache_delegate->GetDeclarativeRulesStored(extension1_->id())); + { + base::Value value = base::Value(base::Value::Type::LIST); + cache_delegate->UpdateRules(extension1_->id(), std::move(value)); + EXPECT_FALSE(cache_delegate->GetDeclarativeRulesStored(extension1_->id())); + } content::RunAllTasksUntilIdle(); // No rules currently, but previously there were, so we expect a write. EXPECT_EQ(write_count + 1, store->write_count()); write_count = store->write_count(); - value.reset(new base::ListValue); - cache_delegate->WriteToStorage(extension1_->id(), std::move(value)); - EXPECT_FALSE(cache_delegate->GetDeclarativeRulesStored(extension1_->id())); + { + base::Value value = base::Value(base::Value::Type::LIST); + cache_delegate->UpdateRules(extension1_->id(), std::move(value)); + EXPECT_FALSE(cache_delegate->GetDeclarativeRulesStored(extension1_->id())); + } content::RunAllTasksUntilIdle(); EXPECT_EQ(write_count, store->write_count()); @@ -291,6 +298,18 @@ TEST_F(RulesRegistryWithCacheTest, DeclarativeRulesStored) { EXPECT_EQ(read_count + 1, store->read_count()); } +TEST_F(RulesRegistryWithCacheTest, EphemeralCacheIsEphemeral) { + auto cache_delegate = std::make_unique<RulesCacheDelegate>( + RulesCacheDelegate::Type::kEphemeral, false); + base::Value value(base::Value::Type::LIST); + value.GetList().push_back(base::Value(true)); + cache_delegate->UpdateRules(extension1_->id(), std::move(value)); + content::RunAllTasksUntilIdle(); + TestingValueStore* store = env_.GetExtensionSystem()->value_store(); + ASSERT_TRUE(store); + EXPECT_EQ(0, store->write_count()); +} + // Test that each registry has its own "are some rules stored" flag. TEST_F(RulesRegistryWithCacheTest, RulesStoredFlagMultipleRegistries) { ExtensionPrefs* extension_prefs = env_.GetExtensionPrefs(); @@ -303,14 +322,14 @@ TEST_F(RulesRegistryWithCacheTest, RulesStoredFlagMultipleRegistries) { const std::string rules_stored_key2( RulesCacheDelegate::GetRulesStoredKey( event_name2, profile()->IsOffTheRecord())); - std::unique_ptr<RulesCacheDelegate> cache_delegate1( - new RulesCacheDelegate(false)); + auto cache_delegate1 = std::make_unique<RulesCacheDelegate>( + RulesCacheDelegate::Type::kPersistent, false); scoped_refptr<RulesRegistry> registry1( new TestRulesRegistry(profile(), event_name1, content::BrowserThread::UI, cache_delegate1.get(), kRulesRegistryID)); - std::unique_ptr<RulesCacheDelegate> cache_delegate2( - new RulesCacheDelegate(false)); + auto cache_delegate2 = std::make_unique<RulesCacheDelegate>( + RulesCacheDelegate::Type::kPersistent, false); scoped_refptr<RulesRegistry> registry2( new TestRulesRegistry(profile(), event_name2, content::BrowserThread::UI, cache_delegate2.get(), kRulesRegistryID)); @@ -351,8 +370,8 @@ TEST_F(RulesRegistryWithCacheTest, RulesPreservedAcrossRestart) { env_.GetExtensionSystem()->SetReady(); // 2. First run, adding a rule for the extension. - std::unique_ptr<RulesCacheDelegate> cache_delegate( - new RulesCacheDelegate(false)); + auto cache_delegate = std::make_unique<RulesCacheDelegate>( + RulesCacheDelegate::Type::kPersistent, false); scoped_refptr<TestRulesRegistry> registry( new TestRulesRegistry(profile(), "testEvent", content::BrowserThread::UI, cache_delegate.get(), kRulesRegistryID)); @@ -364,7 +383,8 @@ TEST_F(RulesRegistryWithCacheTest, RulesPreservedAcrossRestart) { EXPECT_EQ(1, GetNumberOfRules(extension1_->id(), registry.get())); // 3. Restart the TestRulesRegistry and see the rule still there. - cache_delegate.reset(new RulesCacheDelegate(false)); + cache_delegate = std::make_unique<RulesCacheDelegate>( + RulesCacheDelegate::Type::kPersistent, false); registry = new TestRulesRegistry(profile(), "testEvent", content::BrowserThread::UI, cache_delegate.get(), kRulesRegistryID); diff --git a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc index 88a0d6da572..4f2b43e14fd 100644 --- a/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_content/declarative_content_apitest.cc @@ -16,7 +16,6 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_tab_util.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -26,6 +25,7 @@ #include "extensions/browser/extension_system.h" #include "extensions/browser/test_extension_registry_observer.h" #include "extensions/test/extension_test_message_listener.h" +#include "extensions/test/test_extension_dir.h" #include "testing/gmock/include/gmock/gmock.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc index ffa680bbcd2..42c42b760ce 100644 --- a/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_content/request_content_script_apitest.cc @@ -6,12 +6,12 @@ #include "base/macros.h" #include "base/strings/stringprintf.h" #include "chrome/browser/extensions/extension_browsertest.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test_utils.h" #include "extensions/test/extension_test_message_listener.h" +#include "extensions/test/test_extension_dir.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc b/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc index 5a91c7c006c..72a79c3313d 100644 --- a/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_content/set_icon_apitest.cc @@ -5,11 +5,11 @@ #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_tab_util.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "components/version_info/version_info.h" #include "extensions/common/features/feature_channel.h" #include "extensions/test/extension_test_message_listener.h" +#include "extensions/test/test_extension_dir.h" #include "ui/gfx/image/image.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index 3ae612a992c..7efb7086919 100644 --- a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc @@ -41,10 +41,13 @@ #include "extensions/browser/extension_util.h" #include "extensions/common/api/declarative_net_request/constants.h" #include "extensions/common/api/declarative_net_request/test_utils.h" +#include "extensions/common/constants.h" #include "extensions/common/extension_id.h" +#include "extensions/common/url_pattern.h" #include "net/dns/mock_host_resolver.h" #include "net/test/spawned_test_server/spawned_test_server.h" #include "net/test/test_data_directory.h" +#include "services/network/public/cpp/features.h" namespace extensions { namespace declarative_net_request { @@ -154,8 +157,11 @@ class DeclarativeNetRequestBrowserTest // Loads an extension with the given declarative |rules| in the given // |directory|. Generates a fatal failure if the extension failed to load. + // |hosts| specifies the host permissions, the extensions should + // have. void LoadExtensionWithRules(const std::vector<TestRule>& rules, - const std::string& directory) { + const std::string& directory, + const std::vector<std::string>& hosts) { base::ScopedAllowBlockingForTesting scoped_allow_blocking; base::HistogramTester tester; @@ -163,12 +169,13 @@ class DeclarativeNetRequestBrowserTest EXPECT_TRUE(base::CreateDirectory(extension_dir)); WriteManifestAndRuleset(extension_dir, kJSONRulesetFilepath, - kJSONRulesFilename, rules); + kJSONRulesFilename, rules, hosts); const Extension* extension = nullptr; switch (GetParam()) { case ExtensionLoadType::PACKED: - extension = InstallExtension(extension_dir, 1 /* expected_change */); + extension = InstallExtensionWithPermissionsGranted( + extension_dir, 1 /* expected_change */); break; case ExtensionLoadType::UNPACKED: extension = LoadExtension(extension_dir); @@ -196,7 +203,8 @@ class DeclarativeNetRequestBrowserTest } void LoadExtensionWithRules(const std::vector<TestRule>& rules) { - LoadExtensionWithRules(rules, "test_extension"); + LoadExtensionWithRules(rules, "test_extension", + {URLPattern::kAllUrlsPattern}); } private: @@ -635,8 +643,10 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, rules_2.push_back(rule); } - ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(rules_1, "extension_1")); - ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(rules_2, "extension_2")); + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules( + rules_1, "extension_1", {URLPattern::kAllUrlsPattern})); + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules( + rules_2, "extension_2", {URLPattern::kAllUrlsPattern})); struct { std::string host; @@ -688,7 +698,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, // url. for (size_t i = 1; i <= kNumExtensions; ++i) { rule.action->redirect_url = redirect_url_for_extension_number(i); - ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule}, std::to_string(i))); + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules( + {rule}, std::to_string(i), {URLPattern::kAllUrlsPattern})); // Verify that the install time of this extension is greater than the last // extension. @@ -906,7 +917,8 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, } } -// Ensure extensions can't intercept chrome:// urls. +// Ensure extensions can't intercept chrome:// urls, even after explicitly +// requesting access to <all_urls>. IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, ChromeURLS) { // Have the extension block all chrome:// urls. TestRule rule = CreateGenericRule(); @@ -976,7 +988,12 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) { ui_test_utils::NavigateToURL(browser(), url); EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType()); EXPECT_TRUE(WasFrameWithScriptLoaded(GetMainFrame())); - EXPECT_TRUE(script_monitor.GetAndResetRequestSeen(false)); + + // NOTE: When the Network Service is enabled, the RulesetMatcher will not see + // network requests if no rulesets are active. + EXPECT_TRUE( + base::FeatureList::IsEnabled(network::features::kNetworkService) || + script_monitor.GetAndResetRequestSeen(false)); // Another request to |url| should not cause a network request for // script.js since it will be served by the renderer's in-memory @@ -1010,7 +1027,9 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, RendererCacheCleared) { ui_test_utils::NavigateToURL(browser(), url); EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType()); EXPECT_TRUE(WasFrameWithScriptLoaded(GetMainFrame())); - EXPECT_TRUE(script_monitor.GetAndResetRequestSeen(false)); + EXPECT_TRUE( + base::FeatureList::IsEnabled(network::features::kNetworkService) || + script_monitor.GetAndResetRequestSeen(false)); // Clear RulesetManager's observer. content::BrowserThread::PostTask( @@ -1049,6 +1068,164 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType()); } +// Ensure that an extension can intercept its own resources, but not those of +// other extensions. +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, + InterceptExtensionScheme) { + // Load two extensions. One blocks all urls, and the other blocks urls with + // "google.com" as a substring. + std::vector<TestRule> rules_1; + TestRule rule = CreateGenericRule(); + rule.condition->url_filter = std::string("*"); + rules_1.push_back(rule); + + std::vector<TestRule> rules_2; + rule = CreateGenericRule(); + rule.condition->url_filter = std::string("google.com"); + rules_2.push_back(rule); + + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules( + rules_1, "extension_1", {URLPattern::kAllUrlsPattern})); + const std::string extension_id_1 = last_loaded_extension_id(); + + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules( + rules_2, "extension_2", {URLPattern::kAllUrlsPattern})); + const std::string extension_id_2 = last_loaded_extension_id(); + + auto get_manifest_url = [](const std::string& extension_id) { + return GURL(base::StringPrintf("%s://%s/manifest.json", + extensions::kExtensionScheme, + extension_id.c_str())); + }; + + // Extension 1 should be able to block the request to its own + // manifest.json. + ui_test_utils::NavigateToURL(browser(), get_manifest_url(extension_id_1)); + GURL final_url = web_contents()->GetLastCommittedURL(); + EXPECT_EQ(content::PAGE_TYPE_ERROR, GetPageType()); + + // But it should not be able to intercept requests to the second extensions's + // resources, even with "<all_urls>" host permissions. + ui_test_utils::NavigateToURL(browser(), get_manifest_url(extension_id_2)); + EXPECT_EQ(content::PAGE_TYPE_NORMAL, GetPageType()); +} + +// Test fixture to verify that host permissions for the request url and the +// request initiator are properly checked. Loads an example.com url with four +// sub-frames named frame_[1..4] from hosts frame_[1..4].com. The initiator for +// these frames will be example.com. Loads an extension set to block all sub- +// frames. Verifies that the correct frames are blocked depending on the host +// permissions for the extension. +class DeclarativeNetRequestHostPermissionsBrowserTest + : public DeclarativeNetRequestBrowserTest { + public: + DeclarativeNetRequestHostPermissionsBrowserTest() {} + + protected: + struct FrameLoadResult { + std::string child_frame_name; + bool expect_frame_loaded; + }; + + void LoadExtensionWithHostPermissions(const std::vector<std::string>& hosts) { + std::vector<TestRule> rules; + + // Block all sub-frame requests. + TestRule rule = CreateGenericRule(); + rule.condition->url_filter = std::string("*"); + rule.condition->resource_types = std::vector<std::string>({"sub_frame"}); + rules.push_back(rule); + + ASSERT_NO_FATAL_FAILURE( + LoadExtensionWithRules(rules, "test_extension", hosts)); + } + + void RunTests(const std::vector<FrameLoadResult>& expected_results) { + ASSERT_EQ(4u, expected_results.size()); + + GURL url = embedded_test_server()->GetURL("example.com", + "/page_with_four_frames.html"); + ui_test_utils::NavigateToURL(browser(), url); + ASSERT_TRUE(WasFrameWithScriptLoaded(GetMainFrame())); + + for (const auto& frame_result : expected_results) { + SCOPED_TRACE(base::StringPrintf("Testing child frame named %s", + frame_result.child_frame_name.c_str())); + + content::RenderFrameHost* child = + GetFrameByName(frame_result.child_frame_name); + EXPECT_TRUE(child); + EXPECT_EQ(frame_result.expect_frame_loaded, + WasFrameWithScriptLoaded(child)); + } + } + + std::string GetMatchPatternForDomain(const std::string& domain) const { + return "*://*." + domain + ".com/*"; + } + + private: + DISALLOW_COPY_AND_ASSIGN(DeclarativeNetRequestHostPermissionsBrowserTest); +}; + +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestHostPermissionsBrowserTest, + AllURLs1) { + // All frames should be blocked since the extension has access to all hosts. + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithHostPermissions({"<all_urls>"})); + RunTests({{"frame_1", false}, + {"frame_2", false}, + {"frame_3", false}, + {"frame_4", false}}); +} + +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestHostPermissionsBrowserTest, + AllURLs2) { + // All frames should be blocked since the extension has access to all hosts. + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithHostPermissions({"*://*/*"})); + RunTests({{"frame_1", false}, + {"frame_2", false}, + {"frame_3", false}, + {"frame_4", false}}); +} + +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestHostPermissionsBrowserTest, + NoPermissions) { + // The extension has no host permissions. No frames should be blocked. + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithHostPermissions({})); + RunTests({{"frame_1", true}, + {"frame_2", true}, + {"frame_3", true}, + {"frame_4", true}}); +} + +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestHostPermissionsBrowserTest, + SubframesWithNoInitiatorPermissions) { + // The extension has access to requests to "frame_1.com" and "frame_2.com", + // but not the initiator of those requests (example.com). No frames should be + // blocked. + ASSERT_NO_FATAL_FAILURE( + LoadExtensionWithHostPermissions({GetMatchPatternForDomain("frame_1"), + GetMatchPatternForDomain("frame_2")})); + RunTests({{"frame_1", true}, + {"frame_2", true}, + {"frame_3", true}, + {"frame_4", true}}); +} + +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestHostPermissionsBrowserTest, + SubframesWithInitiatorPermission) { + // The extension has access to requests to "frame_1.com" and "frame_4.com", + // and also the initiator of those requests (example.com). Hence |frame_1| and + // |frame_4| should be blocked. + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithHostPermissions( + {GetMatchPatternForDomain("frame_1"), GetMatchPatternForDomain("frame_4"), + GetMatchPatternForDomain("example")})); + RunTests({{"frame_1", false}, + {"frame_2", true}, + {"frame_3", true}, + {"frame_4", false}}); +} + // Fixture to test the "resourceTypes" and "excludedResourceTypes" fields of a // declarative rule condition. class DeclarativeNetRequestResourceTypeBrowserTest @@ -1220,6 +1397,10 @@ INSTANTIATE_TEST_CASE_P(, ExtensionLoadType::UNPACKED)); INSTANTIATE_TEST_CASE_P(, + DeclarativeNetRequestHostPermissionsBrowserTest, + ::testing::Values(ExtensionLoadType::PACKED, + ExtensionLoadType::UNPACKED)); +INSTANTIATE_TEST_CASE_P(, DeclarativeNetRequestResourceTypeBrowserTest, ::testing::Values(ExtensionLoadType::PACKED, ExtensionLoadType::UNPACKED)); diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc index e8b3fffeca9..0e5c1f20ae2 100644 --- a/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_net_request/rule_indexing_unittest.cc @@ -24,6 +24,7 @@ #include "extensions/common/file_util.h" #include "extensions/common/install_warning.h" #include "extensions/common/manifest_constants.h" +#include "extensions/common/url_pattern.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { @@ -129,10 +130,12 @@ class RuleIndexingTest : public DNRTestBase { if (rules_value_) { WriteManifestAndRuleset(extension_dir_, kJSONRulesetFilepath, - kJSONRulesFilename, *rules_value_); + kJSONRulesFilename, *rules_value_, + {URLPattern::kAllUrlsPattern}); } else { WriteManifestAndRuleset(extension_dir_, kJSONRulesetFilepath, - kJSONRulesFilename, rules_list_); + kJSONRulesFilename, rules_list_, + {URLPattern::kAllUrlsPattern}); } // Overwrite the JSON rules file with some invalid json. diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc index eec02539495..932c7add27b 100644 --- a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc @@ -6,6 +6,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/optional.h" #include "chrome/browser/extensions/api/declarative_net_request/dnr_test_base.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h" #include "chrome/browser/extensions/extension_util.h" @@ -19,10 +20,12 @@ #include "extensions/common/api/declarative_net_request/constants.h" #include "extensions/common/api/declarative_net_request/test_utils.h" #include "extensions/common/file_util.h" +#include "extensions/common/url_pattern.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +#include "url/origin.h" namespace extensions { namespace declarative_net_request { @@ -40,14 +43,16 @@ class RulesetManagerTest : public DNRTestBase { // Helper to create a ruleset matcher instance for the given |rules|. void CreateMatcherForRules(const std::vector<TestRule>& rules, const std::string& extension_dirname, - std::unique_ptr<RulesetMatcher>* matcher) { + std::unique_ptr<RulesetMatcher>* matcher, + const std::vector<std::string>& host_permissions = + {URLPattern::kAllUrlsPattern}) { base::FilePath extension_dir = temp_dir().GetPath().AppendASCII(extension_dirname); // Create extension directory. ASSERT_TRUE(base::CreateDirectory(extension_dir)); WriteManifestAndRuleset(extension_dir, kJSONRulesetFilepath, - kJSONRulesFilename, rules); + kJSONRulesFilename, rules, host_permissions); last_loaded_extension_ = CreateExtensionLoader()->LoadExtension(extension_dir); @@ -229,23 +234,46 @@ TEST_P(RulesetManagerTest, Redirect) { rule.action->redirect_url = std::string("http://google.com"); std::unique_ptr<RulesetMatcher> matcher; ASSERT_NO_FATAL_FAILURE( - CreateMatcherForRules({rule}, "test_extension", &matcher)); + CreateMatcherForRules({rule}, "test_extension", &matcher, + {"*://example.com/*", "*://abc.com/*"})); manager->AddRuleset(last_loaded_extension()->id(), std::move(matcher)); + // Create a request to "example.com" with an empty initiator. It should be + // redirected to "google.com". const bool is_incognito_context = false; - GURL redirect_url; + GURL redirect_url1; std::unique_ptr<net::URLRequest> request = GetRequestForURL("http://example.com"); + request->set_initiator(base::nullopt); extensions::WebRequestInfo request_info1(request.get()); EXPECT_TRUE(manager->ShouldRedirectRequest( - request_info1, is_incognito_context, &redirect_url)); - EXPECT_EQ(GURL("http://google.com"), redirect_url); + request_info1, is_incognito_context, &redirect_url1)); + EXPECT_EQ(GURL("http://google.com"), redirect_url1); + + // Change the initiator to "xyz.com". It should not be redirected since we + // don't have host permissions to the request initiator. + GURL redirect_url2; + request->set_initiator(url::Origin::Create(GURL("http://xyz.com"))); + extensions::WebRequestInfo request_info2(request.get()); + EXPECT_FALSE(manager->ShouldRedirectRequest( + request_info2, is_incognito_context, &redirect_url2)); + + // Change the initiator to "abc.com". It should be redirected since we have + // the required host permissions. + GURL redirect_url3; + request->set_initiator(url::Origin::Create(GURL("http://abc.com"))); + extensions::WebRequestInfo request_info3(request.get()); + EXPECT_TRUE(manager->ShouldRedirectRequest( + request_info3, is_incognito_context, &redirect_url3)); + EXPECT_EQ(GURL("http://google.com"), redirect_url3); // Ensure web-socket requests are not redirected. + GURL redirect_url4; request = GetRequestForURL("ws://example.com"); - extensions::WebRequestInfo request_info2(request.get()); + request->set_initiator(base::nullopt); + extensions::WebRequestInfo request_info4(request.get()); EXPECT_FALSE(manager->ShouldRedirectRequest( - request_info2, is_incognito_context, &redirect_url)); + request_info4, is_incognito_context, &redirect_url4)); } INSTANTIATE_TEST_CASE_P(, diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_matcher_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_matcher_unittest.cc index 700f504554a..90209860ec6 100644 --- a/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_matcher_unittest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_net_request/ruleset_matcher_unittest.cc @@ -18,6 +18,7 @@ #include "extensions/common/api/declarative_net_request/constants.h" #include "extensions/common/api/declarative_net_request/test_utils.h" #include "extensions/common/file_util.h" +#include "extensions/common/url_pattern.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" #include "url/origin.h" @@ -44,7 +45,8 @@ class RulesetMatcherTest : public DNRTestBase { // Create extension directory. ASSERT_TRUE(base::CreateDirectory(extension_dir)); WriteManifestAndRuleset(extension_dir, kJSONRulesetFilepath, - kJSONRulesFilename, rules); + kJSONRulesFilename, rules, + {URLPattern::kAllUrlsPattern}); extension_ = CreateExtensionLoader()->LoadExtension(extension_dir); ASSERT_TRUE(extension_); diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc index 8bfaa066863..c6c75b48921 100644 --- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc +++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_apitest.cc @@ -44,6 +44,8 @@ struct TestFlags { bool picker_deleted; }; +// TODO(crbug.com/805145): Uncomment this when test is re-enabled. +#if 0 DesktopMediaID MakeFakeWebContentsMediaId(bool audio_share) { DesktopMediaID media_id(DesktopMediaID::TYPE_WEB_CONTENTS, DesktopMediaID::kNullId, @@ -52,6 +54,7 @@ DesktopMediaID MakeFakeWebContentsMediaId(bool audio_share) { media_id.audio_share = audio_share; return media_id; } +#endif class FakeDesktopMediaPicker : public DesktopMediaPicker { public: @@ -63,13 +66,8 @@ class FakeDesktopMediaPicker : public DesktopMediaPicker { ~FakeDesktopMediaPicker() override { expectation_->picker_deleted = true; } // DesktopMediaPicker interface. - void Show(content::WebContents* web_contents, - gfx::NativeWindow context, - gfx::NativeWindow parent, - const base::string16& app_name, - const base::string16& target_name, + void Show(const DesktopMediaPicker::Params& params, std::vector<std::unique_ptr<DesktopMediaList>> source_lists, - bool request_audio, const DoneCallback& done_callback) override { bool show_screens = false; bool show_windows = false; @@ -93,7 +91,8 @@ class FakeDesktopMediaPicker : public DesktopMediaPicker { EXPECT_EQ(expectation_->expect_screens, show_screens); EXPECT_EQ(expectation_->expect_windows, show_windows); EXPECT_EQ(expectation_->expect_tabs, show_tabs); - EXPECT_EQ(expectation_->expect_audio, request_audio); + EXPECT_EQ(expectation_->expect_audio, params.request_audio); + EXPECT_EQ(params.modality, ui::ModalType::MODAL_TYPE_CHILD); if (!expectation_->cancelled) { // Post a task to call the callback asynchronously. @@ -187,7 +186,8 @@ class DesktopCaptureApiTest : public ExtensionApiTest { // Flaky on Windows: http://crbug.com/301887 // Fails on Chrome OS: http://crbug.com/718512 -#if defined(OS_WIN) || defined(OS_CHROMEOS) +// Flaky on macOS: http://crbug.com/804897 +#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_MACOSX) #define MAYBE_ChooseDesktopMedia DISABLED_ChooseDesktopMedia #else #define MAYBE_ChooseDesktopMedia ChooseDesktopMedia @@ -196,52 +196,55 @@ IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, MAYBE_ChooseDesktopMedia) { // Each element in the following array corresponds to one test in // chrome/test/data/extensions/api_test/desktop_capture/test.js . TestFlags test_flags[] = { - // pickerUiCanceled() - {true, true, false, false, DesktopMediaID()}, - // chooseMedia() - {true, true, false, false, - DesktopMediaID(DesktopMediaID::TYPE_SCREEN, DesktopMediaID::kNullId)}, - // screensOnly() - {true, false, false, false, DesktopMediaID()}, - // WindowsOnly() - {false, true, false, false, DesktopMediaID()}, - // tabOnly() - {false, false, true, false, DesktopMediaID()}, - // audioShareNoApproval() - {true, true, true, true, - DesktopMediaID(DesktopMediaID::TYPE_WEB_CONTENTS, 123, false)}, - // audioShareApproval() - {true, true, true, true, - DesktopMediaID(DesktopMediaID::TYPE_WEB_CONTENTS, 123, true)}, - // chooseMediaAndGetStream() - {true, true, false, false, - DesktopMediaID(DesktopMediaID::TYPE_SCREEN, - webrtc::kFullDesktopScreenId)}, - // chooseMediaAndTryGetStreamWithInvalidId() - {true, true, false, false, - DesktopMediaID(DesktopMediaID::TYPE_SCREEN, - webrtc::kFullDesktopScreenId)}, - // cancelDialog() - {true, true, false, false, DesktopMediaID(), true}, + // pickerUiCanceled() + {true, true, false, false, DesktopMediaID()}, + // chooseMedia() + {true, true, false, false, + DesktopMediaID(DesktopMediaID::TYPE_SCREEN, DesktopMediaID::kNullId)}, + // screensOnly() + {true, false, false, false, DesktopMediaID()}, + // WindowsOnly() + {false, true, false, false, DesktopMediaID()}, + // tabOnly() + {false, false, true, false, DesktopMediaID()}, + // audioShareNoApproval() + {true, true, true, true, + DesktopMediaID(DesktopMediaID::TYPE_WEB_CONTENTS, 123, false)}, + // audioShareApproval() + {true, true, true, true, + DesktopMediaID(DesktopMediaID::TYPE_WEB_CONTENTS, 123, true)}, + // chooseMediaAndGetStream() + {true, true, false, false, + DesktopMediaID(DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId)}, + // chooseMediaAndTryGetStreamWithInvalidId() + {true, true, false, false, + DesktopMediaID(DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId)}, + // cancelDialog() + {true, true, false, false, DesktopMediaID(), true}, +// TODO(crbug.com/805145): Test fails; invalid device IDs being generated. +#if 0 // tabShareWithAudioGetStream() {false, false, true, true, MakeFakeWebContentsMediaId(true)}, - // windowShareWithAudioGetStream() - {false, true, false, true, - DesktopMediaID(DesktopMediaID::TYPE_WINDOW, DesktopMediaID::kFakeId, - true)}, - // screenShareWithAudioGetStream() - {true, false, false, true, - DesktopMediaID(DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId, - true)}, +#endif + // windowShareWithAudioGetStream() + {false, true, false, true, + DesktopMediaID(DesktopMediaID::TYPE_WINDOW, DesktopMediaID::kFakeId, + true)}, + // screenShareWithAudioGetStream() + {true, false, false, true, + DesktopMediaID(DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId, + true)}, +// TODO(crbug.com/805145): Test fails; invalid device IDs being generated. +#if 0 // tabShareWithoutAudioGetStream() {false, false, true, true, MakeFakeWebContentsMediaId(false)}, - // windowShareWithoutAudioGetStream() - {false, true, false, true, - DesktopMediaID(DesktopMediaID::TYPE_WINDOW, DesktopMediaID::kFakeId)}, - // screenShareWithoutAudioGetStream() - {true, false, false, true, - DesktopMediaID(DesktopMediaID::TYPE_SCREEN, - webrtc::kFullDesktopScreenId)}, +#endif + // windowShareWithoutAudioGetStream() + {false, true, false, true, + DesktopMediaID(DesktopMediaID::TYPE_WINDOW, DesktopMediaID::kFakeId)}, + // screenShareWithoutAudioGetStream() + {true, false, false, true, + DesktopMediaID(DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId)}, }; picker_factory_.SetTestFlags(test_flags, arraysize(test_flags)); ASSERT_TRUE(RunExtensionTest("desktop_capture")) << message_; diff --git a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc index 392ecad385f..4e8b6cc9ffa 100644 --- a/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc +++ b/chromium/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc @@ -26,8 +26,6 @@ #include "content/public/browser/web_contents.h" #include "extensions/common/manifest.h" #include "extensions/common/switches.h" -#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h" -#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" #include "ui/base/l10n/l10n_util.h" using extensions::api::desktop_capture::ChooseDesktopMedia::Results::Options; @@ -123,8 +121,7 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( #else // !defined(OS_CHROMEOS) screen_list = std::make_unique<NativeDesktopMediaList>( content::DesktopMediaID::TYPE_SCREEN, - webrtc::DesktopCapturer::CreateScreenCapturer( - content::CreateDesktopCaptureOptions())); + content::desktop_capture::CreateScreenCapturer()); #endif // !defined(OS_CHROMEOS) } have_screen_list = true; @@ -151,8 +148,7 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( // used on multiple threads concurrently. window_list = std::make_unique<NativeDesktopMediaList>( content::DesktopMediaID::TYPE_WINDOW, - webrtc::DesktopCapturer::CreateWindowCapturer( - content::CreateDesktopCaptureOptions())); + content::desktop_capture::CreateWindowCapturer()); #endif // !defined(OS_CHROMEOS) } have_window_list = true; @@ -208,10 +204,14 @@ bool DesktopCaptureChooseDesktopMediaFunctionBase::Execute( DesktopMediaPicker::DoneCallback callback = base::Bind( &DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults, this); - - picker_->Show(web_contents, parent_window, parent_window, - base::UTF8ToUTF16(GetCallerDisplayName()), target_name, - std::move(source_lists), request_audio, callback); + DesktopMediaPicker::Params picker_params; + picker_params.web_contents = web_contents; + picker_params.context = parent_window; + picker_params.parent = parent_window; + picker_params.app_name = base::UTF8ToUTF16(GetCallerDisplayName()); + picker_params.target_name = target_name; + picker_params.request_audio = request_audio; + picker_->Show(picker_params, std::move(source_lists), callback); origin_ = origin; return true; } diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc index dfa6519275e..0cdd23224d9 100644 --- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc @@ -21,7 +21,6 @@ #include "chrome/browser/extensions/extension_service_test_with_install.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/scripting_permissions_modifier.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/extensions/test_extension_system.h" #include "chrome/browser/extensions/unpacked_installer.h" #include "chrome/browser/ui/browser.h" @@ -55,6 +54,7 @@ #include "extensions/common/feature_switch.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/value_builder.h" +#include "extensions/test/test_extension_dir.h" using testing::Return; using testing::_; @@ -156,8 +156,7 @@ bool DeveloperPrivateApiUnitTest::RunFunction( const scoped_refptr<UIThreadExtensionFunction>& function, const base::ListValue& args) { return extension_function_test_utils::RunFunction( - function.get(), args.CreateDeepCopy(), browser(), - extension_function_test_utils::NONE); + function.get(), args.CreateDeepCopy(), browser(), api_test_utils::NONE); } const Extension* DeveloperPrivateApiUnitTest::LoadUnpackedExtension() { diff --git a/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc b/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc index a8a5fa6acda..aaa7aced75d 100644 --- a/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc +++ b/chromium/chrome/browser/extensions/api/developer_private/developer_private_apitest.cc @@ -73,7 +73,7 @@ IN_PROC_BROWSER_TEST_F(DeveloperPrivateApiTest, InspectAppWindowView) { base::StringPrintf("[{\"renderViewId\": %d, \"renderProcessId\": %d}]", window_view->render_view_id, window_view->render_process_id), - browser(), extension_function_test_utils::NONE); + browser(), api_test_utils::NONE); // Verify that dev tools opened. std::list<AppWindow*> app_windows = @@ -119,7 +119,7 @@ IN_PROC_BROWSER_TEST_F(DeveloperPrivateApiTest, InspectEmbeddedOptionsPage) { function.get(), base::StringPrintf("[{\"renderViewId\": %d, \"renderProcessId\": %d}]", view.render_view_id, view.render_process_id), - browser(), extension_function_test_utils::NONE); + browser(), api_test_utils::NONE); // Verify that dev tools opened. content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( diff --git a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc index 53965e17392..15b031d88d6 100644 --- a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc +++ b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator.cc @@ -262,7 +262,7 @@ void ExtensionInfoGenerator::CreateExtensionInfo( if (pending_image_loads_ == 0) { // Don't call the callback re-entrantly. base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, base::Passed(&list_))); + FROM_HERE, base::BindOnce(callback, std::move(list_))); list_.clear(); } else { callback_ = callback; @@ -300,7 +300,7 @@ void ExtensionInfoGenerator::CreateExtensionsInfo( if (pending_image_loads_ == 0) { // Don't call the callback re-entrantly. base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(callback, base::Passed(&list_))); + FROM_HERE, base::BindOnce(callback, std::move(list_))); list_.clear(); } else { callback_ = callback; diff --git a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc index 8eb8f33bd4f..72c1bc79a1a 100644 --- a/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc +++ b/chromium/chrome/browser/extensions/api/developer_private/extension_info_generator_unittest.cc @@ -82,7 +82,7 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestBase { EXPECT_EQ(1u, list.size()); if (!list.empty()) info_out->reset(new developer::ExtensionInfo(std::move(list[0]))); - base::ResetAndReturn(&quit_closure_).Run(); + std::move(quit_closure_).Run(); } std::unique_ptr<developer::ExtensionInfo> GenerateExtensionInfo( @@ -103,7 +103,7 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestBase { void OnInfosGenerated(ExtensionInfoGenerator::ExtensionInfoList* out, ExtensionInfoGenerator::ExtensionInfoList list) { *out = std::move(list); - base::ResetAndReturn(&quit_closure_).Run(); + std::move(quit_closure_).Run(); } ExtensionInfoGenerator::ExtensionInfoList GenerateExtensionsInfo() { @@ -204,7 +204,7 @@ class ExtensionInfoGeneratorUnitTest : public ExtensionServiceTestBase { } private: - base::Closure quit_closure_; + base::OnceClosure quit_closure_; DISALLOW_COPY_AND_ASSIGN(ExtensionInfoGeneratorUnitTest); }; diff --git a/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc b/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc index e77604705a4..bb87fbcbfbd 100644 --- a/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc +++ b/chromium/chrome/browser/extensions/api/device_permissions_manager_unittest.cc @@ -18,7 +18,7 @@ #include "extensions/browser/api/hid/hid_device_manager.h" #include "extensions/browser/extension_prefs.h" #include "extensions/common/extension.h" -#include "services/device/public/interfaces/hid.mojom.h" +#include "services/device/public/mojom/hid.mojom.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" diff --git a/chromium/chrome/browser/extensions/api/dial/dial_api.cc b/chromium/chrome/browser/extensions/api/dial/dial_api.cc index a5922dc9eed..04c086f843e 100644 --- a/chromium/chrome/browser/extensions/api/dial/dial_api.cc +++ b/chromium/chrome/browser/extensions/api/dial/dial_api.cc @@ -255,7 +255,7 @@ void DialFetchDeviceDescriptionFunction::MaybeStartFetch(const GURL& url) { } device_description_fetcher_ = std::make_unique<DeviceDescriptionFetcher>( - url, Profile::FromBrowserContext(browser_context())->GetRequestContext(), + url, base::BindOnce(&DialFetchDeviceDescriptionFunction::OnFetchComplete, this), base::BindOnce(&DialFetchDeviceDescriptionFunction::OnFetchError, this)); diff --git a/chromium/chrome/browser/extensions/api/dial/dial_apitest.cc b/chromium/chrome/browser/extensions/api/dial/dial_apitest.cc index 67049da9bf4..1a8413a289c 100644 --- a/chromium/chrome/browser/extensions/api/dial/dial_apitest.cc +++ b/chromium/chrome/browser/extensions/api/dial/dial_apitest.cc @@ -9,6 +9,8 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/media/router/discovery/dial/dial_registry.h" +#include "chrome/browser/media/router/providers/cast/dual_media_sink_service.h" +#include "chrome/browser/media/router/test/noop_dual_media_sink_service.h" #include "extensions/common/switches.h" #include "extensions/test/extension_test_message_listener.h" #include "extensions/test/result_catcher.h" @@ -33,6 +35,13 @@ class DialAPITest : public ExtensionApiTest { extensions::switches::kWhitelistedExtensionID, "ddchlicdkolnonkihahngkmmmjnjlkkf"); } + + void SetUp() override { + // Stub out DualMediaSinkService so it does not interfere with the test. + media_router::DualMediaSinkService::SetInstanceForTest( + new media_router::NoopDualMediaSinkService()); + ExtensionApiTest::SetUp(); + } }; } // namespace diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc index e4fd3fb38a5..5e70f755f52 100644 --- a/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc +++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api.cc @@ -31,9 +31,9 @@ #include "base/strings/string16.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" #include "base/task/cancelable_task_tracker.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/time/time_to_iso8601.h" #include "base/values.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" @@ -56,11 +56,10 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/common/extensions/api/downloads.h" +#include "components/download/public/common/download_interrupt_reasons.h" +#include "components/download/public/common/download_item.h" +#include "components/download/public/common/download_url_parameters.h" #include "components/web_modal/web_contents_modal_dialog_manager.h" -#include "content/public/browser/download_interrupt_reasons.h" -#include "content/public/browser/download_item.h" -#include "content/public/browser/download_save_info.h" -#include "content/public/browser/download_url_parameters.h" #include "content/public/browser/notification_details.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_source.h" @@ -87,7 +86,7 @@ using content::BrowserContext; using content::BrowserThread; -using content::DownloadItem; +using download::DownloadItem; using content::DownloadManager; namespace download_extension_errors { @@ -193,7 +192,7 @@ const char* const kDangerStrings[] = { kDangerHost, kDangerUnwanted }; -static_assert(arraysize(kDangerStrings) == content::DOWNLOAD_DANGER_TYPE_MAX, +static_assert(arraysize(kDangerStrings) == download::DOWNLOAD_DANGER_TYPE_MAX, "kDangerStrings should have DOWNLOAD_DANGER_TYPE_MAX elements"); // Note: Any change to the state strings, should be accompanied by a @@ -204,38 +203,40 @@ const char* const kStateStrings[] = { kStateInterrupted, kStateInterrupted, }; -static_assert(arraysize(kStateStrings) == DownloadItem::MAX_DOWNLOAD_STATE, +static_assert(arraysize(kStateStrings) == + download::DownloadItem::MAX_DOWNLOAD_STATE, "kStateStrings should have MAX_DOWNLOAD_STATE elements"); -const char* DangerString(content::DownloadDangerType danger) { +const char* DangerString(download::DownloadDangerType danger) { DCHECK(danger >= 0); - DCHECK(danger < static_cast<content::DownloadDangerType>( - arraysize(kDangerStrings))); - if (danger < 0 || danger >= static_cast<content::DownloadDangerType>( - arraysize(kDangerStrings))) + DCHECK(danger < + static_cast<download::DownloadDangerType>(arraysize(kDangerStrings))); + if (danger < 0 || danger >= static_cast<download::DownloadDangerType>( + arraysize(kDangerStrings))) return ""; return kDangerStrings[danger]; } -content::DownloadDangerType DangerEnumFromString(const std::string& danger) { +download::DownloadDangerType DangerEnumFromString(const std::string& danger) { for (size_t i = 0; i < arraysize(kDangerStrings); ++i) { if (danger == kDangerStrings[i]) - return static_cast<content::DownloadDangerType>(i); + return static_cast<download::DownloadDangerType>(i); } - return content::DOWNLOAD_DANGER_TYPE_MAX; + return download::DOWNLOAD_DANGER_TYPE_MAX; } -const char* StateString(DownloadItem::DownloadState state) { +const char* StateString(download::DownloadItem::DownloadState state) { DCHECK(state >= 0); - DCHECK(state < static_cast<DownloadItem::DownloadState>( - arraysize(kStateStrings))); - if (state < 0 || state >= static_cast<DownloadItem::DownloadState>( - arraysize(kStateStrings))) + DCHECK(state < static_cast<download::DownloadItem::DownloadState>( + arraysize(kStateStrings))); + if (state < 0 || state >= static_cast<download::DownloadItem::DownloadState>( + arraysize(kStateStrings))) return ""; return kStateStrings[state]; } -DownloadItem::DownloadState StateEnumFromString(const std::string& state) { +download::DownloadItem::DownloadState StateEnumFromString( + const std::string& state) { for (size_t i = 0; i < arraysize(kStateStrings); ++i) { if ((kStateStrings[i] != NULL) && (state == kStateStrings[i])) return static_cast<DownloadItem::DownloadState>(i); @@ -243,15 +244,6 @@ DownloadItem::DownloadState StateEnumFromString(const std::string& state) { return DownloadItem::MAX_DOWNLOAD_STATE; } -std::string TimeToISO8601(const base::Time& t) { - base::Time::Exploded exploded; - t.UTCExplode(&exploded); - return base::StringPrintf( - "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", exploded.year, exploded.month, - exploded.day_of_month, exploded.hour, exploded.minute, exploded.second, - exploded.millisecond); -} - std::unique_ptr<base::DictionaryValue> DownloadItemToJSON( DownloadItem* download_item, content::BrowserContext* browser_context) { @@ -273,25 +265,27 @@ std::unique_ptr<base::DictionaryValue> DownloadItemToJSON( json->SetBoolean(kCanResumeKey, download_item->CanResume()); json->SetBoolean(kPausedKey, download_item->IsPaused()); json->SetString(kMimeKey, download_item->GetMimeType()); - json->SetString(kStartTimeKey, TimeToISO8601(download_item->GetStartTime())); + json->SetString(kStartTimeKey, + base::TimeToISO8601(download_item->GetStartTime())); json->SetDouble(kBytesReceivedKey, download_item->GetReceivedBytes()); json->SetDouble(kTotalBytesKey, download_item->GetTotalBytes()); json->SetBoolean(kIncognitoKey, browser_context->IsOffTheRecord()); if (download_item->GetState() == DownloadItem::INTERRUPTED) { - json->SetString(kErrorKey, - content::DownloadInterruptReasonToString( - download_item->GetLastReason())); + json->SetString(kErrorKey, download::DownloadInterruptReasonToString( + download_item->GetLastReason())); } else if (download_item->GetState() == DownloadItem::CANCELLED) { json->SetString(kErrorKey, - content::DownloadInterruptReasonToString( - content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED)); + download::DownloadInterruptReasonToString( + download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED)); } if (!download_item->GetEndTime().is_null()) - json->SetString(kEndTimeKey, TimeToISO8601(download_item->GetEndTime())); + json->SetString(kEndTimeKey, + base::TimeToISO8601(download_item->GetEndTime())); base::TimeDelta time_remaining; if (download_item->TimeRemaining(&time_remaining)) { base::Time now = base::Time::Now(); - json->SetString(kEstimatedEndTimeKey, TimeToISO8601(now + time_remaining)); + json->SetString(kEstimatedEndTimeKey, + base::TimeToISO8601(now + time_remaining)); } DownloadedByExtension* by_ext = DownloadedByExtension::Get(download_item); if (by_ext) { @@ -563,9 +557,9 @@ void RunDownloadQuery( std::string danger_string = downloads::ToString(query_in.danger); if (!danger_string.empty()) { - content::DownloadDangerType danger_type = DangerEnumFromString( - danger_string); - if (danger_type == content::DOWNLOAD_DANGER_TYPE_MAX) { + download::DownloadDangerType danger_type = + DangerEnumFromString(danger_string); + if (danger_type == download::DOWNLOAD_DANGER_TYPE_MAX) { *error = errors::kInvalidDangerType; return; } @@ -768,11 +762,10 @@ class ExtensionDownloadsEventRouterData : public base::SupportsUserData::Data { // Returns false if this |extension_id| was not expected or if this // |extension_id| has already reported. The caller is responsible for // validating |filename|. - bool DeterminerCallback( - Profile* profile, - const std::string& extension_id, - const base::FilePath& filename, - downloads::FilenameConflictAction conflict_action) { + bool DeterminerCallback(content::BrowserContext* browser_context, + const std::string& extension_id, + const base::FilePath& filename, + downloads::FilenameConflictAction conflict_action) { DCHECK_CURRENTLY_ON(BrowserThread::UI); bool found_info = false; for (size_t index = 0; index < determiners_.size(); ++index) { @@ -800,7 +793,7 @@ class ExtensionDownloadsEventRouterData : public base::SupportsUserData::Data { &determined_conflict_action_, &warnings); if (!warnings.empty()) - WarningService::NotifyWarningsOnUI(profile, warnings); + WarningService::NotifyWarningsOnUI(browser_context, warnings); if (winner_extension_id == determiners_[index].extension_id) determiner_ = determiners_[index]; } @@ -965,18 +958,16 @@ const char DownloadedByExtension::kKey[] = "DownloadItem DownloadedByExtension"; DownloadedByExtension* DownloadedByExtension::Get( - content::DownloadItem* item) { + download::DownloadItem* item) { base::SupportsUserData::Data* data = item->GetUserData(kKey); return (data == NULL) ? NULL : static_cast<DownloadedByExtension*>(data); } -DownloadedByExtension::DownloadedByExtension( - content::DownloadItem* item, - const std::string& id, - const std::string& name) - : id_(id), - name_(name) { +DownloadedByExtension::DownloadedByExtension(download::DownloadItem* item, + const std::string& id, + const std::string& name) + : id_(id), name_(name) { item->SetUserData(kKey, base::WrapUnique(this)); } @@ -1030,8 +1021,8 @@ bool DownloadsDownloadFunction::RunAsync() { } } })"); - std::unique_ptr<content::DownloadUrlParameters> download_params( - new content::DownloadUrlParameters( + std::unique_ptr<download::DownloadUrlParameters> download_params( + new download::DownloadUrlParameters( download_url, render_frame_host()->GetProcess()->GetID(), render_frame_host()->GetRenderViewHost()->GetRoutingID(), render_frame_host()->GetRoutingID(), @@ -1082,14 +1073,18 @@ bool DownloadsDownloadFunction::RunAsync() { downloads::ToString(options.method); if (!method_string.empty()) download_params->set_method(method_string); - if (options.body.get()) - download_params->set_post_body(*options.body); + if (options.body.get()) { + download_params->set_post_body( + network::ResourceRequestBody::CreateFromBytes(options.body->data(), + options.body->size())); + } + download_params->set_callback(base::Bind( &DownloadsDownloadFunction::OnStarted, this, creator_suggested_filename, options.conflict_action)); // Prevent login prompts for 401/407 responses. download_params->set_do_not_prompt_for_login(true); - download_params->set_download_source(content::DownloadSource::EXTENSION_API); + download_params->set_download_source(download::DownloadSource::EXTENSION_API); DownloadManager* manager = BrowserContext::GetDownloadManager( current_profile); @@ -1102,11 +1097,11 @@ void DownloadsDownloadFunction::OnStarted( const base::FilePath& creator_suggested_filename, downloads::FilenameConflictAction creator_conflict_action, DownloadItem* item, - content::DownloadInterruptReason interrupt_reason) { + download::DownloadInterruptReason interrupt_reason) { DCHECK_CURRENTLY_ON(BrowserThread::UI); VLOG(1) << __func__ << " " << item << " " << interrupt_reason; if (item) { - DCHECK_EQ(content::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); + DCHECK_EQ(download::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); SetResult(std::make_unique<base::Value>(static_cast<int>(item->GetId()))); if (!creator_suggested_filename.empty() || (creator_conflict_action != @@ -1124,8 +1119,8 @@ void DownloadsDownloadFunction::OnStarted( new DownloadedByExtension(item, extension()->id(), extension()->name()); item->UpdateObservers(); } else { - DCHECK_NE(content::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); - error_ = content::DownloadInterruptReasonToString(interrupt_reason); + DCHECK_NE(download::DOWNLOAD_INTERRUPT_REASON_NONE, interrupt_reason); + error_ = download::DownloadInterruptReasonToString(interrupt_reason); } SendResponse(error_.empty()); } @@ -1562,10 +1557,8 @@ bool DownloadsGetFileIconFunction::RunAsync() { float scale = 1.0; content::WebContents* web_contents = dispatcher()->GetVisibleWebContents(); - if (web_contents) { - scale = ui::GetScaleFactorForNativeView( - web_contents->GetRenderWidgetHostView()->GetNativeView()); - } + if (web_contents && web_contents->GetRenderWidgetHostView()) + scale = web_contents->GetRenderWidgetHostView()->GetDeviceScaleFactor(); EXTENSION_FUNCTION_VALIDATE(icon_extractor_->ExtractIconURLForPath( download_item->GetTargetFilePath(), scale, @@ -1733,7 +1726,7 @@ void ExtensionDownloadsEventRouter::DetermineFilenameInternal( } bool ExtensionDownloadsEventRouter::DetermineFilename( - Profile* profile, + content::BrowserContext* browser_context, bool include_incognito, const std::string& ext_id, int download_id, @@ -1742,7 +1735,8 @@ bool ExtensionDownloadsEventRouter::DetermineFilename( std::string* error) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RecordApiFunctions(DOWNLOADS_FUNCTION_DETERMINE_FILENAME); - DownloadItem* item = GetDownload(profile, include_incognito, download_id); + DownloadItem* item = + GetDownload(browser_context, include_incognito, download_id); ExtensionDownloadsEventRouterData* data = item ? ExtensionDownloadsEventRouterData::Get(item) : NULL; // maxListeners=1 in downloads.idl and suggestCallback in @@ -1766,8 +1760,8 @@ bool ExtensionDownloadsEventRouter::DetermineFilename( base::FilePath()); // If the invalid filename check is moved to before DeterminerCallback(), then // it will block forever waiting for this ext_id to report. - if (Fault(!data->DeterminerCallback( - profile, ext_id, filename, conflict_action), + if (Fault(!data->DeterminerCallback(browser_context, ext_id, filename, + conflict_action), errors::kUnexpectedDeterminer, error) || Fault((!const_filename.empty() && !valid_filename), errors::kInvalidFilename, error)) diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api.h b/chromium/chrome/browser/extensions/api/downloads/downloads_api.h index 084d39b0bc1..cd6e5759ce8 100644 --- a/chromium/chrome/browser/extensions/api/downloads/downloads_api.h +++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api.h @@ -69,9 +69,9 @@ namespace extensions { class DownloadedByExtension : public base::SupportsUserData::Data { public: - static DownloadedByExtension* Get(content::DownloadItem* item); + static DownloadedByExtension* Get(download::DownloadItem* item); - DownloadedByExtension(content::DownloadItem* item, + DownloadedByExtension(download::DownloadItem* item, const std::string& id, const std::string& name); @@ -100,8 +100,8 @@ class DownloadsDownloadFunction : public ChromeAsyncExtensionFunction { void OnStarted(const base::FilePath& creator_suggested_filename, extensions::api::downloads::FilenameConflictAction creator_conflict_action, - content::DownloadItem* item, - content::DownloadInterruptReason interrupt_reason); + download::DownloadItem* item, + download::DownloadInterruptReason interrupt_reason); DISALLOW_COPY_AND_ASSIGN(DownloadsDownloadFunction); }; @@ -330,7 +330,7 @@ class ExtensionDownloadsEventRouter // existing files, then |overwrite| will be true. Returns true on success, // false otherwise. static bool DetermineFilename( - Profile* profile, + content::BrowserContext* browser_context, bool include_incognito, const std::string& ext_id, int download_id, @@ -352,19 +352,18 @@ class ExtensionDownloadsEventRouter // an extension wants to change the target filename, then |change| will be // called with the new filename and a flag indicating whether the new file // should overwrite any old files of the same name. - void OnDeterminingFilename( - content::DownloadItem* item, - const base::FilePath& suggested_path, - const base::Closure& no_change, - const FilenameChangedCallback& change); + void OnDeterminingFilename(download::DownloadItem* item, + const base::FilePath& suggested_path, + const base::Closure& no_change, + const FilenameChangedCallback& change); // AllDownloadItemNotifier::Observer. void OnDownloadCreated(content::DownloadManager* manager, - content::DownloadItem* download_item) override; + download::DownloadItem* download_item) override; void OnDownloadUpdated(content::DownloadManager* manager, - content::DownloadItem* download_item) override; + download::DownloadItem* download_item) override; void OnDownloadRemoved(content::DownloadManager* manager, - content::DownloadItem* download_item) override; + download::DownloadItem* download_item) override; // extensions::EventRouter::Observer. void OnListenerRemoved(const extensions::EventListenerInfo& details) override; diff --git a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc index ee607987815..618452122d6 100644 --- a/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc @@ -26,28 +26,29 @@ #include "chrome/browser/download/download_file_icon_extractor.h" #include "chrome/browser/download/download_test_file_activity_observer.h" #include "chrome/browser/extensions/api/downloads/downloads_api.h" -#include "chrome/browser/extensions/browser_action_test_util.h" +#include "chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_function_test_utils.h" #include "chrome/browser/net/url_request_mock_util.h" +#include "chrome/browser/platform_util_internal.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" +#include "chrome/browser/ui/extensions/browser_action_test_util.h" #include "chrome/common/extensions/api/downloads.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/download/public/common/download_item.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/download_item.h" #include "content/public/browser/download_manager.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_features.h" -#include "content/public/test/controllable_http_response.h" #include "content/public/test/download_test_observer.h" #include "content/public/test/test_download_http_response.h" #include "content/public/test/test_utils.h" @@ -55,6 +56,7 @@ #include "extensions/browser/notification_types.h" #include "net/base/data_url.h" #include "net/dns/mock_host_resolver.h" +#include "net/test/embedded_test_server/controllable_http_response.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/url_request/url_request_slow_download_job.h" #include "net/url_request/url_request.h" @@ -69,7 +71,7 @@ using content::BrowserContext; using content::BrowserThread; -using content::DownloadItem; +using download::DownloadItem; using content::DownloadManager; namespace errors = download_extension_errors; @@ -270,7 +272,7 @@ class DownloadExtensionTest : public ExtensionApiTest { // Danger type for the download. Only use DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS // and DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT. - content::DownloadDangerType danger_type; + download::DownloadDangerType danger_type; }; void LoadExtension(const char* name) { @@ -329,10 +331,12 @@ class DownloadExtensionTest : public ExtensionApiTest { DownloadTestFileActivityObserver observer(current_browser()->profile()); observer.EnableFileChooser(false); - first_download_ = std::make_unique<content::ControllableHttpResponse>( - embedded_test_server(), kFirstDownloadUrl); - second_download_ = std::make_unique<content::ControllableHttpResponse>( - embedded_test_server(), kSecondDownloadUrl); + first_download_ = + std::make_unique<net::test_server::ControllableHttpResponse>( + embedded_test_server(), kFirstDownloadUrl); + second_download_ = + std::make_unique<net::test_server::ControllableHttpResponse>( + embedded_test_server(), kSecondDownloadUrl); host_resolver()->AddRule("*", "127.0.0.1"); } @@ -354,10 +358,9 @@ class DownloadExtensionTest : public ExtensionApiTest { current_browser()->profile(), event_name, json_args); } - bool WaitForInterruption( - DownloadItem* item, - content::DownloadInterruptReason expected_error, - const std::string& on_created_event) { + bool WaitForInterruption(DownloadItem* item, + download::DownloadInterruptReason expected_error, + const std::string& on_created_event) { if (!WaitFor(downloads::OnCreated::kEventName, on_created_event)) return false; // Now, onCreated is always fired before interruption. @@ -370,7 +373,7 @@ class DownloadExtensionTest : public ExtensionApiTest { " \"previous\": \"in_progress\"," " \"current\": \"interrupted\"}}]", item->GetId(), - content::DownloadInterruptReasonToString(expected_error).c_str())); + download::DownloadInterruptReasonToString(expected_error).c_str())); } void ClearEvents() { @@ -426,7 +429,7 @@ class DownloadExtensionTest : public ExtensionApiTest { url_chain.push_back(GURL()); for (size_t i = 0; i < count; ++i) { DownloadItem* item = GetOnRecordManager()->CreateDownloadItem( - base::GenerateGUID(), content::DownloadItem::kInvalidId + 1 + i, + base::GenerateGUID(), download::DownloadItem::kInvalidId + 1 + i, downloads_directory().Append(history_info[i].filename), downloads_directory().Append(history_info[i].filename), url_chain, GURL(), GURL(), GURL(), GURL(), std::string(), @@ -440,9 +443,9 @@ class DownloadExtensionTest : public ExtensionApiTest { std::string(), // hash history_info[i].state, // state history_info[i].danger_type, - (history_info[i].state != content::DownloadItem::CANCELLED - ? content::DOWNLOAD_INTERRUPT_REASON_NONE - : content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED), + (history_info[i].state != download::DownloadItem::CANCELLED + ? download::DOWNLOAD_INTERRUPT_REASON_NONE + : download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED), false, // opened current, // last_access_time false, std::vector<DownloadItem::ReceivedSlice>()); @@ -477,7 +480,7 @@ class DownloadExtensionTest : public ExtensionApiTest { } DownloadItem* CreateSlowTestDownload( - content::ControllableHttpResponse* response, + net::test_server::ControllableHttpResponse* response, const std::string& path) { if (!embedded_test_server()->Started()) StartEmbeddedTestServer(); @@ -515,7 +518,8 @@ class DownloadExtensionTest : public ExtensionApiTest { FinishSlowDownloads(second_download_.get()); } - void FinishSlowDownloads(content::ControllableHttpResponse* response) { + void FinishSlowDownloads( + net::test_server::ControllableHttpResponse* response) { std::unique_ptr<content::DownloadTestObserver> observer( CreateDownloadObserver(1)); response->Done(); @@ -547,10 +551,10 @@ class DownloadExtensionTest : public ExtensionApiTest { return result; } - extension_function_test_utils::RunFunctionFlags GetFlags() { - return current_browser()->profile()->IsOffTheRecord() ? - extension_function_test_utils::INCLUDE_INCOGNITO : - extension_function_test_utils::NONE; + api_test_utils::RunFunctionFlags GetFlags() { + return current_browser()->profile()->IsOffTheRecord() + ? api_test_utils::INCLUDE_INCOGNITO + : api_test_utils::NONE; } // extension_function_test_utils::RunFunction*() only uses browser for its @@ -619,8 +623,8 @@ class DownloadExtensionTest : public ExtensionApiTest { Browser* current_browser_; std::unique_ptr<DownloadsEventsListener> events_listener_; - std::unique_ptr<content::ControllableHttpResponse> first_download_; - std::unique_ptr<content::ControllableHttpResponse> second_download_; + std::unique_ptr<net::test_server::ControllableHttpResponse> first_download_; + std::unique_ptr<net::test_server::ControllableHttpResponse> second_download_; DISALLOW_COPY_AND_ASSIGN(DownloadExtensionTest); }; @@ -786,30 +790,30 @@ bool ItemIsInterrupted(DownloadItem* item) { return item->GetState() == DownloadItem::INTERRUPTED; } -content::DownloadInterruptReason InterruptReasonExtensionToContent( +download::DownloadInterruptReason InterruptReasonExtensionToComponent( downloads::InterruptReason error) { switch (error) { case downloads::INTERRUPT_REASON_NONE: - return content::DOWNLOAD_INTERRUPT_REASON_NONE; + return download::DOWNLOAD_INTERRUPT_REASON_NONE; #define INTERRUPT_REASON(name, value) \ case downloads::INTERRUPT_REASON_##name: \ - return content::DOWNLOAD_INTERRUPT_REASON_##name; -#include "content/public/browser/download_interrupt_reason_values.h" + return download::DOWNLOAD_INTERRUPT_REASON_##name; +#include "components/download/public/common/download_interrupt_reason_values.h" #undef INTERRUPT_REASON } NOTREACHED(); - return content::DOWNLOAD_INTERRUPT_REASON_NONE; + return download::DOWNLOAD_INTERRUPT_REASON_NONE; } downloads::InterruptReason InterruptReasonContentToExtension( - content::DownloadInterruptReason error) { + download::DownloadInterruptReason error) { switch (error) { - case content::DOWNLOAD_INTERRUPT_REASON_NONE: + case download::DOWNLOAD_INTERRUPT_REASON_NONE: return downloads::INTERRUPT_REASON_NONE; -#define INTERRUPT_REASON(name, value) \ - case content::DOWNLOAD_INTERRUPT_REASON_##name: \ +#define INTERRUPT_REASON(name, value) \ + case download::DOWNLOAD_INTERRUPT_REASON_##name: \ return downloads::INTERRUPT_REASON_##name; -#include "content/public/browser/download_interrupt_reason_values.h" +#include "components/download/public/common/download_interrupt_reason_values.h" #undef INTERRUPT_REASON } NOTREACHED(); @@ -1063,13 +1067,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_FileIcon_History) { const HistoryDownloadInfo kHistoryInfo[] = { - { FILE_PATH_LITERAL("real.txt"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, - { FILE_PATH_LITERAL("fake.txt"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } - }; + {FILE_PATH_LITERAL("real.txt"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}, + {FILE_PATH_LITERAL("fake.txt"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector all_downloads; ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), &all_downloads)); @@ -1123,6 +1124,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadsShowDefaultFolderFunction) { + platform_util::internal::DisableShellOperationsForTesting(); ScopedCancellingItem item(CreateFirstSlowTestDownload()); ASSERT_TRUE(item.get()); @@ -1144,13 +1146,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchFilenameRegex) { const HistoryDownloadInfo kHistoryInfo[] = { - { FILE_PATH_LITERAL("foobar"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, - { FILE_PATH_LITERAL("baz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } - }; + {FILE_PATH_LITERAL("foobar"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}, + {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector all_downloads; ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), &all_downloads)); @@ -1223,13 +1222,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchOrderBy) { const HistoryDownloadInfo kHistoryInfo[] = { - { FILE_PATH_LITERAL("zzz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, - { FILE_PATH_LITERAL("baz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } - }; + {FILE_PATH_LITERAL("zzz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}, + {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector items; ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), &items)); @@ -1256,13 +1252,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchOrderByEmpty) { const HistoryDownloadInfo kHistoryInfo[] = { - { FILE_PATH_LITERAL("zzz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, - { FILE_PATH_LITERAL("baz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } - }; + {FILE_PATH_LITERAL("zzz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}, + {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector items; ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), &items)); @@ -1293,13 +1286,10 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchDanger) { const HistoryDownloadInfo kHistoryInfo[] = { - { FILE_PATH_LITERAL("zzz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, - { FILE_PATH_LITERAL("baz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS } - }; + {FILE_PATH_LITERAL("zzz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT}, + {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}}; DownloadManager::DownloadVector items; ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), &items)); @@ -1379,15 +1369,12 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadExtensionTest_SearchPlural) { const HistoryDownloadInfo kHistoryInfo[] = { - { FILE_PATH_LITERAL("aaa"), - DownloadItem::CANCELLED, - content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS }, - { FILE_PATH_LITERAL("zzz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, - { FILE_PATH_LITERAL("baz"), - DownloadItem::COMPLETE, - content::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT }, + {FILE_PATH_LITERAL("aaa"), DownloadItem::CANCELLED, + download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS}, + {FILE_PATH_LITERAL("zzz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT}, + {FILE_PATH_LITERAL("baz"), DownloadItem::COMPLETE, + download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT}, }; DownloadManager::DownloadVector items; ASSERT_TRUE(CreateHistoryDownloads(kHistoryInfo, arraysize(kHistoryInfo), @@ -1767,7 +1754,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, EXPECT_EQ(GetExtensionURL(), item->GetSiteUrl().spec()); item->SimulateErrorForTesting( - content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); + download::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); embedded_test_server_io_runner->PostTask(FROM_HERE, complete_callback); ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName, @@ -1991,7 +1978,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, DownloadItem* item = GetCurrentManager()->GetDownload(result_id); ASSERT_TRUE(item); ASSERT_TRUE(WaitForInterruption( - item, content::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, + item, download::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, "[{\"state\": \"in_progress\"," " \"url\": \"javascript:document.write(\\\"hello\\\");\"}]")); @@ -2003,7 +1990,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, item = GetCurrentManager()->GetDownload(result_id); ASSERT_TRUE(item); ASSERT_TRUE(WaitForInterruption( - item, content::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, + item, download::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, "[{\"state\": \"in_progress\"," " \"url\": \"javascript:return false;\"}]")); @@ -2015,7 +2002,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, item = GetCurrentManager()->GetDownload(result_id); ASSERT_TRUE(item); ASSERT_TRUE(WaitForInterruption( - item, content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, + item, download::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, "[{\"state\": \"in_progress\"," " \"url\": \"ftp://example.com/example.txt\"}]")); } @@ -2274,8 +2261,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); ASSERT_TRUE(WaitForInterruption( - item, - content::DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED, + item, download::DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED, base::StringPrintf("[{\"danger\": \"safe\"," " \"incognito\": false," " \"paused\": false," @@ -2367,8 +2353,7 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); ASSERT_TRUE(WaitForInterruption( - item, - content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, + item, download::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, base::StringPrintf("[{\"danger\": \"safe\"," " \"incognito\": false," " \"bytesReceived\": 0.0," @@ -2509,16 +2494,14 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); ASSERT_TRUE(WaitForInterruption( - item, - content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, + item, download::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, base::StringPrintf("[{\"danger\": \"safe\"," " \"incognito\": false," " \"mime\": \"\"," " \"paused\": false," " \"id\": %d," " \"url\": \"%s\"}]", - result_id, - download_url.c_str()))); + result_id, download_url.c_str()))); } // Test that downloadPostSuccess would fail if the resource requires the POST @@ -2552,16 +2535,14 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); ASSERT_TRUE(WaitForInterruption( - item, - content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, + item, download::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, base::StringPrintf("[{\"danger\": \"safe\"," " \"incognito\": false," " \"mime\": \"\"," " \"paused\": false," " \"id\": %d," " \"url\": \"%s\"}]", - result_id, - download_url.c_str()))); + result_id, download_url.c_str()))); } // Test that cancel()ing an in-progress download causes its state to transition @@ -2886,6 +2867,51 @@ IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, result_id))); } +// Tests downloadsInternal.determineFilename. +// Regression test for https://crbug.com/815362. +IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, + DownloadsInternalDetermineFilename) { + GoOnTheRecord(); + LoadExtension("downloads_split"); + AddFilenameDeterminer(); + ASSERT_TRUE(StartEmbeddedTestServer()); + std::string download_url = embedded_test_server()->GetURL("/slow?0").spec(); + + // Start downloading a file. + std::unique_ptr<base::Value> result(RunFunctionAndReturnResult( + new DownloadsDownloadFunction(), + base::StringPrintf(R"([{"url": "%s"}])", download_url.c_str()))); + ASSERT_TRUE(result.get()); + int result_id = result->GetInt(); + DownloadItem* item = GetCurrentManager()->GetDownload(result_id); + ASSERT_TRUE(item); + ScopedCancellingItem canceller(item); + ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); + + // Wait for the onCreated and onDeterminingFilename events. + ASSERT_TRUE(WaitFor(downloads::OnCreated::kEventName, + base::StringPrintf(R"([{ + "danger": "safe", + "incognito": false, + "id": %d, + "mime": "text/plain", + "paused": false, + "url": "%s" + }])", + result_id, download_url.c_str()))); + ASSERT_TRUE( + WaitFor(downloads::OnDeterminingFilename::kEventName, + base::StringPrintf( + R"([{"id": %d, "filename": "slow.txt"}])", result_id))); + ASSERT_TRUE(item->GetTargetFilePath().empty()); + ASSERT_EQ(DownloadItem::IN_PROGRESS, item->GetState()); + + std::unique_ptr<base::Value> determine_result(RunFunctionAndReturnResult( + new DownloadsInternalDetermineFilenameFunction(), + base::StringPrintf(R"([%d, "", "uniquify"])", result_id))); + EXPECT_FALSE(determine_result.get()); // No return value. +} + IN_PROC_BROWSER_TEST_F( DownloadExtensionTest, DownloadExtensionTest_OnDeterminingFilename_DangerousOverride) { @@ -4315,14 +4341,14 @@ IN_PROC_BROWSER_TEST_F(DownloadsApiTest, DownloadsApiTest) { TEST(DownloadInterruptReasonEnumsSynced, DownloadInterruptReasonEnumsSynced) { -#define INTERRUPT_REASON(name, value) \ - EXPECT_EQ(InterruptReasonContentToExtension( \ - content::DOWNLOAD_INTERRUPT_REASON_##name), \ - downloads::INTERRUPT_REASON_##name); \ - EXPECT_EQ( \ - InterruptReasonExtensionToContent(downloads::INTERRUPT_REASON_##name), \ - content::DOWNLOAD_INTERRUPT_REASON_##name); -#include "content/public/browser/download_interrupt_reason_values.h" // NOLINT +#define INTERRUPT_REASON(name, value) \ + EXPECT_EQ(InterruptReasonContentToExtension( \ + download::DOWNLOAD_INTERRUPT_REASON_##name), \ + downloads::INTERRUPT_REASON_##name); \ + EXPECT_EQ( \ + InterruptReasonExtensionToComponent(downloads::INTERRUPT_REASON_##name), \ + download::DOWNLOAD_INTERRUPT_REASON_##name); +#include "components/download/public/common/download_interrupt_reason_values.h" #undef INTERRUPT_REASON } diff --git a/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc b/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc index 109d0b84a3e..db6580819bf 100644 --- a/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc +++ b/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.cc @@ -19,21 +19,21 @@ DownloadsInternalDetermineFilenameFunction:: typedef extensions::api::downloads_internal::DetermineFilename::Params DetermineFilenameParams; -bool DownloadsInternalDetermineFilenameFunction::RunAsync() { +ExtensionFunction::ResponseAction +DownloadsInternalDetermineFilenameFunction::Run() { std::unique_ptr<DetermineFilenameParams> params( DetermineFilenameParams::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); base::FilePath::StringType filename; EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &filename)); - return ExtensionDownloadsEventRouter::DetermineFilename( - GetProfile(), - include_incognito(), - extension()->id(), - params->download_id, - base::FilePath(filename), + std::string error; + bool result = ExtensionDownloadsEventRouter::DetermineFilename( + browser_context(), include_incognito(), extension()->id(), + params->download_id, base::FilePath(filename), extensions::api::downloads::ParseFilenameConflictAction( params->conflict_action), - &error_); + &error); + return RespondNow(result ? NoArguments() : Error(error)); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h b/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h index f7da2b58564..4d6acf505cf 100644 --- a/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h +++ b/chromium/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h @@ -6,17 +6,17 @@ #define CHROME_BROWSER_EXTENSIONS_API_DOWNLOADS_INTERNAL_DOWNLOADS_INTERNAL_API_H_ #include "base/macros.h" -#include "chrome/browser/extensions/chrome_extension_function.h" +#include "extensions/browser/extension_function.h" namespace extensions { class DownloadsInternalDetermineFilenameFunction - : public ChromeAsyncExtensionFunction { + : public UIThreadExtensionFunction { public: DECLARE_EXTENSION_FUNCTION("downloadsInternal.determineFilename", DOWNLOADSINTERNAL_DETERMINEFILENAME); DownloadsInternalDetermineFilenameFunction(); - bool RunAsync() override; + ResponseAction Run() override; protected: ~DownloadsInternalDetermineFilenameFunction() override; diff --git a/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc b/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc index 7f41f2d8534..c8dc598aa2b 100644 --- a/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc +++ b/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc @@ -43,6 +43,7 @@ #include "components/proximity_auth/screenlock_state.h" #include "components/proximity_auth/switches.h" #include "components/signin/core/account_id/account_id.h" +#include "components/strings/grit/components_strings.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "ui/base/l10n/l10n_util.h" @@ -157,9 +158,8 @@ ExtensionFunction::ResponseAction EasyUnlockPrivateGetStringsFunction::Run() { #endif // defined(OS_CHROMEOS) // Common strings. - strings->SetString( - "learnMoreLinkTitle", - l10n_util::GetStringUTF16(IDS_EASY_UNLOCK_LEARN_MORE_LINK_TITLE)); + strings->SetString("learnMoreLinkTitle", + l10n_util::GetStringUTF16(IDS_LEARN_MORE)); strings->SetString("deviceType", device_type); // Setup notification strings. @@ -302,10 +302,8 @@ ExtensionFunction::ResponseAction EasyUnlockPrivateGetStringsFunction::Run() { "setupAndroidSmartLockDoneButtonText", l10n_util::GetStringUTF16( IDS_EASY_UNLOCK_SETUP_ANDROID_SMART_LOCK_DONE_BUTTON_LABEL)); - strings->SetString( - "setupAndroidSmartLockAboutLinkText", - l10n_util::GetStringUTF16( - IDS_EASY_UNLOCK_SETUP_ANDROID_SMART_LOCK_ABOUT_LINK_TEXT)); + strings->SetString("setupAndroidSmartLockAboutLinkText", + l10n_util::GetStringUTF16(IDS_LEARN_MORE)); // Step 3: Setup completed successfully. strings->SetString( "setupCompleteHeaderTitle", diff --git a/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc b/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc index 290b81d3093..69a148dabf9 100644 --- a/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc +++ b/chromium/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc @@ -184,10 +184,7 @@ TEST_F(EasyUnlockPrivateApiTest, GenerateEcP256KeyPair) { function->set_has_callback(true); ASSERT_TRUE(extension_function_test_utils::RunFunction( - function.get(), - "[]", - browser(), - extension_function_test_utils::NONE)); + function.get(), "[]", browser(), extensions::api_test_utils::NONE)); const base::ListValue* result_list = function->GetResultList(); ASSERT_TRUE(result_list); @@ -231,7 +228,7 @@ TEST_F(EasyUnlockPrivateApiTest, PerformECDHKeyAgreement) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -277,7 +274,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -307,7 +304,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage_EmptyOptions) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -346,7 +343,7 @@ TEST_F(EasyUnlockPrivateApiTest, CreateSecureMessage_AsymmetricSign) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -384,7 +381,7 @@ TEST_F(EasyUnlockPrivateApiTest, UnwrapSecureMessage) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -414,7 +411,7 @@ TEST_F(EasyUnlockPrivateApiTest, UnwrapSecureMessage_EmptyOptions) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -450,7 +447,7 @@ TEST_F(EasyUnlockPrivateApiTest, UnwrapSecureMessage_AsymmetricSign) { ASSERT_TRUE(extension_function_test_utils::RunFunction( function.get(), std::move(args), browser(), - extension_function_test_utils::NONE)); + extensions::api_test_utils::NONE)); EXPECT_EQ(expected_result, GetSingleBinaryResultAsString(function.get())); } @@ -500,10 +497,8 @@ TEST_F(EasyUnlockPrivateApiTest, AutoPairing) { scoped_refptr<EasyUnlockPrivateSetAutoPairingResultFunction> function( new EasyUnlockPrivateSetAutoPairingResultFunction()); ASSERT_TRUE(extension_function_test_utils::RunFunction( - function.get(), - "[{\"success\":false, \"errorMessage\":\"fake_error\"}]", - browser(), - extension_function_test_utils::NONE)); + function.get(), "[{\"success\":false, \"errorMessage\":\"fake_error\"}]", + browser(), extensions::api_test_utils::NONE)); EXPECT_FALSE(result.success); EXPECT_EQ("fake_error", result.error); @@ -512,10 +507,8 @@ TEST_F(EasyUnlockPrivateApiTest, AutoPairing) { base::Unretained(&result))); function = new EasyUnlockPrivateSetAutoPairingResultFunction(); ASSERT_TRUE(extension_function_test_utils::RunFunction( - function.get(), - "[{\"success\":true}]", - browser(), - extension_function_test_utils::NONE)); + function.get(), "[{\"success\":true}]", browser(), + extensions::api_test_utils::NONE)); EXPECT_TRUE(result.success); EXPECT_TRUE(result.error.empty()); } diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc index 51661075426..35679e37510 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc +++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.cc @@ -11,6 +11,8 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/enterprise_device_attributes.h" +#include "chromeos/system/statistics_provider.h" +#include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" namespace extensions { @@ -18,23 +20,13 @@ namespace extensions { namespace { // Checks for the current browser context if the user is affiliated. -bool IsPermittedToGetDeviceId(content::BrowserContext* context) { +bool IsPermittedToGetDeviceAttributes(content::BrowserContext* context) { const user_manager::User* user = chromeos::ProfileHelper::Get()->GetUserByProfile( Profile::FromBrowserContext(context)); return user->IsAffiliated(); } -// Returns the directory device id for the permitted extensions or an empty -// string. -std::string GetDirectoryDeviceId(content::BrowserContext* context) { - return IsPermittedToGetDeviceId(context) - ? g_browser_process->platform_part() - ->browser_policy_connector_chromeos() - ->GetDirectoryApiID() - : std::string(); -} - } // namespace EnterpriseDeviceAttributesGetDirectoryDeviceIdFunction:: @@ -45,10 +37,71 @@ EnterpriseDeviceAttributesGetDirectoryDeviceIdFunction:: ExtensionFunction::ResponseAction EnterpriseDeviceAttributesGetDirectoryDeviceIdFunction::Run() { - const std::string device_id = GetDirectoryDeviceId(browser_context()); + std::string device_id; + if (IsPermittedToGetDeviceAttributes(browser_context())) { + device_id = g_browser_process->platform_part() + ->browser_policy_connector_chromeos() + ->GetDirectoryApiID(); + } return RespondNow(ArgumentList( api::enterprise_device_attributes::GetDirectoryDeviceId::Results::Create( device_id))); } +EnterpriseDeviceAttributesGetDeviceSerialNumberFunction:: + EnterpriseDeviceAttributesGetDeviceSerialNumberFunction() {} + +EnterpriseDeviceAttributesGetDeviceSerialNumberFunction:: + ~EnterpriseDeviceAttributesGetDeviceSerialNumberFunction() {} + +ExtensionFunction::ResponseAction +EnterpriseDeviceAttributesGetDeviceSerialNumberFunction::Run() { + std::string serial_number; + if (IsPermittedToGetDeviceAttributes(browser_context())) { + serial_number = chromeos::system::StatisticsProvider::GetInstance() + ->GetEnterpriseMachineID(); + } + return RespondNow(ArgumentList( + api::enterprise_device_attributes::GetDeviceSerialNumber::Results::Create( + serial_number))); +} + +EnterpriseDeviceAttributesGetDeviceAssetIdFunction:: + EnterpriseDeviceAttributesGetDeviceAssetIdFunction() {} + +EnterpriseDeviceAttributesGetDeviceAssetIdFunction:: + ~EnterpriseDeviceAttributesGetDeviceAssetIdFunction() {} + +ExtensionFunction::ResponseAction +EnterpriseDeviceAttributesGetDeviceAssetIdFunction::Run() { + std::string asset_id; + if (IsPermittedToGetDeviceAttributes(browser_context())) { + asset_id = g_browser_process->platform_part() + ->browser_policy_connector_chromeos() + ->GetDeviceAssetID(); + } + return RespondNow(ArgumentList( + api::enterprise_device_attributes::GetDeviceAssetId::Results::Create( + asset_id))); +} + +EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction:: + EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction() {} + +EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction:: + ~EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction() {} + +ExtensionFunction::ResponseAction +EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction::Run() { + std::string annotated_location; + if (IsPermittedToGetDeviceAttributes(browser_context())) { + annotated_location = g_browser_process->platform_part() + ->browser_policy_connector_chromeos() + ->GetDeviceAnnotatedLocation(); + } + return RespondNow(ArgumentList( + api::enterprise_device_attributes::GetDeviceAnnotatedLocation::Results:: + Create(annotated_location))); +} + } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h index ca1d02370c7..3f993c2174d 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h +++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h @@ -24,5 +24,52 @@ class EnterpriseDeviceAttributesGetDirectoryDeviceIdFunction ENTERPRISE_DEVICEATTRIBUTES_GETDIRECTORYDEVICEID); }; +class EnterpriseDeviceAttributesGetDeviceSerialNumberFunction + : public UIThreadExtensionFunction { + public: + EnterpriseDeviceAttributesGetDeviceSerialNumberFunction(); + + protected: + ~EnterpriseDeviceAttributesGetDeviceSerialNumberFunction() override; + + ResponseAction Run() override; + + private: + DECLARE_EXTENSION_FUNCTION( + "enterprise.deviceAttributes.getDeviceSerialNumber", + ENTERPRISE_DEVICEATTRIBUTES_GETDEVICESERIALNUMBER); +}; + +class EnterpriseDeviceAttributesGetDeviceAssetIdFunction + : public UIThreadExtensionFunction { + public: + EnterpriseDeviceAttributesGetDeviceAssetIdFunction(); + + protected: + ~EnterpriseDeviceAttributesGetDeviceAssetIdFunction() override; + + ResponseAction Run() override; + + private: + DECLARE_EXTENSION_FUNCTION("enterprise.deviceAttributes.getDeviceAssetId", + ENTERPRISE_DEVICEATTRIBUTES_GETDEVICEASSETID); +}; + +class EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction + : public UIThreadExtensionFunction { + public: + EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction(); + + protected: + ~EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction() override; + + ResponseAction Run() override; + + private: + DECLARE_EXTENSION_FUNCTION( + "enterprise.deviceAttributes.getDeviceAnnotatedLocation", + ENTERPRISE_DEVICEATTRIBUTES_GETDEVICEANNOTATEDLOCATION); +}; + } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_ENTERPRISE_DEVICE_ATTRIBUTES_ENTERPRISE_DEVICE_ATTRIBUTES_API_H_ diff --git a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc index b4422a1d396..84603c4d929 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc +++ b/chromium/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc @@ -4,7 +4,9 @@ #include <memory> +#include "base/json/json_writer.h" #include "base/strings/stringprintf.h" +#include "base/values.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/policy/affiliation_test_helper.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" @@ -14,6 +16,8 @@ #include "chrome/browser/net/url_request_mock_util.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/dbus/fake_session_manager_client.h" +#include "chromeos/system/fake_statistics_provider.h" +#include "chromeos/system/statistics_provider.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "components/policy/policy_constants.h" @@ -31,6 +35,9 @@ namespace { constexpr char kDeviceId[] = "device_id"; +constexpr char kSerialNumber[] = "serial_number"; +constexpr char kAssetId[] = "asset_id"; +constexpr char kAnnotatedLocation[] = "annotated_location"; constexpr base::FilePath::CharType kTestExtensionDir[] = FILE_PATH_LITERAL("extensions/api_test/enterprise_device_attributes"); constexpr base::FilePath::CharType kUpdateManifestFileName[] = @@ -51,6 +58,21 @@ struct Params { bool affiliated_; }; +base::Value BuildCustomArg(const std::string& expected_directory_device_id, + const std::string& expected_serial_number, + const std::string& expected_asset_id, + const std::string& expected_annotated_location) { + base::Value custom_arg(base::Value::Type::DICTIONARY); + custom_arg.SetKey("expectedDirectoryDeviceId", + base::Value(expected_directory_device_id)); + custom_arg.SetKey("expectedSerialNumber", + base::Value(expected_serial_number)); + custom_arg.SetKey("expectedAssetId", base::Value(expected_asset_id)); + custom_arg.SetKey("expectedAnnotatedLocation", + base::Value(expected_annotated_location)); + return custom_arg; +} + } // namespace namespace extensions { @@ -60,6 +82,8 @@ class EnterpriseDeviceAttributesTest : public ::testing::WithParamInterface<Params> { public: EnterpriseDeviceAttributesTest() { + fake_statistics_provider_.SetMachineStatistic( + chromeos::system::kSerialNumberKey, kSerialNumber); set_exit_when_last_browser_closes(false); set_chromeos_user_ = false; } @@ -110,6 +134,8 @@ class EnterpriseDeviceAttributesTest : policy::DevicePolicyBuilder* device_policy = test_helper_.device_policy(); device_policy->SetDefaultSigningKey(); device_policy->policy_data().set_directory_api_id(kDeviceId); + device_policy->policy_data().set_annotated_asset_id(kAssetId); + device_policy->policy_data().set_annotated_location(kAnnotatedLocation); device_policy->Build(); fake_session_manager_client->set_device_policy(device_policy->GetBlob()); @@ -170,9 +196,15 @@ class EnterpriseDeviceAttributesTest : // only very little functionality from RunExtensionSubtest(). Thus so that // don't make RunExtensionSubtest() to complex we just introduce a new // function. - bool TestExtension(Browser* browser, const std::string& page_url) { + bool TestExtension(Browser* browser, + const std::string& page_url, + const base::Value& custom_arg_value) { DCHECK(!page_url.empty()) << "page_url cannot be empty"; + std::string custom_arg; + base::JSONWriter::Write(custom_arg_value, &custom_arg); + SetCustomArg(custom_arg); + extensions::ResultCatcher catcher; ui_test_utils::NavigateToURL(browser, GURL(page_url)); @@ -190,6 +222,7 @@ class EnterpriseDeviceAttributesTest : private: policy::MockConfigurationPolicyProvider policy_provider_; policy::DevicePolicyCrosTestHelper test_helper_; + chromeos::system::ScopedFakeStatisticsProvider fake_statistics_provider_; }; IN_PROC_BROWSER_TEST_P(EnterpriseDeviceAttributesTest, PRE_Success) { @@ -206,13 +239,21 @@ IN_PROC_BROWSER_TEST_P(EnterpriseDeviceAttributesTest, Success) { EXPECT_EQ(GetParam().affiliated_, user_manager::UserManager::Get()-> FindUser(affiliated_account_id_)->IsAffiliated()); - // Device ID is available only for affiliated user. - std::string device_id = GetParam().affiliated_ ? kDeviceId : ""; + // Device attributes are available only for affiliated user. + std::string expected_directory_device_id = + GetParam().affiliated_ ? kDeviceId : ""; + std::string expected_serial_number = + GetParam().affiliated_ ? kSerialNumber : ""; + std::string expected_asset_id = GetParam().affiliated_ ? kAssetId : ""; + std::string expected_annotated_location = + GetParam().affiliated_ ? kAnnotatedLocation : ""; // Pass the expected value (device_id) to test. - ASSERT_TRUE(TestExtension(CreateBrowser(profile()), - base::StringPrintf("chrome-extension://%s/basic.html?%s", - kTestExtensionID, device_id.c_str()))) + ASSERT_TRUE(TestExtension( + CreateBrowser(profile()), + base::StringPrintf("chrome-extension://%s/basic.html", kTestExtensionID), + BuildCustomArg(expected_directory_device_id, expected_serial_number, + expected_asset_id, expected_annotated_location))) << message_; } diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc index 6ca6aa5a0ef..d974bf51ac0 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc @@ -181,7 +181,8 @@ class EPKChallengeKeyTestBase : public BrowserWithTestWindowTest { std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, std::unique_ptr<base::ListValue> args, Browser* browser) { - utils::RunFunction(function, std::move(args), browser, utils::NONE); + utils::RunFunction(function, std::move(args), browser, + extensions::api_test_utils::NONE); EXPECT_EQ(ExtensionFunction::FAILED, *function->response_type()); return function->GetError(); } @@ -195,7 +196,8 @@ class EPKChallengeKeyTestBase : public BrowserWithTestWindowTest { scoped_refptr<ExtensionFunction> function_owner(function); // Without a callback the function will not generate a result. function->set_has_callback(true); - utils::RunFunction(function, std::move(args), browser, utils::NONE); + utils::RunFunction(function, std::move(args), browser, + extensions::api_test_utils::NONE); EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: " << function->GetError(); const base::Value* single_result = NULL; @@ -324,16 +326,16 @@ TEST_F(EPKChallengeMachineKeyTest, KeyExists) { // GetCertificate must not be called if the key exists. EXPECT_CALL(mock_attestation_flow_, GetCertificate(_, _, _, _, _)).Times(0); - EXPECT_TRUE( - utils::RunFunction(func_.get(), CreateArgs(), browser(), utils::NONE)); + EXPECT_TRUE(utils::RunFunction(func_.get(), CreateArgs(), browser(), + extensions::api_test_utils::NONE)); } TEST_F(EPKChallengeMachineKeyTest, KeyNotRegisteredByDefault) { EXPECT_CALL(mock_async_method_caller_, TpmAttestationRegisterKey(_, _, _, _)) .Times(0); - EXPECT_TRUE( - utils::RunFunction(func_.get(), CreateArgs(), browser(), utils::NONE)); + EXPECT_TRUE(utils::RunFunction(func_.get(), CreateArgs(), browser(), + extensions::api_test_utils::NONE)); } TEST_F(EPKChallengeMachineKeyTest, KeyNotRegistered) { @@ -341,7 +343,7 @@ TEST_F(EPKChallengeMachineKeyTest, KeyNotRegistered) { .Times(0); EXPECT_TRUE(utils::RunFunction(func_.get(), CreateArgsNoRegister(), browser(), - utils::NONE)); + extensions::api_test_utils::NONE)); } TEST_F(EPKChallengeMachineKeyTest, Success) { @@ -514,8 +516,8 @@ TEST_F(EPKChallengeUserKeyTest, KeyExists) { // GetCertificate must not be called if the key exists. EXPECT_CALL(mock_attestation_flow_, GetCertificate(_, _, _, _, _)).Times(0); - EXPECT_TRUE( - utils::RunFunction(func_.get(), CreateArgs(), browser(), utils::NONE)); + EXPECT_TRUE(utils::RunFunction(func_.get(), CreateArgs(), browser(), + extensions::api_test_utils::NONE)); } TEST_F(EPKChallengeUserKeyTest, KeyNotRegistered) { @@ -523,7 +525,7 @@ TEST_F(EPKChallengeUserKeyTest, KeyNotRegistered) { .Times(0); EXPECT_TRUE(utils::RunFunction(func_.get(), CreateArgsNoRegister(), browser(), - utils::NONE)); + extensions::api_test_utils::NONE)); } TEST_F(EPKChallengeUserKeyTest, PersonalDevice) { diff --git a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc index f81fd5c960b..03541c19880 100644 --- a/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api_unittest.cc @@ -320,7 +320,8 @@ TEST_F(EPKPChallengeMachineKeyTest, KeyExists) { EXPECT_CALL(mock_attestation_flow_, GetCertificate(_, _, _, _, _)) .Times(0); - EXPECT_TRUE(utils::RunFunction(func_.get(), kArgs, browser(), utils::NONE)); + EXPECT_TRUE(utils::RunFunction(func_.get(), kArgs, browser(), + extensions::api_test_utils::NONE)); } TEST_F(EPKPChallengeMachineKeyTest, AttestationNotPrepared) { @@ -363,7 +364,7 @@ TEST_P(EPKPChallengeMachineKeyAllProfilesTest, Success) { .Times(1); std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( - func_.get(), kArgs, browser(), utils::NONE)); + func_.get(), kArgs, browser(), extensions::api_test_utils::NONE)); std::string response; value->GetAsString(&response); @@ -490,15 +491,16 @@ TEST_F(EPKPChallengeUserKeyTest, KeyExists) { EXPECT_CALL(mock_attestation_flow_, GetCertificate(_, _, _, _, _)) .Times(0); - EXPECT_TRUE(utils::RunFunction(func_.get(), kArgs, browser(), utils::NONE)); + EXPECT_TRUE(utils::RunFunction(func_.get(), kArgs, browser(), + extensions::api_test_utils::NONE)); } TEST_F(EPKPChallengeUserKeyTest, KeyNotRegistered) { EXPECT_CALL(mock_async_method_caller_, TpmAttestationRegisterKey(_, _, _, _)) .Times(0); - EXPECT_TRUE(utils::RunFunction( - func_.get(), "[\"Y2hhbGxlbmdl\", false]", browser(), utils::NONE)); + EXPECT_TRUE(utils::RunFunction(func_.get(), "[\"Y2hhbGxlbmdl\", false]", + browser(), extensions::api_test_utils::NONE)); } TEST_F(EPKPChallengeUserKeyTest, PersonalDevice) { @@ -533,7 +535,7 @@ TEST_F(EPKPChallengeUserKeyTest, Success) { .Times(1); std::unique_ptr<base::Value> value(utils::RunFunctionAndReturnSingleResult( - func_.get(), kArgs, browser(), utils::NONE)); + func_.get(), kArgs, browser(), extensions::api_test_utils::NONE)); std::string response; value->GetAsString(&response); diff --git a/chromium/chrome/browser/extensions/api/experience_sampling_private/OWNERS b/chromium/chrome/browser/extensions/api/experience_sampling_private/OWNERS deleted file mode 100644 index 885f0ab7205..00000000000 --- a/chromium/chrome/browser/extensions/api/experience_sampling_private/OWNERS +++ /dev/null @@ -1 +0,0 @@ -felt@chromium.org diff --git a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling.cc b/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling.cc deleted file mode 100644 index ebf4250039f..00000000000 --- a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling.cc +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h" - -#include <utility> - -#include "base/values.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/common/extensions/api/experience_sampling_private.h" -#include "extensions/browser/event_router.h" -#include "url/gurl.h" - -namespace extensions { - -// static -const char ExperienceSamplingEvent::kProceed[] = "proceed"; -const char ExperienceSamplingEvent::kDeny[] = "deny"; -const char ExperienceSamplingEvent::kIgnore[] = "ignore"; -const char ExperienceSamplingEvent::kCancel[] = "cancel"; -const char ExperienceSamplingEvent::kReload[] = "reload"; - -// static -const char ExperienceSamplingEvent::kMaliciousDownload[] = - "download_warning_malicious"; -const char ExperienceSamplingEvent::kDangerousDownload[] = - "download_warning_dangerous"; -const char ExperienceSamplingEvent::kDownloadDangerPrompt[] = - "download_danger_prompt"; -const char ExperienceSamplingEvent::kExtensionInstallDialog[] = - "extension_install_dialog_"; - -// static -std::unique_ptr<ExperienceSamplingEvent> ExperienceSamplingEvent::Create( - const std::string& element_name, - const GURL& destination, - const GURL& referrer) { - Profile* profile = NULL; - if (g_browser_process->profile_manager()) - profile = g_browser_process->profile_manager()->GetLastUsedProfile(); - if (!profile) - return std::unique_ptr<ExperienceSamplingEvent>(); - return std::unique_ptr<ExperienceSamplingEvent>(new ExperienceSamplingEvent( - element_name, destination, referrer, profile)); -} - -// static -std::unique_ptr<ExperienceSamplingEvent> ExperienceSamplingEvent::Create( - const std::string& element_name) { - return ExperienceSamplingEvent::Create(element_name, GURL(), GURL()); -} - -ExperienceSamplingEvent::ExperienceSamplingEvent( - const std::string& element_name, - const GURL& destination, - const GURL& referrer, - content::BrowserContext* browser_context) - : has_viewed_details_(false), - has_viewed_learn_more_(false), - browser_context_(browser_context) { - ui_element_.name = element_name; - ui_element_.destination = destination.GetAsReferrer().possibly_invalid_spec(); - ui_element_.referrer = referrer.GetAsReferrer().possibly_invalid_spec(); - ui_element_.time = base::Time::Now().ToJsTime(); -} - -ExperienceSamplingEvent::~ExperienceSamplingEvent() { -} - -void ExperienceSamplingEvent::CreateUserDecisionEvent( - const std::string& decision_name) { - // Check if this is from an incognito context. If it is, don't create and send - // any events. - if (browser_context_ && browser_context_->IsOffTheRecord()) - return; - api::experience_sampling_private::UserDecision decision; - decision.name = decision_name; - decision.learn_more = has_viewed_learn_more(); - decision.details = has_viewed_details(); - decision.time = base::Time::Now().ToJsTime(); - - std::unique_ptr<base::ListValue> args(new base::ListValue()); - args->Append(ui_element_.ToValue()); - args->Append(decision.ToValue()); - std::unique_ptr<Event> event( - new Event(events::EXPERIENCE_SAMPLING_PRIVATE_ON_DECISION, - api::experience_sampling_private::OnDecision::kEventName, - std::move(args))); - EventRouter* router = EventRouter::Get(browser_context_); - if (router) - router->BroadcastEvent(std::move(event)); -} - -void ExperienceSamplingEvent::CreateOnDisplayedEvent() { - // Check if this is from an incognito context. If it is, don't create and send - // any events. - if (browser_context_ && browser_context_->IsOffTheRecord()) - return; - std::unique_ptr<base::ListValue> args(new base::ListValue()); - args->Append(ui_element_.ToValue()); - std::unique_ptr<Event> event( - new Event(events::EXPERIENCE_SAMPLING_PRIVATE_ON_DISPLAYED, - api::experience_sampling_private::OnDisplayed::kEventName, - std::move(args))); - EventRouter* router = EventRouter::Get(browser_context_); - if (router) - router->BroadcastEvent(std::move(event)); -} - -} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h b/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h deleted file mode 100644 index 30f6a68f0d2..00000000000 --- a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_API_EXPERIENCE_SAMPLING_PRIVATE_EXPERIENCE_SAMPLING_H_ -#define CHROME_BROWSER_EXTENSIONS_API_EXPERIENCE_SAMPLING_PRIVATE_EXPERIENCE_SAMPLING_H_ - -#include <memory> - -#include "base/macros.h" -#include "chrome/common/extensions/api/experience_sampling_private.h" - -namespace content { -class BrowserContext; -} - -class GURL; - -namespace extensions { - -using api::experience_sampling_private::UIElement; - -class ExperienceSamplingEvent { - public: - // String constants for user decision events. - static const char kProceed[]; - static const char kDeny[]; - static const char kIgnore[]; - static const char kCancel[]; - static const char kReload[]; - - // String constants for event names. - static const char kMaliciousDownload[]; - static const char kDangerousDownload[]; - static const char kDownloadDangerPrompt[]; - static const char kExtensionInstallDialog[]; - - // The Create() functions can return an empty scoped_ptr if they cannot find - // the BrowserContext. Code using them should check the scoped pointer using - // scoped_ptr::get(). - static std::unique_ptr<ExperienceSamplingEvent> Create( - const std::string& element_name, - const GURL& destination, - const GURL& referrer); - - static std::unique_ptr<ExperienceSamplingEvent> Create( - const std::string& element_name); - - ExperienceSamplingEvent(const std::string& element_name, - const GURL& destination, - const GURL& referrer, - content::BrowserContext* browser_context); - ~ExperienceSamplingEvent(); - - // Sends an extension API event for the user seeing this event. - void CreateOnDisplayedEvent(); - // Sends an extension API event for the user making a decision about this - // event. - void CreateUserDecisionEvent(const std::string& decision_name); - - bool has_viewed_details() const { return has_viewed_details_; } - void set_has_viewed_details(bool viewed) { has_viewed_details_ = viewed; } - bool has_viewed_learn_more() const { return has_viewed_learn_more_; } - void set_has_viewed_learn_more(bool viewed) { - has_viewed_learn_more_ = viewed; - } - - private: - bool has_viewed_details_; - bool has_viewed_learn_more_; - content::BrowserContext* browser_context_; - UIElement ui_element_; - - DISALLOW_COPY_AND_ASSIGN(ExperienceSamplingEvent); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_API_EXPERIENCE_SAMPLING_PRIVATE_EXPERIENCE_SAMPLING_H_ diff --git a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.cc b/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.cc deleted file mode 100644 index f212226b785..00000000000 --- a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.cc +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.h" - -#include "base/metrics/field_trial.h" -#include "chrome/common/extensions/api/experience_sampling_private.h" - -namespace sampling = extensions::api::experience_sampling_private; - -namespace extensions { - -bool ExperienceSamplingPrivateGetBrowserInfoFunction::RunAsync() { - std::string field_trials; - sampling::BrowserInfo info; - - base::FieldTrialList::StatesToString(&field_trials); - info.variations = field_trials; - - SetResult(info.ToValue()); - SendResponse(true /* success */); - return true; -} - -} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.h b/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.h deleted file mode 100644 index e199f288704..00000000000 --- a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_EXTENSIONS_API_EXPERIENCE_SAMPLING_PRIVATE_EXPERIENCE_SAMPLING_PRIVATE_API_H_ -#define CHROME_BROWSER_EXTENSIONS_API_EXPERIENCE_SAMPLING_PRIVATE_EXPERIENCE_SAMPLING_PRIVATE_API_H_ - -#include "chrome/browser/extensions/chrome_extension_function.h" - -namespace extensions { - -class ExperienceSamplingPrivateGetBrowserInfoFunction - : public ChromeAsyncExtensionFunction { - protected: - ~ExperienceSamplingPrivateGetBrowserInfoFunction() override {} - - // ExtensionFuction: - bool RunAsync() override; - - private: - DECLARE_EXTENSION_FUNCTION("experienceSamplingPrivate.getBrowserInfo", - EXPERIENCESAMPLINGPRIVATE_GETBROWSERINFO); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_EXTENSIONS_API_EXPERIENCE_SAMPLING_PRIVATE_EXPERIENCE_SAMPLING_PRIVATE_API_H_ diff --git a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api_unittest.cc b/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api_unittest.cc deleted file mode 100644 index e71b6037c51..00000000000 --- a/chromium/chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api_unittest.cc +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/metrics/field_trial.h" -#include "chrome/browser/extensions/api/experience_sampling_private/experience_sampling_private_api.h" -#include "chrome/browser/extensions/extension_api_unittest.h" -#include "chrome/browser/extensions/extension_function_test_utils.h" - - -namespace utils = extension_function_test_utils; - -namespace extensions { - -typedef ExtensionApiUnittest ExperienceSamplingPrivateTest; - -// Tests that chrome.experienceSamplingPrivate.getBrowserInfo() returns expected -// field trials and groups. -TEST_F(ExperienceSamplingPrivateTest, GetBrowserInfoTest) { - // Start with an empty FieldTrialList. - std::unique_ptr<base::FieldTrialList> trial_list( - new base::FieldTrialList(nullptr)); - std::unique_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( - new ExperienceSamplingPrivateGetBrowserInfoFunction(), "[]")); - ASSERT_TRUE(result->HasKey("variations")); - std::string trials_string; - EXPECT_TRUE(result->GetStringWithoutPathExpansion("variations", - &trials_string)); - ASSERT_EQ("", trials_string); - - // Set field trials using a string. - base::FieldTrialList::CreateTrialsFromString( - "*Some name/Winner/*xxx/yyyy/*zzz/default/", - std::set<std::string>()); - result = RunFunctionAndReturnDictionary( - new ExperienceSamplingPrivateGetBrowserInfoFunction(), "[]"); - ASSERT_TRUE(result->HasKey("variations")); - EXPECT_TRUE(result->GetStringWithoutPathExpansion("variations", - &trials_string)); - ASSERT_EQ("Some name/Winner/xxx/yyyy/zzz/default/", trials_string); -} - -} // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc index c057b5bebfb..35432dbe223 100644 --- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc +++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc @@ -12,7 +12,6 @@ #include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" -#include "chrome/browser/extensions/browser_action_test_util.h" #include "chrome/browser/extensions/extension_action.h" #include "chrome/browser/extensions/extension_action_icon_factory.h" #include "chrome/browser/extensions/extension_action_manager.h" @@ -26,6 +25,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/extensions/browser_action_test_util.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" @@ -1020,7 +1020,7 @@ IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, DownloadViaPost) { downloads_observer.WaitForFinished(); EXPECT_EQ(0u, downloads_observer.NumDangerousDownloadsSeen()); EXPECT_EQ(1u, downloads_observer.NumDownloadsSeenInState( - content::DownloadItem::COMPLETE)); + download::DownloadItem::COMPLETE)); EXPECT_TRUE(base::PathExists(downloads_directory->GetPath().AppendASCII( "download-test3-attachment.gif"))); diff --git a/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc index d2a853e242d..f709e6c9f33 100644 --- a/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc +++ b/chromium/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc @@ -7,7 +7,6 @@ #include "base/run_loop.h" #include "base/test/test_timeouts.h" #include "build/build_config.h" -#include "chrome/browser/extensions/browser_action_test_util.h" #include "chrome/browser/extensions/extension_action.h" #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/extensions/extension_apitest.h" @@ -18,6 +17,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/extensions/browser_action_test_util.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/toolbar/toolbar_actions_model.h" #include "chrome/test/base/interactive_test_utils.h" @@ -134,16 +134,23 @@ class BrowserActionInteractiveTest : public ExtensionApiTest { } // Open an extension popup via the chrome.browserAction.openPopup API. + // If |will_reply| is true, then the listener is responsible for having a + // test message listener that replies to the extension. Otherwise, this + // method will create a listener and reply to the extension before returning + // to avoid leaking an API function while waiting for a reply. void OpenPopupViaAPI(bool will_reply) { // Setup the notification observer to wait for the popup to finish loading. content::WindowedNotificationObserver frame_observer( content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, content::NotificationService::AllSources()); - ExtensionTestMessageListener listener("ready", will_reply); + std::unique_ptr<ExtensionTestMessageListener> listener; + if (!will_reply) + listener = std::make_unique<ExtensionTestMessageListener>("ready", false); // Show first popup in first window and expect it to have loaded. ASSERT_TRUE(RunExtensionSubtest("browser_action/open_popup", "open_popup_succeeds.html")) << message_; - EXPECT_TRUE(listener.WaitUntilSatisfied()); + if (listener) + EXPECT_TRUE(listener->WaitUntilSatisfied()); frame_observer.Wait(); EnsurePopupActive(); } @@ -446,21 +453,20 @@ IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, } #if defined(OS_WIN) -// Test that forcibly closing the browser and popup HWND does not cause a crash. -// http://crbug.com/400646 -IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, - DISABLED_DestroyHWNDDoesNotCrash) { +// Forcibly closing a browser HWND with a popup should not cause a crash. +IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, DestroyHWNDDoesNotCrash) { if (!ShouldRunPopupTest()) return; OpenPopupViaAPI(false); BrowserActionTestUtil test_util(browser()); - const gfx::NativeView view = test_util.GetPopupNativeView(); - EXPECT_NE(static_cast<gfx::NativeView>(NULL), view); - const HWND hwnd = views::HWNDForNativeView(view); - EXPECT_EQ(hwnd, - views::HWNDForNativeView(browser()->window()->GetNativeWindow())); - EXPECT_EQ(TRUE, ::IsWindow(hwnd)); + const gfx::NativeView popup_view = test_util.GetPopupNativeView(); + EXPECT_NE(static_cast<gfx::NativeView>(nullptr), popup_view); + const HWND popup_hwnd = views::HWNDForNativeView(popup_view); + EXPECT_EQ(TRUE, ::IsWindow(popup_hwnd)); + const HWND browser_hwnd = + views::HWNDForNativeView(browser()->window()->GetNativeWindow()); + EXPECT_EQ(TRUE, ::IsWindow(browser_hwnd)); // Create a new browser window to prevent the message loop from terminating. browser()->OpenURL(content::OpenURLParams(GURL("about:"), content::Referrer(), @@ -468,9 +474,10 @@ IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveTest, ui::PAGE_TRANSITION_TYPED, false)); // Forcibly closing the browser HWND should not cause a crash. - EXPECT_EQ(TRUE, ::CloseWindow(hwnd)); - EXPECT_EQ(TRUE, ::DestroyWindow(hwnd)); - EXPECT_EQ(FALSE, ::IsWindow(hwnd)); + EXPECT_EQ(TRUE, ::CloseWindow(browser_hwnd)); + EXPECT_EQ(TRUE, ::DestroyWindow(browser_hwnd)); + EXPECT_EQ(FALSE, ::IsWindow(browser_hwnd)); + EXPECT_EQ(FALSE, ::IsWindow(popup_hwnd)); } #endif // OS_WIN diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc index 017614b8028..6466d63c75f 100644 --- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc +++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_api.cc @@ -96,31 +96,31 @@ static base::LazyInstance<BrowserContextKeyedAPIFactory<ExtensionActionAPI>>:: ExtensionActionAPI::ExtensionActionAPI(content::BrowserContext* context) : browser_context_(context), extension_prefs_(nullptr) { - ExtensionFunctionRegistry* registry = + ExtensionFunctionRegistry& registry = ExtensionFunctionRegistry::GetInstance(); // Browser Actions - registry->RegisterFunction<BrowserActionSetIconFunction>(); - registry->RegisterFunction<BrowserActionSetTitleFunction>(); - registry->RegisterFunction<BrowserActionSetBadgeTextFunction>(); - registry->RegisterFunction<BrowserActionSetBadgeBackgroundColorFunction>(); - registry->RegisterFunction<BrowserActionSetPopupFunction>(); - registry->RegisterFunction<BrowserActionGetTitleFunction>(); - registry->RegisterFunction<BrowserActionGetBadgeTextFunction>(); - registry->RegisterFunction<BrowserActionGetBadgeBackgroundColorFunction>(); - registry->RegisterFunction<BrowserActionGetPopupFunction>(); - registry->RegisterFunction<BrowserActionEnableFunction>(); - registry->RegisterFunction<BrowserActionDisableFunction>(); - registry->RegisterFunction<BrowserActionOpenPopupFunction>(); + registry.RegisterFunction<BrowserActionSetIconFunction>(); + registry.RegisterFunction<BrowserActionSetTitleFunction>(); + registry.RegisterFunction<BrowserActionSetBadgeTextFunction>(); + registry.RegisterFunction<BrowserActionSetBadgeBackgroundColorFunction>(); + registry.RegisterFunction<BrowserActionSetPopupFunction>(); + registry.RegisterFunction<BrowserActionGetTitleFunction>(); + registry.RegisterFunction<BrowserActionGetBadgeTextFunction>(); + registry.RegisterFunction<BrowserActionGetBadgeBackgroundColorFunction>(); + registry.RegisterFunction<BrowserActionGetPopupFunction>(); + registry.RegisterFunction<BrowserActionEnableFunction>(); + registry.RegisterFunction<BrowserActionDisableFunction>(); + registry.RegisterFunction<BrowserActionOpenPopupFunction>(); // Page Actions - registry->RegisterFunction<PageActionShowFunction>(); - registry->RegisterFunction<PageActionHideFunction>(); - registry->RegisterFunction<PageActionSetIconFunction>(); - registry->RegisterFunction<PageActionSetTitleFunction>(); - registry->RegisterFunction<PageActionSetPopupFunction>(); - registry->RegisterFunction<PageActionGetTitleFunction>(); - registry->RegisterFunction<PageActionGetPopupFunction>(); + registry.RegisterFunction<PageActionShowFunction>(); + registry.RegisterFunction<PageActionHideFunction>(); + registry.RegisterFunction<PageActionSetIconFunction>(); + registry.RegisterFunction<PageActionSetTitleFunction>(); + registry.RegisterFunction<PageActionSetPopupFunction>(); + registry.RegisterFunction<PageActionGetTitleFunction>(); + registry.RegisterFunction<PageActionGetPopupFunction>(); } ExtensionActionAPI::~ExtensionActionAPI() { @@ -226,8 +226,9 @@ void ExtensionActionAPI::DispatchExtensionActionClicked( if (event_name) { std::unique_ptr<base::ListValue> args(new base::ListValue()); - args->Append( - ExtensionTabUtil::CreateTabObject(web_contents, extension)->ToValue()); + args->Append(ExtensionTabUtil::CreateTabObject( + web_contents, ExtensionTabUtil::kScrubTab, extension) + ->ToValue()); DispatchEventToExtension(web_contents->GetBrowserContext(), extension_action.extension_id(), histogram_value, diff --git a/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc b/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc index abc8ca885cc..8aaa5170ffd 100644 --- a/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc +++ b/chromium/chrome/browser/extensions/api/extension_action/extension_action_apitest.cc @@ -11,12 +11,12 @@ #include "base/strings/stringprintf.h" #include "chrome/browser/extensions/browsertest_util.h" #include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "extensions/browser/state_store.h" #include "extensions/test/extension_test_message_listener.h" +#include "extensions/test/test_extension_dir.h" namespace extensions { namespace { diff --git a/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc b/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc index af719794f36..0815a0b5907 100644 --- a/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc +++ b/chromium/chrome/browser/extensions/api/file_system/request_file_system_notification.cc @@ -19,10 +19,10 @@ #include "chrome/grit/generated_resources.h" #include "extensions/common/extension.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/message_center/notification.h" -#include "ui/message_center/notification_delegate.h" -#include "ui/message_center/notification_types.h" -#include "ui/message_center/notifier_id.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notification_delegate.h" +#include "ui/message_center/public/cpp/notification_types.h" +#include "ui/message_center/public/cpp/notifier_id.h" using file_manager::Volume; using message_center::Notification; diff --git a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc index 7c80a0cf2c0..373c8081e5f 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chromium/chrome/browser/extensions/api/identity/identity_apitest.cc @@ -518,8 +518,8 @@ class IdentityGetAccountsFunctionTest : public IdentityTestWithSignin { new IdentityGetAccountsFunction); func->set_extension( ExtensionBuilder("Test").SetID(kExtensionId).Build().get()); - if (!utils::RunFunction( - func.get(), std::string("[]"), browser(), utils::NONE)) { + if (!utils::RunFunction(func.get(), std::string("[]"), browser(), + api_test_utils::NONE)) { return GenerateFailureResult(accounts, NULL) << "getAccounts did not return a result."; } @@ -819,7 +819,7 @@ class GetAuthTokenFunctionTest const OAuth2TokenService::ScopeSet& scopes) override { if (on_access_token_requested_.is_null()) return; - base::ResetAndReturn(&on_access_token_requested_).Run(); + std::move(on_access_token_requested_).Run(); } std::string extension_id_; @@ -2020,10 +2020,8 @@ class RemoveCachedAuthTokenFunctionTest : public ExtensionBrowserTest { func->set_extension( ExtensionBuilder("Test").SetID(kExtensionId).Build().get()); return utils::RunFunction( - func.get(), - std::string("[{\"token\": \"") + kAccessToken + "\"}]", - browser(), - extension_function_test_utils::NONE); + func.get(), std::string("[{\"token\": \"") + kAccessToken + "\"}]", + browser(), api_test_utils::NONE); } IdentityAPI* id_api() { diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.cc index 6281011f2f0..00eb5916020 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.cc +++ b/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.cc @@ -10,8 +10,8 @@ #include "components/signin/core/browser/profile_management_switches.h" #include "content/public/browser/browser_context.h" #include "content/public/common/service_manager_connection.h" -#include "services/identity/public/interfaces/account.mojom.h" -#include "services/identity/public/interfaces/constants.mojom.h" +#include "services/identity/public/mojom/account.mojom.h" +#include "services/identity/public/mojom/constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.h b/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.h index 1e3973c8d5d..9f9aab7b280 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.h +++ b/chromium/chrome/browser/extensions/api/identity/identity_get_accounts_function.h @@ -7,7 +7,7 @@ #include "extensions/browser/extension_function.h" #include "extensions/browser/extension_function_histogram_value.h" -#include "services/identity/public/interfaces/identity_manager.mojom.h" +#include "services/identity/public/mojom/identity_manager.mojom.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc index 3d31a6e98d9..ad7069a0f30 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc +++ b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.cc @@ -28,7 +28,7 @@ #include "extensions/common/extension_l10n_util.h" #include "google_apis/gaia/gaia_urls.h" #include "services/identity/public/cpp/scope_set.h" -#include "services/identity/public/interfaces/constants.mojom.h" +#include "services/identity/public/mojom/constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" #if defined(OS_CHROMEOS) diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h index bfaca4ed14e..ed99f975a37 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h +++ b/chromium/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h @@ -13,7 +13,7 @@ #include "google_apis/gaia/oauth2_mint_token_flow.h" #include "google_apis/gaia/oauth2_token_service.h" #include "services/identity/public/cpp/account_state.h" -#include "services/identity/public/interfaces/identity_manager.mojom.h" +#include "services/identity/public/mojom/identity_manager.mojom.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc index 085f4c7b41c..b5bf6028018 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc +++ b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc @@ -10,7 +10,7 @@ #include "content/public/common/service_manager_connection.h" #include "extensions/common/extension.h" #include "extensions/common/permissions/permissions_data.h" -#include "services/identity/public/interfaces/constants.mojom.h" +#include "services/identity/public/mojom/constants.mojom.h" #include "services/service_manager/public/cpp/connector.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h index 17a201c0649..72d93ab920a 100644 --- a/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h +++ b/chromium/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h @@ -9,7 +9,7 @@ #include "extensions/browser/extension_function.h" #include "extensions/browser/extension_function_histogram_value.h" #include "services/identity/public/cpp/account_state.h" -#include "services/identity/public/interfaces/identity_manager.mojom.h" +#include "services/identity/public/mojom/identity_manager.mojom.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc index 2c4dc2e4cf4..ddcd1a3b317 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc +++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_private_apitest.cc @@ -69,7 +69,6 @@ class ImageWriterPrivateApiTest : public ExtensionApiTest { protected: - base::MessageLoopForUI message_loop_; image_writer::ImageWriterTestUtils test_utils_; }; diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc index 7d81d3c4a6e..8510dfde7a0 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc +++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.cc @@ -11,7 +11,7 @@ #include "base/optional.h" #include "base/threading/thread_restrictions.h" #include "chrome/grit/generated_resources.h" -#include "chrome/services/removable_storage_writer/public/interfaces/constants.mojom.h" +#include "chrome/services/removable_storage_writer/public/mojom/constants.mojom.h" #include "content/public/browser/browser_thread.h" #include "mojo/public/cpp/bindings/binding.h" #include "services/service_manager/public/cpp/connector.h" diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h index 3ab0136b017..6ac29f5ab5e 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h +++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h @@ -15,7 +15,7 @@ #include "base/memory/ref_counted.h" #include "base/sequence_checker.h" #include "base/sequenced_task_runner.h" -#include "chrome/services/removable_storage_writer/public/interfaces/removable_storage_writer.mojom.h" +#include "chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom.h" namespace service_manager { class Connector; diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc index 68e923f6766..5c0a2ce7983 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc @@ -15,7 +15,7 @@ #include "base/task_scheduler/post_task.h" #include "base/threading/thread_restrictions.h" #include "chrome/browser/extensions/api/image_writer_private/operation.h" -#include "chrome/services/removable_storage_writer/public/interfaces/removable_storage_writer.mojom.h" +#include "chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom.h" #include "chrome/test/base/in_process_browser_test.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/service_manager_connection.h" diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/operation.cc b/chromium/chrome/browser/extensions/api/image_writer_private/operation.cc index 8c89c0334bb..58739bb2437 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/operation.cc +++ b/chromium/chrome/browser/extensions/api/image_writer_private/operation.cc @@ -251,8 +251,8 @@ void Operation::GetMD5SumOfFile( } } - PostTask(base::BindOnce(&Operation::MD5Chunk, this, Passed(std::move(file)), - 0, file_size, progress_offset, progress_scale, + PostTask(base::BindOnce(&Operation::MD5Chunk, this, std::move(file), 0, + file_size, progress_offset, progress_scale, std::move(callback))); } @@ -294,10 +294,9 @@ void Operation::MD5Chunk( progress_offset; SetProgress(percent_curr); - PostTask(base::BindOnce(&Operation::MD5Chunk, this, - Passed(std::move(file)), bytes_processed + len, - bytes_total, progress_offset, progress_scale, - std::move(callback))); + PostTask(base::BindOnce( + &Operation::MD5Chunk, this, std::move(file), bytes_processed + len, + bytes_total, progress_offset, progress_scale, std::move(callback))); // Skip closing the file. return; } else { diff --git a/chromium/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc b/chromium/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc index fcff500fa4c..3f0a8bceef5 100644 --- a/chromium/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc +++ b/chromium/chrome/browser/extensions/api/image_writer_private/operation_unittest.cc @@ -260,7 +260,7 @@ TEST_F(ImageWriterOperationTest, VerifyFileFailure) { test_utils_.GetDevicePath(), kDevicePattern, kTestFileSize); operation_->Start(); - operation_->VerifyWrite(base::Bind(&base::DoNothing)); + operation_->VerifyWrite(base::DoNothing()); content::RunAllTasksUntilIdle(); } #endif // !defined(OS_CHROMEOS) diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc index efd57030204..6d1fd598890 100644 --- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc +++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.cc @@ -13,6 +13,7 @@ #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" #include "extensions/browser/extension_registry.h" +#include "ui/base/ime/ime_bridge.h" #include "ui/keyboard/keyboard_util.h" namespace input_ime = extensions::api::input_ime; @@ -413,6 +414,9 @@ InputImeAPI::~InputImeAPI() = default; void InputImeAPI::Shutdown() { EventRouter::Get(browser_context_)->UnregisterObserver(this); registrar_.RemoveAll(); + if (observer_ && ui::IMEBridge::Get()) { + ui::IMEBridge::Get()->SetObserver(nullptr); + } } static base::LazyInstance<BrowserContextKeyedAPIFactory<InputImeAPI>>:: diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h index 511b1fc2dfb..6aba7251fcf 100644 --- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h +++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api.h @@ -24,6 +24,7 @@ #include "extensions/browser/extension_function.h" #include "extensions/browser/extension_registry_observer.h" #include "extensions/common/extension.h" +#include "ui/base/ime/ime_bridge_observer.h" #include "ui/base/ime/ime_engine_handler_interface.h" #include "ui/base/ime/text_input_flags.h" @@ -62,7 +63,6 @@ class ImeObserver : public input_method::InputMethodEngineBase::Observer { int cursor_pos, int anchor_pos, int offset_pos) override; - void OnRequestEngineSwitch() override {} protected: // Helper function used to forward the given event to the |profile_|'s event @@ -176,6 +176,7 @@ class InputImeAPI : public BrowserContextKeyedAPI, // BrowserContextKeyedAPI implementation. static BrowserContextKeyedAPIFactory<InputImeAPI>* GetFactoryInstance(); + void Shutdown() override; // ExtensionRegistryObserver implementation. @@ -210,6 +211,8 @@ class InputImeAPI : public BrowserContextKeyedAPI, extension_registry_observer_; content::NotificationRegistrar registrar_; + + std::unique_ptr<ui::IMEBridgeObserver> observer_; }; InputImeEventRouter* GetInputImeEventRouter(Profile* profile); diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.cc index 11bccc7e86d..76519202074 100644 --- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.cc +++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.cc @@ -63,6 +63,20 @@ bool IsInputImeEnabled() { switches::kDisableInputImeAPI); } +class ImeBridgeObserver : public ui::IMEBridgeObserver { + public: + void OnRequestSwitchEngine() override { + Browser* browser = chrome::FindLastActive(); + if (!browser) + return; + extensions::InputImeEventRouter* router = + extensions::GetInputImeEventRouter(browser->profile()); + if (!router) + return; + ui::IMEBridge::Get()->SetCurrentEngineHandler(router->active_engine()); + } +}; + class ImeObserverNonChromeOS : public ui::ImeObserver { public: ImeObserverNonChromeOS(const std::string& extension_id, Profile* profile) @@ -94,17 +108,6 @@ class ImeObserverNonChromeOS : public ui::ImeObserver { OnCompositionBoundsChanged::kEventName, std::move(args)); } - void OnRequestEngineSwitch() override { - Browser* browser = chrome::FindLastActive(); - if (!browser) - return; - extensions::InputImeEventRouter* router = - extensions::GetInputImeEventRouter(browser->profile()); - if (!router) - return; - ui::IMEBridge::Get()->SetCurrentEngineHandler(router->active_engine()); - } - private: // ImeObserver overrides. void DispatchEventToExtension( @@ -145,6 +148,10 @@ void InputImeAPI::OnExtensionLoaded(content::BrowserContext* browser_context, const Extension* extension) { // No-op if called multiple times. ui::IMEBridge::Initialize(); + if (!observer_) { + observer_ = std::make_unique<ImeBridgeObserver>(); + ui::IMEBridge::Get()->SetObserver(observer_.get()); + } // Set the preference kPrefNeverActivatedSinceLoaded true to indicate // input.ime.activate API has been never called since loaded. diff --git a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc index e42d686bd00..59177c3676e 100644 --- a/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc +++ b/chromium/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc @@ -12,6 +12,7 @@ #include <utility> #include <vector> +#include "base/containers/flat_set.h" #include "base/feature_list.h" #include "base/stl_util.h" #include "base/strings/string16.h" @@ -32,6 +33,7 @@ #include "chrome/common/extensions/api/language_settings_private.h" #include "chrome/common/pref_names.h" #include "components/language/core/browser/language_model.h" +#include "components/language/core/common/locale_util.h" #include "components/spellcheck/common/spellcheck_common.h" #include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_prefs.h" @@ -178,15 +180,14 @@ LanguageSettingsPrivateGetLanguageListFunction::Run() { app_locale, translate_prefs->IsTranslateAllowedByPolicy(), &languages); // Get the list of available locales (display languages) and convert to a set. - const std::vector<std::string>& locales = l10n_util::GetAvailableLocales(); - const std::unordered_set<std::string> locale_set(locales.begin(), - locales.end()); + const base::flat_set<std::string> locale_set( + l10n_util::GetAvailableLocales()); // Get the list of spell check languages and convert to a set. std::vector<std::string> spellcheck_languages = spellcheck::SpellCheckLanguages(); - const std::unordered_set<std::string> spellcheck_language_set( - spellcheck_languages.begin(), spellcheck_languages.end()); + const base::flat_set<std::string> spellcheck_language_set( + std::move(spellcheck_languages)); // Build the language list. std::unique_ptr<base::ListValue> language_list(new base::ListValue); @@ -198,15 +199,20 @@ LanguageSettingsPrivateGetLanguageListFunction::Run() { language.native_display_name = entry.native_display_name; // Set optional fields only if they differ from the default. - if (locale_set.count(entry.code) > 0) { - language.supports_ui.reset(new bool(true)); - } - if (spellcheck_language_set.count(entry.code) > 0) { + if (base::ContainsKey(spellcheck_language_set, entry.code)) { language.supports_spellcheck.reset(new bool(true)); } if (entry.supports_translate) { language.supports_translate.reset(new bool(true)); } + if (base::FeatureList::IsEnabled(translate::kRegionalLocalesAsDisplayUI)) { + std::string temp_locale = entry.code; + if (language::ConvertToActualUILocale(&temp_locale)) { + language.supports_ui.reset(new bool(true)); + } + } else if (base::ContainsKey(locale_set, entry.code)) { + language.supports_ui.reset(new bool(true)); + } language_list->Append(language.ToValue()); } diff --git a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc index 12e2e46e9c2..8e1ad435a91 100644 --- a/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc +++ b/chromium/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc @@ -27,8 +27,6 @@ #include "chrome/common/web_application_info.h" #include "components/favicon/core/favicon_service.h" #include "content/public/browser/browser_context.h" -#include "content/public/browser/utility_process_host.h" -#include "content/public/browser/utility_process_host_client.h" #include "content/public/browser/web_contents.h" #include "content/public/common/service_manager_connection.h" #include "extensions/browser/api/management/management_api.h" diff --git a/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc index c4cae1b7845..e144c34a723 100644 --- a/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/management/management_api_browsertest.cc @@ -216,10 +216,8 @@ class ExtensionManagementApiEscalationTest : function->SetRenderFrameHost(browser()->tab_strip_model()-> GetActiveWebContents()->GetMainFrame()); bool response = util::RunFunction( - function.get(), - base::StringPrintf("[\"%s\", %s]", kId, enabled_string), - browser(), - util::NONE); + function.get(), base::StringPrintf("[\"%s\", %s]", kId, enabled_string), + browser(), api_test_utils::NONE); if (expected_error.empty()) { EXPECT_EQ(true, response); } else { diff --git a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc index 15518413297..4ffb76c9097 100644 --- a/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/management/management_api_unittest.cc @@ -81,7 +81,7 @@ bool ManagementApiUnitTest::RunFunction( const base::ListValue& args) { return extension_function_test_utils::RunFunction( function.get(), base::WrapUnique(args.DeepCopy()), browser(), - extension_function_test_utils::NONE); + api_test_utils::NONE); } void ManagementApiUnitTest::SetUp() { diff --git a/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc b/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc index b2e8d86bea0..b2acf5e8de8 100644 --- a/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc +++ b/chromium/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc @@ -27,7 +27,7 @@ #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" #include "chrome/common/chrome_paths.h" -#include "components/nacl/common/features.h" +#include "components/nacl/common/buildflags.h" #include "components/storage_monitor/storage_info.h" #include "components/storage_monitor/storage_monitor.h" #include "content/public/browser/web_contents.h" diff --git a/chromium/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc b/chromium/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc index 46218419192..4b96ce3fc8f 100644 --- a/chromium/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc +++ b/chromium/chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.cc @@ -4,6 +4,8 @@ #include "chrome/browser/extensions/api/media_perception_private/media_perception_api_delegate_chromeos.h" +#include "base/bind.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/cros_component_installer.h" namespace media_perception = extensions::api::media_perception_private; @@ -30,6 +32,13 @@ std::string GetComponentNameForComponentType( return ""; } +void OnLoadComponent( + MediaPerceptionAPIDelegate::LoadCrOSComponentCallback load_callback, + component_updater::CrOSComponentManager::Error error, + const base::FilePath& mount_point) { + std::move(load_callback).Run(mount_point); +} + } // namespace MediaPerceptionAPIDelegateChromeOS::MediaPerceptionAPIDelegateChromeOS() = @@ -43,7 +52,7 @@ void MediaPerceptionAPIDelegateChromeOS::LoadCrOSComponent( g_browser_process->platform_part()->cros_component_manager()->Load( GetComponentNameForComponentType(type), component_updater::CrOSComponentManager::MountPolicy::kMount, - std::move(load_callback)); + base::BindOnce(OnLoadComponent, std::move(load_callback))); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc b/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc index eeaa8191412..37f434a3de3 100644 --- a/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc +++ b/chromium/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc @@ -82,7 +82,13 @@ std::unique_ptr<base::DictionaryValue> ChromeMessagingDelegate::MaybeGetTabInfo( // Only the tab id is useful to platform apps for internal use. The // unnecessary bits will be stripped out in // MessagingBindings::DispatchOnConnect(). - return ExtensionTabUtil::CreateTabObject(web_contents)->ToValue(); + // Note: We don't bother scrubbing the tab object, because this is only + // reached as a result of a tab (or content script) messaging the extension. + // We need the extension to see the sender so that it can validate if it + // trusts it or not. + return ExtensionTabUtil::CreateTabObject( + web_contents, ExtensionTabUtil::kDontScrubTab, nullptr) + ->ToValue(); } return nullptr; } diff --git a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc index 17963d18b30..7171d6263c3 100644 --- a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc +++ b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.cc @@ -36,11 +36,6 @@ IncognitoConnectabilityInfoBarDelegate:: } } -infobars::InfoBarDelegate::Type -IncognitoConnectabilityInfoBarDelegate::GetInfoBarType() const { - return PAGE_ACTION_TYPE; -} - infobars::InfoBarDelegate::InfoBarIdentifier IncognitoConnectabilityInfoBarDelegate::GetIdentifier() const { return INCOGNITO_CONNECTABILITY_INFOBAR_DELEGATE; diff --git a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h index 8b067019516..002dfe9c733 100644 --- a/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h +++ b/chromium/chrome/browser/extensions/api/messaging/incognito_connectability_infobar_delegate.h @@ -36,7 +36,6 @@ class IncognitoConnectabilityInfoBarDelegate : public ConfirmInfoBarDelegate { ~IncognitoConnectabilityInfoBarDelegate() override; // ConfirmInfoBarDelegate: - Type GetInfoBarType() const override; infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; base::string16 GetMessageText() const override; base::string16 GetButtonLabel(InfoBarButton button) const override; diff --git a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc index a0cf87625fd..53effb4a1dd 100644 --- a/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc +++ b/chromium/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc @@ -24,7 +24,6 @@ #include "base/strings/stringprintf.h" #include "base/test/test_timeouts.h" #include "base/threading/platform_thread.h" -#include "base/threading/sequenced_worker_pool.h" #include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/extensions/api/messaging/native_messaging_test_util.h" diff --git a/chromium/chrome/browser/extensions/api/messaging/native_process_launcher.cc b/chromium/chrome/browser/extensions/api/messaging/native_process_launcher.cc index ec99eaed500..0d36259d062 100644 --- a/chromium/chrome/browser/extensions/api/messaging/native_process_launcher.cc +++ b/chromium/chrome/browser/extensions/api/messaging/native_process_launcher.cc @@ -16,7 +16,6 @@ #include "base/memory/ref_counted.h" #include "base/strings/stringprintf.h" #include "base/task_scheduler/post_task.h" -#include "base/threading/sequenced_worker_pool.h" #include "build/build_config.h" #include "chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h" #include "chrome/common/chrome_paths.h" @@ -228,8 +227,8 @@ void NativeProcessLauncherImpl::Core::PostErrorResult( content::BrowserThread::PostTask( content::BrowserThread::IO, FROM_HERE, base::BindOnce(&NativeProcessLauncherImpl::Core::CallCallbackOnIOThread, - this, callback, error, Passed(base::Process()), - Passed(base::File()), Passed(base::File()))); + this, callback, error, base::Process(), base::File(), + base::File())); } void NativeProcessLauncherImpl::Core::PostResult( @@ -240,8 +239,8 @@ void NativeProcessLauncherImpl::Core::PostResult( content::BrowserThread::PostTask( content::BrowserThread::IO, FROM_HERE, base::BindOnce(&NativeProcessLauncherImpl::Core::CallCallbackOnIOThread, - this, callback, RESULT_SUCCESS, Passed(&process), - Passed(&read_file), Passed(&write_file))); + this, callback, RESULT_SUCCESS, std::move(process), + std::move(read_file), std::move(write_file))); } NativeProcessLauncherImpl::NativeProcessLauncherImpl( diff --git a/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc b/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc index e9994eab59b..ae13ce020fb 100644 --- a/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc +++ b/chromium/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc @@ -25,8 +25,8 @@ #include "extensions/test/result_catcher.h" #include "net/base/net_errors.h" #include "third_party/cros_system_api/dbus/service_constants.h" -#include "ui/message_center/notification.h" -#include "ui/message_center/notification_delegate.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notification_delegate.h" using chromeos::DBusThreadManager; using chromeos::NetworkPortalDetector; @@ -82,8 +82,7 @@ class NetworkingConfigTest content::RunAllPendingInMessageLoop(); network_portal_detector_ = new NetworkPortalDetectorImpl( - g_browser_process->system_request_context(), - true /* create_notification_controller */); + test_loader_factory(), true /* create_notification_controller */); chromeos::network_portal_detector::InitializeForTesting( network_portal_detector_); network_portal_detector_->Enable(false /* start_detection */); diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc index a03527e9a0d..9ab7402b18d 100644 --- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc @@ -8,7 +8,7 @@ #include "base/run_loop.h" #include "base/task_scheduler/post_task.h" #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" -#include "chrome/services/wifi_util_win/public/interfaces/wifi_credentials_getter.mojom.h" +#include "chrome/services/wifi_util_win/public/mojom/wifi_credentials_getter.mojom.h" #include "chrome/test/base/in_process_browser_test.h" #include "content/public/browser/browser_thread.h" diff --git a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc index 467a374a407..8a1bab0998d 100644 --- a/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc +++ b/chromium/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_win.cc @@ -11,8 +11,8 @@ #include "base/macros.h" #include "base/strings/string_piece.h" #include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h" -#include "chrome/services/wifi_util_win/public/interfaces/constants.mojom.h" -#include "chrome/services/wifi_util_win/public/interfaces/wifi_credentials_getter.mojom.h" +#include "chrome/services/wifi_util_win/public/mojom/constants.mojom.h" +#include "chrome/services/wifi_util_win/public/mojom/wifi_credentials_getter.mojom.h" #include "content/public/browser/browser_thread.h" #include "content/public/common/service_manager_connection.h" #include "services/service_manager/public/cpp/connector.h" diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc b/chromium/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc index 5df72d7fce9..53b6a30f029 100644 --- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc +++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc @@ -11,7 +11,7 @@ #include "chrome/browser/notifications/notification_display_service.h" #include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/notifications/notification_handler.h" -#include "ui/message_center/notification.h" +#include "ui/message_center/public/cpp/notification.h" #include "url/gurl.h" namespace extensions { diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc index 0a29eb6e9e4..da8e0798932 100644 --- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc +++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.cc @@ -12,13 +12,15 @@ #include "chrome/browser/extensions/api/notifications/extension_notification_display_helper.h" #include "chrome/browser/extensions/api/notifications/extension_notification_display_helper_factory.h" #include "chrome/browser/notifications/notification_common.h" +#include "chrome/browser/notifications/notifier_state_tracker.h" +#include "chrome/browser/notifications/notifier_state_tracker_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/notifications.h" #include "extensions/browser/app_window/app_window.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/app_window/native_app_window.h" #include "extensions/common/constants.h" -#include "ui/message_center/notifier_id.h" +#include "ui/message_center/public/cpp/notifier_id.h" #include "url/gurl.h" namespace extensions { @@ -107,6 +109,14 @@ void ExtensionNotificationHandler::OnClick( std::move(completed_closure).Run(); } +void ExtensionNotificationHandler::DisableNotifications(Profile* profile, + const GURL& origin) { + message_center::NotifierId notifier_id( + message_center::NotifierId::APPLICATION, origin.host()); + NotifierStateTrackerFactory::GetForProfile(profile)->SetNotifierEnabled( + notifier_id, false /* enabled */); +} + void ExtensionNotificationHandler::SendEvent( Profile* profile, const std::string& extension_id, diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h index 062dab0ac8a..60464d79f35 100644 --- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h +++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler.h @@ -36,6 +36,7 @@ class ExtensionNotificationHandler : public NotificationHandler { const base::Optional<int>& action_index, const base::Optional<base::string16>& reply, base::OnceClosure completed_closure) override; + void DisableNotifications(Profile* profile, const GURL& origin) override; protected: // Overriden in unit tests. diff --git a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc index 03dcc746162..607fd500580 100644 --- a/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc +++ b/chromium/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc @@ -72,7 +72,7 @@ TEST_F(ExtensionNotificationHandlerTest, CloseHandler) { handler.SetTestExpectations(kChromeExtensionId, "notifications.onClosed", 2); handler.OnClose(profile.get(), GURL(kChromeExtensionOrigin), kChromeNotificationId, false /* by_user */, - base::BindOnce(&base::DoNothing)); + base::DoNothing()); } TEST_F(ExtensionNotificationHandlerTest, ClickHandler) { @@ -84,7 +84,7 @@ TEST_F(ExtensionNotificationHandlerTest, ClickHandler) { handler.SetTestExpectations(kChromeExtensionId, "notifications.onClicked", 1); handler.OnClick(profile.get(), GURL(kChromeExtensionOrigin), kChromeNotificationId, base::nullopt /* action_index */, - base::nullopt /* reply */, base::BindOnce(&base::DoNothing)); + base::nullopt /* reply */, base::DoNothing()); } TEST_F(ExtensionNotificationHandlerTest, ClickHandlerButton) { @@ -97,7 +97,7 @@ TEST_F(ExtensionNotificationHandlerTest, ClickHandlerButton) { "notifications.onButtonClicked", 2); handler.OnClick(profile.get(), GURL(kChromeExtensionOrigin), kChromeNotificationId, 1 /* action_index */, - base::nullopt /* reply */, base::BindOnce(&base::DoNothing)); + base::nullopt /* reply */, base::DoNothing()); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc b/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc index fb63bc5e496..fa154f233e9 100644 --- a/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc +++ b/chromium/chrome/browser/extensions/api/notifications/notifications_api.cc @@ -48,10 +48,11 @@ #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/image/image_skia_rep.h" #include "ui/gfx/skia_util.h" -#include "ui/message_center/notification.h" -#include "ui/message_center/notification_delegate.h" -#include "ui/message_center/notifier_id.h" +#include "ui/message_center/public/cpp/features.h" #include "ui/message_center/public/cpp/message_center_constants.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notification_delegate.h" +#include "ui/message_center/public/cpp/notifier_id.h" #include "url/gurl.h" using message_center::NotifierId; @@ -352,15 +353,19 @@ bool NotificationsApiFunction::CreateNotification( if (has_list_items) { using api::notifications::NotificationItem; for (const NotificationItem& api_item : *options->items) { - optional_fields.items.push_back(message_center::NotificationItem( - base::UTF8ToUTF16(api_item.title), - base::UTF8ToUTF16(api_item.message))); + optional_fields.items.push_back({base::UTF8ToUTF16(api_item.title), + base::UTF8ToUTF16(api_item.message)}); } } if (options->is_clickable.get()) optional_fields.clickable = *options->is_clickable; + optional_fields.settings_button_handler = + base::FeatureList::IsEnabled(message_center::kNewStyleNotifications) + ? message_center::SettingsButtonHandler::INLINE + : message_center::SettingsButtonHandler::NONE; + // TODO(crbug.com/772004): Remove the manual limitation in favor of an IDL // annotation once supported. if (id.size() > kNotificationIdLengthLimit) { @@ -510,9 +515,8 @@ bool NotificationsApiFunction::UpdateNotification( std::vector<message_center::NotificationItem> items; using api::notifications::NotificationItem; for (const NotificationItem& api_item : *options->items) { - items.push_back(message_center::NotificationItem( - base::UTF8ToUTF16(api_item.title), - base::UTF8ToUTF16(api_item.message))); + items.push_back({base::UTF8ToUTF16(api_item.title), + base::UTF8ToUTF16(api_item.message)}); } notification->set_items(items); } diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_api.h b/chromium/chrome/browser/extensions/api/notifications/notifications_api.h index 74278ac150f..b52400a65a6 100644 --- a/chromium/chrome/browser/extensions/api/notifications/notifications_api.h +++ b/chromium/chrome/browser/extensions/api/notifications/notifications_api.h @@ -11,7 +11,7 @@ #include "chrome/browser/extensions/chrome_extension_function.h" #include "chrome/common/extensions/api/notifications.h" #include "extensions/browser/extension_function.h" -#include "ui/message_center/notification_types.h" +#include "ui/message_center/public/cpp/notification_types.h" namespace message_center { class Notification; diff --git a/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc b/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc index 6b34b68c345..d999be59789 100644 --- a/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc +++ b/chromium/chrome/browser/extensions/api/notifications/notifications_apitest.cc @@ -38,8 +38,8 @@ #include "extensions/common/features/feature.h" #include "extensions/test/extension_test_message_listener.h" #include "extensions/test/result_catcher.h" -#include "ui/message_center/notification.h" -#include "ui/message_center/notifier_id.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notifier_id.h" #if defined(OS_MACOSX) #include "base/mac/mac_util.h" @@ -311,7 +311,8 @@ IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestGetPermissionLevel) { notification_function->set_has_callback(true); std::unique_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult( - notification_function.get(), "[]", browser(), utils::NONE)); + notification_function.get(), "[]", browser(), + extensions::api_test_utils::NONE)); EXPECT_EQ(base::Value::Type::STRING, result->type()); std::string permission_level; @@ -334,7 +335,8 @@ IN_PROC_BROWSER_TEST_F(NotificationsApiTest, TestGetPermissionLevel) { GetNotifierStateTracker()->SetNotifierEnabled(notifier_id, false); std::unique_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult( - notification_function.get(), "[]", browser(), utils::NONE)); + notification_function.get(), "[]", browser(), + extensions::api_test_utils::NONE)); EXPECT_EQ(base::Value::Type::STRING, result->type()); std::string permission_level; diff --git a/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc b/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc index bc265038114..0a6441b4d03 100644 --- a/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc +++ b/chromium/chrome/browser/extensions/api/page_capture/page_capture_api.cc @@ -72,9 +72,9 @@ PageCaptureSaveAsMHTMLFunction::PageCaptureSaveAsMHTMLFunction() { PageCaptureSaveAsMHTMLFunction::~PageCaptureSaveAsMHTMLFunction() { if (mhtml_file_.get()) { - BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, - base::BindOnce(&ClearFileReferenceOnIOThread, - base::Passed(&mhtml_file_))); + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::BindOnce(&ClearFileReferenceOnIOThread, std::move(mhtml_file_))); } } diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc index eebc8e3692e..f1b79559ce1 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc @@ -192,8 +192,50 @@ PasswordsPrivateExportPasswordsFunction::Run() { PasswordsPrivateDelegate* delegate = PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), true /* create */); - delegate->ExportPasswords(GetAssociatedWebContents()); + delegate->ExportPasswords( + base::BindOnce( + &PasswordsPrivateExportPasswordsFunction::ExportRequestCompleted, + this), + GetAssociatedWebContents()); + return RespondLater(); +} + +void PasswordsPrivateExportPasswordsFunction::ExportRequestCompleted( + const std::string& error) { + if (error.empty()) + Respond(NoArguments()); + else + Error(error); +} + +//////////////////////////////////////////////////////////////////////////////// +// PasswordsPrivateCancelExportPasswordsFunction + +PasswordsPrivateCancelExportPasswordsFunction:: + ~PasswordsPrivateCancelExportPasswordsFunction() {} + +ExtensionFunction::ResponseAction +PasswordsPrivateCancelExportPasswordsFunction::Run() { + PasswordsPrivateDelegate* delegate = + PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), + true /* create */); + delegate->CancelExportPasswords(); return RespondNow(NoArguments()); } +//////////////////////////////////////////////////////////////////////////////// +// PasswordsPrivateRequestExportProgressStatusFunction + +PasswordsPrivateRequestExportProgressStatusFunction:: + ~PasswordsPrivateRequestExportProgressStatusFunction() {} + +ExtensionFunction::ResponseAction +PasswordsPrivateRequestExportProgressStatusFunction::Run() { + PasswordsPrivateDelegate* delegate = + PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), + true /* create */); + return RespondNow(OneArgument(std::make_unique<base::Value>( + ToString(delegate->GetExportProgressStatus())))); +} + } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h index 59f7e3caf2a..f541487c4f4 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_api.h @@ -155,9 +155,45 @@ class PasswordsPrivateExportPasswordsFunction ResponseAction Run() override; private: + void ExportRequestCompleted(const std::string& error); + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateExportPasswordsFunction); }; +class PasswordsPrivateCancelExportPasswordsFunction + : public UIThreadExtensionFunction { + public: + PasswordsPrivateCancelExportPasswordsFunction() {} + DECLARE_EXTENSION_FUNCTION("passwordsPrivate.cancelExportPasswords", + PASSWORDSPRIVATE_CANCELEXPORTPASSWORDS); + + protected: + ~PasswordsPrivateCancelExportPasswordsFunction() override; + + // ExtensionFunction overrides. + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateCancelExportPasswordsFunction); +}; + +class PasswordsPrivateRequestExportProgressStatusFunction + : public UIThreadExtensionFunction { + public: + PasswordsPrivateRequestExportProgressStatusFunction() {} + DECLARE_EXTENSION_FUNCTION("passwordsPrivate.requestExportProgressStatus", + PASSWORDSPRIVATE_REQUESTEXPORTPROGRESSSTATUS); + + protected: + ~PasswordsPrivateRequestExportProgressStatusFunction() override; + + // ExtensionFunction overrides. + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateRequestExportProgressStatusFunction); +}; + } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORDS_PRIVATE_API_H_ diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc index 09c69a450f0..6a1ac5b9d6b 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc @@ -150,15 +150,30 @@ class TestDelegate : public PasswordsPrivateDelegate { importPasswordsTriggered = true; } - void ExportPasswords(content::WebContents* web_contents) override { + void ExportPasswords(base::OnceCallback<void(const std::string&)> callback, + content::WebContents* web_contents) override { // The testing of password exporting itself should be handled via // |PasswordManagerPorter|. exportPasswordsTriggered = true; + std::move(callback).Run(std::string()); + } + + void CancelExportPasswords() override { + cancelExportPasswordsTriggered = true; + } + + api::passwords_private::ExportProgressStatus GetExportProgressStatus() + override { + // The testing of password exporting itself should be handled via + // |PasswordManagerPorter|. + return api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_IN_PROGRESS; } // Flags for detecting whether import/export operations have been invoked. bool importPasswordsTriggered = false; bool exportPasswordsTriggered = false; + bool cancelExportPasswordsTriggered = false; private: // The current list of entries/exceptions. Cached here so that when new @@ -220,6 +235,10 @@ class PasswordsPrivateApiTest : public ExtensionApiTest { return s_test_delegate_->exportPasswordsTriggered; } + bool cancelExportPasswordsWasTriggered() { + return s_test_delegate_->cancelExportPasswordsTriggered; + } + private: static TestDelegate* s_test_delegate_; @@ -281,4 +300,17 @@ IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, ExportPasswords) { } } +IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, CancelExportPasswords) { + EXPECT_FALSE(cancelExportPasswordsWasTriggered()); + EXPECT_TRUE(RunPasswordsSubtest("cancelExportPasswords")) << message_; + + if (!ExtensionApiTest::ExtensionSubtestsAreSkipped()) { + EXPECT_TRUE(cancelExportPasswordsWasTriggered()); + } +} + +IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, RequestExportProgressStatus) { + EXPECT_TRUE(RunPasswordsSubtest("requestExportProgressStatus")) << message_; +} + } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h index 4ac97e242d3..3b921ff9bc8 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h @@ -17,6 +17,7 @@ #include "chrome/browser/ui/passwords/password_ui_view.h" #include "chrome/common/extensions/api/passwords_private.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/password_manager/core/browser/ui/export_progress_status.h" #include "extensions/browser/extension_function.h" namespace content { @@ -76,8 +77,18 @@ class PasswordsPrivateDelegate : public KeyedService { virtual void ImportPasswords(content::WebContents* web_contents) = 0; // Trigger the password export procedure, allowing the user to save a file - // containing their passwords. - virtual void ExportPasswords(content::WebContents* web_contents) = 0; + // containing their passwords. |callback| will be called with an error + // message if the request is rejected, because another export is in progress. + virtual void ExportPasswords( + base::OnceCallback<void(const std::string&)> callback, + content::WebContents* web_contents) = 0; + + // Cancel any ongoing export. + virtual void CancelExportPasswords() = 0; + + // Get the most recent progress status. + virtual api::passwords_private::ExportProgressStatus + GetExportProgressStatus() = 0; }; } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index 30280a6a7d5..8b975a1f16c 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc @@ -31,6 +31,43 @@ #include "chrome/browser/password_manager/password_manager_util_mac.h" #endif +namespace { + +// The error message returned to the UI when Chrome refuses to start multiple +// exports. +const char kExportInProgress[] = "in-progress"; +// The error message returned to the UI when the user fails to reauthenticate. +const char kReauthenticationFailed[] = "reauth-failed"; + +// Map password_manager::ExportProgressStatus to +// extensions::api::passwords_private::ExportProgressStatus. +extensions::api::passwords_private::ExportProgressStatus ConvertStatus( + password_manager::ExportProgressStatus status) { + switch (status) { + case password_manager::ExportProgressStatus::NOT_STARTED: + return extensions::api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_NOT_STARTED; + case password_manager::ExportProgressStatus::IN_PROGRESS: + return extensions::api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_IN_PROGRESS; + case password_manager::ExportProgressStatus::SUCCEEDED: + return extensions::api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_SUCCEEDED; + case password_manager::ExportProgressStatus::FAILED_CANCELLED: + return extensions::api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_FAILED_CANCELLED; + case password_manager::ExportProgressStatus::FAILED_WRITE_FAILED: + return extensions::api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_FAILED_WRITE_FAILED; + } + + NOTREACHED(); + return extensions::api::passwords_private::ExportProgressStatus:: + EXPORT_PROGRESS_STATUS_NONE; +} + +} // namespace + namespace extensions { PasswordsPrivateDelegateImpl::PasswordsPrivateDelegateImpl(Profile* profile) @@ -38,7 +75,10 @@ PasswordsPrivateDelegateImpl::PasswordsPrivateDelegateImpl(Profile* profile) password_manager_presenter_( std::make_unique<PasswordManagerPresenter>(this)), password_manager_porter_(std::make_unique<PasswordManagerPorter>( - password_manager_presenter_.get())), + password_manager_presenter_.get(), + base::BindRepeating( + &PasswordsPrivateDelegateImpl::OnPasswordsExportProgress, + base::Unretained(this)))), password_access_authenticator_( base::BindRepeating(&PasswordsPrivateDelegateImpl::OsReauthCall, base::Unretained(this))), @@ -132,7 +172,8 @@ void PasswordsPrivateDelegateImpl::RequestShowPasswordInternal( // TODO(stevenjb): Pass this directly to RequestShowPassword(); see // crbug.com/495290. web_contents_ = web_contents; - if (!password_access_authenticator_.EnsureUserIsAuthenticated()) { + if (!password_access_authenticator_.EnsureUserIsAuthenticated( + password_manager::ReauthPurpose::VIEW_PASSWORD)) { return; } @@ -140,11 +181,13 @@ void PasswordsPrivateDelegateImpl::RequestShowPasswordInternal( password_manager_presenter_->RequestShowPassword(index); } -bool PasswordsPrivateDelegateImpl::OsReauthCall() { +bool PasswordsPrivateDelegateImpl::OsReauthCall( + password_manager::ReauthPurpose purpose) { #if defined(OS_WIN) - return password_manager_util_win::AuthenticateUser(GetNativeWindow()); + return password_manager_util_win::AuthenticateUser(GetNativeWindow(), + purpose); #elif defined(OS_MACOSX) - return password_manager_util_mac::AuthenticateUser(); + return password_manager_util_mac::AuthenticateUser(purpose); #else return true; #endif @@ -240,18 +283,31 @@ void PasswordsPrivateDelegateImpl::ImportPasswords( } void PasswordsPrivateDelegateImpl::ExportPasswords( + base::OnceCallback<void(const std::string&)> callback, content::WebContents* web_contents) { // Save |web_contents| so that it can be used later when GetNativeWindow() is // called. Note: This is safe because the |web_contents| is used before // exiting this method. TODO(crbug.com/495290): Pass the native window // directly to the reauth-handling code. web_contents_ = web_contents; - if (!password_access_authenticator_.ForceUserReauthentication()) { + if (!password_access_authenticator_.ForceUserReauthentication( + password_manager::ReauthPurpose::EXPORT)) { + std::move(callback).Run(kReauthenticationFailed); return; } password_manager_porter_->set_web_contents(web_contents); - password_manager_porter_->Store(); + bool accepted = password_manager_porter_->Store(); + std::move(callback).Run(accepted ? std::string() : kExportInProgress); +} + +void PasswordsPrivateDelegateImpl::CancelExportPasswords() { + password_manager_porter_->CancelStore(); +} + +api::passwords_private::ExportProgressStatus +PasswordsPrivateDelegateImpl::GetExportProgressStatus() { + return ConvertStatus(password_manager_porter_->GetExportProgressStatus()); } #if !defined(OS_ANDROID) @@ -261,13 +317,23 @@ gfx::NativeWindow PasswordsPrivateDelegateImpl::GetNativeWindow() const { } #endif +void PasswordsPrivateDelegateImpl::OnPasswordsExportProgress( + password_manager::ExportProgressStatus status, + const std::string& folder_name) { + PasswordsPrivateEventRouter* router = + PasswordsPrivateEventRouterFactory::GetForProfile(profile_); + if (router) { + router->OnPasswordsExportProgress(ConvertStatus(status), folder_name); + } +} + void PasswordsPrivateDelegateImpl::Shutdown() { password_manager_presenter_.reset(); password_manager_porter_.reset(); } void PasswordsPrivateDelegateImpl::SetOsReauthCallForTesting( - base::RepeatingCallback<bool()> os_reauth_call) { + PasswordAccessAuthenticator::ReauthCallback os_reauth_call) { password_access_authenticator_.SetOsReauthCallForTesting( std::move(os_reauth_call)); } diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h index a7c7e4a6a3f..c9d02bcb6d0 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h @@ -16,12 +16,14 @@ #include "base/observer_list.h" #include "build/build_config.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h" +#include "chrome/browser/password_manager/reauth_purpose.h" #include "chrome/browser/ui/passwords/password_access_authenticator.h" #include "chrome/browser/ui/passwords/password_manager_porter.h" #include "chrome/browser/ui/passwords/password_manager_presenter.h" #include "chrome/browser/ui/passwords/password_ui_view.h" #include "chrome/common/extensions/api/passwords_private.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/password_manager/core/browser/ui/export_progress_status.h" #include "extensions/browser/extension_function.h" class Profile; @@ -51,7 +53,11 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, void RequestShowPassword(size_t index, content::WebContents* web_contents) override; void ImportPasswords(content::WebContents* web_contents) override; - void ExportPasswords(content::WebContents* web_contents) override; + void ExportPasswords(base::OnceCallback<void(const std::string&)> accepted, + content::WebContents* web_contents) override; + void CancelExportPasswords() override; + api::passwords_private::ExportProgressStatus GetExportProgressStatus() + override; // PasswordUIView implementation. Profile* GetProfile() override; @@ -68,12 +74,17 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, gfx::NativeWindow GetNativeWindow() const override; #endif + // Callback for when the password list has been written to the destination. + void OnPasswordsExportProgress(password_manager::ExportProgressStatus status, + const std::string& folder_name); + // KeyedService overrides: void Shutdown() override; // Use this in tests to mock the OS-level reauthentication. void SetOsReauthCallForTesting( - base::RepeatingCallback<bool()> os_reauth_call); + base::RepeatingCallback<bool(password_manager::ReauthPurpose)> + os_reauth_call); private: // Called after the lists are fetched. Once both lists have been set, the @@ -93,7 +104,7 @@ class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, // Triggers an OS-dependent UI to present OS account login challenge and // returns true if the user passed that challenge. - bool OsReauthCall(); + bool OsReauthCall(password_manager::ReauthPurpose purpose); // Not owned by this class. Profile* profile_; diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc index 18816b55a21..4b8102b3239 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc @@ -13,6 +13,7 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/mock_callback.h" #include "base/values.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h" @@ -27,6 +28,8 @@ #include "testing/gtest/include/gtest/gtest.h" using PasswordFormList = std::vector<std::unique_ptr<autofill::PasswordForm>>; +using ::testing::Ne; +using ::testing::StrictMock; namespace extensions { @@ -99,7 +102,9 @@ void PasswordEventObserver::OnBroadcastEvent(const extensions::Event& event) { enum class ReauthResult { PASS, FAIL }; -bool FakeOsReauthCall(bool* reauth_called, ReauthResult result) { +bool FakeOsReauthCall(bool* reauth_called, + ReauthResult result, + password_manager::ReauthPurpose purpose) { *reauth_called = true; return result == ReauthResult::PASS; } @@ -255,6 +260,8 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestFailedReauthOnView) { TEST_F(PasswordsPrivateDelegateImplTest, TestReauthOnExport) { SetUpPasswordStore({CreateSampleForm()}); + StrictMock<base::MockCallback<base::OnceCallback<void(const std::string&)>>> + mock_accepted; PasswordsPrivateDelegateImpl delegate(&profile_); // Spin the loop to allow PasswordStore tasks posted on the creation of @@ -265,17 +272,35 @@ TEST_F(PasswordsPrivateDelegateImplTest, TestReauthOnExport) { delegate.SetOsReauthCallForTesting(base::BindRepeating( &FakeOsReauthCall, &reauth_called, ReauthResult::PASS)); - delegate.ExportPasswords(nullptr); + EXPECT_CALL(mock_accepted, Run(std::string())).Times(2); + + delegate.ExportPasswords(mock_accepted.Get(), nullptr); EXPECT_TRUE(reauth_called); // Export should ignore previous reauthentication results. reauth_called = false; - delegate.ExportPasswords(nullptr); + delegate.ExportPasswords(mock_accepted.Get(), nullptr); EXPECT_TRUE(reauth_called); +} + +TEST_F(PasswordsPrivateDelegateImplTest, TestReauthFailedOnExport) { + SetUpPasswordStore({CreateSampleForm()}); + StrictMock<base::MockCallback<base::OnceCallback<void(const std::string&)>>> + mock_accepted; - // TODO(crbug.com/341477): Once the export flow has defined messages to UI, - // such as progress indication, intercept them with PasswordEventObserver and - // check that exporting is aborted if the authentication failed. + PasswordsPrivateDelegateImpl delegate(&profile_); + // Spin the loop to allow PasswordStore tasks posted on the creation of + // |delegate| to be completed. + base::RunLoop().RunUntilIdle(); + + EXPECT_CALL(mock_accepted, Run(std::string("reauth-failed"))); + + bool reauth_called = false; + delegate.SetOsReauthCallForTesting(base::BindRepeating( + &FakeOsReauthCall, &reauth_called, ReauthResult::FAIL)); + + delegate.ExportPasswords(mock_accepted.Get(), nullptr); + EXPECT_TRUE(reauth_called); } } // namespace extensions diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.cc b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.cc index ca05c357e70..3851d77d807 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.cc +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.cc @@ -42,10 +42,10 @@ void PasswordsPrivateEventRouter::SendSavedPasswordListToListeners() { // If there is nothing to send, return early. return; - std::unique_ptr<Event> extension_event( - new Event(events::PASSWORDS_PRIVATE_ON_SAVED_PASSWORDS_LIST_CHANGED, - api::passwords_private::OnSavedPasswordsListChanged::kEventName, - cached_saved_password_parameters_->CreateDeepCopy())); + auto extension_event = std::make_unique<Event>( + events::PASSWORDS_PRIVATE_ON_SAVED_PASSWORDS_LIST_CHANGED, + api::passwords_private::OnSavedPasswordsListChanged::kEventName, + cached_saved_password_parameters_->CreateDeepCopy()); event_router_->BroadcastEvent(std::move(extension_event)); } @@ -62,10 +62,10 @@ void PasswordsPrivateEventRouter::SendPasswordExceptionListToListeners() { // If there is nothing to send, return early. return; - std::unique_ptr<Event> extension_event(new Event( + auto extension_event = std::make_unique<Event>( events::PASSWORDS_PRIVATE_ON_PASSWORD_EXCEPTIONS_LIST_CHANGED, api::passwords_private::OnPasswordExceptionsListChanged::kEventName, - cached_password_exception_parameters_->CreateDeepCopy())); + cached_password_exception_parameters_->CreateDeepCopy()); event_router_->BroadcastEvent(std::move(extension_event)); } @@ -76,13 +76,30 @@ void PasswordsPrivateEventRouter::OnPlaintextPasswordFetched( params.index = index; params.plaintext_password = plaintext_password; - std::unique_ptr<base::ListValue> event_value(new base::ListValue); + auto event_value = std::make_unique<base::ListValue>(); event_value->Append(params.ToValue()); - std::unique_ptr<Event> extension_event(new Event( + auto extension_event = std::make_unique<Event>( events::PASSWORDS_PRIVATE_ON_PLAINTEXT_PASSWORD_RETRIEVED, api::passwords_private::OnPlaintextPasswordRetrieved::kEventName, - std::move(event_value))); + std::move(event_value)); + event_router_->BroadcastEvent(std::move(extension_event)); +} + +void PasswordsPrivateEventRouter::OnPasswordsExportProgress( + api::passwords_private::ExportProgressStatus status, + const std::string& folder_name) { + api::passwords_private::PasswordExportProgress params; + params.status = status; + params.folder_name = std::make_unique<std::string>(std::move(folder_name)); + + auto event_value = std::make_unique<base::ListValue>(); + event_value->Append(params.ToValue()); + + auto extension_event = std::make_unique<Event>( + events::PASSWORDS_PRIVATE_ON_PASSWORDS_FILE_EXPORT_PROGRESS, + api::passwords_private::OnPasswordsFileExportProgress::kEventName, + std::move(event_value)); event_router_->BroadcastEvent(std::move(extension_event)); } diff --git a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h index b1d529327d2..b4bcfa6284c 100644 --- a/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h +++ b/chromium/chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h @@ -5,6 +5,10 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORDS_PRIVATE_EVENT_ROUTER_H_ #define CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORDS_PRIVATE_EVENT_ROUTER_H_ +#include <memory> +#include <string> +#include <vector> + #include "base/macros.h" #include "chrome/common/extensions/api/passwords_private.h" #include "components/keyed_service/core/keyed_service.h" @@ -41,6 +45,14 @@ class PasswordsPrivateEventRouter : public KeyedService { void OnPlaintextPasswordFetched(size_t index, const std::string& plaintext_password); + // Notifies listeners after the passwords have been written to the export + // destination. + // |folder_name| In case of failure to export, this will describe destination + // we tried to write on. + void OnPasswordsExportProgress( + api::passwords_private::ExportProgressStatus status, + const std::string& folder_name); + protected: explicit PasswordsPrivateEventRouter(content::BrowserContext* context); diff --git a/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc b/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc index 28b90107c8b..a365158dbde 100644 --- a/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc @@ -59,8 +59,7 @@ class PermissionsAPIUnitTest : public ExtensionServiceTestWithInstall { new PermissionsContainsFunction()); function->set_extension(extension.get()); bool run_result = extension_function_test_utils::RunFunction( - function.get(), args_string, browser(), - extension_function_test_utils::NONE); + function.get(), args_string, browser(), api_test_utils::NONE); EXPECT_TRUE(run_result) << function->GetError(); bool has_permission; diff --git a/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc b/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc index 2964d6272fc..d66dd3a6f5b 100644 --- a/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc +++ b/chromium/chrome/browser/extensions/api/preference/preference_api_prefs_unittest.cc @@ -212,8 +212,8 @@ class ControlledPrefsInstallIncognitoPersistent new base::Value("val1")); InstallExtensionControlledPrefIncognito(extension1(), kPref1, new base::Value("val2")); - std::unique_ptr<PrefService> incog_prefs( - prefs_.CreateIncognitoPrefService()); + std::unique_ptr<PrefService> incog_prefs = + prefs_.CreateIncognitoPrefService(); std::string actual = incog_prefs->GetString(kPref1); EXPECT_EQ("val2", actual); } @@ -223,8 +223,8 @@ class ControlledPrefsInstallIncognitoPersistent std::string actual = prefs()->pref_service()->GetString(kPref1); EXPECT_EQ("val1", actual); // Incognito pref service shall see incognito values. - std::unique_ptr<PrefService> incog_prefs( - prefs_.CreateIncognitoPrefService()); + std::unique_ptr<PrefService> incog_prefs = + prefs_.CreateIncognitoPrefService(); actual = incog_prefs->GetString(kPref1); EXPECT_EQ("val2", actual); } @@ -243,8 +243,8 @@ class ControlledPrefsInstallIncognitoSessionOnly new base::Value("val1")); InstallExtensionControlledPrefIncognitoSessionOnly(extension1(), kPref1, new base::Value("val2")); - std::unique_ptr<PrefService> incog_prefs( - prefs_.CreateIncognitoPrefService()); + std::unique_ptr<PrefService> incog_prefs = + prefs_.CreateIncognitoPrefService(); std::string actual = incog_prefs->GetString(kPref1); EXPECT_EQ("val2", actual); } @@ -255,8 +255,8 @@ class ControlledPrefsInstallIncognitoSessionOnly // Incognito pref service shall see session-only incognito values only // during first run. Once the pref service was reloaded, all values shall be // discarded. - std::unique_ptr<PrefService> incog_prefs( - prefs_.CreateIncognitoPrefService()); + std::unique_ptr<PrefService> incog_prefs = + prefs_.CreateIncognitoPrefService(); actual = incog_prefs->GetString(kPref1); if (iteration_ == 0) { EXPECT_EQ("val2", actual); @@ -314,8 +314,8 @@ class ControlledPrefsNotifyWhenNeeded : public ExtensionControlledPrefsTest { registrar.Add(kPref1, observer.GetCallback()); MockPrefChangeCallback incognito_observer(prefs()->pref_service()); - std::unique_ptr<PrefService> incog_prefs( - prefs_.CreateIncognitoPrefService()); + std::unique_ptr<PrefService> incog_prefs = + prefs_.CreateIncognitoPrefService(); PrefChangeRegistrar incognito_registrar; incognito_registrar.Init(incog_prefs.get()); incognito_registrar.Add(kPref1, incognito_observer.GetCallback()); diff --git a/chromium/chrome/browser/extensions/api/processes/processes_api.cc b/chromium/chrome/browser/extensions/api/processes/processes_api.cc index 63c005ec295..4ec343e20b9 100644 --- a/chromium/chrome/browser/extensions/api/processes/processes_api.cc +++ b/chromium/chrome/browser/extensions/api/processes/processes_api.cc @@ -372,11 +372,12 @@ void ProcessesEventRouter::UpdateRefreshTypesFlagsBasedOnListeners() { refresh_types |= GetRefreshTypesFlagOnlyEssentialData(); } + const int64_t on_updated_types = GetRefreshTypesForProcessOptionalData(); if (HasEventListeners(api::processes::OnUpdated::kEventName)) - refresh_types |= GetRefreshTypesForProcessOptionalData(); + refresh_types |= on_updated_types; if (HasEventListeners(api::processes::OnUpdatedWithMemory::kEventName)) - refresh_types |= task_manager::REFRESH_TYPE_MEMORY; + refresh_types |= (on_updated_types | task_manager::REFRESH_TYPE_MEMORY); SetRefreshTypesFlags(refresh_types); } diff --git a/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc b/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc index d75a4065760..42668f2615d 100644 --- a/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc +++ b/chromium/chrome/browser/extensions/api/processes/processes_apitest.cc @@ -9,6 +9,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_window.h" +#include "chrome/common/extensions/api/processes.h" #include "extensions/common/switches.h" #include "extensions/test/extension_test_message_listener.h" @@ -69,6 +70,48 @@ IN_PROC_BROWSER_TEST_F(ProcessesApiTest, ProcessesApiListeners) { EXPECT_EQ(0, GetListenersCount()); } +IN_PROC_BROWSER_TEST_F(ProcessesApiTest, OnUpdatedWithMemoryRefreshTypes) { + EXPECT_EQ(0, GetListenersCount()); + + // Load an extension that listen to the onUpdatedWithMemory. + ExtensionTestMessageListener listener("ready", false /* will_reply */); + const extensions::Extension* extension = + LoadExtension(test_data_dir_.AppendASCII("processes") + .AppendASCII("onupdated_with_memory")); + ASSERT_TRUE(extension); + ASSERT_TRUE(listener.WaitUntilSatisfied()); + + // The memory refresh type must be enabled now. + const task_manager::TaskManagerInterface* task_manager = + task_manager::TaskManagerInterface::GetTaskManager(); + EXPECT_EQ(1, GetListenersCount()); + extensions::EventRouter* event_router = + extensions::EventRouter::Get(profile()); + EXPECT_TRUE(event_router->HasEventListener( + extensions::api::processes::OnUpdatedWithMemory::kEventName)); + EXPECT_FALSE(event_router->HasEventListener( + extensions::api::processes::OnUpdated::kEventName)); + EXPECT_TRUE(task_manager->IsResourceRefreshEnabled( + task_manager::REFRESH_TYPE_MEMORY)); + + // Despite the fact that there are no onUpdated listeners, refresh types for + // CPU, Network, SQLite, V8 memory, and webcache stats should be enabled. + constexpr task_manager::RefreshType kOnUpdatedRefreshTypes[] = { + task_manager::REFRESH_TYPE_CPU, + task_manager::REFRESH_TYPE_NETWORK_USAGE, + task_manager::REFRESH_TYPE_SQLITE_MEMORY, + task_manager::REFRESH_TYPE_V8_MEMORY, + task_manager::REFRESH_TYPE_WEBCACHE_STATS, + }; + + for (const auto& type : kOnUpdatedRefreshTypes) + EXPECT_TRUE(task_manager->IsResourceRefreshEnabled(type)); + + // Unload the extensions and make sure the listeners count is updated. + UnloadExtension(extension->id()); + EXPECT_EQ(0, GetListenersCount()); +} + IN_PROC_BROWSER_TEST_F(ProcessesApiTest, CannotTerminateBrowserProcess) { ASSERT_TRUE(RunExtensionTest("processes/terminate-browser-process")) << message_; diff --git a/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc b/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc index 780aafeeb1e..8efe3706631 100644 --- a/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc +++ b/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc @@ -26,7 +26,7 @@ #include "components/proxy_config/proxy_config_dictionary.h" #include "extensions/common/error_utils.h" #include "net/base/data_url.h" -#include "net/proxy/proxy_config.h" +#include "net/proxy_resolution/proxy_config.h" namespace extensions { @@ -378,16 +378,16 @@ std::unique_ptr<base::DictionaryValue> CreateProxyRulesDict( rules.ParseFromString(proxy_servers); switch (rules.type) { - case net::ProxyConfig::ProxyRules::TYPE_NO_RULES: + case net::ProxyConfig::ProxyRules::Type::EMPTY: return NULL; - case net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY: + case net::ProxyConfig::ProxyRules::Type::PROXY_LIST: if (!rules.single_proxies.IsEmpty()) { extension_proxy_rules->Set( keys::field_name[keys::SCHEME_ALL], CreateProxyServerDict(rules.single_proxies.Get())); } break; - case net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME: + case net::ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME: if (!rules.proxies_for_http.IsEmpty()) { extension_proxy_rules->Set( keys::field_name[keys::SCHEME_HTTP], diff --git a/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.h b/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.h index f572165276e..43428988aa6 100644 --- a/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.h +++ b/chromium/chrome/browser/extensions/api/proxy/proxy_api_helpers.h @@ -11,7 +11,7 @@ #include <string> #include "components/proxy_config/proxy_prefs.h" -#include "net/proxy/proxy_config.h" +#include "net/proxy_resolution/proxy_config.h" class ProxyConfigDictionary; diff --git a/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc b/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc index 2999bdd5c46..a1f7840198a 100644 --- a/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc +++ b/chromium/chrome/browser/extensions/api/runtime/runtime_apitest.cc @@ -7,7 +7,6 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_function_test_utils.h" #include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test_utils.h" #include "extensions/browser/api/runtime/runtime_api.h" @@ -17,6 +16,7 @@ #include "extensions/browser/extension_registry.h" #include "extensions/browser/test_extension_registry_observer.h" #include "extensions/test/result_catcher.h" +#include "extensions/test/test_extension_dir.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "url/url_constants.h" diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc index aba5cc99f59..872c24eba79 100644 --- a/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc +++ b/chromium/chrome/browser/extensions/api/sessions/sessions_api.cc @@ -6,6 +6,7 @@ #include <stddef.h> +#include <algorithm> #include <memory> #include <utility> #include <vector> @@ -380,8 +381,8 @@ ExtensionFunction::ResponseAction SessionsGetDevicesFunction::Run() { ExtensionFunction::ResponseValue SessionsRestoreFunction::GetRestoredTabResult( content::WebContents* contents) { - std::unique_ptr<tabs::Tab> tab( - ExtensionTabUtil::CreateTabObject(contents, extension())); + std::unique_ptr<tabs::Tab> tab(ExtensionTabUtil::CreateTabObject( + contents, ExtensionTabUtil::kScrubTab, extension())); std::unique_ptr<api::sessions::Session> restored_session( CreateSessionModelHelper(base::Time::Now().ToTimeT(), std::move(tab), std::unique_ptr<windows::Window>())); @@ -390,14 +391,15 @@ ExtensionFunction::ResponseValue SessionsRestoreFunction::GetRestoredTabResult( ExtensionFunction::ResponseValue SessionsRestoreFunction::GetRestoredWindowResult(int window_id) { - WindowController* controller = NULL; + Browser* browser = nullptr; std::string error; - if (!windows_util::GetWindowFromWindowID(this, window_id, 0, &controller, - &error)) { + if (!windows_util::GetBrowserFromWindowID(this, window_id, 0, &browser, + &error)) { return Error(error); } std::unique_ptr<base::DictionaryValue> window_value( - controller->CreateWindowValueWithTabs(extension())); + ExtensionTabUtil::CreateWindowValueForExtension( + *browser, extension(), ExtensionTabUtil::kPopulateTabs)); std::unique_ptr<windows::Window> window( windows::Window::FromValue(*window_value)); return ArgumentList(Restore::Results::Create(*CreateSessionModelHelper( diff --git a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc index 6f68a4cd4d0..9d457c2dcae 100644 --- a/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc +++ b/chromium/chrome/browser/extensions/api/sessions/sessions_apitest.cc @@ -30,8 +30,6 @@ #include "components/browser_sync/profile_sync_service_mock.h" #include "components/sync/device_info/local_device_info_provider_mock.h" #include "components/sync/driver/sync_api_component_factory_mock.h" -#include "components/sync/model/attachments/attachment_id.h" -#include "components/sync/model/attachments/attachment_service_proxy_for_test.h" #include "components/sync/model/fake_sync_change_processor.h" #include "components/sync/model/sync_error_factory_mock.h" #include "components/sync_sessions/sessions_sync_manager.h" @@ -266,16 +264,14 @@ void ExtensionSessionsTest::CreateSessionModels() { sync_pb::EntitySpecifics entity; entity.mutable_session()->CopyFrom(meta); initial_data.push_back(syncer::SyncData::CreateRemoteData( - 1, entity, base::Time(), syncer::AttachmentIdList(), - syncer::AttachmentServiceProxyForTest::Create(), + 1, entity, base::Time(), sync_sessions::SessionsSyncManager::TagHashFromSpecifics( entity.session()))); for (size_t i = 0; i < tabs.size(); i++) { sync_pb::EntitySpecifics entity; entity.mutable_session()->CopyFrom(tabs[i]); initial_data.push_back(syncer::SyncData::CreateRemoteData( - i + 2, entity, base::Time(), syncer::AttachmentIdList(), - syncer::AttachmentServiceProxyForTest::Create(), + i + 2, entity, base::Time(), sync_sessions::SessionsSyncManager::TagHashFromSpecifics( entity.session()))); } @@ -329,7 +325,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, std::unique_ptr<base::DictionaryValue> restored_window_session( utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( CreateFunction<SessionsRestoreFunction>(true).get(), "[\"tag3.3\"]", - browser_, utils::INCLUDE_INCOGNITO))); + browser_, api_test_utils::INCLUDE_INCOGNITO))); ASSERT_TRUE(restored_window_session); std::unique_ptr<base::ListValue> result( diff --git a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc index 12188832837..ea8c4d19412 100644 --- a/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chromium/chrome/browser/extensions/api/settings_private/prefs_util.cc @@ -284,6 +284,8 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() { settings_api::PrefType::PREF_TYPE_NUMBER; (*s_whitelist)[ash::prefs::kAccessibilityScreenMagnifierEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[ash::prefs::kAccessibilityScreenMagnifierScale] = + settings_api::PrefType::PREF_TYPE_NUMBER; (*s_whitelist)[ash::prefs::kAccessibilitySelectToSpeakEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN; (*s_whitelist)[ash::prefs::kAccessibilityStickyKeysEnabled] = @@ -364,6 +366,10 @@ const PrefsUtil::TypedPrefMap& PrefsUtil::GetWhitelistedKeys() { settings_api::PrefType::PREF_TYPE_NUMBER; (*s_whitelist)[ash::prefs::kNightLightCustomEndTime] = settings_api::PrefType::PREF_TYPE_NUMBER; + (*s_whitelist)[ash::prefs::kDockedMagnifierEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)[ash::prefs::kDockedMagnifierScale] = + settings_api::PrefType::PREF_TYPE_NUMBER; // Input method settings. (*s_whitelist)[::prefs::kLanguagePreloadEngines] = @@ -633,20 +639,24 @@ settings_private::SetPrefResult PrefsUtil::SetPref(const std::string& pref_name, switch (pref->GetType()) { case base::Value::Type::BOOLEAN: - case base::Value::Type::DOUBLE: case base::Value::Type::LIST: case base::Value::Type::DICTIONARY: pref_service->Set(pref_name, *value); break; - case base::Value::Type::INTEGER: { - // In JS all numbers are doubles. + case base::Value::Type::DOUBLE: + case base::Value::Type::INTEGER: + // Explicitly set the double value or the integer value. + // Otherwise if the number is a whole number like 2.0, it will + // automatically be of type INTEGER causing type mismatches in + // PrefService::SetUserPrefValue for doubles, and vice versa. double double_value; if (!value->GetAsDouble(&double_value)) return settings_private::SetPrefResult::PREF_TYPE_MISMATCH; - - pref_service->SetInteger(pref_name, static_cast<int>(double_value)); + if (pref->GetType() == base::Value::Type::DOUBLE) + pref_service->SetDouble(pref_name, double_value); + else + pref_service->SetInteger(pref_name, static_cast<int>(double_value)); break; - } case base::Value::Type::STRING: { std::string string_value; if (!value->GetAsString(&string_value)) diff --git a/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc b/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc index 27fd02882f8..68b294cade7 100644 --- a/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc +++ b/chromium/chrome/browser/extensions/api/socket/udp_socket_unittest.cc @@ -15,17 +15,37 @@ #include "base/single_thread_task_runner.h" #include "base/test/test_timeouts.h" #include "base/threading/thread_task_runner_handle.h" +#include "chrome/browser/extensions/extension_service_test_base.h" #include "chrome/test/base/browser_with_test_window_test.h" +#include "content/public/browser/storage_partition.h" #include "extensions/browser/api/socket/udp_socket.h" #include "net/base/io_buffer.h" #include "net/base/ip_address.h" +#include "net/base/test_completion_callback.h" +#include "services/network/network_context.h" +#include "services/network/public/mojom/udp_socket.mojom.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { -// UDPSocketUnitTest exists solely to make it easier to pass a specific -// gtest_filter argument during development. -class UDPSocketUnitTest : public BrowserWithTestWindowTest { +class UDPSocketUnitTest : public extensions::ExtensionServiceTestBase { + protected: + // extensions::ExtensionServiceTestBase: + void SetUp() override { InitializeEmptyExtensionService(); } + + std::unique_ptr<UDPSocket> CreateSocket() { + network::mojom::NetworkContext* network_context = + content::BrowserContext::GetDefaultStoragePartition(profile()) + ->GetNetworkContext(); + network::mojom::UDPSocketPtrInfo socket; + network::mojom::UDPSocketReceiverPtr receiver_ptr; + network::mojom::UDPSocketReceiverRequest receiver_request = + mojo::MakeRequest(&receiver_ptr); + network_context->CreateUDPSocket(mojo::MakeRequest(&socket), + std::move(receiver_ptr)); + return std::make_unique<UDPSocket>( + std::move(socket), std::move(receiver_request), "abcdefghijklmnopqrst"); + } }; static void OnConnected(int result) { @@ -40,8 +60,8 @@ static void OnCompleted(int bytes_read, // Do nothing; don't care. } -static const char test_message[] = "$$TESTMESSAGETESTMESSAGETESTMESSAGETEST$$"; -static const int test_message_length = arraysize(test_message); +static const char kTestMessage[] = "$$TESTMESSAGETESTMESSAGETESTMESSAGETEST$$"; +static const int kTestMessageLength = arraysize(kTestMessage); net::AddressList CreateAddressList(const char* address_string, int port) { net::IPAddress ip; @@ -50,50 +70,69 @@ net::AddressList CreateAddressList(const char* address_string, int port) { } static void OnSendCompleted(int result) { - EXPECT_EQ(test_message_length, result); + EXPECT_EQ(kTestMessageLength, result); } -TEST(UDPSocketUnitTest, TestUDPSocketRecvFrom) { - base::MessageLoopForIO io_loop; // For RecvFrom to do its threaded work. - UDPSocket socket("abcdefghijklmnopqrst"); +TEST_F(UDPSocketUnitTest, TestUDPSocketRecvFrom) { + std::unique_ptr<UDPSocket> socket = CreateSocket(); // Confirm that we can call two RecvFroms in quick succession without // triggering crbug.com/146606. - socket.Connect(CreateAddressList("127.0.0.1", 40000), - base::Bind(&OnConnected)); - socket.RecvFrom(4096, base::Bind(&OnCompleted)); - socket.RecvFrom(4096, base::Bind(&OnCompleted)); + socket->Connect(CreateAddressList("127.0.0.1", 40000), + base::BindRepeating(&OnConnected)); + socket->RecvFrom(4096, base::BindRepeating(&OnCompleted)); + socket->RecvFrom(4096, base::BindRepeating(&OnCompleted)); } -TEST(UDPSocketUnitTest, TestUDPMulticastJoinGroup) { +TEST_F(UDPSocketUnitTest, TestUDPMulticastJoinGroup) { const char kGroup[] = "237.132.100.17"; - UDPSocket src("abcdefghijklmnopqrst"); - UDPSocket dest("abcdefghijklmnopqrst"); + std::unique_ptr<UDPSocket> src = CreateSocket(); + std::unique_ptr<UDPSocket> dest = CreateSocket(); - EXPECT_EQ(0, dest.Bind("0.0.0.0", 13333)); - EXPECT_EQ(0, dest.JoinGroup(kGroup)); - std::vector<std::string> groups = dest.GetJoinedGroups(); + { + net::TestCompletionCallback callback; + dest->Bind("0.0.0.0", 13333, callback.callback()); + EXPECT_EQ(net::OK, callback.WaitForResult()); + } + { + net::TestCompletionCallback callback; + dest->JoinGroup(kGroup, callback.callback()); + EXPECT_EQ(net::OK, callback.WaitForResult()); + } + std::vector<std::string> groups = dest->GetJoinedGroups(); EXPECT_EQ(static_cast<size_t>(1), groups.size()); EXPECT_EQ(kGroup, *groups.begin()); - EXPECT_NE(0, dest.LeaveGroup("237.132.100.13")); - EXPECT_EQ(0, dest.LeaveGroup(kGroup)); - groups = dest.GetJoinedGroups(); + { + net::TestCompletionCallback callback; + dest->LeaveGroup("237.132.100.13", callback.callback()); + EXPECT_NE(net::OK, callback.WaitForResult()); + } + { + net::TestCompletionCallback callback; + dest->LeaveGroup(kGroup, callback.callback()); + EXPECT_EQ(net::OK, callback.WaitForResult()); + } + groups = dest->GetJoinedGroups(); EXPECT_EQ(static_cast<size_t>(0), groups.size()); } -TEST(UDPSocketUnitTest, TestUDPMulticastTimeToLive) { +TEST_F(UDPSocketUnitTest, TestUDPMulticastTimeToLive) { const char kGroup[] = "237.132.100.17"; - UDPSocket socket("abcdefghijklmnopqrst"); - EXPECT_NE(0, socket.SetMulticastTimeToLive(-1)); // Negative TTL shall fail. - EXPECT_EQ(0, socket.SetMulticastTimeToLive(3)); - socket.Connect(CreateAddressList(kGroup, 13333), base::Bind(&OnConnected)); + std::unique_ptr<UDPSocket> socket = CreateSocket(); + + EXPECT_NE(0, socket->SetMulticastTimeToLive(-1)); // Negative TTL shall fail. + EXPECT_EQ(0, socket->SetMulticastTimeToLive(3)); + socket->Connect(CreateAddressList(kGroup, 13333), + base::BindRepeating(&OnConnected)); } -TEST(UDPSocketUnitTest, TestUDPMulticastLoopbackMode) { +TEST_F(UDPSocketUnitTest, TestUDPMulticastLoopbackMode) { const char kGroup[] = "237.132.100.17"; - UDPSocket socket("abcdefghijklmnopqrst"); - EXPECT_EQ(0, socket.SetMulticastLoopbackMode(false)); - socket.Connect(CreateAddressList(kGroup, 13333), base::Bind(&OnConnected)); + std::unique_ptr<UDPSocket> socket = CreateSocket(); + + EXPECT_EQ(0, socket->SetMulticastLoopbackMode(false)); + socket->Connect(CreateAddressList(kGroup, 13333), + base::BindRepeating(&OnConnected)); } // Send a test multicast packet every second. @@ -102,8 +141,8 @@ static void SendMulticastPacket(const base::Closure& quit_run_loop, UDPSocket* src, int result) { if (result == 0) { - scoped_refptr<net::IOBuffer> data = new net::WrappedIOBuffer(test_message); - src->Write(data, test_message_length, base::Bind(&OnSendCompleted)); + scoped_refptr<net::IOBuffer> data = new net::WrappedIOBuffer(kTestMessage); + src->Write(data, kTestMessageLength, base::BindRepeating(&OnSendCompleted)); base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce(&SendMulticastPacket, quit_run_loop, src, result), @@ -118,37 +157,48 @@ static void OnMulticastReadCompleted(const base::Closure& quit_run_loop, bool* packet_received, int count, scoped_refptr<net::IOBuffer> io_buffer, - bool socket_destroying) { - EXPECT_EQ(test_message_length, count); - EXPECT_EQ(0, strncmp(io_buffer->data(), test_message, test_message_length)); + bool socket_destroying, + const std::string& ip, + uint16_t port) { + EXPECT_EQ(kTestMessageLength, count); + EXPECT_EQ(0, strncmp(io_buffer->data(), kTestMessage, kTestMessageLength)); *packet_received = true; quit_run_loop.Run(); } -TEST(UDPSocketUnitTest, TestUDPMulticastRecv) { +TEST_F(UDPSocketUnitTest, TestUDPMulticastRecv) { const int kPort = 9999; const char kGroup[] = "237.132.100.17"; bool packet_received = false; - base::MessageLoopForIO io_loop; // For Read to do its threaded work. - UDPSocket dest("abcdefghijklmnopqrst"); - UDPSocket src("abcdefghijklmnopqrst"); - - base::RunLoop run_loop; + std::unique_ptr<UDPSocket> src = CreateSocket(); + std::unique_ptr<UDPSocket> dest = CreateSocket(); // Receiver - EXPECT_EQ(0, dest.Bind("0.0.0.0", kPort)); - EXPECT_EQ(0, dest.JoinGroup(kGroup)); - dest.Read(1024, base::Bind(&OnMulticastReadCompleted, run_loop.QuitClosure(), - &packet_received)); + { + net::TestCompletionCallback callback; + dest->Bind("0.0.0.0", kPort, callback.callback()); + EXPECT_EQ(net::OK, callback.WaitForResult()); + } + { + net::TestCompletionCallback callback; + dest->JoinGroup(kGroup, callback.callback()); + EXPECT_EQ(net::OK, callback.WaitForResult()); + } + base::RunLoop run_loop; + // |dest| is used with Bind(), so use RecvFrom() instead of Read(). + dest->RecvFrom(1024, + base::BindRepeating(&OnMulticastReadCompleted, + run_loop.QuitClosure(), &packet_received)); // Sender - EXPECT_EQ(0, src.SetMulticastTimeToLive(0)); - src.Connect(CreateAddressList(kGroup, kPort), - base::Bind(&SendMulticastPacket, run_loop.QuitClosure(), &src)); + EXPECT_EQ(0, src->SetMulticastTimeToLive(0)); + src->Connect(CreateAddressList(kGroup, kPort), + base::BindRepeating(&SendMulticastPacket, run_loop.QuitClosure(), + src.get())); // If not received within the test action timeout, quit the message loop. - io_loop.task_runner()->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), - TestTimeouts::action_timeout()); + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); run_loop.Run(); diff --git a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc index 8997b290ed0..2e38a78801c 100644 --- a/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc +++ b/chromium/chrome/browser/extensions/api/storage/managed_value_store_cache.cc @@ -173,9 +173,8 @@ void ManagedValueStoreCache::ExtensionTracker::LoadSchemas( } GetExtensionFileTaskRunner()->PostTask( - FROM_HERE, - base::BindOnce(&ExtensionTracker::LoadSchemasOnFileTaskRunner, - base::Passed(&added), weak_factory_.GetWeakPtr())); + FROM_HERE, base::BindOnce(&ExtensionTracker::LoadSchemasOnFileTaskRunner, + std::move(added), weak_factory_.GetWeakPtr())); } bool ManagedValueStoreCache::ExtensionTracker::UsesManagedStorage( @@ -327,7 +326,7 @@ void ManagedValueStoreCache::OnPolicyUpdated(const policy::PolicyNamespace& ns, GetBackendTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&ManagedValueStoreCache::UpdatePolicyOnBackend, base::Unretained(this), ns.component_id, - base::Passed(current.DeepCopy()))); + current.DeepCopy())); } // static diff --git a/chromium/chrome/browser/extensions/api/streams_private/streams_private_apitest.cc b/chromium/chrome/browser/extensions/api/streams_private/streams_private_apitest.cc index b62b194dcff..7cc6951d468 100644 --- a/chromium/chrome/browser/extensions/api/streams_private/streams_private_apitest.cc +++ b/chromium/chrome/browser/extensions/api/streams_private/streams_private_apitest.cc @@ -16,9 +16,10 @@ #include "chrome/common/extensions/api/streams_private.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/download/public/common/download_item.h" #include "components/prefs/pref_service.h" -#include "content/public/browser/download_item.h" #include "content/public/browser/download_manager.h" +#include "content/public/browser/download_request_utils.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_contents.h" #include "content/public/test/download_test_observer.h" @@ -35,10 +36,10 @@ using content::BrowserContext; using content::BrowserThread; -using content::DownloadItem; using content::DownloadManager; -using content::DownloadUrlParameters; using content::WebContents; +using download::DownloadItem; +using download::DownloadUrlParameters; using extensions::Event; using extensions::ExtensionSystem; using extensions::ResultCatcher; @@ -399,7 +400,7 @@ IN_PROC_BROWSER_TEST_F(StreamsPrivateApiTest, MAYBE_DirectDownload) { browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(web_contents); std::unique_ptr<DownloadUrlParameters> params( - DownloadUrlParameters::CreateForWebContentsMainFrame( + content::DownloadRequestUtils::CreateDownloadForWebContentsMainFrame( web_contents, url, TRAFFIC_ANNOTATION_FOR_TESTS)); params->set_file_path(target_path); diff --git a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h index cb4ad6f0b90..3e792d1bf2c 100644 --- a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h +++ b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_api.h @@ -15,7 +15,7 @@ #include "chrome/browser/sync_file_system/sync_status_code.h" #include "chrome/common/extensions/api/sync_file_system.h" #include "storage/browser/fileapi/file_system_url.h" -#include "third_party/WebKit/common/quota/quota_types.mojom.h" +#include "third_party/WebKit/public/mojom/quota/quota_types.mojom.h" namespace storage { class FileSystemContext; diff --git a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc index 4a19a726f23..2ff9bc7e96f 100644 --- a/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc @@ -10,7 +10,6 @@ #include "base/run_loop.h" #include "base/sequenced_task_runner.h" #include "base/task_scheduler/post_task.h" -#include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" #include "chrome/browser/apps/app_browsertest_util.h" diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc index 44d733eacea..520f0c136d0 100644 --- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc +++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc @@ -59,6 +59,7 @@ class TabCaptureApiTest : public ExtensionApiTest { class TabCaptureApiPixelTest : public TabCaptureApiTest { public: void SetUp() override { + // TODO(crbug/754872): Update this to match WCVCD content_browsertests. if (!IsTooIntensiveForThisPlatform()) EnablePixelOutput(); TabCaptureApiTest::SetUp(); @@ -178,8 +179,10 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, EndToEndWithoutRemoting) { return; } AddExtensionToCommandLineWhitelist(); + // TODO(crbug/758057): Determine why color accuracy went down in this test + // with the new VIZ-based tab capturer. ASSERT_TRUE(RunExtensionSubtest( - "tab_capture", "end_to_end.html?method=local&colorDeviation=10")) + "tab_capture", "end_to_end.html?method=local&colorDeviation=50")) << message_; } diff --git a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc index e1984cfcaaa..38e56a88a20 100644 --- a/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc +++ b/chromium/chrome/browser/extensions/api/tab_capture/tab_capture_performancetest.cc @@ -42,15 +42,9 @@ constexpr size_t kTrimEvents = 24; // 1 sec at 24fps, or 0.4 sec at 60 fps. constexpr size_t kMinDataPoints = 100; // ~5 sec at 24fps. enum TestFlags { - // TODO(miu): Remove kUseGpu (since the GPU is required), kForceGpuComposited - // (because there's no longer a such thing as Chrome w/o a compositor), and - // maybe kDisableVsync. http://crbug.com/567848 kUseGpu = 1 << 0, // Only execute test if --enable-gpu was given // on the command line. This is required for // tests that run on GPU. - kForceGpuComposited = 1 << 1, // Force the test to use the compositor. - kDisableVsync = 1 << 2, // Do not limit framerate to vertical refresh. - // when on GPU, nor to 60hz when not on GPU. kTestThroughWebRTC = 1 << 3, // Send video through a webrtc loopback. kSmallWindow = 1 << 4, // Window size: 1 = 800x600, 0 = 2000x1000 }; @@ -71,12 +65,8 @@ class TabCapturePerformanceTest std::string GetSuffixForTestFlags() { std::string suffix; - if (HasFlag(kForceGpuComposited)) - suffix += "_comp"; if (HasFlag(kUseGpu)) - suffix += "_gpu"; - if (HasFlag(kDisableVsync)) - suffix += "_novsync"; + suffix += "_comp_gpu"; if (HasFlag(kTestThroughWebRTC)) suffix += "_webrtc"; if (HasFlag(kSmallWindow)) @@ -86,6 +76,8 @@ class TabCapturePerformanceTest void SetUp() override { EnablePixelOutput(); + if (!HasFlag(kUseGpu)) + UseSoftwareCompositing(); ExtensionApiTest::SetUp(); } @@ -105,12 +97,10 @@ class TabCapturePerformanceTest if (!HasFlag(kUseGpu)) command_line->AppendSwitch(switches::kDisableGpu); - if (HasFlag(kDisableVsync)) - command_line->AppendSwitch(switches::kDisableGpuVsync); - command_line->AppendSwitchASCII( extensions::switches::kWhitelistedExtensionID, kExtensionId); + ExtensionApiTest::SetUpCommandLine(command_line); } @@ -258,9 +248,6 @@ class TabCapturePerformanceTest ASSERT_TRUE(tracing::BeginTracing("gpu,gpu.capture")); std::string page = "performance.html"; page += HasFlag(kTestThroughWebRTC) ? "?WebRTC=1" : "?WebRTC=0"; - // Ideally we'd like to run a higher capture rate when vsync is disabled, - // but libjingle currently doesn't allow that. - // page += HasFlag(kDisableVsync) ? "&fps=300" : "&fps=30"; page += "&fps=60"; ASSERT_TRUE(RunExtensionSubtest("tab_capture", page)) << message_; ASSERT_TRUE(tracing::EndTracing(&json_events)); @@ -303,15 +290,9 @@ IN_PROC_BROWSER_TEST_P(TabCapturePerformanceTest, Performance) { // Note: First argument is optional and intentionally left blank. // (it's a prefix for the generated test cases) -INSTANTIATE_TEST_CASE_P( - , - TabCapturePerformanceTest, - testing::Values( - 0, - kUseGpu | kForceGpuComposited, - kDisableVsync, - kDisableVsync | kUseGpu | kForceGpuComposited, - kTestThroughWebRTC, - kTestThroughWebRTC | kUseGpu | kForceGpuComposited, - kTestThroughWebRTC | kDisableVsync, - kTestThroughWebRTC | kDisableVsync | kUseGpu | kForceGpuComposited)); +INSTANTIATE_TEST_CASE_P(, + TabCapturePerformanceTest, + testing::Values(0, + kUseGpu, + kTestThroughWebRTC, + kTestThroughWebRTC | kUseGpu)); diff --git a/chromium/chrome/browser/extensions/api/tabs/app_window_controller.cc b/chromium/chrome/browser/extensions/api/tabs/app_window_controller.cc index 3d0bd3e606b..458fc5bdf09 100644 --- a/chromium/chrome/browser/extensions/api/tabs/app_window_controller.cc +++ b/chromium/chrome/browser/extensions/api/tabs/app_window_controller.cc @@ -7,14 +7,11 @@ #include <memory> #include <utility> -#include "base/strings/utf_string_conversions.h" -#include "base/values.h" #include "chrome/browser/extensions/api/tabs/app_base_window.h" #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/window_controller.h" #include "chrome/browser/extensions/window_controller_list.h" -#include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/common/url_constants.h" #include "extensions/browser/app_window/app_window.h" #include "extensions/browser/app_window/native_app_window.h" @@ -46,62 +43,6 @@ std::string AppWindowController::GetWindowTypeText() const { return tabs_constants::kWindowTypeValueApp; } -std::unique_ptr<base::DictionaryValue> -AppWindowController::CreateWindowValueWithTabs( - const Extension* extension) const { - std::unique_ptr<base::DictionaryValue> result = CreateWindowValue(); - - std::unique_ptr<base::DictionaryValue> tab_value = - CreateTabObject(extension, 0)->ToValue(); - if (!tab_value) - return result; - - auto tab_list = std::make_unique<base::ListValue>(); - tab_list->Append(std::move(tab_value)); - result->Set(tabs_constants::kTabsKey, std::move(tab_list)); - - return result; -} - -std::unique_ptr<api::tabs::Tab> AppWindowController::CreateTabObject( - const extensions::Extension* extension, - int tab_index) const { - if (tab_index > 0) - return nullptr; - - content::WebContents* web_contents = app_window_->web_contents(); - if (!web_contents) - return nullptr; - - std::unique_ptr<api::tabs::Tab> tab_object(new api::tabs::Tab); - tab_object->id.reset(new int(SessionTabHelper::IdForTab(web_contents))); - tab_object->index = 0; - tab_object->window_id = - SessionTabHelper::IdForWindowContainingTab(web_contents); - tab_object->url.reset(new std::string(web_contents->GetURL().spec())); - tab_object->status.reset(new std::string( - ExtensionTabUtil::GetTabStatusText(web_contents->IsLoading()))); - tab_object->active = app_window_->GetBaseWindow()->IsActive(); - tab_object->selected = true; - tab_object->highlighted = true; - tab_object->pinned = false; - tab_object->title.reset( - new std::string(base::UTF16ToUTF8(web_contents->GetTitle()))); - tab_object->incognito = app_window_->GetBaseWindow()->IsActive(); - gfx::Rect bounds = app_window_->GetBaseWindow()->GetBounds(); - tab_object->width.reset(new int(bounds.width())); - tab_object->height.reset(new int(bounds.height())); - - const Extension* ext = app_window_->GetExtension(); - if (ext) { - std::string icon_str(chrome::kChromeUIFaviconURL); - icon_str.append(app_window_->GetExtension()->url().spec()); - tab_object->fav_icon_url.reset(new std::string(icon_str)); - } - - return tab_object; -} - bool AppWindowController::CanClose(Reason* reason) const { return true; } @@ -121,8 +62,9 @@ Browser* AppWindowController::GetBrowser() const { return nullptr; } -bool AppWindowController::IsVisibleToExtension( - const Extension* extension) const { +bool AppWindowController::IsVisibleToTabsAPIForExtension( + const Extension* extension, + bool allow_dev_tools_windows) const { DCHECK(extension); return extension->id() == app_window_->extension_id(); } diff --git a/chromium/chrome/browser/extensions/api/tabs/app_window_controller.h b/chromium/chrome/browser/extensions/api/tabs/app_window_controller.h index 8b8511a7a65..a5fd5850302 100644 --- a/chromium/chrome/browser/extensions/api/tabs/app_window_controller.h +++ b/chromium/chrome/browser/extensions/api/tabs/app_window_controller.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_TABS_APP_WINDOW_CONTROLLER_H_ #define CHROME_BROWSER_EXTENSIONS_API_TABS_APP_WINDOW_CONTROLLER_H_ +#include <memory> #include <string> #include "base/macros.h" @@ -28,17 +29,13 @@ class AppWindowController : public WindowController { // extensions::WindowController: int GetWindowId() const override; std::string GetWindowTypeText() const override; - std::unique_ptr<base::DictionaryValue> CreateWindowValueWithTabs( - const Extension* extension) const override; - std::unique_ptr<api::tabs::Tab> CreateTabObject( - const extensions::Extension* extension, - int tab_index) const override; - bool CanClose(Reason* reason) const override; void SetFullscreenMode(bool is_fullscreen, const GURL& extension_url) const override; Browser* GetBrowser() const override; - bool IsVisibleToExtension(const Extension* extension) const override; + bool IsVisibleToTabsAPIForExtension( + const Extension* extension, + bool allow_dev_tools_windows) const override; private: AppWindow* app_window_; // Owns us. diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc index e802ba0057a..1376d685bf8 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api.cc @@ -95,11 +95,17 @@ #include "ui/base/ui_base_types.h" #if defined(OS_CHROMEOS) +#include "ash/public/cpp/config.h" #include "ash/public/cpp/window_pin_type.h" #include "ash/public/cpp/window_properties.h" #include "ash/public/interfaces/window_pin_type.mojom.h" +#include "chrome/browser/chromeos/ash_config.h" +#include "chrome/browser/ui/ash/chrome_screenshot_grabber.h" #include "chrome/browser/ui/browser_command_controller.h" +#include "content/public/browser/devtools_agent_host.h" #include "ui/aura/window.h" +#include "ui/base/clipboard/clipboard.h" +#include "ui/base/clipboard/clipboard_types.h" #endif using content::BrowserThread; @@ -256,19 +262,34 @@ bool IsValidStateForWindowsCreateFunction( } #if defined(OS_CHROMEOS) -void SetWindowTrustedPinned(ui::BaseWindow* base_window, bool trusted_pinned) { - aura::Window* window = base_window->GetNativeWindow(); +bool ExtensionHasLockedFullscreenPermission(const Extension* extension) { + return extension->permissions_data()->HasAPIPermission( + APIPermission::kLockWindowFullscreenPrivate); +} + +void SetLockedFullscreenState(Browser* browser, bool locked) { + aura::Window* window = browser->window()->GetNativeWindow(); // TRUSTED_PINNED is used here because that one locks the window fullscreen // without allowing the user to exit (as opposed to regular PINNED). window->SetProperty(ash::kWindowPinTypeKey, - trusted_pinned ? ash::mojom::WindowPinType::TRUSTED_PINNED - : ash::mojom::WindowPinType::NONE); -} + locked ? ash::mojom::WindowPinType::TRUSTED_PINNED + : ash::mojom::WindowPinType::NONE); -bool ExtensionHasLockedFullscreenPermission(const Extension* extension) { - return extension->permissions_data()->HasAPIPermission( - APIPermission::kLockWindowFullscreenPrivate); + // Update the set of available browser commands. + browser->command_controller()->LockedFullscreenStateChanged(); + + // Disallow screenshots in locked fullscreen mode. + // TODO(isandrk, 816900): ChromeScreenshotGrabber isn't implemented in Mash + // yet, remove this conditional when it becomes available. + if (chromeos::GetAshConfig() != ash::Config::MASH) + ChromeScreenshotGrabber::Get()->set_screenshots_allowed(!locked); + + // Reset the clipboard and kill dev tools when entering or exiting locked + // fullscreen (security concerns). + ui::Clipboard::GetForCurrentThread()->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE); + content::DevToolsAgentHost::DetachAllClients(); } + #endif // defined(OS_CHROMEOS) } // namespace @@ -304,18 +325,20 @@ ExtensionFunction::ResponseAction WindowsGetFunction::Run() { EXTENSION_FUNCTION_VALIDATE(params.get()); ApiParameterExtractor<windows::Get::Params> extractor(params.get()); - WindowController* controller = nullptr; + Browser* browser = nullptr; std::string error; - if (!windows_util::GetWindowFromWindowID(this, params->window_id, - extractor.type_filters(), - &controller, &error)) { + if (!windows_util::GetBrowserFromWindowID(this, params->window_id, + extractor.type_filters(), &browser, + &error)) { return RespondNow(Error(error)); } + ExtensionTabUtil::PopulateTabBehavior populate_tab_behavior = + extractor.populate_tabs() ? ExtensionTabUtil::kPopulateTabs + : ExtensionTabUtil::kDontPopulateTabs; std::unique_ptr<base::DictionaryValue> windows = - extractor.populate_tabs() - ? controller->CreateWindowValueWithTabs(extension()) - : controller->CreateWindowValue(); + ExtensionTabUtil::CreateWindowValueForExtension(*browser, extension(), + populate_tab_behavior); return RespondNow(OneArgument(std::move(windows))); } @@ -325,18 +348,20 @@ ExtensionFunction::ResponseAction WindowsGetCurrentFunction::Run() { EXTENSION_FUNCTION_VALIDATE(params.get()); ApiParameterExtractor<windows::GetCurrent::Params> extractor(params.get()); - WindowController* controller = nullptr; + Browser* browser = nullptr; std::string error; - if (!windows_util::GetWindowFromWindowID( + if (!windows_util::GetBrowserFromWindowID( this, extension_misc::kCurrentWindowId, extractor.type_filters(), - &controller, &error)) { + &browser, &error)) { return RespondNow(Error(error)); } + ExtensionTabUtil::PopulateTabBehavior populate_tab_behavior = + extractor.populate_tabs() ? ExtensionTabUtil::kPopulateTabs + : ExtensionTabUtil::kDontPopulateTabs; std::unique_ptr<base::DictionaryValue> windows = - extractor.populate_tabs() - ? controller->CreateWindowValueWithTabs(extension()) - : controller->CreateWindowValue(); + ExtensionTabUtil::CreateWindowValueForExtension(*browser, extension(), + populate_tab_behavior); return RespondNow(OneArgument(std::move(windows))); } @@ -349,22 +374,28 @@ ExtensionFunction::ResponseAction WindowsGetLastFocusedFunction::Run() { params.get()); // The WindowControllerList should contain a list of application, // browser and devtools windows. - WindowController* controller = nullptr; - for (auto* iter : WindowControllerList::GetInstance()->windows()) { - if (windows_util::CanOperateOnWindow(this, iter, + Browser* browser = nullptr; + for (auto* controller : WindowControllerList::GetInstance()->windows()) { + if (controller->GetBrowser() && + windows_util::CanOperateOnWindow(this, controller, extractor.type_filters())) { - controller = iter; + // TODO(devlin): Doesn't this mean that we'll use the last window in the + // list if there is no active window? That seems wrong. + // See https://crbug.com/809822. + browser = controller->GetBrowser(); if (controller->window()->IsActive()) break; // Use focused window. } } - if (!controller) + if (!browser) return RespondNow(Error(keys::kNoLastFocusedWindowError)); + ExtensionTabUtil::PopulateTabBehavior populate_tab_behavior = + extractor.populate_tabs() ? ExtensionTabUtil::kPopulateTabs + : ExtensionTabUtil::kDontPopulateTabs; std::unique_ptr<base::DictionaryValue> windows = - extractor.populate_tabs() - ? controller->CreateWindowValueWithTabs(extension()) - : controller->CreateWindowValue(); + ExtensionTabUtil::CreateWindowValueForExtension(*browser, extension(), + populate_tab_behavior); return RespondNow(OneArgument(std::move(windows))); } @@ -375,18 +406,17 @@ ExtensionFunction::ResponseAction WindowsGetAllFunction::Run() { ApiParameterExtractor<windows::GetAll::Params> extractor(params.get()); std::unique_ptr<base::ListValue> window_list(new base::ListValue()); - const WindowControllerList::ControllerList& windows = - WindowControllerList::GetInstance()->windows(); - for (WindowControllerList::ControllerList::const_iterator iter = - windows.begin(); - iter != windows.end(); ++iter) { - if (!windows_util::CanOperateOnWindow(this, *iter, - extractor.type_filters())) + ExtensionTabUtil::PopulateTabBehavior populate_tab_behavior = + extractor.populate_tabs() ? ExtensionTabUtil::kPopulateTabs + : ExtensionTabUtil::kDontPopulateTabs; + for (auto* controller : WindowControllerList::GetInstance()->windows()) { + if (!controller->GetBrowser() || + !windows_util::CanOperateOnWindow(this, controller, + extractor.type_filters())) { continue; - if (extractor.populate_tabs()) - window_list->Append((*iter)->CreateWindowValueWithTabs(extension())); - else - window_list->Append((*iter)->CreateWindowValue()); + } + window_list->Append(ExtensionTabUtil::CreateWindowValueForExtension( + *controller->GetBrowser(), extension(), populate_tab_behavior)); } return RespondNow(OneArgument(std::move(window_list))); @@ -639,8 +669,7 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() { // (otherwise the tabstrip is empty). if (create_data && create_data->state == windows::WINDOW_STATE_LOCKED_FULLSCREEN) { - SetWindowTrustedPinned(new_window->window(), true); - new_window->command_controller()->LockedFullscreenStateChanged(); + SetLockedFullscreenState(new_window, true); } #endif @@ -649,8 +678,6 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() { else new_window->window()->ShowInactive(); - WindowController* controller = new_window->extension_window_controller(); - std::unique_ptr<base::Value> result; if (new_window->profile()->IsOffTheRecord() && !browser_context()->IsOffTheRecord() && !include_incognito()) { @@ -658,7 +685,8 @@ ExtensionFunction::ResponseAction WindowsCreateFunction::Run() { // profile and CanCrossIncognito isn't allowed. result = std::make_unique<base::Value>(); } else { - result = controller->CreateWindowValueWithTabs(extension()); + result = ExtensionTabUtil::CreateWindowValueForExtension( + *new_window, extension(), ExtensionTabUtil::kPopulateTabs); } return RespondNow(OneArgument(std::move(result))); @@ -669,11 +697,11 @@ ExtensionFunction::ResponseAction WindowsUpdateFunction::Run() { windows::Update::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); - WindowController* controller; + Browser* browser = nullptr; std::string error; - if (!windows_util::GetWindowFromWindowID( + if (!windows_util::GetBrowserFromWindowID( this, params->window_id, WindowController::GetAllWindowFilter(), - &controller, &error)) { + &browser, &error)) { return RespondNow(Error(error)); } @@ -683,7 +711,7 @@ ExtensionFunction::ResponseAction WindowsUpdateFunction::Run() { #if defined(OS_CHROMEOS) const bool is_window_trusted_pinned = - ash::IsWindowTrustedPinned(controller->window()); + ash::IsWindowTrustedPinned(browser->window()); // Don't allow locked fullscreen operations on a window without the proper // permission (also don't allow any operations on a locked window if the // extension doesn't have the permission). @@ -698,15 +726,11 @@ ExtensionFunction::ResponseAction WindowsUpdateFunction::Run() { if (is_window_trusted_pinned && params->update_info.state != windows::WINDOW_STATE_LOCKED_FULLSCREEN && params->update_info.state != windows::WINDOW_STATE_NONE) { - SetWindowTrustedPinned(controller->window(), false); - controller->GetBrowser()->command_controller()-> - LockedFullscreenStateChanged(); + SetLockedFullscreenState(browser, false); } else if (!is_window_trusted_pinned && params->update_info.state == windows::WINDOW_STATE_LOCKED_FULLSCREEN) { - SetWindowTrustedPinned(controller->window(), true); - controller->GetBrowser()->command_controller()-> - LockedFullscreenStateChanged(); + SetLockedFullscreenState(browser, true); } #endif @@ -714,34 +738,38 @@ ExtensionFunction::ResponseAction WindowsUpdateFunction::Run() { ConvertToWindowShowState(params->update_info.state); if (show_state != ui::SHOW_STATE_FULLSCREEN && - show_state != ui::SHOW_STATE_DEFAULT) - controller->SetFullscreenMode(false, extension()->url()); + show_state != ui::SHOW_STATE_DEFAULT) { + browser->extension_window_controller()->SetFullscreenMode( + false, extension()->url()); + } switch (show_state) { case ui::SHOW_STATE_MINIMIZED: - controller->window()->Minimize(); + browser->window()->Minimize(); break; case ui::SHOW_STATE_MAXIMIZED: - controller->window()->Maximize(); + browser->window()->Maximize(); break; case ui::SHOW_STATE_FULLSCREEN: - if (controller->window()->IsMinimized() || - controller->window()->IsMaximized()) - controller->window()->Restore(); - controller->SetFullscreenMode(true, extension()->url()); + if (browser->window()->IsMinimized() || + browser->window()->IsMaximized()) { + browser->window()->Restore(); + } + browser->extension_window_controller()->SetFullscreenMode( + true, extension()->url()); break; case ui::SHOW_STATE_NORMAL: - controller->window()->Restore(); + browser->window()->Restore(); break; default: break; } gfx::Rect bounds; - if (controller->window()->IsMinimized()) - bounds = controller->window()->GetRestoredBounds(); + if (browser->window()->IsMinimized()) + bounds = browser->window()->GetRestoredBounds(); else - bounds = controller->window()->GetBounds(); + bounds = browser->window()->GetBounds(); bool set_bounds = false; // Any part of the bounds can optionally be set by the caller. @@ -773,27 +801,28 @@ ExtensionFunction::ResponseAction WindowsUpdateFunction::Run() { } // TODO(varkha): Updating bounds during a drag can cause problems and a more // general solution is needed. See http://crbug.com/251813 . - controller->window()->SetBounds(bounds); + browser->window()->SetBounds(bounds); } if (params->update_info.focused) { if (*params->update_info.focused) { if (show_state == ui::SHOW_STATE_MINIMIZED) return RespondNow(Error(keys::kInvalidWindowStateError)); - controller->window()->Activate(); + browser->window()->Activate(); } else { if (show_state == ui::SHOW_STATE_MAXIMIZED || show_state == ui::SHOW_STATE_FULLSCREEN) { return RespondNow(Error(keys::kInvalidWindowStateError)); } - controller->window()->Deactivate(); + browser->window()->Deactivate(); } } if (params->update_info.draw_attention) - controller->window()->FlashFrame(*params->update_info.draw_attention); + browser->window()->FlashFrame(*params->update_info.draw_attention); - return RespondNow(OneArgument(controller->CreateWindowValue())); + return RespondNow(OneArgument(ExtensionTabUtil::CreateWindowValueForExtension( + *browser, extension(), ExtensionTabUtil::kDontPopulateTabs))); } ExtensionFunction::ResponseAction WindowsRemoveFunction::Run() { @@ -801,22 +830,23 @@ ExtensionFunction::ResponseAction WindowsRemoveFunction::Run() { windows::Remove::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params); - WindowController* controller = nullptr; + Browser* browser = nullptr; std::string error; - if (!windows_util::GetWindowFromWindowID(this, params->window_id, - WindowController::kNoWindowFilter, - &controller, &error)) { + if (!windows_util::GetBrowserFromWindowID(this, params->window_id, + WindowController::kNoWindowFilter, + &browser, &error)) { return RespondNow(Error(error)); } #if defined(OS_CHROMEOS) - if (ash::IsWindowTrustedPinned(controller->window()) && + if (ash::IsWindowTrustedPinned(browser->window()) && !ExtensionHasLockedFullscreenPermission(extension())) { return RespondNow( Error(keys::kMissingLockWindowFullscreenPrivatePermission)); } #endif + WindowController* controller = browser->extension_window_controller(); WindowController::Reason reason; if (!controller->CanClose(&reason)) { return RespondNow(Error(reason == WindowController::REASON_NOT_EDITABLE @@ -850,7 +880,8 @@ ExtensionFunction::ResponseAction TabsGetSelectedFunction::Run() { return RespondNow(Error(keys::kNoSelectedTabError)); return RespondNow(ArgumentList( tabs::Get::Results::Create(*ExtensionTabUtil::CreateTabObject( - contents, tab_strip, tab_strip->active_index(), extension())))); + contents, ExtensionTabUtil::kScrubTab, extension(), tab_strip, + tab_strip->active_index())))); } ExtensionFunction::ResponseAction TabsGetAllInWindowFunction::Run() { @@ -928,8 +959,8 @@ ExtensionFunction::ResponseAction TabsQueryFunction::Run() { if (!include_incognito() && profile != browser->profile()) continue; - if (!browser->extension_window_controller()->IsVisibleToExtension( - extension())) { + if (!browser->extension_window_controller()->IsVisibleToTabsAPIForExtension( + extension(), false /*allow_dev_tools_windows*/)) { continue; } @@ -1033,8 +1064,9 @@ ExtensionFunction::ResponseAction TabsQueryFunction::Run() { if (loading_status_set && loading != web_contents->IsLoading()) continue; - result->Append(ExtensionTabUtil::CreateTabObject(web_contents, tab_strip, - i, extension()) + result->Append(ExtensionTabUtil::CreateTabObject( + web_contents, ExtensionTabUtil::kScrubTab, extension(), + tab_strip, i) ->ToValue()); } } @@ -1101,7 +1133,8 @@ ExtensionFunction::ResponseAction TabsDuplicateFunction::Run() { return RespondNow(ArgumentList( tabs::Get::Results::Create(*ExtensionTabUtil::CreateTabObject( - new_contents, new_tab_strip, new_tab_index, extension())))); + new_contents, ExtensionTabUtil::kScrubTab, extension(), new_tab_strip, + new_tab_index)))); } ExtensionFunction::ResponseAction TabsGetFunction::Run() { @@ -1118,9 +1151,9 @@ ExtensionFunction::ResponseAction TabsGetFunction::Run() { return RespondNow(Error(error)); } - return RespondNow(ArgumentList( - tabs::Get::Results::Create(*ExtensionTabUtil::CreateTabObject( - contents, tab_strip, tab_index, extension())))); + return RespondNow(ArgumentList(tabs::Get::Results::Create( + *ExtensionTabUtil::CreateTabObject(contents, ExtensionTabUtil::kScrubTab, + extension(), tab_strip, tab_index)))); } ExtensionFunction::ResponseAction TabsGetCurrentFunction::Run() { @@ -1131,8 +1164,8 @@ ExtensionFunction::ResponseAction TabsGetCurrentFunction::Run() { WebContents* caller_contents = GetSenderWebContents(); std::unique_ptr<base::ListValue> results; if (caller_contents && ExtensionTabUtil::GetTabId(caller_contents) >= 0) { - results = tabs::Get::Results::Create( - *ExtensionTabUtil::CreateTabObject(caller_contents, extension())); + results = tabs::Get::Results::Create(*ExtensionTabUtil::CreateTabObject( + caller_contents, ExtensionTabUtil::kScrubTab, extension())); } return RespondNow(results ? ArgumentList(std::move(results)) : NoArguments()); } @@ -1179,9 +1212,8 @@ ExtensionFunction::ResponseAction TabsHighlightFunction::Run() { selection.set_active(active_index); browser->tab_strip_model()->SetSelectionFromModel(std::move(selection)); - return RespondNow(OneArgument( - browser->extension_window_controller()->CreateWindowValueWithTabs( - extension()))); + return RespondNow(OneArgument(ExtensionTabUtil::CreateWindowValueForExtension( + *browser, extension(), ExtensionTabUtil::kPopulateTabs))); } bool TabsHighlightFunction::HighlightTab(TabStripModel* tabstrip, @@ -1215,7 +1247,7 @@ bool TabsUpdateFunction::RunAsync() { int tab_id = -1; WebContents* contents = NULL; if (!params->tab_id.get()) { - Browser* browser = GetCurrentBrowser(); + Browser* browser = ChromeExtensionFunctionDetails(this).GetCurrentBrowser(); if (!browser) { error_ = keys::kNoCurrentWindowError; return false; @@ -1389,7 +1421,7 @@ bool TabsUpdateFunction::UpdateURL(const std::string &url_string, ScriptExecutor::SINGLE_FRAME, ExtensionApiFrameIdMap::kTopFrameId, ScriptExecutor::DONT_MATCH_ABOUT_BLANK, UserScript::DOCUMENT_IDLE, ScriptExecutor::MAIN_WORLD, ScriptExecutor::DEFAULT_PROCESS, GURL(), - GURL(), user_gesture(), ScriptExecutor::NO_RESULT, + GURL(), user_gesture(), base::nullopt, ScriptExecutor::NO_RESULT, base::Bind(&TabsUpdateFunction::OnExecuteCodeFinished, this)); *is_async = true; @@ -1423,8 +1455,8 @@ void TabsUpdateFunction::PopulateResult() { if (!has_callback()) return; - results_ = tabs::Get::Results::Create( - *ExtensionTabUtil::CreateTabObject(web_contents_, extension())); + results_ = tabs::Get::Results::Create(*ExtensionTabUtil::CreateTabObject( + web_contents_, ExtensionTabUtil::kScrubTab, extension())); } void TabsUpdateFunction::OnExecuteCodeFinished( @@ -1552,10 +1584,10 @@ bool TabsMoveFunction::MoveTab(int tab_id, *new_index, web_contents, TabStripModel::ADD_NONE); if (has_callback()) { - tab_values->Append( - ExtensionTabUtil::CreateTabObject(web_contents, target_tab_strip, - *new_index, extension()) - ->ToValue()); + tab_values->Append(ExtensionTabUtil::CreateTabObject( + web_contents, ExtensionTabUtil::kScrubTab, + extension(), target_tab_strip, *new_index) + ->ToValue()); } return true; @@ -1574,7 +1606,8 @@ bool TabsMoveFunction::MoveTab(int tab_id, if (has_callback()) { tab_values->Append(ExtensionTabUtil::CreateTabObject( - contents, source_tab_strip, *new_index, extension()) + contents, ExtensionTabUtil::kScrubTab, extension(), + source_tab_strip, *new_index) ->ToValue()); } @@ -1682,10 +1715,9 @@ bool TabsCaptureVisibleTabFunction::HasPermission() { return true; } -bool TabsCaptureVisibleTabFunction::IsScreenshotEnabled() { +bool TabsCaptureVisibleTabFunction::IsScreenshotEnabled() const { PrefService* service = chrome_details_.GetProfile()->GetPrefs(); if (service->GetBoolean(prefs::kDisableScreenshots)) { - error_ = keys::kScreenshotsDisabled; return false; } return true; @@ -1730,10 +1762,14 @@ bool TabsCaptureVisibleTabFunction::RunAsync() { WebContents* contents = GetWebContentsForID(context_id); - return CaptureAsync( + const CaptureResult capture_result = CaptureAsync( contents, image_details.get(), - base::Bind(&TabsCaptureVisibleTabFunction::CopyFromSurfaceComplete, - this)); + base::BindOnce(&TabsCaptureVisibleTabFunction::CopyFromSurfaceComplete, + this)); + if (capture_result == OK) + return true; + SetErrorMessage(capture_result); + return false; } void TabsCaptureVisibleTabFunction::OnCaptureSuccess(const SkBitmap& bitmap) { @@ -1747,11 +1783,16 @@ void TabsCaptureVisibleTabFunction::OnCaptureSuccess(const SkBitmap& bitmap) { SendResponse(true); } -void TabsCaptureVisibleTabFunction::OnCaptureFailure(FailureReason reason) { +void TabsCaptureVisibleTabFunction::OnCaptureFailure(CaptureResult result) { + SetErrorMessage(result); + SendResponse(false); +} + +void TabsCaptureVisibleTabFunction::SetErrorMessage(CaptureResult result) { const char* reason_description = "internal error"; - switch (reason) { - case FAILURE_REASON_UNKNOWN: - reason_description = "unknown error"; + switch (result) { + case FAILURE_REASON_READBACK_FAILED: + reason_description = "image readback failed"; break; case FAILURE_REASON_ENCODING_FAILED: reason_description = "encoding failed"; @@ -1759,10 +1800,16 @@ void TabsCaptureVisibleTabFunction::OnCaptureFailure(FailureReason reason) { case FAILURE_REASON_VIEW_INVISIBLE: reason_description = "view is invisible"; break; + case FAILURE_REASON_SCREEN_SHOTS_DISABLED: + error_ = keys::kScreenshotsDisabled; + return; + case OK: + NOTREACHED() + << "SetErrorMessage should not be called with a successful result"; + return; } error_ = ErrorUtils::FormatErrorMessage("Failed to capture tab: *", reason_description); - SendResponse(false); } void TabsCaptureVisibleTabFunction::RegisterProfilePrefs( @@ -1790,7 +1837,7 @@ bool TabsDetectLanguageFunction::RunAsync() { if (!browser || !contents) return false; } else { - browser = GetCurrentBrowser(); + browser = ChromeExtensionFunctionDetails(this).GetCurrentBrowser(); if (!browser) return false; contents = browser->tab_strip_model()->GetActiveWebContents(); @@ -2020,7 +2067,7 @@ content::WebContents* ZoomAPIFunction::GetWebContents(int tab_id) { nullptr /* ignore TabStripModel* output */, &web_contents, nullptr /* ignore int tab_index output */, &error_); } else { - Browser* browser = GetCurrentBrowser(); + Browser* browser = ChromeExtensionFunctionDetails(this).GetCurrentBrowser(); if (!browser) error_ = keys::kNoCurrentWindowError; else if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, NULL)) @@ -2177,8 +2224,9 @@ ExtensionFunction::ResponseAction TabsDiscardFunction::Run() { // Create the Tab object and return it in case of success. if (contents) { - return RespondNow(ArgumentList(tabs::Discard::Results::Create( - *ExtensionTabUtil::CreateTabObject(contents)))); + return RespondNow(ArgumentList( + tabs::Discard::Results::Create(*ExtensionTabUtil::CreateTabObject( + contents, ExtensionTabUtil::kScrubTab, extension())))); } // Return appropriate error message otherwise. diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api.h b/chromium/chrome/browser/extensions/api/tabs/tabs_api.h index c8e4071ec5a..7fe5521cd41 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_api.h +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api.h @@ -215,10 +215,13 @@ class TabsCaptureVisibleTabFunction content::WebContents* GetWebContentsForID(int window_id); // extensions::WebContentsCaptureClient: - bool IsScreenshotEnabled() override; + bool IsScreenshotEnabled() const override; bool ClientAllowsTransparency() override; void OnCaptureSuccess(const SkBitmap& bitmap) override; - void OnCaptureFailure(FailureReason reason) override; + void OnCaptureFailure(CaptureResult result) override; + + private: + void SetErrorMessage(CaptureResult result); DECLARE_EXTENSION_FUNCTION("tabs.captureVisibleTab", TABS_CAPTUREVISIBLETAB) }; diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc index d06d5513d00..220421eef7b 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc @@ -15,12 +15,12 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/test/base/test_browser_window.h" #include "content/public/browser/navigation_entry.h" -#include "content/public/common/browser_side_navigation_policy.h" #include "content/public/test/browser_side_navigation_test_utils.h" #include "content/public/test/web_contents_tester.h" #include "extensions/browser/api_test_utils.h" #include "extensions/common/constants.h" #include "extensions/common/extension_builder.h" +#include "ui/display/test/test_screen.h" namespace extensions { @@ -34,8 +34,7 @@ std::unique_ptr<base::ListValue> RunTabsQueryFunction( function->set_extension(extension); std::unique_ptr<base::Value> value( extension_function_test_utils::RunFunctionAndReturnSingleResult( - function.get(), query_info, browser, - extension_function_test_utils::NONE)); + function.get(), query_info, browser, api_test_utils::NONE)); return base::ListValue::From(std::move(value)); } @@ -57,28 +56,28 @@ class TabsApiUnitTest : public ExtensionServiceTestBase { std::unique_ptr<TestBrowserWindow> browser_window_; std::unique_ptr<Browser> browser_; + display::test::TestScreen test_screen_; + DISALLOW_COPY_AND_ASSIGN(TabsApiUnitTest); }; void TabsApiUnitTest::SetUp() { ExtensionServiceTestBase::SetUp(); InitializeEmptyExtensionService(); - - if (content::IsBrowserSideNavigationEnabled()) - content::BrowserSideNavigationSetUp(); + content::BrowserSideNavigationSetUp(); browser_window_.reset(new TestBrowserWindow()); Browser::CreateParams params(profile(), true); params.type = Browser::TYPE_TABBED; params.window = browser_window_.get(); browser_.reset(new Browser(params)); + display::Screen::SetScreenInstance(&test_screen_); } void TabsApiUnitTest::TearDown() { browser_.reset(); browser_window_.reset(); - if (content::IsBrowserSideNavigationEnabled()) - content::BrowserSideNavigationTearDown(); + content::BrowserSideNavigationTearDown(); ExtensionServiceTestBase::TearDown(); } @@ -293,7 +292,7 @@ TEST_F(TabsApiUnitTest, ExecuteScriptNoTabIsNonFatalError) { std::string error = extension_function_test_utils::RunFunctionAndReturnError( function.get(), kArgs, browser(), // browser() doesn't have any tabs. - extension_function_test_utils::NONE); + api_test_utils::NONE); EXPECT_EQ(tabs_constants::kNoTabInBrowserWindowError, error); } diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc index 1ab063b1ea9..af63faf2661 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_event_router.cc @@ -45,7 +45,8 @@ bool WillDispatchTabUpdatedEvent( Event* event, const base::DictionaryValue* listener_filter) { std::unique_ptr<api::tabs::Tab> tab_object = - ExtensionTabUtil::CreateTabObject(contents, extension); + ExtensionTabUtil::CreateTabObject(contents, ExtensionTabUtil::kScrubTab, + extension); std::unique_ptr<base::DictionaryValue> tab_value = tab_object->ToValue(); @@ -190,7 +191,9 @@ static bool WillDispatchTabCreatedEvent( const base::DictionaryValue* listener_filter) { event->event_args->Clear(); std::unique_ptr<base::DictionaryValue> tab_value = - ExtensionTabUtil::CreateTabObject(contents, extension)->ToValue(); + ExtensionTabUtil::CreateTabObject(contents, ExtensionTabUtil::kScrubTab, + extension) + ->ToValue(); tab_value->SetBoolean(tabs_constants::kSelectedKey, active); tab_value->SetBoolean(tabs_constants::kActiveKey, active); event->event_args->Append(std::move(tab_value)); diff --git a/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc b/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc index 01abcd19bea..82fa8cfe3d3 100644 --- a/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc +++ b/chromium/chrome/browser/extensions/api/tabs/tabs_test.cc @@ -225,12 +225,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, MAYBE_GetWindow) { // With "include_incognito". function = new WindowsGetFunction(); function->set_extension(extension.get()); - result.reset(utils::ToDictionary( - utils::RunFunctionAndReturnSingleResult( - function.get(), - base::StringPrintf("[%u]", incognito_window_id), - browser(), - utils::INCLUDE_INCOGNITO))); + result.reset(utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( + function.get(), base::StringPrintf("[%u]", incognito_window_id), + browser(), api_test_utils::INCLUDE_INCOGNITO))); EXPECT_TRUE(api_test_utils::GetBoolean(result.get(), "incognito")); // DevTools window. @@ -244,7 +241,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, MAYBE_GetWindow) { base::StringPrintf("[%u, {\"windowTypes\": [\"devtools\"]}]", ExtensionTabUtil::GetWindowId( DevToolsWindowTesting::Get(devtools)->browser())), - browser(), utils::INCLUDE_INCOGNITO))); + browser(), api_test_utils::INCLUDE_INCOGNITO))); EXPECT_EQ("devtools", api_test_utils::GetString(result.get(), "type")); DevToolsWindowTesting::CloseDevToolsWindowSync(devtools); @@ -301,12 +298,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindows) { window_ids.insert(ExtensionTabUtil::GetWindowId(new_browser)); } - // Application windows should not be accessible, unless allWindowTypes is set - // to true. + // Application windows should not be accessible to extensions (app windows are + // only accessible to the owning item). AppWindow* app_window = CreateTestAppWindow("{}"); - // Undocked DevTools window should not be accessible, unless allWindowTypes is - // set to true. + // Undocked DevTools window should not be accessible, unless included in the + // type filter mask. DevToolsWindow* devtools = DevToolsWindowTesting::OpenDevToolsWindowSync( browser()->tab_strip_model()->GetWebContentsAt(0), false /* is_docked */); @@ -370,11 +367,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindowsAllTypes) { window_ids.insert(ExtensionTabUtil::GetWindowId(new_browser)); } - // Application windows should be accessible. + // Application windows should not be accessible to extensions (app windows are + // only accessible to the owning item). AppWindow* app_window = CreateTestAppWindow("{}"); - window_ids.insert(app_window->session_id().id()); - // Undocked DevTools window should be accessible too. + // Undocked DevTools window should be accessible too, since they have been + // explicitly requested as part of the type filter mask. DevToolsWindow* devtools = DevToolsWindowTesting::OpenDevToolsWindowSync( browser()->tab_strip_model()->GetWebContentsAt(0), false /* is_docked */); window_ids.insert(ExtensionTabUtil::GetWindowId( @@ -401,8 +399,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindowsAllTypes) { base::ListValue* tabs = nullptr; EXPECT_FALSE(result_window->GetList(keys::kTabsKey, &tabs)); } - // The returned ids should contain all the current app, browser and - // devtools instance ids. + // The returned ids should contain all the browser and devtools instance ids. EXPECT_EQ(window_ids, result_ids); result_ids.clear(); @@ -425,8 +422,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, GetAllWindowsAllTypes) { base::ListValue* tabs = nullptr; EXPECT_TRUE(result_window->GetList(keys::kTabsKey, &tabs)); } - // The returned ids should contain all the current app, browser and - // devtools instance ids. + // The returned ids should contain all the browser and devtools instance ids. EXPECT_EQ(window_ids, result_ids); DevToolsWindowTesting::CloseDevToolsWindowSync(devtools); @@ -468,7 +464,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, std::string error = extension_function_test_utils::RunFunctionAndReturnError( update_tab_function.get(), kArgsWithNonIncognitoUrl, incognito, // incognito doesn't have any tabs. - extension_function_test_utils::NONE); + api_test_utils::NONE); EXPECT_EQ(ErrorUtils::FormatErrorMessage( tabs_constants::kURLsNotAllowedInIncognitoError, "chrome://extensions/configureCommands"), @@ -496,7 +492,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DefaultToIncognitoWhenItIsForced) { std::unique_ptr<base::DictionaryValue> result( utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( function.get(), kArgsWithoutExplicitIncognitoParam, browser(), - utils::INCLUDE_INCOGNITO))); + api_test_utils::INCLUDE_INCOGNITO))); // Make sure it is a new(different) window. EXPECT_NE(ExtensionTabUtil::GetWindowId(browser()), @@ -511,12 +507,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DefaultToIncognitoWhenItIsForced) { function->SetRenderFrameHost( browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()); function->set_extension(extension.get()); - result.reset(utils::ToDictionary( - utils::RunFunctionAndReturnSingleResult( - function.get(), - kArgsWithoutExplicitIncognitoParam, - incognito_browser, - utils::INCLUDE_INCOGNITO))); + result.reset(utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( + function.get(), kArgsWithoutExplicitIncognitoParam, incognito_browser, + api_test_utils::INCLUDE_INCOGNITO))); // Make sure it is a new(different) window. EXPECT_NE(ExtensionTabUtil::GetWindowId(incognito_browser), GetWindowId(result.get())); @@ -536,7 +529,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, function->set_extension(extension.get()); std::unique_ptr<base::DictionaryValue> result( utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( - function.get(), kEmptyArgs, browser(), utils::INCLUDE_INCOGNITO))); + function.get(), kEmptyArgs, browser(), + api_test_utils::INCLUDE_INCOGNITO))); // Make sure it is a new(different) window. EXPECT_NE(ExtensionTabUtil::GetWindowId(browser()), @@ -549,11 +543,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, // Run without an explicit "incognito" param. function = new WindowsCreateFunction(); function->set_extension(extension.get()); - result.reset(utils::ToDictionary( - utils::RunFunctionAndReturnSingleResult(function.get(), - kEmptyArgs, - incognito_browser, - utils::INCLUDE_INCOGNITO))); + result.reset(utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( + function.get(), kEmptyArgs, incognito_browser, + api_test_utils::INCLUDE_INCOGNITO))); // Make sure it is a new(different) window. EXPECT_NE(ExtensionTabUtil::GetWindowId(incognito_browser), GetWindowId(result.get())); @@ -762,55 +754,6 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, InvalidUpdateWindowState) { keys::kInvalidWindowStateError)); } -IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, UpdateAppWindowSizeConstraint) { - AppWindow* app_window = CreateTestAppWindow( - "{\"outerBounds\": " - "{\"width\": 300, \"height\": 300," - " \"minWidth\": 200, \"minHeight\": 200," - " \"maxWidth\": 400, \"maxHeight\": 400}}"); - - scoped_refptr<WindowsGetFunction> get_function = new WindowsGetFunction(); - scoped_refptr<Extension> extension(ExtensionBuilder("Test").Build().get()); - get_function->set_extension(extension.get()); - std::unique_ptr<base::DictionaryValue> result( - utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( - get_function.get(), - base::StringPrintf("[%u, {\"windowTypes\": [\"app\"]}]", - app_window->session_id().id()), - browser()))); - - EXPECT_EQ(300, api_test_utils::GetInteger(result.get(), "width")); - EXPECT_EQ(300, api_test_utils::GetInteger(result.get(), "height")); - - // Verify the min width/height of the application window are - // respected. - scoped_refptr<WindowsUpdateFunction> update_min_function = - new WindowsUpdateFunction(); - result.reset(utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( - update_min_function.get(), - base::StringPrintf("[%u, {\"width\": 100, \"height\": 100}]", - app_window->session_id().id()), - browser()))); - - EXPECT_EQ(200, api_test_utils::GetInteger(result.get(), "width")); - EXPECT_EQ(200, api_test_utils::GetInteger(result.get(), "height")); - - // Verify the max width/height of the application window are - // respected. - scoped_refptr<WindowsUpdateFunction> update_max_function = - new WindowsUpdateFunction(); - result.reset(utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( - update_max_function.get(), - base::StringPrintf("[%u, {\"width\": 500, \"height\": 500}]", - app_window->session_id().id()), - browser()))); - - EXPECT_EQ(400, api_test_utils::GetInteger(result.get(), "width")); - EXPECT_EQ(400, api_test_utils::GetInteger(result.get(), "height")); - - CloseAppWindow(app_window); -} - IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, UpdateDevToolsWindow) { DevToolsWindow* devtools = DevToolsWindowTesting::OpenDevToolsWindowSync( browser()->tab_strip_model()->GetWebContentsAt(0), false /* is_docked */); @@ -866,6 +809,8 @@ class ExtensionWindowLastFocusedTest : public ExtensionTabsTest { base::Value* RunFunction(UIThreadExtensionFunction* function, const std::string& params); + const Extension* extension() { return extension_.get(); } + private: // A helper class to wait for an views::Widget to become activated. class WidgetActivatedWaiter : public views::WidgetObserver { @@ -1083,13 +1028,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionWindowLastFocusedTest, scoped_refptr<WindowsGetLastFocusedFunction> get_current_app_function = new WindowsGetLastFocusedFunction(); - std::unique_ptr<base::DictionaryValue> result(utils::ToDictionary( - RunFunction(get_current_app_function.get(), - "[{\"populate\": true, \"windowTypes\": [ \"app\" ]}]"))); - int app_window_id = app_window->session_id().id(); - EXPECT_EQ(app_window_id, api_test_utils::GetInteger(result.get(), "id")); - EXPECT_EQ(-1, GetTabId(result.get())); - EXPECT_EQ("app", api_test_utils::GetString(result.get(), "type")); + get_current_app_function->set_extension(extension()); + EXPECT_EQ( + tabs_constants::kNoLastFocusedWindowError, + extension_function_test_utils::RunFunctionAndReturnError( + get_current_app_function.get(), + "[{\"populate\": true, \"windowTypes\": [ \"app\" ]}]", browser())); } chrome::CloseWindow(normal_browser); @@ -1113,7 +1057,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWindowCreateTest, AcceptState) { std::unique_ptr<base::DictionaryValue> result( utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( function.get(), "[{\"state\": \"minimized\"}]", browser(), - utils::INCLUDE_INCOGNITO))); + api_test_utils::INCLUDE_INCOGNITO))); int window_id = GetWindowId(result.get()); std::string error; Browser* new_window = ExtensionTabUtil::GetBrowserFromWindowID( @@ -1129,7 +1073,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionWindowCreateTest, AcceptState) { function->set_extension(extension.get()); result.reset(utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( function.get(), "[{\"state\": \"fullscreen\"}]", browser(), - utils::INCLUDE_INCOGNITO))); + api_test_utils::INCLUDE_INCOGNITO))); window_id = GetWindowId(result.get()); new_window = ExtensionTabUtil::GetBrowserFromWindowID( ChromeExtensionFunctionDetails(function.get()), window_id, &error); @@ -1406,7 +1350,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardedProperty) { // Creates Tab object to ensure the property is correct for the extension. std::unique_ptr<api::tabs::Tab> tab_object_a = - ExtensionTabUtil::CreateTabObject(web_contents_a, tab_strip_model, 0); + ExtensionTabUtil::CreateTabObject(web_contents_a, + ExtensionTabUtil::kDontScrubTab, + nullptr, tab_strip_model, 0); EXPECT_FALSE(tab_object_a->discarded); // Discards one tab. @@ -1414,8 +1360,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardedProperty) { web_contents_a = tab_strip_model->GetWebContentsAt(1); // Make sure the property is changed accordingly after discarding the tab. - tab_object_a = - ExtensionTabUtil::CreateTabObject(web_contents_a, tab_strip_model, 0); + tab_object_a = ExtensionTabUtil::CreateTabObject( + web_contents_a, ExtensionTabUtil::kDontScrubTab, nullptr, tab_strip_model, + 0); EXPECT_TRUE(tab_object_a->discarded); // Get non-discarded tabs after discarding one tab. @@ -1520,6 +1467,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardWithId) { tab_id = ExtensionTabUtil::GetTabId(web_contents); EXPECT_EQ(tab_id, api_test_utils::GetInteger(result.get(), "id")); EXPECT_TRUE(api_test_utils::GetBoolean(result.get(), "discarded")); + // The result should be scrubbed. + EXPECT_FALSE(result->FindKey("url")); // Tests chrome.tabs.discard(tabId) with an already discarded tab. It has to // return the error stating that the tab couldn't be discarded. @@ -1592,6 +1541,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardWithoutId) { EXPECT_EQ(ExtensionTabUtil::GetTabId(web_contents), api_test_utils::GetInteger(result.get(), "id")); EXPECT_TRUE(api_test_utils::GetBoolean(result.get(), "discarded")); + // The result should be scrubbed. + EXPECT_FALSE(result->FindKey("url")); } // Tests chrome.tabs.discard() without disabling protection time. @@ -1633,7 +1584,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, AutoDiscardableProperty) { // Creates Tab object to ensure the property is correct for the extension. TabStripModel* tab_strip_model = browser()->tab_strip_model(); std::unique_ptr<api::tabs::Tab> tab_object_a = - ExtensionTabUtil::CreateTabObject(web_contents_a, tab_strip_model, 0); + ExtensionTabUtil::CreateTabObject(web_contents_a, + ExtensionTabUtil::kDontScrubTab, + nullptr, tab_strip_model, 0); EXPECT_TRUE(tab_object_a->auto_discardable); // Set up query and update functions with the extension. @@ -1675,8 +1628,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, AutoDiscardableProperty) { api_test_utils::GetBoolean(update_result.get(), "autoDiscardable")); // Make sure the property is changed accordingly after updating the tab. - tab_object_a = - ExtensionTabUtil::CreateTabObject(web_contents_a, tab_strip_model, 0); + tab_object_a = ExtensionTabUtil::CreateTabObject( + web_contents_a, ExtensionTabUtil::kDontScrubTab, nullptr, tab_strip_model, + 0); EXPECT_FALSE(tab_object_a->auto_discardable); // Get auto-discardable tabs after changing the status of web contents A. @@ -1786,7 +1740,7 @@ bool ExtensionTabsZoomTest::RunSetZoom(int tab_id, double zoom_factor) { return utils::RunFunction( set_zoom_function.get(), base::StringPrintf("[%u, %lf]", tab_id, zoom_factor), browser(), - extension_function_test_utils::NONE); + api_test_utils::NONE); } testing::AssertionResult ExtensionTabsZoomTest::RunGetZoom( @@ -1825,10 +1779,8 @@ bool ExtensionTabsZoomTest::RunSetZoomSettings(int tab_id, args = base::StringPrintf("[%u, {\"mode\": \"%s\"}]", tab_id, mode); } - return utils::RunFunction(set_zoom_settings_function.get(), - args, - browser(), - extension_function_test_utils::NONE); + return utils::RunFunction(set_zoom_settings_function.get(), args, browser(), + api_test_utils::NONE); } testing::AssertionResult ExtensionTabsZoomTest::RunGetZoomSettings( diff --git a/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc b/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc index 0ef3e6f98d1..7e4412108a2 100644 --- a/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc +++ b/chromium/chrome/browser/extensions/api/tabs/windows_event_router.cc @@ -14,6 +14,7 @@ #include "chrome/browser/extensions/api/tabs/tabs_constants.h" #include "chrome/browser/extensions/api/tabs/windows_util.h" #include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/window_controller.h" #include "chrome/browser/extensions/window_controller_list.h" @@ -42,14 +43,19 @@ bool ControllerVisibleToListener(WindowController* window_controller, // If there is no filter the visibility is based on the extension. const base::ListValue* filter_value = nullptr; - if (!listener_filter || - !listener_filter->GetList(keys::kWindowTypesKey, &filter_value)) - return window_controller->IsVisibleToExtension(extension); - - // Otherwise it's based on the type filter. - WindowController::TypeFilter filter = - WindowController::GetFilterFromWindowTypesValues(filter_value); - return window_controller->MatchesFilter(filter); + if (listener_filter) + listener_filter->GetList(keys::kWindowTypesKey, &filter_value); + + // TODO(https://crbug.com/807313): Remove this. + bool allow_dev_tools_windows = !!filter_value; + if (!window_controller->IsVisibleToTabsAPIForExtension( + extension, allow_dev_tools_windows)) { + return false; + } + + return !filter_value || + window_controller->MatchesFilter( + WindowController::GetFilterFromWindowTypesValues(filter_value)); } bool WillDispatchWindowEvent(WindowController* window_controller, @@ -59,6 +65,13 @@ bool WillDispatchWindowEvent(WindowController* window_controller, const base::DictionaryValue* listener_filter) { bool has_filter = listener_filter && listener_filter->HasKey(keys::kWindowTypesKey); + // TODO(https://crbug.com/807313): Remove this. + bool allow_dev_tools_windows = has_filter; + if (!window_controller->IsVisibleToTabsAPIForExtension( + extension, allow_dev_tools_windows)) { + return false; + } + // Cleanup previous values. event->filter_info = EventFilteringInfo(); // Only set the window type if the listener has set a filter. @@ -66,8 +79,7 @@ bool WillDispatchWindowEvent(WindowController* window_controller, if (has_filter) { event->filter_info.window_type = window_controller->GetWindowTypeText(); } else { - event->filter_info.window_exposed_by_default = - window_controller->IsVisibleToExtension(extension); + event->filter_info.window_exposed_by_default = true; } return true; } @@ -194,9 +206,14 @@ void WindowsEventRouter::OnWindowControllerAdded( return; if (!profile_->IsSameProfile(window_controller->profile())) return; + // Ignore any windows without an associated browser (e.g., AppWindows). + if (!window_controller->GetBrowser()) + return; std::unique_ptr<base::ListValue> args(new base::ListValue()); - args->Append(window_controller->CreateWindowValue()); + args->Append(ExtensionTabUtil::CreateWindowValueForExtension( + *window_controller->GetBrowser(), nullptr, + ExtensionTabUtil::kDontPopulateTabs)); DispatchEvent(events::WINDOWS_ON_CREATED, windows::OnCreated::kEventName, window_controller, std::move(args)); } @@ -207,6 +224,9 @@ void WindowsEventRouter::OnWindowControllerRemoved( return; if (!profile_->IsSameProfile(window_controller->profile())) return; + // Ignore any windows without an associated browser (e.g., AppWindows). + if (!window_controller->GetBrowser()) + return; int window_id = window_controller->GetWindowId(); std::unique_ptr<base::ListValue> args(new base::ListValue()); diff --git a/chromium/chrome/browser/extensions/api/tabs/windows_util.cc b/chromium/chrome/browser/extensions/api/tabs/windows_util.cc index e7179e62225..3d75225bf78 100644 --- a/chromium/chrome/browser/extensions/api/tabs/windows_util.cc +++ b/chromium/chrome/browser/extensions/api/tabs/windows_util.cc @@ -23,38 +23,48 @@ namespace windows_util { -bool GetWindowFromWindowID(UIThreadExtensionFunction* function, - int window_id, - extensions::WindowController::TypeFilter filter, - extensions::WindowController** controller, - std::string* error) { +bool GetBrowserFromWindowID(UIThreadExtensionFunction* function, + int window_id, + extensions::WindowController::TypeFilter filter, + Browser** browser, + std::string* error) { + DCHECK(browser); DCHECK(error); + + *browser = nullptr; if (window_id == extension_misc::kCurrentWindowId) { - extensions::WindowController* extension_window_controller = - function->dispatcher()->GetExtensionWindowController(); // If there is a window controller associated with this extension, use that. - if (extension_window_controller) { - *controller = extension_window_controller; - } else { + extensions::WindowController* window_controller = + function->dispatcher()->GetExtensionWindowController(); + if (!window_controller) { // Otherwise get the focused or most recently added window. - *controller = extensions::WindowControllerList::GetInstance() - ->CurrentWindowForFunctionWithFilter(function, filter); + window_controller = + extensions::WindowControllerList::GetInstance() + ->CurrentWindowForFunctionWithFilter(function, filter); } - if (!(*controller)) { + + if (window_controller) + *browser = window_controller->GetBrowser(); + + if (!(*browser)) { *error = extensions::tabs_constants::kNoCurrentWindowError; return false; } } else { - *controller = + extensions::WindowController* window_controller = extensions::WindowControllerList::GetInstance() ->FindWindowForFunctionByIdWithFilter(function, window_id, filter); - if (!(*controller)) { + if (window_controller) + *browser = window_controller->GetBrowser(); + + if (!(*browser)) { *error = extensions::ErrorUtils::FormatErrorMessage( extensions::tabs_constants::kWindowNotFoundError, base::IntToString(window_id)); return false; } } + DCHECK(*browser); return true; } @@ -64,9 +74,13 @@ bool CanOperateOnWindow(const UIThreadExtensionFunction* function, if (filter && !controller->MatchesFilter(filter)) return false; - if (!filter && function->extension() && - !controller->IsVisibleToExtension(function->extension())) + // TODO(https://crbug.com/807313): Remove this. + bool allow_dev_tools_windows = !!filter; + if (function->extension() && + !controller->IsVisibleToTabsAPIForExtension(function->extension(), + allow_dev_tools_windows)) { return false; + } if (function->browser_context() == controller->profile()) return true; diff --git a/chromium/chrome/browser/extensions/api/tabs/windows_util.h b/chromium/chrome/browser/extensions/api/tabs/windows_util.h index d5526e10c30..f080d068c72 100644 --- a/chromium/chrome/browser/extensions/api/tabs/windows_util.h +++ b/chromium/chrome/browser/extensions/api/tabs/windows_util.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_UTIL_H__ #define CHROME_BROWSER_EXTENSIONS_API_TABS_WINDOWS_UTIL_H__ +#include <string> + #include "chrome/browser/extensions/window_controller_list.h" class UIThreadExtensionFunction; @@ -15,13 +17,13 @@ class WindowController; namespace windows_util { -// Populates |controller| for given |window_id|. If the window is not found, +// Populates |browser| for given |window_id|. If the window is not found, // returns false and sets |error|. -bool GetWindowFromWindowID(UIThreadExtensionFunction* function, - int window_id, - extensions::WindowController::TypeFilter filter, - extensions::WindowController** controller, - std::string* error); +bool GetBrowserFromWindowID(UIThreadExtensionFunction* function, + int window_id, + extensions::WindowController::TypeFilter filter, + Browser** browser, + std::string* error); // Returns true if |function| (and the profile and extension that it was // invoked from) can operate on the window wrapped by |window_controller|. diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc index ee44ebfbdde..6a0a795e8bb 100644 --- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc +++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.cc @@ -6,6 +6,7 @@ #include <memory> #include <utility> +#include <vector> #include "base/bind.h" #include "base/command_line.h" @@ -25,6 +26,7 @@ #include "extensions/browser/app_window/app_window.h" #include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/event_router.h" +#include "extensions/browser/extensions_browser_client.h" namespace terminal_private = extensions::api::terminal_private; namespace OnTerminalResize = @@ -43,6 +45,9 @@ const char kCroshCommand[] = "/usr/bin/crosh"; // We make stubbed crosh just echo back input. const char kStubbedCroshCommand[] = "cat"; +const char kVmShellName[] = "vmshell"; +const char kVmShellCommand[] = "/usr/bin/vsh"; + std::string GetCroshPath() { base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kCroshCommand)) @@ -54,13 +59,24 @@ std::string GetCroshPath() { return std::string(kStubbedCroshCommand); } +// Get the program to run based on the openTerminalProcess JS request. std::string GetProcessCommandForName(const std::string& name) { if (name == kCroshName) return GetCroshPath(); + else if (name == kVmShellName) + return kVmShellCommand; else return std::string(); } +// Whether the program accepts arbitrary command line arguments. +bool CommandSupportsArguments(const std::string& name) { + if (name == kVmShellName) + return true; + + return false; +} + void NotifyProcessOutput(content::BrowserContext* browser_context, const std::string& extension_id, int tab_id, @@ -119,10 +135,24 @@ TerminalPrivateOpenTerminalProcessFunction::Run() { OpenTerminalProcess::Params::Create(*args_)); EXTENSION_FUNCTION_VALIDATE(params.get()); - command_ = GetProcessCommandForName(params->process_name); - if (command_.empty()) + const std::string command = GetProcessCommandForName(params->process_name); + if (command.empty()) return RespondNow(Error("Invalid process name.")); + const std::string user_id_hash = + ExtensionsBrowserClient::Get()->GetUserIdHashFromContext( + browser_context()); + + std::vector<std::string> arguments; + arguments.push_back(command); + if (params->args) { + for (const std::string& arg : *params->args) + arguments.push_back(arg); + } + + if (arguments.size() > 1 && !CommandSupportsArguments(params->process_name)) + return RespondNow(Error("Specified command does not support arguments.")); + content::WebContents* caller_contents = GetSenderWebContents(); if (!caller_contents) return RespondNow(Error("No web contents.")); @@ -151,19 +181,23 @@ TerminalPrivateOpenTerminalProcessFunction::Run() { tab_id), base::Bind( &TerminalPrivateOpenTerminalProcessFunction::RespondOnUIThread, - this))); + this), + arguments, + user_id_hash)); return RespondLater(); } void TerminalPrivateOpenTerminalProcessFunction::OpenOnRegistryTaskRunner( const ProcessOutputCallback& output_callback, - const OpenProcessCallback& callback) { - DCHECK(!command_.empty()); - + const OpenProcessCallback& callback, + const std::vector<std::string>& arguments, + const std::string& user_id_hash) { chromeos::ProcessProxyRegistry* registry = chromeos::ProcessProxyRegistry::Get(); + const base::CommandLine cmdline{arguments}; - int terminal_id = registry->OpenProcess(command_.c_str(), output_callback); + int terminal_id = + registry->OpenProcess(cmdline, user_id_hash, output_callback); content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, base::BindOnce(callback, terminal_id)); diff --git a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h index c6455784059..cd7018fb2e4 100644 --- a/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h +++ b/chromium/chrome/browser/extensions/api/terminal/terminal_private_api.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_EXTENSIONS_API_TERMINAL_TERMINAL_PRIVATE_API_H_ #include <string> +#include <vector> #include "extensions/browser/extension_function.h" @@ -33,10 +34,10 @@ class TerminalPrivateOpenTerminalProcessFunction using OpenProcessCallback = base::Callback<void(int terminal_id)>; void OpenOnRegistryTaskRunner(const ProcessOutputCallback& output_callback, - const OpenProcessCallback& callback); + const OpenProcessCallback& callback, + const std::vector<std::string>& arguments, + const std::string& user_id_hash); void RespondOnUIThread(int terminal_id); - - std::string command_; }; // Send input to the terminal process specified by the terminal ID, which is set diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/DEPS b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/DEPS index fee9b1012b1..381dab83266 100644 --- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/DEPS +++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/DEPS @@ -2,4 +2,5 @@ include_rules = [ # TODO(mash): Remove. http://crbug.com/678705 "+ash/shell.h", "+media/audio" + "+services/audio/public/cpp" ] diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc index 02d77771c79..7e58654da56 100644 --- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc +++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc @@ -21,10 +21,13 @@ #include "chrome/browser/ui/chrome_pages.h" #include "chrome/common/url_constants.h" #include "components/user_manager/user_manager.h" +#include "content/public/common/service_manager_connection.h" #include "extensions/browser/event_router.h" #include "extensions/common/api/virtual_keyboard.h" #include "extensions/common/api/virtual_keyboard_private.h" #include "media/audio/audio_system.h" +#include "services/audio/public/cpp/audio_system_factory.h" +#include "services/service_manager/public/cpp/connector.h" #include "ui/aura/window_tree_host.h" #include "ui/keyboard/keyboard_controller.h" #include "ui/keyboard/keyboard_switches.h" @@ -74,7 +77,10 @@ void ChromeVirtualKeyboardDelegate::GetKeyboardConfig( OnKeyboardSettingsCallback on_settings_callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!audio_system_) - audio_system_ = media::AudioSystem::CreateInstance(); + audio_system_ = audio::CreateAudioSystem( + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->Clone()); audio_system_->HasInputDevices( base::BindOnce(&ChromeVirtualKeyboardDelegate::OnHasInputDevices, weak_this_, std::move(on_settings_callback))); @@ -152,24 +158,31 @@ bool ChromeVirtualKeyboardDelegate::ShowLanguageSettings() { return true; } -bool ChromeVirtualKeyboardDelegate::SetVirtualKeyboardMode(int mode_enum) { +bool ChromeVirtualKeyboardDelegate::SetVirtualKeyboardMode( + int mode_enum, + OnSetModeCallback on_set_mode_callback) { keyboard::KeyboardController* controller = keyboard::KeyboardController::GetInstance(); if (!controller) return false; - switch (mode_enum) { + controller->SetContainerType(ConvertKeyboardModeToContainerType(mode_enum), + std::move(on_set_mode_callback)); + return true; +} + +keyboard::ContainerType +ChromeVirtualKeyboardDelegate::ConvertKeyboardModeToContainerType( + int mode) const { + switch (mode) { case keyboard_api::KEYBOARD_MODE_FULL_WIDTH: - controller->SetContainerType(keyboard::ContainerType::FULL_WIDTH); - break; + return keyboard::ContainerType::FULL_WIDTH; case keyboard_api::KEYBOARD_MODE_FLOATING: - controller->SetContainerType(keyboard::ContainerType::FLOATING); - break; - default: - NOTREACHED(); - break; + return keyboard::ContainerType::FLOATING; } - return true; + + NOTREACHED(); + return keyboard::ContainerType::FULL_WIDTH; } bool ChromeVirtualKeyboardDelegate::SetDraggableArea( diff --git a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h index 1ec4b52b068..d0af47f0095 100644 --- a/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h +++ b/chromium/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h @@ -13,6 +13,7 @@ #include "content/public/browser/browser_context.h" #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h" #include "extensions/common/api/virtual_keyboard.h" +#include "ui/keyboard/container_type.h" namespace media { class AudioSystem; @@ -44,7 +45,8 @@ class ChromeVirtualKeyboardDelegate : public VirtualKeyboardDelegate { int modifiers) override; bool ShowLanguageSettings() override; bool IsLanguageSettingsEnabled() override; - bool SetVirtualKeyboardMode(int mode_enum) override; + bool SetVirtualKeyboardMode(int mode_enum, + OnSetModeCallback on_set_mode_callback) override; bool SetDraggableArea( const api::virtual_keyboard_private::Bounds& rect) override; bool SetRequestedKeyboardState(int state_enum) override; @@ -57,6 +59,7 @@ class ChromeVirtualKeyboardDelegate : public VirtualKeyboardDelegate { bool has_audio_input_devices); void DispatchConfigChangeEvent( std::unique_ptr<base::DictionaryValue> settings); + keyboard::ContainerType ConvertKeyboardModeToContainerType(int mode) const; content::BrowserContext* browser_context_; std::unique_ptr<media::AudioSystem> audio_system_; diff --git a/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc b/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc index 43798f375e0..cd090aab65c 100644 --- a/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc +++ b/chromium/chrome/browser/extensions/api/vpn_provider/vpn_provider_apitest.cc @@ -197,8 +197,8 @@ class VpnProviderApiTest : public ExtensionApiTest, void TriggerInternalRemove() { NetworkHandler::Get()->network_configuration_handler()->RemoveConfiguration( GetSingleServicePath(), - NetworkConfigurationObserver::SOURCE_USER_ACTION, - base::Bind(base::DoNothing), base::Bind(DoNothingFailureCallback)); + NetworkConfigurationObserver::SOURCE_USER_ACTION, base::DoNothing(), + base::Bind(DoNothingFailureCallback)); } // NetworkConfigurationObserver: diff --git a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc index 28dbc774e12..747efc84c3b 100644 --- a/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc +++ b/chromium/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc @@ -37,7 +37,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/web_contents.h" -#include "content/public/common/browser_side_navigation_policy.h" #include "content/public/common/context_menu_params.h" #include "content/public/common/resource_type.h" #include "content/public/common/url_constants.h" @@ -276,8 +275,6 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirectSingleProcess) { } IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ForwardBack) { - if (content::IsBrowserSideNavigationEnabled()) - return; // TODO(jam): investigate ASSERT_TRUE(RunExtensionTest("webnavigation/forwardBack")) << message_; } @@ -384,9 +381,9 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, RequestOpenTab) { ui_test_utils::NavigateToURL(browser(), url); // There's a link on a.html. Middle-click on it to open it in a new tab. - blink::WebMouseEvent mouse_event(blink::WebInputEvent::kMouseDown, - blink::WebInputEvent::kNoModifiers, - blink::WebInputEvent::kTimeStampForTesting); + blink::WebMouseEvent mouse_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); mouse_event.button = blink::WebMouseEvent::Button::kMiddle; mouse_event.SetPositionInWidget(7, 7); mouse_event.click_count = 1; @@ -416,9 +413,9 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlank) { // There's a link with target=_blank on a.html. Click on it to open it in a // new tab. - blink::WebMouseEvent mouse_event(blink::WebInputEvent::kMouseDown, - blink::WebInputEvent::kNoModifiers, - blink::WebInputEvent::kTimeStampForTesting); + blink::WebMouseEvent mouse_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); mouse_event.button = blink::WebMouseEvent::Button::kLeft; mouse_event.SetPositionInWidget(7, 7); mouse_event.click_count = 1; @@ -446,9 +443,9 @@ IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlankIncognito) { // There's a link with target=_blank on a.html. Click on it to open it in a // new tab. - blink::WebMouseEvent mouse_event(blink::WebInputEvent::kMouseDown, - blink::WebInputEvent::kNoModifiers, - blink::WebInputEvent::kTimeStampForTesting); + blink::WebMouseEvent mouse_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); mouse_event.button = blink::WebMouseEvent::Button::kLeft; mouse_event.SetPositionInWidget(7, 7); mouse_event.click_count = 1; diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc index dd86f9b6972..b43a05f9a61 100644 --- a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc @@ -139,6 +139,19 @@ void GetPartOfMessageArguments(IPC::Message* message, ASSERT_TRUE(list.GetDictionary(0, out)); } +base::Value FormBinaryValue(base::StringPiece str) { + base::Value list(base::Value::Type::LIST); + list.GetList().emplace_back(base::Value( + base::Value::BlobStorage(str.data(), str.data() + str.size()))); + return list; +} + +base::Value FormStringValue(base::StringPiece str) { + base::Value list(base::Value::Type::LIST); + list.GetList().emplace_back(base::Value(str)); + return list; +} + } // namespace // A mock event router that responds to events with a pre-arranged queue of @@ -566,7 +579,7 @@ void ExtensionWebRequestTest::FireURLRequestWithData( &(bytes_2[0]), bytes_2.size())); request->set_upload(std::make_unique<net::ElementsUploadDataStream>( std::move(element_readers), 0)); - ipc_sender_.PushTask(base::Bind(&base::DoNothing)); + ipc_sender_.PushTask(base::DoNothing()); request->Start(); } @@ -592,17 +605,26 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) { const size_t kPlainBlock2Length = sizeof(kPlainBlock2) - 1; std::vector<char> plain_2(kPlainBlock2, kPlainBlock2 + kPlainBlock2Length); #define kBoundary "THIS_IS_A_BOUNDARY" - const char kFormBlock1[] = "--" kBoundary "\r\n" + const char kFormBlock1[] = + "--" kBoundary + "\r\n" "Content-Disposition: form-data; name=\"A\"\r\n" "\r\n" "test text\r\n" - "--" kBoundary "\r\n" + "--" kBoundary + "\r\n" "Content-Disposition: form-data; name=\"B\"; filename=\"\"\r\n" "Content-Type: application/octet-stream\r\n" - "\r\n"; + "\r\n" + "--" kBoundary + "\r\n" + "Content-Disposition: form-data; name=\"B_content\"\r\n" + "Content-Type: application/octet-stream\r\n" + "\r\n" + "\uffff\uffff\uffff\uffff\r\n" + "--" kBoundary "\r\n"; std::vector<char> form_1(kFormBlock1, kFormBlock1 + sizeof(kFormBlock1) - 1); - const char kFormBlock2[] = "\r\n" - "--" kBoundary "\r\n" + const char kFormBlock2[] = "Content-Disposition: form-data; name=\"C\"\r\n" "\r\n" "test password\r\n" @@ -623,10 +645,21 @@ TEST_F(ExtensionWebRequestTest, AccessRequestBodyData) { &kRawPath }; // Contents of formData. - const char kFormData[] = - "{\"A\":[\"test text\"],\"B\":[\"\"],\"C\":[\"test password\"]}"; - std::unique_ptr<const base::Value> form_data = - base::JSONReader::Read(kFormData); + struct KeyValuePairs { + const char* key; + base::Value value; + }; + KeyValuePairs kFormDataPairs[] = { + {"A", FormStringValue("test text")}, + {"B", FormStringValue("")}, + {"B_content", FormBinaryValue("\uffff\uffff\uffff\uffff")}, + {"C", FormStringValue("test password")}}; + std::unique_ptr<base::Value> form_data = + std::make_unique<base::Value>(base::Value::Type::DICTIONARY); + for (auto& pair : kFormDataPairs) { + form_data->SetKey(pair.key, std::move(pair.value)); + } + ASSERT_TRUE(form_data.get() != NULL); ASSERT_TRUE(form_data->type() == base::Value::Type::DICTIONARY); // Contents of raw. @@ -782,7 +815,7 @@ TEST_F(ExtensionWebRequestTest, MinimalAccessRequestBodyData) { // Only one request is sent, but more than one event will be triggered. for (size_t i = 1; i < arraysize(kExpected); ++i) - ipc_sender_.PushTask(base::Bind(&base::DoNothing)); + ipc_sender_.PushTask(base::DoNothing()); const std::vector<char> part_of_body(1); FireURLRequestWithData("POST", nullptr, part_of_body, part_of_body); @@ -855,7 +888,7 @@ TEST_F(ExtensionWebRequestTest, ProperFilteringInPublicSession) { // Only one request is sent, but more than one event will be triggered. for (size_t i = 1; i < arraysize(kExpected); ++i) - ipc_sender_.PushTask(base::Bind(&base::DoNothing)); + ipc_sender_.PushTask(base::DoNothing()); const std::vector<char> part_of_body(1); FireURLRequestWithData("POST", nullptr, part_of_body, part_of_body); @@ -920,7 +953,7 @@ TEST_F(ExtensionWebRequestTest, NoAccessRequestBodyData) { context_->CreateRequest(request_url, net::DEFAULT_PRIORITY, &delegate_, TRAFFIC_ANNOTATION_FOR_TESTS)); request->set_method(kMethods[i]); - ipc_sender_.PushTask(base::Bind(&base::DoNothing)); + ipc_sender_.PushTask(base::DoNothing()); request->Start(); } @@ -1195,7 +1228,7 @@ TEST_P(ExtensionWebRequestHeaderModificationTest, TestModifications) { } // Don't do anything for the onSendHeaders message. - ipc_sender_.PushTask(base::Bind(&base::DoNothing)); + ipc_sender_.PushTask(base::DoNothing()); // Note that we mess up the headers slightly: // request->Start() will first add additional headers (e.g. the User-Agent) diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc index e0b875c7d40..bd3b124bbf5 100644 --- a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc @@ -21,7 +21,6 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_with_management_policy_apitest.h" #include "chrome/browser/extensions/tab_helper.h" -#include "chrome/browser/extensions/test_extension_dir.h" #include "chrome/browser/net/profile_network_context_service.h" #include "chrome/browser/net/profile_network_context_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -48,6 +47,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/page_type.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/url_loader_interceptor.h" #include "extensions/browser/api/web_request/web_request_api.h" #include "extensions/browser/blocked_action_type.h" #include "extensions/browser/extension_system.h" @@ -55,6 +55,7 @@ #include "extensions/common/features/feature.h" #include "extensions/test/extension_test_message_listener.h" #include "extensions/test/result_catcher.h" +#include "extensions/test/test_extension_dir.h" #include "google_apis/gaia/gaia_switches.h" #include "net/dns/mock_host_resolver.h" #include "net/http/http_util.h" @@ -69,6 +70,7 @@ #include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_filter.h" #include "net/url_request/url_request_interceptor.h" +#include "services/network/public/cpp/features.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #if defined(OS_CHROMEOS) @@ -283,22 +285,33 @@ class DevToolsFrontendInWebRequestApiTest : public ExtensionApiTest { host_resolver()->AddRule("*", "127.0.0.1"); int port = embedded_test_server()->port(); - base::RunLoop run_loop; - content::BrowserThread::PostTaskAndReply( - content::BrowserThread::IO, FROM_HERE, - base::BindOnce(&SetUpDevToolsFrontendInterceptorOnIO, port, - test_root_dir_), - run_loop.QuitClosure()); - run_loop.Run(); + + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + url_loader_interceptor_ = std::make_unique<content::URLLoaderInterceptor>( + base::BindRepeating(&DevToolsFrontendInWebRequestApiTest::OnIntercept, + base::Unretained(this), port)); + } else { + base::RunLoop run_loop; + content::BrowserThread::PostTaskAndReply( + content::BrowserThread::IO, FROM_HERE, + base::BindOnce(&SetUpDevToolsFrontendInterceptorOnIO, port, + test_root_dir_), + run_loop.QuitClosure()); + run_loop.Run(); + } } void TearDownOnMainThread() override { - base::RunLoop run_loop; - content::BrowserThread::PostTaskAndReply( - content::BrowserThread::IO, FROM_HERE, - base::BindOnce(&TearDownDevToolsFrontendInterceptorOnIO), - run_loop.QuitClosure()); - run_loop.Run(); + if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { + url_loader_interceptor_.reset(); + } else { + base::RunLoop run_loop; + content::BrowserThread::PostTaskAndReply( + content::BrowserThread::IO, FROM_HERE, + base::BindOnce(&TearDownDevToolsFrontendInterceptorOnIO), + run_loop.QuitClosure()); + run_loop.Run(); + } ExtensionApiTest::TearDownOnMainThread(); } @@ -317,7 +330,49 @@ class DevToolsFrontendInWebRequestApiTest : public ExtensionApiTest { } private: + bool OnIntercept(int test_server_port, + content::URLLoaderInterceptor::RequestParams* params) { + // See comments in DevToolsFrontendInterceptor above. The devtools remote + // frontend URLs are hardcoded into Chrome and are requested by some of the + // tests here to exercise their behavior with respect to WebRequest. + // + // We treat any URL request not targeting the test server as targeting the + // remote frontend, and we intercept them to fulfill from test data rather + // than hitting the network. + if (params->url_request.url.EffectiveIntPort() == test_server_port) + return false; + + std::string status_line; + std::string contents; + GetFileContents( + test_root_dir_.AppendASCII(params->url_request.url.path().substr(1)), + &status_line, &contents); + content::URLLoaderInterceptor::WriteResponse(status_line, contents, + params->client.get()); + return true; + } + + static void GetFileContents(const base::FilePath& path, + std::string* status_line, + std::string* contents) { + base::ScopedAllowBlockingForTesting allow_io; + if (!base::ReadFileToString(path, contents)) { + *status_line = "HTTP/1.0 404 Not Found\n\n"; + return; + } + + std::string content_type; + if (path.Extension() == FILE_PATH_LITERAL(".html")) + content_type = "Content-type: text/html\n"; + else if (path.Extension() == FILE_PATH_LITERAL(".js")) + content_type = "Content-type: application/javascript\n"; + + *status_line = + base::StringPrintf("HTTP/1.0 200 OK\n%s\n", content_type.c_str()); + } + base::FilePath test_root_dir_; + std::unique_ptr<content::URLLoaderInterceptor> url_loader_interceptor_; }; IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestApi) { @@ -467,9 +522,9 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, MAYBE_WebRequestNewTab) { // There's a link on a.html with target=_blank. Click on it to open it in a // new tab. - blink::WebMouseEvent mouse_event(blink::WebInputEvent::kMouseDown, - blink::WebInputEvent::kNoModifiers, - blink::WebInputEvent::kTimeStampForTesting); + blink::WebMouseEvent mouse_event( + blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers, + blink::WebInputEvent::GetStaticTimeStampForTests()); mouse_event.button = blink::WebMouseEvent::Button::kLeft; mouse_event.SetPositionInWidget(7, 7); mouse_event.click_count = 1; @@ -1297,7 +1352,21 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, MinimumAccessInitiator) { // Ensure that devtools frontend requests are hidden from the webRequest API. IN_PROC_BROWSER_TEST_F(DevToolsFrontendInWebRequestApiTest, HiddenRequests) { - ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_devtools.html")) + // Test expectations differ with the Network Service because of the way + // request interception is done for the test. In the legacy networking path a + // URLRequestMockHTTPJob is used, which does not generate + // |onBeforeHeadersSent| events. With the Network Service enabled, requests + // issued to HTTP URLs by these tests look like real HTTP requests and + // therefore do generate |onBeforeHeadersSent| events. + // + // These tests adjust their expectations accordingly based on whether or not + // the Network Service is enabled. + const char* network_service_arg = + base::FeatureList::IsEnabled(network::features::kNetworkService) + ? "NetworkServiceEnabled" + : "NetworkServiceDisabled"; + ASSERT_TRUE(RunExtensionSubtestWithArg("webrequest", "test_devtools.html", + network_service_arg)) << message_; } diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc index 8bcd3345fe3..b2723a15ed6 100644 --- a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc @@ -193,6 +193,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestHideRequestForURL) { TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, TestCanExtensionAccessURL_HostPermissions) { + // Request with empty initiator. std::unique_ptr<net::URLRequest> request( context.CreateRequest(GURL("http://example.com"), net::DEFAULT_PRIORITY, NULL, TRAFFIC_ANNOTATION_FOR_TESTS)); @@ -211,15 +212,23 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, request->url(), -1, // No tab id. false, // crosses_incognito - WebRequestPermissions::REQUIRE_HOST_PERMISSION, + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, request->initiator())); EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, WebRequestPermissions::CanExtensionAccessURL( extension_info_map_.get(), com_extension_->id(), request->url(), -1, // No tab id. false, // crosses_incognito - WebRequestPermissions::REQUIRE_HOST_PERMISSION, + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, request->initiator())); + EXPECT_EQ( + PermissionsData::ACCESS_ALLOWED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_extension_->id(), request->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL_AND_INITIATOR, + request->initiator())); EXPECT_EQ(PermissionsData::ACCESS_DENIED, WebRequestPermissions::CanExtensionAccessURL( extension_info_map_.get(), com_extension_->id(), request->url(), @@ -227,6 +236,54 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, false, // crosses_incognito WebRequestPermissions::REQUIRE_ALL_URLS, request->initiator())); + std::unique_ptr<net::URLRequest> request_with_initiator( + context.CreateRequest(GURL("http://example.com"), net::DEFAULT_PRIORITY, + nullptr, TRAFFIC_ANNOTATION_FOR_TESTS)); + request_with_initiator->set_initiator( + url::Origin::Create(GURL("http://www.example.org"))); + + EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), permissionless_extension_->id(), + request_with_initiator->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::DO_NOT_CHECK_HOST, + request_with_initiator->initiator())); + EXPECT_EQ(PermissionsData::ACCESS_DENIED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), permissionless_extension_->id(), + request_with_initiator->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, + request_with_initiator->initiator())); + EXPECT_EQ(PermissionsData::ACCESS_ALLOWED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_extension_->id(), + request_with_initiator->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, + request_with_initiator->initiator())); + EXPECT_EQ( + PermissionsData::ACCESS_DENIED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_extension_->id(), + request_with_initiator->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL_AND_INITIATOR, + request_with_initiator->initiator())); + EXPECT_EQ(PermissionsData::ACCESS_DENIED, + WebRequestPermissions::CanExtensionAccessURL( + extension_info_map_.get(), com_extension_->id(), + request_with_initiator->url(), + -1, // No tab id. + false, // crosses_incognito + WebRequestPermissions::REQUIRE_ALL_URLS, + request_with_initiator->initiator())); + // Public Sessions tests. #if defined(OS_CHROMEOS) std::unique_ptr<net::URLRequest> org_request(context.CreateRequest( @@ -239,7 +296,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, org_request->url(), -1, // No tab id. false, // crosses_incognito - WebRequestPermissions::REQUIRE_HOST_PERMISSION, + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, org_request->initiator())); chromeos::ScopedTestPublicSessionLoginState login_state; @@ -252,7 +309,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, org_request->url(), -1, // No tab id. false, // crosses_incognito - WebRequestPermissions::REQUIRE_HOST_PERMISSION, + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, org_request->initiator())); EXPECT_EQ( @@ -275,7 +332,7 @@ TEST_F(ExtensionWebRequestHelpersTestWithThreadsTest, chrome_request->url(), -1, // No tab id. false, // crosses_incognito - WebRequestPermissions::REQUIRE_HOST_PERMISSION, + WebRequestPermissions::REQUIRE_HOST_PERMISSION_FOR_URL, chrome_request->initiator())); #endif } diff --git a/chromium/chrome/browser/extensions/api/webrtc_audio_private/DEPS b/chromium/chrome/browser/extensions/api/webrtc_audio_private/DEPS index 67c01d06986..287341aed80 100644 --- a/chromium/chrome/browser/extensions/api/webrtc_audio_private/DEPS +++ b/chromium/chrome/browser/extensions/api/webrtc_audio_private/DEPS @@ -1,3 +1,4 @@ include_rules = [ "+media/audio" + "services/audio/public/cpp" ] diff --git a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc index fa1e2bdda32..22301de62d9 100644 --- a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc +++ b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc @@ -18,11 +18,14 @@ #include "content/public/browser/media_device_id.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/service_manager_connection.h" #include "extensions/browser/event_router.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/error_utils.h" #include "extensions/common/permissions/permissions_data.h" #include "media/audio/audio_system.h" +#include "services/audio/public/cpp/audio_system_factory.h" +#include "services/service_manager/public/cpp/connector.h" #include "url/gurl.h" #include "url/origin.h" @@ -106,7 +109,7 @@ WebrtcAudioPrivateFunction::~WebrtcAudioPrivateFunction() {} std::string WebrtcAudioPrivateFunction::CalculateHMAC( const std::string& raw_id) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CURRENTLY_ON(BrowserThread::UI); // We don't hash the default device description, and we always return // "default" for the default device. There is code in SetActiveSink @@ -130,9 +133,13 @@ std::string WebrtcAudioPrivateFunction::device_id_salt() const { } media::AudioSystem* WebrtcAudioPrivateFunction::GetAudioSystem() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - if (!audio_system_) - audio_system_ = media::AudioSystem::CreateInstance(); + DCHECK_CURRENTLY_ON(BrowserThread::UI); + if (!audio_system_) { + audio_system_ = audio::CreateAudioSystem( + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->Clone()); + } return audio_system_.get(); } @@ -176,27 +183,17 @@ WebrtcAudioPrivateFunction::GetRenderProcessHostFromRequest( bool WebrtcAudioPrivateGetSinksFunction::RunAsync() { DCHECK_CURRENTLY_ON(BrowserThread::UI); InitDeviceIDSalt(); - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::BindOnce(&WebrtcAudioPrivateGetSinksFunction:: - GetOutputDeviceDescriptionsOnIOThread, - this)); - return true; -} - -void WebrtcAudioPrivateGetSinksFunction:: - GetOutputDeviceDescriptionsOnIOThread() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); GetAudioSystem()->GetDeviceDescriptions( - false, base::BindOnce(&WebrtcAudioPrivateGetSinksFunction:: - ReceiveOutputDeviceDescriptionsOnIOThread, - this)); + false, + base::BindOnce( + &WebrtcAudioPrivateGetSinksFunction::ReceiveOutputDeviceDescriptions, + this)); + return true; } -void WebrtcAudioPrivateGetSinksFunction:: - ReceiveOutputDeviceDescriptionsOnIOThread( - media::AudioDeviceDescriptions sink_devices) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); +void WebrtcAudioPrivateGetSinksFunction::ReceiveOutputDeviceDescriptions( + media::AudioDeviceDescriptions sink_devices) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); auto results = std::make_unique<SinkInfoVector>(); for (const media::AudioDeviceDescription& description : sink_devices) { wap::SinkInfo info; @@ -205,15 +202,6 @@ void WebrtcAudioPrivateGetSinksFunction:: // TODO(joi): Add other parameters. results->push_back(std::move(info)); } - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::BindOnce(&WebrtcAudioPrivateGetSinksFunction::DoneOnUIThread, this, - base::Passed(&results))); -} - -void WebrtcAudioPrivateGetSinksFunction::DoneOnUIThread( - std::unique_ptr<SinkInfoVector> results) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); results_ = wap::GetSinks::Results::Create(*results); SendResponse(true); } @@ -230,28 +218,17 @@ bool WebrtcAudioPrivateGetAssociatedSinkFunction::RunAsync() { EXTENSION_FUNCTION_VALIDATE(params_.get()); InitDeviceIDSalt(); - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::BindOnce(&WebrtcAudioPrivateGetAssociatedSinkFunction:: - GetInputDeviceDescriptionsOnIOThread, - this)); - - return true; -} - -void WebrtcAudioPrivateGetAssociatedSinkFunction:: - GetInputDeviceDescriptionsOnIOThread() { - DCHECK_CURRENTLY_ON(BrowserThread::IO); GetAudioSystem()->GetDeviceDescriptions( true, base::BindOnce(&WebrtcAudioPrivateGetAssociatedSinkFunction:: - ReceiveInputDeviceDescriptionsOnIOThread, + ReceiveInputDeviceDescriptions, this)); + return true; } void WebrtcAudioPrivateGetAssociatedSinkFunction:: - ReceiveInputDeviceDescriptionsOnIOThread( + ReceiveInputDeviceDescriptions( media::AudioDeviceDescriptions source_devices) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CURRENTLY_ON(BrowserThread::UI); url::Origin security_origin = url::Origin::Create(GURL(params_->security_origin)); std::string source_id_in_origin(params_->source_id_in_origin); @@ -269,29 +246,25 @@ void WebrtcAudioPrivateGetAssociatedSinkFunction:: } } if (raw_source_id.empty()) { - CalculateHMACOnIOThread(std::string()); + CalculateHMACAndReply(base::nullopt); return; } GetAudioSystem()->GetAssociatedOutputDeviceID( raw_source_id, base::BindOnce( - &WebrtcAudioPrivateGetAssociatedSinkFunction::CalculateHMACOnIOThread, + &WebrtcAudioPrivateGetAssociatedSinkFunction::CalculateHMACAndReply, this)); } -void WebrtcAudioPrivateGetAssociatedSinkFunction::CalculateHMACOnIOThread( +void WebrtcAudioPrivateGetAssociatedSinkFunction::CalculateHMACAndReply( const base::Optional<std::string>& raw_sink_id) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); + DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!raw_sink_id || !raw_sink_id->empty()); // If no |raw_sink_id| is provided, the default device is used. - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::BindOnce( - &WebrtcAudioPrivateGetAssociatedSinkFunction::ReceiveHMACOnUIThread, - this, CalculateHMAC(raw_sink_id.value_or(std::string())))); + Reply(CalculateHMAC(raw_sink_id.value_or(std::string()))); } -void WebrtcAudioPrivateGetAssociatedSinkFunction::ReceiveHMACOnUIThread( +void WebrtcAudioPrivateGetAssociatedSinkFunction::Reply( const std::string& associated_sink_id) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (associated_sink_id == media::AudioDeviceDescription::kDefaultDeviceId) { diff --git a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h index 9f022383542..7e85f87df1b 100644 --- a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h +++ b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h @@ -59,7 +59,6 @@ class WebrtcAudioPrivateFunction : public ChromeAsyncExtensionFunction { protected: // Calculates a single HMAC, using the extension ID as the security origin. - // Call only on IO thread. std::string CalculateHMAC(const std::string& raw_id); // Initializes |device_id_salt_|. Must be called on the UI thread, @@ -98,16 +97,10 @@ class WebrtcAudioPrivateGetSinksFunction : public WebrtcAudioPrivateFunction { bool RunAsync() override; - // Requests output device descriptions. - void GetOutputDeviceDescriptionsOnIOThread(); - - // Receives output device descriptions, calculates HMACs for them and replies - // to UI thread with DoneOnUIThread(). - void ReceiveOutputDeviceDescriptionsOnIOThread( + // Receives output device descriptions, calculates HMACs for them and sends + // the response. + void ReceiveOutputDeviceDescriptions( media::AudioDeviceDescriptions sink_devices); - - // Sends the response. - void DoneOnUIThread(std::unique_ptr<SinkInfoVector> results); }; class WebrtcAudioPrivateGetAssociatedSinkFunction @@ -125,23 +118,17 @@ class WebrtcAudioPrivateGetAssociatedSinkFunction // UI thread: Entry point, posts GetInputDeviceDescriptions() to IO thread. bool RunAsync() override; - // Enumerates input devices. - void GetInputDeviceDescriptionsOnIOThread(); - // Receives the input device descriptions, looks up the raw source device ID // basing on |params|, and requests the associated raw sink ID for it. - void ReceiveInputDeviceDescriptionsOnIOThread( + void ReceiveInputDeviceDescriptions( media::AudioDeviceDescriptions source_devices); - // IO thread: Receives the raw sink ID, calculates HMAC and replies to IO - // thread with ReceiveHMACOnUIThread(). - void CalculateHMACOnIOThread(const base::Optional<std::string>& raw_sink_id); + // Receives the raw sink ID, calculates HMAC and calls Reply(). + void CalculateHMACAndReply(const base::Optional<std::string>& raw_sink_id); // Receives the associated sink ID as HMAC and sends the response. - void ReceiveHMACOnUIThread(const std::string& hmac); + void Reply(const std::string& hmac); - // Initialized on UI thread in RunAsync(), read-only access on IO thread - no - // locking needed. std::unique_ptr<api::webrtc_audio_private::GetAssociatedSink::Params> params_; }; diff --git a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc index b09a14d684f..5b8a78852b1 100644 --- a/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc @@ -25,12 +25,13 @@ #include "chrome/browser/media/webrtc/webrtc_log_uploader.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/features.h" +#include "chrome/common/buildflags.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/media_device_id.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/service_manager_connection.h" #include "content/public/test/browser_test_utils.h" #include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/permissions_data.h" @@ -38,6 +39,8 @@ #include "media/audio/audio_system.h" #include "media/base/media_switches.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "services/audio/public/cpp/audio_system_factory.h" +#include "services/service_manager/public/cpp/connector.h" #include "testing/gtest/include/gtest/gtest.h" #if defined(OS_WIN) @@ -63,8 +66,10 @@ namespace { void GetAudioDeviceDescriptions(bool for_input, AudioDeviceDescriptions* device_descriptions) { base::RunLoop run_loop; - std::unique_ptr<media::AudioSystem> audio_system = - media::AudioSystem::CreateInstance(); + std::unique_ptr<media::AudioSystem> audio_system = audio::CreateAudioSystem( + content::ServiceManagerConnection::GetForProcess() + ->GetConnector() + ->Clone()); audio_system->GetDeviceDescriptions( for_input, base::BindOnce( @@ -73,7 +78,7 @@ void GetAudioDeviceDescriptions(bool for_input, *result = std::move(received); finished_callback.Run(); }, - base::Passed(run_loop.QuitClosure()), device_descriptions)); + run_loop.QuitClosure(), device_descriptions)); run_loop.Run(); } diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc index 233fb3e34d2..af8a700f354 100644 --- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc +++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.cc @@ -238,7 +238,7 @@ bool WebrtcLoggingPrivateSetMetaDataFunction::RunAsync() { BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::BindOnce(&WebRtcLoggingHandlerHost::SetMetaData, webrtc_logging_handler_host, - base::Passed(&meta_data), callback)); + std::move(meta_data), callback)); return true; } diff --git a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc index c1a9c2fd7ae..07b4d99c5b0 100644 --- a/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc @@ -7,8 +7,8 @@ #include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "chrome/browser/apps/app_browsertest_util.h" -#include "chrome/browser/media/webrtc/webrtc_log_list.h" #include "chrome/common/chrome_switches.h" +#include "components/webrtc_logging/browser/log_list.h" class WebrtcLoggingPrivateApiBrowserTest : public extensions::PlatformAppBrowserTest { @@ -17,7 +17,7 @@ class WebrtcLoggingPrivateApiBrowserTest ~WebrtcLoggingPrivateApiBrowserTest() override = default; base::FilePath webrtc_logs_path() { - return WebRtcLogList::GetWebRtcLogDirectoryForBrowserContextPath( + return webrtc_logging::LogList::GetWebRtcLogDirectoryForBrowserContextPath( profile()->GetPath()); } diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc index 1b82d5446c9..71f464d8fb9 100644 --- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc +++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc @@ -221,7 +221,8 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() { if (!icon_url.is_empty()) { loader_factory = content::BrowserContext::GetDefaultStoragePartition(browser_context()) - ->GetURLLoaderFactoryForBrowserProcess(); + ->GetURLLoaderFactoryForBrowserProcess() + .get(); } scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper( diff --git a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc index 85228f0e23a..620a8b9b3a3 100644 --- a/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc +++ b/chromium/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc @@ -22,9 +22,9 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/buildflags.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_test_util.h" -#include "chrome/common/features.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/gpu_data_manager.h" #include "content/public/browser/notification_observer.h" |