From b9cb651c44f0012ac90b8c24e5b38acc840a8a29 Mon Sep 17 00:00:00 2001
From: Calixte Denizet <calixte.denizet@gmail.com>
Date: Mon, 28 Nov 2022 18:24:26 +0100
Subject: [PATCH] [api-minor] Remove all the useless telemetry stuff in the
 viewer (bug 1802468)

Add a deprecation notification for PDFDocumentLoadingTask.onUnsupportedFeature and PDFDocumentProxy.stats
which are likely useless.
The unsupported feature stuff have initially been added in (#4048) in order to be able to display a
warning bar and to help to have some numbers to know how a feature was used.
Those data are no more used in Firefox.
---
 src/display/api.js |  30 +++++++++---
 web/app.js         | 114 ---------------------------------------------
 2 files changed, 24 insertions(+), 120 deletions(-)

diff --git a/src/display/api.js b/src/display/api.js
index 32d870f52..b14be25d1 100644
--- a/src/display/api.js
+++ b/src/display/api.js
@@ -559,6 +559,8 @@ async function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
 class PDFDocumentLoadingTask {
   static #docId = 0;
 
+  #onUnsupportedFeature = null;
+
   constructor() {
     this._capability = createPromiseCapability();
     this._transport = null;
@@ -591,13 +593,26 @@ class PDFDocumentLoadingTask {
      * @type {function}
      */
     this.onProgress = null;
+  }
 
-    /**
-     * Callback for when an unsupported feature is used in the PDF document.
-     * The callback receives an {@link UNSUPPORTED_FEATURES} argument.
-     * @type {function}
-     */
-    this.onUnsupportedFeature = null;
+  /**
+   * @type {function | null} The current callback used with unsupported
+   * features.
+   */
+  get onUnsupportedFeature() {
+    return this.#onUnsupportedFeature;
+  }
+
+  /**
+   * Callback for when an unsupported feature is used in the PDF document.
+   * The callback receives an {@link UNSUPPORTED_FEATURES} argument.
+   * @type {function}
+   */
+  set onUnsupportedFeature(callback) {
+    deprecated(
+      "The PDFDocumentLoadingTask onUnsupportedFeature property will be removed in the future."
+    );
+    this.#onUnsupportedFeature = callback;
   }
 
   /**
@@ -758,6 +773,9 @@ class PDFDocumentProxy {
    *   structures, or `null` when no statistics exists.
    */
   get stats() {
+    deprecated(
+      "The PDFDocumentProxy stats property will be removed in the future."
+    );
     return this._transport.stats;
   }
 
diff --git a/web/app.js b/web/app.js
index 72019cabd..bbf711b41 100644
--- a/web/app.js
+++ b/web/app.js
@@ -49,7 +49,6 @@ import {
   PDFWorker,
   shadow,
   UnexpectedResponseException,
-  UNSUPPORTED_FEATURES,
   version,
 } from "pdfjs-lib";
 import { AppOptions, OptionKind } from "./app_options.js";
@@ -93,51 +92,6 @@ const ViewerCssTheme = {
   DARK: 2,
 };
 
-// Keep these in sync with mozilla-central's Histograms.json.
-const KNOWN_VERSIONS = [
-  "1.0",
-  "1.1",
-  "1.2",
-  "1.3",
-  "1.4",
-  "1.5",
-  "1.6",
-  "1.7",
-  "1.8",
-  "1.9",
-  "2.0",
-  "2.1",
-  "2.2",
-  "2.3",
-];
-// Keep these in sync with mozilla-central's Histograms.json.
-const KNOWN_GENERATORS = [
-  "acrobat distiller",
-  "acrobat pdfwriter",
-  "adobe livecycle",
-  "adobe pdf library",
-  "adobe photoshop",
-  "ghostscript",
-  "tcpdf",
-  "cairo",
-  "dvipdfm",
-  "dvips",
-  "pdftex",
-  "pdfkit",
-  "itext",
-  "prince",
-  "quarkxpress",
-  "mac os x",
-  "microsoft",
-  "openoffice",
-  "oracle",
-  "luradocument",
-  "pdf-xchange",
-  "antenna house",
-  "aspose.cells",
-  "fpdf",
-];
-
 class DefaultExternalServices {
   constructor() {
     throw new Error("Cannot initialize DefaultExternalServices.");
@@ -257,7 +211,6 @@ const PDFViewerApplication = {
   _contentDispositionFilename: null,
   _contentLength: null,
   _saveInProgress: false,
-  _docStats: null,
   _wheelUnusedTicks: 0,
   _PDFBug: null,
   _hasAnnotationEditors: false,
@@ -866,7 +819,6 @@ const PDFViewerApplication = {
     this._contentDispositionFilename = null;
     this._contentLength = null;
     this._saveInProgress = false;
-    this._docStats = null;
     this._hasAnnotationEditors = false;
 
     promises.push(this.pdfScriptingManager.destroyPromise);
@@ -959,9 +911,6 @@ const PDFViewerApplication = {
       this.progress(loaded / total);
     };
 
-    // Listen for unsupported features to report telemetry.
-    loadingTask.onUnsupportedFeature = this.fallback.bind(this);
-
     return loadingTask.promise.then(
       pdfDocument => {
         this.load(pdfDocument);
@@ -1056,13 +1005,6 @@ const PDFViewerApplication = {
     }
   },
 
-  fallback(featureId) {
-    this.externalServices.reportTelemetry({
-      type: "unsupportedFeature",
-      featureId,
-    });
-  },
-
   /**
    * Report the error; used for errors affecting loading and/or parsing of
    * the entire PDF document.
@@ -1104,7 +1046,6 @@ const PDFViewerApplication = {
     }
 
     console.error(`${message}\n\n${moreInfoText.join("\n")}`);
-    this.fallback();
   },
 
   progress(level) {
@@ -1434,7 +1375,6 @@ const PDFViewerApplication = {
           return false;
         }
         console.warn("Warning: JavaScript support is not enabled");
-        this.fallback(UNSUPPORTED_FEATURES.javaScript);
         return true;
       });
 
@@ -1509,49 +1449,17 @@ const PDFViewerApplication = {
       } else {
         console.warn("Warning: XFA support is not enabled");
       }
-      this.fallback(UNSUPPORTED_FEATURES.forms);
     } else if (
       (info.IsAcroFormPresent || info.IsXFAPresent) &&
       !this.pdfViewer.renderForms
     ) {
       console.warn("Warning: Interactive form support is not enabled");
-      this.fallback(UNSUPPORTED_FEATURES.forms);
     }
 
     if (info.IsSignaturesPresent) {
       console.warn("Warning: Digital signatures validation is not supported");
-      this.fallback(UNSUPPORTED_FEATURES.signatures);
     }
 
-    // Telemetry labels must be C++ variable friendly.
-    let versionId = "other";
-    if (KNOWN_VERSIONS.includes(info.PDFFormatVersion)) {
-      versionId = `v${info.PDFFormatVersion.replace(".", "_")}`;
-    }
-    let generatorId = "other";
-    if (info.Producer) {
-      const producer = info.Producer.toLowerCase();
-      KNOWN_GENERATORS.some(function (generator) {
-        if (!producer.includes(generator)) {
-          return false;
-        }
-        generatorId = generator.replace(/[ .-]/g, "_");
-        return true;
-      });
-    }
-    let formType = null;
-    if (info.IsXFAPresent) {
-      formType = "xfa";
-    } else if (info.IsAcroFormPresent) {
-      formType = "acroform";
-    }
-    this.externalServices.reportTelemetry({
-      type: "documentInfo",
-      version: versionId,
-      generator: generatorId,
-      formType,
-    });
-
     this.eventBus.dispatch("metadataloaded", { source: this });
   },
 
@@ -1802,10 +1710,6 @@ const PDFViewerApplication = {
 
     printService.layout();
 
-    this.externalServices.reportTelemetry({
-      type: "print",
-    });
-
     if (this._hasAnnotationEditors) {
       this.externalServices.reportTelemetry({
         type: "editing",
@@ -2098,21 +2002,6 @@ const PDFViewerApplication = {
     this._unblockDocumentLoadEvent = () => {};
   },
 
-  /**
-   * @ignore
-   */
-  _reportDocumentStatsTelemetry() {
-    const { stats } = this.pdfDocument;
-    if (stats !== this._docStats) {
-      this._docStats = stats;
-
-      this.externalServices.reportTelemetry({
-        type: "documentStats",
-        stats,
-      });
-    }
-  },
-
   /**
    * Used together with the integration-tests, to enable awaiting full
    * initialization of the scripting/sandbox.
@@ -2310,9 +2199,6 @@ function webViewerPageRendered({ pageNumber, error }) {
       PDFViewerApplication._otherError(msg, error);
     });
   }
-
-  // It is a good time to report stream and font types.
-  PDFViewerApplication._reportDocumentStatsTelemetry();
 }
 
 function webViewerPageMode({ mode }) {