Commit 98bb5888 authored by James Hawkins's avatar James Hawkins Committed by Commit Bot

OS Settings: Read and display the device name from the DeviceNameStore.

Bug: 126802
Test: OSSettingsAboutPage*
Test: DeviceNameHandlerTest.*
Change-Id: I4c16cb932ecbbf03f66cdec32ff72b77ff5f30e9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2528637
Commit-Queue: James Hawkins <jhawkins@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827939}
parent 286f02c7
......@@ -3887,6 +3887,7 @@ source_set("unit_tests") {
"../ui/webui/settings/chromeos/ambient_mode_handler_unittest.cc",
"../ui/webui/settings/chromeos/calculator/size_calculator_test_api.h",
"../ui/webui/settings/chromeos/device_keyboard_handler_unittest.cc",
"../ui/webui/settings/chromeos/device_name_handler_unittest.cc",
"../ui/webui/settings/chromeos/device_storage_handler_unittest.cc",
"../ui/webui/settings/chromeos/internet_handler_unittest.cc",
"../ui/webui/settings/chromeos/multidevice_handler_unittest.cc",
......
......@@ -346,6 +346,7 @@ preprocess_grit("preprocess_gen_v3") {
"chromeos/on_startup_page/on_startup_page.m.js",
"chromeos/os_about_page/channel_switcher_dialog.m.js",
"chromeos/os_about_page/detailed_build_info.m.js",
"chromeos/os_about_page/device_name_browser_proxy.m.js",
"chromeos/os_about_page/edit_hostname_dialog.m.js",
"chromeos/os_about_page/os_about_page.m.js",
"chromeos/os_about_page/update_warning_dialog.m.js",
......@@ -679,6 +680,8 @@ preprocess_grit("preprocess_v2") {
"chromeos/os_about_page/channel_switcher_dialog.js",
"chromeos/os_about_page/detailed_build_info.html",
"chromeos/os_about_page/detailed_build_info.js",
"chromeos/os_about_page/device_name_browser_proxy.html",
"chromeos/os_about_page/device_name_browser_proxy.js",
"chromeos/os_about_page/edit_hostname_dialog.html",
"chromeos/os_about_page/edit_hostname_dialog.js",
"chromeos/os_about_page/os_about_page.html",
......
......@@ -3,19 +3,27 @@
# found in the LICENSE file.
import("//third_party/closure_compiler/compile_js.gni")
import("//ui/webui/resources/tools/js_modulizer.gni")
import("../os_settings.gni")
js_type_check("closure_compile") {
deps = [
":channel_switcher_dialog",
":detailed_build_info",
":device_name_browser_proxy",
":edit_hostname_dialog",
":os_about_page",
]
}
js_library("device_name_browser_proxy") {
deps = [ "//ui/webui/resources/js:cr" ]
externs_list = [ "$externs_path/chrome_send.js" ]
}
js_library("os_about_page") {
deps = [
":device_name_browser_proxy",
"..:deep_linking_behavior",
"..:metrics_recorder",
"..:os_route",
......@@ -67,6 +75,7 @@ js_type_check("closure_compile_module") {
deps = [
":channel_switcher_dialog.m",
":detailed_build_info.m",
":device_name_browser_proxy.m",
":edit_hostname_dialog.m",
":os_about_page.m",
":update_warning_dialog.m",
......@@ -100,6 +109,13 @@ js_library("detailed_build_info.m") {
extra_deps = [ ":detailed_build_info_module" ]
}
js_library("device_name_browser_proxy.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/device_name_browser_proxy.m.js" ]
deps = [ "//ui/webui/resources/js:cr.m" ]
externs_list = [ "$externs_path/chrome_send.js" ]
extra_deps = [ ":modulize" ]
}
js_library("edit_hostname_dialog.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/edit_hostname_dialog.m.js" ]
deps = [
......@@ -114,6 +130,7 @@ js_library("edit_hostname_dialog.m") {
js_library("os_about_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.m.js" ]
deps = [
":device_name_browser_proxy.m",
"..:deep_linking_behavior.m",
"..:os_route.m",
"../..:i18n_setup",
......@@ -147,6 +164,7 @@ group("polymer3_elements") {
":channel_switcher_dialog_module",
":detailed_build_info_module",
":edit_hostname_dialog_module",
":modulize",
":os_about_page_module",
":update_warning_dialog_module",
]
......@@ -196,3 +214,7 @@ polymer_modulizer("update_warning_dialog") {
namespace_rewrites = os_settings_namespace_rewrites
auto_imports = os_settings_auto_imports
}
js_modulizer("modulize") {
input_files = [ "device_name_browser_proxy.js" ]
}
......@@ -14,6 +14,7 @@
<link rel="import" href="../localized_link/localized_link.html">
<link rel="import" href="../os_route.html">
<link rel="import" href="channel_switcher_dialog.html">
<link rel="import" href="device_name_browser_proxy.html">
<link rel="import" href="edit_hostname_dialog.html">
<dom-module id="settings-detailed-build-info">
......@@ -70,8 +71,8 @@
<div class="settings-box two-line">
<div class="start">
<div role="heading">$i18n{aboutDeviceName}</div>
<div aria-hidden="true" class="secondary">
ChromeOS-102938
<div id="deviceName" aria-hidden="true" class="secondary">
[[deviceNameText_]]
</div>
</div>
<cr-icon-button class="icon-edit" on-click="onEditHostnameTap_">
......
......@@ -26,6 +26,9 @@ Polymer({
/** @private */
currentlyOnChannelText_: String,
/** @private */
deviceNameText_: String,
/** @private */
showChannelSwitcherDialog_: Boolean,
......@@ -72,6 +75,7 @@ Polymer({
});
this.updateChannelInfo_();
this.updateDeviceName_();
},
/**
......@@ -109,6 +113,14 @@ Polymer({
});
},
/** @private */
updateDeviceName_() {
const browserProxy = DeviceNameBrowserProxyImpl.getInstance();
browserProxy.getDeviceNameMetadata().then(data => {
this.deviceNameText_ = data.deviceName;
});
},
/**
* @param {boolean} canChangeChannel
* @return {string}
......
<link rel="import" href="chrome://resources/html/cr.html">
<script src="device_name_browser_proxy.js"></script>
\ No newline at end of file
// Copyright 2020 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.
// clang-format off
// #import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
// clang-format on
/**
* @typedef {{
* deviceName: string,
* }}
*/
/* #export */ let DeviceNameMetadata;
/** @interface */
/* #export */ class DeviceNameBrowserProxy {
/**
* Queries the system for metadata about the device name.
* @return {!Promise<!DeviceNameMetadata>}
*/
getDeviceNameMetadata() {}
}
/**
* @implements {DeviceNameBrowserProxy}
*/
/* #export */ class DeviceNameBrowserProxyImpl {
/** @override */
getDeviceNameMetadata() {
return cr.sendWithPromise('getDeviceNameMetadata');
}
}
// The singleton instance_ is replaced with a test version of this wrapper
// during testing.
cr.addSingletonGetter(DeviceNameBrowserProxyImpl);
......@@ -149,6 +149,7 @@ os_settings_auto_imports = settings_auto_imports +
"ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.html|NetworkListenerBehavior",
"chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_types.html|PrinterListEntry,PrinterType",
"chrome/browser/resources/settings/about_page/about_page_browser_proxy.html|AboutPageBrowserProxyImpl,AboutPageUpdateInfo,AboutPageBrowserProxy,browserChannelToI18nId,VersionInfo,ChannelInfo,BrowserChannel,isTargetChannelMoreStable,UpdateStatus,UpdateStatusChangedEvent,RegulatoryInfo,TPMFirmwareUpdateStatusChangedEvent",
"chrome/browser/resources/settings/chromeos/os_about_page/device_name_browser_proxy.html|DeviceNameBrowserProxy,DeviceNameBrowserProxyImpl",
"chrome/browser/resources/settings/chromeos/os_settings_page/main_page_behavior.html|MainPageBehavior",
"ui/webui/resources/html/parse_html_subset.html|parseHtmlSubset",
]
......
......@@ -43,21 +43,22 @@ export {PageStatus, StoredAccount, SyncBrowserProxy, SyncBrowserProxyImpl, SyncS
export {CrSettingsPrefs} from '../prefs/prefs_types.m.js';
export {Route, Router} from '../router.m.js';
export {SearchEnginesBrowserProxy, SearchEnginesBrowserProxyImpl} from '../search_engines_page/search_engines_browser_proxy.m.js';
export {SearchEnginesInfo, SearchEngine} from '../search_engines_page/search_engines_browser_proxy.m.js';
export {SearchEngine, SearchEnginesInfo} from '../search_engines_page/search_engines_browser_proxy.m.js';
export {getContactManager, observeContactManager, setContactManagerForTesting} from '../shared/nearby_contact_manager.m.js';
export {getNearbyShareSettings, observeNearbyShareSettings, setNearbyShareSettingsForTesting} from '../shared/nearby_share_settings.m.js';
export {NearbySettings, NearbyShareSettingsBehavior} from '../shared/nearby_share_settings_behavior.m.js';
export {AmbientModeBrowserProxyImpl} from './ambient_mode_page/ambient_mode_browser_proxy.m.js';
export {AmbientModeTemperatureUnit, AmbientModeTopicSource} from './ambient_mode_page/constants.m.js';
export {bluetoothApis} from './bluetooth_page/bluetooth_page.m.js';
export {ConsentStatus, DspHotwordState} from './google_assistant_page/google_assistant_page.m.js';
export {GoogleAssistantBrowserProxyImpl} from './google_assistant_page/google_assistant_browser_proxy.m.js';
export {ConsentStatus, DspHotwordState} from './google_assistant_page/google_assistant_page.m.js';
export {InternetPageBrowserProxy, InternetPageBrowserProxyImpl} from './internet_page/internet_page_browser_proxy.m.js';
export {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_page/multidevice_browser_proxy.m.js';
export {MultiDeviceFeature, MultiDeviceFeatureState, MultiDevicePageContentData, MultiDeviceSettingsMode, SmartLockSignInEnabledState} from './multidevice_page/multidevice_constants.m.js';
export {Account, NearbyAccountManagerBrowserProxy, NearbyAccountManagerBrowserProxyImpl} from './nearby_share_page/nearby_account_manager_browser_proxy.m.js';
export {getReceiveManager, observeReceiveManager, setReceiveManagerForTesting} from './nearby_share_page/nearby_share_receive_manager.m.js';
export {dataUsageStringToEnum, NearbyShareDataUsage} from './nearby_share_page/types.m.js';
export {DeviceNameBrowserProxy, DeviceNameBrowserProxyImpl} from './os_about_page/device_name_browser_proxy.m.js';
export {KerberosAccountsBrowserProxyImpl, KerberosConfigErrorCode, KerberosErrorType} from './os_people_page/kerberos_accounts_browser_proxy.m.js';
export {OsSyncBrowserProxyImpl} from './os_people_page/os_sync_browser_proxy.m.js';
export {OsResetBrowserProxyImpl} from './os_reset_page/os_reset_browser_proxy.m.js';
......
......@@ -2466,6 +2466,8 @@ static_library("ui") {
"webui/settings/chromeos/device_display_handler.h",
"webui/settings/chromeos/device_keyboard_handler.cc",
"webui/settings/chromeos/device_keyboard_handler.h",
"webui/settings/chromeos/device_name_handler.cc",
"webui/settings/chromeos/device_name_handler.h",
"webui/settings/chromeos/device_pointer_handler.cc",
"webui/settings/chromeos/device_pointer_handler.h",
"webui/settings/chromeos/device_power_handler.cc",
......
......@@ -15,6 +15,7 @@
#include "chrome/browser/obsolete_system/obsolete_system.h"
#include "chrome/browser/ui/webui/management_ui.h"
#include "chrome/browser/ui/webui/settings/about_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/device_name_handler.h"
#include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h"
#include "chrome/browser/ui/webui/version_ui.h"
#include "chrome/browser/ui/webui/webui_util.h"
......@@ -341,6 +342,7 @@ void AboutSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
void AboutSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(
std::make_unique<::settings::AboutHandler>(profile()));
web_ui->AddMessageHandler(std::make_unique<DeviceNameHandler>());
}
int AboutSection::GetSectionNameMessageId() const {
......
// Copyright 2020 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.
#include "chrome/browser/ui/webui/settings/chromeos/device_name_handler.h"
#include <string>
#include "base/check.h"
#include "base/values.h"
#include "chrome/browser/chromeos/device_name_store.h"
#include "chromeos/constants/chromeos_switches.h"
#include "content/public/browser/web_ui.h"
namespace chromeos {
namespace settings {
void DeviceNameHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"getDeviceNameMetadata",
base::BindRepeating(&DeviceNameHandler::HandleGetDeviceNameMetadata,
base::Unretained(this)));
}
void DeviceNameHandler::HandleGetDeviceNameMetadata(
const base::ListValue* args) {
AllowJavascript();
CHECK_EQ(1U, args->GetSize());
std::string callback_id;
CHECK(args->GetString(0, &callback_id));
base::DictionaryValue metadata;
metadata.SetString("deviceName",
DeviceNameStore::GetInstance()->GetDeviceName());
ResolveJavascriptCallback(base::Value(callback_id), metadata);
}
} // namespace settings
} // namespace chromeos
// Copyright 2020 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.
#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_NAME_HANDLER_H_
#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_NAME_HANDLER_H_
#include "base/macros.h"
#include "base/scoped_observer.h"
#include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
namespace base {
class ListValue;
}
namespace chromeos {
namespace settings {
// DeviceNameHandler handles calls from WebUI JS related to getting and setting
// the device name.
class DeviceNameHandler : public ::settings::SettingsPageUIHandler {
public:
DeviceNameHandler() = default;
~DeviceNameHandler() override = default;
// SettingsPageUIHandler implementation.
void RegisterMessages() override;
void OnJavascriptAllowed() override {}
void OnJavascriptDisallowed() override {}
protected:
void HandleGetDeviceNameMetadata(const base::ListValue* args);
private:
DISALLOW_COPY_AND_ASSIGN(DeviceNameHandler);
};
} // namespace settings
} // namespace chromeos
#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_DEVICE_NAME_HANDLER_H_
// Copyright 2020 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.
#include "chrome/browser/ui/webui/settings/chromeos/device_name_handler.h"
#include <memory>
#include <string>
#include "chrome/browser/chromeos/device_name_store.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
namespace settings {
class TestDeviceNameHandler : public DeviceNameHandler {
public:
explicit TestDeviceNameHandler(content::WebUI* web_ui) : DeviceNameHandler() {
set_web_ui(web_ui);
}
// Raise visibility to public.
void HandleGetDeviceNameMetadata(const base::ListValue* args) {
DeviceNameHandler::HandleGetDeviceNameMetadata(args);
}
};
class DeviceNameHandlerTest : public testing::Test {
public:
DeviceNameHandlerTest() = default;
void SetUp() override {
testing::Test::SetUp();
handler_ = std::make_unique<TestDeviceNameHandler>(web_ui());
handler()->AllowJavascriptForTesting();
web_ui()->ClearTrackedCalls();
DeviceNameStore::RegisterLocalStatePrefs(local_state_.registry());
local_state()->SetString(prefs::kDeviceName, "TestDeviceName");
DeviceNameStore::GetInstance()->Initialize(&local_state_);
}
TestDeviceNameHandler* handler() { return handler_.get(); }
content::TestWebUI* web_ui() { return &web_ui_; }
TestingPrefServiceSimple* local_state() { return &local_state_; }
private:
// Run on the UI thread.
content::BrowserTaskEnvironment task_environment_;
// Test backing store for prefs.
TestingPrefServiceSimple local_state_;
content::TestWebUI web_ui_;
std::unique_ptr<TestDeviceNameHandler> handler_;
};
TEST_F(DeviceNameHandlerTest, DeviceNameMetadata_DeviceName) {
base::ListValue args;
args.AppendString("callback-id");
handler()->HandleGetDeviceNameMetadata(&args);
const content::TestWebUI::CallData& call_data = *web_ui()->call_data().back();
EXPECT_EQ("cr.webUIResponse", call_data.function_name());
EXPECT_EQ("callback-id", call_data.arg1()->GetString());
EXPECT_TRUE(call_data.arg2()->GetBool());
const base::DictionaryValue* returned_data;
ASSERT_TRUE(call_data.arg3()->GetAsDictionary(&returned_data));
std::string device_name;
ASSERT_TRUE(returned_data->GetString("deviceName", &device_name));
EXPECT_EQ("TestDeviceName", device_name);
}
} // namespace settings
} // namespace chromeos
......@@ -80,6 +80,7 @@ js_modulizer("modulize") {
"people_page_kerberos_accounts_test.js",
"personalization_page_test.js",
"smart_inputs_page_test.js",
"test_device_name_browser_proxy.js",
"test_os_languages_browser_proxy.js",
"test_os_languages_metrics_proxy.js",
"test_os_lifetime_browser_proxy.js",
......
......@@ -4,7 +4,9 @@
// clang-format off
// #import {TestAboutPageBrowserProxyChromeOS} from './test_about_page_browser_proxy_chromeos.m.js';
// #import {BrowserChannel,UpdateStatus,AboutPageBrowserProxyImpl,LifetimeBrowserProxyImpl,Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
// #import {TestDeviceNameBrowserProxy} from './test_device_name_browser_proxy.m.js';
// #import {BrowserChannel,UpdateStatus,Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
// #import {AboutPageBrowserProxyImpl,DeviceNameBrowserProxyImpl,LifetimeBrowserProxyImpl} from 'chrome://os-settings/chromeos/os_settings.js';
// #import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
// #import {TestLifetimeBrowserProxy} from './test_os_lifetime_browser_proxy.m.js';
......@@ -495,10 +497,13 @@ cr.define('settings_about_page', function() {
suite('DetailedBuildInfoTest', function() {
let page = null;
let browserProxy = null;
let deviceNameBrowserProxy = null;
setup(function() {
browserProxy = new TestAboutPageBrowserProxyChromeOS();
deviceNameBrowserProxy = new TestDeviceNameBrowserProxy();
settings.AboutPageBrowserProxyImpl.instance_ = browserProxy;
DeviceNameBrowserProxyImpl.instance_ = deviceNameBrowserProxy;
PolymerTest.clearBody();
});
......@@ -625,6 +630,20 @@ cr.define('settings_about_page', function() {
test('CheckCopyBuildDetails', function() {
checkCopyBuildDetailsButton();
});
test('DeviceName', async () => {
loadTimeData.overrideValues({
isHostnameSettingEnabled: true,
});
deviceNameBrowserProxy.setDeviceName('TestDeviceName');
page = document.createElement('settings-detailed-build-info');
document.body.appendChild(page);
await deviceNameBrowserProxy.whenCalled('getDeviceNameMetadata');
assertEquals(page.$$('#deviceName').innerText, 'TestDeviceName');
});
});
suite('ChannelSwitcherDialogTest', function() {
......
......@@ -72,6 +72,11 @@ var OSSettingsAboutPageTest = class extends OSSettingsBrowserTest {
return super.browsePreload + 'chromeos/os_about_page/os_about_page.html';
}
/** @override */
get featureList() {
return {enabled: ['chromeos::features::kEnableHostnameSetting']};
}
/** @override */
get extraLibraries() {
return super.extraLibraries.concat([
......@@ -79,6 +84,7 @@ var OSSettingsAboutPageTest = class extends OSSettingsBrowserTest {
BROWSER_SETTINGS_PATH + '../test_browser_proxy.js',
BROWSER_SETTINGS_PATH + 'test_lifetime_browser_proxy.js',
'test_about_page_browser_proxy_chromeos.js',
'test_device_name_browser_proxy.js',
'os_about_page_tests.js',
]);
}
......
......@@ -32,6 +32,7 @@ var OSSettingsV3BrowserTest = class extends PolymerTest {
get featureList() {
return {
enabled: [
'chromeos::features::kEnableHostnameSetting',
'chromeos::features::kOsSettingsPolymer3',
'chromeos::features::kUpdatedCellularActivationUi',
],
......
// Copyright 2020 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.
// clang-format off
// #import {TestBrowserProxy} from '../../test_browser_proxy.m.js';
// clang-format on
/** @implements {DeviceNameBrowserProxy} */
/* #export */ class TestDeviceNameBrowserProxy extends TestBrowserProxy {
constructor() {
super([
'getDeviceNameMetadata',
]);
/** @private {String} */
this.deviceName_ = '';
}
/** @param {String} deviceName */
setDeviceName(deviceName) {
this.deviceName_ = deviceName;
}
/** @override */
getDeviceNameMetadata() {
this.methodCalled('getDeviceNameMetadata');
return Promise.resolve({deviceName: this.deviceName_});
}
}
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