mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 22:32:46 +00:00
Bug 857419 - Implement about:healthreport on Android. r=rnewman
This commit is contained in:
parent
cbc6bcfb21
commit
d552b016a9
@ -12,6 +12,7 @@ include $(DEPTH)/config/autoconf.mk
|
||||
DEFINES += -DAB_CD=$(MOZ_UI_LOCALE) \
|
||||
-DPACKAGE=browser \
|
||||
-DMOZ_APP_VERSION=$(MOZ_APP_VERSION) \
|
||||
-DANDROID_PACKAGE_NAME=$(ANDROID_PACKAGE_NAME) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
204
mobile/android/chrome/content/aboutHealthReport.js
Normal file
204
mobile/android/chrome/content/aboutHealthReport.js
Normal file
@ -0,0 +1,204 @@
|
||||
#filter substitution
|
||||
// -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
|
||||
|
||||
Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js");
|
||||
Cu.import("resource://gre/modules/OrderedBroadcast.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/SharedPreferences.jsm");
|
||||
|
||||
// Name of Android SharedPreference controlling whether to upload
|
||||
// health reports.
|
||||
const PREF_UPLOAD_ENABLED = "android.not_a_preference.healthreport.uploadEnabled";
|
||||
|
||||
// Action sent via Android Ordered Broadcast to background service.
|
||||
const BROADCAST_ACTION_HEALTH_REPORT = "@ANDROID_PACKAGE_NAME@" + ".healthreport.request";
|
||||
|
||||
// Name of Gecko Pref specifying report content location.
|
||||
const PREF_REPORTURL = "datareporting.healthreport.about.reportUrl";
|
||||
|
||||
function sendMessageToJava(message) {
|
||||
return Cc["@mozilla.org/android/bridge;1"]
|
||||
.getService(Ci.nsIAndroidBridge)
|
||||
.handleGeckoMessage(JSON.stringify(message));
|
||||
}
|
||||
|
||||
// Default preferences for the application.
|
||||
let sharedPrefs = new SharedPreferences();
|
||||
|
||||
let reporter = {
|
||||
onInit: function () {
|
||||
let deferred = Promise.defer();
|
||||
deferred.resolve();
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
collectAndObtainJSONPayload: function () {
|
||||
let deferred = Promise.defer();
|
||||
|
||||
let callback = function (data, token, action) {
|
||||
if (data) {
|
||||
// Bug 870992: the FHR report content expects FHR report data
|
||||
// in string form. This costs us a JSON parsing round trip,
|
||||
// since the ordered broadcast module parses the stringified
|
||||
// JSON returned from Java. Since the FHR report content
|
||||
// expects updates to preferences as a Javascript object, we
|
||||
// cannot handle the situation uniformly, and we pay the price
|
||||
// here, stringifying a huge chunk of JSON.
|
||||
deferred.resolve(JSON.stringify(data));
|
||||
} else {
|
||||
deferred.reject();
|
||||
}
|
||||
};
|
||||
|
||||
sendOrderedBroadcast(BROADCAST_ACTION_HEALTH_REPORT, null, callback);
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
};
|
||||
|
||||
let policy = {
|
||||
get healthReportUploadEnabled() {
|
||||
return sharedPrefs.getBoolPref(PREF_UPLOAD_ENABLED);
|
||||
},
|
||||
|
||||
recordHealthReportUploadEnabled: function (enabled) {
|
||||
sharedPrefs.setBoolPref(PREF_UPLOAD_ENABLED, !!enabled);
|
||||
},
|
||||
};
|
||||
|
||||
let healthReportWrapper = {
|
||||
init: function () {
|
||||
reporter.onInit().then(healthReportWrapper.refreshPayload,
|
||||
healthReportWrapper.handleInitFailure);
|
||||
|
||||
let iframe = document.getElementById("remote-report");
|
||||
iframe.addEventListener("load", healthReportWrapper.initRemotePage, false);
|
||||
let report = this._getReportURI();
|
||||
iframe.src = report.spec;
|
||||
|
||||
sharedPrefs.addObserver(PREF_UPLOAD_ENABLED, this, false);
|
||||
},
|
||||
|
||||
observe: function (subject, topic, data) {
|
||||
if (topic != PREF_UPLOAD_ENABLED) {
|
||||
return;
|
||||
}
|
||||
|
||||
subject.updatePrefState();
|
||||
},
|
||||
|
||||
uninit: function () {
|
||||
sharedPrefs.removeObserver(PREF_UPLOAD_ENABLED, this);
|
||||
},
|
||||
|
||||
_getReportURI: function () {
|
||||
let url = Services.urlFormatter.formatURLPref(PREF_REPORTURL);
|
||||
return Services.io.newURI(url, null, null);
|
||||
},
|
||||
|
||||
onOptIn: function () {
|
||||
policy.recordHealthReportUploadEnabled(true,
|
||||
"Health report page sent opt-in command.");
|
||||
this.updatePrefState();
|
||||
},
|
||||
|
||||
onOptOut: function () {
|
||||
policy.recordHealthReportUploadEnabled(false,
|
||||
"Health report page sent opt-out command.");
|
||||
this.updatePrefState();
|
||||
},
|
||||
|
||||
updatePrefState: function () {
|
||||
try {
|
||||
let prefs = {
|
||||
enabled: policy.healthReportUploadEnabled,
|
||||
};
|
||||
this.injectData("prefs", prefs);
|
||||
} catch (e) {
|
||||
this.reportFailure(this.ERROR_PREFS_FAILED);
|
||||
}
|
||||
},
|
||||
|
||||
refreshPayload: function () {
|
||||
reporter.collectAndObtainJSONPayload().then(healthReportWrapper.updatePayload,
|
||||
healthReportWrapper.handlePayloadFailure);
|
||||
},
|
||||
|
||||
updatePayload: function (data) {
|
||||
healthReportWrapper.injectData("payload", data);
|
||||
},
|
||||
|
||||
injectData: function (type, content) {
|
||||
let report = this._getReportURI();
|
||||
|
||||
// file URIs can't be used for targetOrigin, so we use "*" for this special case
|
||||
// in all other cases, pass in the URL to the report so we properly restrict the message dispatch
|
||||
|
||||
let reportUrl = report.scheme == "file" ? "*" : report.spec;
|
||||
|
||||
let data = {
|
||||
type: type,
|
||||
content: content,
|
||||
};
|
||||
|
||||
let iframe = document.getElementById("remote-report");
|
||||
iframe.contentWindow.postMessage(data, reportUrl);
|
||||
},
|
||||
|
||||
handleRemoteCommand: function (evt) {
|
||||
switch (evt.detail.command) {
|
||||
case "DisableDataSubmission":
|
||||
this.onOptOut();
|
||||
break;
|
||||
case "EnableDataSubmission":
|
||||
this.onOptIn();
|
||||
break;
|
||||
case "RequestCurrentPrefs":
|
||||
this.updatePrefState();
|
||||
break;
|
||||
case "RequestCurrentPayload":
|
||||
this.refreshPayload();
|
||||
break;
|
||||
default:
|
||||
Cu.reportError("Unexpected remote command received: " + evt.detail.command +
|
||||
". Ignoring command.");
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
initRemotePage: function () {
|
||||
let iframe = document.getElementById("remote-report").contentDocument;
|
||||
iframe.addEventListener("RemoteHealthReportCommand",
|
||||
function onCommand(e) {healthReportWrapper.handleRemoteCommand(e);},
|
||||
false);
|
||||
healthReportWrapper.updatePrefState();
|
||||
},
|
||||
|
||||
// error handling
|
||||
ERROR_INIT_FAILED: 1,
|
||||
ERROR_PAYLOAD_FAILED: 2,
|
||||
ERROR_PREFS_FAILED: 3,
|
||||
|
||||
reportFailure: function (error) {
|
||||
let details = {
|
||||
errorType: error,
|
||||
};
|
||||
healthReportWrapper.injectData("error", details);
|
||||
},
|
||||
|
||||
handleInitFailure: function () {
|
||||
healthReportWrapper.reportFailure(healthReportWrapper.ERROR_INIT_FAILED);
|
||||
},
|
||||
|
||||
handlePayloadFailure: function () {
|
||||
healthReportWrapper.reportFailure(healthReportWrapper.ERROR_PAYLOAD_FAILED);
|
||||
},
|
||||
};
|
32
mobile/android/chrome/content/aboutHealthReport.xhtml
Normal file
32
mobile/android/chrome/content/aboutHealthReport.xhtml
Normal file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
|
||||
%brandDTD;
|
||||
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
|
||||
%globalDTD;
|
||||
<!ENTITY % aboutHealthReportDTD SYSTEM "chrome://browser/locale/aboutHealthReport.dtd" >
|
||||
%aboutHealthReportDTD;
|
||||
]>
|
||||
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>&abouthealth.pagetitle;</title>
|
||||
<link rel="icon" type="image/png" sizes="64x64"
|
||||
href="chrome://branding/content/favicon64.png" />
|
||||
<link rel="stylesheet"
|
||||
href="chrome://browser/skin/aboutHealthReport.css"
|
||||
type="text/css" />
|
||||
<script type="text/javascript;version=1.8"
|
||||
src="chrome://browser/content/aboutHealthReport.js" />
|
||||
</head>
|
||||
<body onload="healthReportWrapper.init();"
|
||||
onunload="healthReportWrapper.uninit();">
|
||||
<iframe id="remote-report"/>
|
||||
</body>
|
||||
</html>
|
6
mobile/android/chrome/content/healthreport-prefs.js
Normal file
6
mobile/android/chrome/content/healthreport-prefs.js
Normal file
@ -0,0 +1,6 @@
|
||||
#filter substitution
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
pref("datareporting.healthreport.about.reportUrl", "https://fhr.cdn.mozilla.net/%LOCALE%/");
|
@ -38,7 +38,7 @@ chrome.jar:
|
||||
content/SelectionHandler.js (content/SelectionHandler.js)
|
||||
content/HelperApps.js (content/HelperApps.js)
|
||||
content/dbg-browser-actors.js (content/dbg-browser-actors.js)
|
||||
* content/WebAppRT.js (content/WebAppRT.js)
|
||||
content/WebAppRT.js (content/WebAppRT.js)
|
||||
content/InputWidgetHelper.js (content/InputWidgetHelper.js)
|
||||
content/WebrtcUI.js (content/WebrtcUI.js)
|
||||
content/MemoryObserver.js (content/MemoryObserver.js)
|
||||
@ -49,6 +49,10 @@ chrome.jar:
|
||||
content/FindHelper.js (content/FindHelper.js)
|
||||
content/PermissionsHelper.js (content/PermissionsHelper.js)
|
||||
content/FeedHandler.js (content/FeedHandler.js)
|
||||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
content/aboutHealthReport.xhtml (content/aboutHealthReport.xhtml)
|
||||
* content/aboutHealthReport.js (content/aboutHealthReport.js)
|
||||
#endif
|
||||
|
||||
% content branding %content/branding/
|
||||
|
||||
|
@ -71,7 +71,13 @@ let modules = {
|
||||
privatebrowsing: {
|
||||
uri: "chrome://browser/content/aboutPrivateBrowsing.xhtml",
|
||||
privileged: true
|
||||
}
|
||||
},
|
||||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
healthreport: {
|
||||
uri: "chrome://browser/content/aboutHealthReport.xhtml",
|
||||
privileged: true
|
||||
},
|
||||
#endif
|
||||
}
|
||||
|
||||
function AboutRedirector() {}
|
||||
|
@ -12,6 +12,9 @@ contract @mozilla.org/network/protocol/about;1?what=downloads {322ba47e-7047-4f7
|
||||
contract @mozilla.org/network/protocol/about;1?what=reader {322ba47e-7047-4f71-aebf-cb7d69325cd9}
|
||||
contract @mozilla.org/network/protocol/about;1?what=feedback {322ba47e-7047-4f71-aebf-cb7d69325cd9}
|
||||
contract @mozilla.org/network/protocol/about;1?what=privatebrowsing {322ba47e-7047-4f71-aebf-cb7d69325cd9}
|
||||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
contract @mozilla.org/network/protocol/about;1?what=healthreport {322ba47e-7047-4f71-aebf-cb7d69325cd9}
|
||||
#endif
|
||||
#ifdef MOZ_SAFE_BROWSING
|
||||
contract @mozilla.org/network/protocol/about;1?what=blocked {322ba47e-7047-4f71-aebf-cb7d69325cd9}
|
||||
#endif
|
||||
|
@ -0,0 +1,6 @@
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<!-- LOCALIZATION NOTE (abouthealth.pagetitle): Firefox Health Report is a proper noun in en-US, please keep this in mind. -->
|
||||
<!ENTITY abouthealth.pagetitle "&brandShortName; Health Report">
|
@ -16,6 +16,9 @@
|
||||
locale/@AB_CD@/browser/aboutFeedback.dtd (%chrome/aboutFeedback.dtd)
|
||||
locale/@AB_CD@/browser/aboutPrivateBrowsing.dtd (%chrome/aboutPrivateBrowsing.dtd)
|
||||
locale/@AB_CD@/browser/aboutReader.properties (%chrome/aboutReader.properties)
|
||||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
locale/@AB_CD@/browser/aboutHealthReport.dtd (%chrome/aboutHealthReport.dtd)
|
||||
#endif
|
||||
locale/@AB_CD@/browser/browser.properties (%chrome/browser.properties)
|
||||
locale/@AB_CD@/browser/config.dtd (%chrome/config.dtd)
|
||||
locale/@AB_CD@/browser/config.properties (%chrome/config.properties)
|
||||
|
15
mobile/android/themes/core/aboutHealthReport.css
Normal file
15
mobile/android/themes/core/aboutHealthReport.css
Normal file
@ -0,0 +1,15 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#remote-report {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: 0;
|
||||
display: flex;
|
||||
}
|
@ -13,6 +13,9 @@ chrome.jar:
|
||||
skin/aboutBase.css (aboutBase.css)
|
||||
* skin/aboutDownloads.css (aboutDownloads.css)
|
||||
skin/aboutFeedback.css (aboutFeedback.css)
|
||||
#ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
skin/aboutHealthReport.css (aboutHealthReport.css)
|
||||
#endif
|
||||
skin/aboutMemory.css (aboutMemory.css)
|
||||
* skin/aboutPrivateBrowsing.css (aboutPrivateBrowsing.css)
|
||||
skin/aboutReader.css (aboutReader.css)
|
||||
|
@ -46,7 +46,11 @@ grepref_files += $(topsrcdir)/services/datareporting/datareporting-prefs.js
|
||||
endif
|
||||
|
||||
ifdef MOZ_SERVICES_HEALTHREPORT
|
||||
ifneq (android,$(MOZ_WIDGET_TOOLKIT))
|
||||
grepref_files += $(topsrcdir)/services/healthreport/healthreport-prefs.js
|
||||
else
|
||||
grepref_files += $(topsrcdir)/mobile/android/chrome/content/healthreport-prefs.js
|
||||
endif
|
||||
endif
|
||||
|
||||
# Optimizer bug with GCC 3.2.2 on OS/2
|
||||
|
Loading…
Reference in New Issue
Block a user