commit 2d4f36d2806f4526c9302cf548bc0e6567d1a421
parent 3e1707883d30ddbf7d4a3054f3fcb4bf27db4dd1
Author: pstanciu <pstanciu@mozilla.com>
Date: Tue, 2 Dec 2025 10:48:41 +0200
Revert "Bug 1986995 - Generate the Public Suffix List asset at build time. r=android-reviewers,nalexander,ahochheiden" for causing TL bustages
This reverts commit 185d41ebb5abbbc7d7d3ea4c78e1f6951d72a335.
Diffstat:
4 files changed, 86 insertions(+), 111 deletions(-)
diff --git a/mobile/android/android-components/components/lib/publicsuffixlist/build.gradle b/mobile/android/android-components/components/lib/publicsuffixlist/build.gradle
@@ -3,20 +3,19 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
plugins {
- id 'com.android.library'
- id 'kotlin-android'
id 'mozac.PublicSuffixListPlugin'
}
-apply from: '../../../common-config.gradle'
-apply from: '../../../publish.gradle'
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'mozac.PublicSuffixListPlugin'
android {
- namespace = 'mozilla.components.lib.publicsuffixlist'
-}
+ buildFeatures {
+ viewBinding = true
+ }
-publicSuffixList {
- sourceFile = file("${gradle.mozconfig.topsrcdir}/netwerk/dns/effective_tld_names.dat")
+ namespace = 'mozilla.components.lib.publicsuffixlist'
}
dependencies {
@@ -31,4 +30,6 @@ dependencies {
testImplementation libs.robolectric
}
+apply from: '../../../common-config.gradle'
+apply from: '../../../publish.gradle'
ext.configurePublish(config.componentsGroupId, project.name, project.ext.description)
diff --git a/mobile/android/android-components/components/lib/publicsuffixlist/src/main/assets/publicsuffixes b/mobile/android/android-components/components/lib/publicsuffixlist/src/main/assets/publicsuffixes
Binary files differ.
diff --git a/mobile/android/android-components/plugins/publicsuffixlist/build.gradle b/mobile/android/android-components/plugins/publicsuffixlist/build.gradle
@@ -22,13 +22,11 @@ repositories {
dependencies {
implementation libs.okhttp
implementation libs.okio
-
- compileOnly libs.android.gradle.plugin
}
gradlePlugin {
plugins.register("mozac.PublicSuffixListPlugin") {
id = "mozac.PublicSuffixListPlugin"
- implementationClass = "mozilla.components.gradle.plugins.PublicSuffixListPlugin"
+ implementationClass = "PublicSuffixListPlugin"
}
}
diff --git a/mobile/android/android-components/plugins/publicsuffixlist/src/main/java/PublicSuffixListPlugin.kt b/mobile/android/android-components/plugins/publicsuffixlist/src/main/java/PublicSuffixListPlugin.kt
@@ -2,110 +2,108 @@
* 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/. */
-package mozilla.components.gradle.plugins
-
-import com.android.build.api.variant.AndroidComponentsExtension
-import com.android.build.gradle.LibraryPlugin
-import okio.Buffer
+import okhttp3.OkHttpClient
+import okhttp3.Request
import okio.ByteString
import okio.ByteString.Companion.encodeUtf8
-import org.gradle.api.DefaultTask
-import org.gradle.api.GradleException
-import org.gradle.api.InvalidUserDataException
+import okio.buffer
+import okio.sink
import org.gradle.api.Plugin
import org.gradle.api.Project
-import org.gradle.api.file.DirectoryProperty
-import org.gradle.api.file.RegularFileProperty
-import org.gradle.api.tasks.InputFile
-import org.gradle.api.tasks.OutputDirectory
-import org.gradle.api.tasks.TaskAction
import java.io.File
import java.util.TreeSet
/**
- * A self-contained, configuration-cache-compatible Gradle task to generate the Public Suffix List asset.
+ * Gradle plugin to update the public suffix list used by the `lib-publicsuffixlist` component.
+ *
+ * Base on PublicSuffixListGenerator from OkHttp:
+ * https://github.com/square/okhttp/blob/master/okhttp/src/test/java/okhttp3/internal/publicsuffix/PublicSuffixListGenerator.java
*/
-abstract class GeneratePslAssetTask : DefaultTask() {
+class PublicSuffixListPlugin : Plugin<Project> {
+ override fun apply(project: Project) {
+ project.tasks.register("updatePSL") {
+ doLast {
+ val filename = project.projectDir.absolutePath + "/src/main/assets/publicsuffixes"
+ updatePublicSuffixList(filename)
+ }
+ }
+ }
+
+ private fun updatePublicSuffixList(destination: String) {
+ val list = fetchPublicSuffixList()
+ writeListToDisk(destination, list)
+ }
+
+ private fun writeListToDisk(destination: String, data: PublicSuffixListData) {
+ val fileSink = File(destination).sink()
+
+ fileSink.buffer().use { sink ->
+ sink.writeInt(data.totalRuleBytes)
- @get:InputFile
- abstract val sourceFile: RegularFileProperty
+ for (domain in data.sortedRules) {
+ sink.write(domain).writeByte('\n'.code)
+ }
- @get:OutputDirectory
- abstract val outputDir: DirectoryProperty
+ sink.writeInt(data.totalExceptionRuleBytes)
- @TaskAction
- fun generate() {
- val source = sourceFile.get().asFile
- if (!source.exists()) {
- throw GradleException("Public Suffix List source file not found: ${source.absolutePath}")
+ for (domain in data.sortedExceptionRules) {
+ sink.write(domain).writeByte('\n'.code)
+ }
}
+ }
- val startTime = System.currentTimeMillis()
- logger.info("PublicSuffixList> Executing generatePslAsset: Reading Public Suffix List from ${source.path}")
+ private fun fetchPublicSuffixList(): PublicSuffixListData {
+ val client = OkHttpClient.Builder().build()
- val listData = parsePublicSuffixList(source)
- val newContent = buildBinaryContent(listData)
- val destination = outputDir.file("publicsuffixes").get().asFile
+ val request = Request.Builder()
+ .url("https://publicsuffix.org/list/public_suffix_list.dat")
+ .build()
- logger.info("PublicSuffixList> Writing new Public Suffix List asset...")
- destination.parentFile.mkdirs()
- destination.writeBytes(newContent.toByteArray())
+ client.newCall(request).execute().use { response ->
+ val source = response.body!!.source()
- val duration = System.currentTimeMillis() - startTime
- logger.info("PublicSuffixList> Public Suffix List asset generation complete in ${duration}ms.")
- }
+ val data = PublicSuffixListData()
- private fun buildBinaryContent(data: PublicSuffixListData): ByteString {
- val buffer = Buffer()
- buffer.writeInt(data.totalRuleBytes)
- for (domain in data.sortedRules) {
- buffer.write(domain).writeByte('\n'.code)
- }
- buffer.writeInt(data.totalExceptionRuleBytes)
- for (domain in data.sortedExceptionRules) {
- buffer.write(domain).writeByte('\n'.code)
- }
- return buffer.readByteString()
- }
+ while (!source.exhausted()) {
+ val line = source.readUtf8LineStrict()
- private fun parsePublicSuffixList(sourceFile: File): PublicSuffixListData {
- val data = PublicSuffixListData()
-
- sourceFile.useLines { lines ->
- lines.filter { it.isNotBlank() && !it.startsWith("//") }
- .forEach { line ->
- if (line.contains(WILDCARD_CHAR)) {
- assertWildcardRule(line)
- }
-
- var rule = line.encodeUtf8()
- if (rule.startsWith(EXCEPTION_RULE_MARKER)) {
- rule = rule.substring(1)
- // We use '\n' for end of value.
- data.sortedExceptionRules.add(rule)
- data.totalExceptionRuleBytes += rule.size + 1
- } else {
- data.sortedRules.add(rule)
- // We use '\n' for end of value.
- data.totalRuleBytes += rule.size + 1
- }
+ if (line.trim { it <= ' ' }.isEmpty() || line.startsWith("//")) {
+ continue
+ }
+
+ if (line.contains(WILDCARD_CHAR)) {
+ assertWildcardRule(line)
}
- }
- return data
+ var rule = line.encodeUtf8()
+
+ if (rule.startsWith(EXCEPTION_RULE_MARKER)) {
+ rule = rule.substring(1)
+ // We use '\n' for end of value.
+ data.totalExceptionRuleBytes += rule.size + 1
+ data.sortedExceptionRules.add(rule)
+ } else {
+ data.totalRuleBytes += rule.size + 1 // We use '\n' for end of value.
+ data.sortedRules.add(rule)
+ }
+ }
+
+ return data
+ }
}
- @Suppress("ThrowsCount")
+ @Suppress("TooGenericExceptionThrown", "ThrowsCount")
private fun assertWildcardRule(rule: String) {
- if (!rule.startsWith(WILDCARD_CHAR)) {
- throw InvalidUserDataException("Wildcard is not in leftmost position")
+ if (rule.indexOf(WILDCARD_CHAR) != 0) {
+ throw RuntimeException("Wildcard is not not in leftmost position")
}
- if (rule.lastIndexOf(WILDCARD_CHAR) > 0) {
- throw InvalidUserDataException("Rule contains multiple wildcards")
+
+ if (rule.indexOf(WILDCARD_CHAR, 1) != -1) {
+ throw RuntimeException("Rule contains multiple wildcards")
}
if (rule.length == 1) {
- throw InvalidUserDataException("Rule wildcards the first level")
+ throw RuntimeException("Rule wildcards the first level")
}
}
@@ -115,32 +113,10 @@ abstract class GeneratePslAssetTask : DefaultTask() {
}
}
-abstract class PublicSuffixListExtension {
- @get:InputFile
- abstract val sourceFile: RegularFileProperty
-}
-
-class PublicSuffixListPlugin : Plugin<Project> {
- override fun apply(project: Project) {
- project.plugins.withType<LibraryPlugin>().configureEach {
- val extension = project.extensions.create("publicSuffixList", PublicSuffixListExtension::class.java)
-
- val generateTaskProvider = project.tasks.register("generatePslAsset", GeneratePslAssetTask::class.java) {
- outputDir.set(project.layout.buildDirectory.dir("generated/assets/publicsuffixlist"))
- sourceFile.set(extension.sourceFile)
- }
-
- val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java)
- androidComponents.onVariants(androidComponents.selector().all()) { variant ->
- variant.sources.assets?.addGeneratedSourceDirectory(generateTaskProvider, GeneratePslAssetTask::outputDir)
- }
- }
- }
-}
-
-private data class PublicSuffixListData(
+data class PublicSuffixListData(
var totalRuleBytes: Int = 0,
var totalExceptionRuleBytes: Int = 0,
+
val sortedRules: TreeSet<ByteString> = TreeSet(),
val sortedExceptionRules: TreeSet<ByteString> = TreeSet(),
)