1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
// Copyright 2016 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 "modules/time_zone_monitor/TimeZoneMonitorClient.h"
#include "bindings/core/v8/V8Binding.h"
#include "bindings/core/v8/V8PerIsolateData.h"
#include "core/dom/ExecutionContext.h"
#include "core/dom/ExecutionContextTask.h"
#include "core/workers/WorkerBackingThread.h"
#include "core/workers/WorkerThread.h"
#include "platform/ServiceConnector.h"
#include "public/platform/Platform.h"
#include "services/device/public/interfaces/constants.mojom-blink.h"
#include "third_party/icu/source/i18n/unicode/timezone.h"
#include <v8.h>
namespace blink {
namespace {
// Notify V8 that the date/time configuration of the system might have changed.
void NotifyTimezoneChangeToV8(v8::Isolate* isolate) {
DCHECK(isolate);
v8::Date::DateTimeConfigurationChangeNotification(isolate);
}
void NotifyTimezoneChangeOnWorkerThread(ExecutionContext* context) {
NotifyTimezoneChangeToV8(toIsolate(context));
}
} // namespace
// static
void TimeZoneMonitorClient::Init() {
DEFINE_STATIC_LOCAL(TimeZoneMonitorClient, instance, ());
device::mojom::blink::TimeZoneMonitorPtr monitor;
ServiceConnector::instance().connectToInterface(
device::mojom::blink::kServiceName, mojo::MakeRequest(&monitor));
monitor->AddClient(instance.m_binding.CreateInterfacePtrAndBind());
}
TimeZoneMonitorClient::TimeZoneMonitorClient() : m_binding(this) {
DCHECK(isMainThread());
}
TimeZoneMonitorClient::~TimeZoneMonitorClient() {}
void TimeZoneMonitorClient::OnTimeZoneChange(const String& timeZoneInfo) {
DCHECK(isMainThread());
if (!timeZoneInfo.isEmpty()) {
icu::TimeZone* zone = icu::TimeZone::createTimeZone(
icu::UnicodeString::fromUTF8(timeZoneInfo.utf8().data()));
icu::TimeZone::adoptDefault(zone);
VLOG(1) << "ICU default timezone is set to " << timeZoneInfo;
}
NotifyTimezoneChangeToV8(V8PerIsolateData::mainThreadIsolate());
HashSet<WorkerThread*>& threads = WorkerThread::workerThreads();
HashSet<WorkerBackingThread*> posted;
for (WorkerThread* thread : threads) {
// Ensure every WorkerBackingThread(holding one platform thread) only get
// the task posted once, because one WorkerBackingThread could be shared
// among multiple WorkerThreads.
if (posted.contains(&thread->workerBackingThread()))
continue;
thread->postTask(BLINK_FROM_HERE, createCrossThreadTask(
&NotifyTimezoneChangeOnWorkerThread));
posted.add(&thread->workerBackingThread());
}
}
} // namespace blink
|