commit 37bbf63c8849c4965d8e4461be72c2abc2f9ac80
Author: Jesse Schettler <
jsche...@chromium.org>
AuthorDate: Wed Apr 07 20:24:31 2021
Commit: Chromium LUCI CQ <
chromiu...@luci-project-accounts.iam.gserviceaccount.com>
CommitDate: Wed Apr 07 20:24:31 2021
scanning: Send a scan result to the Scan app
Now that lorgnette reports a scan failure mode to Chrome clients, use it
to report a more specific scan result to the Scan app. When a scan job
fails, use the scan result to display a corresponding error message.
Screenshot:
http://shortn/_4ZeGztZ7ab
Bug: 1171948
Change-Id: I3653a7efce1e31b3c05d6faf5e52ce6d4cb24bbf
Reviewed-on:
https://chromium-review.googlesource.com/c/chromium/src/+/2806741
Reviewed-by: Zentaro Kavanagh <
zen...@chromium.org>
Reviewed-by: Daniel Cheng <
dch...@chromium.org>
Commit-Queue: Jesse Schettler <
jsche...@chromium.org>
Cr-Commit-Position: refs/heads/master@{#870179}
diff --git a/ash/content/scanning/mojom/scanning.mojom b/ash/content/scanning/mojom/scanning.mojom
index d89ee6e..96b710c 100644
--- a/ash/content/scanning/mojom/scanning.mojom
+++ b/ash/content/scanning/mojom/scanning.mojom
@@ -93,6 +93,24 @@
mojo_base.mojom.String16 display_name;
};
+// The result of a scan job.
+enum ScanResult {
+ // The scan completed successfully.
+ kSuccess,
+ // An unknown or generic error occurred.
+ kUnknownError,
+ // The device is busy.
+ kDeviceBusy,
+ // The document feeder is jammed.
+ kAdfJammed,
+ // The document feeder is empty.
+ kAdfEmpty,
+ // The flatbed cover is open.
+ kFlatbedOpen,
+ // An error occurred while communicating with the device.
+ kIoError,
+};
+
// Observer interface used to send remote updates about an in-progress scan job
// to the Scan app (chrome://scanning) receiver. When the corresponding scan job
// is complete, the remote and receiver are disconnected.
@@ -106,11 +124,11 @@
// TODO(jschettler): Send a lower resolution preview.
OnPageComplete(array<uint8> page_data);
- // Called when the scan is complete. |success| indicates whether the scan
- // completed successfully. |scanned_file_paths| contains all the file paths of
- // the pages scanned in a scan job. |scanned_file_paths| is an empty array for
- // failed scans.
- OnScanComplete(bool success,
+ // Called when the scan is complete. |result| indicates the result of the scan
+ // and is set to kSuccess when the scan completes successfully.
+ // |scanned_file_paths| contains all the file paths of the pages scanned in a
+ // scan job. |scanned_file_paths| is an empty array for failed scans.
+ OnScanComplete(ScanResult result,
array<mojo_base.mojom.FilePath> scanned_file_paths);
// Called when canceling the current scan job is complete. |success|
diff --git a/ash/content/scanning/resources/scanning_app.html b/ash/content/scanning/resources/scanning_app.html
index 14e2540..d9703b2 100644
--- a/ash/content/scanning/resources/scanning_app.html
+++ b/ash/content/scanning/resources/scanning_app.html
@@ -272,8 +272,8 @@
</iron-icon>
[[i18n('scanFailedDialogTitleText')]]
</div>
- <div slot="body">
- [[i18n('scanFailedDialogBodyText')]]
+ <div id="scanFailedDialogText" slot="body">
+ [[i18n(scanFailedDialogTextKey_)]]
</div>
<div slot="button-container">
<cr-button class="cancel-button" on-click="onDialogGetHelpClick_">
diff --git a/ash/content/scanning/resources/scanning_app.js b/ash/content/scanning/resources/scanning_app.js
index e5ec744..78fa45c 100644
--- a/ash/content/scanning/resources/scanning_app.js
+++ b/ash/content/scanning/resources/scanning_app.js
@@ -252,6 +252,26 @@
type: Number,
value: 0,
},
+
+ /**
+ * Indicates the result of the scan job. Set to kSuccess when the scan job
+ * succeeds.
+ * @private {!ash.scanning.mojom.ScanResult}
+ */
+ scanResult_: {
+ type: Number,
+ value: ash.scanning.mojom.ScanResult.kSuccess,
+ },
+
+ /**
+ * The key to retrieve the appropriate string to display in an error dialog
+ * when a scan job fails.
+ * @private {string}
+ */
+ scanFailedDialogTextKey_: {
+ type: String,
+ computed: 'computeScanFailedDialogTextKey_(scanResult_)',
+ },
},
observers:
@@ -321,11 +341,13 @@
/**
* Overrides ash.scanning.mojom.ScanJobObserverInterface.
- * @param {boolean} success
+ * @param {!ash.scanning.mojom.ScanResult} result
* @param {!Array<!mojoBase.mojom.FilePath>} scannedFilePaths
*/
- onScanComplete(success, scannedFilePaths) {
- if (!success || this.objectUrls_.length == 0) {
+ onScanComplete(result, scannedFilePaths) {
+ this.scanResult_ = result;
+ if (this.scanResult_ !== ash.scanning.mojom.ScanResult.kSuccess ||
+ this.objectUrls_.length == 0) {
this.$.scanFailedDialog.showModal();
return;
}
@@ -683,4 +705,25 @@
++this.numScanSettingChanges_;
},
+
+ /**
+ * @return {string}
+ * @private
+ */
+ computeScanFailedDialogTextKey_() {
+ switch (this.scanResult_) {
+ case (ash.scanning.mojom.ScanResult.kDeviceBusy):
+ return 'scanFailedDialogDeviceBusyText';
+ case (ash.scanning.mojom.ScanResult.kAdfJammed):
+ return 'scanFailedDialogAdfJammedText';
+ case (ash.scanning.mojom.ScanResult.kAdfEmpty):
+ return 'scanFailedDialogAdfEmptyText';
+ case (ash.scanning.mojom.ScanResult.kFlatbedOpen):
+ return 'scanFailedDialogFlatbedOpenText';
+ case (ash.scanning.mojom.ScanResult.kIoError):
+ return 'scanFailedDialogIoErrorText';
+ default:
+ return 'scanFailedDialogUnknownErrorText';
+ }
+ },
});
diff --git a/ash/content/scanning/scanning_ui.cc b/ash/content/scanning/scanning_ui.cc
index d9c1bcf..237d26f0 100644
--- a/ash/content/scanning/scanning_ui.cc
+++ b/ash/content/scanning/scanning_ui.cc
@@ -85,10 +85,20 @@
{"retryButtonLabel", IDS_SCANNING_APP_RETRY_BUTTON_LABEL},
{"scanButtonText", IDS_SCANNING_APP_SCAN_BUTTON_TEXT},
{"scanCanceledToastText", IDS_SCANNING_APP_SCAN_CANCELED_TOAST_TEXT},
- {"scanFailedDialogBodyText",
- IDS_SCANNING_APP_SCAN_FAILED_DIALOG_BODY_TEXT},
+ {"scanFailedDialogAdfEmptyText",
+ IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_EMPTY_TEXT},
+ {"scanFailedDialogAdfJammedText",
+ IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_JAMMED_TEXT},
+ {"scanFailedDialogDeviceBusyText",
+ IDS_SCANNING_APP_SCAN_FAILED_DIALOG_DEVICE_BUSY_TEXT},
+ {"scanFailedDialogFlatbedOpenText",
+ IDS_SCANNING_APP_SCAN_FAILED_DIALOG_FLATBED_OPEN_TEXT},
+ {"scanFailedDialogIoErrorText",
+ IDS_SCANNING_APP_SCAN_FAILED_DIALOG_IO_ERROR_TEXT},
{"scanFailedDialogTitleText",
IDS_SCANNING_APP_SCAN_FAILED_DIALOG_TITLE_TEXT},
+ {"scanFailedDialogUnknownErrorText",
+ IDS_SCANNING_APP_SCAN_FAILED_DIALOG_UNKNOWN_ERROR_TEXT},
{"scanPreviewHelperText", IDS_SCANNING_APP_SCAN_PREVIEW_HELPER_TEXT},
{"scanPreviewProgressText", IDS_SCANNING_APP_SCAN_PREVIEW_PROGRESS_TEXT},
{"scanToDropdownLabel", IDS_SCANNING_APP_SCAN_TO_DROPDOWN_LABEL},
diff --git a/chrome/browser/ash/scanning/fake_lorgnette_scanner_manager.cc b/chrome/browser/ash/scanning/fake_lorgnette_scanner_manager.cc
index f27fc457..8483f77 100644
--- a/chrome/browser/ash/scanning/fake_lorgnette_scanner_manager.cc
+++ b/chrome/browser/ash/scanning/fake_lorgnette_scanner_manager.cc
@@ -56,7 +56,7 @@
base::BindOnce(std::move(completion_callback), scan_data_.has_value(),
scan_data_.has_value()
? lorgnette::SCAN_FAILURE_MODE_NO_FAILURE
- : lorgnette::SCAN_FAILURE_MODE_UNKNOWN));
+ : lorgnette::SCAN_FAILURE_MODE_DEVICE_BUSY));
}
void FakeLorgnetteScannerManager::CancelScan(CancelCallback cancel_callback) {
diff --git a/chrome/browser/ash/scanning/scan_service.cc b/chrome/browser/ash/scanning/scan_service.cc
index dfc0235..bb06fd5 100644
--- a/chrome/browser/ash/scanning/scan_service.cc
+++ b/chrome/browser/ash/scanning/scan_service.cc
@@ -420,7 +420,9 @@
}
void ScanService::OnScanCompleted(bool success,
- lorgnette::ScanFailureMode /*failure_mode*/) {
+ lorgnette::ScanFailureMode failure_mode) {
+ DCHECK_EQ(success, failure_mode == lorgnette::SCAN_FAILURE_MODE_NO_FAILURE);
+
// |scanned_images_| only has data for PDF scans.
if (success && !scanned_images_.empty()) {
DCHECK(!scanned_file_paths_.empty());
@@ -436,9 +438,11 @@
// before reporting the scan job as complete.
base::PostTaskAndReplyWithResult(
task_runner_.get(), FROM_HERE,
- base::BindOnce([](bool success) { return success; }, success),
+ base::BindOnce(
+ [](lorgnette::ScanFailureMode failure_mode) { return failure_mode; },
+ failure_mode),
base::BindOnce(&ScanService::OnAllPagesSaved,
- weak_ptr_factory_.GetWeakPtr()));
+ weak_ptr_factory_.GetWeakPtr(), success));
}
void ScanService::OnCancelCompleted(bool success) {
@@ -460,18 +464,25 @@
scanned_file_paths_.push_back(saved_file_path);
}
-void ScanService::OnAllPagesSaved(bool success) {
+void ScanService::OnAllPagesSaved(bool success,
+ lorgnette::ScanFailureMode failure_mode) {
+ DCHECK_EQ(success, failure_mode == lorgnette::SCAN_FAILURE_MODE_NO_FAILURE);
+
base::Optional<scanning::ScanJobFailureReason> failure_reason = base::nullopt;
if (!success) {
+ // TODO(jschettler): Get ScanJobFailureReason from |failure_mode|.
failure_reason = scanning::ScanJobFailureReason::kUnknownScannerError;
scanned_file_paths_.clear();
} else if (page_save_failed_) {
+ failure_mode = lorgnette::SCAN_FAILURE_MODE_UNKNOWN;
failure_reason = scanning::ScanJobFailureReason::kSaveToDiskFailed;
scanned_file_paths_.clear();
}
- scan_job_observer_->OnScanComplete(success && !page_save_failed_,
- scanned_file_paths_);
+ scan_job_observer_->OnScanComplete(
+ mojo::ConvertTo<mojo_ipc::ScanResult>(
+ static_cast<lorgnette::ScanFailureMode>(failure_mode)),
+ scanned_file_paths_);
RecordScanJobResult(success && !page_save_failed_, failure_reason,
num_pages_scanned_);
}
diff --git a/chrome/browser/ash/scanning/scan_service.h b/chrome/browser/ash/scanning/scan_service.h
index 37acf04..ad7e3c5 100644
--- a/chrome/browser/ash/scanning/scan_service.h
+++ b/chrome/browser/ash/scanning/scan_service.h
@@ -94,8 +94,7 @@
uint32_t page_number);
// Processes the final result of calling LorgnetteScannerManager::Scan().
- void OnScanCompleted(bool success,
- lorgnette::ScanFailureMode /*failure_mode*/);
+ void OnScanCompleted(bool success, lorgnette::ScanFailureMode failure_mode);
// Processes the final result of calling
// LorgnetteScannerManager::CancelScan().
@@ -108,7 +107,7 @@
void OnPageSaved(const base::FilePath& saved_file_path);
// Called once the task runner finishes saving the last page of a scan.
- void OnAllPagesSaved(bool success);
+ void OnAllPagesSaved(bool success, lorgnette::ScanFailureMode failure_mode);
// Sets the local member variables back to their initial empty state.
void ClearScanState();
diff --git a/chrome/browser/ash/scanning/scan_service_unittest.cc b/chrome/browser/ash/scanning/scan_service_unittest.cc
index c405e6c..5851bbb 100644
--- a/chrome/browser/ash/scanning/scan_service_unittest.cc
+++ b/chrome/browser/ash/scanning/scan_service_unittest.cc
@@ -156,9 +156,9 @@
}
void OnScanComplete(
- bool success,
+ mojo_ipc::ScanResult result,
const std::vector<base::FilePath>& scanned_file_paths) override {
- scan_success_ = success;
+ scan_result_ = result;
scanned_file_paths_ = scanned_file_paths;
}
@@ -179,12 +179,16 @@
// Returns true if the scan completed successfully.
bool scan_success() const {
- return progress_ == 100 && page_complete_ && scan_success_;
+ return progress_ == 100 && page_complete_ &&
+ scan_result_ == mojo_ipc::ScanResult::kSuccess;
}
// Returns true if the cancel scan request completed successfully.
bool cancel_scan_success() const { return cancel_scan_success_; }
+ // Returns the result of the scan job.
+ mojo_ipc::ScanResult scan_result() const { return scan_result_; }
+
// Returns file paths of the saved scan files.
std::vector<base::FilePath> scanned_file_paths() const {
return scanned_file_paths_;
@@ -193,7 +197,7 @@
private:
uint32_t progress_ = 0;
bool page_complete_ = false;
- bool scan_success_ = false;
+ mojo_ipc::ScanResult scan_result_ = mojo_ipc::ScanResult::kUnknownError;
bool cancel_scan_success_ = false;
std::vector<base::FilePath> scanned_file_paths_;
mojo::Receiver<mojo_ipc::ScanJobObserver> receiver_{this};
@@ -398,6 +402,8 @@
EXPECT_TRUE(base::PathExists(saved_scan_path));
EXPECT_TRUE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kSuccess,
+ fake_scan_job_observer_.scan_result());
EXPECT_EQ(saved_scan_paths, fake_scan_job_observer_.scanned_file_paths());
}
}
@@ -425,6 +431,8 @@
EXPECT_TRUE(StartScan(scanners[0]->id, settings.Clone()));
EXPECT_TRUE(base::PathExists(saved_scan_path));
EXPECT_TRUE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kSuccess,
+ fake_scan_job_observer_.scan_result());
const std::vector<base::FilePath> scanned_file_paths =
fake_scan_job_observer_.scanned_file_paths();
EXPECT_EQ(1u, scanned_file_paths.size());
@@ -477,6 +485,8 @@
EXPECT_TRUE(StartScan(scanners[0]->id, settings.Clone()));
EXPECT_FALSE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kDeviceBusy,
+ fake_scan_job_observer_.scan_result());
EXPECT_TRUE(fake_scan_job_observer_.scanned_file_paths().empty());
}
@@ -497,6 +507,8 @@
EXPECT_TRUE(StartScan(scanners[0]->id, settings.Clone()));
EXPECT_FALSE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kUnknownError,
+ fake_scan_job_observer_.scan_result());
EXPECT_TRUE(fake_scan_job_observer_.scanned_file_paths().empty());
}
@@ -515,6 +527,8 @@
EXPECT_TRUE(StartScan(scanners[0]->id, settings.Clone()));
EXPECT_FALSE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kDeviceBusy,
+ fake_scan_job_observer_.scan_result());
EXPECT_TRUE(fake_scan_job_observer_.scanned_file_paths().empty());
// Set scan data so next scan is successful.
@@ -535,6 +549,8 @@
EXPECT_TRUE(base::PathExists(saved_scan_path));
EXPECT_TRUE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kSuccess,
+ fake_scan_job_observer_.scan_result());
EXPECT_EQ(saved_scan_paths, fake_scan_job_observer_.scanned_file_paths());
}
@@ -566,6 +582,8 @@
EXPECT_TRUE(base::PathExists(saved_scan_path));
EXPECT_TRUE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kSuccess,
+ fake_scan_job_observer_.scan_result());
EXPECT_EQ(saved_scan_paths, fake_scan_job_observer_.scanned_file_paths());
// Remove the scan data from FakeLorgnetteScannerManager so the scan will
@@ -574,6 +592,8 @@
EXPECT_TRUE(StartScan(scanners[0]->id, settings.Clone()));
EXPECT_FALSE(fake_scan_job_observer_.scan_success());
+ EXPECT_EQ(mojo_ipc::ScanResult::kDeviceBusy,
+ fake_scan_job_observer_.scan_result());
EXPECT_TRUE(fake_scan_job_observer_.scanned_file_paths().empty());
}
diff --git a/chrome/browser/ash/scanning/scanning_type_converters.cc b/chrome/browser/ash/scanning/scanning_type_converters.cc
index 7801bddc..7d1bf8a 100644
--- a/chrome/browser/ash/scanning/scanning_type_converters.cc
+++ b/chrome/browser/ash/scanning/scanning_type_converters.cc
@@ -5,7 +5,6 @@
#include "chrome/browser/ash/scanning/scanning_type_converters.h"
#include "base/notreached.h"
-#include "chromeos/dbus/lorgnette/lorgnette_service.pb.h"
namespace mojo {
@@ -138,6 +137,34 @@
};
// static
+mojo_ipc::ScanResult
+TypeConverter<mojo_ipc::ScanResult, lorgnette::ScanFailureMode>::Convert(
+ const lorgnette::ScanFailureMode lorgnette_failure_mode) {
+ switch (lorgnette_failure_mode) {
+ case lorgnette::SCAN_FAILURE_MODE_NO_FAILURE:
+ return mojo_ipc::ScanResult::kSuccess;
+ case lorgnette::SCAN_FAILURE_MODE_UNKNOWN:
+ return mojo_ipc::ScanResult::kUnknownError;
+ case lorgnette::SCAN_FAILURE_MODE_DEVICE_BUSY:
+ return mojo_ipc::ScanResult::kDeviceBusy;
+ case lorgnette::SCAN_FAILURE_MODE_ADF_JAMMED:
+ return mojo_ipc::ScanResult::kAdfJammed;
+ case lorgnette::SCAN_FAILURE_MODE_ADF_EMPTY:
+ return mojo_ipc::ScanResult::kAdfEmpty;
+ case lorgnette::SCAN_FAILURE_MODE_FLATBED_OPEN:
+ return mojo_ipc::ScanResult::kFlatbedOpen;
+ case lorgnette::SCAN_FAILURE_MODE_IO_ERROR:
+ return mojo_ipc::ScanResult::kIoError;
+ case lorgnette::ScanFailureMode_INT_MIN_SENTINEL_DO_NOT_USE_:
+ case lorgnette::ScanFailureMode_INT_MAX_SENTINEL_DO_NOT_USE_:
+ break;
+ }
+
+ NOTREACHED();
+ return mojo_ipc::ScanResult::kUnknownError;
+}
+
+// static
mojo_ipc::ScannerCapabilitiesPtr TypeConverter<mojo_ipc::ScannerCapabilitiesPtr,
lorgnette::ScannerCapabilities>::
Convert(const lorgnette::ScannerCapabilities& lorgnette_caps) {
diff --git a/chrome/browser/ash/scanning/scanning_type_converters.h b/chrome/browser/ash/scanning/scanning_type_converters.h
index 79398b0..3882f0d 100644
--- a/chrome/browser/ash/scanning/scanning_type_converters.h
+++ b/chrome/browser/ash/scanning/scanning_type_converters.h
@@ -6,16 +6,19 @@
#define CHROME_BROWSER_ASH_SCANNING_SCANNING_TYPE_CONVERTERS_H_
#include "ash/content/scanning/mojom/scanning.mojom.h"
+#include "chromeos/dbus/lorgnette/lorgnette_service.pb.h"
#include "mojo/public/cpp/bindings/type_converter.h"
-namespace lorgnette {
-class ScannerCapabilities;
-class ScanSettings;
-} // namespace lorgnette
-
namespace mojo {
template <>
+struct TypeConverter<ash::scanning::mojom::ScanResult,
+ lorgnette::ScanFailureMode> {
+ static ash::scanning::mojom::ScanResult Convert(
+ const lorgnette::ScanFailureMode lorgnette_failure_mode);
+};
+
+template <>
struct TypeConverter<ash::scanning::mojom::ScannerCapabilitiesPtr,
lorgnette::ScannerCapabilities> {
static ash::scanning::mojom::ScannerCapabilitiesPtr Convert(
diff --git a/chrome/browser/ash/scanning/scanning_type_converters_unittest.cc b/chrome/browser/ash/scanning/scanning_type_converters_unittest.cc
index fc1e302..da14038 100644
--- a/chrome/browser/ash/scanning/scanning_type_converters_unittest.cc
+++ b/chrome/browser/ash/scanning/scanning_type_converters_unittest.cc
@@ -196,4 +196,30 @@
lorgnette::MODE_COLOR,
mojo_ipc::PageSize::kMax, 0, 0}));
+// Test that each lorgnette::ScanFailureMode is converted into the correct
+// mojo_ipc::ScanResult.
+TEST(ScanResultTest, Convert) {
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_NO_FAILURE),
+ mojo_ipc::ScanResult::kSuccess);
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_UNKNOWN),
+ mojo_ipc::ScanResult::kUnknownError);
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_DEVICE_BUSY),
+ mojo_ipc::ScanResult::kDeviceBusy);
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_ADF_JAMMED),
+ mojo_ipc::ScanResult::kAdfJammed);
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_ADF_EMPTY),
+ mojo_ipc::ScanResult::kAdfEmpty);
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_FLATBED_OPEN),
+ mojo_ipc::ScanResult::kFlatbedOpen);
+ EXPECT_EQ(mojo::ConvertTo<mojo_ipc::ScanResult>(
+ lorgnette::SCAN_FAILURE_MODE_IO_ERROR),
+ mojo_ipc::ScanResult::kIoError);
+}
+
} // namespace ash
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
index 245e39b..039b2d7 100644
--- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
+++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -4,6 +4,7 @@
import 'chrome://scanning/scanning_app.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
import {setScanServiceForTesting} from 'chrome://scanning/mojo_interface_provider.js';
import {ScannerArr} from 'chrome://scanning/scanning_app_types.js';
@@ -178,12 +179,12 @@
}
/**
- * @param {boolean} success
+ * @param {!ash.scanning.mojom.ScanResult} result
* @param {!Array<!mojoBase.mojom.FilePath>} scannedFilePaths
* @return {!Promise}
*/
- simulateScanComplete(success, scannedFilePaths) {
- this.scanJobObserverRemote_.onScanComplete(success, scannedFilePaths);
+ simulateScanComplete(result, scannedFilePaths) {
+ this.scanJobObserverRemote_.onScanComplete(result, scannedFilePaths);
return flushTasks();
}
@@ -524,7 +525,8 @@
})
.then(() => {
// Complete the scan.
- return fakeScanService_.simulateScanComplete(true, scannedFilePaths);
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kSuccess, scannedFilePaths);
})
.then(() => {
assertTrue(isVisible(/** @type {!HTMLElement} */ (scannedImages)));
@@ -581,7 +583,8 @@
})
.then(() => {
// Simulate the scan failing.
- return fakeScanService_.simulateScanComplete(false, []);
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kIoError, []);
})
.then(() => {
// The scan failed dialog should open.
@@ -598,6 +601,99 @@
});
});
+ test('ScanResults', () => {
+ return initializeScanningApp(expectedScanners, capabilities)
+ .then(() => {
+ return fakeScanService_.whenCalled('getScannerCapabilities');
+ })
+ .then(() => {
+ scanButton =
+ /** @type {!CrButtonElement} */ (scanningApp.$$('#scanButton'));
+ scanButton.click();
+ return fakeScanService_.whenCalled('startScan');
+ })
+ .then(() => {
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kUnknownError, []);
+ })
+ .then(() => {
+ assertEquals(
+ loadTimeData.getString('scanFailedDialogUnknownErrorText'),
+ scanningApp.$$('#scanFailedDialogText').textContent.trim());
+ return clickOkButton();
+ })
+ .then(() => {
+ scanButton.click();
+ return fakeScanService_.whenCalled('startScan');
+ })
+ .then(() => {
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kDeviceBusy, []);
+ })
+ .then(() => {
+ assertEquals(
+ loadTimeData.getString('scanFailedDialogDeviceBusyText'),
+ scanningApp.$$('#scanFailedDialogText').textContent.trim());
+ return clickOkButton();
+ })
+ .then(() => {
+ scanButton.click();
+ return fakeScanService_.whenCalled('startScan');
+ })
+ .then(() => {
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kAdfJammed, []);
+ })
+ .then(() => {
+ assertEquals(
+ loadTimeData.getString('scanFailedDialogAdfJammedText'),
+ scanningApp.$$('#scanFailedDialogText').textContent.trim());
+ return clickOkButton();
+ })
+ .then(() => {
+ scanButton.click();
+ return fakeScanService_.whenCalled('startScan');
+ })
+ .then(() => {
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kAdfEmpty, []);
+ })
+ .then(() => {
+ assertEquals(
+ loadTimeData.getString('scanFailedDialogAdfEmptyText'),
+ scanningApp.$$('#scanFailedDialogText').textContent.trim());
+ return clickOkButton();
+ })
+ .then(() => {
+ scanButton.click();
+ return fakeScanService_.whenCalled('startScan');
+ })
+ .then(() => {
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kFlatbedOpen, []);
+ })
+ .then(() => {
+ assertEquals(
+ loadTimeData.getString('scanFailedDialogFlatbedOpenText'),
+ scanningApp.$$('#scanFailedDialogText').textContent.trim());
+ return clickOkButton();
+ })
+ .then(() => {
+ scanButton.click();
+ return fakeScanService_.whenCalled('startScan');
+ })
+ .then(() => {
+ return fakeScanService_.simulateScanComplete(
+ ash.scanning.mojom.ScanResult.kIoError, []);
+ })
+ .then(() => {
+ assertEquals(
+ loadTimeData.getString('scanFailedDialogIoErrorText'),
+ scanningApp.$$('#scanFailedDialogText').textContent.trim());
+ return clickOkButton();
+ });
+ });
+
test('CancelScan', () => {
return initializeScanningApp(expectedScanners, capabilities)
.then(() => {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 5f25ebb..676143ea 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -594,11 +594,26 @@
File not found
</message>
<message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_TITLE_TEXT" desc="The text displayed as the title of the dialog shown when a scan job fails.">
- Couldn't complete scanning
+ Couldn't complete scan
</message>
- <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_BODY_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails. The text advises the user to make sure their Chromebook has enough space to save files.">
+ <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_UNKNOWN_ERROR_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails for an unknown reason. The text advises the user to make sure their Chromebook has enough space to save files.">
Check the scanner and try again. Make sure there is enough local space to save scanned files.
</message>
+ <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_DEVICE_BUSY_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails due to the scanner being busy. The text advises the user to try scanning again once the scanner is no longer in use.">
+ Scanner is currently in use. Try again later.
+ </message>
+ <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_JAMMED_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails due to the scanner's document feeder being jammmed. The text advises the user to clear the feeder and try again.">
+ The scanner’s document feeder is jammed. Check the feeder and try again.
+ </message>
+ <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_EMPTY_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails due to the scanner's document feeder being empty. The text advises the user to place documents in the feeder and try again.">
+ The scanner’s document feeder is empty. Add documents and try again.
+ </message>
+ <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_FLATBED_OPEN_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails due to the scanner's cover being open. The text advises the user to close the cover and try again.">
+ The scanner’s cover is open. Close the cover and try again.
+ </message>
+ <message name="IDS_SCANNING_APP_SCAN_FAILED_DIALOG_IO_ERROR_TEXT" desc="The text displayed as the body of the dialog shown when a scan job fails due to a communication issue with the scanner. The text advises the user to check the network or USB connection and try again.">
+ There's an issue communicating with the scanner. Check the network or USB connection and try again.
+ </message>
<message name="IDS_SCANNING_APP_OK_BUTTON_LABEL" desc="The label for the button to acknowledge and close the dialog shown when a scan job fails.">
Ok
</message>
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_EMPTY_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_EMPTY_TEXT.png.sha1
new file mode 100644
index 0000000..e73a3b5
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_EMPTY_TEXT.png.sha1
@@ -0,0 +1 @@
+11f7e7f2c5a84a59cf35f219d535accdd6dd1d9c
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_JAMMED_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_JAMMED_TEXT.png.sha1
new file mode 100644
index 0000000..e8d94a72
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_ADF_JAMMED_TEXT.png.sha1
@@ -0,0 +1 @@
+bdb405edc2fd1132df6ae1ee5d49a0e5794075f8
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_BODY_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_BODY_TEXT.png.sha1
deleted file mode 100644
index ff3a7ec..0000000
--- a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_BODY_TEXT.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-330b016c2bc440ebdab0390e248f9b954ef358cf
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_DEVICE_BUSY_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_DEVICE_BUSY_TEXT.png.sha1
new file mode 100644
index 0000000..0190ed4
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_DEVICE_BUSY_TEXT.png.sha1
@@ -0,0 +1 @@
+27bd55b7c17c72e7f85eb9a9153b38807a194e4a
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_FLATBED_OPEN_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_FLATBED_OPEN_TEXT.png.sha1
new file mode 100644
index 0000000..0740d2b
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_FLATBED_OPEN_TEXT.png.sha1
@@ -0,0 +1 @@
+e1a189b087438154a14b8f2df60d87cf33e6e3d8
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_IO_ERROR_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_IO_ERROR_TEXT.png.sha1
new file mode 100644
index 0000000..1ed9f95
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_IO_ERROR_TEXT.png.sha1
@@ -0,0 +1 @@
+551bd38c87f72d786a3fefe87c785b872901969d
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_TITLE_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_TITLE_TEXT.png.sha1
index 2b41a06..d5bf65b 100644
--- a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_TITLE_TEXT.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_TITLE_TEXT.png.sha1
@@ -1 +1 @@
-d549db71efcb6dd3c3c7abd10e06b917338b9b92
\ No newline at end of file
+a0f091418bb96d34001a7190dfa776abacd38884
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_UNKNOWN_ERROR_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_UNKNOWN_ERROR_TEXT.png.sha1
new file mode 100644
index 0000000..d5bf65b
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SCAN_FAILED_DIALOG_UNKNOWN_ERROR_TEXT.png.sha1
@@ -0,0 +1 @@
+a0f091418bb96d34001a7190dfa776abacd38884
\ No newline at end of file