[pwas]: Add user setting for opening in tabbed mode (#28659)
This commit is contained in:
@@ -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>
|
||||
@@ -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 -->
|
||||
|
||||
@@ -266,6 +266,7 @@ TEST(FeatureDefaultsTest, EnabledFeatures) {
|
||||
&blink::features::kReduceUserAgentMinorVersion,
|
||||
&blink::features::kUACHOverrideBlank,
|
||||
&features::kCertificateTransparencyAskBeforeEnabling,
|
||||
&features::kDesktopPWAsTabStripSettings,
|
||||
#if !BUILDFLAG(IS_ANDROID)
|
||||
&features::kLocationProviderManager,
|
||||
#endif
|
||||
|
||||
+23
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user