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 @@ ...@@ -7,6 +7,7 @@
#include <map> #include <map>
#include <utility> #include <utility>
#include "ash/public/cpp/network_config_service.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/optional.h" #include "base/optional.h"
...@@ -27,16 +28,20 @@ ...@@ -27,16 +28,20 @@
#include "chrome/browser/chromeos/printing/zeroconf_printer_detector.h" #include "chrome/browser/chromeos/printing/zeroconf_printer_detector.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.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/policy/policy_constants.h"
#include "components/pref_registry/pref_registry_syncable.h" #include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_member.h" #include "components/prefs/pref_member.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace chromeos { namespace chromeos {
namespace { namespace {
class CupsPrintersManagerImpl : public CupsPrintersManager, class CupsPrintersManagerImpl
public SyncedPrintersManager::Observer { : public CupsPrintersManager,
public SyncedPrintersManager::Observer,
public chromeos::network_config::mojom::CrosNetworkConfigObserver {
public: public:
// Identifiers for each of the underlying PrinterDetectors this // Identifiers for each of the underlying PrinterDetectors this
// class observes. // class observes.
...@@ -67,6 +72,14 @@ class CupsPrintersManagerImpl : public CupsPrintersManager, ...@@ -67,6 +72,14 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
// Add the |auto_usb_printer_configurer_| as an observer. // Add the |auto_usb_printer_configurer_| as an observer.
AddObserver(&auto_usb_printer_configurer_); 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. // Prime the printer cache with the saved and enterprise printers.
printers_.ReplacePrintersInClass( printers_.ReplacePrintersInClass(
PrinterClass::kSaved, synced_printers_manager_->GetSavedPrinters()); PrinterClass::kSaved, synced_printers_manager_->GetSavedPrinters());
...@@ -226,6 +239,27 @@ class CupsPrintersManagerImpl : public CupsPrintersManager, ...@@ -226,6 +239,27 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
NotifyObservers({PrinterClass::kEnterprise}); 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. // Callback for PrinterDetectors.
void OnPrintersFound( void OnPrintersFound(
int detector_id, int detector_id,
...@@ -442,6 +476,13 @@ class CupsPrintersManagerImpl : public CupsPrintersManager, ...@@ -442,6 +476,13 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
PrinterConfigurer::SetupFingerprint(printer); PrinterConfigurer::SetupFingerprint(printer);
} }
// Resets all network detected printer lists.
void ClearNetworkDetectedPrinters() {
zeroconf_detections_.clear();
ResetNearbyPrintersLists();
}
SEQUENCE_CHECKER(sequence_); SEQUENCE_CHECKER(sequence_);
// Source lists for detected printers. // Source lists for detected printers.
...@@ -452,6 +493,10 @@ class CupsPrintersManagerImpl : public CupsPrintersManager, ...@@ -452,6 +493,10 @@ class CupsPrintersManagerImpl : public CupsPrintersManager,
SyncedPrintersManager* const synced_printers_manager_; SyncedPrintersManager* const synced_printers_manager_;
ScopedObserver<SyncedPrintersManager, SyncedPrintersManager::Observer> ScopedObserver<SyncedPrintersManager, SyncedPrintersManager::Observer>
synced_printers_manager_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_; 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