Commit 56118b17 authored by Jimmy Gong's avatar Jimmy Gong Committed by Commit Bot

Make CupsPrintersManager a CrosNetworkConfigObserver

- CupsPrinterManager will now detect for network changes.
- Previously, when the network changes CupsPrintersManager would
  wait until ZeroConfDetector updates with new printers.
- This resulted in a small time frame in which CupsPrintersManager
  would still retain stale printers from the previous network.
- This fixes that bug by clearing the all printers upon a network
  change, ensuring only new printers are populated.

Bug: 779602
Test: unittests, end to end manual
Change-Id: I0efe9e0a2252378bca178dc4b6dcea4da6baa978
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1764677
Commit-Queue: jimmy gong <jimmyxgong@chromium.org>
Reviewed-by: default avatarZentaro Kavanagh <zentaro@chromium.org>
Reviewed-by: default avatarBailey Berro <baileyberro@chromium.org>
Cr-Commit-Position: refs/heads/master@{#693364}
parent 922f3f1f
......@@ -7,6 +7,7 @@
#include <map>
#include <utility>
#include "ash/public/cpp/network_config_service.h"
#include "base/bind.h"
#include "base/observer_list.h"
#include "base/optional.h"
......@@ -27,16 +28,20 @@
#include "chrome/browser/chromeos/printing/zeroconf_printer_detector.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
#include "components/policy/policy_constants.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_member.h"
#include "components/prefs/pref_service.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace chromeos {
namespace {
class CupsPrintersManagerImpl : public CupsPrintersManager,
public SyncedPrintersManager::Observer {
class CupsPrintersManagerImpl
: public CupsPrintersManager,
public SyncedPrintersManager::Observer,
public chromeos::network_config::mojom::CrosNetworkConfigObserver {
public:
// Identifiers for each of the underlying PrinterDetectors this
// class observes.
......@@ -67,6 +72,14 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
// Add the |auto_usb_printer_configurer_| as an observer.
AddObserver(&auto_usb_printer_configurer_);
ash::GetNetworkConfigService(
remote_cros_network_config_.BindNewPipeAndPassReceiver());
chromeos::network_config::mojom::CrosNetworkConfigObserverPtr observer_ptr;
cros_network_config_observer_receiver_.Bind(
mojo::MakeRequest(&observer_ptr));
remote_cros_network_config_->AddObserver(std::move(observer_ptr));
// Prime the printer cache with the saved and enterprise printers.
printers_.ReplacePrintersInClass(
PrinterClass::kSaved, synced_printers_manager_->GetSavedPrinters());
......@@ -226,6 +239,27 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
NotifyObservers({PrinterClass::kEnterprise});
}
// mojom::CrosNetworkConfigObserver implementation.
void OnActiveNetworksChanged(
std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr>
networks) override {
// Clear the network detected printers when the active network changes.
// This ensures that connecting to a new network will give us only newly
// detected printers.
ClearNetworkDetectedPrinters();
}
// mojom::CrosNetworkConfigObserver implementation.
void OnNetworkStateChanged(
chromeos::network_config::mojom::NetworkStatePropertiesPtr /* network */)
override {}
// mojom::CrosNetworkConfigObserver implementation.
void OnNetworkStateListChanged() override {}
// mojom::CrosNetworkConfigObserver implementation.
void OnDeviceStateListChanged() override {}
// Callback for PrinterDetectors.
void OnPrintersFound(
int detector_id,
......@@ -442,6 +476,13 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
PrinterConfigurer::SetupFingerprint(printer);
}
// Resets all network detected printer lists.
void ClearNetworkDetectedPrinters() {
zeroconf_detections_.clear();
ResetNearbyPrintersLists();
}
SEQUENCE_CHECKER(sequence_);
// Source lists for detected printers.
......@@ -452,6 +493,10 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
SyncedPrintersManager* const synced_printers_manager_;
ScopedObserver<SyncedPrintersManager, SyncedPrintersManager::Observer>
synced_printers_manager_observer_;
mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>
remote_cros_network_config_;
mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver>
cros_network_config_observer_receiver_{this};
std::unique_ptr<PrinterDetector> usb_detector_;
......
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