Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds initial telemetry probes #3532

Merged
merged 1 commit into from
Aug 19, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 50 additions & 1 deletion extensions/firefox/components/PdfStreamConverter.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
*/
/* jshint esnext:true */
/* globals Components, Services, XPCOMUtils, NetUtil, PrivateBrowsingUtils,
dump, NetworkManager */
dump, NetworkManager, PdfJsTelemetry */

'use strict';

Expand All @@ -42,6 +42,9 @@ Cu.import('resource://pdf.js/network.js');
XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
'resource://gre/modules/PrivateBrowsingUtils.jsm');

XPCOMUtils.defineLazyModuleGetter(this, 'PdfJsTelemetry',
'resource://pdf.js/PdfJsTelemetry.jsm');

var Svc = {};
XPCOMUtils.defineLazyServiceGetter(Svc, 'mime',
'@mozilla.org/mime;1',
Expand Down Expand Up @@ -194,6 +197,12 @@ PdfDataListener.prototype = {
function ChromeActions(domWindow, contentDispositionFilename) {
this.domWindow = domWindow;
this.contentDispositionFilename = contentDispositionFilename;
this.telemetryState = {
documentInfo: false,
firstPageInfo: false,
streamTypesUsed: [],
startAt: Date.now()
};
}

ChromeActions.prototype = {
Expand Down Expand Up @@ -321,12 +330,49 @@ ChromeActions.prototype = {
supportsDocumentColors: function() {
return getBoolPref('browser.display.use_document_colors', true);
},
reportTelemetry: function (data) {
var probeInfo = JSON.parse(data);
switch (probeInfo.type) {
case 'documentInfo':
if (!this.telemetryState.documentInfo) {
PdfJsTelemetry.onDocumentVersion(probeInfo.version | 0);
PdfJsTelemetry.onDocumentGenerator(probeInfo.generator | 0);
if (probeInfo.formType) {
PdfJsTelemetry.onForm(probeInfo.formType === 'acroform');
}
this.telemetryState.documentInfo = true;
}
break;
case 'pageInfo':
if (!this.telemetryState.firstPageInfo) {
var duration = Date.now() - this.telemetryState.startAt;
PdfJsTelemetry.onTimeToView(duration);
this.telemetryState.firstPageInfo = true;
}
break;
case 'streamInfo':
if (!Array.isArray(probeInfo.streamTypes)) {
break;
}
for (var i = 0; i < probeInfo.streamTypes.length; i++) {
var streamTypeId = probeInfo.streamTypes[i] | 0;
if (streamTypeId >= 0 && streamTypeId < 10 &&
!this.telemetryState.streamTypesUsed[streamTypeId]) {
PdfJsTelemetry.onStreamType(streamTypeId);
this.telemetryState.streamTypesUsed[streamTypeId] = true;
}
}
break;
}
},
fallback: function(url, sendResponse) {
var self = this;
var domWindow = this.domWindow;
var strings = getLocalizedStrings('chrome.properties');
var message = getLocalizedString(strings, 'unsupported_feature');

PdfJsTelemetry.onFallback();

var notificationBox = null;
try {
// Based on MDN's "Working with windows in chrome code"
Expand Down Expand Up @@ -730,6 +776,9 @@ PdfStreamConverter.prototype = {
false);
}

PdfJsTelemetry.onViewerIsUsed();
PdfJsTelemetry.onDocumentSize(aRequest.contentLength);

if (!rangeRequest) {
// Creating storage for PDF data
var contentLength = aRequest.contentLength;
Expand Down
72 changes: 72 additions & 0 deletions extensions/firefox/content/PdfJsTelemetry-addon.jsm
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* Copyright 2013 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* jshint esnext:true */

'use strict';

this.EXPORTED_SYMBOLS = ['PdfJsTelemetry'];

const Cu = Components.utils;
Cu.import('resource://gre/modules/Services.jsm');

const ADDON_ID = "[email protected]";

var Telemetry = Services.telemetry;
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_USED", 1, 2, 3, Telemetry.HISTOGRAM_BOOLEAN);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_FALLBACK_SHOWN", 1, 2, 3, Telemetry.HISTOGRAM_BOOLEAN);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_DOCUMENT_VERSION", 1, 10, 11, Telemetry.HISTOGRAM_LINEAR);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_DOCUMENT_GENERATOR", 1, 25, 26, Telemetry.HISTOGRAM_LINEAR);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_DOCUMENT_SIZE_KB", 2, 64 * 1024, 20, Telemetry.HISTOGRAM_EXPONENTIAL);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_FORM", 1, 2, 3, Telemetry.HISTOGRAM_BOOLEAN);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_STREAM_TYPES", 1, 9, 10, Telemetry.HISTOGRAM_LINEAR);
Telemetry.registerAddonHistogram(ADDON_ID, "PDF_VIEWER_TIME_TO_VIEW_MS", 1, 10000, 50, Telemetry.HISTOGRAM_EXPONENTIAL);


this.PdfJsTelemetry = {
onViewerIsUsed: function () {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_USED");
histogram.add(true);
},
onFallback: function () {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_FALLBACK_SHOWN");
histogram.add(true);
},
onDocumentSize: function (size) {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_DOCUMENT_SIZE_KB");
histogram.add(size / 1024);
},
onDocumentVersion: function (versionId) {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_DOCUMENT_VERSION");
histogram.add(versionId);
},
onDocumentGenerator: function (generatorId) {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_DOCUMENT_GENERATOR");
histogram.add(generatorId);
},
onForm: function (isAcroform) {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_FORM");
histogram.add(isAcroform);
},
onStreamType: function (streamTypeId) {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_STREAM_TYPES");
histogram.add(streamTypeId);
},
onTimeToView: function (ms) {
let histogram = Telemetry.getAddonHistogram(ADDON_ID, "PDF_VIEWER_TIME_TO_VIEW_MS");
histogram.add(ms);
}
};
59 changes: 59 additions & 0 deletions extensions/firefox/content/PdfJsTelemetry.jsm
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* Copyright 2013 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* jshint esnext:true */

'use strict';

this.EXPORTED_SYMBOLS = ['PdfJsTelemetry'];

const Cu = Components.utils;
Cu.import('resource://gre/modules/Services.jsm');

this.PdfJsTelemetry = {
onViewerIsUsed: function () {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_USED");
histogram.add(true);
},
onFallback: function () {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_FALLBACK_SHOWN");
histogram.add(true);
},
onDocumentSize: function (size) {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_DOCUMENT_SIZE_KB");
histogram.add(size / 1024);
},
onDocumentVersion: function (versionId) {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_DOCUMENT_VERSION");
histogram.add(versionId);
},
onDocumentGenerator: function (generatorId) {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_DOCUMENT_GENERATOR");
histogram.add(generatorId);
},
onForm: function (isAcroform) {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_FORM");
histogram.add(isAcroform);
},
onStreamType: function (streamTypeId) {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_STREAM_TYPES");
histogram.add(streamTypeId);
},
onTimeToView: function (ms) {
let histogram = Services.telemetry.getHistogramById("PDF_VIEWER_TIME_TO_VIEW_MS");
histogram.add(ms);
}
};
4 changes: 4 additions & 0 deletions make.js
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,9 @@ target.firefox = function() {
cp(FIREFOX_CONTENT_DIR + 'PdfJs-stub.jsm',
FIREFOX_BUILD_CONTENT_DIR + 'PdfJs.jsm');

cp(FIREFOX_CONTENT_DIR + 'PdfJsTelemetry-addon.jsm',
FIREFOX_BUILD_CONTENT_DIR + 'PdfJsTelemetry.jsm');

// Copy extension files
cd(FIREFOX_EXTENSION_DIR);
cp('-R', FIREFOX_EXTENSION_FILES_TO_COPY, ROOT_DIR + FIREFOX_BUILD_DIR);
Expand Down Expand Up @@ -528,6 +531,7 @@ target.mozcentral = function() {
mkdir('-p', MOZCENTRAL_CONTENT_DIR + '/web');

cp(FIREFOX_CONTENT_DIR + 'PdfJs.jsm', MOZCENTRAL_CONTENT_DIR);
cp(FIREFOX_CONTENT_DIR + 'PdfJsTelemetry.jsm', MOZCENTRAL_CONTENT_DIR);

// Copy extension files
cd('extensions/firefox');
Expand Down
20 changes: 18 additions & 2 deletions src/core/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,22 @@ var PDFDocument = (function PDFDocumentClosure() {
PDFDocument.prototype = {
parse: function PDFDocument_parse(recoveryMode) {
this.setup(recoveryMode);
this.acroForm = this.catalog.catDict.get('AcroForm');
try {
// checking if AcroForm is present
this.acroForm = this.catalog.catDict.get('AcroForm');
if (this.acroForm) {
this.xfa = this.acroForm.get('XFA');
var fields = this.acroForm.get('Fields');
if ((!fields || !isArray(fields) || fields.length === 0) &&
!this.xfa) {
// no fields and no XFA -- not a form (?)
this.acroForm = null;
}
}
} catch (ex) {
info('Something wrong with AcroForm entry');
this.acroForm = null;
}
},

get linearization() {
Expand Down Expand Up @@ -438,7 +453,8 @@ var PDFDocument = (function PDFDocumentClosure() {
get documentInfo() {
var docInfo = {
PDFFormatVersion: this.pdfFormatVersion,
IsAcroFormPresent: !!this.acroForm
IsAcroFormPresent: !!this.acroForm,
IsXFAPresent: !!this.xfa
};
var infoDict;
try {
Expand Down
34 changes: 34 additions & 0 deletions web/viewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -1020,6 +1020,34 @@ var PDFView = {
console.warn('Warning: AcroForm/XFA is not supported');
PDFView.fallback();
}

//#if (FIREFOX || MOZCENTRAL)
// var versionId = String(info.PDFFormatVersion).slice(-1) | 0;
// var generatorId = 0;
// var KNOWN_GENERATORS = ["acrobat distiller", "acrobat pdfwritter",
// "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"];
// var generatorId = 0;
// if (info.Producer) {
// KNOWN_GENERATORS.some(function (generator, s, i) {
// if (generator.indexOf(s) < 0) {
// return false;
// }
// generatorId = i + 1;
// return true;
// }.bind(null, info.Producer.toLowerCase()));
// }
// var formType = !info.IsAcroFormPresent ? null : info.IsXFAPresent ?
// 'xfa' : 'acroform';
// FirefoxCom.request('reportTelemetry', JSON.stringify({
// type: 'documentInfo',
// version: versionId,
// generator: generatorId,
// formType: formType
// }));
//#endif
});
},

Expand Down Expand Up @@ -1928,6 +1956,12 @@ var PageView = function pageView(container, id, scale,
});
div.dispatchEvent(event);

//#if (FIREFOX || MOZCENTRAL)
// FirefoxCom.request('reportTelemetry', JSON.stringify({
// type: 'pageInfo'
// }));
// // TODO add stream types report here
//#endif
callback();
}

Expand Down