From 27c608d9563859ec3b6a0cb1f4c304724379229a Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Thu, 4 Jun 2020 13:18:37 -0400 Subject: [PATCH] Update built-in extensions for new AC/GV API New API (installBuiltIn/ensureBuiltin) requires - Gecko IDs and new permissions - Extension will only be re-installed if it has a new version This includes a gradle task to automatically generate a new version in manifest.json for every build so we don't forget to update the version and end up with changes that are never applied. --- .gitignore | 4 +++ app/build.gradle | 35 +++++++++++++++++++ .../{manifest.json => manifest.template.json} | 10 ++++-- .../{manifest.json => manifest.template.json} | 8 ++++- .../search/telemetry/BaseSearchTelemetry.kt | 1 - .../search/telemetry/ads/AdsTelemetry.kt | 2 +- .../telemetry/incontent/InContentTelemetry.kt | 2 +- .../telemetry/BaseSearchTelemetryTest.kt | 1 - 8 files changed, 56 insertions(+), 7 deletions(-) rename app/src/main/assets/extensions/ads/{manifest.json => manifest.template.json} (71%) rename app/src/main/assets/extensions/cookies/{manifest.json => manifest.template.json} (83%) diff --git a/.gitignore b/.gitignore index 24d282a79..d5e16cb60 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,7 @@ test_artifacts/ /build/test-tools/google-cloud-sdk/ /build/test-tools/*.jar /build/test-tools/*.gz + + +# Web extensions: manifest.json files are generated +manifest.json diff --git a/app/build.gradle b/app/build.gradle index 3ac53b31e..37fffdca6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -186,6 +186,10 @@ android { // GeckoView must uncompress it before it can do anything else which // causes a significant delay on startup. noCompress 'ja' + + // manifest.template.json is converted to manifest.json at build time. + // No need to package the template in the APK. + ignoreAssetsPattern "manifest.template.json" } testOptions { @@ -755,3 +759,34 @@ if (gradle.hasProperty('localProperties.autoPublish.application-services.dir')) ext.appServicesSrcDir = gradle."localProperties.autoPublish.application-services.dir" apply from: "../${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" } + +// Define a reusable task for updating the versions of our built-in web extensions. We automate this +// to make sure we never forget to update the version, either in local development or for releases. +// In both cases, we want to make sure the latest version of all extensions (including their latest +// changes) are installed on first start-up. +// We're using the A-C version here as we want to uplift all built-in extensions to A-C (Once that's +// done we can also remove the task below): +// https://github.com/mozilla-mobile/android-components/issues/7249 +ext.updateExtensionVersion = { task, extDir -> + configure(task) { + from extDir + include 'manifest.template.json' + rename { 'manifest.json' } + into extDir + + def values = ['version': AndroidComponents.VERSION + "." + new Date().format('MMddHHmmss')] + inputs.properties(values) + expand(values) + } +} + +tasks.register("updateAdsExtensionVersion", Copy) { task -> + updateExtensionVersion(task, 'src/main/assets/extensions/ads') +} + +tasks.register("updateCookiesExtensionVersion", Copy) { task -> + updateExtensionVersion(task, 'src/main/assets/extensions/cookies') +} + +preBuild.dependsOn updateAdsExtensionVersion +preBuild.dependsOn updateCookiesExtensionVersion diff --git a/app/src/main/assets/extensions/ads/manifest.json b/app/src/main/assets/extensions/ads/manifest.template.json similarity index 71% rename from app/src/main/assets/extensions/ads/manifest.json rename to app/src/main/assets/extensions/ads/manifest.template.json index f7cd42792..41d9e9bd1 100644 --- a/app/src/main/assets/extensions/ads/manifest.json +++ b/app/src/main/assets/extensions/ads/manifest.template.json @@ -1,7 +1,12 @@ { "manifest_version": 2, + "applications": { + "gecko": { + "id": "ads@mozac.org" + } + }, "name": "Mozilla Android Components - Ads", - "version": "1.0", + "version": "${version}", "content_scripts": [ { "matches": ["https://*/*"], @@ -16,6 +21,7 @@ ], "permissions": [ "geckoViewAddons", - "nativeMessaging" + "nativeMessaging", + "nativeMessagingFromContent" ] } diff --git a/app/src/main/assets/extensions/cookies/manifest.json b/app/src/main/assets/extensions/cookies/manifest.template.json similarity index 83% rename from app/src/main/assets/extensions/cookies/manifest.json rename to app/src/main/assets/extensions/cookies/manifest.template.json index dd56d6ea2..06440bccf 100644 --- a/app/src/main/assets/extensions/cookies/manifest.json +++ b/app/src/main/assets/extensions/cookies/manifest.template.json @@ -1,7 +1,12 @@ { "manifest_version": 2, + "applications": { + "gecko": { + "id": "cookies@mozac.org" + } + }, "name": "Mozilla Android Components - Cookies", - "version": "1.0", + "version": "${version}", "content_scripts": [ { "matches": ["https://*/*"], @@ -23,6 +28,7 @@ "permissions": [ "geckoViewAddons", "nativeMessaging", + "nativeMessagingFromContent", "webNavigation", "webRequest", "webRequestBlocking", diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt index 94fa72e42..7768a6423 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt @@ -93,7 +93,6 @@ abstract class BaseSearchTelemetry { engine.installWebExtension( id = extensionInfo.id, url = extensionInfo.resourceUrl, - allowContentMessaging = true, onSuccess = { extension -> store.flowScoped { flow -> subscribeToUpdates(flow, extension, extensionInfo) } }, diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt index 97dfcc56d..7044af09b 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/ads/AdsTelemetry.kt @@ -51,7 +51,7 @@ class AdsTelemetry(private val metrics: MetricController) : BaseSearchTelemetry( companion object { @VisibleForTesting - internal const val ADS_EXTENSION_ID = "mozacBrowserAds" + internal const val ADS_EXTENSION_ID = "ads@mozac.org" @VisibleForTesting internal const val ADS_EXTENSION_RESOURCE_URL = "resource://android/assets/extensions/ads/" @VisibleForTesting diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt index d98423970..1be9e832c 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/incontent/InContentTelemetry.kt @@ -131,7 +131,7 @@ class InContentTelemetry(private val metrics: MetricController) : BaseSearchTele companion object { @VisibleForTesting - internal const val COOKIES_EXTENSION_ID = "BrowserCookiesExtension" + internal const val COOKIES_EXTENSION_ID = "cookies@mozac.org" @VisibleForTesting internal const val COOKIES_EXTENSION_RESOURCE_URL = "resource://android/assets/extensions/cookies/" diff --git a/app/src/test/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetryTest.kt b/app/src/test/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetryTest.kt index 244e9d1cf..fd87665d4 100644 --- a/app/src/test/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetryTest.kt +++ b/app/src/test/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetryTest.kt @@ -44,7 +44,6 @@ class BaseSearchTelemetryTest { engine.installWebExtension( id = id, url = resourceUrl, - allowContentMessaging = true, onSuccess = any(), onError = any() )