[pwas]: Add user setting for opening in tabbed mode (#28659)

This commit is contained in:
Jay Harris
2025-04-29 14:44:35 +12:00
committed by GitHub
parent 10020fd079
commit 373371b7a4
9 changed files with 185 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<grit-part>
<!-- supplemental strings for the upstream app_management strings -->
<message name="IDS_APP_MANAGEMENT_OPEN_MODE" desc="Label for changing open mode.">
Open mode
</message>
<message name="IDS_APP_MANAGEMENT_TABBED_WINDOW" desc="Label for opening the PWA in a new tabbed PWA window.">
Open as tabbed window
</message>
<message name="IDS_APP_MANAGEMENT_BROWSER" desc="Label for opening the PWA in a new browser tab.">
Open in browser
</message>
</grit-part>
+3
View File
@@ -172,6 +172,9 @@
<!-- Brave Settings WebUI strings -->
<part file="brave_settings_strings.grdp" />
<!-- Brave App Management strings -->
<part file="brave_app_management.grdp" />
<!--Add new items to the appropriate sections below -->
<!-- App Menu -->
+1
View File
@@ -266,6 +266,7 @@ TEST(FeatureDefaultsTest, EnabledFeatures) {
&blink::features::kReduceUserAgentMinorVersion,
&blink::features::kUACHOverrideBlank,
&features::kCertificateTransparencyAskBeforeEnabling,
&features::kDesktopPWAsTabStripSettings,
#if !BUILDFLAG(IS_ANDROID)
&features::kLocationProviderManager,
#endif
@@ -0,0 +1,23 @@
// Copyright (c) 2025 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
import { mangle } from 'lit_mangler';
mangle((element) => {
const toggleRow = element.querySelector('app-management-toggle-row')
if (!toggleRow) {
throw new Error('[Brave App Settings] Could not find app-management-toggle-row. Maybe upstream has changed to a radio button?')
}
toggleRow.outerHTML = `<div ?hidden=\${this.app.hideWindowMode}>
<div class="permission-section-header">
<div class="header-text">$i18n{appManagementOpenModeLabel}</div>
</div>
<div class="permission-list indented-permission-block">
\${this.windowModes.map(mode => html\`<leo-radiobutton class="subpermission-row" name="window-mode" @change=\${this.onChange} value="\${mode.value}" currentValue=\${this.app.windowMode}>
\${mode.label}
</leo-radiobutton>\`)}
</div>
</div>`
}, t => t.text.includes('id="toggle-row"'))
@@ -0,0 +1,83 @@
// Copyright (c) 2025 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
import type { App } from '//resources/cr_components/app_management/app_management.mojom-webui.js';
import { CrLitElement, css } from '//resources/lit/v3_0/lit.rollup.js';
import { getCss } from './app_management_shared_style.css.js';
import { createDummyApp } from './web_app_settings_utils.js';
import { getHtml } from './window_mode_item.html.js';
import { loadTimeData } from '//resources/js/load_time_data.js';
import { BrowserProxy } from '//resources/cr_components/app_management/browser_proxy.js';
import { WindowMode } from '//resources/cr_components/app_management/constants.js';
export class WindowModeItemElement extends CrLitElement {
static get is() {
return 'app-management-window-mode-item';
}
static override get styles() {
return [
getCss(),
css`
:host > div {
width: 100%;
}
leo-radiobutton {
display: flex;
}
`
];
}
override render() {
return getHtml.bind(this)();
}
static override get properties() {
return {
windowModeLabel: { type: String },
app: { type: Object },
};
}
get tabStripSettingsEnabled_(): boolean {
return loadTimeData.getBoolean('isPWAsTabStripSettingsEnabled');
}
get windowModes() {
return [
{
label: loadTimeData.getString('appManagementWindowModeLabel'),
value: WindowMode.kWindow,
},
{
label: loadTimeData.getString('appManagementBrowserModeLabel'),
value: WindowMode.kBrowser,
},
...this.tabStripSettingsEnabled_ ? [{
label: loadTimeData.getString('appManagementTabbedWindowModeLabel'),
value: WindowMode.kTabbedWindow,
}] : [],
]
}
accessor windowModeLabel: string = '';
accessor app: App = createDummyApp();
onChange(e: { value: string }) {
BrowserProxy.getInstance().handler.setWindowMode(this.app.id, parseInt(e.value) as WindowMode);
}
}
declare global {
interface HTMLElementTagNameMap {
'app-management-window-mode-item': WindowModeItemElement;
}
}
customElements.define(WindowModeItemElement.is, WindowModeItemElement);
@@ -0,0 +1,31 @@
// Copyright (c) 2025 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
#include "chrome/browser/ui/webui/app_settings/web_app_settings_ui.h"
#include "base/feature_list.h"
#include "chrome/common/chrome_features.h"
#include "content/public/browser/web_ui_data_source.h"
#include "ui/webui/webui_util.h"
#define SetupWebUIDataSource(...) \
SetupWebUIDataSource(__VA_ARGS__); \
html_source->AddBoolean( \
"isPWAsTabStripSettingsEnabled", \
base::FeatureList::IsEnabled(features::kDesktopPWAsTabStripSettings))
#define AddLocalizedStrings(...) \
AddLocalizedStrings(__VA_ARGS__); \
html_source->AddLocalizedString("appManagementTabbedWindowModeLabel", \
IDS_APP_MANAGEMENT_TABBED_WINDOW); \
html_source->AddLocalizedString("appManagementBrowserModeLabel", \
IDS_APP_MANAGEMENT_BROWSER); \
html_source->AddLocalizedString("appManagementOpenModeLabel", \
IDS_APP_MANAGEMENT_OPEN_MODE)
#include "src/chrome/browser/ui/webui/app_settings/web_app_settings_ui.cc"
#undef AddLocalizedStrings
#undef SetupWebUIDataSource
@@ -13,6 +13,7 @@ namespace features {
OVERRIDE_FEATURE_DEFAULT_STATES({{
{kChromeStructuredMetrics, base::FEATURE_DISABLED_BY_DEFAULT},
{kDesktopPWAsTabStripSettings, base::FEATURE_ENABLED_BY_DEFAULT},
{kHttpsFirstBalancedMode, base::FEATURE_DISABLED_BY_DEFAULT},
{kKAnonymityService, base::FEATURE_DISABLED_BY_DEFAULT},
{kKAnonymityServiceOHTTPRequests, base::FEATURE_DISABLED_BY_DEFAULT},
@@ -1,5 +1,34 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`mangled files should have up to date snapshots ./chromium_src/chrome/browser/resources/app_settings/window_mode_item.html.ts.lit_mangler.ts should match snapshot 1`] = `
"===================================================================
--- ../chrome/browser/resources/app_settings/window_mode_item.html.ts
+++ gen/chrome/browser/resources/app_settings/preprocessed/window_mode_item.html.ts
@@ -3,11 +3,16 @@
import type {WindowModeItemElement} from './window_mode_item.js';
export function getHtml(this: WindowModeItemElement) {
return html\`<!--_html_template_start_-->
-<app-management-toggle-row
- id=\\"toggle-row\\"
- label=\\"\${this.windowModeLabel}\\"
- ?value=\\"\${this.getValue_()}\\">
-</app-management-toggle-row>
+<div ?hidden=\\"\${this.app.hideWindowMode}\\">
+ <div class=\\"permission-section-header\\">
+ <div class=\\"header-text\\">$i18n{appManagementOpenModeLabel}</div>
+ </div>
+ <div class=\\"permission-list indented-permission-block\\">
+ \${this.windowModes.map(mode => html\`<leo-radiobutton class=\\"subpermission-row\\" name=\\"window-mode\\" @change=\\"\${this.onChange}\\" value=\\"\${mode.value}\\" currentvalue=\\"\${this.app.windowMode}\\">
+ \${mode.label}
+ </leo-radiobutton>\`)}
+ </div>
+ </div>
<!--_html_template_end_-->\`;
}
"
`;
exports[`mangled files should have up to date snapshots ./chromium_src/chrome/browser/resources/extensions/detail_view.html.ts.lit_mangler.ts should match snapshot 1`] = `
"===================================================================
--- ../chrome/browser/resources/extensions/detail_view.html.ts
+1
View File
@@ -16,6 +16,7 @@ import '@brave/leo/web-components/progressRing'
import '@brave/leo/web-components/textarea'
import '@brave/leo/web-components/toggle'
import '@brave/leo/web-components/tooltip'
import '@brave/leo/web-components/radioButton'
import { setIconBasePath } from '@brave/leo/web-components/icon'
import iconsMeta from '@brave/leo/icons/meta'