Commit 140adbad authored by Jeevan Shikaram's avatar Jeevan Shikaram Committed by Commit Bot

Revert "[App Management] Revert CLs that introduced failing tests."

This reverts commit 70aabb04.

Reverting this revert and disabling tests as this needs to go to
UI review soon. Tests will be fixed in a following CL.

TBR=calamity@chromium.org

Bug: 1000271
Change-Id: Id681d795194e1d4a7cac8ec5e6167ccdfb2a3434
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1783677Reviewed-by: default avatarJeevan Shikaram <jshikaram@chromium.org>
Commit-Queue: Jeevan Shikaram <jshikaram@chromium.org>
Cr-Commit-Position: refs/heads/master@{#692937}
parent d5bd9cff
......@@ -10,14 +10,25 @@ js_type_check("closure_compile") {
":api_listener",
":app_item",
":app_management_page",
":app_permission_view",
":arc_permission_view",
":browser_proxy",
":chrome_app_permission_view",
":constants",
":dom_switch",
":fake_page_handler",
":main_view",
":permission_item",
":permission_toggle",
":pin_to_shelf_item",
":pwa_permission_view",
":reducers",
":router",
":store",
":store_client",
":toggle_row",
":types",
":uninstall_button",
":util",
]
}
......@@ -51,11 +62,32 @@ js_library("app_management_page") {
":actions",
":browser_proxy",
":main_view",
":router",
":store",
":store_client",
]
}
js_library("app_permission_view") {
deps = [
":arc_permission_view",
":chrome_app_permission_view",
":dom_switch",
":pwa_permission_view",
":store_client",
]
}
js_library("arc_permission_view") {
deps = [
":constants",
":fake_page_handler",
":permission_item",
":pin_to_shelf_item",
":store_client",
]
}
js_library("browser_proxy") {
deps = [
":fake_page_handler",
......@@ -64,9 +96,20 @@ js_library("browser_proxy") {
]
}
js_library("chrome_app_permission_view") {
deps = [
":fake_page_handler",
":pin_to_shelf_item",
":store_client",
]
}
js_library("constants") {
}
js_library("dom_switch") {
}
js_library("fake_page_handler") {
deps = [
":constants",
......@@ -87,6 +130,39 @@ js_library("main_view") {
]
}
js_library("permission_item") {
deps = [
":fake_page_handler",
":permission_toggle",
":store_client",
":util",
]
}
js_library("permission_toggle") {
deps = [
":util",
]
}
js_library("pin_to_shelf_item") {
deps = [
":browser_proxy",
":toggle_row",
":types",
]
}
js_library("pwa_permission_view") {
deps = [
":constants",
":fake_page_handler",
":permission_item",
":pin_to_shelf_item",
":store_client",
]
}
js_library("reducers") {
deps = [
":types",
......@@ -95,6 +171,14 @@ js_library("reducers") {
]
}
js_library("router") {
deps = [
":actions",
":constants",
":store_client",
]
}
js_library("store") {
deps = [
":reducers",
......@@ -114,12 +198,27 @@ js_library("store_client") {
]
}
js_library("toggle_row") {
deps = [
":types",
"//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
]
}
js_library("types") {
deps = [
"//chrome/browser/ui/webui/app_management:mojo_bindings_js_library_for_compile",
]
}
js_library("uninstall_button") {
deps = [
":store_client",
":util",
"//ui/webui/resources/js:cr",
]
}
js_library("util") {
deps = [
":constants",
......
......@@ -17,7 +17,7 @@
display: flex;
flex-direction: row;
font-weight: 400;
height: 64px;
height: 48px;
}
#app-title {
......
......@@ -3,6 +3,7 @@
<link rel="import" href="actions.html">
<link rel="import" href="browser_proxy.html">
<link rel="import" href="main_view.html">
<link rel="import" href="router.html">
<link rel="import" href="store_client.html">
<link rel="import" href="store.html">
<link rel="import" href="../../../settings_shared_css.html">
......@@ -15,15 +16,10 @@
<template>
<style include="settings-shared"></style>
<div id="main-container">
<!-- TODO: enable dom-switch after main-view is working -->
<!-- <app-management-dom-switch id="view-selector"
route="[[selectRouteId_(currentPage_, searchTerm_)]]">
<template> -->
<app-management-main-view route-id="main-view">
</app-management-main-view>
<!-- </template>
</app-management-dom-switch> -->
<app-management-main-view>
</app-management-main-view>
</div>
<app-management-router></app-management-router>
</template>
<script src="app_management_page.js"></script>
</dom-module>
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="dom_switch.html">
<link rel="import" href="pwa_permission_view.html">
<link rel="import" href="arc_permission_view.html">
<link rel="import" href="chrome_app_permission_view.html">
<link rel="import" href="../../../settings_shared_css.html">
<dom-module id="app-management-app-permission-view">
<template>
<style include="settings-shared">
</style>
<app-management-dom-switch id="view-selector"
route="[[getSelectedRouteId_(app_)]]">
<template>
<app-management-pwa-permission-view route-id="pwa-permission-view">
</app-management-pwa-permission-view>
<app-management-arc-permission-view route-id="arc-permission-view">
</app-management-arc-permission-view>
<app-management-chrome-app-permission-view
route-id="chrome-app-permission-view">
</app-management-chrome-app-permission-view>
</template>
</app-management-dom-switch>
</template>
<script src="app_permission_view.js"></script>
</dom-module>
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
// TODO(crbug.com/999016): change to app-management-app-detail-view.
is: 'app-management-app-permission-view',
behaviors: [
app_management.StoreClient,
],
properties: {
/**
* @type {App}
* @private
*/
app_: Object,
},
attached: function() {
if (!this.app_) {
const appId = settings.getQueryParameters().get('id');
// TODO(crbug.com/999443): move this changePage call to router.js
this.dispatch(app_management.actions.changePage(PageType.DETAIL, appId));
}
this.watch('app_', state => app_management.util.getSelectedApp(state));
this.watch('currentPage_', state => state.currentPage);
this.updateFromStore();
},
/**
* @private
*/
getSelectedRouteId_: function(app) {
if (!app) {
return;
}
const selectedAppType = app.type;
switch (selectedAppType) {
case (AppType.kWeb):
return 'pwa-permission-view';
case (AppType.kExtension):
return 'chrome-app-permission-view';
case (AppType.kArc):
return 'arc-permission-view';
default:
assertNotReached();
}
},
});
......@@ -2,9 +2,7 @@
<link rel="import" href="browser_proxy.html">
<link rel="import" href="icons.html">
<link rel="import" href="metadata_view.html">
<link rel="import" href="permission_item.html">
<link rel="import" href="permission_view_header.html">
<link rel="import" href="shared_style.html">
<link rel="import" href="store_client.html">
<link rel="import" href="pin_to_shelf_item.html">
......@@ -16,10 +14,7 @@
<style include="app-management-shared-css">
</style>
<app-management-permission-view-header>
</app-management-permission-view-header>
<div class="permission-list card-container">
<div class="permission-list">
<app-management-pin-to-shelf-item
id="pin-to-shelf-setting"
class="permission-card-row separated-row header-text"
......@@ -33,24 +28,24 @@
<div id="permissions-card"
class="permission-card-row"
hidden$="[[!isArcSupported_]]">
<div class="subpermission-list">
<div id="subpermission-expand-row"
class="subpermission-row separated-row"
hidden$="[[!isArcSupported_]]">
<div class="header-text">$i18n{permissions}</div>
</div>
<div id="subpermission-expand-row"
class="permission-section-header"
hidden$="[[!isArcSupported_]]">
<div class="header-text">$i18n{permissions}</div>
</div>
<div class="indented-permission-block">
<app-management-permission-item class="subpermission-row"
icon="cr:location-on"
icon="app-management:location"
permission-label="$i18n{location}"
permission-type="LOCATION">
</app-management-permission-item>
<app-management-permission-item class="subpermission-row"
icon="cr:videocam"
icon="app-management:camera"
permission-label="$i18n{camera}"
permission-type="CAMERA">
</app-management-permission-item>
<app-management-permission-item class="subpermission-row"
icon="cr:mic"
icon="app-management:microphone"
permission-label="$i18n{microphone}"
permission-type="MICROPHONE">
</app-management-permission-item>
......
......@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
// TODO(crbug.com/999016): change to app-management-arc-detail-view.
is: 'app-management-arc-permission-view',
behaviors: [
......
......@@ -9,19 +9,18 @@
<dom-module id="app-management-chrome-app-permission-view">
<template>
<style include="app-management-shared-css">
ul {
list-style: disc inside;
margin: 0;
margin-inline-start: 24px;
padding: 0;
.permission-text-row:first-of-type {
border-top: none;
}
#app-description {
padding: 24px;
padding-bottom: 12px;
padding-top: 24px;
}
#no-permissions {
padding-inline-start: 24px;
border-top: none;
}
#pin-to-shelf-setting {
......@@ -29,10 +28,8 @@
}
</style>
<app-management-permission-view-header>
</app-management-permission-view-header>
<div class="card-container">
<div id="app-description" class="permission-card-row secondary-text">
<div>
<div id="app-description" class="permission-card-row">
[[app_.description]]
</div>
<div class="permission-list">
......@@ -43,29 +40,36 @@
</app-management-pin-to-shelf-item>
<div id="permissions-card" class="permission-card-row">
<div class="subpermission-list">
<div class="subpermission-row separated-row">
<div class="header-text">$i18n{thisAppCan}</div>
</div>
<template is="dom-if" if="[[!hasPermissions_(messages_)]]">
<div id="no-permissions">
<div class="permission-section-header">
<div class="header-text">$i18n{permissions}</div>
</div>
<template is="dom-if" if="[[!hasPermissions_(messages_)]]">
<div id="no-permissions" class="indented-permission-block">
<div class="permission-text-row">
$i18n{appNoPermission}
</div>
</template>
<ul>
<template is="dom-repeat"
items="[[getPermissionMessages_(messages_)]]" as="message">
<li>[[message]]</li>
<ul>
<template is="dom-repeat"
</div>
</template>
<div id="top-level-permissions" class="indented-permission-block">
<template is="dom-repeat"
items="[[getPermissionMessages_(messages_)]]" as="message">
<div class="permission-text-row">
[[message]]
</div>
<div id="second-level-permissions"
class="indented-permission-block">
<template is="dom-repeat"
items="[[getPermissionSubmessagesByMessage_(index, messages_)]]"
as="submessage">
<li>[[submessage]]</li>
</template>
</ul>
</template>
</ul>
<!-- TODO(crbug.com/906508): For apps which are hosted apps but not
<div class="permission-text-row">
[[submessage]]
</div>
</template>
</div>
</template>
</div>
</div>
<!-- TODO(crbug.com/906508): For apps which are hosted apps but not
bookmark apps, this button will actually open the site settings page
corresponding to the app, since hosted apps are not listed in
chrome://extensions.
......@@ -73,19 +77,18 @@
replaced, but in the mean time it might be necessary to change the
text of the button depending on whether or not it is a hosted
app. -->
<!-- TODO:(crbug.com/958269) Change behaviour of "more settings"
based on the app. -->
<div id="more-settings"
class="subpermission-row separated-row clickable"
on-click="onClickExtensionsSettingsButton_"
hidden$="[[app_.hideMoreSettings]]">
<div class="header-text">$i18n{moreSettings}</div>
<!-- TODO:(crbug.com/958269) Change behaviour of "more settings"
based on the app. -->
<div id="more-settings"
class="permission-card-row separated-row header-text clickable"
on-click="onClickExtensionsSettingsButton_">
<div class="header-text">$i18n{moreSettings}</div>
<div class="permission-row-controls">
<cr-icon-button class="native-settings-icon icon-external"
tabindex="0">
</cr-icon-button>
</div>
</div>
</div>
</div>
</template>
<script src="chrome_app_permission_view.js"></script>
......
......@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
// TODO(crbug.com/999016): change to app-management-chrome-app-detail-view.
is: 'app-management-chrome-app-permission-view',
behaviors: [
......
......@@ -30,6 +30,7 @@
* this.$['view-selector'].route = 'view-two';
*/
// TODO(crbug.com/992795) Merge with cr-view-manager.
Polymer({
is: 'app-management-dom-switch',
......@@ -91,6 +92,12 @@ Polymer({
for (const child of children) {
this.children_[child.getAttribute('route-id')] = child;
}
if (this.route) {
// TODO(crbug.com/999523): Add test coverage for this case.
// If attached is called after the route has been set.
this.onRouteChanged_(this.route);
}
},
/**
......
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
<iron-iconset-svg name="app-management" size="24">
<iron-iconset-svg name="app-management" size="20">
<svg>
<!--
These icons are copied from material.io and kept in sorted order.
These icons are custom and kept in sorted order.
See http://goo.gl/Y1OdAq for instructions on adding additional icons.
TODO: move these icons to a generic file when other pages need to use them.
-->
<defs>
<!-- From https://material.io/tools/icons/?icon=account_box&style=baseline -->
<g id="contacts"><path d="M19 3H5c-1.11 0-2 .89-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V5a2 2 0 0 0-2-2zm-7 3c1.65 0 3 1.35 3 3 0 1.66-1.35 3-3 3s-3-1.34-3-3c0-1.65 1.35-3 3-3zm6 12H6v-1c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1z"></path><path fill="none" d="M0 0h24v24H0z"></path></g>
<!-- From https://material.io/tools/icons/?icon=storage&style=baseline -->
<g id="storage"><path d="M2 20h20v-4H2v4zm2-3h2v2H4v-2zM2 4v4h20V4H2zm4 3H4V5h2v2zm-4 7h20v-4H2v4zm2-3h2v2H4v-2z"></path></g>
<g id="contacts" viewBox="0 0 20 20"><rect width="20px" height="20px" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"></rect><path d="M5,14.754629 C6.36959794,13.6567183 8.10810658,13 10,13 C11.8918934,13 13.6304021,13.6567183 15,14.754629 L15,6 L5,6 L5,14.754629 Z M14.153574,16 C13.0272557,15.0633182 11.5794129,14.5 10,14.5 C8.42058712,14.5 6.97274425,15.0633182 5.84642599,16 L14.153574,16 Z M10,12 C8.61928813,12 7.5,10.8807119 7.5,9.5 C7.5,8.11928813 8.61928813,7 10,7 C11.3807119,7 12.5,8.11928813 12.5,9.5 C12.5,10.8807119 11.3807119,12 10,12 Z M10,10.5 C10.5522847,10.5 11,10.0522847 11,9.5 C11,8.94771525 10.5522847,8.5 10,8.5 C9.44771525,8.5 9,8.94771525 9,9.5 C9,10.0522847 9.44771525,10.5 10,10.5 Z M5,4 L15,4 C16.1045695,4 17,4.8954305 17,6 L17,16 C17,17.1045695 16.1045695,18 15,18 L5,18 C3.8954305,18 3,17.1045695 3,16 L3,6 C3,4.8954305 3.8954305,4 5,4 Z" id="Combined-Shape" fill="#5F6368"></path><rect id="Rectangle" fill="#5F6368" x="6" y="2" width="2" height="2"></rect><rect id="Rectangle-Copy" fill="#5F6368" x="12" y="2" width="2" height="2"></rect></g>
<g id="storage" viewBox="0 0 20 20"><rect width="20px" height="20px" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"></rect><path fill="#5F6368" d="M16,5 L12,5 L10,3 L4,3 C2.9,3 2.01,3.9 2.01,5 L2,15 C2,16.1 2.9,17 4,17 L16,17 C17.1,17 18,16.1 18,15 L18,7 C18,5.9 17.1,5 16,5 Z M16,15 L4,15 L4,7 L16,7 L16,15 Z"></path></g>
<g id="location" viewBox="0 0 20 20"><rect width="20px" height="20px" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"></rect><path d="M10,18 C6,13.5424723 4,10.209139 4,8 C4,4.6862915 6.6862915,2 10,2 C13.3137085,2 16,4.6862915 16,8 C16,10.209139 14,13.5424723 10,18 Z M6,8 C6,9.32543171 7.3180021,11.7149155 10,14.9435167 C12.6819979,11.7149155 14,9.32543171 14,8 C14,5.790861 12.209139,4 10,4 C7.790861,4 6,5.790861 6,8 Z M10,10 C8.8954305,10 8,9.1045695 8,8 C8,6.8954305 8.8954305,6 10,6 C11.1045695,6 12,6.8954305 12,8 C12,9.1045695 11.1045695,10 10,10 Z" id="Combined-Shape" fill="#5F6368"></path></g>
<g id="camera" viewBox="0 0 20 20"><rect width="20px" height="20px" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"></rect><path d="M2,5.99539757 C2,5.44565467 2.44851311,5 3.00247329,5 L12.9975267,5 C13.5511774,5 14,5.44910619 14,5.99539757 L14,14.0046024 C14,14.5543453 13.5514869,15 12.9975267,15 L3.00247329,15 C2.44882258,15 2,14.5508938 2,14.0046024 L2,5.99539757 Z M14,8.5 L18,5.5 L18,14.5 L14,12 L14,8.5 Z M4,7 L4,13 L12,13 L12,7 L4,7 Z" id="Combined-Shape" fill="#5F6368"></path></g>
<g id="microphone" viewBox="0 0 20 20"><rect width="20px" height="20px" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"></rect><path d="M12.5628571,9.5 C12.5628571,10.8833333 11.4228571,12 10,12 C8.57714286,12 7.42857143,10.8833333 7.42857143,9.5 L7.42857143,4.5 C7.42857143,3.11666667 8.57714286,2 10,2 C11.4228571,2 12.5714286,3.11666667 12.5714286,4.5 L12.5628571,9.5 Z M10.0548096,3.5 C9.5012628,3.5 9.05131398,3.94643954 9.04697987,4.49996935 L9.0078297,9.50003065 C9.00780942,9.50262015 9.00779929,9.50520971 9.00779929,9.50779929 C9.00779929,10.0557766 9.45202268,10.5 10,10.5 C10.5535468,10.5 11.0034956,10.0535605 11.0078297,9.50003065 L11.0469799,4.49996935 C11.0470001,4.49737985 11.0470103,4.49479029 11.0470103,4.49220071 C11.0470103,3.94422339 10.6027869,3.5 10.0548096,3.5 Z M10,13.8736842 C7.63428571,13.8736842 5.45714286,12.1052632 5.45714286,9.57894737 L4,9.57894737 C4,12.4589474 6.33142857,14.8252632 9.14285714,15.2378947 L9.14285714,18 L10.8571429,18 L10.8571429,15.2378947 C13.6685714,14.8336842 16,12.4589474 16,9.57894737 L14.5428571,9.57894737 C14.5428571,12.1052632 12.3657143,13.8736842 10,13.8736842 Z" fill="#5F6368"></path></g>
</defs>
</svg>
</iron-iconset-svg>
<link rel="import" href="chrome://resources/html/polymer.html">
<link rel="import" href="browser_proxy.html">
<link rel="import" href="metadata_view.html">
<link rel="import" href="icons.html">
<link rel="import" href="permission_item.html">
<link rel="import" href="permission_view_header.html">
<link rel="import" href="pin_to_shelf_item.html">
<link rel="import" href="shared_style.html">
<link rel="import" href="store_client.html">
<link rel="import" href="pin_to_shelf_item.html">
<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
<link rel="import" href="chrome://resources/cr_elements/icons.html">
......@@ -14,11 +13,7 @@
<template>
<style include="app-management-shared-css">
</style>
<app-management-permission-view-header>
</app-management-permission-view-header>
<div class="permission-list card-container">
<div class="permission-list">
<app-management-pin-to-shelf-item
id="pin-to-shelf-setting"
class="permission-card-row separated-row header-text"
......@@ -30,33 +25,34 @@
permission-type="CONTENT_SETTINGS_TYPE_NOTIFICATIONS">
</app-management-permission-item>
<div id="permissions-card" class="permission-card-row">
<div class="subpermission-list">
<div class="subpermission-row separated-row">
<div class="header-text">$i18n{permissions}</div>
</div>
<div class="permission-section-header">
<div class="header-text">$i18n{permissions}</div>
</div>
<div class="indented-permission-block">
<app-management-permission-item id="location"
class="subpermission-row" icon="cr:location-on"
class="subpermission-row" icon="app-management:location"
permission-label="$i18n{location}"
permission-type="CONTENT_SETTINGS_TYPE_GEOLOCATION">
</app-management-permission-item>
<app-management-permission-item id="camera" class="subpermission-row"
icon="cr:videocam" permission-label="$i18n{camera}"
icon="app-management:camera" permission-label="$i18n{camera}"
permission-type="CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA">
</app-management-permission-item>
<app-management-permission-item id="microphone"
class="subpermission-row" icon="cr:mic"
class="subpermission-row" icon="app-management:microphone"
permission-label="$i18n{microphone}"
permission-type="CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC">
</app-management-permission-item>
<div class="subpermission-row separated-row clickable"
on-click="onClickSiteSettingsButton_">
<div class="header-text">$i18n{moreSettings}</div>
<div class="permission-row-controls">
<cr-icon-button class="native-settings-icon icon-external"
tabindex="0">
</cr-icon-button>
</div>
</div>
</div>
</div>
<div id="more-settings"
class="permission-card-row separated-row header-text clickable"
on-click="onClickSiteSettingsButton_">
<div class="header-text">$i18n{moreSettings}</div>
<div class="permission-row-controls">
<cr-icon-button class="native-settings-icon icon-external"
tabindex="0">
</cr-icon-button>
</div>
</div>
</div>
......
......@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
// TODO(crbug.com/999016): change to app-management-pwa-detail-view.
is: 'app-management-pwa-permission-view',
behaviors: [
......
......@@ -3,15 +3,9 @@
<link rel="import" href="actions.html">
<link rel="import" href="store_client.html">
<link rel="import" href="constants.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-location/iron-location.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-location/iron-query-params.html">
<dom-module id="app-management-router">
<template>
<iron-location id="iron-location" query="{{urlQuery_}}" path="{{path_}}">
</iron-location>
<iron-query-params params-string="{{query_}}"
params-object="{{queryParams_}}"></iron-query-params>
</template>
<script src="router.js"></script>
</dom-module>
......@@ -8,155 +8,35 @@ Polymer({
behaviors: [
app_management.StoreClient,
],
//TODO (crbug.com/999443): Watch URL and update state.
properties: {
/** @private {string} */
path_: String,
/** @private {Object} */
queryParams_: Object,
/** @private {string} */
query_: {
type: String,
observer: 'onQueryChanged_',
},
/** @private {string} */
urlQuery_: {
type: String,
observer: 'onUrlQueryChanged_',
},
/** @private */
searchTerm_: {
type: String,
value: '',
},
/** @private {PageType} */
currentPageType_: {
type: Number,
},
/** @private {?string} */
selectedAppId_: {
type: String,
currentPage_: {
type: Object,
observer: 'onCurrentPageChanged_',
},
},
urlParsed_: false,
observers: [
'onUrlChanged_(path_, queryParams_)',
'onStateChanged_(currentPageType_, selectedAppId_, searchTerm_)',
],
attached: function() {
this.watch('currentPageType_', (state) => {
return state.currentPage.pageType;
});
this.watch('selectedAppId_', (state) => {
return state.currentPage.selectedAppId;
});
this.watch('searchTerm_', (state) => {
return state.search.term;
this.watch('currentPage_', state => {
return state.currentPage;
});
this.updateFromStore();
},
/**
* @param {?string} current Current value of the query.
* @param {?string} previous Previous value of the query.
* @private
*/
onQueryChanged_: function(current, previous) {
if (previous !== undefined) {
this.urlQuery_ = this.query_;
}
},
/** @private */
onUrlQueryChanged_: function() {
this.query_ = this.urlQuery_;
},
/** @private */
onStateChanged_: function() {
if (!this.urlParsed_) {
return;
onCurrentPageChanged_: function() {
const pageType = this.currentPage_.pageType;
const appId = this.currentPage_.selectedAppId;
switch(pageType) {
case PageType.DETAIL:
const params = new URLSearchParams;
params.append('id', appId);
settings.navigateTo(settings.routes.APP_MANAGEMENT_DETAIL, params);
return;
case PageType.MAIN:
settings.navigateTo(settings.routes.APP_MANAGEMENT);
return;
default:
assertNotReached();
}
this.debounce('publishUrl', this.publishUrl_);
},
/** @private */
publishUrl_: function() {
// Disable pushing urls into the history stack, so that we only push one
// state.
this.$['iron-location'].dwellTime = Infinity;
this.publishQueryParams_();
// Re-enable pushing urls into the history stack.
this.$['iron-location'].dwellTime = 0;
this.publishPath_();
},
/** @private */
publishQueryParams_: function() {
const newQueryParams = Object.assign({}, this.queryParams_);
newQueryParams.q = this.searchTerm_ || undefined;
newQueryParams.id = this.selectedAppId_ || undefined;
// Can't update |this.queryParams_| every time since assigning a new object
// to it triggers a state change which causes the URL to change, which
// recurses into a loop. JSON.stringify is used here to compare objects as
// it is always going to be a key value (string) pair and will serialize
// correctly.
if (JSON.stringify(newQueryParams) !== JSON.stringify(this.queryParams_)) {
this.queryParams_ = newQueryParams;
}
},
/** @private */
publishPath_: function() {
let path = '';
if (this.currentPageType_ === PageType.DETAIL) {
path = 'detail';
} else if (this.currentPageType_ === PageType.NOTIFICATIONS) {
path = 'notifications';
}
this.path_ = '/' + path;
},
/** @private */
onUrlChanged_: function() {
this.debounce('parseUrl', this.parseUrl_);
},
/** @private */
parseUrl_: function() {
const newId = this.queryParams_.id;
const searchTerm = this.queryParams_.q;
const pageFromUrl = this.path_.substr(1).split('/')[0];
let newPage = PageType.MAIN;
if (pageFromUrl === 'detail') {
newPage = PageType.DETAIL;
} else if (pageFromUrl === 'notifications') {
newPage = PageType.NOTIFICATIONS;
} else {
newPage = PageType.MAIN;
}
if (newPage === PageType.DETAIL) {
this.dispatch(app_management.actions.changePage(PageType.DETAIL, newId));
} else {
this.dispatch(app_management.actions.changePage(newPage));
}
if (searchTerm) {
this.dispatch(app_management.actions.setSearchTerm(searchTerm));
}
this.urlParsed_ = true;
},
}
});
......@@ -30,7 +30,21 @@
.permission-card-row {
border-top: var(--card-separator);
padding: 0 24px;
padding: 0 20px;
}
.permission-text-row {
border-top: var(--card-separator);
display: flex;
flex-direction: column;
height: var(--text-permission-list-row-height);
justify-content: center;
}
.permission-section-header {
line-height: 20px;
padding-bottom: 12px;
padding-top: 24px;
}
.clickable {
......@@ -69,13 +83,6 @@
height: 48px;
}
.subpermission-list {
align-items: stretch;
display: flex;
flex-direction: column;
padding: 8px 0;
}
.secondary-text {
color: var(--secondary-text-color);
font-weight: var(--secondary-font-weight);
......@@ -109,5 +116,9 @@
overflow: hidden;
text-overflow: ellipsis;
}
.indented-permission-block {
padding-inline-start: 36px;
}
</style>
</template>
......@@ -16,8 +16,9 @@
--header-font-weight: 500;
--header-text-color: #5A5A5A;
--permission-icon-color: #757575;
--permission-icon-padding: 12px;
--permission-icon-padding: 20px;
--permission-list-item-height: 64px;
--text-permission-list-row-height: 40px;
--primary-text-color: rgba(0, 0, 0, 0.87);
--row-item-icon-padding: 12px;
--secondary-font-weight: 400;
......
......@@ -2,38 +2,11 @@
<link rel="import" href="shared_style.html">
<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
<dom-module id="app-management-permission-view-header">
<dom-module id="app-management-uninstall-button">
<template>
<style include="app-management-shared-css">
:host {
align-items: center;
display: flex;
margin: 24px auto;
max-width: var(--card-max-width);
min-width: var(--card-min-width);
}
#permission-view-header-icon {
height: 26px;
margin-inline-end: 8px;
margin-inline-start: 24px;
width: 26px;
}
#app-title {
flex: 1;
font-size: 16px;
overflow: hidden;
text-overflow: ellipsis;
}
cr-icon-button {
margin: 0;
}
#uninstall-button {
background: white;
}
......@@ -43,20 +16,17 @@
margin-inline-end: 12px;
}
</style>
<cr-icon-button class="icon-arrow-back" id="backButton"
on-click="onClickBackButton_" aria-label="$i18n{back}"></cr-icon-button>
<img id="permission-view-header-icon" src="[[iconUrlFromId_(app_)]]">
<div class="page-title">[[app_.title]]</div>
<!-- TODO(crbug.com/999632): rename polymer element IDs to camel case. -->
<div id="uninstall-wrapper" title$="[[getUninstallButtonHoverText_(app_)]]">
<template is="dom-if" if="[[isPolicyApp_(app_)]]">
<iron-icon id="policy-indicator" icon="cr:domain"></iron-icon>
</template>
<cr-button id="uninstall-button" on-click="onClickUninstallButton_"
disabled$="[[getUninstallButtonDisableState_(app_)]]">
<!-- TODO(crbug.com/999636) rename uninstall to uninstallApp.-->
$i18n{uninstall}
</cr-button>
</div>
</template>
<script src="permission_view_header.js"></script>
<script src="uninstall_button.js"></script>
</dom-module>
// Copyright 2018 The Chromium Authors. All rights reserved.
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
Polymer({
is: 'app-management-permission-view-header',
is: 'app-management-uninstall-button',
behaviors: [
app_management.StoreClient,
],
properties: {
/** @type {App} */
app_: {
type: Object,
},
/**
* @private {App}
*/
app_: Object,
},
attached: function() {
......@@ -21,12 +22,11 @@ Polymer({
},
/**
*
* Returns True if the uninstall button should be disabled due to app install
* type.
*
* @param {App} app
* @return {boolean}
* @return {?boolean}
* @private
*/
getUninstallButtonDisableState_: function(app) {
......@@ -49,11 +49,11 @@ Polymer({
* Returns string to be shown as a tool tip over the uninstall button.
*
* @param {App} app
* @return {string}
* @return {?string}
* @private
*/
getUninstallButtonHoverText_: function(app) {
// TODO(crbug.com/957795) Replace strings and add them into i18n.
// TODO(crbug.com/957795): Replace strings and add them into i18n.
switch (app.installSource) {
case InstallSource.kSystem:
return app.title + ' cannot be uninstalled as it is part of Chrome OS.';
......@@ -75,33 +75,13 @@ Polymer({
* Returns true if the app was installed by a policy
*
* @param {App} app
* @returns {boolean}
* @returns {?boolean}
* @private
*/
isPolicyApp_: function(app) {
return app.installSource === InstallSource.kPolicy;
},
/**
* @param {App} app
* @return {string}
* @private
*/
iconUrlFromId_: function(app) {
return app_management.util.getAppIcon(app);
},
/**
* @private
*/
onClickBackButton_: function() {
if (!window.history.state) {
this.dispatch(app_management.actions.changePage(PageType.MAIN));
} else {
window.history.back();
}
},
/**
* @private
*/
......
......@@ -2,6 +2,8 @@
<link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html">
<link rel="import" href="app_management_page/app_management_page.html">
<link rel="import" href="app_management_page/app_permission_view.html">
<link rel="import" href="app_management_page/uninstall_button.html">
<link rel="import" href="../../route.html">
<link rel="import" href="../../settings_shared_css.html">
......@@ -24,6 +26,16 @@
</settings-app-management-page>
</settings-subpage>
</template>
<template is="dom-if" route-path="/app-management/detail" no-search>
<settings-subpage
page-title="[[app_.title]]"
title-icon="[[iconUrlFromId_(app_)]]">
<app-management-uninstall-button slot="subpage-title-extra">
</app-management-uninstall-button>
<app-management-app-permission-view>
</app-management-app-permission-view>
</settings-subpage>
</template>
</settings-animated-pages>
</template>
<script src="os_apps_page.js"></script>
......
......@@ -10,6 +10,10 @@
Polymer({
is: 'os-settings-apps-page',
behaviors: [
app_management.StoreClient,
],
properties: {
/** @private {!Map<string, string>} */
focusConfig_: {
......@@ -23,6 +27,24 @@ Polymer({
},
},
/**
* @type {App}
* @private
*/
app_: Object,
},
attached: function() {
this.watch('app_', state => app_management.util.getSelectedApp(state));
},
/**
* @param {App} app
* @return {string}
* @private
*/
iconUrlFromId_: function(app) {
return app_management.util.getAppIcon(app);
},
/** @private */
......
......@@ -103,6 +103,75 @@
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_API_LISTENER_HTML"
file="chromeos/os_apps_page/app_management_page/api_listener.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_DOM_SWITCH_JS"
file="chromeos/os_apps_page/app_management_page/dom_switch.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_DOM_SWITCH_HTML"
file="chromeos/os_apps_page/app_management_page/dom_switch.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PWA_PERMISSION_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/pwa_permission_view.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PWA_PERMISSION_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/pwa_permission_view.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PERMISSION_ITEM_JS"
file="chromeos/os_apps_page/app_management_page/permission_item.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PERMISSION_ITEM_HTML"
file="chromeos/os_apps_page/app_management_page/permission_item.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PERMISSION_TOGGLE_JS"
file="chromeos/os_apps_page/app_management_page/permission_toggle.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PERMISSION_TOGGLE_HTML"
file="chromeos/os_apps_page/app_management_page/permission_toggle.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PIN_TO_SHELF_ITEM_JS"
file="chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_PIN_TO_SHELF_ITEM_HTML"
file="chromeos/os_apps_page/app_management_page/pin_to_shelf_item.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_TOGGLE_ROW_JS"
file="chromeos/os_apps_page/app_management_page/toggle_row.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_TOGGLE_ROW_HTML"
file="chromeos/os_apps_page/app_management_page/toggle_row.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_PERMISSION_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/app_permission_view.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_PERMISSION_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/app_permission_view.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ARC_PERMISSION_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/arc_permission_view.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ARC_PERMISSION_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/arc_permission_view.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_CHROME_APP_PERMISSION_VIEW_JS"
file="chromeos/os_apps_page/app_management_page/chrome_app_permission_view.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_CHROME_APP_PERMISSION_VIEW_HTML"
file="chromeos/os_apps_page/app_management_page/chrome_app_permission_view.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ROUTER_JS"
file="chromeos/os_apps_page/app_management_page/router.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ROUTER_HTML"
file="chromeos/os_apps_page/app_management_page/router.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_ICONS_HTML"
file="chromeos/os_apps_page/app_management_page/icons.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_UNINSTALL_BUTTON_JS"
file="chromeos/os_apps_page/app_management_page/uninstall_button.js"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_APP_MANAGEMENT_PAGE_APP_UNINSTALL_BUTTON_HTML"
file="chromeos/os_apps_page/app_management_page/uninstall_button.html"
type="chrome_html" />
<structure name="IDR_OS_SETTINGS_MANAGE_A11Y_PAGE_JS"
file="a11y_page/manage_a11y_page.js"
type="chrome_html" />
......
......@@ -526,6 +526,8 @@ cr.define('settings', function() {
loadTimeData.getBoolean('showApps')) {
r.APPS = r.BASIC.createSection('/apps', 'apps');
r.APP_MANAGEMENT = r.APPS.createChild('/app-management');
r.APP_MANAGEMENT_DETAIL =
r.APP_MANAGEMENT.createChild('/app-management/detail');
}
} else {
assert(r.ADVANCED, 'ADVANCED route should exist');
......
......@@ -42,7 +42,8 @@ suite('<app-management-managed-apps>', () => {
await test_util.flushTasks();
});
test('Uninstall button affected by policy', () => {
// TODO(crbug.com/999412): rewrite test.
test.skip('Uninstall button affected by policy', () => {
const uninstallWrapper =
appDetailView.$$('app-management-permission-view-header')
.$$('#uninstall-wrapper');
......
......@@ -20,7 +20,7 @@ GEN('#else');
GEN('#define MAYBE_AllJsTests AllJsTests');
GEN('#endif');
// Generic text fixture for CrOS Polymer Settings elements to be overridden by
// Generic test fixture for CrOS Polymer Settings elements to be overridden by
// individual element tests.
const OSSettingsBrowserTest = class extends PolymerTest {
/** @override */
......@@ -143,12 +143,19 @@ TEST_F('OSSettingsAndroidAppsPageTest', 'DISABLED_AllJsTests', () => {
mocha.run();
});
// Test fixture for the app management settings page.
// eslint-disable-next-line no-var
var OSSettingsAppManagementPageTest = class extends OSSettingsBrowserTest {
// Generic test fixture for CrOS Polymer App Management elements to be
// overridden by individual element tests.
const OSSettingsAppManagementBrowserTest = class extends OSSettingsBrowserTest {
/** @override */
get browsePreload() {
return super.browsePreload + 'app_management/app_management_page.html';
return super.browsePreload + 'os_apps_page.html';
}
/** @override */
get featureList() {
return {
enabled: super.featureList.enabled.concat(['features::kAppManagement'])
};
}
/** @override */
......@@ -158,18 +165,29 @@ var OSSettingsAppManagementPageTest = class extends OSSettingsBrowserTest {
BROWSER_SETTINGS_PATH + '../test_store.js',
'app_management/test_util.js',
'app_management/test_store.js',
'app_management/app_management_page_tests.js',
]);
}
/** @override */
get featureList() {
return {enabled: ['features::kAppManagement']};
get runAccessibilityChecks() {
return true;
}
};
// Test fixture for the app management settings page.
// eslint-disable-next-line no-var
var OSSettingsAppManagementPageTest =
class extends OSSettingsAppManagementBrowserTest {
/** @override */
get runAccessibilityChecks() {
return true;
get browsePreload() {
return super.browsePreload + 'app_management/app_management_page.html';
}
/** @override */
get extraLibraries() {
return super.extraLibraries.concat([
'app_management/app_management_page_tests.js',
]);
}
};
......@@ -177,6 +195,90 @@ TEST_F('OSSettingsAppManagementPageTest', 'AllJsTests', () => {
mocha.run();
});
// Test fixture for the app management pwa permission view element.
// eslint-disable-next-line no-var
var OSSettingsAppManagementPwaPermissionViewTest =
class extends OSSettingsAppManagementBrowserTest {
/** @override */
get browsePreload() {
return super.browsePreload + 'app_management/pwa_permission_view.html';
}
/** @override */
get extraLibraries() {
return super.extraLibraries.concat([
'app_management/pwa_permission_view_test.js',
]);
}
};
TEST_F(
'OSSettingsAppManagementPwaPermissionViewTest', 'DISABLED_AllJsTests',
() => {
mocha.run();
});
// Test fixture for the app management arc permission view element.
// eslint-disable-next-line no-var
var OSSettingsAppManagementArcPermissionViewTest =
class extends OSSettingsAppManagementBrowserTest {
/** @override */
get browsePreload() {
return super.browsePreload + 'app_management/arc_permission_view.html';
}
/** @override */
get extraLibraries() {
return super.extraLibraries.concat([
'app_management/arc_permission_view_test.js',
]);
}
};
TEST_F(
'OSSettingsAppManagementArcPermissionViewTest', 'DISABLED_AllJsTests',
() => {
mocha.run();
});
// Test fixture for the app management managed app view.
// eslint-disable-next-line no-var
var OSSettingsAppManagementManagedAppTest =
class extends OSSettingsAppManagementBrowserTest {
/** @override */
get browsePreload() {
return super.browsePreload + 'app_management/pwa_permission_view.html';
}
/** @override */
get extraLibraries() {
return super.extraLibraries.concat([
'app_management/managed_apps_test.js',
]);
}
};
TEST_F('OSSettingsAppManagementManagedAppTest', 'AllJsTests', () => {
mocha.run();
});
// Test fixture for the app management reducers.
// eslint-disable-next-line no-var
var OSSettingsAppManagementReducersTest =
class extends OSSettingsAppManagementBrowserTest {
/** @override */
get extraLibraries() {
return super.extraLibraries.concat([
'app_management/reducers_test.js',
]);
}
};
TEST_F('OSSettingsAppManagementReducersTest', 'DISABLED_AllJsTests', () => {
mocha.run();
});
// Tests for the Device page.
// eslint-disable-next-line no-var
var OSSettingsBluetoothPageTest = class extends OSSettingsBrowserTest {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment