diff --git a/.gn b/.gn index b3135a8..ea4140b 100644 --- a/.gn +++ b/.gn
@@ -78,7 +78,6 @@ "//chrome/browser/updates/announcement_notification:*", # 15 errors "//chrome/browser/updates/internal:*", # 8 errors "//chrome/browser/updates:*", # 21 errors - "//chrome/install_static:*", # 4 errors "//chrome/notification_helper:*", # 4 errors "//chrome/services/cups_proxy/public/cpp:*", # 2 errors "//chrome/services/cups_proxy:*", # 6 errors @@ -133,7 +132,6 @@ "//extensions/browser/api/system_info:*", # 8 errors "//extensions/browser/api/system_memory:*", # 1 error "//extensions/browser/api/system_network:*", # 2 errors - "//extensions/browser/api/system_power_source:*", # 2 errors "//extensions/browser/api/system_storage:*", # 6 errors "//extensions/browser/api/test:*", # 1 error "//extensions/browser/api/usb:*", # 12 errors
diff --git a/DEPS b/DEPS index 73abc78..84dec7d 100644 --- a/DEPS +++ b/DEPS
@@ -199,11 +199,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'caca7bfff996b38ee6bb6413eb5ca62b0c9a380f', + 'skia_revision': '9a27566e0cbcf073d9de5930bcda5a5fd8779e6b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'c1afed6d5ce09f38a9eb7f39b34b4c087cd80503', + 'v8_revision': 'a29c88f51455adc968183aaddadaaac75965b421', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -211,7 +211,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '5e606e5bfce2b23c139c5289cbf1299844fa4b43', + 'angle_revision': 'bc06d145bb29926b2d8cd51c04c7c002a01f6db5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -274,7 +274,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '8793dbe78e44bc6eeceaed0cc8cf0e542d6efd4a', + 'devtools_frontend_revision': 'a82fd978806685fca50a1b73a5987388b1e5d93d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -364,7 +364,7 @@ # revisions. # GN CIPD package version. - 'gn_version': 'git_revision:53d92014bf94c3893886470a1c7c1289f8818db0', + 'gn_version': 'git_revision:0d67e272bdb8145f87d238bc0b2cb8bf80ccec90', # Also, if you change these, update buildtools/DEPS too. Also update the # libc++ svn_revision in //buildtools/deps_revisions.gni. @@ -1514,7 +1514,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '3c2fe3888658d82b47ca831d59a2e07579619c2d', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'a45df0b3491ea72cfcf40e21106eb046c8594223', + Var('webrtc_git') + '/src.git' + '@' + 'b90546580ec3e8236225f39f9e5e5e7b7128c24b', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1586,7 +1586,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3a0cc86fe501ebb245b7d6191903579a2a7c40fe', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@07ae7a3efa65fac8623671bb0c2b29c979bb8239', 'condition': 'checkout_src_internal', }, @@ -1594,7 +1594,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'qJhtBw7ouc--Fdht1yXy9-ZDPYguiqAZbixcf8MasiwC', + 'version': 'nmFhO5_ZTTtPNJGhEylXtJ4sG_lvSsW7CgsI4mn7xzoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1605,7 +1605,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'RYs0dVeLJjwsPik_WXMr4pMuzN55DAmi4gfQCMX-evUC', + 'version': 'y1UO1pWZtkbXGMrkLWW6WfXo6r0vs_UNcESClmGZ_bYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc index 1598b5fb..ce2dd8de 100644 --- a/ash/system/ime_menu/ime_menu_tray.cc +++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -45,6 +45,7 @@ #include "ui/views/controls/scroll_view.h" #include "ui/views/controls/separator.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/layout/box_layout_view.h" #include "ui/views/metadata/metadata_impl_macros.h" namespace ash { @@ -118,7 +119,7 @@ END_METADATA // The view that contains IME menu title. -class ImeTitleView : public views::View { +class ImeTitleView : public views::BoxLayoutView { public: METADATA_HEADER(ImeTitleView); ImeTitleView() { @@ -129,10 +130,10 @@ color_provider->GetContentLayerColor( AshColorProvider::ContentLayerType::kSeparatorColor)), gfx::Insets(kMenuSeparatorVerticalPadding - kMenuSeparatorWidth, 0))); - auto box_layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, kTitleViewPadding); - box_layout->set_minimum_cross_axis_size(kTrayPopupItemMinHeight); - views::BoxLayout* layout_ptr = SetLayoutManager(std::move(box_layout)); + SetOrientation(views::BoxLayout::Orientation::kHorizontal); + SetInsideBorderInsets(kTitleViewPadding); + SetMinimumCrossAxisSize(kTrayPopupItemMinHeight); + auto* title_label = AddChildView(std::make_unique<views::Label>( l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_IME))); title_label->SetBorder( @@ -142,7 +143,7 @@ AshColorProvider::ContentLayerType::kTextColorPrimary)); TrayPopupUtils::SetLabelFontList(title_label, TrayPopupUtils::FontStyle::kPodMenuHeader); - layout_ptr->SetFlexForView(title_label, 1); + SetFlexForView(title_label, 1); settings_button_ = AddChildView(std::make_unique<TopShortcutButton>( base::BindRepeating([]() { @@ -162,7 +163,7 @@ TopShortcutButton* settings_button_ = nullptr; }; -BEGIN_METADATA(ImeTitleView, views::View) +BEGIN_METADATA(ImeTitleView, views::BoxLayoutView) END_METADATA // The view that contains buttons shown on the bottom of IME menu.
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py index d2798147..b2d4176 100755 --- a/build/android/apk_operations.py +++ b/build/android/apk_operations.py
@@ -484,6 +484,10 @@ awful_wrapping = r'\s*'.join('compilation_filter=') for m in re.finditer(awful_wrapping + r'([\s\S]+?)[\],]', package_output): compilation_filters.add(re.sub(r'\s+', '', m.group(1))) + # Starting Android Q, output looks like: + # arm: [status=speed-profile] [reason=install] + for m in re.finditer(r'\[status=(.+?)\]', package_output): + compilation_filters.add(m.group(1)) compilation_filter = ','.join(sorted(compilation_filters)) data_dir_sizes = _DuHelper(d, '%s/{*,.*}' % data_dir, run_as=package_name)
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 6966cd4..e5ec4360 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20201225.3.1 +0.20201228.0.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index 6966cd4..e5ec4360 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20201225.3.1 +0.20201228.0.1
diff --git a/buildtools/DEPS b/buildtools/DEPS index 563d8d24..56de1b6 100644 --- a/buildtools/DEPS +++ b/buildtools/DEPS
@@ -14,7 +14,7 @@ # # GN CIPD package version. - 'gn_version': 'git_revision:53d92014bf94c3893886470a1c7c1289f8818db0', + 'gn_version': 'git_revision:0d67e272bdb8145f87d238bc0b2cb8bf80ccec90', # By default, do not checkout the re-client binaries. 'checkout_reclient': False,
diff --git a/chrome/VERSION b/chrome/VERSION index 15fb5e2..6d77bc5 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=89 MINOR=0 -BUILD=4369 +BUILD=4371 PATCH=0
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index f91b3f51..5b4486c 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -505,7 +505,6 @@ "javatests/src/org/chromium/chrome/browser/signin/DummyAccountPickerTargetFragment.java", "javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninFragmentTest.java", - "javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClientTest.java", "javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java index b2a01ef0..4c71ba17 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetTest.java
@@ -363,10 +363,8 @@ buildAndShowExpandedBottomSheet(); String newFullName = "New Full Name1"; String newGivenName = "New Given Name1"; - TestThreadUtils.runOnUiThreadBlocking(() -> { - mFakeProfileDataSource.addProfileData(new ProfileDataSource.ProfileData( - PROFILE_DATA1.getAccountEmail(), null, newFullName, newGivenName)); - }); + mFakeProfileDataSource.addProfileData(new ProfileDataSource.ProfileData( + PROFILE_DATA1.getAccountEmail(), null, newFullName, newGivenName)); onVisibleView(withText(PROFILE_DATA1.getAccountEmail())).check(matches(isDisplayed())); onVisibleView(withText(newFullName)).check(matches(isDisplayed())); // Check that profile data update when the bottom sheet is expanded won't
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java index 61a36ccb..8632df32 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/account_picker/AccountPickerMediatorTest.java
@@ -28,7 +28,6 @@ import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule; import org.chromium.components.signin.ProfileDataSource; import org.chromium.components.signin.test.util.FakeProfileDataSource; -import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.modelutil.MVCListAdapter; import org.chromium.ui.modelutil.PropertyModel; @@ -129,10 +128,8 @@ mMediator = new AccountPickerMediator( RuntimeEnvironment.application, mModelList, mListenerMock, ACCOUNT_NAME1, false); String fullName2 = "Full Name2"; - TestThreadUtils.runOnUiThreadBlocking(() -> { - mFakeProfileDataSource.addProfileData( - new ProfileDataSource.ProfileData(ACCOUNT_NAME2, null, fullName2, null)); - }); + mFakeProfileDataSource.addProfileData( + new ProfileDataSource.ProfileData(ACCOUNT_NAME2, null, fullName2, null)); // ACCOUNT_NAME1, ACCOUNT_NAME2, ADD_ACCOUNT Assert.assertEquals(3, mModelList.size()); checkItemForExistingAccountRow(0, ACCOUNT_NAME1, FULL_NAME1, /* isSelectedAccount= */ true);
diff --git a/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc b/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc index 0369e7f..72d51b0 100644 --- a/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc +++ b/chrome/browser/chromeos/accessibility/select_to_speak_browsertest.cc
@@ -17,7 +17,6 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/memory/weak_ptr.h" -#include "build/branding_buildflags.h" #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/chromeos/accessibility/speech_monitor.h" #include "chrome/browser/profiles/profile.h" @@ -163,13 +162,7 @@ } }; -// The status tray is not active on official builds. -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -#define MAYBE_SpeakStatusTray DISABLED_SpeakStatusTray -#else -#define MAYBE_SpeakStatusTray SpeakStatusTray -#endif -IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, MAYBE_SpeakStatusTray) { +IN_PROC_BROWSER_TEST_F(SelectToSpeakTest, DISABLED_SpeakStatusTray) { gfx::Rect tray_bounds = ash::Shell::Get() ->GetPrimaryRootWindowController() ->GetStatusAreaWidget()
diff --git a/chrome/browser/chromeos/login/login_browsertest.cc b/chrome/browser/chromeos/login/login_browsertest.cc index 1b37b6e6..6858ae6 100644 --- a/chrome/browser/chromeos/login/login_browsertest.cc +++ b/chrome/browser/chromeos/login/login_browsertest.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h" #include "chrome/browser/chromeos/login/test/guest_session_mixin.h" #include "chrome/browser/chromeos/login/test/login_manager_mixin.h" +#include "chrome/browser/chromeos/login/test/network_portal_detector_mixin.h" #include "chrome/browser/chromeos/login/test/offline_login_test_mixin.h" #include "chrome/browser/chromeos/login/test/oobe_base_test.h" #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" @@ -88,6 +89,7 @@ // We need Fake gaia to avoid network errors that can be caused by // attempts to load real GAIA. FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()}; + NetworkPortalDetectorMixin network_portal_detector_{&mixin_host_}; }; class LoginOfflineManagedTest : public LoginManagerTest { @@ -211,6 +213,8 @@ } IN_PROC_BROWSER_TEST_F(LoginOfflineTest, AuthOffline) { + network_portal_detector_.SimulateDefaultNetworkState( + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE); offline_login_test_mixin_.GoOffline(); offline_login_test_mixin_.InitOfflineLogin(test_account_id_, LoginManagerTest::kPassword);
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc index 47da418..aff72f6 100644 --- a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
@@ -718,7 +718,8 @@ // Assert that the ChromeVox hint dialog behaves as a modal dialog and traps // focus when using tab. -IN_PROC_BROWSER_TEST_F(WelcomeScreenChromeVoxHintTest, TrapFocus) { +// TODO(crbug/1161398): The test is flaky. +IN_PROC_BROWSER_TEST_F(WelcomeScreenChromeVoxHintTest, DISABLED_TrapFocus) { WelcomeScreen* screen = welcome_screen(); OobeScreenWaiter(WelcomeView::kScreenId).Wait(); TtsExtensionEngine::GetInstance()->DisableBuiltInTTSEngineForTesting();
diff --git a/chrome/browser/chromeos/policy/dlp/OWNERS b/chrome/browser/chromeos/policy/dlp/OWNERS index 1725fcc7..bb766c68 100644 --- a/chrome/browser/chromeos/policy/dlp/OWNERS +++ b/chrome/browser/chromeos/policy/dlp/OWNERS
@@ -1,3 +1,2 @@ ayaelattar@chromium.org -nikitapodguzov@chromium.org poromov@chromium.org
diff --git a/chrome/browser/focus_ring_browsertest.cc b/chrome/browser/focus_ring_browsertest.cc index 254711de..c206ddd 100644 --- a/chrome/browser/focus_ring_browsertest.cc +++ b/chrome/browser/focus_ring_browsertest.cc
@@ -8,7 +8,6 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "cc/test/pixel_comparator.h" -#include "chrome/browser/focus_ring_browsertest_mac.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_paths.h" #include "chrome/test/base/in_process_browser_test.h" @@ -18,7 +17,6 @@ #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "ui/base/ui_base_features.h" -#include "ui/base/ui_base_switches.h" // TODO(crbug.com/958242): Move the baselines to skia gold for easier // rebaselining when all platforms are supported @@ -55,9 +53,7 @@ class FocusRingBrowserTest : public InProcessBrowserTest { public: FocusRingBrowserTest() { - feature_list_.InitWithFeatures( - {features::kFormControlsRefresh, features::kCSSColorSchemeUARendering}, - {}); + feature_list_.InitWithFeatures({features::kFormControlsRefresh}, {}); } void SetUp() override { @@ -71,9 +67,6 @@ // The --disable-lcd-text flag helps text render more similarly on // different bots and platform. command_line->AppendSwitch(switches::kDisableLCDText); - - // This is required to allow dark mode to be used on some platforms. - command_line->AppendSwitch(switches::kForceDarkMode); } void RunTest(const std::string& screenshot_filename, @@ -84,7 +77,6 @@ base::ScopedAllowBlockingForTesting allow_blocking; ASSERT_TRUE(features::IsFormControlsRefreshEnabled()); - ASSERT_TRUE(features::IsCSSColorSchemeUARenderingEnabled()); base::FilePath dir_test_data; ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data)); @@ -111,7 +103,8 @@ content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::NavigateToURL( - web_contents, GURL("data:text/html,<!DOCTYPE html>" + body_html))); + web_contents, + GURL("data:text/html,<!DOCTYPE html><body>" + body_html + "</body>"))); ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); EXPECT_TRUE(CompareWebContentsOutputToReference( @@ -181,21 +174,3 @@ /* screenshot_width */ 90, /* screenshot_height */ 130, comparator); } - -IN_PROC_BROWSER_TEST_F(FocusRingBrowserTest, DarkModeButton) { -#if defined(OS_MAC) - if (!MacOSVersionSupportsDarkMode()) - return; - cc::FuzzyPixelComparator comparator = mac_strict_comparator; -#else - cc::ExactPixelComparator comparator(/*discard_alpha=*/true); -#endif - RunTest("focus_ring_browsertest_dark_mode_button", - "<meta name=\"color-scheme\" content=\"light dark\">" - "<button autofocus style=\"width:40px;height:20px;\"></button>" - "<br>" - "<br>" - "<button style=\"width:40px;height:20px;\"></button>", - /* screenshot_width */ 80, - /* screenshot_height */ 80, comparator); -}
diff --git a/chrome/browser/focus_ring_browsertest_mac.h b/chrome/browser/focus_ring_browsertest_mac.h deleted file mode 100644 index 64cef70c..0000000 --- a/chrome/browser/focus_ring_browsertest_mac.h +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2020 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_FOCUS_RING_BROWSERTEST_MAC_H_ -#define CHROME_BROWSER_FOCUS_RING_BROWSERTEST_MAC_H_ - -bool MacOSVersionSupportsDarkMode(); - -#endif // CHROME_BROWSER_FOCUS_RING_BROWSERTEST_MAC_H_
diff --git a/chrome/browser/focus_ring_browsertest_mac.mm b/chrome/browser/focus_ring_browsertest_mac.mm deleted file mode 100644 index 1dc0f43..0000000 --- a/chrome/browser/focus_ring_browsertest_mac.mm +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2020 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/focus_ring_browsertest_mac.h" - -bool MacOSVersionSupportsDarkMode() { - if (@available(macOS 10.14, *)) - return true; - return false; -}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js b/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js index afe235b..1ad4916 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/injected/api.js
@@ -92,7 +92,8 @@ } catch (e) { } }; - window.postMessage(PORT_SETUP_MSG, '*', [channel.port2]); + window.postMessage( + PORT_SETUP_MSG, '*' /* target origin */, [channel.port2] /* transfer */); } /**
diff --git a/chrome/browser/signin/services/android/BUILD.gn b/chrome/browser/signin/services/android/BUILD.gn index 06003623..1ce9456 100644 --- a/chrome/browser/signin/services/android/BUILD.gn +++ b/chrome/browser/signin/services/android/BUILD.gn
@@ -81,6 +81,7 @@ bypass_platform_checks = true testonly = true sources = [ + "junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java", "junit/src/org/chromium/chrome/browser/signin/services/SigninPreferencesManagerTest.java", "junit/src/org/chromium/chrome/browser/signin/services/WebSigninBridgeTest.java", ] @@ -89,6 +90,7 @@ "//base:base_java_test_support", "//base:base_junit_test_support", "//chrome/browser/profiles/android:java", + "//chrome/test/android:chrome_java_test_support", "//components/signin/public/android:java", "//third_party/junit", "//third_party/mockito:mockito_java",
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java index f4d4e95..cb831d1 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCacheRenderTest.java
@@ -141,10 +141,8 @@ .thenReturn(new AccountInfo( new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", null)); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mProfileDataSource.addProfileData(new ProfileDataSource.ProfileData( - accountEmail, null, "Full Name", "Given Name")); - }); + mProfileDataSource.addProfileData( + new ProfileDataSource.ProfileData(accountEmail, null, "Full Name", "Given Name")); mIdentityManager.onExtendedAccountInfoUpdated(new AccountInfo( new CoreAccountId("gaia-id-test"), accountEmail, "gaia-id-test", createAvatar())); TestThreadUtils.runOnUiThreadBlocking(() -> { checkImageIsScaled(accountEmail); }); @@ -165,14 +163,13 @@ @MediumTest @Feature("RenderTest") public void testAvatarIsScaled() throws IOException { + String accountName = "test@example.com"; + ProfileDataSource.ProfileData profileData = new ProfileDataSource.ProfileData( + accountName, createAvatar(), "Full Name", "Given Name"); + mProfileDataSource.addProfileData(profileData); TestThreadUtils.runOnUiThreadBlocking(() -> { - String accountName = "test@example.com"; - ProfileDataSource.ProfileData profileData = new ProfileDataSource.ProfileData( - accountName, createAvatar(), "Full Name", "Given Name"); - mProfileDataSource.addProfileData(profileData); checkImageIsScaled(accountName); }); - mRenderTestRule.render(mImageView, "profile_data_cache_avatar" + mImageSize); }
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java index 7c137827..5309344 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/SigninHelper.java
@@ -66,9 +66,7 @@ } } return result; - } catch (IOException e) { - Log.w(TAG, "Failed to get change events", e); - } catch (GoogleAuthException e) { + } catch (IOException | GoogleAuthException e) { Log.w(TAG, "Failed to get change events", e); } return new ArrayList<>(0); @@ -113,27 +111,29 @@ return; } - Account syncAccount = CoreAccountInfo.getAndroidAccountFrom( - mSigninManager.getIdentityManager().getPrimaryAccountInfo(ConsentLevel.SYNC)); + final CoreAccountInfo syncAccount = + mSigninManager.getIdentityManager().getPrimaryAccountInfo(ConsentLevel.SYNC); if (syncAccount == null) { return; } String renamedAccount = mPrefsManager.getNewSignedInAccountName(); if (accountsChanged && renamedAccount != null) { - handleAccountRename(syncAccount.name, renamedAccount); + handleAccountRename(syncAccount.getEmail(), renamedAccount); return; } + final List<Account> accounts = + AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(); // Always check for account deleted. - if (!accountExists(syncAccount)) { + if (AccountUtils.findAccountByName(accounts, syncAccount.getEmail()) == null) { // It is possible that Chrome got to this point without account // rename notification. Let us signout before doing a rename. AsyncTask<Void> task = new AsyncTask<Void>() { @Override protected Void doInBackground() { updateAccountRenameData( - new SystemAccountChangeEventChecker(), syncAccount.name); + new SystemAccountChangeEventChecker(), syncAccount.getEmail()); return null; } @@ -199,17 +199,6 @@ }); } - private static boolean accountExists(Account account) { - List<Account> accounts = AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(); - for (int i = 0; i < accounts.size(); i++) { - Account a = accounts.get(i); - if (a.equals(account)) { - return true; - } - } - return false; - } - @VisibleForTesting public static void updateAccountRenameData( AccountChangeEventChecker checker, String currentName) { @@ -225,15 +214,16 @@ try { outerLoop: while (true) { + final List<Account> accounts = + AccountManagerFacadeProvider.getInstance().tryGetGoogleAccounts(); List<String> nameChanges = checker.getAccountChangeEvents( ContextUtils.getApplicationContext(), newIndex, newName); - for (String name : nameChanges) { if (name != null) { // We have found a rename event of the current account. // We need to check if that account is further renamed. newName = name; - if (!accountExists(AccountUtils.createAccountFromName(newName))) { + if (AccountUtils.findAccountByName(accounts, newName) == null) { newIndex = 0; // Start from the beginning of the new account. continue outerLoop; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java similarity index 80% rename from chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java rename to chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java index de307bc5b..368eb57 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninHelperTest.java +++ b/chrome/browser/signin/services/android/junit/src/org/chromium/chrome/browser/signin/services/SigninHelperTest.java
@@ -2,39 +2,27 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.signin; - -import androidx.test.filters.SmallTest; +package org.chromium.chrome.browser.signin.services; import org.junit.After; import org.junit.Assert; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.test.util.Batch; -import org.chromium.chrome.browser.signin.services.SigninHelper; -import org.chromium.chrome.browser.signin.services.SigninPreferencesManager; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule; import org.chromium.chrome.test.util.browser.signin.MockChangeEventChecker; /** * Instrumentation tests for {@link SigninHelper}. */ -@RunWith(ChromeJUnit4ClassRunner.class) -@Batch(Batch.UNIT_TESTS) +@RunWith(BaseRobolectricTestRunner.class) public class SigninHelperTest { @Rule public final AccountManagerTestRule mAccountManagerTestRule = new AccountManagerTestRule(); - private MockChangeEventChecker mEventChecker; - - @Before - public void setUp() { - mEventChecker = new MockChangeEventChecker(); - } + private final MockChangeEventChecker mEventChecker = new MockChangeEventChecker(); @After public void tearDown() { @@ -42,43 +30,43 @@ } @Test - @SmallTest public void testSimpleAccountRename() { mEventChecker.insertRenameEvent("A", "B"); SigninHelper.updateAccountRenameData(mEventChecker, "A"); Assert.assertEquals("B", getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(0); } @Test - @SmallTest public void testNotSignedInAccountRename() { mEventChecker.insertRenameEvent("B", "C"); SigninHelper.updateAccountRenameData(mEventChecker, "A"); Assert.assertNull(getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(0); } @Test - @SmallTest public void testSimpleAccountRenameTwice() { mEventChecker.insertRenameEvent("A", "B"); SigninHelper.updateAccountRenameData(mEventChecker, "A"); Assert.assertEquals("B", getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(0); mEventChecker.insertRenameEvent("B", "C"); SigninHelper.updateAccountRenameData(mEventChecker, "B"); Assert.assertEquals("C", getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(0); } @Test - @SmallTest public void testNotSignedInAccountRename2() { mEventChecker.insertRenameEvent("B", "C"); mEventChecker.insertRenameEvent("C", "D"); SigninHelper.updateAccountRenameData(mEventChecker, "A"); Assert.assertNull(getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(0); } @Test - @SmallTest public void testChainedAccountRename2() { mEventChecker.insertRenameEvent("Z", "Y"); // Unrelated. mEventChecker.insertRenameEvent("A", "B"); @@ -87,10 +75,10 @@ mEventChecker.insertRenameEvent("C", "D"); SigninHelper.updateAccountRenameData(mEventChecker, "A"); Assert.assertEquals("D", getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(0); } @Test - @SmallTest public void testLoopedAccountRename() { mEventChecker.insertRenameEvent("Z", "Y"); // Unrelated. mEventChecker.insertRenameEvent("A", "B"); @@ -101,9 +89,15 @@ mAccountManagerTestRule.addAccount("D"); SigninHelper.updateAccountRenameData(mEventChecker, "A"); Assert.assertEquals("D", getNewSignedInAccountName()); + checkLastAccountChangedEventIndex(1); } private String getNewSignedInAccountName() { return SigninPreferencesManager.getInstance().getNewSignedInAccountName(); } + + private void checkLastAccountChangedEventIndex(int expectedEventIndex) { + Assert.assertEquals(expectedEventIndex, + SigninPreferencesManager.getInstance().getLastAccountChangedEventIndex()); + } }
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc index bb367ef..e25304e 100644 --- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
@@ -40,6 +40,7 @@ void ErrorScreenHandler::Hide() { showing_ = false; + show_on_init_ = false; if (screen_) screen_->DoHide(); }
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc index bf9bac61..df9d873 100644 --- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc +++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.cc
@@ -47,20 +47,26 @@ MultiDeviceSetupDialog* MultiDeviceSetupDialog::current_instance_ = nullptr; // static +gfx::NativeWindow MultiDeviceSetupDialog::containing_window_ = nullptr; + +// static void MultiDeviceSetupDialog::Show() { - // The dialog is already showing, so there is nothing to do. - if (current_instance_) + // Focus the window hosting the dialog that has already been created. + if (containing_window_) { + DCHECK(current_instance_); + containing_window_->Focus(); return; + } current_instance_ = new MultiDeviceSetupDialog(); - gfx::NativeWindow window = chrome::ShowWebDialog( + containing_window_ = chrome::ShowWebDialog( nullptr /* parent */, ProfileManager::GetActiveUserProfile(), current_instance_); // Remove the black backdrop behind the dialog window which appears in tablet // and full-screen mode. - ash::WindowBackdrop::Get(window)->SetBackdropMode( - ash::WindowBackdrop::BackdropMode::kDisabled); + ash::WindowBackdrop::Get(containing_window_) + ->SetBackdropMode(ash::WindowBackdrop::BackdropMode::kDisabled); } // static @@ -101,6 +107,7 @@ void MultiDeviceSetupDialog::OnDialogClosed(const std::string& json_retval) { DCHECK(this == current_instance_); current_instance_ = nullptr; + containing_window_ = nullptr; // Note: The call below deletes |this|, so there is no further need to keep // track of the pointer.
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h index 18a4359b..eab6f4d 100644 --- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h +++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h
@@ -47,6 +47,7 @@ private: static MultiDeviceSetupDialog* current_instance_; + static gfx::NativeWindow containing_window_; // List of callbacks that have registered themselves to be invoked once this // dialog is closed.
diff --git a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc index efb094b0..b4c4d3b 100644 --- a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
@@ -1126,7 +1126,9 @@ GetManager().GetAppIds().size()); } -IN_PROC_BROWSER_TEST_P(SystemWebAppManagerUpgradeBrowserTest, Upgrade) { +// Test is consistently failing: crbug/1162044 +IN_PROC_BROWSER_TEST_P(SystemWebAppManagerUpgradeBrowserTest, + DISABLED_Upgrade) { WaitForSystemAppsSynchronized(); const auto& app_ids = GetManager().GetAppIds();
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 24f9c851..091f243 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1608938443-5e2a6a5509ef0c35b284bb575c523599912f115a.profdata +chrome-linux-master-1609156644-42cb6a035b1fe5a631f9a5a0f3f4dab0f809ccfe.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 82ffbf63..8d3110d 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-master-1608938443-813619ab6447ba11a985c78bfacde75dce409fd5.profdata +chrome-mac-master-1609156644-74221c569e797d96fdd58cd45c2be34f02342fb7.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index c66c365..ab8ddd5 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-master-1608508387-56780dae3832c65bafd36e4cfe96756ad3b86eef.profdata +chrome-win32-master-1609077635-95cc21097bbc828eec82ee3506f035af36a6f657.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 95774ae..fc208a8 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1608913095-f136f8f83569a182f681a83edbe456e8f7d0cecd.profdata +chrome-win64-master-1609124291-e7a0465f695fe158abf9ec0e9104d31fe42b886f.profdata
diff --git a/chrome/common/extensions/docs/templates/public/apps/system_powerSource.html b/chrome/common/extensions/docs/templates/public/apps/system_powerSource.html deleted file mode 100644 index 139973d1..0000000 --- a/chrome/common/extensions/docs/templates/public/apps/system_powerSource.html +++ /dev/null
@@ -1 +0,0 @@ -{{+partials.standard_apps_api api:apis.apps.system_power_source/}}
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 7816ebd..70e2c32 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -774,7 +774,6 @@ skip.insert(APIPermission::kSystemDisplay); skip.insert(APIPermission::kSystemMemory); skip.insert(APIPermission::kSystemNetwork); - skip.insert(APIPermission::kSystemPowerSource); skip.insert(APIPermission::kTts); skip.insert(APIPermission::kUnlimitedStorage); skip.insert(APIPermission::kWebcamPrivate);
diff --git a/chrome/install_static/BUILD.gn b/chrome/install_static/BUILD.gn index 584965d..ea68d71 100644 --- a/chrome/install_static/BUILD.gn +++ b/chrome/install_static/BUILD.gn
@@ -31,7 +31,7 @@ sources = [ "../app/chrome_dll_resource.h", - "../chrome/common/chrome_icon_resources_win.h", + "../common/chrome_icon_resources_win.h", "install_constants.h", "install_details.cc", "install_details.h", @@ -71,6 +71,7 @@ # process-wide InstallDetails instance (i.e., chrome_elf.dll). source_set("primary_module") { sources = [ "get_install_details_payload.cc" ] + deps = [ ":install_static_util" ] } # A source set for use by modules in a process that fetch the process-wide @@ -102,6 +103,7 @@ "//build:branding_buildflags", "//chrome/install_static:install_static_util", "//chrome/install_static/test:test_support", + "//components/version_info", "//testing/gmock", "//testing/gtest", ]
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index ab655a5a..d2b4077 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -6795,8 +6795,6 @@ sources += [ "../browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm", "../browser/apps/platform_apps/app_shim_quit_interactive_uitest_mac.mm", - "../browser/focus_ring_browsertest_mac.h", - "../browser/focus_ring_browsertest_mac.mm", "../browser/global_keyboard_shortcuts_mac_browsertest.mm", "../browser/notifications/notification_interactive_uitest_mac.mm", "../browser/spellchecker/spellcheck_mac_view_interactive_uitest.mm",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java index 9ead390..76969e89 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/MockChangeEventChecker.java
@@ -18,7 +18,7 @@ */ public final class MockChangeEventChecker implements SigninHelper.AccountChangeEventChecker { - private Map<String, List<String>> mEvents = new HashMap<>(); + private final Map<String, List<String>> mEvents = new HashMap<>(); @Override public List<String> getAccountChangeEvents(
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button.png deleted file mode 100644 index 7336590..0000000 --- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button.png +++ /dev/null Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_mac.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_mac.png deleted file mode 100644 index b0ea727..0000000 --- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_mac.png +++ /dev/null Binary files differ
diff --git a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png b/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png deleted file mode 100644 index 03f91f2..0000000 --- a/chrome/test/data/focus_rings/focus_ring_browsertest_dark_mode_button_win.png +++ /dev/null Binary files differ
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 470481e..f6d157b3 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -13685.0.0 \ No newline at end of file +13690.0.0 \ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/css/main.css b/chromeos/components/camera_app_ui/resources/css/main.css index 0b88716a..2d9a259 100644 --- a/chromeos/components/camera_app_ui/resources/css/main.css +++ b/chromeos/components/camera_app_ui/resources/css/main.css
@@ -1563,7 +1563,6 @@ padding-top: calc(100% / 3); visibility: hidden; width: calc(100% / 3); - z-index: 30; } body.photo.scan-barcode .barcode-scan-box { @@ -1602,10 +1601,20 @@ * responsive window design. */ .barcode-chip-container { --chip-height: 32px; + --chip-max-width: 420px; + --min-scanbox-distance: 40px; + --text-expand-button-height: 40px; + --text-line-height: 24px; + --text-padding-vertical: 8px; + left: 50%; + max-width: min(80%, var(--chip-max-width)); opacity: 1; position: absolute; - top: 10%; + /* Avoid collision with scan-box and preview-box */ + top: max(8px, min(10%, 33.33% - var(--text-line-height) - + var(--text-expand-button-height) - 2 * var(--text-padding-vertical) - + var(--min-scanbox-distance))); transform: translateX(-50%); transition: opacity var(--moderate1-duration) var(--standard-easing); z-index: 50; @@ -1633,6 +1642,7 @@ background: url(/images/barcode_url.svg) no-repeat; content: ''; display: inline-block; + flex-shrink: 0; height: 20px; margin-inline-end: 6px; vertical-align: middle; @@ -1641,7 +1651,6 @@ .barcode-chip-url > a { color: var(--blue-300); - max-width: 416px; overflow: hidden; text-decoration: none; text-overflow: ellipsis; @@ -1678,14 +1687,13 @@ display: flex; flex-direction: column; font: 400 15px Roboto; + padding: var(--text-padding-vertical) 20px; } #barcode-chip-text-content { - --line-height: 24px; color: var(--grey-200); - line-height: var(--line-height); - margin: 8px 20px; - max-width: 416px; + line-height: var(--text-line-height); + max-width: 100%; overflow: hidden; text-decoration: none; text-overflow: ellipsis; @@ -1694,14 +1702,15 @@ .expanded #barcode-chip-text-content { /* TODO(b/172879638): Make this responsive */ - max-height: calc(var(--line-height) * 10); + max-height: calc(var(--text-line-height) * 10); white-space: normal; - width: 416px; + /* Keep the same width as before to avoid text jumping. */ + width: var(--chip-max-width); } #barcode-chip-text-expand { background: url(/images/barcode_chevron_down.svg) center no-repeat; - height: 40px; + height: var(--text-expand-button-height); width: 100%; }
diff --git a/chromeos/components/camera_app_ui/resources/js/barcode_chip.js b/chromeos/components/camera_app_ui/resources/js/barcode_chip.js index abdc00e..0bad37f 100644 --- a/chromeos/components/camera_app_ui/resources/js/barcode_chip.js +++ b/chromeos/components/camera_app_ui/resources/js/barcode_chip.js
@@ -5,6 +5,7 @@ import {browserProxy} from './browser_proxy/browser_proxy.js'; import {assert} from './chrome_util.js'; import * as dom from './dom.js'; +import {BarcodeContentType, sendBarcodeDetectedEvent} from './metrics.js'; import * as snackbar from './snackbar.js'; import * as state from './state.js'; import {OneShotTimer} from './timer.js'; @@ -170,8 +171,20 @@ currentCode = code; if (isSafeUrl(code)) { + sendBarcodeDetectedEvent({contentType: BarcodeContentType.URL}); showUrl(code); } else { + sendBarcodeDetectedEvent({contentType: BarcodeContentType.TEXT}); showText(code); } } + +/** + * Dismisses the current barcode chip if it's being shown. + */ +export function dismiss() { + if (currentTimer === null) { + return; + } + currentTimer.fireNow(); +}
diff --git a/chromeos/components/camera_app_ui/resources/js/metrics.js b/chromeos/components/camera_app_ui/resources/js/metrics.js index 197de91..9bdc97dd 100644 --- a/chromeos/components/camera_app_ui/resources/js/metrics.js +++ b/chromeos/components/camera_app_ui/resources/js/metrics.js
@@ -371,3 +371,41 @@ [20, colNo], ])); } + +/** + * Sends the barcode enabled event. + */ +export function sendBarcodeEnabledEvent() { + sendEvent({ + eventCategory: 'barcode', + eventAction: 'enable', + }); +} + +/** + * Types of the decoded barcode content. + * @enum {string} + */ +export const BarcodeContentType = { + TEXT: 'text', + URL: 'url', +}; + +/** + * @typedef {{ + * contentType: !BarcodeContentType, + * }} + */ +export let BarcodeDetectedEventParam; + +/** + * Sends the barcode detected event. + * @param {!BarcodeDetectedEventParam} param + */ +export function sendBarcodeDetectedEvent({contentType}) { + sendEvent({ + eventCategory: 'barcode', + eventAction: 'detect', + eventLabel: contentType, + }); +}
diff --git a/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js b/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js index 33d247f..c87189c5 100644 --- a/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js +++ b/chromeos/components/camera_app_ui/resources/js/models/native_file_system_entry.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {AsyncJobQueue} from '../async_job_queue.js'; import {assert} from '../chrome_util.js'; import {NotImplementedError} from '../type.js'; @@ -116,6 +117,12 @@ } /** + * Guards from name collision when creating files. + * @type {!AsyncJobQueue} + */ +const createFileJobs = new AsyncJobQueue(); + +/** * The directory entry implementation for SWA. * @implements {AbstractDirectoryEntry} */ @@ -156,11 +163,40 @@ } /** + * Checks if file or directory with the target name exists. + * @param {string} name + * @return {!Promise<boolean>} + * @private + */ + async isExist_(name) { + try { + await this.getFile(name); + return true; + } catch (e) { + if (e.name === 'NotFoundError') { + return false; + } + if (e.name === 'TypeMismatchError' || e instanceof TypeError) { + // Directory with same name exists. + return true; + } + throw e; + } + } + + /** * @override */ async createFile(name) { - const handle = await this.handle_.getFileHandle(name, {create: true}); - return new NativeFileEntry(handle); + return createFileJobs.push(async () => { + let uniqueName = name; + for (let i = 0; await this.isExist_(uniqueName);) { + uniqueName = name.replace(/^(.*?)(?=\.)/, `$& (${++i})`); + } + const handle = + await this.handle_.getFileHandle(uniqueName, {create: true}); + return new NativeFileEntry(handle); + }); } /**
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera/options.js b/chromeos/components/camera_app_ui/resources/js/views/camera/options.js index c6421fd..6a181d5 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/camera/options.js +++ b/chromeos/components/camera_app_ui/resources/js/views/camera/options.js
@@ -8,9 +8,10 @@ // eslint-disable-next-line no-unused-vars import {DeviceInfoUpdater} from '../../device/device_info_updater.js'; import * as dom from '../../dom.js'; +import {sendBarcodeEnabledEvent} from '../../metrics.js'; import * as nav from '../../nav.js'; import * as state from '../../state.js'; -import {Facing, PerfEvent, ViewName} from '../../type.js'; +import {Facing, Mode, PerfEvent, ViewName} from '../../type.js'; import * as util from '../../util.js'; /** @@ -105,6 +106,13 @@ this.toggleMirror_.addEventListener('click', () => this.saveMirroring_()); this.toggleBarcode_.addEventListener('click', () => this.updateBarcode_()); + state.addObserver(Mode.PHOTO, (inPhotoMode) => { + if (!inPhotoMode) { + this.toggleBarcode_.checked = false; + this.updateBarcode_(); + } + }); + util.bindElementAriaLabelWithState({ element: dom.get('#toggle-timer', Element), state: state.State.TIMER_3SEC, @@ -257,6 +265,9 @@ */ updateBarcode_() { state.set(state.State.SCAN_BARCODE, this.toggleBarcode_.checked); + if (this.toggleBarcode_.checked) { + sendBarcodeEnabledEvent(); + } } /**
diff --git a/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js b/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js index bf0c7d5..253ed54a 100644 --- a/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js +++ b/chromeos/components/camera_app_ui/resources/js/views/camera/preview.js
@@ -8,8 +8,8 @@ import {DeviceOperator, parseMetadata} from '../../mojo/device_operator.js'; import * as nav from '../../nav.js'; import * as state from '../../state.js'; -import * as util from '../../util.js'; import {Mode} from '../../type.js'; +import * as util from '../../util.js'; /** * Creates a controller for the video preview of Camera view. @@ -208,6 +208,7 @@ this.scanner_.start(); } else { this.scanner_.stop(); + barcodeChip.dismiss(); } }
diff --git a/chromeos/components/camera_app_ui/resources/views/main.html b/chromeos/components/camera_app_ui/resources/views/main.html index 84a2678f..78e33a2 100644 --- a/chromeos/components/camera_app_ui/resources/views/main.html +++ b/chromeos/components/camera_app_ui/resources/views/main.html
@@ -79,6 +79,30 @@ <div class="snackbar" aria-live="polite"></div> <div id="camera-mode" class="centered-overlay"></div> </div> + <div id="barcode-chip-url-container" + class="invisible barcode-chip-container"> + <div class="barcode-chip-url"> + <a target="_blank"></a> + </div> + <div class="circle"> + <button class="barcode-copy-button" tabindex="0" + i18n-label="barcode_copy_link_button"></button> + </div> + </div> + <div id="barcode-chip-text-container" + class="invisible barcode-chip-container" + role="dialog" i18n-label="barcode_text_detected" + aria-live="polite" aria-describedby="barcode-chip-text-content"> + <div class="barcode-chip-text"> + <div id="barcode-chip-text-content"></div> + <button id="barcode-chip-text-expand" + aria-expanded="false"></button> + </div> + <div class="circle"> + <button class="barcode-copy-button" tabindex="0" + i18n-label="barcode_copy_text_button"></button> + </div> + </div> </div> <div id="video-snapshot-holder" class="buttons right-stripe circle"> <button id="video-snapshot" tabindex="0" @@ -406,29 +430,6 @@ </div> </div> <div id="toast" class="centered-overlay" aria-live="polite"></div> - <div id="barcode-chip-url-container" - class="invisible barcode-chip-container"> - <div class="barcode-chip-url"> - <a target="_blank"></a> - </div> - <div class="circle"> - <button class="barcode-copy-button" tabindex="0" - i18n-label="barcode_copy_link_button"></button> - </div> - </div> - <div id="barcode-chip-text-container" - class="invisible barcode-chip-container" - role="dialog" i18n-label="barcode_text_detected" - aria-live="polite" aria-describedby="barcode-chip-text-content"> - <div class="barcode-chip-text"> - <div id="barcode-chip-text-content"></div> - <button id="barcode-chip-text-expand" aria-expanded="false"></button> - </div> - <div class="circle"> - <button class="barcode-copy-button" tabindex="0" - i18n-label="barcode_copy_text_button"></button> - </div> - </div> <div id="tooltip" aria-hidden="true"></div> <audio id="sound-tick-final" src="/sounds/tick_final.ogg" data-timeout="1000">
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java index 3c8cac35..0ed3a5b 100644 --- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java +++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/AccountHolder.java
@@ -10,7 +10,9 @@ import androidx.annotation.Nullable; import org.chromium.components.signin.AccessTokenData; +import org.chromium.components.signin.AccountUtils; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -99,6 +101,16 @@ && mAccount.equals(((AccountHolder) that).getAccount()); } + /** + * Creates builder of {@link AccountHolder} for the given account email. + */ + public static Builder builder(String accountEmail) { + return new Builder(AccountUtils.createAccountFromName(accountEmail)); + } + + /** + * Creates builder of {@link AccountHolder} for the given account. + */ public static Builder builder(@NonNull Account account) { return new Builder(account); } @@ -118,11 +130,11 @@ * Used to construct AccountHolder instances. */ public static class Builder { - private Account mAccount; + private final Account mAccount; private Map<String, String> mAuthTokens = new HashMap<>(); private Map<String, Boolean> mHasBeenAccepted = new HashMap<>(); private boolean mAlwaysAccept; - private Set<String> mFeatures = new HashSet<>(); + private final Set<String> mFeatures = new HashSet<>(); Builder(@NonNull Account account) { mAccount = account; @@ -149,13 +161,10 @@ } /** - * Sets the set of features for this account. - * - * @param features The set of account features. - * @return This object, for chaining method calls. + * Adds features to the set of features for this account. */ - public Builder featureSet(@NonNull Set<String> features) { - mFeatures = features; + public Builder addFeatures(String... features) { + Collections.addAll(mFeatures, features); return this; }
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java index 711f6bf..82f4cb7 100644 --- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java +++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
@@ -177,7 +177,7 @@ */ public void addProfileData(ProfileDataSource.ProfileData profileData) { assert mFakeProfileDataSource != null : "ProfileDataSource was disabled!"; - ThreadUtils.runOnUiThreadBlocking(() -> mFakeProfileDataSource.addProfileData(profileData)); + mFakeProfileDataSource.addProfileData(profileData); } @GuardedBy("mLock")
diff --git a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java index 9ce003f..7c1753c 100644 --- a/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java +++ b/components/signin/core/browser/android/javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java
@@ -4,7 +4,6 @@ package org.chromium.components.signin.test.util; -import androidx.annotation.MainThread; import androidx.annotation.Nullable; import org.chromium.base.ObserverList; @@ -55,12 +54,12 @@ * If the account email of the {@link ProfileData} already exists, replace the old * {@link ProfileData} with the given one. */ - @MainThread public void addProfileData(ProfileData profileData) { - ThreadUtils.assertOnUiThread(); - mProfileDataMap.put(profileData.getAccountEmail(), profileData); - for (Observer observer : mObservers) { - observer.onProfileDataUpdated(profileData); - } + ThreadUtils.runOnUiThreadBlocking(() -> { + mProfileDataMap.put(profileData.getAccountEmail(), profileData); + for (Observer observer : mObservers) { + observer.onProfileDataUpdated(profileData); + } + }); } }
diff --git a/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java b/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java index ab862ca..6e5c80a 100644 --- a/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java +++ b/components/signin/core/browser/android/junit/src/org/chromium/components/signin/test/AccountManagerFacadeRobolectricTest.java
@@ -37,8 +37,6 @@ import org.chromium.components.signin.test.util.FakeAccountManagerDelegate; import org.chromium.testing.local.CustomShadowUserManager; -import java.util.Arrays; -import java.util.HashSet; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -225,15 +223,14 @@ assertChildAccountStatus(bothAccount, ChildAccountStatus.REGULAR_CHILD); } - private Account addTestAccount(String accountName, String... features) { - Account account = AccountUtils.createAccountFromName(accountName); - AccountHolder holder = AccountHolder.builder(account) + private Account addTestAccount(String accountEmail, String... features) { + AccountHolder holder = AccountHolder.builder(accountEmail) .alwaysAccept(true) - .featureSet(new HashSet<>(Arrays.asList(features))) + .addFeatures(features) .build(); mDelegate.addAccountHolderExplicitly(holder); Assert.assertFalse(((AccountManagerFacadeImpl) mFacade).isUpdatePending().get()); - return account; + return holder.getAccount(); } private void removeTestAccount(Account account) {
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.cc b/content/browser/direct_sockets/direct_sockets_service_impl.cc index 9f6a9ef..92c70ce 100644 --- a/content/browser/direct_sockets/direct_sockets_service_impl.cc +++ b/content/browser/direct_sockets/direct_sockets_service_impl.cc
@@ -74,8 +74,8 @@ return; } - // TODO(crbug.com/905818): Populate local_addr from options. - const base::Optional<net::IPEndPoint> local_addr = base::nullopt; + base::Optional<net::IPEndPoint> local_addr = base::nullopt; + PopulateLocalAddr(*options, local_addr); network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options = network::mojom::TCPConnectedSocketOptions::New(); @@ -182,6 +182,19 @@ return net::ERR_NOT_IMPLEMENTED; } +void DirectSocketsServiceImpl::PopulateLocalAddr( + const blink::mojom::DirectSocketOptions& options, + base::Optional<net::IPEndPoint>& local_addr) { + DCHECK(!local_addr); + if (!options.local_hostname) + return; + + net::IPAddress local_address; + bool success = local_address.AssignFromIPLiteral(*options.local_hostname); + if (success) + local_addr = net::IPEndPoint(local_address, options.local_port); +} + network::mojom::NetworkContext* DirectSocketsServiceImpl::GetNetworkContext() { if (network::mojom::NetworkContext* network_context = GetNetworkContextForTesting()) {
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.h b/content/browser/direct_sockets/direct_sockets_service_impl.h index 227b16758..c705e66d 100644 --- a/content/browser/direct_sockets/direct_sockets_service_impl.h +++ b/content/browser/direct_sockets/direct_sockets_service_impl.h
@@ -71,6 +71,10 @@ net::Error ValidateOptions(const blink::mojom::DirectSocketOptions& options, net::IPAddress& remote_address); + // Populate |local_addr| from options. + void PopulateLocalAddr(const blink::mojom::DirectSocketOptions& options, + base::Optional<net::IPEndPoint>& local_addr); + network::mojom::NetworkContext* GetNetworkContext(); RenderFrameHost* frame_host_;
diff --git a/content/browser/direct_sockets/direct_sockets_unittest.cc b/content/browser/direct_sockets/direct_sockets_unittest.cc index ce023ed..843cabe 100644 --- a/content/browser/direct_sockets/direct_sockets_unittest.cc +++ b/content/browser/direct_sockets/direct_sockets_unittest.cc
@@ -36,6 +36,11 @@ return direct_sockets_service().ValidateOptions(options, remote_address); } + void PopulateLocalAddr(const blink::mojom::DirectSocketOptions& options, + base::Optional<net::IPEndPoint>& local_addr) { + return direct_sockets_service().PopulateLocalAddr(options, local_addr); + } + private: base::test::ScopedFeatureList feature_list_; std::unique_ptr<DirectSocketsServiceImpl> direct_sockets_service_; @@ -61,4 +66,35 @@ EXPECT_EQ(ValidateOptions(options), net::ERR_NAME_NOT_RESOLVED); } +TEST_F(DirectSocketsUnitTest, PopulateLocalAddr) { + blink::mojom::DirectSocketOptions options; + + // Test for default condition. + base::Optional<net::IPEndPoint> local_addr = base::nullopt; + PopulateLocalAddr(options, local_addr); + EXPECT_EQ(local_addr, base::nullopt); + + // Test with IPv4 address and default port(0) provided. + local_addr = base::nullopt; + options.local_hostname = "12.34.56.78"; + PopulateLocalAddr(options, local_addr); + const uint8_t ipv4[net::IPAddress::kIPv4AddressSize] = {12, 34, 56, 78}; + EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv4), 0)); + + // Test with IPv6 address and default port(0) provided. + local_addr = base::nullopt; + options.local_hostname = "fedc:ba98:7654:3210:fedc:ba98:7654:3210"; + PopulateLocalAddr(options, local_addr); + const uint8_t ipv6[net::IPAddress::kIPv6AddressSize] = { + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, + 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}; + EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv6), 0)); + + // Test with IPv6 address and port(12345) provided. + local_addr = base::nullopt; + options.local_port = 12345; + PopulateLocalAddr(options, local_addr); + EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv6), 12345)); +} + } // namespace content
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 8056f3b..77226795 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3957,6 +3957,11 @@ } bool WebContentsImpl::ShouldIgnoreUnresponsiveRenderer() { + // Suppress unresponsive renderers if the command line asks for it. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableHangMonitor)) + return true; + if (suppress_unresponsive_renderer_count_ > 0) return true;
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index 7f93bfed..2dc05ba9 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn
@@ -529,7 +529,6 @@ "api/audio/audio_apitest_chromeos.cc", "api/cec_private/cec_private_apitest.cc", "api/media_perception_private/media_perception_private_apitest.cc", - "api/system_power_source/system_power_source_apitest.cc", "api/virtual_keyboard/virtual_keyboard_apitest.cc", ] @@ -773,7 +772,6 @@ "api/media_perception_private/conversion_utils_unittest.cc", "api/media_perception_private/media_perception_api_manager_unittest.cc", "api/networking_private/networking_private_chromeos_unittest.cc", - "api/system_power_source/system_power_source_api_unittest.cc", "api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc", "api/webcam_private/visca_webcam_unittest.cc", ]
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn index f6912aef..426b3316 100644 --- a/extensions/browser/api/BUILD.gn +++ b/extensions/browser/api/BUILD.gn
@@ -133,7 +133,6 @@ "//extensions/browser/api/cec_private", "//extensions/browser/api/clipboard", "//extensions/browser/api/diagnostics", - "//extensions/browser/api/system_power_source", "//extensions/browser/api/virtual_keyboard", "//extensions/browser/api/vpn_provider", "//extensions/browser/api/webcam_private",
diff --git a/extensions/browser/api/system_power_source/BUILD.gn b/extensions/browser/api/system_power_source/BUILD.gn deleted file mode 100644 index f014563..0000000 --- a/extensions/browser/api/system_power_source/BUILD.gn +++ /dev/null
@@ -1,19 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//extensions/buildflags/buildflags.gni") - -assert(enable_extensions, - "Cannot depend on extensions because enable_extensions=false.") - -source_set("system_power_source") { - sources = [ - "system_power_source_api.cc", - "system_power_source_api.h", - ] - - deps = [ "//extensions/common/api" ] - - public_deps = [ "//extensions/browser:browser_sources" ] -}
diff --git a/extensions/browser/api/system_power_source/system_power_source_api.cc b/extensions/browser/api/system_power_source/system_power_source_api.cc deleted file mode 100644 index e99e4fc..0000000 --- a/extensions/browser/api/system_power_source/system_power_source_api.cc +++ /dev/null
@@ -1,146 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "extensions/browser/api/system_power_source/system_power_source_api.h" - -#include <cmath> - -#include "base/no_destructor.h" -#include "chromeos/dbus/power/power_manager_client.h" -#include "extensions/browser/event_router.h" -#include "extensions/common/api/system_power_source.h" - -namespace extensions { - -namespace { - -std::unique_ptr<double> RoundDownToTwoSignificantDigits(double d) { - if (!std::isnormal(d) || d <= 0.0) - return nullptr; - - int scale = std::floor(std::log10(d)); - return std::make_unique<double>(std::floor(d / std::pow(10, scale - 1)) * - std::pow(10, scale - 1)); -} - -api::system_power_source::PowerSourceType PowerSourceTypeFromProtoValue( - power_manager::PowerSupplyProperties_PowerSource_Type type) { - switch (type) { - case power_manager::PowerSupplyProperties_PowerSource_Type_OTHER: - return api::system_power_source::POWER_SOURCE_TYPE_UNKNOWN; - - case power_manager::PowerSupplyProperties_PowerSource_Type_MAINS: - return api::system_power_source::POWER_SOURCE_TYPE_MAINS; - - case power_manager::PowerSupplyProperties_PowerSource_Type_USB_C: - case power_manager::PowerSupplyProperties_PowerSource_Type_USB_BC_1_2: - return api::system_power_source::POWER_SOURCE_TYPE_USB; - } - NOTREACHED(); - return api::system_power_source::POWER_SOURCE_TYPE_UNKNOWN; -} - -std::vector<api::system_power_source::PowerSourceInfo> -PowerSourceInfoVectorFromProtoValue( - const power_manager::PowerSupplyProperties& proto) { - std::vector<api::system_power_source::PowerSourceInfo> power_sources; - base::Optional<std::string> external_power_source_id; - - if (proto.has_external_power_source_id()) - external_power_source_id = proto.external_power_source_id(); - - power_sources.reserve(proto.available_external_power_source_size()); - for (int i = 0; i < proto.available_external_power_source_size(); ++i) { - const power_manager::PowerSupplyProperties_PowerSource& power_source_in = - proto.available_external_power_source(i); - api::system_power_source::PowerSourceInfo power_source_out; - - power_source_out.type = - power_source_in.has_type() - ? PowerSourceTypeFromProtoValue(power_source_in.type()) - : api::system_power_source::POWER_SOURCE_TYPE_UNKNOWN; - - if (power_source_in.has_max_power()) { - // Round to two significant digits for privacy reasons, to reduce the risk - // of finger-printing. - power_source_out.max_power = - RoundDownToTwoSignificantDigits(power_source_in.max_power()); - } - - power_source_out.active = - external_power_source_id.has_value() && - external_power_source_id.value() == power_source_in.id(); - - power_sources.push_back(std::move(power_source_out)); - } - - return power_sources; -} - -} // namespace - -// static -BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>* -SystemPowerSourceAPI::GetFactoryInstance() { - static base::NoDestructor<BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>> - instance; - return instance.get(); -} - -SystemPowerSourceAPI::SystemPowerSourceAPI(content::BrowserContext* context) - : browser_context_(context), power_manager_observer_(this) { - power_manager_observer_.Add(chromeos::PowerManagerClient::Get()); -} - -SystemPowerSourceAPI::~SystemPowerSourceAPI() = default; - -void SystemPowerSourceAPI::PowerChanged( - const power_manager::PowerSupplyProperties& proto) { - EventRouter* event_router = EventRouter::Get(browser_context_); - if (!event_router) - return; - - std::unique_ptr<base::ListValue> args = - api::system_power_source::OnPowerChanged::Create( - PowerSourceInfoVectorFromProtoValue(proto)); - - auto event = std::make_unique<Event>( - events::SYSTEM_POWER_SOURCE_ONPOWERCHANGED, - api::system_power_source::OnPowerChanged::kEventName, std::move(args)); - event_router->BroadcastEvent(std::move(event)); -} - -SystemPowerSourceGetPowerSourceInfoFunction:: - SystemPowerSourceGetPowerSourceInfoFunction() = default; - -SystemPowerSourceGetPowerSourceInfoFunction:: - ~SystemPowerSourceGetPowerSourceInfoFunction() = default; - -ExtensionFunction::ResponseAction -SystemPowerSourceGetPowerSourceInfoFunction::Run() { - const base::Optional<power_manager::PowerSupplyProperties>& - power_supply_properties = - chromeos::PowerManagerClient::Get()->GetLastStatus(); - - if (!power_supply_properties.has_value()) - return RespondNow(NoArguments()); - - return RespondNow(ArgumentList( - api::system_power_source::GetPowerSourceInfo::Results::Create( - PowerSourceInfoVectorFromProtoValue(*power_supply_properties)))); -} - -SystemPowerSourceRequestStatusUpdateFunction:: - SystemPowerSourceRequestStatusUpdateFunction() = default; - -SystemPowerSourceRequestStatusUpdateFunction:: - ~SystemPowerSourceRequestStatusUpdateFunction() = default; - -ExtensionFunction::ResponseAction -SystemPowerSourceRequestStatusUpdateFunction::Run() { - chromeos::PowerManagerClient::Get()->RequestStatusUpdate(); - return RespondNow(NoArguments()); -} - -} // namespace extensions
diff --git a/extensions/browser/api/system_power_source/system_power_source_api.h b/extensions/browser/api/system_power_source/system_power_source_api.h deleted file mode 100644 index 0ea3474..0000000 --- a/extensions/browser/api/system_power_source/system_power_source_api.h +++ /dev/null
@@ -1,78 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef EXTENSIONS_BROWSER_API_SYSTEM_POWER_SOURCE_SYSTEM_POWER_SOURCE_API_H_ -#define EXTENSIONS_BROWSER_API_SYSTEM_POWER_SOURCE_SYSTEM_POWER_SOURCE_API_H_ - -#include "base/scoped_observer.h" -#include "chromeos/dbus/power/power_manager_client.h" -#include "extensions/browser/browser_context_keyed_api_factory.h" -#include "extensions/browser/extension_function.h" -#include "extensions/browser/extension_function_histogram_value.h" - -namespace extensions { - -class SystemPowerSourceAPI : public BrowserContextKeyedAPI, - public chromeos::PowerManagerClient::Observer { - public: - explicit SystemPowerSourceAPI(content::BrowserContext* context); - ~SystemPowerSourceAPI() override; - - // BrowserContextKeyedAPI implementation. - static BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>* - GetFactoryInstance(); - - private: - friend class BrowserContextKeyedAPIFactory<SystemPowerSourceAPI>; - - // BrowserContextKeyedAPI implementation. - static const char* service_name() { return "SystemPowerSourceAPI"; } - static const bool kServiceIsNULLWhileTesting = true; - - // Overridden from PowerManagerClient::Observer. - void PowerChanged(const power_manager::PowerSupplyProperties& proto) override; - - content::BrowserContext* const browser_context_; - ScopedObserver<chromeos::PowerManagerClient, - chromeos::PowerManagerClient::Observer> - power_manager_observer_; - - DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceAPI); -}; - -class SystemPowerSourceGetPowerSourceInfoFunction : public ExtensionFunction { - public: - SystemPowerSourceGetPowerSourceInfoFunction(); - - DECLARE_EXTENSION_FUNCTION("system.powerSource.getPowerSourceInfo", - SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO) - - protected: - ~SystemPowerSourceGetPowerSourceInfoFunction() override; - - ResponseAction Run() override; - - private: - DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceGetPowerSourceInfoFunction); -}; - -class SystemPowerSourceRequestStatusUpdateFunction : public ExtensionFunction { - public: - SystemPowerSourceRequestStatusUpdateFunction(); - - DECLARE_EXTENSION_FUNCTION("system.powerSource.requestStatusUpdate", - SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE) - - protected: - ~SystemPowerSourceRequestStatusUpdateFunction() override; - - ResponseAction Run() override; - - private: - DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceRequestStatusUpdateFunction); -}; - -} // namespace extensions - -#endif // EXTENSIONS_BROWSER_API_SYSTEM_POWER_SOURCE_SYSTEM_POWER_SOURCE_API_H_
diff --git a/extensions/browser/api/system_power_source/system_power_source_api_unittest.cc b/extensions/browser/api/system_power_source/system_power_source_api_unittest.cc deleted file mode 100644 index c7605ed..0000000 --- a/extensions/browser/api/system_power_source/system_power_source_api_unittest.cc +++ /dev/null
@@ -1,397 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <limits> - -#include "base/bind.h" -#include "chromeos/dbus/power/fake_power_manager_client.h" -#include "extensions/browser/api/system_power_source/system_power_source_api.h" -#include "extensions/browser/api_test_utils.h" -#include "extensions/browser/api_unittest.h" -#include "extensions/browser/event_router.h" -#include "extensions/browser/event_router_factory.h" -#include "extensions/common/api/system_power_source.h" -#include "extensions/common/extension_builder.h" - -using extensions::api::system_power_source::PowerSourceInfo; -using extensions::api_test_utils::RunFunctionAndReturnSingleResult; -namespace power_source_api = extensions::api::system_power_source; - -namespace extensions { - -namespace { - -class SystemPowerSourceApiUnitTest : public ApiUnitTest { - public: - SystemPowerSourceApiUnitTest() = default; - ~SystemPowerSourceApiUnitTest() override = default; - - void SetUp() override { - ApiUnitTest::SetUp(); - chromeos::PowerManagerClient::InitializeFake(); - } - - void TearDown() override { - chromeos::PowerManagerClient::Shutdown(); - ApiUnitTest::TearDown(); - } - - std::unique_ptr<base::Value> RunGetPowerSourceInfoFunction() { - scoped_refptr<SystemPowerSourceGetPowerSourceInfoFunction> - get_power_source_info_function( - new SystemPowerSourceGetPowerSourceInfoFunction()); - - get_power_source_info_function->set_extension(extension()); - get_power_source_info_function->set_has_callback(true); - - return RunFunctionAndReturnSingleResult( - get_power_source_info_function.get(), "[]", browser_context()); - } - - std::unique_ptr<base::Value> RunRequestStatusUpdateFunction() { - scoped_refptr<SystemPowerSourceRequestStatusUpdateFunction> - request_status_update_function( - new SystemPowerSourceRequestStatusUpdateFunction()); - - request_status_update_function->set_extension(extension()); - - return RunFunctionAndReturnSingleResult( - request_status_update_function.get(), "[]", browser_context()); - } - - chromeos::FakePowerManagerClient* power_manager_client() { - return chromeos::FakePowerManagerClient::Get(); - } - - private: - DISALLOW_COPY_AND_ASSIGN(SystemPowerSourceApiUnitTest); -}; - -class TestEventRouter : public EventRouter { - public: - explicit TestEventRouter(content::BrowserContext* context) - : EventRouter(context, nullptr) {} - ~TestEventRouter() override = default; - - void BroadcastEvent(std::unique_ptr<Event> event) override { - if (event->event_name != - api::system_power_source::OnPowerChanged::kEventName) { - return; - } - ASSERT_TRUE(event->event_args); - ASSERT_EQ(1u, event->event_args->GetList().size()); - power_source_info_.emplace_back(event->event_args->GetList()[0].Clone()); - } - - const std::vector<base::Value>& power_source_info() const { - return power_source_info_; - } - - void clear_power_source_info() { power_source_info_.clear(); } - - private: - std::vector<base::Value> power_source_info_; - - DISALLOW_COPY_AND_ASSIGN(TestEventRouter); -}; - -std::unique_ptr<KeyedService> TestEventRouterFactoryFunction( - content::BrowserContext* context) { - return std::make_unique<TestEventRouter>(context); -} - -power_manager::PowerSupplyProperties MakePowerSupplyProperties( - const base::Optional<std::string>& external_power_source_id, - const std::vector<power_manager::PowerSupplyProperties_PowerSource>& - power_sources) { - power_manager::PowerSupplyProperties props; - if (external_power_source_id) - props.set_external_power_source_id(*external_power_source_id); - - for (const auto& power_source : power_sources) - *props.add_available_external_power_source() = power_source; - - return props; -} - -power_manager::PowerSupplyProperties_PowerSource MakePowerSource( - const std::string& id, - power_manager::PowerSupplyProperties_PowerSource_Type type, - double max_power) { - power_manager::PowerSupplyProperties_PowerSource power_source; - power_source.set_id(id); - power_source.set_type(type); - power_source.set_max_power(max_power); - return power_source; -} - -} // namespace - -// Barrel jack connected -TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceAc) { - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "AC", - {MakePowerSource( - "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS, - 0)})); - - std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction(); - ASSERT_TRUE(result); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "mains") - .Set("active", true) - .Build()) - .Build(); - - EXPECT_EQ(*expected_result, *result); -} - -// USB-C PD charger connected -TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceUsb) { - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "CROS_USB_PD_CHARGER0", - {{MakePowerSource( - "CROS_USB_PD_CHARGER0", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 60)}})); - - std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction(); - ASSERT_TRUE(result); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 60.0) - .Set("active", true) - .Build()) - .Build(); - - EXPECT_EQ(*expected_result, *result); -} - -// Barrel Jack + USB-C PD charger connected; Barrel Jack active -TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceAcActiveAndUsbInactive) { - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "AC", - {{MakePowerSource( - "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS, - 0), - MakePowerSource( - "CROS_USB_PD_CHARGER0", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, - 60)}})); - - std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction(); - ASSERT_TRUE(result); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "mains") - .Set("active", true) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 60.0) - .Set("active", false) - .Build()) - .Build(); - - EXPECT_EQ(*expected_result, *result); -} - -// Barrel Jack + USB-C PD charger connected; USB-C charger active -TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceAcInactiveAndUsbActive) { - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "CROS_USB_PD_CHARGER0", - {{MakePowerSource( - "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS, - 0), - MakePowerSource( - "CROS_USB_PD_CHARGER0", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, - 60)}})); - - std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction(); - ASSERT_TRUE(result); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "mains") - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 60.0) - .Set("active", true) - .Build()) - .Build(); - - EXPECT_EQ(*expected_result, *result); -} - -// Barrel Jack + USB-C PD charger connected; neither active -TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceNoneActive) { - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - base::nullopt, - {{MakePowerSource( - "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS, - 0), - MakePowerSource( - "CROS_USB_PD_CHARGER0", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, - 60)}})); - - std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction(); - ASSERT_TRUE(result); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "mains") - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 60.0) - .Set("active", false) - .Build()) - .Build(); - - EXPECT_EQ(*expected_result, *result); -} - -// Connected USB chargers with fractional max power gets rounded down to -// two significant digits (for privacy reasons, to reduce the risk of -// finger-printing). Chargers with a max power that is not a normal value -// larger than zero are reported as not having a max power value. -TEST_F(SystemPowerSourceApiUnitTest, GetPowerSourceRounding) { - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "CROS_USB_PD_CHARGER0", - {{MakePowerSource( - "CROS_USB_PD_CHARGER0", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 111.0), - MakePowerSource( - "CROS_USB_PD_CHARGER1", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 11.1), - MakePowerSource( - "CROS_USB_PD_CHARGER2", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 1.11), - MakePowerSource( - "CROS_USB_PD_CHARGER3", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, 0.111), - MakePowerSource( - "CROS_USB_PD_CHARGER4", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, -1), - MakePowerSource( - "CROS_USB_PD_CHARGER5", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, - std::nan("")), - MakePowerSource( - "CROS_USB_PD_CHARGER6", - power_manager::PowerSupplyProperties_PowerSource_Type_USB_C, - std::numeric_limits<double>::infinity())}})); - - std::unique_ptr<base::Value> result = RunGetPowerSourceInfoFunction(); - ASSERT_TRUE(result); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 110.0) - .Set("active", true) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 11.0) - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 1.1) - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("maxPower", 0.11) - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("active", false) - .Build()) - .Append(DictionaryBuilder() - .Set("type", "usb") - .Set("active", false) - .Build()) - .Build(); - - EXPECT_EQ(*expected_result, *result); -} - -TEST_F(SystemPowerSourceApiUnitTest, OnPowerChangedEvent) { - TestEventRouter* event_router = static_cast<TestEventRouter*>( - EventRouterFactory::GetInstance()->SetTestingFactoryAndUse( - browser_context(), - base::BindRepeating(&TestEventRouterFactoryFunction))); - SystemPowerSourceAPI system_power_source_api(browser_context()); - - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "AC", - {MakePowerSource( - "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS, - 0)})); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "mains") - .Set("active", true) - .Build()) - .Build(); - - ASSERT_EQ(1U, event_router->power_source_info().size()); - EXPECT_EQ(*expected_result, event_router->power_source_info()[0]); -} - -TEST_F(SystemPowerSourceApiUnitTest, RequestStatusUpdate) { - TestEventRouter* event_router = static_cast<TestEventRouter*>( - EventRouterFactory::GetInstance()->SetTestingFactoryAndUse( - browser_context(), - base::BindRepeating(&TestEventRouterFactoryFunction))); - SystemPowerSourceAPI system_power_source_api(browser_context()); - - power_manager_client()->UpdatePowerProperties(MakePowerSupplyProperties( - "AC", - {MakePowerSource( - "AC", power_manager::PowerSupplyProperties_PowerSource_Type_MAINS, - 0)})); - - event_router->clear_power_source_info(); - - RunRequestStatusUpdateFunction(); - base::RunLoop().RunUntilIdle(); - - std::unique_ptr<base::Value> expected_result = - ListBuilder() - .Append(DictionaryBuilder() - .Set("type", "mains") - .Set("active", true) - .Build()) - .Build(); - - ASSERT_EQ(1U, event_router->power_source_info().size()); - EXPECT_EQ(*expected_result, event_router->power_source_info()[0]); -} - -} // namespace extensions
diff --git a/extensions/browser/api/system_power_source/system_power_source_apitest.cc b/extensions/browser/api/system_power_source/system_power_source_apitest.cc deleted file mode 100644 index e937a20..0000000 --- a/extensions/browser/api/system_power_source/system_power_source_apitest.cc +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <memory> -#include <utility> - -#include "base/macros.h" -#include "chromeos/dbus/power/fake_power_manager_client.h" -#include "chromeos/dbus/power_manager/power_supply_properties.pb.h" -#include "extensions/common/features/feature_session_type.h" -#include "extensions/common/mojom/feature_session_type.mojom.h" -#include "extensions/shell/test/shell_apitest.h" -#include "extensions/test/result_catcher.h" - -namespace extensions { - -namespace { - -using SystemPowerSourceApiTest = ShellApiTest; - -} // namespace - -IN_PROC_BROWSER_TEST_F(SystemPowerSourceApiTest, TestAllApiFunctions) { - std::unique_ptr<base::AutoReset<mojom::FeatureSessionType>> session_type = - ScopedCurrentFeatureSessionType(mojom::FeatureSessionType::kKiosk); - - // These values must match the assertions in - // extensions/test/data/api_test/system_power_source/api/background.js. - power_manager::PowerSupplyProperties_PowerSource power_source; - power_source.set_id("AC"); - power_source.set_type( - power_manager::PowerSupplyProperties_PowerSource_Type_MAINS); - power_source.set_max_power(0); - - power_manager::PowerSupplyProperties props; - props.set_external_power_source_id("AC"); - *props.add_available_external_power_source() = power_source; - - chromeos::FakePowerManagerClient::Get()->UpdatePowerProperties(props); - - EXPECT_TRUE(RunAppTest("api_test/system_power_source/api")); -} - -} // namespace extensions
diff --git a/extensions/browser/browser_context_keyed_service_factories.cc b/extensions/browser/browser_context_keyed_service_factories.cc index 6f0475c..1647fa88 100644 --- a/extensions/browser/browser_context_keyed_service_factories.cc +++ b/extensions/browser/browser_context_keyed_service_factories.cc
@@ -48,16 +48,11 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "extensions/browser/api/clipboard/clipboard_api.h" -#include "extensions/browser/api/system_power_source/system_power_source_api.h" #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h" #include "extensions/browser/api/vpn_provider/vpn_service_factory.h" #include "extensions/browser/api/webcam_private/webcam_private_api.h" #endif -#if BUILDFLAG(IS_CHROMEOS_ASH) -#include "extensions/browser/api/system_power_source/system_power_source_api.h" -#endif - namespace extensions { void EnsureBrowserContextKeyedServiceFactoriesBuilt() { @@ -103,9 +98,6 @@ RuntimeAPI::GetFactoryInstance(); StorageFrontend::GetFactoryInstance(); SystemInfoAPI::GetFactoryInstance(); -#if BUILDFLAG(IS_CHROMEOS_ASH) - SystemPowerSourceAPI::GetFactoryInstance(); -#endif UpdateServiceFactory::GetInstance(); UsbDeviceManager::GetFactoryInstance(); #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h index a251b066..9763a6d 100644 --- a/extensions/browser/extension_event_histogram_value.h +++ b/extensions/browser/extension_event_histogram_value.h
@@ -442,7 +442,7 @@ SAFE_BROWSING_PRIVATE_ON_SECURITY_INTERSTITIAL_PROCEEDED = 420, ACCESSIBILITY_PRIVATE_ON_SELECT_TO_SPEAK_STATE_CHANGE_REQUESTED = 421, INPUT_METHOD_PRIVATE_ON_FOCUS = 422, - SYSTEM_POWER_SOURCE_ONPOWERCHANGED = 423, + DELETED_SYSTEM_POWER_SOURCE_ONPOWERCHANGED = 423, WEB_REQUEST_ON_ACTION_IGNORED = 424, ARC_APPS_PRIVATE_ON_INSTALLED = 425, FILE_MANAGER_PRIVATE_ON_CROSTINI_CHANGED = 426,
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index c11d02b..9056ec1 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1319,8 +1319,8 @@ USERSPRIVATE_GETCURRENTUSER = 1256, WALLPAPERPRIVATE_GETSURPRISEMEIMAGE = 1257, VIRTUALKEYBOARDPRIVATE_SETOCCLUDEDBOUNDS = 1258, - SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO = 1259, - SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE = 1260, + DELETED_SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO = 1259, + DELETED_SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE = 1260, INPUTMETHODPRIVATE_GETSURROUNDINGTEXT = 1261, USERSPRIVATE_GETLOGINSTATUS = 1262, FILEMANAGERPRIVATEINTERNAL_INSTALLLINUXPACKAGE = 1263,
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 3fb6dcf..11b93cb9 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json
@@ -565,10 +565,6 @@ "dependencies": ["permission:system.network"], "contexts": ["blessed_extension"] }, - "system.powerSource": { - "dependencies": ["permission:system.powerSource"], - "contexts": ["blessed_extension"] - }, "system.storage": { "dependencies": ["permission:system.storage"], "contexts": ["blessed_extension"]
diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json index 77163f2..e513c56 100644 --- a/extensions/common/api/_permission_features.json +++ b/extensions/common/api/_permission_features.json
@@ -633,12 +633,6 @@ "whitelist": ["B44D08FD98F1523ED5837D78D0A606EA9D6206E5"] // Web Store } ], - "system.powerSource": { - "channel": "stable", - "extension_types": ["platform_app"], - "platforms": ["chromeos"], - "session_types": ["kiosk"] - }, "u2fDevices": { "channel": "stable", "extension_types": ["extension", "platform_app"],
diff --git a/extensions/common/api/schema.gni b/extensions/common/api/schema.gni index 6cbdf780..aaab96e8 100644 --- a/extensions/common/api/schema.gni +++ b/extensions/common/api/schema.gni
@@ -51,7 +51,6 @@ "system_display.idl", "system_memory.idl", "system_network.idl", - "system_power_source.idl", "system_storage.idl", "test.json", "usb.idl",
diff --git a/extensions/common/api/system_power_source.idl b/extensions/common/api/system_power_source.idl deleted file mode 100644 index 012db29..0000000 --- a/extensions/common/api/system_power_source.idl +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// The <code>chrome.system.powerSource</code> API allows Chrome Kiosk Apps to -// query the state of connected power sources. -[platforms=("chromeos")] -namespace system.powerSource { - enum PowerSourceType { - // Unspecified type. - unknown, - - // Dedicated charger. Typically single-purpose and non-USB (e.g. barrel - // jack plugs). - mains, - - // USB charger, including both low-power Type-A chargers and high-power - // Type-C chargers using USB Power Delivery. - usb - }; - - dictionary PowerSourceInfo { - // Type of power source. - PowerSourceType type; - - // Maximum power this source is capable of delivering if known. Reported in - // watts, rounded to two significant digits. - double? maxPower; - - // Whether this power source is connected to the device. - boolean active; - }; - - callback PowerSourceInfoCallback = - void(optional PowerSourceInfo[] powerSourceInfo); - - interface Functions { - // Requests information on attached power sources. - // |callback|: The callback to invoke with the results or - // undefined if the power source information is not known. - static void getPowerSourceInfo(PowerSourceInfoCallback callback); - - // Requests a power source status update. Resulting power source status - // updates are observable using $(ref:onPowerChanged). - static void requestStatusUpdate(); - }; - - interface Events { - // Event for changes in the set of connected power sources. - static void onPowerChanged(PowerSourceInfo[] powerSourceInfo); - }; -}; -
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index 08c7358..04a2e94c 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h
@@ -255,7 +255,7 @@ kCecPrivate = 211, kSafeBrowsingPrivate = 212, kFileSystemRequestDownloads = 213, - kSystemPowerSource = 214, + kDeleted_SystemPowerSource = 214, kArcAppsPrivate = 215, kEnterpriseHardwarePlatform = 216, kLoginScreenUi = 217,
diff --git a/extensions/common/permissions/extensions_api_permissions.cc b/extensions/common/permissions/extensions_api_permissions.cc index 89acd1b..c0969a0 100644 --- a/extensions/common/permissions/extensions_api_permissions.cc +++ b/extensions/common/permissions/extensions_api_permissions.cc
@@ -130,8 +130,6 @@ APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning}, {APIPermission::kSystemDisplay, "system.display", APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning}, - {APIPermission::kSystemPowerSource, "system.powerSource", - APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning}, {APIPermission::kSystemStorage, "system.storage"}, {APIPermission::kU2fDevices, "u2fDevices"}, {APIPermission::kUnlimitedStorage, "unlimitedStorage",
diff --git a/extensions/test/data/api_test/system_power_source/api/background.js b/extensions/test/data/api_test/system_power_source/api/background.js deleted file mode 100644 index 21efc07..0000000 --- a/extensions/test/data/api_test/system_power_source/api/background.js +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -chrome.test.runTests([ - function getPowerSourceInfo() { - chrome.system.powerSource.getPowerSourceInfo( - chrome.test.callbackPass(info => { - chrome.test.assertEq([{active: true, type: 'mains'}], info); - })); - }, - - function onPowerChanged() { - chrome.test.listenOnce(chrome.system.powerSource.onPowerChanged, info => { - chrome.test.assertEq([{active: true, type: 'mains'}], info); - }); - chrome.system.powerSource.requestStatusUpdate(); - }, -]);
diff --git a/extensions/test/data/api_test/system_power_source/api/manifest.json b/extensions/test/data/api_test/system_power_source/api/manifest.json deleted file mode 100644 index b6c4177..0000000 --- a/extensions/test/data/api_test/system_power_source/api/manifest.json +++ /dev/null
@@ -1,15 +0,0 @@ -{ - "name": "chrome.system.powerSource", - "manifest_version": 2, - "version": "0.1", - "description": "end-to-end browser tests for chrome.system.powerSource API", - "app": { - "background": { - "scripts": ["background.js"] - } - }, - "permissions": [ - "system.powerSource" - ], - "kiosk_enabled": true -}
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 index d94fba5..5478a29 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -36b5262321411db1fde3fef494c819dff7ee1bce \ No newline at end of file +434981e5bf7a57af9ec13c83c8c170e796f35b76 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 index 94c3dd1..5eaaaf13 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -e6219d58d76eabdcfde3a4e4a64821cbbac00d0f \ No newline at end of file +c3817b8563e0ff5507885760231c6f6eb3c39e5d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 index 1dedc26c..da5e71f 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -3c0d9708365385b6badbb13255d6cb8fab95aa3d \ No newline at end of file +81af11f1b02de2e814a74f69bfe56b8aaddeeb13 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 index 0923327b..23d363b 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -c3c4931568b06c2fe81a9f127a66aa68dadc9eef \ No newline at end of file +0198468567faf84f643b63abbd05374860f02801 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 index 4ccad41..f7ec661b 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -701a0e408c9ca8f312881e5cc1f7600498e72e50 \ No newline at end of file +e110171b278311715c8862307af140b5b3ad5e83 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 index 878622e8..2fd1b97 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -2adf62f62e95e284449fb069e432a3cb9f93d3e1 \ No newline at end of file +b8f2de566cf8dc6c35de2488fd0ec8cdf31de335 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 index 851a3da..8b16b6c 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@ -603e8ad156d67e9c8bce74c1b4626009c002912a \ No newline at end of file +da5ccce882cf15cc6a25e43fab4240ccb9128caf \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 index 3114cce..65a9b2d 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@ -bf49209ebc31fd09f8fdde046c93af91d0258acf \ No newline at end of file +30acbacaf189ed772b097c408f0ba4f3fd6d5f36 \ No newline at end of file
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 695dd49..90bc1d2 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -240,11 +240,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -254,7 +254,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -317,11 +317,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -331,7 +331,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -394,11 +394,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -408,7 +408,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -471,11 +471,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -485,7 +485,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -769,11 +769,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -783,7 +783,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -846,11 +846,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -860,7 +860,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -923,11 +923,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -937,7 +937,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1000,11 +1000,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -1014,7 +1014,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1298,11 +1298,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -1312,7 +1312,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1375,11 +1375,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -1389,7 +1389,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1452,11 +1452,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -1466,7 +1466,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1529,11 +1529,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -1543,7 +1543,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1827,11 +1827,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -1841,7 +1841,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1904,11 +1904,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Client Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -1918,7 +1918,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -1981,11 +1981,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.128", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 87.0.4280.130", "resultdb": { "enable": true }, @@ -1995,7 +1995,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M87", - "revision": "version:87.0.4280.128" + "revision": "version:87.0.4280.130" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -2058,11 +2058,11 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62" + "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" }, - "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.62", + "name": "weblayer_instrumentation_test_versions_apk_Implementation Tests For 88.0.4324.64", "resultdb": { "enable": true }, @@ -2072,7 +2072,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M88", - "revision": "version:88.0.4324.62" + "revision": "version:88.0.4324.64" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index b79d107..8105dd2 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -319,13 +319,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=88', ], - 'identifier': 'Implementation Tests For 88.0.4324.62', + 'identifier': 'Implementation Tests For 88.0.4324.64', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M88', - 'revision': 'version:88.0.4324.62', + 'revision': 'version:88.0.4324.64', } ], }, @@ -342,13 +342,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--impl-version=87', ], - 'identifier': 'Implementation Tests For 87.0.4280.128', + 'identifier': 'Implementation Tests For 87.0.4280.130', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M87', - 'revision': 'version:87.0.4280.128', + 'revision': 'version:87.0.4280.130', } ], }, @@ -388,13 +388,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--client-version=88', ], - 'identifier': 'Client Tests For 88.0.4324.62', + 'identifier': 'Client Tests For 88.0.4324.64', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M88', - 'revision': 'version:88.0.4324.62', + 'revision': 'version:88.0.4324.64', } ], }, @@ -411,13 +411,13 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--client-version=87', ], - 'identifier': 'Client Tests For 87.0.4280.128', + 'identifier': 'Client Tests For 87.0.4280.130', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M87', - 'revision': 'version:87.0.4280.128', + 'revision': 'version:87.0.4280.130', } ], },
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc index a62b433..b349614 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -24,6 +24,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h" #include "third_party/blink/renderer/platform/loader/fetch/resource.h" #include "third_party/blink/renderer/platform/loader/fetch/response_body_loader.h" +#include "third_party/blink/renderer/platform/network/mime/mime_type_registry.h" #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h" #include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" @@ -524,6 +525,16 @@ if (!CanStartStreaming()) return false; + // Skip non-JS modules based on the mime-type. + // TODO(crbug/1132413),TODO(crbug/1061857): Disable streaming for non-JS + // based the specific import statements. + if (script_resource_->GetScriptType() == mojom::blink::ScriptType::kModule && + !MIMETypeRegistry::IsSupportedJavaScriptMIMEType( + script_resource_->GetResponse().HttpContentType())) { + SuppressStreaming(NotStreamingReason::kNonJavascriptModule); + return false; + } + // Even if the first data chunk is small, the script can still be big enough - // wait until the next data chunk comes before deciding whether to start the // streaming.
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer.h b/third_party/blink/renderer/bindings/core/v8/script_streamer.h index 2275f212..714c66a 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_streamer.h +++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.h
@@ -60,6 +60,7 @@ kModuleScript, kNoDataPipe, kLoadingCancelled, + kNonJavascriptModule, kDisabledByFeatureList, // Pseudo values that should never be seen in reported metrics
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc index 1cb6706ab..1286921 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner.cc
@@ -272,58 +272,58 @@ referrer_info.ToV8HostDefinedOptions(isolate)); v8::Local<v8::String> code = V8String(isolate, params.GetSourceText()); - if (ScriptStreamer* streamer = params.GetScriptStreamer()) { + inspector_compile_script_event::V8CacheResult cache_result; + v8::MaybeLocal<v8::Module> script; + ScriptStreamer* streamer = params.GetScriptStreamer(); + if (streamer) { // Final compile call for a streamed compilation. // Streaming compilation may involve use of code cache. // TODO(leszeks): Add compile timer to streaming compilation. DCHECK(streamer->IsFinished()); DCHECK(!streamer->IsStreamingSuppressed()); - return v8::ScriptCompiler::CompileModule(isolate->GetCurrentContext(), - streamer->Source(), code, origin); - } - - v8::MaybeLocal<v8::Module> script; - inspector_compile_script_event::V8CacheResult cache_result; - - switch (compile_options) { - case v8::ScriptCompiler::kNoCompileOptions: - case v8::ScriptCompiler::kEagerCompile: { - v8::ScriptCompiler::Source source(code, origin); - script = v8::ScriptCompiler::CompileModule( - isolate, &source, compile_options, no_cache_reason); - break; - } - - case v8::ScriptCompiler::kConsumeCodeCache: { - // Compile a script, and consume a V8 cache that was generated previously. - SingleCachedMetadataHandler* cache_handler = params.CacheHandler(); - DCHECK(cache_handler); - v8::ScriptCompiler::CachedData* cached_data = - V8CodeCache::CreateCachedData(cache_handler); - v8::ScriptCompiler::Source source(code, origin, cached_data); - script = v8::ScriptCompiler::CompileModule( - isolate, &source, compile_options, no_cache_reason); - if (cached_data->rejected) { - cache_handler->ClearCachedMetadata( - CachedMetadataHandler::kClearPersistentStorage); - } else if (InDiscardExperiment()) { - // Experimentally free code cache from memory after first use. See - // http://crbug.com/1045052. - cache_handler->ClearCachedMetadata( - CachedMetadataHandler::kDiscardLocally); + script = v8::ScriptCompiler::CompileModule( + isolate->GetCurrentContext(), streamer->Source(), code, origin); + } else { + switch (compile_options) { + case v8::ScriptCompiler::kNoCompileOptions: + case v8::ScriptCompiler::kEagerCompile: { + v8::ScriptCompiler::Source source(code, origin); + script = v8::ScriptCompiler::CompileModule( + isolate, &source, compile_options, no_cache_reason); + break; } - cache_result.consume_result = base::make_optional( - inspector_compile_script_event::V8CacheResult::ConsumeResult( - compile_options, cached_data->length, cached_data->rejected)); - break; + + case v8::ScriptCompiler::kConsumeCodeCache: { + // Compile a script, and consume a V8 cache that was generated + // previously. + SingleCachedMetadataHandler* cache_handler = params.CacheHandler(); + DCHECK(cache_handler); + v8::ScriptCompiler::CachedData* cached_data = + V8CodeCache::CreateCachedData(cache_handler); + v8::ScriptCompiler::Source source(code, origin, cached_data); + script = v8::ScriptCompiler::CompileModule( + isolate, &source, compile_options, no_cache_reason); + if (cached_data->rejected) { + cache_handler->ClearCachedMetadata( + CachedMetadataHandler::kClearPersistentStorage); + } else if (InDiscardExperiment()) { + // Experimentally free code cache from memory after first use. See + // http://crbug.com/1045052. + cache_handler->ClearCachedMetadata( + CachedMetadataHandler::kDiscardLocally); + } + cache_result.consume_result = base::make_optional( + inspector_compile_script_event::V8CacheResult::ConsumeResult( + compile_options, cached_data->length, cached_data->rejected)); + break; + } } } TRACE_EVENT_END1(kTraceEventCategoryGroup, "v8.compileModule", "data", inspector_compile_script_event::Data( - file_name, start_position, cache_result, false, - ScriptStreamer::NotStreamingReason::kModuleScript)); - + file_name, start_position, cache_result, streamer, + params.NotStreamingReason())); return script; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc index d518e6c..6116c07 100644 --- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc +++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -433,6 +433,8 @@ return "no data pipe received"; case ScriptStreamer::NotStreamingReason::kDisabledByFeatureList: return "streaming disabled from the feature list"; + case ScriptStreamer::NotStreamingReason::kNonJavascriptModule: + return "not a javascript module"; case ScriptStreamer::NotStreamingReason::kLoadingCancelled: return "loading was cancelled"; case ScriptStreamer::NotStreamingReason::kDidntTryToStartStreaming:
diff --git a/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc index 90743c54..d8f71f8 100644 --- a/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc +++ b/third_party/blink/renderer/core/loader/modulescript/document_module_script_fetcher.cc
@@ -28,9 +28,13 @@ DCHECK(fetch_client_settings_object_fetcher); DCHECK(!client_); client_ = client; - // TODO(crbug.com/1061857): Enable streaming. + // Streaming can currently only be triggered from the main thread. This + // currently happens only for dynamic imports in worker modules. + ScriptResource::StreamingAllowed streaming_allowed = + IsMainThread() ? ScriptResource::kAllowStreaming + : ScriptResource::kNoStreaming; ScriptResource::Fetch(fetch_params, fetch_client_settings_object_fetcher, - this, ScriptResource::kNoStreaming); + this, streaming_allowed); } void DocumentModuleScriptFetcher::NotifyFinished(Resource* resource) {
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h b/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h index 35d4008..626eb17 100644 --- a/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h +++ b/third_party/blink/renderer/core/loader/modulescript/module_script_creation_params.h
@@ -110,6 +110,9 @@ } ScriptStreamer* GetScriptStreamer() const { return script_streamer_; } + ScriptStreamer::NotStreamingReason NotStreamingReason() const { + return not_streaming_reason_; + } private: // Creates an isolated copy.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 90319094..802479a 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -5918,12 +5918,12 @@ # Wpt importer sheriff 2020-12-23 crbug.com/626703 external/wpt/cookies/samesite/multiple-samesite-attributes.https.html?legacy-samesite [ Failure ] crbug.com/626703 virtual/legacy-samesite/external/wpt/cookies/samesite/multiple-samesite-attributes.https.html [ Failure ] -crbug.com/626703 external/wpt/html/semantics/forms/textfieldselection/select-event.html [ Failure ] +crbug.com/626703 external/wpt/html/semantics/forms/textfieldselection/select-event.html [ Failure Timeout ] # Sheriff 2020-12-14 crbug.com/1046784 http/tests/devtools/console/console-context-selector.js [ Pass Timeout ] -#Sheriff 2020-12-22 +# Sheriff 2020-12-22 crbug.com/1161244 [ Mac10.15 ] external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html [ Pass Timeout ] crbug.com/1161301 [ Mac10.15 ] external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html [ Pass Timeout ] crbug.com/1161352 [ Mac10.14 ] virtual/controls-refresh-hc/fast/forms/color-scheme/search/search-appearance-basic.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html index 1cb290d..4ca2bb70 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html
@@ -19,6 +19,20 @@ }, "A CSS Module should load"); async_test(function (test) { + // This tests potential streaming compilation of modules in + // Chromium that is triggered only for large (32>KiB) files in older + // versions. + const iframe = document.createElement("iframe"); + iframe.src = "resources/css-module-basic-large-iframe.html"; + iframe.onload = test.step_func_done(function () { + assert_equals(getComputedStyle(iframe.contentDocument.querySelector('#test')) + .backgroundColor, "rgb(255, 0, 0)", + "CSS module import should succeed"); + }); + document.body.appendChild(iframe); + }, "A large CSS Module should load"); + + async_test(function (test) { const iframe = document.createElement("iframe"); iframe.src = "resources/css-module-at-import-iframe.html"; iframe.onload = test.step_func_done(function () { @@ -41,4 +55,4 @@ document.body.appendChild(iframe); }, "Malformed CSS should not load"); </script> -</body> \ No newline at end of file +</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic-large.css b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic-large.css new file mode 100644 index 0000000..f5b0db5d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/basic-large.css
@@ -0,0 +1,7 @@ +#test { + background-color:red; +} + +#test:before { + content: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; +}
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-large-iframe.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-large-iframe.html new file mode 100644 index 0000000..cc5b660 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/resources/css-module-basic-large-iframe.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<body> + <script> + window.onerror = function (errorMsg, url, lineNumber, column, errorObj) + { + document.load_error = errorObj.name; + return true; + }; + </script> + <script type="module"> + import v from "./basic-large.css"; + document.adoptedStyleSheets = [v]; + </script> + + <div id="test"> + I am a test div. + </div> +</body>
diff --git a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt index 062587a..c007fa0 100644 --- a/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/isolated-code-cache/same-origin-module-test-expected.txt
@@ -6,7 +6,7 @@ data : { columnNumber : 1 lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "script too small" streamed : <boolean> url : .../devtools/resources/v8-cache-script.cgi } @@ -20,7 +20,7 @@ data : { columnNumber : 1 lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "already used streamed data" streamed : <boolean> url : .../devtools/resources/v8-cache-script.cgi } @@ -52,7 +52,7 @@ columnNumber : 1 consumedCacheSize : <number> lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "already used streamed data" streamed : <boolean> url : .../devtools/resources/v8-cache-script.cgi } @@ -66,7 +66,7 @@ data : { columnNumber : 1 lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "script too small" streamed : <boolean> url : .../devtools/resources/v8-cache-script.cgi } @@ -83,7 +83,7 @@ columnNumber : 1 consumedCacheSize : <number> lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "already used streamed data" streamed : <boolean> url : .../devtools/resources/v8-cache-script.cgi } @@ -100,7 +100,7 @@ columnNumber : 1 consumedCacheSize : <number> lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "script too small" streamed : <boolean> url : .../devtools/resources/v8-cache-script.cgi }
diff --git a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt index 7822c9f..559bd45 100644 --- a/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/tracing/timeline-script-module-expected.txt
@@ -5,7 +5,7 @@ data : { columnNumber : 1 lineNumber : 1 - notStreamedReason : "module script" + notStreamedReason : "already disabled streaming" streamed : <boolean> url : .../devtools/resources/inspected-page.html }
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 00e45c7..8486c65 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -24118,7 +24118,7 @@ <int value="421" label="ACCESSIBILITY_PRIVATE_ON_SELECT_TO_SPEAK_STATE_CHANGE_REQUESTED"/> <int value="422" label="INPUT_METHOD_PRIVATE_ON_FOCUS"/> - <int value="423" label="SYSTEM_POWER_SOURCE_ONPOWERCHANGED"/> + <int value="423" label="DELETED_SYSTEM_POWER_SOURCE_ONPOWERCHANGED"/> <int value="424" label="WEB_REQUEST_ON_ACTION_IGNORED"/> <int value="425" label="ARC_APPS_PRIVATE_ON_INSTALLED"/> <int value="426" label="FILE_MANAGER_PRIVATE_ON_CROSTINI_CHANGED"/> @@ -25493,8 +25493,8 @@ <int value="1256" label="USERSPRIVATE_GETCURRENTUSER"/> <int value="1257" label="WALLPAPERPRIVATE_GETSURPRISEMEIMAGE"/> <int value="1258" label="VIRTUALKEYBOARDPRIVATE_SETOCCLUDEDBOUNDS"/> - <int value="1259" label="SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO"/> - <int value="1260" label="SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE"/> + <int value="1259" label="DELETED_SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO"/> + <int value="1260" label="DELETED_SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE"/> <int value="1261" label="INPUTMETHODPRIVATE_GETSURROUNDINGTEXT"/> <int value="1262" label="USERSPRIVATE_GETLOGINSTATUS"/> <int value="1263" label="FILEMANAGERPRIVATEINTERNAL_INSTALLLINUXPACKAGE"/> @@ -26372,7 +26372,7 @@ <int value="211" label="kCecPrivate"/> <int value="212" label="kSafeBrowsingPrivate"/> <int value="213" label="kFileSystemRequestDownloads"/> - <int value="214" label="kSystemPowerSource"/> + <int value="214" label="kDeleted_SystemPowerSource"/> <int value="215" label="kArcAppsPrivate"/> <int value="216" label="kEnterpriseHardwarePlatform"/> <int value="217" label="kLoginScreenUi"/>
diff --git a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js index 3094760..9c05e4c 100644 --- a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js +++ b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api.js
@@ -80,7 +80,9 @@ } channel = new MessageChannel(); - window.postMessage(PORT_SETUP_MSG, [channel.port2], '*'); + window.postMessage( + PORT_SETUP_MSG, '*' /* target origin */, + [channel.port2] /* transfer */); channel.port1.onmessage = function(event) { if (event.data == DISCONNECT_MSG) { channel = null;
diff --git a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js index 1b92672..50c99fa 100644 --- a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js +++ b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/mathjax.js
@@ -38,7 +38,9 @@ channel_.port1.onmessage = function(evt) { cvox.MathJax.execMessage(evt.data); }; - window.postMessage('cvox.MathJaxPortSetup', '*', [channel_.port2]); + window.postMessage( + 'cvox.MathJaxPortSetup', '*' /* target origin */, + [channel_.port2] /* transfer */); };
diff --git a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js index 5b23294..b443fa13 100644 --- a/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js +++ b/ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js
@@ -73,7 +73,7 @@ cvox.PdfProcessor.process = function() { cvox.PdfProcessor.pageCount = null; cvox.PdfProcessor.pageIndex = null; - window.postMessage({'type': 'getAccessibilityJSON'}, '*'); + window.postMessage({'type': 'getAccessibilityJSON'}, '*' /* target origin */); }; /**
diff --git a/ui/accessibility/extensions/chromevoxclassic/common/interframe.js b/ui/accessibility/extensions/chromevoxclassic/common/interframe.js index 8d7b7fc..d13165e 100644 --- a/ui/accessibility/extensions/chromevoxclassic/common/interframe.js +++ b/ui/accessibility/extensions/chromevoxclassic/common/interframe.js
@@ -132,7 +132,7 @@ cvox.Interframe.sendMessageToWindow = function(message, window) { var encodedMessage = cvox.Interframe.IF_MSG_PREFIX + cvox.ChromeVoxJSON.stringify(message, null, null); - window.postMessage(encodedMessage, '*'); + window.postMessage(encodedMessage, '*' /* target origin */); }; /**