Commit 992c5c44 authored by Simon Zünd's avatar Simon Zünd Committed by Commit Bot

Reland "Keep DevTools navigator.language in-sync with chromiums app language"

This is a reland of 73ac7d88

The reland changes the test locale from 'es-ES' to 'es'. 'es-ES' is
unavailable on Mac, while 'es' works (confirmed crash and fix locally).

Original change's description:
> Keep DevTools navigator.language in-sync with chromiums app language
>
> DevTools is considered part of the Chromium UI, so it should be
> displayed in the same language as the Chromium UI and not the configured
> accepted language (chrome://settings/languages).
>
> This CL moves the code where we override the DevTools renderer
> preferences around so it works consistently across platforms. It also
> installs an event handler in case the user changes his language settings
> so `navigator.language` has consistently the same value in the
> DevTools renderer.
>
> R=petermarshall@chromium.org
>
> Bug: chromium:1125490
> Change-Id: Iaac568d82357d6ae7c50d5022d687f4f1741b147
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2398538
> Commit-Queue: Simon Zünd <szuend@chromium.org>
> Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
> Reviewed-by: Peter Marshall <petermarshall@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#805219}

Bug: chromium:1125490, chromium:1126379
Change-Id: I3b24b73ecb19d8290393a8ebf72db424bc098eee
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2401464Reviewed-by: default avatarPeter Marshall <petermarshall@chromium.org>
Reviewed-by: default avatarYang Guo <yangguo@chromium.org>
Commit-Queue: Simon Zünd <szuend@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805704}
parent a90dd550
......@@ -29,6 +29,7 @@
#include "base/threading/thread_restrictions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/devtools/device/tcp_device_provider.h"
#include "chrome/browser/devtools/devtools_window_testing.h"
......@@ -66,6 +67,7 @@
#include "components/javascript_dialogs/app_modal_dialog_view.h"
#include "components/keep_alive_registry/keep_alive_registry.h"
#include "components/keep_alive_registry/keep_alive_types.h"
#include "components/language/core/browser/pref_names.h"
#include "components/policy/core/common/mock_configuration_policy_provider.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/policy_constants.h"
......@@ -2578,24 +2580,53 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
CloseDevToolsWindow();
}
namespace {
class DevToolsLocalizationTest : public DevToolsSanityTest {
void SetUpCommandLine(base::CommandLine* command_line) override {
command_line->AppendSwitchASCII(switches::kLang, "es-ES");
public:
bool NavigatorLanguageMatches(const std::string& expected_locale) {
bool result = false;
const bool execute_result = content::ExecuteScriptAndExtractBool(
main_web_contents(),
"window.domAutomationController.send(window.navigator.language === "
"'" +
expected_locale + "')",
&result);
return execute_result && result;
}
};
// Make it run on Windows only since the browser language on Mac
// is tied to the OS language and --lang flag won't work
#if defined(OS_WIN)
IN_PROC_BROWSER_TEST_F(DevToolsLocalizationTest, testNavigatorLanguage) {
bool result = false;
} // namespace
IN_PROC_BROWSER_TEST_F(DevToolsLocalizationTest,
NavigatorLanguageMatchesApplicationLocaleDocked) {
g_browser_process->SetApplicationLocale("es");
OpenDevToolsWindow("about:blank", /* is_docked */ true);
EXPECT_TRUE(NavigatorLanguageMatches("es"));
CloseDevToolsWindow();
}
IN_PROC_BROWSER_TEST_F(DevToolsLocalizationTest,
NavigatorLanguageMatchesApplicationLocaleUndocked) {
g_browser_process->SetApplicationLocale("es");
OpenDevToolsWindow("about:blank", /* is_docked */ false);
EXPECT_TRUE(NavigatorLanguageMatches("es"));
CloseDevToolsWindow();
}
IN_PROC_BROWSER_TEST_F(DevToolsLocalizationTest,
AcceptedLanguageChangesWhileDevToolsIsOpen) {
g_browser_process->SetApplicationLocale("es");
OpenDevToolsWindow("about:blank", true);
ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
main_web_contents(),
"window.domAutomationController.send(window.navigator.language === "
"'es-ES')",
&result));
EXPECT_TRUE(result);
EXPECT_TRUE(NavigatorLanguageMatches("es"));
PrefService* prefs = browser()->profile()->GetPrefs();
prefs->SetString(language::prefs::kAcceptLanguages, "de-DE");
EXPECT_TRUE(NavigatorLanguageMatches("es"));
CloseDevToolsWindow();
}
#endif // defined(OS_WIN)
......@@ -677,9 +677,6 @@ DevToolsUIBindings::DevToolsUIBindings(content::WebContents* web_contents)
frontend_loaded_(false) {
g_devtools_ui_bindings_instances.Get().push_back(this);
frontend_contents_observer_.reset(new FrontendWebContentsObserver(this));
web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false;
web_contents_->GetMutableRendererPrefs()->accept_languages =
g_browser_process->GetApplicationLocale();
file_helper_.reset(new DevToolsFileHelper(web_contents_, profile_, this));
file_system_indexer_ = new DevToolsFileSystemIndexer();
......
......@@ -17,6 +17,7 @@
#include "base/metrics/user_metrics.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/certificate_viewer.h"
#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
#include "chrome/browser/devtools/devtools_eye_dropper.h"
......@@ -39,6 +40,7 @@
#include "components/javascript_dialogs/app_modal_dialog_manager.h"
#include "components/keep_alive_registry/keep_alive_types.h"
#include "components/keep_alive_registry/scoped_keep_alive.h"
#include "components/language/core/browser/pref_names.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "components/sessions/content/session_tab_helper.h"
......@@ -66,6 +68,7 @@
#include "net/base/escape.h"
#include "third_party/blink/public/common/input/web_gesture_event.h"
#include "third_party/blink/public/common/input/web_input_event.h"
#include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
#include "third_party/blink/public/public_buildflags.h"
#include "ui/base/page_transition_types.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
......@@ -860,7 +863,7 @@ void DevToolsWindow::Show(const DevToolsToggleAction& action) {
main_web_contents_->SetInitialFocus();
PrefsTabHelper::CreateForWebContents(main_web_contents_);
main_web_contents_->SyncRendererPrefs();
OverrideAndSyncDevToolsRendererPrefs();
DoAction(action);
return;
......@@ -1021,6 +1024,12 @@ DevToolsWindow::DevToolsWindow(FrontendType frontend_type,
g_creation_callbacks.Get());
for (const auto& callback : copy)
callback.Run(this);
pref_change_registrar_.Init(profile_->GetPrefs());
pref_change_registrar_.Add(
language::prefs::kAcceptLanguages,
base::BindRepeating(&DevToolsWindow::OnLocaleChanged,
base::Unretained(this)));
}
// static
......@@ -1579,7 +1588,7 @@ void DevToolsWindow::CreateDevToolsBrowser() {
OwnedMainWebContents::TakeWebContents(
std::move(owned_main_web_contents_)),
-1, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, TabStripModel::ADD_ACTIVE);
main_web_contents_->SyncRendererPrefs();
OverrideAndSyncDevToolsRendererPrefs();
}
BrowserWindow* DevToolsWindow::GetInspectedBrowserWindow() {
......@@ -1681,3 +1690,14 @@ void DevToolsWindow::RegisterModalDialogManager(Browser* browser) {
void DevToolsWindow::OnReattachMainTargetComplete(base::Value) {
std::move(reattach_complete_callback_).Run();
}
void DevToolsWindow::OnLocaleChanged() {
OverrideAndSyncDevToolsRendererPrefs();
}
void DevToolsWindow::OverrideAndSyncDevToolsRendererPrefs() {
main_web_contents_->GetMutableRendererPrefs()->can_accept_load_drops = false;
main_web_contents_->GetMutableRendererPrefs()->accept_languages =
g_browser_process->GetApplicationLocale();
main_web_contents_->SyncRendererPrefs();
}
......@@ -384,6 +384,15 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
void OnReattachMainTargetComplete(base::Value);
// Called when the accepted language changes. |navigator.language| of the
// DevTools window should match the application language. When the user
// changes the accepted language then this listener flips the language back
// to the application language for the DevTools renderer process.
// Please note that |navigator.language| will have the wrong language for
// a very short period of time (until this handler has reset it again).
void OnLocaleChanged();
void OverrideAndSyncDevToolsRendererPrefs();
std::unique_ptr<ObserverWithAccessor> inspected_contents_observer_;
FrontendType frontend_type_;
......@@ -432,6 +441,8 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate,
base::OnceCallback<void()> reattach_complete_callback_;
PrefChangeRegistrar pref_change_registrar_;
friend class DevToolsEventForwarder;
DISALLOW_COPY_AND_ASSIGN(DevToolsWindow);
};
......
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