CCA: Remove BigBuffer usage on ARM devices

Remove BigBuffer usage on ARM devices since the fail rate is high.

Test: tast run <cherry> camera.DocumentScanning
Test: Ensure BigBuffer is not used by adding logs.
Bug: b:360028048
Change-Id: Ide932293669f0dbba8af66d7456b8ece73f2616a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5802838
Reviewed-by: Sean Li <seannli@google.com>
Commit-Queue: Chu-Hsuan Yang <chuhsuan@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1347145}
diff --git a/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts b/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts
index 7727f4a..9396e21 100644
--- a/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts
+++ b/ash/webui/camera_app_ui/resources/js/models/load_time_data.ts
@@ -86,3 +86,11 @@
 export function getOsVersion(): string {
   return loadTimeData.getString('os_version');
 }
+
+
+/**
+ * Returns if BigBuffer can be used.
+ */
+export function getCanUseBigBuffer(): boolean {
+  return loadTimeData.getBoolean('can_use_big_buffer');
+}
diff --git a/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts b/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
index 4b2c4d1..d823a69 100644
--- a/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
+++ b/ash/webui/camera_app_ui/resources/js/mojo/chrome_helper.ts
@@ -6,6 +6,7 @@
 import {reportError} from '../error.js';
 import {Point} from '../geometry.js';
 import * as localDev from '../local_dev.js';
+import {getCanUseBigBuffer} from '../models/load_time_data.js';
 import {
   ErrorLevel,
   ErrorType,
@@ -113,15 +114,32 @@
   return castToNumberArray(new Uint8Array(buffer));
 }
 
-export abstract class ChromeHelper {
-  /**
-   * TODO(b/349015781): A flag to determine if we should use BigBuffer. It
-   * will be turned off when something went wrong when using BigBuffer. In the
-   * future, we want to monitor the error metrics to see if this flag is still
-   * needed.
-   */
-  static useBigBuffer = true;
+/**
+ * When BigBuffer fails, set this flag to `true` and fallback to inline buffer
+ * for further calls.
+ */
+let bigBufferFailed = false;
 
+/**
+ * Returns if BigBuffer should be used.
+ */
+export function shouldUseBigBuffer(): boolean {
+  return getCanUseBigBuffer() && !bigBufferFailed;
+}
+
+/**
+ * Sets the `bigBufferFailed` flag and reports the error.
+ */
+export function handleBigBufferError(e: unknown): void {
+  bigBufferFailed = true;
+  reportError(
+      ErrorType.BIG_BUFFER_FAILURE,
+      ErrorLevel.WARNING,
+      assertInstanceof(e, Error),
+  );
+}
+
+export abstract class ChromeHelper {
   /**
    * Starts monitoring tablet mode state of device.
    *
@@ -299,15 +317,6 @@
     }
     return instance;
   }
-
-  static handleBigBufferError(e: unknown): void {
-    ChromeHelper.useBigBuffer = false;
-    reportError(
-        ErrorType.BIG_BUFFER_FAILURE,
-        ErrorLevel.WARNING,
-        assertInstanceof(e, Error),
-    );
-  }
 }
 
 export const getInstanceImpl =
@@ -560,13 +569,13 @@
 
   override async performOcr(jpeg: Blob): Promise<OcrResult> {
     try {
-      if (ChromeHelper.useBigBuffer) {
+      if (shouldUseBigBuffer()) {
         const bigBuffer = await createBigBufferFromBlob(jpeg);
         const {ocrResult} = await this.remote.performOcr(bigBuffer);
         return ocrResult;
       }
     } catch (e) {
-      ChromeHelper.handleBigBufferError(e);
+      handleBigBufferError(e);
     }
     const numArray = await createNumArrayFromBlob(jpeg);
     const {ocrResult} = await this.remote.performOcrInline(numArray);
diff --git a/ash/webui/camera_app_ui/resources/js/views/document_review.ts b/ash/webui/camera_app_ui/resources/js/views/document_review.ts
index 900175c..5a52aa7 100644
--- a/ash/webui/camera_app_ui/resources/js/views/document_review.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/document_review.ts
@@ -25,6 +25,8 @@
   ChromeHelper,
   createBigBufferFromBlob,
   createNumArrayFromBlob,
+  handleBigBufferError,
+  shouldUseBigBuffer,
 } from '../mojo/chrome_helper.js';
 import {
   BigBuffer,
@@ -645,13 +647,13 @@
   async addPage(jpg: Blob, index: number): Promise<void> {
     assert(this.builder !== null);
     try {
-      if (ChromeHelper.useBigBuffer) {
+      if (shouldUseBigBuffer()) {
         const bigBuffer = await createBigBufferFromBlob(jpg);
         this.builder.addPage(bigBuffer, index);
         return;
       }
     } catch (e) {
-      ChromeHelper.handleBigBufferError(e);
+      handleBigBufferError(e);
     }
     const numArray = await createNumArrayFromBlob(jpg);
     this.builder.addPageInline(numArray, index);
@@ -671,12 +673,12 @@
   async save(): Promise<Blob> {
     assert(this.builder !== null);
     try {
-      if (ChromeHelper.useBigBuffer) {
+      if (shouldUseBigBuffer()) {
         const {pdf} = await this.builder.save();
         return this.createPdfBlob(pdf);
       }
     } catch (e) {
-      ChromeHelper.handleBigBufferError(e);
+      handleBigBufferError(e);
     }
     const {pdf} = await this.builder.saveInline();
     return new Blob([new Uint8Array(pdf)], {type: MimeType.PDF});
diff --git a/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc b/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc
index 814dbb8..5164c659 100644
--- a/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc
+++ b/chrome/browser/ash/system_web_apps/apps/camera_app/chrome_camera_app_ui_delegate.cc
@@ -557,6 +557,10 @@
   source->AddString("browser_version",
                     std::string(version_info::GetVersionNumber()));
   source->AddString("os_version", base::SysInfo::OperatingSystemVersion());
+
+  // BigBuffer doesn't work well on ARM devices. See b/360028048.
+  std::string arch = base::SysInfo::ProcessCPUArchitecture();
+  source->AddBoolean("can_use_big_buffer", !base::StartsWith(arch, "ARM"));
 }
 
 bool ChromeCameraAppUIDelegate::IsMetricsAndCrashReportingEnabled() {