Commit 5c49e3b3 authored by Jesse Schettler's avatar Jesse Schettler Committed by Commit Bot

document_scan: Use LorgnetteScannerManager

Update the Document Scan API to use the LorgnetteScannerManager to get
available scanners and perform scans.

Bug: b:153541027
Change-Id: I57f70d0959a6a676a34e2956a3908ddb165ed84f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2318311
Commit-Queue: Jesse Schettler <jschettler@chromium.org>
Reviewed-by: default avatarDavid Bertoni <dbertoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798394}
parent 647d93e9
...@@ -3477,6 +3477,8 @@ source_set("unit_tests") { ...@@ -3477,6 +3477,8 @@ source_set("unit_tests") {
"release_notes/release_notes_notification_unittest.cc", "release_notes/release_notes_notification_unittest.cc",
"release_notes/release_notes_storage_unittest.cc", "release_notes/release_notes_storage_unittest.cc",
"remote_apps/remote_apps_model_unittest.cc", "remote_apps/remote_apps_model_unittest.cc",
"scanning/fake_lorgnette_scanner_manager.cc",
"scanning/fake_lorgnette_scanner_manager.h",
"scanning/lorgnette_scanner_manager_unittest.cc", "scanning/lorgnette_scanner_manager_unittest.cc",
"scanning/lorgnette_scanner_manager_util_unittest.cc", "scanning/lorgnette_scanner_manager_util_unittest.cc",
"scanning/zeroconf_scanner_detector_unittest.cc", "scanning/zeroconf_scanner_detector_unittest.cc",
......
...@@ -9,10 +9,9 @@ ...@@ -9,10 +9,9 @@
#include "base/base64.h" #include "base/base64.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/logging.h" #include "chrome/browser/chromeos/scanning/lorgnette_scanner_manager.h"
#include "base/stl_util.h" #include "chrome/browser/chromeos/scanning/lorgnette_scanner_manager_factory.h"
#include "chromeos/dbus/dbus_thread_manager.h" #include "content/public/browser/browser_context.h"
#include "chromeos/dbus/lorgnette_manager_client.h"
#include "third_party/cros_system_api/dbus/lorgnette/dbus-constants.h" #include "third_party/cros_system_api/dbus/lorgnette/dbus-constants.h"
namespace extensions { namespace extensions {
...@@ -24,7 +23,6 @@ namespace { ...@@ -24,7 +23,6 @@ namespace {
// Error messages that can be included in a response when scanning fails. // Error messages that can be included in a response when scanning fails.
constexpr char kUserGestureRequiredError[] = constexpr char kUserGestureRequiredError[] =
"User gesture required to perform scan"; "User gesture required to perform scan";
constexpr char kListScannersError[] = "Failed to obtain list of scanners";
constexpr char kNoScannersAvailableError[] = "No scanners available"; constexpr char kNoScannersAvailableError[] = "No scanners available";
constexpr char kUnsupportedMimeTypesError[] = "Unsupported MIME types"; constexpr char kUnsupportedMimeTypesError[] = "Unsupported MIME types";
constexpr char kScanImageError[] = "Failed to scan image"; constexpr char kScanImageError[] = "Failed to scan image";
...@@ -35,11 +33,6 @@ constexpr char kScannerImageMimeTypePng[] = "image/png"; ...@@ -35,11 +33,6 @@ constexpr char kScannerImageMimeTypePng[] = "image/png";
// The PNG image data URL prefix of a scanned image. // The PNG image data URL prefix of a scanned image.
constexpr char kPngImageDataUrlPrefix[] = "data:image/png;base64,"; constexpr char kPngImageDataUrlPrefix[] = "data:image/png;base64,";
chromeos::LorgnetteManagerClient* GetLorgnetteManagerClient() {
DCHECK(chromeos::DBusThreadManager::IsInitialized());
return chromeos::DBusThreadManager::Get()->GetLorgnetteManagerClient();
}
} // namespace } // namespace
DocumentScanScanFunction::DocumentScanScanFunction() = default; DocumentScanScanFunction::DocumentScanScanFunction() = default;
...@@ -53,19 +46,16 @@ ExtensionFunction::ResponseAction DocumentScanScanFunction::Run() { ...@@ -53,19 +46,16 @@ ExtensionFunction::ResponseAction DocumentScanScanFunction::Run() {
if (!user_gesture()) if (!user_gesture())
return RespondNow(Error(kUserGestureRequiredError)); return RespondNow(Error(kUserGestureRequiredError));
GetLorgnetteManagerClient()->ListScanners( chromeos::LorgnetteScannerManagerFactory::GetForBrowserContext(
base::BindOnce(&DocumentScanScanFunction::OnScannerListReceived, this)); browser_context())
->GetScannerNames(
base::BindOnce(&DocumentScanScanFunction::OnNamesReceived, this));
return did_respond() ? AlreadyResponded() : RespondLater(); return did_respond() ? AlreadyResponded() : RespondLater();
} }
void DocumentScanScanFunction::OnScannerListReceived( void DocumentScanScanFunction::OnNamesReceived(
base::Optional<lorgnette::ListScannersResponse> response) { std::vector<std::string> scanner_names) {
if (!response) { if (scanner_names.empty()) {
Respond(Error(kListScannersError));
return;
}
if (response->scanners_size() == 0) {
Respond(Error(kNoScannersAvailableError)); Respond(Error(kNoScannersAvailableError));
return; return;
} }
...@@ -83,13 +73,14 @@ void DocumentScanScanFunction::OnScannerListReceived( ...@@ -83,13 +73,14 @@ void DocumentScanScanFunction::OnScannerListReceived(
// The first scanner supporting one of the requested MIME types used to be // The first scanner supporting one of the requested MIME types used to be
// selected. Since all of the scanners only support PNG, this results in // selected. Since all of the scanners only support PNG, this results in
// selecting the first scanner in the list. // selecting the first scanner in the list.
const auto& scanner = response->scanners()[0]; const std::string& scanner_name = scanner_names[0];
chromeos::LorgnetteManagerClient::ScanProperties properties; chromeos::LorgnetteManagerClient::ScanProperties properties;
properties.mode = lorgnette::kScanPropertyModeColor; properties.mode = lorgnette::kScanPropertyModeColor;
GetLorgnetteManagerClient()->StartScan( chromeos::LorgnetteScannerManagerFactory::GetForBrowserContext(
scanner.name(), properties, browser_context())
base::BindOnce(&DocumentScanScanFunction::OnResultsReceived, this), ->Scan(
base::nullopt); scanner_name, properties,
base::BindOnce(&DocumentScanScanFunction::OnResultsReceived, this));
} }
void DocumentScanScanFunction::OnResultsReceived( void DocumentScanScanFunction::OnResultsReceived(
......
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector>
#include "base/optional.h" #include "base/optional.h"
#include "chrome/common/extensions/api/document_scan.h" #include "chrome/common/extensions/api/document_scan.h"
#include "chromeos/dbus/lorgnette/lorgnette_service.pb.h"
#include "extensions/browser/extension_function.h" #include "extensions/browser/extension_function.h"
namespace extensions { namespace extensions {
...@@ -33,8 +33,7 @@ class DocumentScanScanFunction : public ExtensionFunction { ...@@ -33,8 +33,7 @@ class DocumentScanScanFunction : public ExtensionFunction {
private: private:
friend class DocumentScanScanFunctionTest; friend class DocumentScanScanFunctionTest;
void OnScannerListReceived( void OnNamesReceived(std::vector<std::string> scanner_names);
base::Optional<lorgnette::ListScannersResponse> response);
void OnResultsReceived(base::Optional<std::string> scanned_image); void OnResultsReceived(base::Optional<std::string> scanned_image);
std::unique_ptr<document_scan::Scan::Params> params_; std::unique_ptr<document_scan::Scan::Params> params_;
......
...@@ -2,18 +2,21 @@ ...@@ -2,18 +2,21 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include <memory>
#include <string> #include <string>
#include <utility> #include <utility>
#include "base/bind.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/optional.h" #include "base/optional.h"
#include "base/values.h" #include "base/values.h"
#include "chrome/browser/chromeos/extensions/document_scan/document_scan_api.h" #include "chrome/browser/chromeos/extensions/document_scan/document_scan_api.h"
#include "chrome/browser/chromeos/scanning/fake_lorgnette_scanner_manager.h"
#include "chrome/browser/chromeos/scanning/lorgnette_scanner_manager_factory.h"
#include "chrome/browser/extensions/extension_api_unittest.h" #include "chrome/browser/extensions/extension_api_unittest.h"
#include "chrome/browser/extensions/extension_function_test_utils.h" #include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chromeos/dbus/dbus_thread_manager.h" #include "components/keyed_service/core/keyed_service.h"
#include "chromeos/dbus/fake_lorgnette_manager_client.h" #include "content/public/browser/browser_context.h"
#include "chromeos/dbus/lorgnette/lorgnette_service.pb.h"
#include "extensions/browser/api_test_utils.h" #include "extensions/browser/api_test_utils.h"
#include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -25,15 +28,13 @@ namespace api { ...@@ -25,15 +28,13 @@ namespace api {
namespace { namespace {
lorgnette::ListScannersResponse CreateListScannersResponse() { // Scanner name used for tests.
lorgnette::ScannerInfo scanner; constexpr char kTestScannerName[] = "Test Scanner";
scanner.set_name("Dank Scanner");
scanner.set_manufacturer("Scanners, Inc."); // Creates a new FakeLorgnetteScannerManager for the given |context|.
scanner.set_model("TX1000"); std::unique_ptr<KeyedService> BuildLorgnetteScannerManager(
scanner.set_type("Flatbed"); content::BrowserContext* context) {
lorgnette::ListScannersResponse response; return std::make_unique<chromeos::FakeLorgnetteScannerManager>();
*response.add_scanners() = std::move(scanner);
return response;
} }
} // namespace } // namespace
...@@ -46,18 +47,16 @@ class DocumentScanScanFunctionTest : public ExtensionApiUnittest { ...@@ -46,18 +47,16 @@ class DocumentScanScanFunctionTest : public ExtensionApiUnittest {
void SetUp() override { void SetUp() override {
ExtensionApiUnittest::SetUp(); ExtensionApiUnittest::SetUp();
chromeos::DBusThreadManager::Initialize();
function_->set_user_gesture(true); function_->set_user_gesture(true);
chromeos::LorgnetteScannerManagerFactory::GetInstance()->SetTestingFactory(
browser()->profile(),
base::BindRepeating(&BuildLorgnetteScannerManager));
} }
void TearDown() override { chromeos::FakeLorgnetteScannerManager* GetLorgnetteScannerManager() {
chromeos::DBusThreadManager::Shutdown(); return static_cast<chromeos::FakeLorgnetteScannerManager*>(
ExtensionApiUnittest::TearDown(); chromeos::LorgnetteScannerManagerFactory::GetForBrowserContext(
} browser()->profile()));
chromeos::FakeLorgnetteManagerClient* GetLorgnetteManagerClient() {
return static_cast<chromeos::FakeLorgnetteManagerClient*>(
chromeos::DBusThreadManager::Get()->GetLorgnetteManagerClient());
} }
protected: protected:
...@@ -78,37 +77,27 @@ TEST_F(DocumentScanScanFunctionTest, UserGestureRequiredError) { ...@@ -78,37 +77,27 @@ TEST_F(DocumentScanScanFunctionTest, UserGestureRequiredError) {
RunFunctionAndReturnError("[{}]")); RunFunctionAndReturnError("[{}]"));
} }
TEST_F(DocumentScanScanFunctionTest, ListScannersError) {
GetLorgnetteManagerClient()->SetListScannersResponse(base::nullopt);
EXPECT_EQ("Failed to obtain list of scanners",
RunFunctionAndReturnError("[{}]"));
}
TEST_F(DocumentScanScanFunctionTest, NoScannersAvailableError) { TEST_F(DocumentScanScanFunctionTest, NoScannersAvailableError) {
lorgnette::ListScannersResponse response; GetLorgnetteScannerManager()->SetGetScannerNamesResponse({});
GetLorgnetteManagerClient()->SetListScannersResponse(response);
EXPECT_EQ("No scanners available", RunFunctionAndReturnError("[{}]")); EXPECT_EQ("No scanners available", RunFunctionAndReturnError("[{}]"));
} }
TEST_F(DocumentScanScanFunctionTest, UnsupportedMimeTypesError) { TEST_F(DocumentScanScanFunctionTest, UnsupportedMimeTypesError) {
GetLorgnetteManagerClient()->SetListScannersResponse( GetLorgnetteScannerManager()->SetGetScannerNamesResponse({kTestScannerName});
CreateListScannersResponse());
EXPECT_EQ("Unsupported MIME types", EXPECT_EQ("Unsupported MIME types",
RunFunctionAndReturnError("[{\"mimeTypes\": [\"image/tiff\"]}]")); RunFunctionAndReturnError("[{\"mimeTypes\": [\"image/tiff\"]}]"));
} }
TEST_F(DocumentScanScanFunctionTest, ScanImageError) { TEST_F(DocumentScanScanFunctionTest, ScanImageError) {
GetLorgnetteManagerClient()->SetListScannersResponse( GetLorgnetteScannerManager()->SetGetScannerNamesResponse({kTestScannerName});
CreateListScannersResponse()); GetLorgnetteScannerManager()->SetScanResponse(base::nullopt);
GetLorgnetteManagerClient()->SetScanResponse(base::nullopt);
EXPECT_EQ("Failed to scan image", EXPECT_EQ("Failed to scan image",
RunFunctionAndReturnError("[{\"mimeTypes\": [\"image/png\"]}]")); RunFunctionAndReturnError("[{\"mimeTypes\": [\"image/png\"]}]"));
} }
TEST_F(DocumentScanScanFunctionTest, Success) { TEST_F(DocumentScanScanFunctionTest, Success) {
GetLorgnetteManagerClient()->SetListScannersResponse( GetLorgnetteScannerManager()->SetGetScannerNamesResponse({kTestScannerName});
CreateListScannersResponse()); GetLorgnetteScannerManager()->SetScanResponse("PrettyPicture");
GetLorgnetteManagerClient()->SetScanResponse("PrettyPicture");
std::unique_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( std::unique_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary(
function_.get(), "[{\"mimeTypes\": [\"image/png\"]}]")); function_.get(), "[{\"mimeTypes\": [\"image/png\"]}]"));
ASSERT_NE(nullptr, result.get()); ASSERT_NE(nullptr, result.get());
......
// Copyright 2014 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 "chrome/browser/chromeos/scanning/fake_lorgnette_scanner_manager.h"
#include <utility>
#include "base/bind.h"
#include "base/location.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
namespace chromeos {
FakeLorgnetteScannerManager::FakeLorgnetteScannerManager() = default;
FakeLorgnetteScannerManager::~FakeLorgnetteScannerManager() = default;
void FakeLorgnetteScannerManager::GetScannerNames(
GetScannerNamesCallback callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), scanner_names_));
}
void FakeLorgnetteScannerManager::Scan(
const std::string& scanner_name,
const LorgnetteManagerClient::ScanProperties& scan_properties,
ScanCallback callback) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), std::move(scan_data_)));
}
void FakeLorgnetteScannerManager::SetGetScannerNamesResponse(
const std::vector<std::string>& scanner_names) {
scanner_names_ = scanner_names;
}
void FakeLorgnetteScannerManager::SetScanResponse(
const base::Optional<std::string>& scan_data) {
scan_data_ = scan_data;
}
} // namespace chromeos
// 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.
#ifndef CHROME_BROWSER_CHROMEOS_SCANNING_FAKE_LORGNETTE_SCANNER_MANAGER_H_
#define CHROME_BROWSER_CHROMEOS_SCANNING_FAKE_LORGNETTE_SCANNER_MANAGER_H_
#include <string>
#include <vector>
#include "base/optional.h"
#include "chrome/browser/chromeos/scanning/lorgnette_scanner_manager.h"
#include "chromeos/dbus/lorgnette_manager_client.h"
namespace chromeos {
// Fake implementation of LorgnetteScannerManager for tests.
class FakeLorgnetteScannerManager final : public LorgnetteScannerManager {
public:
FakeLorgnetteScannerManager();
FakeLorgnetteScannerManager(const FakeLorgnetteScannerManager&) = delete;
FakeLorgnetteScannerManager& operator=(const FakeLorgnetteScannerManager&) =
delete;
~FakeLorgnetteScannerManager() override;
// LorgnetteScannerManager:
void GetScannerNames(GetScannerNamesCallback callback) override;
void Scan(const std::string& scanner_name,
const LorgnetteManagerClient::ScanProperties& scan_properties,
ScanCallback callback) override;
// Sets the response returned by GetScannerNames().
void SetGetScannerNamesResponse(
const std::vector<std::string>& scanner_names);
// Sets the response returned by Scan().
void SetScanResponse(const base::Optional<std::string>& scan_data);
private:
std::vector<std::string> scanner_names_;
base::Optional<std::string> scan_data_;
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_SCANNING_FAKE_LORGNETTE_SCANNER_MANAGER_H_
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