summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/inspector/locale_controller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/inspector/locale_controller.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/inspector/locale_controller.cc67
1 files changed, 67 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/inspector/locale_controller.cc b/chromium/third_party/blink/renderer/core/inspector/locale_controller.cc
new file mode 100644
index 00000000000..5e26a092405
--- /dev/null
+++ b/chromium/third_party/blink/renderer/core/inspector/locale_controller.cc
@@ -0,0 +1,67 @@
+// 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 "third_party/blink/renderer/core/inspector/locale_controller.h"
+
+#include "base/i18n/rtl.h"
+#include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h"
+#include "third_party/blink/renderer/core/workers/worker_thread.h"
+#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
+#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
+#include "third_party/icu/source/common/unicode/locid.h"
+#include "v8/include/v8.h"
+
+namespace blink {
+
+namespace {
+void UpdateDefaultLocaleInIsolate(v8::Isolate* isolate) {
+ DCHECK(isolate);
+ isolate->LocaleConfigurationChangeNotification();
+ isolate->DateTimeConfigurationChangeNotification();
+}
+
+void NotifyLocaleChangeOnWorkerThread(WorkerThread* worker_thread) {
+ DCHECK(worker_thread->IsCurrentThread());
+ UpdateDefaultLocaleInIsolate(worker_thread->GlobalScope()->GetIsolate());
+}
+
+void UpdateLocale(const String& locale) {
+ WebString web_locale(locale);
+ base::i18n::SetICUDefaultLocale(web_locale.Ascii());
+ UpdateDefaultLocaleInIsolate(V8PerIsolateData::MainThreadIsolate());
+ WorkerThread::CallOnAllWorkerThreads(&NotifyLocaleChangeOnWorkerThread,
+ TaskType::kInternalDefault);
+}
+} // namespace
+
+LocaleController::LocaleController()
+ : embedder_locale_(String(icu::Locale::getDefault().getName())) {}
+
+String LocaleController::SetLocaleOverride(const String& locale) {
+ if (locale_override_ == locale)
+ return String();
+ if (locale.IsEmpty()) {
+ UpdateLocale(embedder_locale_);
+ } else {
+ icu::Locale locale_object(locale.Ascii().data());
+ const char* lang = locale_object.getLanguage();
+ if (!lang || *lang == '\0')
+ return "Invalid locale name";
+ UpdateLocale(locale);
+ }
+ locale_override_ = locale;
+ return String();
+}
+
+bool LocaleController::has_locale_override() const {
+ return !locale_override_.IsEmpty();
+}
+
+// static
+LocaleController& LocaleController::instance() {
+ DEFINE_STATIC_LOCAL(LocaleController, instance, ());
+ return instance;
+}
+
+} // namespace blink