Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Unified Diff: third_party/WebKit/Source/core/page/NetworkStateNotifier.cpp

Issue 2710023006: Move NetworkStateNotifier from core (and web) into platform/network (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/page/NetworkStateNotifier.cpp
diff --git a/third_party/WebKit/Source/core/page/NetworkStateNotifier.cpp b/third_party/WebKit/Source/core/page/NetworkStateNotifier.cpp
deleted file mode 100644
index 4bfa14ac4f1b87a2c5023b6f5de44fc7705af148..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/core/page/NetworkStateNotifier.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "core/page/NetworkStateNotifier.h"
-
-#include "platform/CrossThreadFunctional.h"
-#include "wtf/Assertions.h"
-#include "wtf/Functional.h"
-#include "wtf/PtrUtil.h"
-#include "wtf/StdLibExtras.h"
-#include "wtf/Threading.h"
-
-namespace blink {
-
-template <>
-struct CrossThreadCopier<NetworkStateNotifier::NetworkState>
- : public CrossThreadCopierPassThrough<NetworkStateNotifier::NetworkState> {
- STATIC_ONLY(CrossThreadCopier);
-};
-
-NetworkStateNotifier& networkStateNotifier() {
- DEFINE_THREAD_SAFE_STATIC_LOCAL(NetworkStateNotifier, networkStateNotifier,
- new NetworkStateNotifier);
- return networkStateNotifier;
-}
-
-NetworkStateNotifier::ScopedNotifier::ScopedNotifier(
- NetworkStateNotifier& notifier)
- : m_notifier(notifier) {
- DCHECK(isMainThread());
- m_before =
- m_notifier.m_hasOverride ? m_notifier.m_override : m_notifier.m_state;
-}
-
-NetworkStateNotifier::ScopedNotifier::~ScopedNotifier() {
- DCHECK(isMainThread());
- const NetworkState& after =
- m_notifier.m_hasOverride ? m_notifier.m_override : m_notifier.m_state;
- if ((after.type != m_before.type ||
- after.maxBandwidthMbps != m_before.maxBandwidthMbps) &&
- m_before.connectionInitialized) {
- m_notifier.notifyObservers(m_notifier.m_connectionObservers,
- ObserverType::CONNECTION_TYPE, after);
- }
- if (after.onLine != m_before.onLine && m_before.onLineInitialized) {
- m_notifier.notifyObservers(m_notifier.m_onLineStateObservers,
- ObserverType::ONLINE_STATE, after);
- }
-}
-
-void NetworkStateNotifier::setOnLine(bool onLine) {
- DCHECK(isMainThread());
- ScopedNotifier notifier(*this);
- {
- MutexLocker locker(m_mutex);
- m_state.onLineInitialized = true;
- m_state.onLine = onLine;
- }
-}
-
-void NetworkStateNotifier::setWebConnection(WebConnectionType type,
- double maxBandwidthMbps) {
- DCHECK(isMainThread());
- ScopedNotifier notifier(*this);
- {
- MutexLocker locker(m_mutex);
- m_state.connectionInitialized = true;
- m_state.type = type;
- m_state.maxBandwidthMbps = maxBandwidthMbps;
- }
-}
-
-void NetworkStateNotifier::addConnectionObserver(
- NetworkStateObserver* observer,
- PassRefPtr<WebTaskRunner> taskRunner) {
- addObserver(m_connectionObservers, observer, std::move(taskRunner));
-}
-
-void NetworkStateNotifier::addOnLineObserver(
- NetworkStateObserver* observer,
- PassRefPtr<WebTaskRunner> taskRunner) {
- addObserver(m_onLineStateObservers, observer, std::move(taskRunner));
-}
-
-void NetworkStateNotifier::removeConnectionObserver(
- NetworkStateObserver* observer,
- PassRefPtr<WebTaskRunner> taskRunner) {
- removeObserver(m_connectionObservers, observer, std::move(taskRunner));
-}
-
-void NetworkStateNotifier::removeOnLineObserver(
- NetworkStateObserver* observer,
- PassRefPtr<WebTaskRunner> taskRunner) {
- removeObserver(m_onLineStateObservers, observer, std::move(taskRunner));
-}
-
-void NetworkStateNotifier::setOverride(bool onLine,
- WebConnectionType type,
- double maxBandwidthMbps) {
- DCHECK(isMainThread());
- ScopedNotifier notifier(*this);
- {
- MutexLocker locker(m_mutex);
- m_hasOverride = true;
- m_override.onLineInitialized = true;
- m_override.onLine = onLine;
- m_override.connectionInitialized = true;
- m_override.type = type;
- m_override.maxBandwidthMbps = maxBandwidthMbps;
- }
-}
-
-void NetworkStateNotifier::clearOverride() {
- DCHECK(isMainThread());
- ScopedNotifier notifier(*this);
- {
- MutexLocker locker(m_mutex);
- m_hasOverride = false;
- }
-}
-
-void NetworkStateNotifier::notifyObservers(ObserverListMap& map,
- ObserverType type,
- const NetworkState& state) {
- DCHECK(isMainThread());
- MutexLocker locker(m_mutex);
- for (const auto& entry : map) {
- RefPtr<WebTaskRunner> taskRunner = entry.key;
- taskRunner->postTask(
- BLINK_FROM_HERE,
- crossThreadBind(&NetworkStateNotifier::notifyObserversOnTaskRunner,
- crossThreadUnretained(this),
- crossThreadUnretained(&map), type, taskRunner, state));
- }
-}
-
-void NetworkStateNotifier::notifyObserversOnTaskRunner(
- ObserverListMap* map,
- ObserverType type,
- PassRefPtr<WebTaskRunner> passTaskRunner,
- const NetworkState& state) {
- RefPtr<WebTaskRunner> taskRunner = passTaskRunner;
- ObserverList* observerList = lockAndFindObserverList(*map, taskRunner);
-
- // The context could have been removed before the notification task got to
- // run.
- if (!observerList)
- return;
-
- DCHECK(taskRunner->runsTasksOnCurrentThread());
-
- observerList->iterating = true;
-
- for (size_t i = 0; i < observerList->observers.size(); ++i) {
- // Observers removed during iteration are zeroed out, skip them.
- if (!observerList->observers[i])
- continue;
- switch (type) {
- case ObserverType::ONLINE_STATE:
- observerList->observers[i]->onLineStateChange(state.onLine);
- continue;
- case ObserverType::CONNECTION_TYPE:
- observerList->observers[i]->connectionChange(state.type,
- state.maxBandwidthMbps);
- continue;
- }
- NOTREACHED();
- }
-
- observerList->iterating = false;
-
- if (!observerList->zeroedObservers.isEmpty())
- collectZeroedObservers(*map, observerList, taskRunner);
-}
-
-void NetworkStateNotifier::addObserver(ObserverListMap& map,
- NetworkStateObserver* observer,
- PassRefPtr<WebTaskRunner> taskRunner) {
- DCHECK(taskRunner->runsTasksOnCurrentThread());
- DCHECK(observer);
-
- MutexLocker locker(m_mutex);
- ObserverListMap::AddResult result =
- map.insert(std::move(taskRunner), nullptr);
- if (result.isNewEntry)
- result.storedValue->value = WTF::makeUnique<ObserverList>();
-
- DCHECK(result.storedValue->value->observers.find(observer) == kNotFound);
- result.storedValue->value->observers.push_back(observer);
-}
-
-void NetworkStateNotifier::removeObserver(
- ObserverListMap& map,
- NetworkStateObserver* observer,
- PassRefPtr<WebTaskRunner> passTaskRunner) {
- RefPtr<WebTaskRunner> taskRunner = passTaskRunner;
- DCHECK(taskRunner->runsTasksOnCurrentThread());
- DCHECK(observer);
-
- ObserverList* observerList = lockAndFindObserverList(map, taskRunner);
- if (!observerList)
- return;
-
- Vector<NetworkStateObserver*>& observers = observerList->observers;
- size_t index = observers.find(observer);
- if (index != kNotFound) {
- observers[index] = 0;
- observerList->zeroedObservers.push_back(index);
- }
-
- if (!observerList->iterating && !observerList->zeroedObservers.isEmpty())
- collectZeroedObservers(map, observerList, taskRunner);
-}
-
-NetworkStateNotifier::ObserverList*
-NetworkStateNotifier::lockAndFindObserverList(
- ObserverListMap& map,
- PassRefPtr<WebTaskRunner> taskRunner) {
- MutexLocker locker(m_mutex);
- ObserverListMap::iterator it = map.find(taskRunner);
- return it == map.end() ? nullptr : it->value.get();
-}
-
-void NetworkStateNotifier::collectZeroedObservers(
- ObserverListMap& map,
- ObserverList* list,
- PassRefPtr<WebTaskRunner> taskRunner) {
- DCHECK(taskRunner->runsTasksOnCurrentThread());
- DCHECK(!list->iterating);
-
- // If any observers were removed during the iteration they will have
- // 0 values, clean them up.
- for (size_t i = 0; i < list->zeroedObservers.size(); ++i)
- list->observers.remove(list->zeroedObservers[i]);
-
- list->zeroedObservers.clear();
-
- if (list->observers.isEmpty()) {
- MutexLocker locker(m_mutex);
- map.erase(taskRunner); // deletes list
- }
-}
-
-} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698