Files
cromite/build/patches/bromite-build-utils.patch

828 lines
31 KiB
Diff

From: uazo <uazo@users.noreply.github.com>
Date: Fri, 9 Jun 2023 15:11:46 +0000
Subject: bromite build utils
---
build/android/gyp/java_cpp_enum.py | 37 +++++-
build/android/gyp/util/build_utils.py | 25 +++-
build/bromite/bromite_utils.gni | 79 +++++++++++++
build/bromite/gyp/cpp_bromite_include.py | 35 ++++++
build/bromite/gyp/cpp_bromite_include.pydeps | 9 ++
build/bromite/gyp/java_bromite_impl.py | 107 ++++++++++++++++++
build/bromite/gyp/java_bromite_impl.pydeps | 9 ++
build/config/BUILDCONFIG.gn | 2 +
build/config/android/rules.gni | 6 +-
.../ChromeAccessibilitySettingsDelegate.java | 5 +
chrome/browser/flags/BUILD.gn | 8 +-
.../flags/android/cromite_native_utils.cc | 94 +++++++++++++++
.../flags/android/cromite_native_utils.h | 14 +++
.../browser/flags/CromiteNativeUtils.java | 46 ++++++++
mojo/public/tools/mojom/mojom_parser.py | 22 +++-
tools/grit/grit/grd_reader.py | 27 ++++-
tools/grit/grit_rule.gni | 2 +-
tools/grit/preprocess_if_expr.py | 32 +++++-
18 files changed, 539 insertions(+), 20 deletions(-)
create mode 100644 build/bromite/bromite_utils.gni
create mode 100644 build/bromite/gyp/cpp_bromite_include.py
create mode 100644 build/bromite/gyp/cpp_bromite_include.pydeps
create mode 100644 build/bromite/gyp/java_bromite_impl.py
create mode 100644 build/bromite/gyp/java_bromite_impl.pydeps
create mode 100755 chrome/browser/flags/android/cromite_native_utils.cc
create mode 100755 chrome/browser/flags/android/cromite_native_utils.h
create mode 100755 chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java
diff --git a/build/android/gyp/java_cpp_enum.py b/build/android/gyp/java_cpp_enum.py
--- a/build/android/gyp/java_cpp_enum.py
+++ b/build/android/gyp/java_cpp_enum.py
@@ -208,6 +208,7 @@ class DirectiveSet:
class HeaderParser:
+ include_re = re.compile(r'#include "(.*)"')
single_line_comment_re = re.compile(r'\s*//\s*([^\n]*)')
multi_line_comment_start_re = re.compile(r'\s*/\*')
enum_line_re = re.compile(r'^\s*(\w+)(\s*\=\s*([^,\n]+))?,?')
@@ -230,7 +231,7 @@ class HeaderParser:
enum_single_line_re = re.compile(
r'^\s*(?:\[cpp.*\])?\s*enum.*{(?P<enum_entries>.*)}.*$')
- def __init__(self, lines, path=''):
+ def __init__(self, lines, options, path=''):
self._lines = java_cpp_utils.PreprocessIfBlocks(lines)
self._path = path
self._enum_definitions = []
@@ -240,6 +241,7 @@ class HeaderParser:
self._generator_directives = DirectiveSet()
self._multi_line_generator_directive = None
self._current_enum_entry = ''
+ self._options = options
def _ApplyGeneratorDirectives(self):
self._generator_directives.UpdateDefinition(self._current_definition)
@@ -266,6 +268,24 @@ class HeaderParser:
raise Exception('Multi-line comments in enums are not supported in ' +
self._path)
+ # handles the management of #include files
+ include_line = HeaderParser.include_re.match(line)
+ if include_line:
+ include_file = include_line.groups()[0];
+ if not include_file.endswith(".inc"):
+ raise Exception('Include file \"' + include_file + '\" must ends with .inc')
+
+ file_to_include = os.path.join(self._options.gen_dir, include_file)
+ if not os.path.exists(file_to_include):
+ file_to_include = os.path.join(self._options.root_dir, include_file)
+ lines = []
+ with open(file_to_include) as include_file_handle:
+ lines = include_file_handle.readlines()
+
+ for new_line in lines:
+ self._ParseEnumLine(new_line)
+ return
+
enum_comment = HeaderParser.single_line_comment_re.match(line)
if enum_comment:
comment = enum_comment.groups()[0]
@@ -367,9 +387,9 @@ class HeaderParser:
self._ParseSingleLineEnum(single_line_enum.group('enum_entries'))
-def DoGenerate(source_paths):
+def DoGenerate(source_paths, options):
for source_path in source_paths:
- enum_definitions = DoParseHeaderFile(source_path)
+ enum_definitions = DoParseHeaderFile(source_path, options)
if not enum_definitions:
raise Exception('No enums found in %s\n'
'Did you forget prefixing enums with '
@@ -382,9 +402,9 @@ def DoGenerate(source_paths):
yield output_path, output
-def DoParseHeaderFile(path):
+def DoParseHeaderFile(path, options):
with open(path, encoding='utf-8') as f:
- return HeaderParser(f.readlines(), path).ParseDefinitions()
+ return HeaderParser(f.readlines(), options, path).ParseDefinitions()
def GenerateOutput(source_path, enum_definition):
@@ -470,11 +490,16 @@ def DoMain(argv):
nargs='+',
help='Path to at least one input file.')
+ parser.add_argument('--gen_dir',
+ help='Indicates the path to the generated file')
+ parser.add_argument('--root_dir',
+ help='Indicates the path to the build root')
+
options = parser.parse_args(argv)
with action_helpers.atomic_output(options.srcjar) as f:
with zipfile.ZipFile(f, 'w', zipfile.ZIP_STORED) as srcjar:
- for output_path, data in DoGenerate(options.input_paths):
+ for output_path, data in DoGenerate(options.input_paths, options):
zip_helpers.add_to_zip_hermetic(srcjar, output_path, data=data)
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
--- a/build/android/gyp/util/build_utils.py
+++ b/build/android/gyp/util/build_utils.py
@@ -404,4 +404,27 @@ def ReadSourcesList(sources_list_file_name):
Note that this function should not be used to parse response files.
"""
with open(sources_list_file_name, encoding='utf-8') as f:
- return [file_name.strip() for file_name in f]
+ files = [file_name.strip() for file_name in f]
+ # allows inclusion of all files in the indicated folder
+ # in the sources of java-related gn targets.
+ # "include_all_directory.java" is a special name and must exist in the
+ # folder since gn checks for its existence, but it will not be
+ # included in the list.
+ # example:
+ #
+ # sources += [
+ # "java/src/org/chromium/components/browser_ui/site_settings/impl/include_all_directory.java",
+ # ]
+ #
+ # will include in source all files found in
+ # "java/src/org/chromium/components/browser_ui/site_settings/impl"
+ include_dirs = [f for f in files if f.endswith('include_all_directory.java')]
+ for include_file in include_dirs:
+ directory = os.path.dirname(include_file)
+ for root, dirs, directory_files in os.walk(directory):
+ for directory_file in directory_files:
+ files.append(os.path.join(directory, directory_file))
+ files = [f for f in files if not f.endswith('include_all_directory.java')
+ and not f.endswith('.java.tmpl')]
+
+ return files
diff --git a/build/bromite/bromite_utils.gni b/build/bromite/bromite_utils.gni
new file mode 100644
--- /dev/null
+++ b/build/bromite/bromite_utils.gni
@@ -0,0 +1,79 @@
+import("//build/config/python.gni")
+
+# generates the file specified in ouput_file containing
+# the inclusion of all .inc files found in the folder
+# specified
+#
+# Parameters
+# directories (required)
+# A list of folders from which to extract the .inc files
+#
+# output_file (required)
+# The name of the include file to be generated
+#
+# Example
+#
+# cpp_bromite_include("bromite_content_settings") {
+# directories = [ "bromite_content_settings/placeholder.txt" ]
+# output_file = "bromite_content_settings.inc"
+# }
+#
+template("cpp_bromite_include") {
+ action_with_pydeps(target_name) {
+ forward_variables_from(invoker,
+ TESTONLY_AND_VISIBILITY + [
+ "deps",
+ "inputs",
+ ])
+ script = "//build/bromite/gyp/cpp_bromite_include.py"
+
+ _rebased_directories = rebase_path(invoker.inputs, root_build_dir)
+ _output = "$target_gen_dir/" + invoker.output_file
+ _output_rebased = rebase_path(_output)
+
+ args = [
+ "--output=$_output_rebased",
+ ]
+ args += _rebased_directories
+
+ outputs = [ _output ]
+ }
+}
+
+# allows the generation of the java file needed for
+# the inclusion of the defined site settings
+# in separate files
+# used by content settings patch
+template("java_bromite_impl") {
+ action_with_pydeps(target_name) {
+ forward_variables_from(invoker,
+ TESTONLY_AND_VISIBILITY + [
+ "deps",
+ "inputs",
+ "namespace",
+ "static_classes",
+ ])
+ script = "//build/bromite/gyp/java_bromite_impl.py"
+ namespace = ""
+ static_classes = false
+
+ _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
+ _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)
+ _rebased_directories = rebase_path(invoker.inputs, root_build_dir)
+ _rebased_template = rebase_path(invoker.template, root_build_dir)
+ _namespace = invoker.namespace
+ _static_classes = invoker.static_classes
+
+ args = [
+ "--srcjar=$_rebased_srcjar_path",
+ "--template=$_rebased_template",
+ "--namespace=$_namespace",
+ ]
+ if (_static_classes) {
+ args += [ "--static_classes", ]
+ }
+ args += _rebased_directories
+
+ outputs = [ _srcjar_path ]
+ }
+}
diff --git a/build/bromite/gyp/cpp_bromite_include.py b/build/bromite/gyp/cpp_bromite_include.py
new file mode 100644
--- /dev/null
+++ b/build/bromite/gyp/cpp_bromite_include.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import re
+import sys
+
+def _Main(argv):
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument('--output',
+ required=True,
+ help='The path at which to generate the .inc file')
+
+ parser.add_argument(
+ 'inputs', nargs='+', help='Input folder(s)', metavar='INPUTFILE')
+ args = parser.parse_args(argv)
+
+ for include_file in args.inputs:
+ directory = os.path.dirname(include_file)
+ files = []
+ for root, dirs, directory_files in os.walk(directory):
+ for directory_file in sorted(directory_files):
+ files.append(os.path.join(directory, directory_file))
+
+ files = [f for f in files if f.endswith('.inc')]
+
+ with open(args.output, 'w') as f:
+ for file in files:
+ f.write("#include \"" + file + "\"\n")
+ f.write("\n")
+
+
+if __name__ == '__main__':
+ _Main(sys.argv[1:])
diff --git a/build/bromite/gyp/cpp_bromite_include.pydeps b/build/bromite/gyp/cpp_bromite_include.pydeps
new file mode 100644
--- /dev/null
+++ b/build/bromite/gyp/cpp_bromite_include.pydeps
@@ -0,0 +1,9 @@
+# Generated by running:
+# build/print_python_deps.py --root build/bromite/gyp --output build/bromite/gyp/cpp_bromite_include.pydeps build/bromite/gyp/cpp_bromite_include.py
+../../action_helpers.py
+../../android/gyp/util/__init__.py
+../../android/gyp/util/build_utils.py
+../../android/gyp/util/java_cpp_utils.py
+../../gn_helpers.py
+../../zip_helpers.py
+cpp_bromite_include.py
diff --git a/build/bromite/gyp/java_bromite_impl.py b/build/bromite/gyp/java_bromite_impl.py
new file mode 100644
--- /dev/null
+++ b/build/bromite/gyp/java_bromite_impl.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import re
+import sys
+import zipfile
+
+sys.path.append('build/android/gyp')
+sys.path.append('../../build/android/gyp')
+
+from util import build_utils
+from util import java_cpp_utils
+import action_helpers # build_utils adds //build to sys.path.
+import zip_helpers
+
+def _GenerateOutput(template, source_paths, template_path, strings,
+ namespace, static_classes):
+ description_template = """
+// This following string constants were inserted by
+// {SCRIPT_NAME}
+// Directory
+// {SOURCE_PATHS}
+// Template
+// {TEMPLATE_PATH}
+
+"""
+ values = {
+ 'SCRIPT_NAME': java_cpp_utils.GetScriptName(),
+ 'SOURCE_PATHS': ',\n// '.join(source_paths),
+ 'TEMPLATE_PATH': template_path,
+ }
+ description = description_template.format(**values)
+
+ import_clause = '\n'.join(
+ ['import ' + namespace + '.' + f + ';' for f in strings])
+
+ if static_classes:
+ add_clause = '\n\t'.join(['\tadd(' + f + '.getInstance());' for f in strings])
+ else:
+ add_clause = '\n\t'.join(['\tadd(new ' + f + '());' for f in strings])
+
+ values = {
+ 'DESCRIPTION': description,
+ 'ADD_CLAUSE': add_clause,
+ 'IMPORT_CLAUSE': import_clause,
+ }
+ return template.format(**values)
+
+
+def _Generate(source_paths, template_path, namespace, static_classes):
+ with open(template_path) as f:
+ lines = f.readlines()
+
+ template = ''.join(lines)
+ package, class_name = java_cpp_utils.ParseTemplateFile(template)
+ output_path = java_cpp_utils.GetJavaFilePath(package, class_name)
+ strings = []
+
+ for directory in source_paths:
+ if not directory.endswith('include_all_directory.java'):
+ raise Exception("input path not ends with 'include_all_directory.java'")
+ for root, dirs, directory_files in os.walk(os.path.dirname(directory)):
+ for directory_file in sorted(directory_files):
+ strings.append(directory_file)
+
+ strings = [f.replace('.java', '') for f in strings
+ if not f.endswith('include_all_directory.java') and
+ not f.endswith('.java.tmpl') ]
+
+ output = _GenerateOutput(template, source_paths, template_path, strings,
+ namespace, static_classes)
+
+ return output, output_path
+
+
+def _Main(argv):
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument('--srcjar',
+ required=True,
+ help='The path at which to generate the .srcjar file')
+
+ parser.add_argument('--template',
+ required=True,
+ help='The template file with which to generate the Java '
+ 'class.')
+
+ parser.add_argument(
+ '--namespace', required=True, help='Output namespace')
+ parser.add_argument(
+ '--static_classes', action="store_true",
+ default=False,
+ help='True to use getInstance() method')
+ parser.add_argument(
+ 'inputs', nargs='+', help='Input folder(s)', metavar='INPUTFILE')
+ args = parser.parse_args(argv)
+
+ with action_helpers.atomic_output(args.srcjar) as f:
+ with zipfile.ZipFile(f, 'w', zipfile.ZIP_STORED) as srcjar:
+ data, path = _Generate(args.inputs, args.template,
+ args.namespace, args.static_classes)
+ zip_helpers.add_to_zip_hermetic(srcjar, path, data=data)
+
+
+if __name__ == '__main__':
+ _Main(sys.argv[1:])
diff --git a/build/bromite/gyp/java_bromite_impl.pydeps b/build/bromite/gyp/java_bromite_impl.pydeps
new file mode 100644
--- /dev/null
+++ b/build/bromite/gyp/java_bromite_impl.pydeps
@@ -0,0 +1,9 @@
+# Generated by running:
+# build/print_python_deps.py --root build/bromite/gyp --output build/bromite/gyp/java_bromite_impl.pydeps build/bromite/gyp/java_bromite_impl.py
+../../action_helpers.py
+../../android/gyp/util/__init__.py
+../../android/gyp/util/build_utils.py
+../../android/gyp/util/java_cpp_utils.py
+../../gn_helpers.py
+../../zip_helpers.py
+java_bromite_impl.py
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -830,3 +830,5 @@ if (is_component_build) {
set_defaults("component") {
configs = default_component_configs
}
+
+import("//build/bromite/bromite_utils.gni")
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -224,6 +224,10 @@ if (!is_robolectric && enable_java_templates) {
_rebased_sources = rebase_path(invoker.sources, root_build_dir)
args = [ "--srcjar=$_rebased_srcjar_path" ] + _rebased_sources
+ _root_gen_dir = rebase_path(root_gen_dir)
+ _root_dir = rebase_path(root_build_dir)
+ args += [ "--gen_dir=$_root_gen_dir",
+ "--root_dir=$_root_dir" ]
outputs = [ _srcjar_path ]
}
}
@@ -278,7 +282,7 @@ if (!is_robolectric && enable_java_templates) {
# my.java.package.
template("java_cpp_strings") {
action_with_pydeps(target_name) {
- forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "sources" ])
+ forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ "sources", "deps" ])
# The sources aren't compiled so don't check their dependencies.
check_includes = false
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
@@ -17,6 +17,11 @@ import org.chromium.components.dom_distiller.core.DistilledPagePrefs;
import org.chromium.components.user_prefs.UserPrefs;
import org.chromium.content_public.browser.BrowserContextHandle;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.CromiteNativeUtils;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
+
/** The Chrome implementation of AccessibilitySettingsDelegate. */
@NullMarked
public class ChromeAccessibilitySettingsDelegate implements AccessibilitySettingsDelegate {
diff --git a/chrome/browser/flags/BUILD.gn b/chrome/browser/flags/BUILD.gn
--- a/chrome/browser/flags/BUILD.gn
+++ b/chrome/browser/flags/BUILD.gn
@@ -7,7 +7,8 @@ import("//extensions/buildflags/buildflags.gni")
import("//third_party/jni_zero/jni_zero.gni")
android_library("java") {
- sources = [
+ sources = [ "android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java" ]
+ sources += [
"android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java",
"android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureMap.java",
"android/java/src/org/chromium/chrome/browser/flags/ChromeSessionState.java",
@@ -33,7 +34,8 @@ android_library("java") {
}
generate_jni("jni_headers") {
- sources = [
+ sources = [ "android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java" ]
+ sources += [
"android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureMap.java",
"android/java/src/org/chromium/chrome/browser/flags/ChromeSessionState.java",
]
@@ -41,6 +43,8 @@ generate_jni("jni_headers") {
static_library("flags_android") {
sources = [
+ "android/cromite_native_utils.cc",
+ "android/cromite_native_utils.h",
"android/chrome_feature_list.h",
"android/chrome_session_state.cc",
"android/chrome_session_state.h",
diff --git a/chrome/browser/flags/android/cromite_native_utils.cc b/chrome/browser/flags/android/cromite_native_utils.cc
new file mode 100755
--- /dev/null
+++ b/chrome/browser/flags/android/cromite_native_utils.cc
@@ -0,0 +1,94 @@
+#include "chrome/browser/flags/android/cromite_native_utils.h"
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/about_flags.h"
+#include "chrome/browser/flags/jni_headers/CromiteNativeUtils_jni.h"
+#include "components/webui/flags/pref_service_flags_storage.h"
+
+#include "base/android/jni_string.h"
+
+using base::android::JavaRef;
+
+static void JNI_CromiteNativeUtils_SetEnabled(JNIEnv* env,
+ const JavaRef<jstring>& featureName, bool isEnabled) {
+ flags_ui::PrefServiceFlagsStorage flags_storage(
+ g_browser_process->local_state());
+ std::set<std::string> entries = flags_storage.GetFlags();
+
+ auto internal_name = base::android::ConvertJavaStringToUTF8(env, featureName);
+ entries.erase(internal_name);
+ entries.erase(internal_name + "@1"); // enabled
+ entries.erase(internal_name + "@2"); // disabled
+
+ bool is_switch = false;
+ if (const flags_ui::FeatureEntry* entry =
+ about_flags::GetCurrentFlagsState()->FindFeatureEntryByName(
+ internal_name)) {
+ if (entry->type == flags_ui::FeatureEntry::SINGLE_DISABLE_VALUE) {
+ entries.erase(entry->switches.command_line_switch);
+ if (isEnabled) {
+ entries.insert(entry->switches.command_line_switch);
+ }
+ is_switch = true;
+ } else if (entry->type == flags_ui::FeatureEntry::ENABLE_DISABLE_VALUE) {
+ entries.erase(entry->switches.command_line_switch);
+ entries.erase(entry->switches.disable_command_line_switch);
+ if (isEnabled) {
+ entries.insert(entry->switches.disable_command_line_switch);
+ }
+ is_switch = true;
+ }
+ }
+
+ if (!is_switch) {
+ if (isEnabled) {
+ entries.insert(internal_name + "@1");
+ } else {
+ entries.insert(internal_name + "@2");
+ }
+ }
+
+ flags_storage.SetFlags(entries);
+ flags_storage.CommitPendingWrites();
+}
+
+static jboolean JNI_CromiteNativeUtils_IsFlagEnabled(JNIEnv* env,
+ const JavaRef<jstring>& featureName) {
+ auto internal_name = base::android::ConvertJavaStringToUTF8(env, featureName);
+
+ flags_ui::PrefServiceFlagsStorage flags_storage(
+ g_browser_process->local_state());
+ std::set<std::string> entries = flags_storage.GetFlags();
+
+ if (const flags_ui::FeatureEntry* entry =
+ about_flags::GetCurrentFlagsState()->FindFeatureEntryByName(
+ internal_name)) {
+ if (entry->type == flags_ui::FeatureEntry::SINGLE_DISABLE_VALUE &&
+ entries.count(entry->switches.command_line_switch)) {
+ return true;
+ } else if (entry->type == flags_ui::FeatureEntry::ENABLE_DISABLE_VALUE &&
+ entries.count(entry->switches.disable_command_line_switch)) {
+ return true;
+ }
+ }
+
+ const std::string enabled_entry = internal_name + "@1";
+ if (entries.count(enabled_entry))
+ return true;
+
+ const std::string disabled_entry = internal_name + "@2";
+ if (entries.count(disabled_entry))
+ return false;
+
+ if (const flags_ui::FeatureEntry* entry =
+ about_flags::GetCurrentFlagsState()->FindFeatureEntryByName(
+ internal_name)) {
+ if (const base::Feature* feature = entry->feature.feature) {
+ return feature->default_state == base::FEATURE_ENABLED_BY_DEFAULT;
+ }
+ }
+
+ return false;
+}
+
+DEFINE_JNI(CromiteNativeUtils)
diff --git a/chrome/browser/flags/android/cromite_native_utils.h b/chrome/browser/flags/android/cromite_native_utils.h
new file mode 100755
--- /dev/null
+++ b/chrome/browser/flags/android/cromite_native_utils.h
@@ -0,0 +1,14 @@
+#ifndef CHROME_BROWSER_FLAGS_ANDROID_CROMITE_NATIVE_UTILS_H_
+#define CHROME_BROWSER_FLAGS_ANDROID_CROMITE_NATIVE_UTILS_H_
+
+#include <jni.h>
+
+#include "base/feature_list.h"
+
+namespace chrome {
+namespace android {
+
+} // namespace android
+} // namespace chrome
+
+#endif // CHROME_BROWSER_FLAGS_ANDROID_CROMITE_NATIVE_UTILS_H_
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java
new file mode 100755
--- /dev/null
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CromiteNativeUtils.java
@@ -0,0 +1,46 @@
+package org.chromium.chrome.browser.flags;
+
+import org.chromium.components.cached_flags.CachedFlagsSharedPreferences;
+import org.chromium.components.cached_flags.CachedFlag;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+
+import org.jni_zero.CalledByNative;
+import org.jni_zero.NativeMethods;
+
+public class CromiteNativeUtils {
+ /**
+ * Allows the modification of the flag value on the java side.
+ * Currently only the feature flag with on / off values is managed.
+ *
+ * @param featureName the feature name from ChromeFeatureList.
+ * @param flagName the flag name name from about_flags.cc.
+ */
+ public static void setFlagEnabled(String flagName, Boolean newValue) {
+ CachedFlag cachedFlag = ChromeFeatureList.sAllCachedFlags.get(flagName);
+ setFlagEnabled(cachedFlag == null
+ ? ""
+ : cachedFlag.getFeatureName(), flagName, newValue);
+ }
+
+ public static void setFlagEnabled(String featureName, String flagName, Boolean newValue) {
+ CromiteNativeUtilsJni.get().setEnabled(flagName, newValue);
+
+ if (!featureName.isEmpty()) {
+ CachedFlag cachedFlag = ChromeFeatureList.sAllCachedFlags.get(featureName);
+ String preferenceName = cachedFlag.getSharedPreferenceKey();
+
+ CachedFlagsSharedPreferences.getInstance().writeBoolean(preferenceName, newValue);
+ cachedFlag.setValueReturnedOverride(newValue);
+ }
+ }
+
+ public static boolean isFlagEnabled(String featureName) {
+ return CromiteNativeUtilsJni.get().isFlagEnabled(featureName);
+ }
+
+ @NativeMethods
+ public interface Natives {
+ void setEnabled(String featureName, boolean newValue);
+ boolean isFlagEnabled(String featureName);
+ }
+}
diff --git a/mojo/public/tools/mojom/mojom_parser.py b/mojo/public/tools/mojom/mojom_parser.py
--- a/mojo/public/tools/mojom/mojom_parser.py
+++ b/mojo/public/tools/mojom/mojom_parser.py
@@ -20,6 +20,7 @@ import os
import os.path
import sys
import traceback
+import re
from collections import defaultdict
from mojom.generate import module
@@ -180,11 +181,26 @@ def _CollectAllowedImportsFromBuildMetadata(build_metadata_filename):
collect(build_metadata_filename)
return allowed_imports
+def _ResolveInclude(mojom_abspath, input_root_paths):
+ mojom_abspath = _ResolveRelativeImportPath(mojom_abspath, mojom_abspath, input_root_paths)
+ with open(mojom_abspath, encoding='utf-8') as f:
+ src = f.read()
+
+ lines = src.splitlines();
+ for idx, i in enumerate(lines):
+ if i.startswith("#include"):
+ include_file = re.findall(r'"([^"]*)"', i)[0]
+ if include_file.startswith("../../"):
+ include_file = include_file[6::]
+ lines[idx] = _ResolveInclude(include_file, input_root_paths)
+
+ return "\n".join(lines)
# multiprocessing helper.
-def _ParseAstHelper(mojom_abspath, enabled_features):
+def _ParseAstHelper(mojom_abspath, enabled_features, input_root_paths):
with open(mojom_abspath, encoding='utf-8') as f:
- ast = parser.Parse(f.read(), mojom_abspath)
+ src = _ResolveInclude(mojom_abspath, input_root_paths)
+ ast = parser.Parse(src, mojom_abspath)
conditional_features.RemoveDisabledDefinitions(ast, enabled_features)
return mojom_abspath, ast
@@ -304,7 +320,7 @@ def _ParseMojoms(mojom_files,
(path, abs_path) for abs_path, path in mojom_files_to_parse.items())
logging.info('Parsing %d .mojom into ASTs', len(mojom_files_to_parse))
- map_args = ((mojom_abspath, enabled_features)
+ map_args = ((mojom_abspath, enabled_features, input_root_paths)
for mojom_abspath in mojom_files_to_parse)
for mojom_abspath, ast in _Shard(_ParseAstHelper, map_args):
loaded_mojom_asts[mojom_abspath] = ast
diff --git a/tools/grit/grit/grd_reader.py b/tools/grit/grit/grd_reader.py
--- a/tools/grit/grit/grd_reader.py
+++ b/tools/grit/grit/grd_reader.py
@@ -96,11 +96,28 @@ class GrdContentHandler(xml.sax.handler.ContentHandler):
raise exception.FileNotFound(partname)
# Exceptions propagate to the handler in grd_reader.Parse().
oldsource = self.source
- try:
- self.source = partname
- xml.sax.parse(partname, GrdPartContentHandler(self))
- finally:
- self.source = oldsource
+ # modifies the behavior of
+ # <part file="folder" />
+ # allowing the inclusion of all grdp files found in the folder
+ # specified.
+ # the file value must end with "/placeholder.txt"
+ if partname.endswith("/placeholder.txt"):
+ partname = os.path.dirname(partname)
+ for root, dirs, files in os.walk(partname):
+ for file in files:
+ filepath = os.path.join(partname, file)
+ if filepath.endswith(".grdp"):
+ try:
+ self.source = partname
+ xml.sax.parse(filepath, GrdPartContentHandler(self))
+ finally:
+ self.source = oldsource
+ else:
+ try:
+ self.source = partname
+ xml.sax.parse(partname, GrdPartContentHandler(self))
+ finally:
+ self.source = oldsource
if self.debug:
print("End parsing of element %s" % name)
diff --git a/tools/grit/grit_rule.gni b/tools/grit/grit_rule.gni
--- a/tools/grit/grit_rule.gni
+++ b/tools/grit/grit_rule.gni
@@ -360,7 +360,7 @@ template("grit") {
_gritdeps_lines = read_file(invoker.gritdeps, "list lines")
_gritdeps_entries = filter_exclude(_gritdeps_lines, [ "#*" ])
inputs += rebase_path(_gritdeps_entries, ".", "//")
- deps += [ ":$_check_gritdeps_target" ]
+ #deps += [ ":$_check_gritdeps_target" ]
}
}
diff --git a/tools/grit/preprocess_if_expr.py b/tools/grit/preprocess_if_expr.py
--- a/tools/grit/preprocess_if_expr.py
+++ b/tools/grit/preprocess_if_expr.py
@@ -8,6 +8,7 @@ import io
import json
import os
import sys
+import re
# For Node, EvaluateExpression
import grit.node.base
@@ -71,6 +72,35 @@ def ExtensionForComments(input_file):
extension = '.html'
return extension
+def _extract_template_from_dir(html_file):
+ template = ''
+ directory = os.path.dirname(html_file)
+ for root, dirs, directory_files in os.walk(directory):
+ for directory_file in directory_files:
+ if directory_file.endswith(".html"):
+ template += _extract_template(os.path.join(directory, directory_file))
+
+ return template
+
+def _extract_template(html_file):
+ include_re = re.compile(r'^\s*<include\s*path="(.*)"\s*/>')
+ with io.open(html_file, encoding='utf-8', mode='r') as f:
+ lines = f.readlines()
+
+ template_lines = []
+ for line in lines:
+ include_line = include_re.match(line)
+ if include_line:
+ include_file = include_line.groups()[0]
+ file_to_include = os.path.join(os.path.dirname(html_file), include_file)
+ if file_to_include.endswith("placeholder.txt"):
+ line = _extract_template_from_dir(file_to_include)
+ else:
+ line = _extract_template(file_to_include)
+ template_lines.append(line)
+
+ template = ''.join(template_lines)
+ return template
def main(argv):
parser = argparse.ArgumentParser()
@@ -95,7 +125,7 @@ def main(argv):
in_path = os.path.join(in_folder, input_file)
content = ""
with open(in_path, encoding='utf-8') as f:
- content = f.read()
+ content = _extract_template(in_path)
removal_comments_extension = None # None means no removal comments
if args.enable_removal_comments:
--