summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/resources/extensions
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-05-17 17:24:03 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-06-22 07:51:41 +0000
commit774f54339e5db91f785733232d3950366db65d07 (patch)
tree068e1b47bd1af94d77094ed12b604a6b83d9c22a /chromium/chrome/browser/resources/extensions
parentf7eaed5286974984ba5f9e3189d8f49d03e99f81 (diff)
BASELINE: Update Chromium to 102.0.5005.57
Change-Id: I885f714bb40ee724c28f94ca6bd8dbdb39915158 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/chrome/browser/resources/extensions')
-rw-r--r--chromium/chrome/browser/resources/extensions/.eslintrc.js11
-rw-r--r--chromium/chrome/browser/resources/extensions/BUILD.gn20
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts9
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.ts16
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.ts9
-rw-r--r--chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream_item.ts7
-rw-r--r--chromium/chrome/browser/resources/extensions/code_section.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/detail_view.ts9
-rw-r--r--chromium/chrome/browser/resources/extensions/drop_overlay.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/error_page.ts20
-rw-r--r--chromium/chrome/browser/resources/extensions/extensions.gni30
-rw-r--r--chromium/chrome/browser/resources/extensions/extensions.html9
-rw-r--r--chromium/chrome/browser/resources/extensions/extensions.ts9
-rw-r--r--chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/install_warnings_dialog.ts7
-rw-r--r--chromium/chrome/browser/resources/extensions/item.ts10
-rw-r--r--chromium/chrome/browser/resources/extensions/item_list.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/item_mixin.ts4
-rw-r--r--chromium/chrome/browser/resources/extensions/item_util.ts17
-rw-r--r--chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts7
-rw-r--r--chromium/chrome/browser/resources/extensions/kiosk_dialog.ts11
-rw-r--r--chromium/chrome/browser/resources/extensions/load_error.ts7
-rw-r--r--chromium/chrome/browser/resources/extensions/manager.html7
-rw-r--r--chromium/chrome/browser/resources/extensions/manager.ts45
-rw-r--r--chromium/chrome/browser/resources/extensions/navigation_helper.ts2
-rw-r--r--chromium/chrome/browser/resources/extensions/options_dialog.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/pack_dialog.ts7
-rw-r--r--chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts12
-rw-r--r--chromium/chrome/browser/resources/extensions/runtime_host_permissions.html1
-rw-r--r--chromium/chrome/browser/resources/extensions/runtime_host_permissions.ts16
-rw-r--r--chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.html20
-rw-r--r--chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts110
-rw-r--r--chromium/chrome/browser/resources/extensions/service.ts28
-rw-r--r--chromium/chrome/browser/resources/extensions/shortcut_input.ts9
-rw-r--r--chromium/chrome/browser/resources/extensions/shortcut_util.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/sidebar.ts9
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions.html4
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions.ts54
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_by_site.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html28
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts115
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.html (renamed from chromium/chrome/browser/resources/extensions/site_permissions_add_site_dialog.html)4
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts (renamed from chromium/chrome/browser/resources/extensions/site_permissions_add_site_dialog.ts)91
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_list.html31
-rw-r--r--chromium/chrome/browser/resources/extensions/site_permissions_list.ts90
-rw-r--r--chromium/chrome/browser/resources/extensions/site_settings_mixin.ts82
-rw-r--r--chromium/chrome/browser/resources/extensions/toggle_row.ts5
-rw-r--r--chromium/chrome/browser/resources/extensions/toolbar.html2
-rw-r--r--chromium/chrome/browser/resources/extensions/toolbar.ts16
50 files changed, 752 insertions, 288 deletions
diff --git a/chromium/chrome/browser/resources/extensions/.eslintrc.js b/chromium/chrome/browser/resources/extensions/.eslintrc.js
deleted file mode 100644
index 0b691a4dcc5..00000000000
--- a/chromium/chrome/browser/resources/extensions/.eslintrc.js
+++ /dev/null
@@ -1,11 +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.
-
-module.exports = {
- 'env': {
- 'browser': true,
- 'es6': true,
- },
- 'rules': {'eqeqeq': ['error', 'always', {'null': 'ignore'}]},
-};
diff --git a/chromium/chrome/browser/resources/extensions/BUILD.gn b/chromium/chrome/browser/resources/extensions/BUILD.gn
index aa59bce7b2f..ed35295923a 100644
--- a/chromium/chrome/browser/resources/extensions/BUILD.gn
+++ b/chromium/chrome/browser/resources/extensions/BUILD.gn
@@ -8,6 +8,7 @@ import("//extensions/buildflags/buildflags.gni")
import("//tools/grit/grit_rule.gni")
import("//tools/grit/preprocess_if_expr.gni")
import("//tools/polymer/html_to_js.gni")
+import("//tools/polymer/html_to_wrapper.gni")
import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
import("../tools/optimize_webui.gni")
@@ -54,18 +55,25 @@ generate_grd("build_grd") {
preprocess_if_expr("preprocess") {
in_folder = "."
out_folder = "$target_gen_dir/$preprocess_folder"
- in_files = non_web_component_files
+ in_files = ts_files
}
preprocess_if_expr("preprocess_generated") {
- public_deps = [ ":web_components" ]
+ public_deps = [
+ ":css_wrapper_files",
+ ":html_wrapper_files",
+ ]
in_folder = target_gen_dir
out_folder = "$target_gen_dir/$preprocess_folder"
- in_files = web_component_files
+ in_files = html_wrapper_files + css_wrapper_files
+}
+
+html_to_js("css_wrapper_files") {
+ js_files = css_wrapper_files
}
-html_to_js("web_components") {
- js_files = web_component_files
+html_to_wrapper("html_wrapper_files") {
+ in_files = html_files
}
grit("resources") {
@@ -90,7 +98,7 @@ ts_library("build_ts") {
out_dir = "$target_gen_dir/tsc"
composite = true
tsconfig_base = "tsconfig_base.json"
- in_files = web_component_files + non_web_component_files
+ in_files = ts_files + css_wrapper_files + html_wrapper_files
definitions = [
"//tools/typescript/definitions/activity_log_private.d.ts",
"//tools/typescript/definitions/chrome_event.d.ts",
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 ca110ee3d06..8e2e9f1ffc9 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log.ts
@@ -18,10 +18,11 @@ import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_containe
import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {afterNextRender, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {navigation, Page} from '../navigation_helper.js';
+import {getTemplate} from './activity_log.html.js';
import {ActivityLogDelegate} from './activity_log_history.js';
/**
@@ -45,7 +46,7 @@ const enum ActivityLogSubpage {
export type ActivityLogExtensionPlaceholder = {
id: string,
isPlaceholder: boolean,
-}
+};
export interface ExtensionsActivityLogElement {
$: {
@@ -63,7 +64,7 @@ export class ExtensionsActivityLogElement extends
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -97,7 +98,7 @@ export class ExtensionsActivityLogElement extends
selectedSubpage_: ActivityLogSubpage;
private tabNames_: string[];
- ready() {
+ override ready() {
super.ready();
this.addEventListener('view-enter-start', this.onViewEnterStart_);
this.addEventListener('view-exit-finish', this.onViewExitFinish_);
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.ts b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
index 3108d1f7786..a25dcca5438 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
@@ -9,9 +9,10 @@ import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.js';
import '../shared_style.js';
import './activity_log_history_item.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './activity_log_history.html.js';
import {ActivityGroup} from './activity_log_history_item.js';
@@ -174,7 +175,7 @@ export class ActivityLogHistoryElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -230,7 +231,7 @@ export class ActivityLogHistoryElement extends PolymerElement {
this.rawActivities_ = '';
}
- ready() {
+ override ready() {
super.ready();
this.addEventListener('delete-activity-log-item', e => this.deleteItem_(e));
}
@@ -246,7 +247,7 @@ export class ActivityLogHistoryElement extends PolymerElement {
return this.dataFetchedResolver_!.promise;
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.dataFetchedResolver_ = new PromiseResolver();
this.refreshActivities_();
@@ -273,8 +274,9 @@ export class ActivityLogHistoryElement extends PolymerElement {
}
private onMoreActionsClick_() {
- this.shadowRoot!.querySelector('cr-action-menu')!.showAt(
- assert(this.shadowRoot!.querySelector('cr-icon-button')!));
+ const moreButton = this.shadowRoot!.querySelector('cr-icon-button');
+ assert(moreButton);
+ this.shadowRoot!.querySelector('cr-action-menu')!.showAt(moreButton);
}
private expandItems_(expanded: boolean) {
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts
index 2f5688b34fb..ac4576eaa65 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_history_item.ts
@@ -9,7 +9,8 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import '../shared_style.js';
import '../shared_vars.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './activity_log_history_item.html.js';
export type ActivityGroup = {
activityIds: Set<string>,
@@ -35,7 +36,7 @@ export class ActivityLogHistoryItemElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.ts b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.ts
index b02c4c76a0b..b32510d067d 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.ts
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream.ts
@@ -9,8 +9,9 @@ import '../shared_style.js';
import './activity_log_stream_item.js';
import {ChromeEvent} from '/tools/typescript/definitions/chrome_event.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './activity_log_stream.html.js';
import {StreamItem} from './activity_log_stream_item.js';
@@ -62,7 +63,7 @@ export class ActivityLogStreamElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -111,7 +112,7 @@ export class ActivityLogStreamElement extends PolymerElement {
this.listenerInstance_ = () => {};
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
// Since this component is not restamped, this will only be called once
diff --git a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream_item.ts b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream_item.ts
index 51d0e790dbf..dd423aa2f8c 100644
--- a/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream_item.ts
+++ b/chromium/chrome/browser/resources/extensions/activity_log/activity_log_stream_item.ts
@@ -8,7 +8,8 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import '../shared_style.js';
import '../shared_vars.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './activity_log_stream_item.html.js';
export type StreamItem = {
name?: string,
@@ -29,7 +30,7 @@ export type StreamItem = {
export type StreamArgItem = {
arg: string,
index: number,
-}
+};
/**
* Placeholder for arg_url that can occur in |StreamItem.args|. Sometimes we
@@ -52,7 +53,7 @@ export class ActivityLogStreamItemElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/code_section.ts b/chromium/chrome/browser/resources/extensions/code_section.ts
index ab58b86b05a..45168defa8c 100644
--- a/chromium/chrome/browser/resources/extensions/code_section.ts
+++ b/chromium/chrome/browser/resources/extensions/code_section.ts
@@ -9,7 +9,8 @@ import './strings.m.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './code_section.html.js';
function visibleLineCount(totalCount: number, oppositeCount: number): number {
@@ -29,7 +30,7 @@ export class ExtensionsCodeSectionElement extends
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/detail_view.ts b/chromium/chrome/browser/resources/extensions/detail_view.ts
index afd2f044329..c8c22140f52 100644
--- a/chromium/chrome/browser/resources/extensions/detail_view.ts
+++ b/chromium/chrome/browser/resources/extensions/detail_view.ts
@@ -29,7 +29,8 @@ import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggl
import {CrTooltipIconElement} from 'chrome://resources/cr_elements/policy/cr_tooltip_icon.m.js';
import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {afterNextRender, DomRepeatEvent, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {afterNextRender, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './detail_view.html.js';
import {ItemDelegate} from './item.js';
import {ItemMixin} from './item_mixin.js';
@@ -58,7 +59,7 @@ export class ExtensionsDetailViewElement extends
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -106,11 +107,11 @@ export class ExtensionsDetailViewElement extends
fromActivityLog: boolean;
private size_: string;
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
}
- ready() {
+ override ready() {
super.ready();
this.addEventListener('view-enter-start', this.onViewEnterStart_);
}
diff --git a/chromium/chrome/browser/resources/extensions/drop_overlay.ts b/chromium/chrome/browser/resources/extensions/drop_overlay.ts
index 48c5352c5cf..f699ec1a074 100644
--- a/chromium/chrome/browser/resources/extensions/drop_overlay.ts
+++ b/chromium/chrome/browser/resources/extensions/drop_overlay.ts
@@ -8,9 +8,10 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import {DragWrapper} from 'chrome://resources/js/cr/ui/drag_wrapper.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {DragAndDropHandler} from './drag_and_drop_handler.js';
+import {getTemplate} from './drop_overlay.html.js';
class ExtensionsDropOverlayElement extends PolymerElement {
static get is() {
@@ -18,7 +19,7 @@ class ExtensionsDropOverlayElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/error_page.ts b/chromium/chrome/browser/resources/extensions/error_page.ts
index 49633e9ddc2..a88d4070a8a 100644
--- a/chromium/chrome/browser/resources/extensions/error_page.ts
+++ b/chromium/chrome/browser/resources/extensions/error_page.ts
@@ -15,11 +15,12 @@ import './code_section.js';
import './shared_style.js';
import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {afterNextRender, DomRepeatEvent, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {afterNextRender, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './error_page.html.js';
import {navigation, Page} from './navigation_helper.js';
@@ -60,8 +61,9 @@ function getErrorSeverityText_(
return warn;
case chrome.developerPrivate.ErrorLevel.ERROR:
return error;
+ default:
+ assertNotReached();
}
- assertNotReached();
}
assert(item.type === chrome.developerPrivate.ErrorType.MANIFEST);
return warn;
@@ -80,6 +82,10 @@ export class ExtensionsErrorPageElement extends ExtensionsErrorPageElementBase {
return 'extensions-error-page';
}
+ static get template() {
+ return getTemplate();
+ }
+
static get properties() {
return {
data: Object,
@@ -125,7 +131,7 @@ export class ExtensionsErrorPageElement extends ExtensionsErrorPageElementBase {
private selectedEntry_: number;
private selectedStackFrame_: chrome.developerPrivate.StackFrame|null;
- ready() {
+ override ready() {
super.ready();
this.addEventListener('view-enter-start', this.onViewEnterStart_);
FocusOutlineManager.forDocument(document);
@@ -281,7 +287,7 @@ export class ExtensionsErrorPageElement extends ExtensionsErrorPageElementBase {
}
private updateSelected_(frame: chrome.developerPrivate.StackFrame) {
- this.selectedStackFrame_ = assert(frame);
+ this.selectedStackFrame_ = frame;
const selectedError = this.getSelectedError();
this.delegate
@@ -371,10 +377,6 @@ export class ExtensionsErrorPageElement extends ExtensionsErrorPageElementBase {
-1 :
repeaterEvent.model.index;
}
-
- static get template() {
- return html`{__html_template__}`;
- }
}
declare global {
diff --git a/chromium/chrome/browser/resources/extensions/extensions.gni b/chromium/chrome/browser/resources/extensions/extensions.gni
index 2d1bf1b977f..55cac1cc4c1 100644
--- a/chromium/chrome/browser/resources/extensions/extensions.gni
+++ b/chromium/chrome/browser/resources/extensions/extensions.gni
@@ -4,7 +4,6 @@
import("//build/config/chromeos/ui_mode.gni")
-# List of files that don't need to be passed to html_to_js().
non_web_component_files = [
"drag_and_drop_handler.ts",
"extensions.ts",
@@ -14,6 +13,7 @@ non_web_component_files = [
"navigation_helper.ts",
"service.ts",
"shortcut_util.ts",
+ "site_settings_mixin.ts",
"url_util.ts",
]
@@ -21,7 +21,7 @@ if (is_chromeos_ash) {
non_web_component_files += [ "kiosk_browser_proxy.ts" ]
}
-# List of files that should be passed to html_to_js().
+# Files holding a Polymer element definition and have an equivalent .html file.
web_component_files = [
"activity_log/activity_log.ts",
"activity_log/activity_log_history.ts",
@@ -33,7 +33,6 @@ web_component_files = [
"drop_overlay.ts",
"error_page.ts",
"host_permissions_toggle_list.ts",
- "icons.ts",
"install_warnings_dialog.ts",
"item.ts",
"item_list.ts",
@@ -45,13 +44,12 @@ web_component_files = [
"pack_dialog_alert.ts",
"runtime_host_permissions.ts",
"runtime_hosts_dialog.ts",
- "shared_style.ts",
- "shared_vars.ts",
"shortcut_input.ts",
"sidebar.ts",
"site_permissions.ts",
- "site_permissions_add_site_dialog.ts",
"site_permissions_by_site.ts",
+ "site_permissions_edit_permissions_dialog.ts",
+ "site_permissions_edit_url_dialog.ts",
"site_permissions_list.ts",
"toggle_row.ts",
"toolbar.ts",
@@ -60,3 +58,23 @@ web_component_files = [
if (is_chromeos_ash) {
web_component_files += [ "kiosk_dialog.ts" ]
}
+
+# Files that are passed as input to html_to_wrapper().
+html_files = []
+foreach(f, web_component_files) {
+ html_files += [ string_replace(f, ".ts", ".html") ]
+}
+
+# Files that are generated by html_to_wrapper().
+html_wrapper_files = []
+foreach(f, html_files) {
+ html_wrapper_files += [ f + ".ts" ]
+}
+
+ts_files = web_component_files + non_web_component_files
+
+css_wrapper_files = [
+ "icons.ts",
+ "shared_style.ts",
+ "shared_vars.ts",
+]
diff --git a/chromium/chrome/browser/resources/extensions/extensions.html b/chromium/chrome/browser/resources/extensions/extensions.html
index ecc17a85b6e..37865c83d10 100644
--- a/chromium/chrome/browser/resources/extensions/extensions.html
+++ b/chromium/chrome/browser/resources/extensions/extensions.html
@@ -1,6 +1,6 @@
<!doctype html>
<html dir="$i18n{textdirection}" lang="$i18n{language}"
- class="loading $i18n{loadTimeClasses}" $i18n{enableBrandingUpdateAttribute}>
+ class="loading $i18n{loadTimeClasses}">
<head>
<meta charset="utf8">
<meta name="color-scheme" content="light dark">
@@ -9,11 +9,16 @@
<link rel="stylesheet" href="chrome://resources/css/md_colors.css">
<style>
html {
- background: var(--md-background-color);
/* Remove 300ms delay for 'click' event, when using touch interface. */
touch-action: manipulation;
}
+ @media (prefers-color-scheme: dark) {
+ html {
+ background: var(--md-background-color);
+ }
+ }
+
html.loading::before,
html.loading body::before {
box-sizing: border-box;
diff --git a/chromium/chrome/browser/resources/extensions/extensions.ts b/chromium/chrome/browser/resources/extensions/extensions.ts
index 3b9a7f603ec..9b25c3ec09e 100644
--- a/chromium/chrome/browser/resources/extensions/extensions.ts
+++ b/chromium/chrome/browser/resources/extensions/extensions.ts
@@ -20,7 +20,7 @@ export {ExtensionsItemElement, ItemDelegate} from './item.js';
export {ExtensionsItemListElement} from './item_list.js';
export {UserAction} from './item_util.js';
export {ExtensionsKeyboardShortcutsElement} from './keyboard_shortcuts.js';
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
export {KioskApp, KioskAppSettings, KioskBrowserProxy, KioskBrowserProxyImpl, KioskSettings} from './kiosk_browser_proxy.js';
export {ExtensionsKioskDialogElement} from './kiosk_dialog.js';
// </if>
@@ -32,16 +32,17 @@ export {ExtensionsOptionsDialogElement} from './options_dialog.js';
export {ExtensionsPackDialogElement, PackDialogDelegate} from './pack_dialog.js';
export {ExtensionsPackDialogAlertElement} from './pack_dialog_alert.js';
export {ExtensionsRuntimeHostPermissionsElement} from './runtime_host_permissions.js';
-export {getPatternFromSite} from './runtime_hosts_dialog.js';
-export {ExtensionsRuntimeHostsDialogElement} from './runtime_hosts_dialog.js';
+export {ExtensionsRuntimeHostsDialogElement, getMatchingUserSpecifiedSites, getPatternFromSite} from './runtime_hosts_dialog.js';
export {Service, ServiceInterface} from './service.js';
export {ExtensionsShortcutInputElement} from './shortcut_input.js';
export {isValidKeyCode, Key, keystrokeToString} from './shortcut_util.js';
export {ExtensionsSidebarElement} from './sidebar.js';
export {ExtensionsSitePermissionsElement} from './site_permissions.js';
-export {getSitePermissionsPatternFromSite, SitePermissionsAddSiteDialogElement} from './site_permissions_add_site_dialog.js';
export {ExtensionsSitePermissionsBySiteElement} from './site_permissions_by_site.js';
+export {SitePermissionsEditPermissionsDialogElement} from './site_permissions_edit_permissions_dialog.js';
+export {getSitePermissionsPatternFromSite, SitePermissionsEditUrlDialogElement} from './site_permissions_edit_url_dialog.js';
export {ExtensionsSitePermissionsListElement} from './site_permissions_list.js';
+export {SiteSettingsMixin} from './site_settings_mixin.js';
export {ExtensionsToggleRowElement} from './toggle_row.js';
export {ExtensionsToolbarElement} from './toolbar.js';
export {getFaviconUrl} from './url_util.js';
diff --git a/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.ts b/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.ts
index 3ea92d01306..93307db47f0 100644
--- a/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.ts
+++ b/chromium/chrome/browser/resources/extensions/host_permissions_toggle_list.ts
@@ -10,7 +10,8 @@ import './toggle_row.js';
import './shared_style.js';
import './strings.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './host_permissions_toggle_list.html.js';
import {ItemDelegate} from './item.js';
import {UserAction} from './item_util.js';
@@ -29,7 +30,7 @@ export class ExtensionsHostPermissionsToggleListElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/install_warnings_dialog.ts b/chromium/chrome/browser/resources/extensions/install_warnings_dialog.ts
index 2873d041c51..a30290e1e15 100644
--- a/chromium/chrome/browser/resources/extensions/install_warnings_dialog.ts
+++ b/chromium/chrome/browser/resources/extensions/install_warnings_dialog.ts
@@ -9,7 +9,8 @@ import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
import './code_section.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './install_warnings_dialog.html.js';
interface ExtensionsInstallWarningsDialogElement {
$: {
@@ -23,7 +24,7 @@ class ExtensionsInstallWarningsDialogElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -34,7 +35,7 @@ class ExtensionsInstallWarningsDialogElement extends PolymerElement {
installWarnings: Array<string>;
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.$.dialog.showModal();
}
diff --git a/chromium/chrome/browser/resources/extensions/item.ts b/chromium/chrome/browser/resources/extensions/item.ts
index 1a16981f6a9..a31b564d78a 100644
--- a/chromium/chrome/browser/resources/extensions/item.ts
+++ b/chromium/chrome/browser/resources/extensions/item.ts
@@ -22,9 +22,10 @@ import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.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.m.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
-import {flush, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {flush, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './item.html.js';
import {ItemMixin} from './item_mixin.js';
import {computeInspectableViewLabel, EnableControl, getEnableControl, getItemSource, getItemSourceString, isEnabled, SourceType, userCanChangeEnablement} from './item_util.js';
@@ -72,7 +73,7 @@ export class ExtensionsItemElement extends ExtensionsItemElementBase {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -252,8 +253,9 @@ export class ExtensionsItemElement extends ExtensionsItemElementBase {
return 'extensions-icons:unpacked';
case SourceType.WEBSTORE:
return '';
+ default:
+ assertNotReached();
}
- assertNotReached();
}
private computeSourceIndicatorText_(): string {
diff --git a/chromium/chrome/browser/resources/extensions/item_list.ts b/chromium/chrome/browser/resources/extensions/item_list.ts
index 4666a42b5ec..da86db23349 100644
--- a/chromium/chrome/browser/resources/extensions/item_list.ts
+++ b/chromium/chrome/browser/resources/extensions/item_list.ts
@@ -9,9 +9,10 @@ import './shared_style.js';
import {CrContainerShadowMixin} from 'chrome://resources/cr_elements/cr_container_shadow_mixin.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ExtensionsItemElement, ItemDelegate} from './item.js';
+import {getTemplate} from './item_list.html.js';
type Filter = (info: chrome.developerPrivate.ExtensionInfo) => boolean;
@@ -24,7 +25,7 @@ export class ExtensionsItemListElement extends ExtensionsItemListElementBase {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/item_mixin.ts b/chromium/chrome/browser/resources/extensions/item_mixin.ts
index 31795f3d4f8..e0a1f88d47e 100644
--- a/chromium/chrome/browser/resources/extensions/item_mixin.ts
+++ b/chromium/chrome/browser/resources/extensions/item_mixin.ts
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -29,8 +29,6 @@ export const ItemMixin = dedupingMixin(
return extensionLabel;
}
assertNotReached('Item type is not App or Extension.');
- // Unreachable return to satisfy TS compiler.
- return ExtensionType.EXTENSION;
}
/**
diff --git a/chromium/chrome/browser/resources/extensions/item_util.ts b/chromium/chrome/browser/resources/extensions/item_util.ts
index 97192bf8dd8..9b42cb63049 100644
--- a/chromium/chrome/browser/resources/extensions/item_util.ts
+++ b/chromium/chrome/browser/resources/extensions/item_util.ts
@@ -4,7 +4,7 @@
import './strings.m.js';
-import {assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
export enum SourceType {
@@ -22,7 +22,6 @@ export enum EnableControl {
}
// TODO(tjudkins): This should be extracted to a shared metrics module.
-/** @enum {string} */
export enum UserAction {
ALL_TOGGLED_ON = 'Extensions.Settings.HostList.AllHostsToggledOn',
ALL_TOGGLED_OFF = 'Extensions.Settings.HostList.AllHostsToggledOff',
@@ -44,13 +43,13 @@ export function isEnabled(state: chrome.developerPrivate.ExtensionState):
case chrome.developerPrivate.ExtensionState.BLACKLISTED:
case chrome.developerPrivate.ExtensionState.DISABLED:
return false;
+ default:
+ assertNotReached();
}
- assertNotReached();
- return false;
}
/**
- * @return {boolean} Whether the user can change whether or not the extension is
+ * @return Whether the user can change whether or not the extension is
* enabled.
*/
export function userCanChangeEnablement(
@@ -94,9 +93,9 @@ export function getItemSource(item: chrome.developerPrivate.ExtensionInfo):
return SourceType.UNKNOWN;
case chrome.developerPrivate.Location.FROM_STORE:
return SourceType.WEBSTORE;
+ default:
+ assertNotReached(item.location);
}
-
- assertNotReached(item.location);
}
export function getItemSourceString(source: SourceType): string {
@@ -113,9 +112,9 @@ export function getItemSourceString(source: SourceType): string {
// Nothing to return. Calling code should use
// chrome.developerPrivate.ExtensionInfo's |locationText| instead.
return '';
+ default:
+ assertNotReached();
}
- assertNotReached();
- return '';
}
/**
diff --git a/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts b/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts
index f2f60437e43..302aae7276f 100644
--- a/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts
+++ b/chromium/chrome/browser/resources/extensions/keyboard_shortcuts.ts
@@ -9,9 +9,10 @@ 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 {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {KeyboardShortcutDelegate} from './keyboard_shortcut_delegate.js';
+import {getTemplate} from './keyboard_shortcuts.html.js';
/** Event interface for dom-repeat. */
interface RepeaterEvent<T> extends CustomEvent {
@@ -33,7 +34,7 @@ export class ExtensionsKeyboardShortcutsElement extends
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -55,7 +56,7 @@ export class ExtensionsKeyboardShortcutsElement extends
delegate: KeyboardShortcutDelegate;
items: Array<chrome.developerPrivate.ExtensionInfo>;
- ready() {
+ override ready() {
super.ready();
this.addEventListener('view-enter-start', this.onViewEnter_);
}
diff --git a/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts b/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts
index 6839a398209..a22337abf58 100644
--- a/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts
+++ b/chromium/chrome/browser/resources/extensions/kiosk_dialog.ts
@@ -14,11 +14,12 @@ import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_butto
import {CrCheckboxElement} from 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js';
-import {DomRepeatEvent, html, 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 {KioskApp, KioskAppSettings, KioskBrowserProxy, KioskBrowserProxyImpl} from './kiosk_browser_proxy.js';
+import {getTemplate} from './kiosk_dialog.html.js';
export interface ExtensionsKioskDialogElement {
$: {
@@ -39,7 +40,7 @@ export class ExtensionsKioskDialogElement extends
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -67,7 +68,7 @@ export class ExtensionsKioskDialogElement extends
private canEditBailout_: boolean;
private errorAppId_: string|null;
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.kioskBrowserProxy_.initializeKioskAppSettings()
@@ -107,7 +108,7 @@ export class ExtensionsKioskDialogElement extends
private onAddAppTap_() {
assert(this.addAppInput_);
- this.kioskBrowserProxy_.addKioskApp(this.addAppInput_!);
+ this.kioskBrowserProxy_.addKioskApp(this.addAppInput_);
this.addAppInput_ = null;
}
diff --git a/chromium/chrome/browser/resources/extensions/load_error.ts b/chromium/chrome/browser/resources/extensions/load_error.ts
index a5427106154..2fdf78e8a9b 100644
--- a/chromium/chrome/browser/resources/extensions/load_error.ts
+++ b/chromium/chrome/browser/resources/extensions/load_error.ts
@@ -10,10 +10,11 @@ import './code_section.js';
import './strings.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ExtensionsCodeSectionElement} from './code_section.js';
+import {getTemplate} from './load_error.html.js';
export interface LoadErrorDelegate {
/**
@@ -35,7 +36,7 @@ export class ExtensionsLoadErrorElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/manager.html b/chromium/chrome/browser/resources/extensions/manager.html
index 487c54607e4..4d0941f191e 100644
--- a/chromium/chrome/browser/resources/extensions/manager.html
+++ b/chromium/chrome/browser/resources/extensions/manager.html
@@ -29,7 +29,7 @@
delegate="[[delegate]]" on-cr-toolbar-menu-tap="onMenuButtonTap_"
on-search-changed="onFilterChanged_"
extensions="[[extensions_]]"
-<if expr="chromeos">
+<if expr="chromeos_ash">
on-kiosk-tap="onKioskTap_"
kiosk-enabled="[[kioskEnabled_]]"
</if>
@@ -74,7 +74,8 @@
</cr-lazy-render>
<cr-lazy-render id="site-permissions">
<template>
- <extensions-site-permissions delegate="[[delegate]]" slot="view">
+ <extensions-site-permissions delegate="[[delegate]]" slot="view"
+ enable-enhanced-site-controls="[[enableEnhancedSiteControls]]">
</extensions-site-permissions>
</template>
</cr-lazy-render>
@@ -109,7 +110,7 @@
on-close="onLoadErrorDialogClose_">
</extensions-load-error>
</template>
-<if expr="chromeos">
+<if expr="chromeos_ash">
<template is="dom-if" if="[[showKioskDialog_]]" restamp>
<extensions-kiosk-dialog id="kiosk-dialog" on-close="onKioskDialogClose_">
</extensions-kiosk-dialog>
diff --git a/chromium/chrome/browser/resources/extensions/manager.ts b/chromium/chrome/browser/resources/extensions/manager.ts
index 791e8907a54..e36c6a34524 100644
--- a/chromium/chrome/browser/resources/extensions/manager.ts
+++ b/chromium/chrome/browser/resources/extensions/manager.ts
@@ -23,22 +23,23 @@ import './sidebar.js';
import './site_permissions.js';
import './site_permissions_by_site.js';
import './toolbar.js';
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
import './kiosk_dialog.js';
// </if>
import {CrViewManagerElement} from 'chrome://resources/cr_elements/cr_view_manager/cr_view_manager.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ActivityLogExtensionPlaceholder} from './activity_log/activity_log.js';
import {ExtensionsDetailViewElement} from './detail_view.js';
import {ExtensionsItemListElement} from './item_list.js';
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
import {KioskBrowserProxyImpl} from './kiosk_browser_proxy.js';
// </if>
+import {getTemplate} from './manager.html.js';
import {Dialog, navigation, Page, PageState} from './navigation_helper.js';
import {Service} from './service.js';
@@ -88,6 +89,10 @@ export class ExtensionsManagerElement extends PolymerElement {
return 'extensions-manager';
}
+ static get template() {
+ return getTemplate();
+ }
+
static get properties() {
return {
canLoadUnpacked: {
@@ -186,7 +191,7 @@ export class ExtensionsManagerElement extends PolymerElement {
*/
fromActivityLog_: Boolean,
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
kioskEnabled_: {
type: Boolean,
value: false,
@@ -223,7 +228,7 @@ export class ExtensionsManagerElement extends PolymerElement {
private showOptionsDialog_: boolean;
private fromActivityLog_: boolean;
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
private kioskEnabled_: boolean;
private showKioskDialog_: boolean;
// </if>
@@ -247,7 +252,7 @@ export class ExtensionsManagerElement extends PolymerElement {
this.navigationListener_ = null;
}
- ready() {
+ override ready() {
super.ready();
this.addEventListener('load-error', this.onLoadError_);
@@ -277,7 +282,7 @@ export class ExtensionsManagerElement extends PolymerElement {
this.onItemStateChanged_.bind(this));
});
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
KioskBrowserProxyImpl.getInstance().initializeKioskAppSettings().then(
params => {
this.kioskEnabled_ = params.kioskEnabled;
@@ -285,7 +290,7 @@ export class ExtensionsManagerElement extends PolymerElement {
// </if>
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
document.documentElement.classList.remove('loading');
@@ -297,9 +302,10 @@ export class ExtensionsManagerElement extends PolymerElement {
});
}
- disconnectedCallback() {
+ override disconnectedCallback() {
super.disconnectedCallback();
- assert(navigation.removeListener(this.navigationListener_!));
+ assert(this.navigationListener_);
+ assert(navigation.removeListener(this.navigationListener_));
this.navigationListener_ = null;
}
@@ -389,10 +395,9 @@ export class ExtensionsManagerElement extends PolymerElement {
return 'extensions_';
case ExtensionType.THEME:
assertNotReached('Don\'t send themes to the chrome://extensions page');
- break;
+ default:
+ assertNotReached();
}
- assertNotReached();
- return '';
}
/**
@@ -550,9 +555,9 @@ export class ExtensionsManagerElement extends PolymerElement {
}
if (toPage === Page.DETAILS) {
- this.detailViewItem_ = assert(data);
+ this.detailViewItem_ = data;
} else if (toPage === Page.ERRORS) {
- this.errorPageItem_ = assert(data);
+ this.errorPageItem_ = data;
} else if (toPage === Page.ACTIVITY_LOG) {
if (!this.showActivityLog) {
// Redirect back to the details page if we try to view the
@@ -562,7 +567,7 @@ export class ExtensionsManagerElement extends PolymerElement {
return;
}
- this.activityLogItem_ = data ? assert(data) : activityLogPlaceholder;
+ this.activityLogItem_ = data || activityLogPlaceholder;
} else if (
(toPage === Page.SITE_PERMISSIONS ||
toPage === Page.SITE_PERMISSIONS_ALL_SITES) &&
@@ -667,7 +672,7 @@ export class ExtensionsManagerElement extends PolymerElement {
this.showInstallWarningsDialog_ = false;
}
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
private onKioskTap_() {
this.showKioskDialog_ = true;
}
@@ -676,10 +681,6 @@ export class ExtensionsManagerElement extends PolymerElement {
this.showKioskDialog_ = false;
}
// </if>
-
- static get template() {
- return html`{__html_template__}`;
- }
}
declare global {
diff --git a/chromium/chrome/browser/resources/extensions/navigation_helper.ts b/chromium/chrome/browser/resources/extensions/navigation_helper.ts
index 057f794dd9a..5b0a1f63107 100644
--- a/chromium/chrome/browser/resources/extensions/navigation_helper.ts
+++ b/chromium/chrome/browser/resources/extensions/navigation_helper.ts
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
/**
diff --git a/chromium/chrome/browser/resources/extensions/options_dialog.ts b/chromium/chrome/browser/resources/extensions/options_dialog.ts
index f4e27c56350..fd953b4893e 100644
--- a/chromium/chrome/browser/resources/extensions/options_dialog.ts
+++ b/chromium/chrome/browser/resources/extensions/options_dialog.ts
@@ -6,9 +6,10 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
-import {Debouncer, html, PolymerElement, timeOut} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {Debouncer, PolymerElement, timeOut} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {navigation, Page} from './navigation_helper.js';
+import {getTemplate} from './options_dialog.html.js';
/**
* @return A signal that the document is ready. Need to wait for this, otherwise
@@ -48,7 +49,7 @@ export class ExtensionsOptionsDialogElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/pack_dialog.ts b/chromium/chrome/browser/resources/extensions/pack_dialog.ts
index d943462a2c5..acb1c590a13 100644
--- a/chromium/chrome/browser/resources/extensions/pack_dialog.ts
+++ b/chromium/chrome/browser/resources/extensions/pack_dialog.ts
@@ -12,7 +12,8 @@ import './strings.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './pack_dialog.html.js';
export interface PackDialogDelegate {
/**
@@ -51,7 +52,7 @@ export class ExtensionsPackDialogElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -73,7 +74,7 @@ export class ExtensionsPackDialogElement extends PolymerElement {
private keyFile_: string;
private lastResponse_: chrome.developerPrivate.PackDirectoryResponse|null;
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.$.dialog.showModal();
}
diff --git a/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts b/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts
index 8aedbe5cf5c..c0b013989ef 100644
--- a/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts
+++ b/chromium/chrome/browser/resources/extensions/pack_dialog_alert.ts
@@ -7,9 +7,10 @@ import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './pack_dialog_alert.html.js';
export interface ExtensionsPackDialogAlertElement {
$: {
@@ -23,7 +24,7 @@ export class ExtensionsPackDialogAlertElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -47,7 +48,7 @@ export class ExtensionsPackDialogAlertElement extends PolymerElement {
return this.$.dialog.getNative().returnValue;
}
- ready() {
+ override ready() {
super.ready();
// Initialize button label values for initial html binding.
@@ -70,11 +71,10 @@ export class ExtensionsPackDialogAlertElement extends PolymerElement {
break;
default:
assertNotReached();
- return;
}
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
this.$.dialog.showModal();
}
diff --git a/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html b/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html
index dfa7ff5fed5..66e4ae2c324 100644
--- a/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html
+++ b/chromium/chrome/browser/resources/extensions/runtime_host_permissions.html
@@ -211,6 +211,7 @@
<template is="dom-if" if="[[showHostDialog_]]" restamp>
<extensions-runtime-hosts-dialog
delegate="[[delegate]]" item-id="[[itemId]]"
+ enable-enhanced-site-controls="[[enableEnhancedSiteControls]]"
current-site="[[hostDialogModel_]]"
update-host-access="[[dialogShouldUpdateHostAccess_(oldHostAccess_)]]"
on-close="onHostDialogClose_"
diff --git a/chromium/chrome/browser/resources/extensions/runtime_host_permissions.ts b/chromium/chrome/browser/resources/extensions/runtime_host_permissions.ts
index 4143965d9ae..150d0913efa 100644
--- a/chromium/chrome/browser/resources/extensions/runtime_host_permissions.ts
+++ b/chromium/chrome/browser/resources/extensions/runtime_host_permissions.ts
@@ -21,11 +21,12 @@ import './strings.m.js';
import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
-import {DomRepeatEvent, html, 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 {ItemDelegate} from './item.js';
+import {getTemplate} from './runtime_host_permissions.html.js';
import {getFaviconUrl} from './url_util.js';
export interface ExtensionsRuntimeHostPermissionsElement {
@@ -40,7 +41,7 @@ export class ExtensionsRuntimeHostPermissionsElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -251,7 +252,8 @@ export class ExtensionsRuntimeHostPermissionsElement extends PolymerElement {
private onHostDialogClose_() {
this.hostDialogModel_ = null;
this.showHostDialog_ = false;
- focusWithoutInk(assert(this.hostDialogAnchorElement_!, 'Host Anchor'));
+ assert(this.hostDialogAnchorElement_);
+ focusWithoutInk(this.hostDialogAnchorElement_);
this.hostDialogAnchorElement_ = null;
this.oldHostAccess_ = null;
}
@@ -292,7 +294,8 @@ export class ExtensionsRuntimeHostPermissionsElement extends PolymerElement {
// to the action menu's trigger (since the dialog will be shown next).
// Instead, curry the element to the dialog, so once it closes, focus
// will be returned.
- const anchorElement = assert(this.actionMenuAnchorElement_!, 'Menu Anchor');
+ assert(this.actionMenuAnchorElement_, 'Menu Anchor');
+ const anchorElement = this.actionMenuAnchorElement_;
this.actionMenuAnchorElement_ = null;
this.closeActionMenu_();
this.doShowHostDialog_(anchorElement, site);
@@ -301,8 +304,9 @@ export class ExtensionsRuntimeHostPermissionsElement extends PolymerElement {
private onActionMenuRemoveClick_() {
chrome.metricsPrivate.recordUserAction(
'Extensions.Settings.Hosts.ActionMenuRemoveActivated');
+ assert(this.actionMenuModel_, 'Action Menu Model');
this.delegate.removeRuntimeHostPermission(
- this.itemId, assert(this.actionMenuModel_!, 'Action Menu Model'));
+ this.itemId, this.actionMenuModel_);
this.closeActionMenu_();
}
diff --git a/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.html b/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.html
index e8013bd69e0..282283687d6 100644
--- a/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.html
+++ b/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.html
@@ -1,4 +1,17 @@
-<style include="cr-shared-style"></style>
+<style include="cr-shared-style cr-icons shared-vars">
+ iron-icon {
+ fill: var(--warning-color);
+ margin-inline-end: 8px;
+ min-height: var(--cr-icon-size);
+ min-width: var(--cr-icon-size);
+ }
+
+ #matching-restricted-sites-warning {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: row;
+ }
+</style>
<cr-dialog id="dialog" close-text="$i18n{close}">
<div slot="title">[[computeDialogTitle_(currentSite)]]</div>
<div slot="body">
@@ -10,6 +23,11 @@
spellcheck="false"
autofocus>
</cr-input>
+ <div id="matching-restricted-sites-warning"
+ hidden="[[!matchingRestrictedSites_.length]]">
+ <iron-icon icon="cr:info-outline"></iron-icon>
+ <span>[[computeMatchingRestrictedSitesWarning_(site_)]]</span>
+ </div>
</div>
<div slot="button-container">
<cr-button class="cancel-button" on-click="onCancelTap_">
diff --git a/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts b/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts
index f5d2f0dd23e..582bf45c682 100644
--- a/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts
+++ b/chromium/chrome/browser/resources/extensions/runtime_hosts_dialog.ts
@@ -5,16 +5,22 @@
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
+import 'chrome://resources/cr_elements/icons.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import './strings.m.js';
+import './shared_vars.js';
import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ItemDelegate} from './item.js';
+import {getTemplate} from './runtime_hosts_dialog.html.js';
+import {sitePermissionsPatternRegExp} from './site_permissions_edit_url_dialog.js';
+import {SiteSettingsMixin} from './site_settings_mixin.js';
// A RegExp to roughly match acceptable patterns entered by the user.
// exec'ing() this RegExp will match the following groups:
@@ -25,7 +31,7 @@ import {ItemDelegate} from './item.js';
// 4: Hostname (e.g., 'example.com').
// 5: Port, including ':' separator (e.g., ':80').
// 6: Path, include '/' separator (e.g., '/*').
-const patternRegExp = new RegExp(
+const runtimeHostsPatternRegExp = new RegExp(
'^' +
// Scheme; optional.
'((http|https|\\*)://)?' +
@@ -40,7 +46,7 @@ const patternRegExp = new RegExp(
'$');
export function getPatternFromSite(site: string): string {
- const res = patternRegExp.exec(site)!;
+ const res = runtimeHostsPatternRegExp.exec(site)!;
assert(res);
const scheme = res[1] || '*://';
const host = (res[3] || '') + res[4];
@@ -49,6 +55,49 @@ export function getPatternFromSite(site: string): string {
return scheme + host + port + path;
}
+// Returns the sublist of `userSites` which match the pattern specified by
+// `host`.
+export function getMatchingUserSpecifiedSites(
+ userSites: string[], host: string): string[] {
+ if (!runtimeHostsPatternRegExp.test(host)) {
+ return [];
+ }
+
+ const newHostRes = runtimeHostsPatternRegExp.exec(host);
+ assert(newHostRes);
+
+ const matchAllSchemes = !newHostRes[1] || newHostRes[1] === '*://';
+ const matchAllSubdomains = newHostRes[3] === '*.';
+
+ // For each restricted site, break it down into
+ // `sitePermissionsPatternRegExp` components and check against components
+ // from `newHostRes`.
+ return userSites.filter((userSite: string) => {
+ const siteRes = sitePermissionsPatternRegExp.exec(userSite);
+ assert(siteRes);
+
+ // Check if schemes match, unless `newHostRes` has a wildcard scheme.
+ if (!matchAllSchemes && newHostRes[1] !== siteRes[1]) {
+ return false;
+ }
+
+ // Check if host names match. If `matchAllSubdomains` is specified, check
+ // that `newHostRes[4]` is a suffix of `siteRes[3]`
+ if (matchAllSubdomains && !siteRes[3].endsWith(newHostRes[4])) {
+ return false;
+ }
+ if (!matchAllSubdomains && siteRes[3] !== newHostRes[4]) {
+ return false;
+ }
+
+ // Ports match if:
+ // - both are unspecified
+ // - both are specified and are an exact match
+ // - specified for `restrictedSite` but not `this,site_`
+ return !newHostRes[5] || newHostRes[5] === siteRes[4];
+ });
+}
+
export interface ExtensionsRuntimeHostsDialogElement {
$: {
dialog: CrDialogElement,
@@ -56,19 +105,21 @@ export interface ExtensionsRuntimeHostsDialogElement {
};
}
-export class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
+const ExtensionsRuntimeHostsDialogElementBase =
+ I18nMixin(SiteSettingsMixin(PolymerElement));
+
+export class ExtensionsRuntimeHostsDialogElement extends
+ ExtensionsRuntimeHostsDialogElementBase {
static get is() {
return 'extensions-runtime-hosts-dialog';
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
return {
- delegate: Object,
-
itemId: String,
/**
@@ -97,17 +148,26 @@ export class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
type: Boolean,
value: false,
},
+
+ /**
+ * the list of user specified restricted sites that match with `site_` if
+ * `site_` is valid.
+ */
+ matchingRestrictedSites_: {
+ type: Array,
+ computed: 'computeMatchingRestrictedSites_(site_, restrictedSites)',
+ },
};
}
- delegate: ItemDelegate;
itemId: string;
currentSite: string|null;
updateHostAccess: boolean;
private site_: string;
private inputInvalid_: boolean;
+ private matchingRestrictedSites_: string[];
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
if (this.currentSite !== null && this.currentSite !== undefined) {
@@ -132,8 +192,7 @@ export class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
return;
}
- const valid = patternRegExp.test(this.site_);
- this.inputInvalid_ = !valid;
+ this.inputInvalid_ = !runtimeHostsPatternRegExp.test(this.site_);
}
private computeDialogTitle_(): string {
@@ -152,6 +211,10 @@ export class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
return loadTimeData.getString(stringId);
}
+ private computeMatchingRestrictedSites_(): string[] {
+ return getMatchingUserSpecifiedSites(this.restrictedSites, this.site_);
+ }
+
private onCancelTap_() {
this.$.dialog.cancel();
}
@@ -202,7 +265,7 @@ export class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
// Editing an existing entry is done by removing the current site entry,
// and then adding the new one.
- this.delegate.removeRuntimeHostPermission(this.itemId, this.currentSite!)
+ this.delegate.removeRuntimeHostPermission(this.itemId, this.currentSite)
.then(() => {
this.addPermission_();
});
@@ -214,15 +277,34 @@ export class ExtensionsRuntimeHostsDialogElement extends PolymerElement {
*/
private addPermission_() {
const pattern = getPatternFromSite(this.site_);
+ const restrictedSites = this.matchingRestrictedSites_;
this.delegate.addRuntimeHostPermission(this.itemId, pattern)
.then(
() => {
+ if (restrictedSites.length) {
+ this.delegate.removeUserSpecifiedSites(
+ chrome.developerPrivate.UserSiteSet.RESTRICTED,
+ restrictedSites);
+ }
this.$.dialog.close();
},
() => {
this.inputInvalid_ = true;
});
}
+
+ /**
+ * Returns a warning message containing the first restricted site that
+ * overlaps with `this.site_`, or an empty string if there are no matching
+ * restricted sites.
+ */
+ private computeMatchingRestrictedSitesWarning_(): string {
+ return this.matchingRestrictedSites_.length ?
+ this.i18n(
+ 'matchingRestrictedSitesWarning',
+ this.matchingRestrictedSites_[0]) :
+ '';
+ }
}
declare global {
diff --git a/chromium/chrome/browser/resources/extensions/service.ts b/chromium/chrome/browser/resources/extensions/service.ts
index bf1ca58d830..64dcffffefd 100644
--- a/chromium/chrome/browser/resources/extensions/service.ts
+++ b/chromium/chrome/browser/resources/extensions/service.ts
@@ -3,7 +3,7 @@
// found in the LICENSE file.
import {ChromeEvent} from '/tools/typescript/definitions/chrome_event.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
import {ActivityLogDelegate} from './activity_log/activity_log_history.js';
import {ActivityLogEventDelegate} from './activity_log/activity_log_stream.js';
@@ -13,7 +13,7 @@ import {KeyboardShortcutDelegate} from './keyboard_shortcut_delegate.js';
import {LoadErrorDelegate} from './load_error.js';
import {Dialog, navigation, Page} from './navigation_helper.js';
import {PackDialogDelegate} from './pack_dialog.js';
-import {SitePermissionsDelegate} from './site_permissions.js';
+import {SiteSettingsDelegate} from './site_settings_mixin.js';
import {ToolbarDelegate} from './toolbar.js';
export interface ServiceInterface extends ActivityLogDelegate,
@@ -21,7 +21,7 @@ export interface ServiceInterface extends ActivityLogDelegate,
ErrorPageDelegate, ItemDelegate,
KeyboardShortcutDelegate,
LoadErrorDelegate, PackDialogDelegate,
- SitePermissionsDelegate,
+ SiteSettingsDelegate,
ToolbarDelegate {
notifyDragInstallInProgress(): void;
loadUnpackedFromDrag(): Promise<boolean>;
@@ -33,8 +33,6 @@ export interface ServiceInterface extends ActivityLogDelegate,
getProfileConfiguration(): Promise<chrome.developerPrivate.ProfileInfo>;
getExtensionsInfo(): Promise<Array<chrome.developerPrivate.ExtensionInfo>>;
getExtensionSize(id: string): Promise<string>;
- getUserSiteSettingsChangedTarget():
- ChromeEvent<(settings: chrome.developerPrivate.UserSiteSettings) => void>;
}
export class Service implements ServiceInterface {
@@ -160,7 +158,7 @@ export class Service implements ServiceInterface {
/**
* @return A signal that loading finished, rejected if any error occurred.
*/
- private loadUnpackedHelper_(opt_options?:
+ private loadUnpackedHelper_(extraOptions?:
chrome.developerPrivate.LoadUnpackedOptions):
Promise<boolean> {
return new Promise(function(resolve, reject) {
@@ -169,7 +167,7 @@ export class Service implements ServiceInterface {
failQuietly: true,
populateError: true,
},
- opt_options);
+ extraOptions);
chrome.developerPrivate.loadUnpacked(options, (loadError) => {
if (chrome.runtime.lastError &&
@@ -480,21 +478,21 @@ export class Service implements ServiceInterface {
});
}
- addUserSpecifiedSite(
+ addUserSpecifiedSites(
siteSet: chrome.developerPrivate.UserSiteSet,
- host: string): Promise<void> {
+ hosts: string[]): Promise<void> {
return new Promise(function(resolve) {
- chrome.developerPrivate.addUserSpecifiedSite(
- {siteList: siteSet, host}, resolve);
+ chrome.developerPrivate.addUserSpecifiedSites(
+ {siteList: siteSet, hosts}, resolve);
});
}
- removeUserSpecifiedSite(
+ removeUserSpecifiedSites(
siteSet: chrome.developerPrivate.UserSiteSet,
- host: string): Promise<void> {
+ hosts: string[]): Promise<void> {
return new Promise(function(resolve) {
- chrome.developerPrivate.removeUserSpecifiedSite(
- {siteList: siteSet, host}, resolve);
+ chrome.developerPrivate.removeUserSpecifiedSites(
+ {siteList: siteSet, hosts}, resolve);
});
}
diff --git a/chromium/chrome/browser/resources/extensions/shortcut_input.ts b/chromium/chrome/browser/resources/extensions/shortcut_input.ts
index d532e9bc774..e51bc19aa1f 100644
--- a/chromium/chrome/browser/resources/extensions/shortcut_input.ts
+++ b/chromium/chrome/browser/resources/extensions/shortcut_input.ts
@@ -9,12 +9,13 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js';
import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
import {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {KeyboardShortcutDelegate} from './keyboard_shortcut_delegate.js';
+import {getTemplate} from './shortcut_input.html.js';
import {hasValidModifiers, isValidKeyCode, Key, keystrokeToString} from './shortcut_util.js';
enum ShortcutError {
@@ -42,7 +43,7 @@ export class ExtensionsShortcutInputElement extends
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -97,7 +98,7 @@ export class ExtensionsShortcutInputElement extends
private readonly_: boolean;
private pendingShortcut_: string;
- ready() {
+ override ready() {
super.ready();
const node = this.$.input;
diff --git a/chromium/chrome/browser/resources/extensions/shortcut_util.ts b/chromium/chrome/browser/resources/extensions/shortcut_util.ts
index fb56f749021..c761f9358d7 100644
--- a/chromium/chrome/browser/resources/extensions/shortcut_util.ts
+++ b/chromium/chrome/browser/resources/extensions/shortcut_util.ts
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import {assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
import {isChromeOS, isMac} from 'chrome://resources/js/cr.m.js';
@@ -186,6 +186,7 @@ export function hasValidModifiers(e: KeyboardEvent): boolean {
return hasModifier(e, false);
case ModifierPolicy.NOT_ALLOWED:
return !hasModifier(e, true);
+ default:
+ assertNotReached();
}
- assertNotReached();
}
diff --git a/chromium/chrome/browser/resources/extensions/sidebar.ts b/chromium/chrome/browser/resources/extensions/sidebar.ts
index 35880d8247c..cec19809646 100644
--- a/chromium/chrome/browser/resources/extensions/sidebar.ts
+++ b/chromium/chrome/browser/resources/extensions/sidebar.ts
@@ -8,9 +8,10 @@ import 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
import {IronSelectorElement} from 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {navigation, Page} from './navigation_helper.js';
+import {getTemplate} from './sidebar.html.js';
export interface ExtensionsSidebarElement {
$: {
@@ -26,7 +27,7 @@ export class ExtensionsSidebarElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -37,12 +38,12 @@ export class ExtensionsSidebarElement extends PolymerElement {
enableEnhancedSiteControls: boolean;
- ready() {
+ override ready() {
super.ready();
this.setAttribute('role', 'navigation');
}
- connectedCallback() {
+ override connectedCallback() {
super.connectedCallback();
const page = navigation.getCurrentPage().page;
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions.html b/chromium/chrome/browser/resources/extensions/site_permissions.html
index 6f3c0e3eae8..4f77ebc2fd3 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions.html
+++ b/chromium/chrome/browser/resources/extensions/site_permissions.html
@@ -35,12 +35,12 @@
delegate="[[delegate]]"
header="$i18n{permittedSites}"
site-set="[[userSiteSetEnum_.PERMITTED]]"
- sites="[[permittedSites_]]"></site-permissions-list>
+ sites="[[permittedSites]]"></site-permissions-list>
<site-permissions-list
delegate="[[delegate]]"
header="$i18n{restrictedSites}"
site-set="[[userSiteSetEnum_.RESTRICTED]]"
- sites="[[restrictedSites_]]"></site-permissions-list>
+ sites="[[restrictedSites]]"></site-permissions-list>
</div>
<cr-link-row class="hr" id="allSitesLink"
label="$i18n{sitePermissionsViewAllSites}"
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions.ts b/chromium/chrome/browser/resources/extensions/site_permissions.ts
index 4223b678371..c33379c5ca0 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions.ts
+++ b/chromium/chrome/browser/resources/extensions/site_permissions.ts
@@ -11,20 +11,11 @@ import './shared_vars.js';
import './site_permissions_list.js';
import {CrLinkRowElement} from 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {navigation, Page} from './navigation_helper.js';
-import {Service} from './service.js';
-
-export interface SitePermissionsDelegate {
- getUserSiteSettings(): Promise<chrome.developerPrivate.UserSiteSettings>;
- addUserSpecifiedSite(
- siteSet: chrome.developerPrivate.UserSiteSet,
- host: string): Promise<void>;
- removeUserSpecifiedSite(
- siteSet: chrome.developerPrivate.UserSiteSet,
- host: string): Promise<void>;
-}
+import {getTemplate} from './site_permissions.html.js';
+import {SiteSettingsMixin} from './site_settings_mixin.js';
export interface ExtensionsSitePermissionsElement {
$: {
@@ -32,23 +23,20 @@ export interface ExtensionsSitePermissionsElement {
};
}
-export class ExtensionsSitePermissionsElement extends PolymerElement {
+const ExtensionsSitePermissionsElementBase = SiteSettingsMixin(PolymerElement);
+
+export class ExtensionsSitePermissionsElement extends
+ ExtensionsSitePermissionsElementBase {
static get is() {
return 'extensions-site-permissions';
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
return {
- delegate: Object,
-
- permittedSites_: Array,
-
- restrictedSites_: Array,
-
userSiteSetEnum_: {
type: Object,
value: chrome.developerPrivate.UserSiteSet,
@@ -56,32 +44,6 @@ export class ExtensionsSitePermissionsElement extends PolymerElement {
};
}
- delegate: SitePermissionsDelegate;
- private permittedSites_: string[];
- private restrictedSites_: string[];
-
- ready() {
- super.ready();
- const service = Service.getInstance();
- service.getUserSiteSettingsChangedTarget().addListener(
- this.onUserSiteSettingsChanged_.bind(this));
- }
-
- connectedCallback() {
- super.connectedCallback();
- this.delegate.getUserSiteSettings().then(
- ({permittedSites, restrictedSites}) => {
- this.permittedSites_ = permittedSites;
- this.restrictedSites_ = restrictedSites;
- });
- }
-
- private onUserSiteSettingsChanged_({permittedSites, restrictedSites}: chrome
- .developerPrivate.UserSiteSettings) {
- this.permittedSites_ = permittedSites;
- this.restrictedSites_ = restrictedSites;
- }
-
private onAllSitesLinkClick_() {
navigation.navigateTo({page: Page.SITE_PERMISSIONS_ALL_SITES});
}
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_by_site.ts b/chromium/chrome/browser/resources/extensions/site_permissions_by_site.ts
index 3aeb622a906..97685479257 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions_by_site.ts
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_by_site.ts
@@ -7,9 +7,10 @@ import 'chrome://resources/cr_elements/shared_style_css.m.js';
import './shared_style.js';
import {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {navigation, Page} from './navigation_helper.js';
+import {getTemplate} from './site_permissions_by_site.html.js';
export interface ExtensionsSitePermissionsBySiteElement {
$: {
@@ -23,7 +24,7 @@ export class ExtensionsSitePermissionsBySiteElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
private onCloseButtonClick_() {
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
new file mode 100644
index 00000000000..7f89b94955a
--- /dev/null
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.html
@@ -0,0 +1,28 @@
+<style include="cr-shared-style">
+ cr-radio-group {
+ width: 100%;
+ }
+</style>
+<cr-dialog id="dialog" show-on-attach>
+ <div slot="title">[[computeDialogTitle_(site)]]</div>
+ <div slot="body">
+ <cr-radio-group selected="{{siteSet_}}">
+ <cr-radio-button
+ name="[[userSiteSetEnum_.PERMITTED]]"
+ label="[[getPermittedSiteLabel_(site)]]">
+ </cr-radio-button>
+ <cr-radio-button
+ name="[[userSiteSetEnum_.RESTRICTED]]"
+ label="[[getRestrictedSiteLabel_(site)]]">
+ </cr-radio-button>
+ </cr-radio-group>
+ </div>
+ <div slot="button-container">
+ <cr-button class="cancel-button" on-click="onCancelClick_">
+ $i18n{cancel}
+ </cr-button>
+ <cr-button class="action-button" id="submit" on-click="onSubmitClick_">
+ $i18n{save}
+ </cr-button>
+ </div>
+</cr-dialog>
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
new file mode 100644
index 00000000000..77e261b1bb0
--- /dev/null
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_permissions_dialog.ts
@@ -0,0 +1,115 @@
+// Copyright 2022 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 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.m.js';
+import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.m.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import './strings.m.js';
+
+import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
+import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
+import {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';
+
+export interface SitePermissionsEditPermissionsDialogElement {
+ $: {
+ dialog: CrDialogElement,
+ submit: CrButtonElement,
+ };
+}
+
+const SitePermissionsEditPermissionsDialogElementBase =
+ I18nMixin(PolymerElement);
+
+export class SitePermissionsEditPermissionsDialogElement extends
+ SitePermissionsEditPermissionsDialogElementBase {
+ static get is() {
+ return 'site-permissions-edit-permissions-dialog';
+ }
+
+ static get template() {
+ return getTemplate();
+ }
+
+ static get properties() {
+ return {
+ delegate: Object,
+
+ /**
+ * The current siteSet for `site`, as stored in the backend. Specifies
+ * whether `site` is a user specified permitted or restricted site.
+ */
+ originalSiteSet: String,
+
+ /**
+ * The url of the site whose permissions are currently being edited.
+ */
+ site: String,
+
+ /**
+ * The temporary siteSet for `site` as displayed in the dialog. Will be
+ * saved to the backend when the dialog is submitted.
+ */
+ siteSet_: String,
+
+ userSiteSetEnum_: {
+ type: Object,
+ value: chrome.developerPrivate.UserSiteSet,
+ },
+ };
+ }
+
+ delegate: SiteSettingsDelegate;
+ originalSiteSet: chrome.developerPrivate.UserSiteSet;
+ site: string;
+ private siteSet_: chrome.developerPrivate.UserSiteSet;
+
+ override connectedCallback() {
+ super.connectedCallback();
+ this.siteSet_ = this.originalSiteSet;
+ }
+
+ private onCancelClick_() {
+ this.$.dialog.cancel();
+ }
+
+ private onSubmitClick_() {
+ if (this.siteSet_ === this.originalSiteSet) {
+ this.$.dialog.close();
+ return;
+ }
+
+ this.delegate.addUserSpecifiedSites(this.siteSet_, [this.site]).then(() => {
+ this.$.dialog.close();
+ });
+ }
+
+ private computeDialogTitle_(): string {
+ return this.i18n('sitePermissionsEditPermissionsDialogTitle', this.site);
+ }
+
+ private getPermittedSiteLabel_(): string {
+ return this.i18n('editSitePermissionsAllowAllExtensions', this.site);
+ }
+
+ private getRestrictedSiteLabel_(): string {
+ return this.i18n('editSitePermissionsRestrictExtensions', this.site);
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'site-permissions-edit-permissions-dialog':
+ SitePermissionsEditPermissionsDialogElement;
+ }
+}
+
+customElements.define(
+ SitePermissionsEditPermissionsDialogElement.is,
+ SitePermissionsEditPermissionsDialogElement);
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_add_site_dialog.html b/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.html
index 03d7c2787f7..ee7ed42f6ad 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions_add_site_dialog.html
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.html
@@ -1,6 +1,6 @@
<style include="cr-shared-style"></style>
<cr-dialog id="dialog" show-on-attach>
- <div slot="title">$i18n{sitePermissionsAddSiteDialogTitle}</div>
+ <div slot="title">[[computeDialogTitle_(siteToEdit)]]</div>
<div slot="body">
<cr-input id="input" label="$i18n{sitePermissionsDialogInputLabel}"
placeholder="https://example.com"
@@ -17,7 +17,7 @@
</cr-button>
<cr-button class="action-button" id="submit" on-click="onSubmit_"
disabled="[[computeSubmitButtonDisabled_(inputValid_, site_)]]">
- $i18n{add}
+ [[computeSubmitButtonLabel_(siteToEdit)]]
</cr-button>
</div>
</cr-dialog>
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_add_site_dialog.ts b/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts
index 3d0076f0299..9e0f3dcab5c 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions_add_site_dialog.ts
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_edit_url_dialog.ts
@@ -10,10 +10,12 @@ import './strings.m.js';
import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {SitePermissionsDelegate} from './site_permissions.js';
+import {getTemplate} from './site_permissions_edit_url_dialog.html.js';
+import {SiteSettingsDelegate} from './site_settings_mixin.js';
// A RegExp to roughly match acceptable patterns entered by the user.
// exec'ing() this RegExp will match the following groups:
@@ -22,10 +24,10 @@ import {SitePermissionsDelegate} from './site_permissions.js';
// 2: Scheme only (e.g., 'https').
// 3: Hostname (e.g., 'example.com').
// 4: Port, including ':' separator (e.g., ':80').
-const patternRegExp = new RegExp(
+export const sitePermissionsPatternRegExp = new RegExp(
'^' +
// Scheme; optional.
- '((http|https|\\*)://)?' +
+ '((http|https)://)?' +
// Hostname or localhost, required.
'([a-z0-9\\.-]+\\.[a-z0-9]+|localhost)' +
// Port, optional.
@@ -33,7 +35,7 @@ const patternRegExp = new RegExp(
'$');
export function getSitePermissionsPatternFromSite(site: string): string {
- const res = patternRegExp.exec(site)!;
+ const res = sitePermissionsPatternRegExp.exec(site)!;
assert(res);
const scheme = res[1] || 'https://';
const host = res[3];
@@ -41,20 +43,20 @@ export function getSitePermissionsPatternFromSite(site: string): string {
return scheme + host + port;
}
-export interface SitePermissionsAddSiteDialogElement {
+export interface SitePermissionsEditUrlDialogElement {
$: {
dialog: CrDialogElement,
submit: CrButtonElement,
};
}
-export class SitePermissionsAddSiteDialogElement extends PolymerElement {
+export class SitePermissionsEditUrlDialogElement extends PolymerElement {
static get is() {
- return 'site-permissions-add-site-dialog';
+ return 'site-permissions-edit-url-dialog';
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -62,6 +64,15 @@ export class SitePermissionsAddSiteDialogElement extends PolymerElement {
delegate: Object,
siteSet: String,
+ /**
+ * The site that this entry is currently managing. Only non-empty if this
+ * is for editing an existing entry.
+ */
+ siteToEdit: {
+ type: String,
+ value: null,
+ },
+
site_: {
type: String,
value: '',
@@ -75,11 +86,21 @@ export class SitePermissionsAddSiteDialogElement extends PolymerElement {
};
}
- delegate: SitePermissionsDelegate;
+ delegate: SiteSettingsDelegate;
siteSet: chrome.developerPrivate.UserSiteSet;
+ siteToEdit: string|null;
private site_: string;
private inputValid_: boolean;
+ override connectedCallback() {
+ super.connectedCallback();
+
+ if (this.siteToEdit !== null) {
+ this.site_ = this.siteToEdit;
+ this.validate_();
+ }
+ }
+
/**
* Validates that the pattern entered is valid by testing it against the
* regex. An empty patterh is considered "valid" as the invalid message will
@@ -87,8 +108,14 @@ export class SitePermissionsAddSiteDialogElement extends PolymerElement {
* be disabled.
*/
private validate_() {
- this.inputValid_ =
- this.site_.trim().length === 0 || patternRegExp.test(this.site_);
+ this.inputValid_ = this.site_.trim().length === 0 ||
+ sitePermissionsPatternRegExp.test(this.site_);
+ }
+
+ private computeDialogTitle_(): string {
+ return loadTimeData.getString(
+ this.siteToEdit === null ? 'sitePermissionsAddSiteDialogTitle' :
+ 'sitePermissionsEditSiteDialogTitle');
}
private computeSubmitButtonDisabled_(): boolean {
@@ -96,13 +123,43 @@ export class SitePermissionsAddSiteDialogElement extends PolymerElement {
return !this.inputValid_ || this.site_.trim().length === 0;
}
+ private computeSubmitButtonLabel_(): string {
+ return loadTimeData.getString(this.siteToEdit === null ? 'add' : 'save');
+ }
+
private onCancel_() {
this.$.dialog.cancel();
}
private onSubmit_() {
const pattern = getSitePermissionsPatternFromSite(this.site_);
- this.delegate.addUserSpecifiedSite(this.siteSet, pattern)
+ if (this.siteToEdit !== null) {
+ this.handleEdit_(pattern);
+ } else {
+ this.handleAdd_(pattern);
+ }
+ }
+
+ private handleEdit_(pattern: string) {
+ assert(this.siteToEdit);
+ if (pattern === this.siteToEdit) {
+ this.$.dialog.close();
+ return;
+ }
+
+ this.delegate.removeUserSpecifiedSites(this.siteSet, [this.siteToEdit])
+ .then(() => {
+ this.addUserSpecifiedSite_(pattern);
+ });
+ }
+
+ private handleAdd_(pattern: string) {
+ assert(!this.siteToEdit);
+ this.addUserSpecifiedSite_(pattern);
+ }
+
+ private addUserSpecifiedSite_(pattern: string) {
+ this.delegate.addUserSpecifiedSites(this.siteSet, [pattern])
.then(
() => {
this.$.dialog.close();
@@ -115,10 +172,10 @@ export class SitePermissionsAddSiteDialogElement extends PolymerElement {
declare global {
interface HTMLElementTagNameMap {
- 'site-permissions-add-site-dialog': SitePermissionsAddSiteDialogElement;
+ 'site-permissions-edit-url-dialog': SitePermissionsEditUrlDialogElement;
}
}
customElements.define(
- SitePermissionsAddSiteDialogElement.is,
- SitePermissionsAddSiteDialogElement);
+ SitePermissionsEditUrlDialogElement.is,
+ SitePermissionsEditUrlDialogElement);
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_list.html b/chromium/chrome/browser/resources/extensions/site_permissions_list.html
index 73268813188..d3eb25f6911 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions_list.html
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_list.html
@@ -44,8 +44,6 @@
<div class="site-favicon"
style$="background-image:[[getFaviconUrl_(item)]]"></div>
<span class="site">[[item]]</span>
- <cr-icon-button class="subpage-arrow no-overlap"></cr-icon-button>
- <div class="separator"></div>
<cr-icon-button class="icon-more-vert no-overlap" on-click="onDotsClick_">
</cr-icon-button>
</div>
@@ -53,17 +51,34 @@
</div>
<cr-action-menu id="siteActionMenu">
+ <button class="dropdown-item" id="edit-site-url"
+ on-click="onEditSiteUrlClick_">
+ $i18n{sitePermissionsEditUrl}
+ </button>
+ <button class="dropdown-item" id="edit-site-permissions"
+ on-click="onEditSitePermissionsClick_">
+ $i18n{sitePermissionsEditPermissions}
+ </button>
<button class="dropdown-item" id="remove-site"
- on-click="onActionMenuRemoveClick_">
+ on-click="onRemoveSiteClick_">
$i18n{remove}
</button>
</cr-action-menu>
-<template is="dom-if" if="[[showAddSiteDialog_]]" restamp>
- <site-permissions-add-site-dialog
+<template is="dom-if" if="[[showEditSiteUrlDialog_]]" restamp>
+ <site-permissions-edit-url-dialog
delegate="[[delegate]]"
+ site-to-edit="[[siteToEdit_]]"
site-set="[[siteSet]]"
- on-close="onAddSiteDialogClose_"
- on-cancel="onAddSiteDialogClose_">
- </site-permissions-add-site-dialog>
+ on-close="onEditSiteUrlDialogClose_">
+ </site-permissions-edit-url-dialog>
+</template>
+
+<template is="dom-if" if="[[showEditSitePermissionsDialog_]]" restamp>
+ <site-permissions-edit-permissions-dialog
+ delegate="[[delegate]]"
+ site="[[siteToEdit_]]"
+ original-site-set="[[siteSet]]"
+ on-close="onEditSitePermissionsDialogClose_">
+ </site-permissions-edit-permissions-dialog>
</template>
diff --git a/chromium/chrome/browser/resources/extensions/site_permissions_list.ts b/chromium/chrome/browser/resources/extensions/site_permissions_list.ts
index 10a70e619c9..59abd88d092 100644
--- a/chromium/chrome/browser/resources/extensions/site_permissions_list.ts
+++ b/chromium/chrome/browser/resources/extensions/site_permissions_list.ts
@@ -10,14 +10,17 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import './strings.m.js';
import './shared_style.js';
import './shared_vars.js';
-import './site_permissions_add_site_dialog.js';
+import './site_permissions_edit_permissions_dialog.js';
+import './site_permissions_edit_url_dialog.js';
import {CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
import {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
-import {DomRepeatEvent, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
+import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
+import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {SitePermissionsDelegate} from './site_permissions.js';
+import {getTemplate} from './site_permissions_list.html.js';
+import {SiteSettingsDelegate} from './site_settings_mixin.js';
import {getFaviconUrl} from './url_util.js';
export interface ExtensionsSitePermissionsListElement {
@@ -33,7 +36,7 @@ export class ExtensionsSitePermissionsListElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -43,20 +46,40 @@ export class ExtensionsSitePermissionsListElement extends PolymerElement {
siteSet: String,
sites: Array,
- showAddSiteDialog_: {
+ showEditSiteUrlDialog_: {
type: Boolean,
value: false,
},
+
+ showEditSitePermissionsDialog_: {
+ type: Boolean,
+ value: false,
+ },
+
+ /**
+ * The site currently being edited if the user has opened the action menu
+ * for a given site.
+ */
+ siteToEdit_: {
+ type: String,
+ value: null,
+ },
};
}
- delegate: SitePermissionsDelegate;
+ delegate: SiteSettingsDelegate;
header: string;
siteSet: chrome.developerPrivate.UserSiteSet;
sites: Array<string>;
- private showAddSiteDialog_: boolean;
+ private showEditSiteUrlDialog_: boolean;
+ private showEditSitePermissionsDialog_: boolean;
private siteToEdit_: string|null;
+ // The element to return focus to once the site input dialog closes. If
+ // specified, this is the 3 dots menu for the site just edited, otherwise it's
+ // the add site button.
+ private siteToEditAnchorElement_: HTMLElement|null = null;
+
private hasSites_(): boolean {
return !!this.sites.length;
}
@@ -65,25 +88,61 @@ export class ExtensionsSitePermissionsListElement extends PolymerElement {
return getFaviconUrl(url);
}
+ private focusOnAnchor_() {
+ // Return focus to the three dots menu once a site has been edited.
+ // TODO(crbug.com/1298326): If the edited site is the only site in the
+ // list, focus is not on the three dots menu.
+ assert(this.siteToEditAnchorElement_, 'Site Anchor');
+ focusWithoutInk(this.siteToEditAnchorElement_);
+ this.siteToEditAnchorElement_ = null;
+ }
+
private onAddSiteClick_() {
- this.showAddSiteDialog_ = true;
+ assert(!this.showEditSitePermissionsDialog_);
+ this.siteToEdit_ = null;
+ this.showEditSiteUrlDialog_ = true;
}
- private onAddSiteDialogClose_() {
- this.showAddSiteDialog_ = false;
+ private onEditSiteUrlDialogClose_() {
+ this.showEditSiteUrlDialog_ = false;
+ if (this.siteToEdit_ !== null) {
+ this.focusOnAnchor_();
+ }
+ this.siteToEdit_ = null;
+ }
+
+ private onEditSitePermissionsDialogClose_() {
+ this.showEditSitePermissionsDialog_ = false;
+ assert(this.siteToEdit_, 'Site To Edit');
+ this.focusOnAnchor_();
+ this.siteToEdit_ = null;
}
private onDotsClick_(e: DomRepeatEvent<string>) {
this.siteToEdit_ = e.model.item;
+ assert(!this.showEditSitePermissionsDialog_);
this.$.siteActionMenu.showAt(e.target as HTMLElement);
+ this.siteToEditAnchorElement_ = e.target as HTMLElement;
}
- private onActionMenuRemoveClick_() {
- this.delegate
- .removeUserSpecifiedSite(
- this.siteSet, assert(this.siteToEdit_!, 'Site To Edit'))
+ private onEditSitePermissionsClick_() {
+ this.closeActionMenu_();
+ assert(this.siteToEdit_ !== null);
+ this.showEditSitePermissionsDialog_ = true;
+ }
+
+ private onEditSiteUrlClick_() {
+ this.closeActionMenu_();
+ assert(this.siteToEdit_ !== null);
+ this.showEditSiteUrlDialog_ = true;
+ }
+
+ private onRemoveSiteClick_() {
+ assert(this.siteToEdit_, 'Site To Edit');
+ this.delegate.removeUserSpecifiedSites(this.siteSet, [this.siteToEdit_])
.then(() => {
this.closeActionMenu_();
+ this.siteToEdit_ = null;
});
}
@@ -91,7 +150,6 @@ export class ExtensionsSitePermissionsListElement extends PolymerElement {
const menu = this.$.siteActionMenu;
assert(menu.open);
menu.close();
- this.siteToEdit_ = null;
}
}
diff --git a/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts b/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts
new file mode 100644
index 00000000000..14e882ca0af
--- /dev/null
+++ b/chromium/chrome/browser/resources/extensions/site_settings_mixin.ts
@@ -0,0 +1,82 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Provides behavior to fetch the list of user specified permitted
+ * and restricted sites on creation and when these lists are updated. Used by
+ * multiple pages.
+ */
+
+import {ChromeEvent} from '/tools/typescript/definitions/chrome_event.js';
+import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ItemDelegate} from './item.js';
+
+type Constructor<T> = new (...args: any[]) => T;
+
+export interface SiteSettingsDelegate {
+ getUserSiteSettings(): Promise<chrome.developerPrivate.UserSiteSettings>;
+ addUserSpecifiedSites(
+ siteSet: chrome.developerPrivate.UserSiteSet,
+ hosts: string[]): Promise<void>;
+ removeUserSpecifiedSites(
+ siteSet: chrome.developerPrivate.UserSiteSet,
+ hosts: string[]): Promise<void>;
+ getUserSiteSettingsChangedTarget():
+ ChromeEvent<(settings: chrome.developerPrivate.UserSiteSettings) => void>;
+}
+
+export const SiteSettingsMixin = dedupingMixin(
+ <T extends Constructor<PolymerElement>>(superClass: T): T&
+ Constructor<SiteSettingsMixinInterface> => {
+ class SiteSettingsMixin extends superClass {
+ static get properties() {
+ return {
+ delegate: Object,
+ enableEnhancedSiteControls: Boolean,
+
+ restrictedSites: {
+ type: Array,
+ value: [],
+ },
+
+ permittedSites: {
+ type: Array,
+ value: [],
+ },
+ };
+ }
+
+ delegate: ItemDelegate&SiteSettingsDelegate;
+ enableEnhancedSiteControls: boolean;
+ restrictedSites: string[];
+ protected permittedSites: string[];
+
+ override ready() {
+ super.ready();
+ if (this.enableEnhancedSiteControls) {
+ this.delegate.getUserSiteSettings().then(
+ this.onUserSiteSettingsChanged_.bind(this));
+ this.delegate.getUserSiteSettingsChangedTarget().addListener(
+ this.onUserSiteSettingsChanged_.bind(this));
+ }
+ }
+
+ private onUserSiteSettingsChanged_({
+ permittedSites,
+ restrictedSites
+ }: chrome.developerPrivate.UserSiteSettings) {
+ this.permittedSites = permittedSites;
+ this.restrictedSites = restrictedSites;
+ }
+ }
+
+ return SiteSettingsMixin;
+ });
+
+export interface SiteSettingsMixinInterface {
+ delegate: ItemDelegate&SiteSettingsDelegate;
+ enableEnhancedSiteControls: boolean;
+ restrictedSites: string[];
+}
diff --git a/chromium/chrome/browser/resources/extensions/toggle_row.ts b/chromium/chrome/browser/resources/extensions/toggle_row.ts
index 188d2f99c74..b2add5114cb 100644
--- a/chromium/chrome/browser/resources/extensions/toggle_row.ts
+++ b/chromium/chrome/browser/resources/extensions/toggle_row.ts
@@ -6,7 +6,8 @@ import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './toggle_row.html.js';
/**
@@ -29,7 +30,7 @@ export class ExtensionsToggleRowElement extends PolymerElement {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
diff --git a/chromium/chrome/browser/resources/extensions/toolbar.html b/chromium/chrome/browser/resources/extensions/toolbar.html
index 5ff14955eb7..eac706a0a83 100644
--- a/chromium/chrome/browser/resources/extensions/toolbar.html
+++ b/chromium/chrome/browser/resources/extensions/toolbar.html
@@ -105,7 +105,7 @@
title="$i18n{toolbarUpdateNowTooltip}">
$i18n{toolbarUpdateNow}
</cr-button>
-<if expr="chromeos">
+<if expr="chromeos_ash">
<cr-button id="kioskExtensions" on-click="onKioskTap_"
hidden$="[[!kioskEnabled]]">
$i18n{manageKioskApp}
diff --git a/chromium/chrome/browser/resources/extensions/toolbar.ts b/chromium/chrome/browser/resources/extensions/toolbar.ts
index 5ca91d1ad06..f3738304e36 100644
--- a/chromium/chrome/browser/resources/extensions/toolbar.ts
+++ b/chromium/chrome/browser/resources/extensions/toolbar.ts
@@ -15,7 +15,8 @@ import {getToastManager} from 'chrome://resources/cr_elements/cr_toast/cr_toast_
import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
import {listenOnce} from 'chrome://resources/js/util.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {getTemplate} from './toolbar.html.js';
export interface ToolbarDelegate {
/**
@@ -53,7 +54,7 @@ export class ExtensionsToolbarElement extends ExtensionsToolbarElementBase {
}
static get template() {
- return html`{__html_template__}`;
+ return getTemplate();
}
static get properties() {
@@ -71,7 +72,7 @@ export class ExtensionsToolbarElement extends ExtensionsToolbarElementBase {
devModeControlledByPolicy: Boolean,
isChildAccount: Boolean,
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
kioskEnabled: Boolean,
// </if>
@@ -93,7 +94,7 @@ export class ExtensionsToolbarElement extends ExtensionsToolbarElementBase {
devModeControlledByPolicy: boolean;
isChildAccount: boolean;
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
kioskEnabled: boolean;
// </if>
@@ -103,12 +104,9 @@ export class ExtensionsToolbarElement extends ExtensionsToolbarElementBase {
private showPackDialog_: boolean;
private isUpdating_: boolean;
- ready() {
+ override ready() {
super.ready();
this.setAttribute('role', 'banner');
- this.toggleAttribute(
- 'enable-branding-update',
- document.documentElement.hasAttribute('enable-branding-update'));
}
private fire_(eventName: string, detail?: any) {
@@ -185,7 +183,7 @@ export class ExtensionsToolbarElement extends ExtensionsToolbarElementBase {
this.$.packExtensions.focus();
}
- // <if expr="chromeos">
+ // <if expr="chromeos_ash">
private onKioskTap_() {
this.fire_('kiosk-tap');
}