diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2023-02-13 16:03:23 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2023-05-26 11:26:35 +0000 |
commit | 813d9ae984a99e739b99cf694a9d5b24d0a6b7a7 (patch) | |
tree | 60c14d40d77a3c702c8a72887662d97c0b8f3e99 /chromium/chrome/browser/resources/extensions | |
parent | eb596ba9fe579987eb93f6b4021ca156885b48c2 (diff) |
BASELINE: Update Chromium to 110.0.5481.111
Change-Id: I2b5f5ed66fee2a6f8da61c9b17fd1b25bb5b3a4e
Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/464348
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/resources/extensions')
28 files changed, 246 insertions, 198 deletions
diff --git a/chromium/chrome/browser/resources/extensions/BUILD.gn b/chromium/chrome/browser/resources/extensions/BUILD.gn index 1c111086ae7..936a541e79d 100644 --- a/chromium/chrome/browser/resources/extensions/BUILD.gn +++ b/chromium/chrome/browser/resources/extensions/BUILD.gn @@ -102,7 +102,7 @@ build_webui("build") { optimize_webui_host = "extensions" optimize_webui_out_files = [ "extensions.rollup.js" ] optimize_webui_in_files = [ "extensions.js" ] - optimize_webui_excludes = [ "chrome://resources/js/cr.m.js" ] + optimize_webui_excludes = [ "chrome://resources/js/cr.js" ] optimize_webui_resource_paths_rewrites = [ "extensions.rollup.js|extensions.js" ] } diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts b/chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts index 338553c208b..d72c4534de1 100644 --- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts +++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts @@ -17,7 +17,7 @@ import '../shared_vars.css.js'; import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js'; import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {navigation, Page} from '../navigation_helper.js'; diff --git a/chromium/chrome/browser/resources/extensions/code_section.ts b/chromium/chrome/browser/resources/extensions/code_section.ts index c75059e8a7d..4576891a5d2 100644 --- a/chromium/chrome/browser/resources/extensions/code_section.ts +++ b/chromium/chrome/browser/resources/extensions/code_section.ts @@ -8,7 +8,7 @@ import 'chrome://resources/polymer/v3_0/paper-styles/color.js'; import './strings.m.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './code_section.html.js'; diff --git a/chromium/chrome/browser/resources/extensions/detail_view.html b/chromium/chrome/browser/resources/extensions/detail_view.html index 3f6aa133c21..2d6a27aece5 100644 --- a/chromium/chrome/browser/resources/extensions/detail_view.html +++ b/chromium/chrome/browser/resources/extensions/detail_view.html @@ -218,7 +218,8 @@ <iron-icon class="warning-icon" icon="cr:warning"></iron-icon> <span> $i18n{itemSuspiciousInstall} - <a target="_blank" href="$i18n{suspiciousInstallHelpUrl}"> + <a target="_blank" href="$i18n{suspiciousInstallHelpUrl}" + aria-label="$i18n{itemSuspiciousInstallLearnMore}"> $i18n{learnMore} </a> </span> @@ -251,7 +252,8 @@ </iron-icon> <span class="cr-secondary-text"> $i18n{itemAllowlistWarning} - <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank"> + <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank" + aria-label="$i18n{itemAllowlistWarningLearnMoreLabel}"> $i18n{learnMore} </a> </span> @@ -374,7 +376,8 @@ on-change="onShowAccessRequestsChange_"> <div id="access-toggle-and-link"> <span>$i18n{itemShowAccessRequestsInToolbar}</span> - <a class="link-icon-button" aria-label="$i18n{learnMore}" + <a class="link-icon-button" + aria-label="$i18n{itemShowAccessRequestsLearnMore}" href="$i18n{showAccessRequestsInToolbarLearnMoreLink}" target="_blank"> <iron-icon icon="cr:help-outline"></iron-icon> @@ -400,6 +403,9 @@ </div> </div> </template> + <cr-link-row class="hr" + id="siteSettings" label="$i18n{siteSettings}" + on-click="onSiteSettingsClick_" external></cr-link-row> <template is="dom-if" if="[[shouldShowOptionsSection_(data.*)]]"> <div id="options-section"> <template is="dom-if" diff --git a/chromium/chrome/browser/resources/extensions/detail_view.ts b/chromium/chrome/browser/resources/extensions/detail_view.ts index d428b42f5d2..c2acfcbc4e0 100644 --- a/chromium/chrome/browser/resources/extensions/detail_view.ts +++ b/chromium/chrome/browser/resources/extensions/detail_view.ts @@ -29,7 +29,7 @@ import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggl import {CrTooltipIconElement} from 'chrome://resources/cr_elements/policy/cr_tooltip_icon.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {afterNextRender, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './detail_view.html.js'; @@ -283,6 +283,12 @@ export class ExtensionsDetailViewElement extends this.delegate.openUrl(this.data.manifestHomePageUrl); } + private onSiteSettingsClick_() { + this.delegate.openUrl( + `chrome://settings/content/siteDetails?site=chrome-extension://${ + this.data.id}`); + } + private onViewInStoreTap_() { this.delegate.openUrl(this.data.webStoreUrl); } diff --git a/chromium/chrome/browser/resources/extensions/error_page.ts b/chromium/chrome/browser/resources/extensions/error_page.ts index b2be34765ea..ef92f6be244 100644 --- a/chromium/chrome/browser/resources/extensions/error_page.ts +++ b/chromium/chrome/browser/resources/extensions/error_page.ts @@ -18,7 +18,7 @@ import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_containe import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {FocusOutlineManager} from 'chrome://resources/js/focus_outline_manager.js'; import {focusWithoutInk} from 'chrome://resources/js/focus_without_ink.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {afterNextRender, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './error_page.html.js'; @@ -228,8 +228,15 @@ export class ExtensionsErrorPageElement extends ExtensionsErrorPageElementBase { break; case chrome.developerPrivate.ErrorType.RUNTIME: const runtimeError = error as RuntimeError; - // slice(1) because pathname starts with a /. - args.pathSuffix = new URL(runtimeError.source).pathname.slice(1); + try { + // slice(1) because pathname starts with a /. + args.pathSuffix = new URL(runtimeError.source).pathname.slice(1); + } catch (e) { + // Swallow the invalid URL error and return early. This prevents the + // uncaught error from causing a runtime error as seen in + // crbug.com/1257170. + return; + } args.lineNumber = runtimeError.stackTrace && runtimeError.stackTrace[0] ? runtimeError.stackTrace[0].lineNumber : diff --git a/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.html b/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.html index c09420b14a1..0050815fe0b 100644 --- a/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.html +++ b/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.html @@ -40,7 +40,7 @@ </style> <div id="section-heading" hidden$="[[enableEnhancedSiteControls]]"> <span>$i18n{hostPermissionsDescription}</span> - <a id="linkIconButton" aria-label="$i18n{learnMore}" + <a id="linkIconButton" aria-label="$i18n{permissionsLearnMoreLabel}" href="$i18n{hostPermissionsLearnMoreLink}" target="_blank" on-click="onLearnMoreClick_"> <iron-icon icon="cr:help-outline"></iron-icon> @@ -53,7 +53,7 @@ <span class="[[getAllHostsToggleLabelClass_(enableEnhancedSiteControls)]]"> $i18n{itemAllowOnFollowingSites} </span> - <a id="linkIconButton" aria-label="$i18n{learnMore}" + <a id="linkIconButton" aria-label="$i18n{permissionsLearnMoreLabel}" href="$i18n{hostPermissionsLearnMoreLink}" target="_blank" on-click="onLearnMoreClick_" hidden$="[[!enableEnhancedSiteControls]]"> diff --git a/chromium/chrome/browser/resources/extensions/item.html b/chromium/chrome/browser/resources/extensions/item.html index 99afc2f277d..cc6c9a15951 100644 --- a/chromium/chrome/browser/resources/extensions/item.html +++ b/chromium/chrome/browser/resources/extensions/item.html @@ -238,7 +238,8 @@ <span id="suspicious-warning" aria-describedby="a11yAssociation" hidden$="[[!data.disableReasons.suspiciousInstall]]"> $i18n{itemSuspiciousInstall} - <a target="_blank" href="$i18n{suspiciousInstallHelpUrl}"> + <a target="_blank" href="$i18n{suspiciousInstallHelpUrl}" + aria-label="$i18n{itemSuspiciousInstallLearnMore}"> $i18n{learnMore} </a> </span> @@ -259,7 +260,8 @@ </iron-icon> <span class="cr-secondary-text" aria-describedby="a11yAssociation"> $i18n{itemAllowlistWarning} - <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank"> + <a href="$i18n{enhancedSafeBrowsingWarningHelpUrl}" target="_blank" + aria-label="$i18n{itemAllowlistWarningLearnMoreLabel}"> $i18n{learnMore} </a> </span> diff --git a/chromium/chrome/browser/resources/extensions/item_mixin.ts b/chromium/chrome/browser/resources/extensions/item_mixin.ts index 15291b22258..05c1de1b277 100644 --- a/chromium/chrome/browser/resources/extensions/item_mixin.ts +++ b/chromium/chrome/browser/resources/extensions/item_mixin.ts @@ -3,7 +3,7 @@ // found in the LICENSE file. import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; type Constructor<T> = new (...args: any[]) => T; diff --git a/chromium/chrome/browser/resources/extensions/item_util.ts b/chromium/chrome/browser/resources/extensions/item_util.ts index 846bff5e7b4..be65cf5e8c2 100644 --- a/chromium/chrome/browser/resources/extensions/item_util.ts +++ b/chromium/chrome/browser/resources/extensions/item_util.ts @@ -5,7 +5,7 @@ import './strings.m.js'; import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; export enum SourceType { WEBSTORE = 'webstore', diff --git a/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.html b/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.html index 4446a9c8b9d..0aadb5f5093 100644 --- a/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.html +++ b/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.html @@ -78,12 +78,13 @@ <div class="command-entry" command="[[command]]"> <span class="command-name">[[command.description]]</span> <extensions-shortcut-input delegate="[[delegate]]" - item="[[item.id]]" shortcut="[[command.keybinding]]" - command-name="[[command.name]]"> + item="[[item]]" shortcut="[[command.keybinding]]" + command="[[command]]"> </extensions-shortcut-input> <!-- Binding "value" to triggerScopeChange_ to trigger update only after CommandScope_ becomes available. --> <select class="md-select" on-change="onScopeChanged_" + aria-label="[[computeScopeAriaLabel_(item, command)]]" disabled$="[[computeScopeDisabled_(command)]]" value="[[ triggerScopeChange_(command.scope, CommandScope_)]]"> diff --git a/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts b/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts index 34e54fc9184..7bf7d0807f6 100644 --- a/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts +++ b/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts @@ -9,6 +9,7 @@ import 'chrome://resources/polymer/v3_0/paper-styles/color.js'; import './shortcut_input.js'; import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js'; +import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {KeyboardShortcutDelegate} from './keyboard_shortcut_delegate.js'; @@ -24,7 +25,7 @@ interface RepeaterEvent<T> extends CustomEvent { } const ExtensionsKeyboardShortcutsElementBase = - CrContainerShadowMixin(PolymerElement); + I18nMixin(CrContainerShadowMixin(PolymerElement)); // The UI to display and manage keyboard shortcuts set for extension commands. export class ExtensionsKeyboardShortcutsElement extends @@ -80,6 +81,12 @@ export class ExtensionsKeyboardShortcutsElement extends return !!keybinding; } + private computeScopeAriaLabel_( + item: chrome.developerPrivate.ExtensionInfo, + command: chrome.developerPrivate.Command): string { + return this.i18n('shortcutScopeLabel', command.description, item.name); + } + /** * Determines whether to disable the dropdown menu for the command's scope. */ diff --git a/chromium/chrome/browser/resources/extensions/kiosk_browser_proxy.ts b/chromium/chrome/browser/resources/extensions/kiosk_browser_proxy.ts index 52223f6dcb3..82087da4f13 100644 --- a/chromium/chrome/browser/resources/extensions/kiosk_browser_proxy.ts +++ b/chromium/chrome/browser/resources/extensions/kiosk_browser_proxy.ts @@ -7,7 +7,7 @@ * the browser. */ -import {sendWithPromise} from 'chrome://resources/js/cr.m.js'; +import {sendWithPromise} from 'chrome://resources/js/cr.js'; export interface KioskSettings { kioskEnabled: boolean; diff --git a/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts b/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts index 0fad8aab7e1..cc016426f38 100644 --- a/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts +++ b/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts @@ -15,7 +15,7 @@ import {CrCheckboxElement} from 'chrome://resources/cr_elements/cr_checkbox/cr_c import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; -import {WebUIListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {KioskApp, KioskAppSettings, KioskBrowserProxy, KioskBrowserProxyImpl} from './kiosk_browser_proxy.js'; @@ -31,7 +31,7 @@ export interface ExtensionsKioskDialogElement { }; } -const ExtensionsKioskDialogElementBase = WebUIListenerMixin(PolymerElement); +const ExtensionsKioskDialogElementBase = WebUiListenerMixin(PolymerElement); export class ExtensionsKioskDialogElement extends ExtensionsKioskDialogElementBase { @@ -78,10 +78,10 @@ export class ExtensionsKioskDialogElement extends }) .then(this.setSettings_.bind(this)); - this.addWebUIListener( + this.addWebUiListener( 'kiosk-app-settings-changed', this.setSettings_.bind(this)); - this.addWebUIListener('kiosk-app-updated', this.updateApp_.bind(this)); - this.addWebUIListener('kiosk-app-error', this.showError_.bind(this)); + this.addWebUiListener('kiosk-app-updated', this.updateApp_.bind(this)); + this.addWebUiListener('kiosk-app-error', this.showError_.bind(this)); this.$.dialog.showModal(); } diff --git a/chromium/chrome/browser/resources/extensions/manager.ts b/chromium/chrome/browser/resources/extensions/manager.ts index 848a5b15b31..6cd9f75f6c2 100644 --- a/chromium/chrome/browser/resources/extensions/manager.ts +++ b/chromium/chrome/browser/resources/extensions/manager.ts @@ -30,7 +30,7 @@ import './kiosk_dialog.js'; import {CrViewManagerElement} from 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ActivityLogExtensionPlaceholder} from './activity_log/activity_log.js'; diff --git a/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts b/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts index 2945a8c886c..5b23af5b967 100644 --- a/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts +++ b/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts @@ -8,7 +8,7 @@ import 'chrome://resources/cr_elements/cr_shared_style.css.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './pack_dialog_alert.html.js'; diff --git a/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html b/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html index 66e4ae2c324..fa50f333f93 100644 --- a/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html +++ b/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html @@ -102,7 +102,8 @@ <span id="section-heading-text"> $i18n{hostPermissionsHeading} </span> - <a class="link-icon-button" aria-label="$i18n{learnMore}" + <a class="link-icon-button" + aria-label="$i18n{permissionsLearnMoreLabel}" href="$i18n{hostPermissionsLearnMoreLink}" target="_blank" on-click="onLearnMoreClick_"> <iron-icon icon="cr:help-outline"></iron-icon> @@ -135,7 +136,8 @@ <span id="new-section-heading-text"> $i18n{newHostPermissionsHeading} </span> - <a class="link-icon-button" aria-label="$i18n{learnMore}" + <a class="link-icon-button" + aria-label="$i18n{permissionsLearnMoreLabel}" href="$i18n{hostPermissionsLearnMoreLink}" target="_blank" on-click="onLearnMoreClick_"> <iron-icon icon="cr:help-outline"></iron-icon> diff --git a/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts b/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts index 226aabf734a..b7afefd64d2 100644 --- a/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts +++ b/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts @@ -15,7 +15,7 @@ import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_butto import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './runtime_hosts_dialog.html.js'; diff --git a/chromium/chrome/browser/resources/extensions/service.ts b/chromium/chrome/browser/resources/extensions/service.ts index 2b1ea327bff..d6329613f24 100644 --- a/chromium/chrome/browser/resources/extensions/service.ts +++ b/chromium/chrome/browser/resources/extensions/service.ts @@ -38,9 +38,7 @@ export class Service implements ServiceInterface { private eventsToIgnoreOnce_: Set<string> = new Set(); getProfileConfiguration() { - return new Promise<chrome.developerPrivate.ProfileInfo>(function(resolve) { - chrome.developerPrivate.getProfileConfiguration(resolve); - }); + return chrome.developerPrivate.getProfileConfiguration(); } getItemStateChangedTarget() { @@ -63,41 +61,20 @@ export class Service implements ServiceInterface { } getExtensionsInfo() { - return new Promise<chrome.developerPrivate.ExtensionInfo[]>(function( - resolve) { - chrome.developerPrivate.getExtensionsInfo( - {includeDisabled: true, includeTerminated: true}, resolve); - }); + return chrome.developerPrivate.getExtensionsInfo( + {includeDisabled: true, includeTerminated: true}); } getExtensionSize(id: string) { - return new Promise<string>(function(resolve) { - chrome.developerPrivate.getExtensionSize(id, resolve); - }); + return chrome.developerPrivate.getExtensionSize(id); } addRuntimeHostPermission(id: string, host: string): Promise<void> { - return new Promise((resolve, reject) => { - chrome.developerPrivate.addHostPermission(id, host, () => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError.message); - return; - } - resolve(); - }); - }); + return chrome.developerPrivate.addHostPermission(id, host); } removeRuntimeHostPermission(id: string, host: string): Promise<void> { - return new Promise((resolve, reject) => { - chrome.developerPrivate.removeHostPermission(id, host, () => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError.message); - return; - } - resolve(); - }); - }); + return chrome.developerPrivate.removeHostPermission(id, host); } recordUserAction(metricName: string): void { @@ -111,17 +88,13 @@ export class Service implements ServiceInterface { private chooseFilePath_( selectType: chrome.developerPrivate.SelectType, fileType: chrome.developerPrivate.FileType): Promise<string> { - return new Promise(function(resolve, reject) { - chrome.developerPrivate.choosePath(selectType, fileType, function(path) { - if (chrome.runtime.lastError && - chrome.runtime.lastError.message !== - 'File selection was canceled.') { - reject(chrome.runtime.lastError); - } else { - resolve(path || ''); - } - }); - }); + return chrome.developerPrivate.choosePath(selectType, fileType) + .catch(error => { + if (error.message !== 'File selection was canceled.') { + throw error; + } + return ''; + }); } updateExtensionCommandKeybinding( @@ -159,29 +132,26 @@ export class Service implements ServiceInterface { private loadUnpackedHelper_(extraOptions?: chrome.developerPrivate.LoadUnpackedOptions): Promise<boolean> { - return new Promise(function(resolve, reject) { - const options = Object.assign( - { - failQuietly: true, - populateError: true, - }, - extraOptions); - - chrome.developerPrivate.loadUnpacked(options, (loadError) => { - if (chrome.runtime.lastError && - chrome.runtime.lastError.message !== - 'File selection was canceled.') { - throw new Error(chrome.runtime.lastError.message); - } - if (loadError) { - return reject(loadError); - } - // The load was successful if there's no lastError indicated (and - // no loadError, which is checked above). - const loadSuccessful = typeof chrome.runtime.lastError === 'undefined'; - resolve(loadSuccessful); - }); - }); + const options = Object.assign( + { + failQuietly: true, + populateError: true, + }, + extraOptions); + return chrome.developerPrivate.loadUnpacked(options) + .then(loadError => { + if (loadError) { + throw loadError; + } + // The load was successful if there's no loadError. + return true; + }) + .catch(error => { + if (error.message !== 'File selection was canceled.') { + throw error; + } + return false; + }); } deleteItem(id: string) { @@ -251,18 +221,13 @@ export class Service implements ServiceInterface { } reloadItem(id: string): Promise<void> { - return new Promise(function(resolve, reject) { - chrome.developerPrivate.reload( - id, {failQuietly: true, populateErrorForUnpacked: true}, - (loadError) => { - if (loadError) { - reject(loadError); - return; - } - - resolve(); - }); - }); + return chrome.developerPrivate + .reload(id, {failQuietly: true, populateErrorForUnpacked: true}) + .then(loadError => { + if (loadError) { + throw loadError; + } + }); } repairItem(id: string): void { @@ -309,12 +274,9 @@ export class Service implements ServiceInterface { chrome.developerPrivate.FileType.PEM); } - packExtension( - rootPath: string, keyPath: string, flag?: number, - callback?: - (response: chrome.developerPrivate.PackDirectoryResponse) => void): - void { - chrome.developerPrivate.packDirectory(rootPath, keyPath, flag, callback); + packExtension(rootPath: string, keyPath: string, flag?: number): + Promise<chrome.developerPrivate.PackDirectoryResponse> { + return chrome.developerPrivate.packDirectory(rootPath, keyPath, flag); } updateAllExtensions(extensions: chrome.developerPrivate.ExtensionInfo[]) { @@ -323,11 +285,9 @@ export class Service implements ServiceInterface { * user is prompted to try updating the broken extension using loadUnpacked * and we skip reloading the remaining local extensions. */ - return new Promise<void>((resolve) => { - chrome.developerPrivate.autoUpdate(() => resolve()); - chrome.metricsPrivate.recordUserAction('Options_UpdateExtensions'); - }) - .then(() => { + return chrome.developerPrivate.autoUpdate().then( + () => { + chrome.metricsPrivate.recordUserAction('Options_UpdateExtensions'); return new Promise<void>((resolve, reject) => { const loadLocalExtensions = async () => { for (const extension of extensions) { @@ -359,9 +319,7 @@ export class Service implements ServiceInterface { requestFileSource(args: chrome.developerPrivate.RequestFileSourceProperties): Promise<chrome.developerPrivate.RequestFileSourceResponse> { - return new Promise(function(resolve) { - chrome.developerPrivate.requestFileSource(args, resolve); - }); + return chrome.developerPrivate.requestFileSource(args); } showInFolder(id: string) { @@ -370,14 +328,12 @@ export class Service implements ServiceInterface { getExtensionActivityLog(extensionId: string): Promise<chrome.activityLogPrivate.ActivityResultSet> { - return new Promise(function(resolve) { - chrome.activityLogPrivate.getExtensionActivities( - { - activityType: chrome.activityLogPrivate.ExtensionActivityFilter.ANY, - extensionId: extensionId, - }, - resolve); - }); + return chrome.activityLogPrivate.getExtensionActivities( + { + activityType: chrome.activityLogPrivate.ExtensionActivityFilter.ANY, + extensionId: extensionId, + }, + ); } getFilteredExtensionActivityLog(extensionId: string, searchTerm: string) { @@ -407,10 +363,8 @@ export class Service implements ServiceInterface { const promises: Array<Promise<chrome.activityLogPrivate.ActivityResultSet>> = activityLogFilters.map( - filter => new Promise(function(resolve) { - chrome.activityLogPrivate.getExtensionActivities( - filter, resolve); - })); + filter => + chrome.activityLogPrivate.getExtensionActivities(filter)); return Promise.all(promises).then(results => { // We may have results that are present in one or more searches, so @@ -428,16 +382,11 @@ export class Service implements ServiceInterface { } deleteActivitiesById(activityIds: string[]): Promise<void> { - return new Promise(function(resolve) { - chrome.activityLogPrivate.deleteActivities(activityIds, resolve); - }); + return chrome.activityLogPrivate.deleteActivities(activityIds); } deleteActivitiesFromExtension(extensionId: string): Promise<void> { - return new Promise(function(resolve) { - chrome.activityLogPrivate.deleteActivitiesByExtension( - extensionId, resolve); - }); + return chrome.activityLogPrivate.deleteActivitiesByExtension(extensionId); } getOnExtensionActivity(): ChromeEvent< @@ -471,33 +420,24 @@ export class Service implements ServiceInterface { } getUserSiteSettings(): Promise<chrome.developerPrivate.UserSiteSettings> { - return new Promise(function(resolve) { - chrome.developerPrivate.getUserSiteSettings(resolve); - }); + return chrome.developerPrivate.getUserSiteSettings(); } addUserSpecifiedSites( siteSet: chrome.developerPrivate.SiteSet, hosts: string[]): Promise<void> { - return new Promise(function(resolve) { - chrome.developerPrivate.addUserSpecifiedSites({siteSet, hosts}, resolve); - }); + return chrome.developerPrivate.addUserSpecifiedSites({siteSet, hosts}); } removeUserSpecifiedSites( siteSet: chrome.developerPrivate.SiteSet, hosts: string[]): Promise<void> { - return new Promise(function(resolve) { - chrome.developerPrivate.removeUserSpecifiedSites( - {siteSet, hosts}, resolve); - }); + return chrome.developerPrivate.removeUserSpecifiedSites({siteSet, hosts}); } getUserAndExtensionSitesByEtld(): Promise<chrome.developerPrivate.SiteGroup[]> { - return new Promise(function(resolve) { - chrome.developerPrivate.getUserAndExtensionSitesByEtld(resolve); - }); + return chrome.developerPrivate.getUserAndExtensionSitesByEtld(); } getMatchingExtensionsForSite(site: string): @@ -516,6 +456,13 @@ export class Service implements ServiceInterface { }); } + updateSiteAccess( + site: string, + updates: chrome.developerPrivate.ExtensionSiteAccessUpdate[]): + Promise<void> { + return chrome.developerPrivate.updateSiteAccess(site, updates); + } + static getInstance(): ServiceInterface { return instance || (instance = new Service()); } diff --git a/chromium/chrome/browser/resources/extensions/shortcut_input.html b/chromium/chrome/browser/resources/extensions/shortcut_input.html index d4363f5c782..2ce2ad12ff1 100644 --- a/chromium/chrome/browser/resources/extensions/shortcut_input.html +++ b/chromium/chrome/browser/resources/extensions/shortcut_input.html @@ -22,6 +22,7 @@ </style> <div id="main"> <cr-input id="input" readonly="[[readonly_]]" + aria-label="[[computeInputAriaLabel_(item, command)]]" placeholder="[[computePlaceholder_(readonly_)]]" invalid="[[getIsInvalid_(error_)]]" error-message="[[getErrorString_(error_, @@ -29,7 +30,8 @@ '$i18nPolymer{shortcutTooManyModifiers}', '$i18nPolymer{shortcutNeedCharacter}')]]" value="[[computeText_(shortcut)]]"> - <cr-icon-button id="edit" aria-label="$i18nPolymer{editShortcut}" + <cr-icon-button id="edit" + aria-label="[[computeEditButtonAriaLabel_(item, command)]]" slot="suffix" class="icon-edit no-overlap" on-click="onEditClick_"></cr-icon-button> </cr-input> diff --git a/chromium/chrome/browser/resources/extensions/shortcut_input.ts b/chromium/chrome/browser/resources/extensions/shortcut_input.ts index b0d169e238a..28aa6bc54a9 100644 --- a/chromium/chrome/browser/resources/extensions/shortcut_input.ts +++ b/chromium/chrome/browser/resources/extensions/shortcut_input.ts @@ -49,16 +49,8 @@ export class ExtensionsShortcutInputElement extends static get properties() { return { delegate: Object, - - item: { - type: String, - value: '', - }, - - commandName: { - type: String, - value: '', - }, + item: Object, + command: Object, shortcut: { type: String, @@ -75,7 +67,6 @@ export class ExtensionsShortcutInputElement extends value: ShortcutError.NO_ERROR, }, - readonly_: { type: Boolean, value: true, @@ -90,8 +81,8 @@ export class ExtensionsShortcutInputElement extends } delegate: KeyboardShortcutDelegate; - item: string; - commandName: string; + item: chrome.developerPrivate.ExtensionInfo; + command: chrome.developerPrivate.Command; shortcut: string; private capturing_: boolean; private error_: ShortcutError; @@ -249,7 +240,17 @@ export class ExtensionsShortcutInputElement extends private commitPending_() { this.shortcut = this.pendingShortcut_; this.delegate.updateExtensionCommandKeybinding( - this.item, this.commandName, this.shortcut); + this.item.id, this.command.name, this.shortcut); + } + + private computeInputAriaLabel_(): string { + return this.i18n( + 'editShortcutInputLabel', this.command.description, this.item.name); + } + + private computeEditButtonAriaLabel_(): string { + return this.i18n( + 'editShortcutButtonLabel', this.command.description, this.item.name); } private computePlaceholder_(): string { diff --git a/chromium/chrome/browser/resources/extensions/shortcut_util.ts b/chromium/chrome/browser/resources/extensions/shortcut_util.ts index 30a07081803..5a392fd7eb7 100644 --- a/chromium/chrome/browser/resources/extensions/shortcut_util.ts +++ b/chromium/chrome/browser/resources/extensions/shortcut_util.ts @@ -3,7 +3,7 @@ // found in the LICENSE file. import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; -import {isChromeOS, isMac} from 'chrome://resources/js/cr.m.js'; +import {isChromeOS, isMac} from 'chrome://resources/js/platform.js'; export enum Key { diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html b/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html index 4abbbb093a2..49e92f0c1f8 100644 --- a/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html +++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html @@ -75,10 +75,9 @@ <div class="extension-row"> <img class="extension-icon" src="[[item.iconUrl]]" alt=""> <span class="extension-name">[[item.name]]</span> - <!-- TODO(crbug.com/1253673): Enable these after implementing an API - method to edit site access for multiple extensions. --> <select class="extension-host-access md-select" - value="[[item.siteAccess]]" disabled> + on-change="onHostAccessChange_" + value="[[getExtensionHostAccess_(item.id, item.siteAccess)]]"> <option value="[[hostAccessEnum_.ON_CLICK]]"> $i18n{sitePermissionsOnClick} </option> diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts b/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts index 4975b8c1b7e..410a10cd2c1 100644 --- a/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts +++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts @@ -14,7 +14,7 @@ import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_butto import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; -import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './site_permissions_edit_permissions_dialog.html.js'; import {SiteSettingsDelegate} from './site_settings_mixin.js'; @@ -125,8 +125,23 @@ export class SitePermissionsEditPermissionsDialogElement extends Map<string, chrome.developerPrivate.ExtensionInfo>; private extensionSiteAccessData_: ExtensionSiteAccessInfo[]; + // Tracks any unsaved changes to HostAccess for each extension made by + // changing the value in the ".extension-host-access" <select> element. Any + // values in here should be different than the HostAccess for the extension + // inside `extensionSiteAccessData_`. + private unsavedExtensionsIdToHostAccess_: + Map<string, chrome.developerPrivate.HostAccess>; + + constructor() { + super(); + this.unsavedExtensionsIdToHostAccess_ = new Map(); + } + override ready() { super.ready(); + + // Setting this to an initial value will trigger a call to + // `updateExtensionSiteAccessData_`. this.siteSet_ = this.originalSiteSet; // If `this.site` matches subdomains, then it should not be a user specified @@ -134,8 +149,6 @@ export class SitePermissionsEditPermissionsDialogElement extends assert( !this.matchesSubdomains_() || this.originalSiteSet === EXTENSION_SPECIFIED); - - this.updateExtensionSiteAccessData_(this.siteSet_); } private onExtensionsUpdated_(extensions: @@ -171,16 +184,32 @@ export class SitePermissionsEditPermissionsDialogElement extends } const siteToCheck = - this.isSiteHostOnly_() ? `*://${this.site}/` : this.site; + this.isSiteHostOnly_() ? `*://${this.site}/` : `${this.site}/`; + const matchingExtensionsInfo = await this.delegate.getMatchingExtensionsForSite(siteToCheck); + const extensionSiteAccessData: ExtensionSiteAccessInfo[] = []; matchingExtensionsInfo.forEach(({id, siteAccess}) => { assert(this.extensionsIdToInfo_.has(id)); const {name, iconUrl} = this.extensionsIdToInfo_.get(id)!; extensionSiteAccessData.push({id, name, iconUrl, siteAccess}); + + // Remove the unsaved HostAccess from `unsavedExtensionsIdToHostAccess_` + // if it is now the same as `siteAccess`. + if (this.unsavedExtensionsIdToHostAccess_.get(id) === siteAccess) { + this.unsavedExtensionsIdToHostAccess_.delete(id); + } }); + // Remove any HostAccess from `unsavedExtensionsIdToHostAccess_` for + // extensions that are no longer in `extensionSiteAccessData`. + for (const extensionId of this.unsavedExtensionsIdToHostAccess_.keys()) { + if (!this.extensionsIdToInfo_.has(extensionId)) { + this.unsavedExtensionsIdToHostAccess_.delete(extensionId); + } + } + this.extensionSiteAccessData_ = extensionSiteAccessData; } @@ -188,30 +217,38 @@ export class SitePermissionsEditPermissionsDialogElement extends this.$.dialog.cancel(); } - private onSubmitClick_() { - if (this.siteSet_ === this.originalSiteSet) { - this.$.dialog.close(); - return; + private async onSubmitClick_() { + if (this.siteSet_ !== this.originalSiteSet) { + // If `this.site` has a scheme (and can be considered a full url), use it + // as is. Otherwise if `this.site` is just a host, append the http and + // https schemes to it. + const sitesToChange = this.isSiteHostOnly_() ? + [`http://${this.site}`, `https://${this.site}`] : + [this.site]; + if (this.siteSet_ === EXTENSION_SPECIFIED) { + await this.delegate.removeUserSpecifiedSites( + this.originalSiteSet, sitesToChange); + } else { + await this.delegate.addUserSpecifiedSites(this.siteSet_, sitesToChange); + } } - // If `this.site` has a scheme (and can be considered a full url), use it - // as is. Otherwise if `this.site` is just a host, append the http and https - // schemes to it. - const sitesToChange = this.isSiteHostOnly_() ? - [`http://${this.site}`, `https://${this.site}`] : - [this.site]; - if (this.siteSet_ === EXTENSION_SPECIFIED) { - this.delegate - .removeUserSpecifiedSites(this.originalSiteSet, sitesToChange) - .then(() => { - this.$.dialog.close(); - }); - } else { - this.delegate.addUserSpecifiedSites(this.siteSet_, sitesToChange) - .then(() => { - this.$.dialog.close(); - }); + if (this.siteSet_ === EXTENSION_SPECIFIED && + this.unsavedExtensionsIdToHostAccess_.size) { + const updates: chrome.developerPrivate.ExtensionSiteAccessUpdate[] = []; + this.unsavedExtensionsIdToHostAccess_.forEach((val, key) => { + updates.push({id: key, siteAccess: val}); + }); + + // For changing extensions' site access, first. the wildcard path "/*" is + // added to the end. Then, if the site does not specify a scheme, use the + // wildcard scheme. + const siteToUpdate = + this.isSiteHostOnly_() ? `*://${this.site}/` : `${this.site}/`; + await this.delegate.updateSiteAccess(siteToUpdate, updates); } + + this.$.dialog.close(); } private computeDialogTitle_(): string { @@ -242,6 +279,33 @@ export class SitePermissionsEditPermissionsDialogElement extends return this.matchesSubdomains_() ? 'site-access-list' : 'indented-site-access-list'; } + + // Returns the value to be displayed for the <select> element for the + // extension's host access. This shows the unsaved HostAccess value that was + // changed by the user. Otherwise, show the preexisting HostAccess value. + private getExtensionHostAccess_( + extensionId: string, + originalSiteAccess: chrome.developerPrivate.HostAccess): + chrome.developerPrivate.HostAccess { + return this.unsavedExtensionsIdToHostAccess_.get(extensionId) || + originalSiteAccess; + } + + private onHostAccessChange_(e: DomRepeatEvent<ExtensionSiteAccessInfo>) { + const selectMenu = this.shadowRoot!.querySelectorAll<HTMLSelectElement>( + '.extension-host-access')![e.model.index]; + assert(selectMenu); + + const originalSiteAccess = e.model.item.siteAccess; + const newSiteAccess = + selectMenu.value as chrome.developerPrivate.HostAccess; + + if (originalSiteAccess === newSiteAccess) { + this.unsavedExtensionsIdToHostAccess_.delete(e.model.item.id); + } else { + this.unsavedExtensionsIdToHostAccess_.set(e.model.item.id, newSiteAccess); + } + } } declare global { diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts b/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts index 7f2aeb8be6e..e02992fbd7e 100644 --- a/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts +++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts @@ -11,7 +11,7 @@ import './strings.m.js'; import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js'; import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './site_permissions_edit_url_dialog.html.js'; diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_site_group.ts b/chromium/chrome/browser/resources/extensions/site_permissions_site_group.ts index 8b2ab8dc0b4..514518e12a5 100644 --- a/chromium/chrome/browser/resources/extensions/site_permissions_site_group.ts +++ b/chromium/chrome/browser/resources/extensions/site_permissions_site_group.ts @@ -12,7 +12,7 @@ import './shared_vars.css.js'; import './site_permissions_edit_permissions_dialog.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './site_permissions_site_group.html.js'; diff --git a/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts b/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts index 31599420ca6..8f1a08bd8dc 100644 --- a/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts +++ b/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts @@ -25,6 +25,10 @@ export interface SiteSettingsDelegate { Promise<chrome.developerPrivate.SiteGroup[]>; getMatchingExtensionsForSite(site: string): Promise<chrome.developerPrivate.MatchingExtensionInfo[]>; + updateSiteAccess( + site: string, + updates: chrome.developerPrivate.ExtensionSiteAccessUpdate[]): + Promise<void>; getUserSiteSettingsChangedTarget(): ChromeEvent<(settings: chrome.developerPrivate.UserSiteSettings) => void>; } diff --git a/chromium/chrome/browser/resources/extensions/toolbar.ts b/chromium/chrome/browser/resources/extensions/toolbar.ts index 01d8a81fe9c..69bbef643fd 100644 --- a/chromium/chrome/browser/resources/extensions/toolbar.ts +++ b/chromium/chrome/browser/resources/extensions/toolbar.ts @@ -14,7 +14,7 @@ import './pack_dialog.js'; import {getToastManager} from 'chrome://resources/cr_elements/cr_toast/cr_toast_manager.js'; import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js'; import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; -import {listenOnce} from 'chrome://resources/js/util.js'; +import {listenOnce} from 'chrome://resources/js/util_ts.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './toolbar.html.js'; |