From e91c23479e36f0ba175ceb5dac070f89512d6aa0 Mon Sep 17 00:00:00 2001 From: Gerald Squelart Date: Thu, 2 Jul 2015 10:12:49 +1000 Subject: [PATCH] Bug 1174565 - [EME] Report telemetry about which GMP files are missing - r=cpearce,spohl * * * Bug 1174565 - [EME] Updated xpcshell test - r=cpearce,spohl --- .../extensions/internal/GMPProvider.jsm | 55 ++++++++++++++++--- .../test/xpcshell/test_gmpProvider.js | 17 ++++-- 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/toolkit/mozapps/extensions/internal/GMPProvider.jsm b/toolkit/mozapps/extensions/internal/GMPProvider.jsm index f73913290bb8..c73aeabb5a9d 100644 --- a/toolkit/mozapps/extensions/internal/GMPProvider.jsm +++ b/toolkit/mozapps/extensions/internal/GMPProvider.jsm @@ -51,6 +51,7 @@ const GMP_PLUGINS = [ homepageURL: "http://www.openh264.org/", optionsURL: "chrome://mozapps/content/extensions/gmpPrefs.xul", missingKey: "VIDEO_OPENH264_GMP_DISAPPEARED", + missingFilesKey: "VIDEO_OPENH264_GMP_MISSING_FILES", }, { id: EME_ADOBE_ID, @@ -66,6 +67,7 @@ const GMP_PLUGINS = [ optionsURL: "chrome://mozapps/content/extensions/gmpPrefs.xul", isEME: true, missingKey: "VIDEO_ADOBE_GMP_DISAPPEARED", + missingFilesKey: "VIDEO_ADOBE_GMP_MISSING_FILES", }]; XPCOMUtils.defineLazyGetter(this, "pluginsBundle", @@ -148,6 +150,9 @@ GMPWrapper.prototype = { get missingKey() { return this._plugin.missingKey; }, + get missingFilesKey() { + return this._plugin.missingFilesKey; + }, get id() { return this._plugin.id; }, get type() { return "plugin"; }, @@ -468,15 +473,44 @@ GMPWrapper.prototype = { let id = this._plugin.id.substring(4); let libName = AppConstants.DLL_PREFIX + id + AppConstants.DLL_SUFFIX; - return fileExists(this.gmpPath, libName) && - fileExists(this.gmpPath, id + ".info") && - (this._plugin.id != EME_ADOBE_ID || - fileExists(this.gmpPath, id + ".voucher")); + return { + libraryMissing: !fileExists(this.gmpPath, libName), + infoMissing: !fileExists(this.gmpPath, id + ".info"), + voucherMissing: this._plugin.id == EME_ADOBE_ID + && !fileExists(this.gmpPath, id + ".voucher"), + }; }, validate: function() { - return !this.isInstalled || - this._arePluginFilesOnDisk(); + if (!this.isInstalled) { + // Not installed -> Valid. + return { installed: false, valid: true }; + } + + // Installed -> Check if files are missing. + let status = this._arePluginFilesOnDisk(); + status.installed = true; + status.valid = true; + status.missing = []; + status.telemetry = 0; + + if (status.libraryMissing) { + status.valid = false; + status.missing.push('library'); + status.telemetry += 1; + } + if (status.infoMissing) { + status.valid = false; + status.missing.push('info'); + status.telemetry += 2; + } + if (status.voucherMissing) { + status.valid = false; + status.missing.push('voucher'); + status.telemetry += 4; + } + + return status; }, }; @@ -503,9 +537,13 @@ let GMPProvider = { gmpPath); if (gmpPath && isEnabled) { - if (!wrapper.validate()) { + let validation = wrapper.validate(); + if (validation.installed) { + telemetryService.getHistogramById(wrapper.missingFilesKey).add(validation.telemetry); + } + if (!validation.valid) { this._log.info("startup - gmp " + plugin.id + - " missing lib and/or info files, uninstalling"); + " missing [" + validation.missing + "], uninstalling"); telemetryService.getHistogramById(wrapper.missingKey).add(true); wrapper.uninstallPlugin(); continue; @@ -633,6 +671,7 @@ let GMPProvider = { wrapper: null, isEME: aPlugin.isEME, missingKey: aPlugin.missingKey, + missingFilesKey: aPlugin.missingFilesKey, }; plugin.fullDescription = this.generateFullDescription(aPlugin); plugin.wrapper = new GMPWrapper(plugin); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_gmpProvider.js b/toolkit/mozapps/extensions/test/xpcshell/test_gmpProvider.js index dea90aec0031..aef29808ac84 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_gmpProvider.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_gmpProvider.js @@ -24,6 +24,7 @@ for (let plugin of GMPScope.GMP_PLUGINS) { nameId: plugin.name, descriptionId: plugin.description, missingKey: plugin.missingKey, + missingFilesKey: plugin.missingFilesKey, }); gMockAddons.set(mockAddon.id, mockAddon); if (mockAddon.id.indexOf("gmp-eme-") == 0) { @@ -278,13 +279,13 @@ add_task(function* test_pluginRegistration() { }, }; - let reportedKeys = []; + let reportedKeys = {}; let MockTelemetry = { getHistogramById: key => { return { add: value => { - reportedKeys.push(key); + reportedKeys[key] = value; } } } @@ -304,8 +305,12 @@ add_task(function* test_pluginRegistration() { Assert.deepEqual(removedPaths, [file.path]); // Test that the GMPProvider tried to report via telemetry that the - // addon's lib file is missing. - Assert.deepEqual(reportedKeys, [addon.missingKey]); + // addon's lib files are missing. + Assert.strictEqual(reportedKeys[addon.missingKey], true); + Assert.strictEqual(reportedKeys[addon.missingFilesKey], + addon.missingFilesKey != "VIDEO_ADOBE_GMP_MISSING_FILES" + ? (1+2) : (1+2+4)); + reportedKeys = {}; // Create dummy GMP library/info files, and test that plugin registration // succeeds during startup, now that we've added GMP info/lib files. @@ -318,6 +323,10 @@ add_task(function* test_pluginRegistration() { Assert.notEqual(addedPaths.indexOf(file.path), -1); Assert.deepEqual(removedPaths, []); + // Test that the GMPProvider tried to report via telemetry that the + // addon's lib files are NOT missing. + Assert.strictEqual(reportedKeys[addon.missingFilesKey], 0); + // Check that clearing the version doesn't trigger registration. clearPaths(); gPrefs.clearUserPref(gGetKey(GMPScope.GMPPrefs.KEY_PLUGIN_VERSION, addon.id));