Backed out 7 changesets (bug 1942424) for causing frequent crashes. a=backout
[gecko.git] / toolkit / components / pdfjs / content / PdfJsTelemetry.sys.mjs
blob30f972b97dbfb5587feb36745c5d2c050c69b0a2
1 /* Copyright 2013 Mozilla Foundation
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
16 export class PdfJsTelemetryContent {
17   static onViewerIsUsed() {
18     Glean.pdfjs.used.add(1);
19   }
22 export class PdfJsTelemetry {
23   static report(aData) {
24     const { type } = aData;
25     switch (type) {
26       case "pageInfo":
27         this.onTimeToView(aData.timestamp);
28         break;
29       case "editing":
30         this.onEditing(aData);
31         break;
32       case "buttons":
33       case "gv-buttons":
34         {
35           const id = aData.data.id.replace(
36             /([A-Z])/g,
37             c => `_${c.toLowerCase()}`
38           );
39           if (type === "buttons") {
40             this.onButtons(id);
41           } else {
42             this.onGeckoview(id);
43           }
44         }
45         break;
46     }
47   }
49   static onTimeToView(ms) {
50     Glean.pdfjs.timeToView.accumulateSingleSample(ms);
51   }
53   static onEditing({ type, data }) {
54     if (type !== "editing" || !data) {
55       return;
56     }
58     if (!data.type && data.action?.startsWith("pdfjs.image")) {
59       this.onImage(data);
60       return;
61     }
63     switch (data.type) {
64       case "freetext":
65       case "ink":
66         Glean.pdfjs.editing[data.type].add(1);
67         return;
68       case "print":
69       case "save": {
70         Glean.pdfjs.editing[data.type].add(1);
71         const { stats } = data;
72         if (!stats) {
73           return;
74         }
75         if (data.type === "highlight") {
76           const numbers = ["one", "two", "three", "four", "five"];
77           Glean.pdfjsEditingHighlight[data.type].add(1);
78           Glean.pdfjsEditingHighlight.numberOfColors[
79             numbers[stats.highlight.numberOfColors - 1]
80           ].add(1);
81           return;
82         }
83         if (stats.stamp) {
84           this.onImage({
85             action: "pdfjs.image.added",
86             data: stats.stamp,
87           });
88         }
89         return;
90       }
91       case "stamp":
92         if (data.action.startsWith("pdfjs.image.")) {
93           this.onImage(data);
94           return;
95         }
97         if (data.action === "added") {
98           Glean.pdfjs.editing.stamp.add(1);
99           return;
100         }
101         Glean.pdfjs.stamp[data.action].add(1);
102         for (const key of [
103           "alt_text_keyboard",
104           "alt_text_decorative",
105           "alt_text_description",
106           "alt_text_edit",
107         ]) {
108           if (data[key]) {
109             Glean.pdfjs.stamp[key].add(1);
110           }
111         }
112         return;
113       case "highlight":
114       case "free_highlight":
115         switch (data.action) {
116           case "added":
117             Glean.pdfjsEditingHighlight.kind[data.type].add(1);
118             Glean.pdfjsEditingHighlight.method[data.methodOfCreation].add(1);
119             Glean.pdfjsEditingHighlight.color[data.color].add(1);
120             if (data.type === "free_highlight") {
121               Glean.pdfjsEditingHighlight.thickness.accumulateSingleSample(
122                 data.thickness
123               );
124             }
125             break;
126           case "color_changed":
127             Glean.pdfjsEditingHighlight.color[data.color].add(1);
128             Glean.pdfjsEditingHighlight.colorChanged.add(1);
129             break;
130           case "thickness_changed":
131             Glean.pdfjsEditingHighlight.thickness.accumulateSingleSample(
132               data.thickness
133             );
134             Glean.pdfjsEditingHighlight.thicknessChanged.add(1);
135             break;
136           case "deleted":
137             Glean.pdfjsEditingHighlight.deleted.add(1);
138             break;
139           case "edited":
140             Glean.pdfjsEditingHighlight.edited.add(1);
141             break;
142           case "toggle_visibility":
143             Glean.pdfjsEditingHighlight.toggleVisibility.add(1);
144             break;
145         }
146         break;
147     }
148   }
150   static onImage({ action, data = {} }) {
151     action = action.split(".").pop();
153     switch (action) {
154       // New alt text telemetry.
155       case "info":
156         Glean.pdfjsImageAltText.info.record(data);
157         break;
158       case "ai_generation_check":
159         Glean.pdfjsImageAltText.aiGenerationCheck.record(data);
160         break;
161       case "settings_displayed":
162         Glean.pdfjsImageAltText.settingsDisplayed.record(data);
163         break;
164       case "settings_ai_generation_check":
165         Glean.pdfjsImageAltText.settingsAiGenerationCheck.record(data);
166         break;
167       case "settings_edit_alt_text_check":
168         Glean.pdfjsImageAltText.settingsEditAltTextCheck.record(data);
169         break;
170       case "save":
171         Glean.pdfjsImageAltText.save.record(data);
172         break;
173       case "dismiss":
174         Glean.pdfjsImageAltText.dismiss.record(data);
175         break;
176       case "model_download_start":
177         Glean.pdfjsImageAltText.modelDownloadStart.record(data);
178         break;
179       case "model_download_complete":
180         Glean.pdfjsImageAltText.modelDownloadComplete.record(data);
181         break;
182       case "model_download_error":
183         Glean.pdfjsImageAltText.modelDownloadError.record(data);
184         break;
185       case "model_deleted":
186         Glean.pdfjsImageAltText.modelDeleted.record(data);
187         break;
188       case "model_result":
189         Glean.pdfjsImageAltText.modelResult.record(data);
190         break;
191       case "user_edit":
192         Glean.pdfjsImageAltText.userEdit.record(data);
193         break;
194       case "image_status_label_displayed":
195         Glean.pdfjsImageAltText.imageStatusLabelDisplayed.record(data);
196         break;
197       case "image_status_label_clicked":
198         Glean.pdfjsImageAltText.imageStatusLabelClicked.record(data);
199         break;
200       // Image telemetry.
201       case "icon_click":
202         Glean.pdfjsImage.iconClick.record(data);
203         break;
204       case "add_image_click":
205         Glean.pdfjsImage.addImageClick.record(data);
206         break;
207       case "image_selected":
208         Glean.pdfjsImage.imageSelected.record(data);
209         break;
210       case "image_added":
211         Glean.pdfjsImage.imageAdded.record(data);
212         break;
213       case "added": {
214         const { hasAltText, hasNoAltText } = data;
215         Glean.pdfjsImage.added.with_alt_text.add(hasAltText);
216         Glean.pdfjsImage.added.with_no_alt_text.add(hasNoAltText);
217         break;
218       }
219       case "alt_text_edit":
220         Glean.pdfjsImage.altTextEdit.ask_to_edit.set(data.ask_to_edit);
221         Glean.pdfjsImage.altTextEdit.ai_generation.set(data.ai_generation);
222         break;
223     }
224   }
226   static onButtons(id) {
227     Glean.pdfjs.buttons[id].add(1);
228   }
230   static onGeckoview(id) {
231     Glean.pdfjs.geckoview[id].add(1);
232   }