From b20e5852cf2d2675f34aa6a6e98a75f06cbe23e3 Mon Sep 17 00:00:00 2001 From: Funda Wang Date: Sat, 9 Aug 2025 13:05:23 +0800 Subject: [PATCH] 5.15.17 --- .gitattributes | 1 + ...9cfcfffa7632cc3858ceaf8940677ba9c91.tar.gz | 4 +- ...86-mathops-clip-constants-used-with-.patch | 73 - CVE-2023-6112.patch | 29 - chromium-python3.patch | 1687 ----------------- disable-catapult.patch | 2 +- fix-build-tools-to-run-with-python3.11.patch | 72 - pulseaudio-12.2-headers.tar.gz | Bin 70697 -> 130 bytes python3.patch | 159 -- ...eg7.patch => qt5-qtwebengine-ffmpeg7.patch | 262 ++- qt5-qtwebengine.spec | 152 +- ...e-everywhere-opensource-src-5.15.17.tar.xz | 3 + ...-ffmpeg.patch => qtwebengine-ffmpeg5.patch | 55 +- qtwebengine-icu-74.patch | 15 - qtwebengine-release.sh | 15 - riscv-qt5-qtwebengine.patch | 6 +- 16 files changed, 237 insertions(+), 2298 deletions(-) rename qtwebengine-everywhere-opensource-src-5.15.16.tar.xz => 6d29e9cfcfffa7632cc3858ceaf8940677ba9c91.tar.gz (32%) delete mode 100644 Backport-ffmpeg-avcodec-x86-mathops-clip-constants-used-with-.patch delete mode 100644 CVE-2023-6112.patch delete mode 100644 chromium-python3.patch delete mode 100644 fix-build-tools-to-run-with-python3.11.patch delete mode 100644 python3.patch rename riscv-qt5-webengine-ffmpeg7.patch => qt5-qtwebengine-ffmpeg7.patch (81%) create mode 100644 qtwebengine-everywhere-opensource-src-5.15.17.tar.xz rename riscv-Fix-build-with-ffmpeg.patch => qtwebengine-ffmpeg5.patch (92%) delete mode 100644 qtwebengine-icu-74.patch delete mode 100755 qtwebengine-release.sh diff --git a/.gitattributes b/.gitattributes index 05a0e94..7b9c435 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.xz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text diff --git a/qtwebengine-everywhere-opensource-src-5.15.16.tar.xz b/6d29e9cfcfffa7632cc3858ceaf8940677ba9c91.tar.gz similarity index 32% rename from qtwebengine-everywhere-opensource-src-5.15.16.tar.xz rename to 6d29e9cfcfffa7632cc3858ceaf8940677ba9c91.tar.gz index 0742127..dda1d42 100644 --- a/qtwebengine-everywhere-opensource-src-5.15.16.tar.xz +++ b/6d29e9cfcfffa7632cc3858ceaf8940677ba9c91.tar.gz @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:439f86598a02007e0bf66d6474a108373adce99163fbd79a9cfde315c4af5512 -size 317041480 +oid sha256:05c17d2facae807577b0b1eeb31bbbb27a02256e7c058f364ede5b67677f3974 +size 469042157 diff --git a/Backport-ffmpeg-avcodec-x86-mathops-clip-constants-used-with-.patch b/Backport-ffmpeg-avcodec-x86-mathops-clip-constants-used-with-.patch deleted file mode 100644 index 6c94321..0000000 --- a/Backport-ffmpeg-avcodec-x86-mathops-clip-constants-used-with-.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 91a348ac06676ed64a230f08b80ca5f92c92c78c Mon Sep 17 00:00:00 2001 -From: panchenbo -Date: Fri, 15 Mar 2024 10:46:46 +0800 -Subject: [PATCH] ffmpeg: avcodec/x86/mathops: clip constants used with shift - instructions within inline assembly - ---- - .../ffmpeg/libavcodec/x86/mathops.h | 26 ++++++++++++++++--- - 1 file changed, 23 insertions(+), 3 deletions(-) - -diff --git a/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h b/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h -index 6298f5ed1..ca7e2dffc 100644 ---- a/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h -+++ b/src/3rdparty/chromium/third_party/ffmpeg/libavcodec/x86/mathops.h -@@ -35,12 +35,20 @@ - static av_always_inline av_const int MULL(int a, int b, unsigned shift) - { - int rt, dummy; -+ if (__builtin_constant_p(shift)) - __asm__ ( - "imull %3 \n\t" - "shrdl %4, %%edx, %%eax \n\t" - :"=a"(rt), "=d"(dummy) -- :"a"(a), "rm"(b), "ci"((uint8_t)shift) -+ :"a"(a), "rm"(b), "i"(shift & 0x1F) - ); -+ else -+ __asm__ ( -+ "imull %3 \n\t" -+ "shrdl %4, %%edx, %%eax \n\t" -+ :"=a"(rt), "=d"(dummy) -+ :"a"(a), "rm"(b), "c"((uint8_t)shift) -+ ); - return rt; - } - -@@ -113,19 +121,31 @@ __asm__ volatile(\ - // avoid +32 for shift optimization (gcc should do that ...) - #define NEG_SSR32 NEG_SSR32 - static inline int32_t NEG_SSR32( int32_t a, int8_t s){ -+ if (__builtin_constant_p(s)) - __asm__ ("sarl %1, %0\n\t" - : "+r" (a) -- : "ic" ((uint8_t)(-s)) -+ : "i" (-s & 0x1F) - ); -+ else -+ __asm__ ("sarl %1, %0\n\t" -+ : "+r" (a) -+ : "c" ((uint8_t)(-s)) -+ ); - return a; - } - - #define NEG_USR32 NEG_USR32 - static inline uint32_t NEG_USR32(uint32_t a, int8_t s){ -+ if (__builtin_constant_p(s)) - __asm__ ("shrl %1, %0\n\t" - : "+r" (a) -- : "ic" ((uint8_t)(-s)) -+ : "i" (-s & 0x1F) - ); -+ else -+ __asm__ ("shrl %1, %0\n\t" -+ : "+r" (a) -+ : "c" ((uint8_t)(-s)) -+ ); - return a; - } - --- -2.27.0 - diff --git a/CVE-2023-6112.patch b/CVE-2023-6112.patch deleted file mode 100644 index 0771569..0000000 --- a/CVE-2023-6112.patch +++ /dev/null @@ -1,29 +0,0 @@ -From b727ffde2b4ffe8b979927d6dc9f056eb916a8b8 Mon Sep 17 00:00:00 2001 -From: peijiankang -Date: Tue, 30 Jan 2024 09:43:39 +0800 -Subject: [PATCH] CVE-2023-6112 - ---- - .../content/browser/loader/navigation_url_loader_impl.cc | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/3rdparty/chromium/content/browser/loader/navigation_url_loader_impl.cc b/src/3rdparty/chromium/content/browser/loader/navigation_url_loader_impl.cc -index f54cfd9a6..41c78e2fe 100644 ---- a/src/3rdparty/chromium/content/browser/loader/navigation_url_loader_impl.cc -+++ b/src/3rdparty/chromium/content/browser/loader/navigation_url_loader_impl.cc -@@ -560,10 +560,10 @@ void NavigationURLLoaderImpl::MaybeStartLoader( - next_interceptor->MaybeCreateLoader( - *resource_request_, browser_context_, - base::BindOnce(&NavigationURLLoaderImpl::MaybeStartLoader, -- base::Unretained(this), next_interceptor), -+ weak_factory_.GetWeakPtr(), next_interceptor), - base::BindOnce( - &NavigationURLLoaderImpl::FallbackToNonInterceptedRequest, -- base::Unretained(this))); -+ weak_factory_.GetWeakPtr())); - return; - } - --- -2.41.0 - diff --git a/chromium-python3.patch b/chromium-python3.patch deleted file mode 100644 index d3c84a2..0000000 --- a/chromium-python3.patch +++ /dev/null @@ -1,1687 +0,0 @@ -Description: update Chromium code for compatibility with Python 3 -Origin: https://github.com/archlinux/svntogit-packages/blob/packages/qt5-webengine/trunk/qt5-webengine-chromium-python3.patch -Last-Update: 2022-11-25 - ---- a/src/3rdparty/chromium/build/print_python_deps.py -+++ b/src/3rdparty/chromium/build/print_python_deps.py -@@ -1,4 +1,4 @@ --#!/usr/bin/python2.7 -+#!/usr/bin/python3 - # Copyright 2016 The Chromium Authors. All rights reserved. - # Use of this source code is governed by a BSD-style license that can be - # found in the LICENSE file. -@@ -152,7 +152,7 @@ def main(): - - # Trybots run with vpython as default Python, but with a different config - # from //.vpython. To make the is_vpython test work, and to match the behavior -- # of dev machines, the shebang line must be run with python2.7. -+ # of dev machines, the shebang line must be run with python3. - # - # E.g. $HOME/.vpython-root/dd50d3/bin/python - # E.g. /b/s/w/ir/cache/vpython/ab5c79/bin/python ---- a/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py -+++ b/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py -@@ -7,7 +7,7 @@ - Converts a given ASCII proto into a binary resource. - - """ -- -+from __future__ import print_function - import abc - import imp - import optparse -@@ -196,12 +196,12 @@ class BinaryProtoGenerator: - self._ImportProtoModules(opts.path) - - if not self.VerifyArgs(opts): -- print "Wrong arguments" -+ print("Wrong arguments") - return 1 - - try: - self._GenerateBinaryProtos(opts) - except Exception as e: -- print "ERROR: Failed to render binary version of %s:\n %s\n%s" % ( -- opts.infile, str(e), traceback.format_exc()) -+ print("ERROR: Failed to render binary version of %s:\n %s\n%s" % -+ (opts.infile, str(e), traceback.format_exc())) - return 1 ---- a/src/3rdparty/chromium/content/browser/tracing/generate_trace_viewer_grd.py -+++ b/src/3rdparty/chromium/content/browser/tracing/generate_trace_viewer_grd.py -@@ -74,7 +74,7 @@ def main(argv): - for filename in parsed_args.source_files: - add_file_to_grd(doc, os.path.basename(filename)) - -- with open(parsed_args.output_filename, 'w') as output_file: -+ with open(parsed_args.output_filename, 'wb') as output_file: - output_file.write(doc.toxml(encoding='UTF-8')) - - ---- a/src/3rdparty/chromium/mojo/public/tools/bindings/BUILD.gn -+++ b/src/3rdparty/chromium/mojo/public/tools/bindings/BUILD.gn -@@ -2,9 +2,11 @@ - # Use of this source code is governed by a BSD-style license that can be - # found in the LICENSE file. - -+import("//build/config/python.gni") - import("//mojo/public/tools/bindings/mojom.gni") - import("//third_party/jinja2/jinja2.gni") - -+# TODO(crbug.com/1194274): Investigate nondeterminism in Py3 builds. - action("precompile_templates") { - sources = mojom_generator_sources - sources += [ ---- a/src/3rdparty/chromium/mojo/public/tools/bindings/gen_data_files_list.py -+++ b/src/3rdparty/chromium/mojo/public/tools/bindings/gen_data_files_list.py -@@ -18,7 +18,6 @@ import os - import re - import sys - --from cStringIO import StringIO - from optparse import OptionParser - - sys.path.insert( -@@ -41,12 +40,9 @@ def main(): - pattern = re.compile(options.pattern) - files = [f for f in os.listdir(options.directory) if pattern.match(f)] - -- stream = StringIO() -- for f in files: -- print(f, file=stream) -+ contents = '\n'.join(f for f in files) + '\n' -+ WriteFile(contents, options.output) - -- WriteFile(stream.getvalue(), options.output) -- stream.close() - - if __name__ == '__main__': - sys.exit(main()) ---- a/src/3rdparty/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py -+++ b/src/3rdparty/chromium/mojo/public/tools/bindings/generators/mojom_java_generator.py -@@ -25,6 +25,10 @@ sys.path.append(os.path.join(os.path.dir - 'build', 'android', 'gyp')) - from util import build_utils - -+# TODO(crbug.com/1174969): Remove this once Python2 is obsoleted. -+if sys.version_info.major != 2: -+ basestring = str -+ long = int - - GENERATOR_PREFIX = 'java' - ---- a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator.py -+++ b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator.py -@@ -136,9 +136,14 @@ class Stylizer(object): - - def WriteFile(contents, full_path): - # If |contents| is same with the file content, we skip updating. -+ if not isinstance(contents, bytes): -+ data = contents.encode('utf8') -+ else: -+ data = contents -+ - if os.path.isfile(full_path): - with open(full_path, 'rb') as destination_file: -- if destination_file.read() == contents: -+ if destination_file.read() == data: - return - - # Make sure the containing directory exists. -@@ -146,11 +151,8 @@ def WriteFile(contents, full_path): - fileutil.EnsureDirectoryExists(full_dir) - - # Dump the data to disk. -- with open(full_path, "wb") as f: -- if not isinstance(contents, bytes): -- f.write(contents.encode('utf-8')) -- else: -- f.write(contents) -+ with open(full_path, 'wb') as f: -+ f.write(data) - - - def AddComputedData(module): ---- a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/module.py -+++ b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/module.py -@@ -398,7 +398,8 @@ class Field(object): - - - class StructField(Field): -- pass -+ def __hash__(self): -+ return super(Field, self).__hash__() - - - class UnionField(Field): ---- a/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py -+++ b/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/template_expander.py -@@ -75,9 +75,9 @@ def PrecompileTemplates(generator_module - os.path.dirname(module.__file__), generator.GetTemplatePrefix()) - ])) - jinja_env.filters.update(generator.GetFilters()) -- jinja_env.compile_templates( -- os.path.join(output_dir, "%s.zip" % generator.GetTemplatePrefix()), -- extensions=["tmpl"], -- zip="stored", -- py_compile=True, -- ignore_errors=False) -+ jinja_env.compile_templates(os.path.join( -+ output_dir, "%s.zip" % generator.GetTemplatePrefix()), -+ extensions=["tmpl"], -+ zip="stored", -+ py_compile=sys.version_info.major < 3, -+ ignore_errors=False) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py -@@ -344,7 +344,7 @@ def make_default_value_expr(idl_type, de - """ - assert default_value.is_type_compatible_with(idl_type) - -- class DefaultValueExpr: -+ class DefaultValueExpr(object): - _ALLOWED_SYMBOLS_IN_DEPS = ("isolate") - - def __init__(self, initializer_expr, initializer_deps, -@@ -502,7 +502,7 @@ def make_v8_to_blink_value(blink_var_nam - assert isinstance(blink_var_name, str) - assert isinstance(v8_value_expr, str) - assert isinstance(idl_type, web_idl.IdlType) -- assert (argument_index is None or isinstance(argument_index, (int, long))) -+ assert (argument_index is None or isinstance(argument_index, int)) - assert (default_value is None - or isinstance(default_value, web_idl.LiteralConstant)) - -@@ -622,7 +622,7 @@ def make_v8_to_blink_value_variadic(blin - """ - assert isinstance(blink_var_name, str) - assert isinstance(v8_array, str) -- assert isinstance(v8_array_start_index, (int, long)) -+ assert isinstance(v8_array_start_index, int) - assert isinstance(idl_type, web_idl.IdlType) - - pattern = ("auto&& ${{{_1}}} = " ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/callback_interface.py -@@ -177,7 +177,7 @@ def generate_callback_interface(callback - prop_install_mode=PropInstallMode.UNCONDITIONAL, - trampoline_var_name=None, - attribute_entries=[], -- constant_entries=filter(is_unconditional, constant_entries), -+ constant_entries=list(filter(is_unconditional, constant_entries)), - exposed_construct_entries=[], - operation_entries=[]) - (install_interface_template_decl, install_interface_template_def, ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/code_node.py -@@ -503,13 +503,13 @@ class CompositeNode(CodeNode): - gensym_kwargs = {} - template_vars = {} - for arg in args: -- assert isinstance(arg, (CodeNode, int, long, str)) -+ assert isinstance(arg, (CodeNode, int, str)) - gensym = CodeNode.gensym() - gensym_args.append("${{{}}}".format(gensym)) - template_vars[gensym] = arg - for key, value in kwargs.items(): -- assert isinstance(key, (int, long, str)) -- assert isinstance(value, (CodeNode, int, long, str)) -+ assert isinstance(key, (int, str)) -+ assert isinstance(value, (CodeNode, int, str)) - gensym = CodeNode.gensym() - gensym_kwargs[key] = "${{{}}}".format(gensym) - template_vars[gensym] = value -@@ -602,7 +602,7 @@ class ListNode(CodeNode): - def insert(self, index, node): - if node is None: - return -- assert isinstance(index, (int, long)) -+ assert isinstance(index, int) - assert isinstance(node, CodeNode) - assert node.outer is None and node.prev is None - -@@ -721,7 +721,7 @@ class SymbolScopeNode(SequenceNode): - if not scope_chains: - return counts - -- self_index = iter(scope_chains).next().index(self) -+ self_index = next(iter(scope_chains)).index(self) - scope_chains = map( - lambda scope_chain: scope_chain[self_index + 1:], scope_chains) - scope_to_likeliness = {} ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_expr.py -@@ -109,7 +109,7 @@ def expr_and(terms): - - if any(term.is_always_false for term in terms): - return _Expr(False) -- terms = filter(lambda x: not x.is_always_true, terms) -+ terms = list(filter(lambda x: not x.is_always_true, terms)) - if not terms: - return _Expr(True) - if len(terms) == 1: -@@ -124,7 +124,7 @@ def expr_or(terms): - - if any(term.is_always_true for term in terms): - return _Expr(True) -- terms = filter(lambda x: not x.is_always_false, terms) -+ terms = list(filter(lambda x: not x.is_always_false, terms)) - if not terms: - return _Expr(False) - if len(terms) == 1: -@@ -222,7 +222,7 @@ def expr_from_exposure(exposure, - elif exposure.only_in_secure_contexts is False: - secure_context_term = _Expr(True) - else: -- terms = map(ref_enabled, exposure.only_in_secure_contexts) -+ terms = list(map(ref_enabled, exposure.only_in_secure_contexts)) - secure_context_term = expr_or( - [_Expr("${is_in_secure_context}"), - expr_not(expr_and(terms))]) -@@ -275,10 +275,11 @@ def expr_from_exposure(exposure, - - # [ContextEnabled] - if exposure.context_enabled_features: -- terms = map( -- lambda feature: _Expr( -- "${{context_feature_settings}}->is{}Enabled()".format( -- feature)), exposure.context_enabled_features) -+ terms = list( -+ map( -+ lambda feature: _Expr( -+ "${{context_feature_settings}}->is{}Enabled()".format( -+ feature)), exposure.context_enabled_features)) - context_enabled_terms.append( - expr_and([_Expr("${context_feature_settings}"), - expr_or(terms)])) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_format.py -@@ -23,7 +23,7 @@ class _TemplateFormatter(string.Formatte - self._template_formatter_indexing_count_ = 0 - - def get_value(self, key, args, kwargs): -- if isinstance(key, (int, long)): -+ if isinstance(key, int): - return args[key] - assert isinstance(key, str) - if not key: ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/codegen_utils.py -@@ -116,4 +116,4 @@ def write_code_node_to_file(code_node, f - # stderr=format_result.error_message)) - # - # web_idl.file_io.write_to_file_if_changed(filepath, format_result.contents) -- web_idl.file_io.write_to_file_if_changed(filepath, rendered_text) -+ web_idl.file_io.write_to_file_if_changed(filepath, rendered_text.encode('utf-8')) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/dictionary.py -@@ -993,7 +993,7 @@ def make_dict_trace_func(cg_context): - _2 = _blink_member_name(member).value_var - return TextNode(_format(pattern, _1=_1, _2=_2)) - -- body.extend(map(make_trace_member_node, own_members)) -+ body.extend(list(map(make_trace_member_node, own_members))) - body.append(TextNode("BaseClass::Trace(visitor);")) - - return func_decl, func_def ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py -@@ -582,7 +582,7 @@ def _make_blink_api_call(code_node, - overriding_args=None): - assert isinstance(code_node, SymbolScopeNode) - assert isinstance(cg_context, CodeGenContext) -- assert num_of_args is None or isinstance(num_of_args, (int, long)) -+ assert num_of_args is None or isinstance(num_of_args, int) - assert (overriding_args is None - or (isinstance(overriding_args, (list, tuple)) - and all(isinstance(arg, str) for arg in overriding_args))) -@@ -1196,8 +1196,10 @@ def make_overload_dispatcher(cg_context) - did_use_break = did_use_break or can_fail - - conditional = expr_or( -- map(lambda item: expr_from_exposure(item.function_like.exposure), -- items)) -+ list( -+ map( -+ lambda item: expr_from_exposure(item.function_like.exposure -+ ), items))) - if not conditional.is_always_true: - node = CxxUnlikelyIfNode(cond=conditional, body=node) - -@@ -4642,7 +4644,7 @@ class _PropEntryConstructorGroup(_PropEn - def __init__(self, is_context_dependent, exposure_conditional, world, - constructor_group, ctor_callback_name, ctor_func_length): - assert isinstance(ctor_callback_name, str) -- assert isinstance(ctor_func_length, (int, long)) -+ assert isinstance(ctor_func_length, int) - - _PropEntryBase.__init__(self, is_context_dependent, - exposure_conditional, world, constructor_group) -@@ -4670,7 +4672,7 @@ class _PropEntryOperationGroup(_PropEntr - op_func_length, - no_alloc_direct_callback_name=None): - assert isinstance(op_callback_name, str) -- assert isinstance(op_func_length, (int, long)) -+ assert isinstance(op_func_length, int) - - _PropEntryBase.__init__(self, is_context_dependent, - exposure_conditional, world, operation_group) -@@ -5175,9 +5177,9 @@ def make_install_interface_template(cg_c - ]) - - if class_like.identifier == "CSSStyleDeclaration": -- css_properties = filter( -- lambda attr: "CSSProperty" in attr.extended_attributes, -- class_like.attributes) -+ css_properties = list( -+ filter(lambda attr: "CSSProperty" in attr.extended_attributes, -+ class_like.attributes)) - if css_properties: - prop_name_list = "".join( - map(lambda attr: "\"{}\", ".format(attr.identifier), -@@ -5567,8 +5569,8 @@ ${instance_object} = ${v8_context}->Glob - "V8DOMConfiguration::InstallConstants(${isolate}, " - "${interface_template}, ${prototype_template}, " - "kConstantCallbackTable, base::size(kConstantCallbackTable));") -- constant_callback_entries = filter(lambda entry: entry.const_callback_name, -- constant_entries) -+ constant_callback_entries = list(filter(lambda entry: entry.const_callback_name, -+ constant_entries)) - install_properties(table_name, constant_callback_entries, - _make_constant_callback_registration_table, - installer_call_text) -@@ -5584,8 +5586,8 @@ ${instance_object} = ${v8_context}->Glob - "V8DOMConfiguration::InstallConstants(${isolate}, " - "${interface_template}, ${prototype_template}, " - "kConstantValueTable, base::size(kConstantValueTable));") -- constant_value_entries = filter( -- lambda entry: not entry.const_callback_name, constant_entries) -+ constant_value_entries = list(filter( -+ lambda entry: not entry.const_callback_name, constant_entries)) - install_properties(table_name, constant_value_entries, - _make_constant_value_registration_table, - installer_call_text) -@@ -6336,8 +6338,8 @@ def make_v8_context_snapshot_api(cg_cont - assert isinstance(component, web_idl.Component) - - derived_interfaces = cg_context.interface.deriveds -- derived_names = map(lambda interface: interface.identifier, -- derived_interfaces) -+ derived_names = list( -+ map(lambda interface: interface.identifier, derived_interfaces)) - derived_names.append(cg_context.interface.identifier) - if not ("Window" in derived_names or "HTMLDocument" in derived_names): - return None, None -@@ -6411,9 +6413,11 @@ def _make_v8_context_snapshot_get_refere - collect_callbacks(named_properties_object_callback_defs) - collect_callbacks(cross_origin_property_callback_defs) - -- entry_nodes = map( -- lambda name: TextNode("reinterpret_cast({}),".format(name)), -- filter(None, callback_names)) -+ entry_nodes = list( -+ map( -+ lambda name: TextNode("reinterpret_cast({}),".format(name -+ )), -+ filter(None, callback_names))) - table_node = ListNode([ - TextNode("using namespace ${class_name}Callbacks;"), - TextNode("static const intptr_t kReferenceTable[] = {"), -@@ -6451,10 +6455,11 @@ def _make_v8_context_snapshot_install_pr - class_name=None, - prop_install_mode=PropInstallMode.V8_CONTEXT_SNAPSHOT, - trampoline_var_name=None, -- attribute_entries=filter(selector, attribute_entries), -- constant_entries=filter(selector, constant_entries), -- exposed_construct_entries=filter(selector, exposed_construct_entries), -- operation_entries=filter(selector, operation_entries)) -+ attribute_entries=list(filter(selector, attribute_entries)), -+ constant_entries=list(filter(selector, constant_entries)), -+ exposed_construct_entries=list( -+ filter(selector, exposed_construct_entries)), -+ operation_entries=list(filter(selector, operation_entries))) - - return func_decl, func_def - -@@ -6810,11 +6815,11 @@ def generate_interface(interface_identif - class_name=impl_class_name, - prop_install_mode=PropInstallMode.UNCONDITIONAL, - trampoline_var_name=tp_install_unconditional_props, -- attribute_entries=filter(is_unconditional, attribute_entries), -- constant_entries=filter(is_unconditional, constant_entries), -- exposed_construct_entries=filter(is_unconditional, -- exposed_construct_entries), -- operation_entries=filter(is_unconditional, operation_entries)) -+ attribute_entries=list(filter(is_unconditional, attribute_entries)), -+ constant_entries=list(filter(is_unconditional, constant_entries)), -+ exposed_construct_entries=list( -+ filter(is_unconditional, exposed_construct_entries)), -+ operation_entries=list(filter(is_unconditional, operation_entries))) - (install_context_independent_props_decl, - install_context_independent_props_def, - install_context_independent_props_trampoline) = make_install_properties( -@@ -6823,11 +6828,14 @@ def generate_interface(interface_identif - class_name=impl_class_name, - prop_install_mode=PropInstallMode.CONTEXT_INDEPENDENT, - trampoline_var_name=tp_install_context_independent_props, -- attribute_entries=filter(is_context_independent, attribute_entries), -- constant_entries=filter(is_context_independent, constant_entries), -- exposed_construct_entries=filter(is_context_independent, -- exposed_construct_entries), -- operation_entries=filter(is_context_independent, operation_entries)) -+ attribute_entries=list( -+ filter(is_context_independent, attribute_entries)), -+ constant_entries=list(filter(is_context_independent, -+ constant_entries)), -+ exposed_construct_entries=list( -+ filter(is_context_independent, exposed_construct_entries)), -+ operation_entries=list( -+ filter(is_context_independent, operation_entries))) - (install_context_dependent_props_decl, install_context_dependent_props_def, - install_context_dependent_props_trampoline) = make_install_properties( - cg_context, -@@ -6835,11 +6843,13 @@ def generate_interface(interface_identif - class_name=impl_class_name, - prop_install_mode=PropInstallMode.CONTEXT_DEPENDENT, - trampoline_var_name=tp_install_context_dependent_props, -- attribute_entries=filter(is_context_dependent, attribute_entries), -- constant_entries=filter(is_context_dependent, constant_entries), -- exposed_construct_entries=filter(is_context_dependent, -- exposed_construct_entries), -- operation_entries=filter(is_context_dependent, operation_entries)) -+ attribute_entries=list(filter(is_context_dependent, -+ attribute_entries)), -+ constant_entries=list(filter(is_context_dependent, constant_entries)), -+ exposed_construct_entries=list( -+ filter(is_context_dependent, exposed_construct_entries)), -+ operation_entries=list(filter(is_context_dependent, -+ operation_entries))) - (install_interface_template_decl, install_interface_template_def, - install_interface_template_trampoline) = make_install_interface_template( - cg_context, ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/mako_renderer.py -@@ -105,7 +105,7 @@ class MakoRenderer(object): - on_error = self._caller_stack_on_error - if (len(current) <= len(on_error) - and all(current[i] == on_error[i] -- for i in xrange(len(current)))): -+ for i in range(len(current)))): - pass # Error happened in a deeper caller. - else: - self._caller_stack_on_error = list(self._caller_stack) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/style_format.py -@@ -70,8 +70,13 @@ def gn_format(contents, filename=None): - - - def _invoke_format_command(command_line, filename, contents): -- proc = subprocess.Popen( -- command_line, stdin=subprocess.PIPE, stdout=subprocess.PIPE) -+ kwargs = {} -+ if sys.version_info.major != 2: -+ kwargs['encoding'] = 'utf-8' -+ proc = subprocess.Popen(command_line, -+ stdin=subprocess.PIPE, -+ stdout=subprocess.PIPE, -+ **kwargs) - stdout_output, stderr_output = proc.communicate(input=contents) - exit_code = proc.wait() - ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/bind_gen/task_queue.py -@@ -2,6 +2,7 @@ - # Use of this source code is governed by a BSD-style license that can be - # found in the LICENSE file. - -+import functools - import multiprocessing - - from .package_initializer import package_initializer -@@ -76,7 +77,7 @@ class TaskQueue(object): - if not report_progress: - return - -- done_count = reduce( -+ done_count = functools.reduce( - lambda count, worker_task: count + bool(worker_task.ready()), - self._worker_tasks, 0) - report_progress(len(self._worker_tasks), done_count) -@@ -85,4 +86,4 @@ class TaskQueue(object): - def _task_queue_run_tasks(tasks): - for task in tasks: - func, args, kwargs = task -- apply(func, args, kwargs) -+ func(*args, **kwargs) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/code_generator.py -@@ -13,6 +13,7 @@ import re - import sys - - from idl_types import set_ancestors, IdlType -+from itertools import groupby - from v8_globals import includes - from v8_interface import constant_filters - from v8_types import set_component_dirs -@@ -43,6 +44,7 @@ TEMPLATES_DIR = os.path.normpath( - # after path[0] == invoking script dir - sys.path.insert(1, THIRD_PARTY_DIR) - import jinja2 -+from jinja2.filters import make_attrgetter, environmentfilter - - - def generate_indented_conditional(code, conditional): -@@ -88,6 +90,13 @@ def runtime_enabled_if(code, name): - return generate_indented_conditional(code, function) - - -+@environmentfilter -+def do_stringify_key_group_by(environment, value, attribute): -+ expr = make_attrgetter(environment, attribute) -+ key = lambda item: '' if expr(item) is None else str(expr(item)) -+ return groupby(sorted(value, key=key), expr) -+ -+ - def initialize_jinja_env(cache_dir): - jinja_env = jinja2.Environment( - loader=jinja2.FileSystemLoader(TEMPLATES_DIR), -@@ -117,6 +126,7 @@ def initialize_jinja_env(cache_dir): - }) - jinja_env.filters.update(constant_filters()) - jinja_env.filters.update(method_filters()) -+ jinja_env.filters["stringifykeygroupby"] = do_stringify_key_group_by - return jinja_env - - ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/generate_origin_trial_features.py -@@ -80,7 +80,7 @@ def read_idl_file(reader, idl_filename): - assert len(interfaces) == 1, ( - "Expected one interface in file %r, found %d" % - (idl_filename, len(interfaces))) -- return (interfaces.values()[0], includes) -+ return (list(interfaces.values())[0], includes) - - - def interface_is_global(interface): -@@ -281,7 +281,7 @@ def main(): - - info_provider = create_component_info_provider( - os.path.normpath(options.info_dir), options.target_component) -- idl_filenames = map(str.strip, open(options.idl_files_list)) -+ idl_filenames = list(map(str.strip, open(options.idl_files_list))) - - generate_origin_trial_features(info_provider, options, idl_filenames) - return 0 ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_definitions.py -@@ -394,7 +394,8 @@ class IdlInterface(object): - else: - raise ValueError('Unrecognized node class: %s' % child_class) - -- if len(filter(None, [self.iterable, self.maplike, self.setlike])) > 1: -+ if len(list(filter(None, -+ [self.iterable, self.maplike, self.setlike]))) > 1: - raise ValueError( - 'Interface can only have one of iterable<>, maplike<> and setlike<>.' - ) -@@ -512,6 +513,9 @@ class IdlAttribute(TypedObject): - def accept(self, visitor): - visitor.visit_attribute(self) - -+ def __lt__(self, other): -+ return self.name < other.name -+ - - ################################################################################ - # Constants -@@ -852,7 +856,7 @@ class IdlIncludes(object): - ################################################################################ - - --class Exposure: -+class Exposure(object): - """An Exposure holds one Exposed or RuntimeEnabled condition. - Each exposure has two properties: exposed and runtime_enabled. - Exposure(e, r) corresponds to [Exposed(e r)]. Exposure(e) corresponds to ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_reader.py -@@ -55,8 +55,8 @@ def validate_blink_idl_definitions(idl_f - definitions. There is no filename convention in this case. - - Otherwise, an IDL file is invalid. - """ -- targets = ( -- definitions.interfaces.values() + definitions.dictionaries.values()) -+ targets = (list(definitions.interfaces.values()) + -+ list(definitions.dictionaries.values())) - number_of_targets = len(targets) - if number_of_targets > 1: - raise Exception( ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/idl_types.py -@@ -349,7 +349,7 @@ class IdlUnionType(IdlTypeBase): - return True - - def single_matching_member_type(self, predicate): -- matching_types = filter(predicate, self.flattened_member_types) -+ matching_types = list(filter(predicate, self.flattened_member_types)) - if len(matching_types) > 1: - raise ValueError('%s is ambiguous.' % self.name) - return matching_types[0] if matching_types else None ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/utilities.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/utilities.py -@@ -196,8 +196,9 @@ class ComponentInfoProviderModules(Compo - - @property - def callback_functions(self): -- return dict(self._component_info_core['callback_functions'].items() + -- self._component_info_modules['callback_functions'].items()) -+ return dict( -+ list(self._component_info_core['callback_functions'].items()) + -+ list(self._component_info_modules['callback_functions'].items())) - - @property - def specifier_for_export(self): -@@ -209,8 +210,8 @@ class ComponentInfoProviderModules(Compo - - - def load_interfaces_info_overall_pickle(info_dir): -- with open(os.path.join(info_dir, -- 'interfaces_info.pickle')) as interface_info_file: -+ with open(os.path.join(info_dir, 'interfaces_info.pickle'), -+ mode='rb') as interface_info_file: - return pickle.load(interface_info_file) - - -@@ -236,23 +237,20 @@ def merge_dict_recursively(target, diff) - - def create_component_info_provider_core(info_dir): - interfaces_info = load_interfaces_info_overall_pickle(info_dir) -- with open( -- os.path.join(info_dir, 'core', -- 'component_info_core.pickle')) as component_info_file: -+ with open(os.path.join(info_dir, 'core', 'component_info_core.pickle'), -+ mode='rb') as component_info_file: - component_info = pickle.load(component_info_file) - return ComponentInfoProviderCore(interfaces_info, component_info) - - - def create_component_info_provider_modules(info_dir): - interfaces_info = load_interfaces_info_overall_pickle(info_dir) -- with open( -- os.path.join(info_dir, 'core', -- 'component_info_core.pickle')) as component_info_file: -+ with open(os.path.join(info_dir, 'core', 'component_info_core.pickle'), -+ mode='rb') as component_info_file: - component_info_core = pickle.load(component_info_file) -- with open( -- os.path.join( -- info_dir, 'modules', -- 'component_info_modules.pickle')) as component_info_file: -+ with open(os.path.join(info_dir, 'modules', -+ 'component_info_modules.pickle'), -+ mode='rb') as component_info_file: - component_info_modules = pickle.load(component_info_file) - return ComponentInfoProviderModules(interfaces_info, component_info_core, - component_info_modules) -@@ -356,7 +354,7 @@ def write_pickle_file(pickle_filename, d - pickle_filename = abs(pickle_filename) - # If |data| is same with the file content, we skip updating. - if os.path.isfile(pickle_filename): -- with open(pickle_filename) as pickle_file: -+ with open(pickle_filename, 'rb') as pickle_file: - try: - if pickle.load(pickle_file) == data: - return ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_interface.py -@@ -189,7 +189,7 @@ def context_enabled_features(attributes) - return sorted([ - member for member in members - if member.get(KEY) and not member.get('exposed_test') -- ]) -+ ], key=lambda item: item['name']) - - def member_filter_by_name(members, name): - return [member for member in members if member[KEY] == name] -@@ -612,7 +612,8 @@ def interface_context(interface, interfa - sorted( - origin_trial_features(interface, context['constants'], - context['attributes'], context['methods']) + -- context_enabled_features(context['attributes'])), -+ context_enabled_features(context['attributes']), -+ key=lambda item: item['name']), - }) - if context['optional_features']: - includes.add('platform/bindings/v8_per_context_data.h') -@@ -1356,9 +1357,9 @@ def resolution_tests_methods(effective_o - - # Extract argument and IDL type to simplify accessing these in each loop. - arguments = [method['arguments'][index] for method in methods] -- arguments_methods = zip(arguments, methods) -+ arguments_methods = list(zip(arguments, methods)) - idl_types = [argument['idl_type_object'] for argument in arguments] -- idl_types_methods = zip(idl_types, methods) -+ idl_types_methods = list(zip(idl_types, methods)) - - # We can’t do a single loop through all methods or simply sort them, because - # a method may be listed in multiple steps of the resolution algorithm, and ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_methods.py -@@ -46,6 +46,10 @@ import v8_types - import v8_utilities - from v8_utilities import (has_extended_attribute_value, is_unforgeable) - -+# TODO: Remove this once Python2 is obsoleted. -+if sys.version_info.major != 2: -+ basestring = str -+ - - def method_is_visible(method, interface_is_partial): - if 'overloads' in method: ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/v8_utilities.py -@@ -271,7 +271,7 @@ EXPOSED_WORKERS = set([ - ]) - - --class ExposureSet: -+class ExposureSet(object): - """An ExposureSet is a collection of Exposure instructions.""" - - def __init__(self, exposures=None): ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/callback_interface.py -@@ -91,11 +91,13 @@ class CallbackInterface(UserDefinedType, - for operation_ir in ir.operations - ]) - self._operation_groups = tuple([ -- OperationGroup( -- operation_group_ir, -- filter(lambda x: x.identifier == operation_group_ir.identifier, -- self._operations), -- owner=self) for operation_group_ir in ir.operation_groups -+ OperationGroup(operation_group_ir, -+ list( -+ filter( -+ lambda x: x.identifier == operation_group_ir -+ .identifier, self._operations)), -+ owner=self) -+ for operation_group_ir in ir.operation_groups - ]) - - @property ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/database.py -@@ -156,4 +156,4 @@ class Database(object): - return self._view_by_kind(Database._Kind.UNION) - - def _view_by_kind(self, kind): -- return self._impl.find_by_kind(kind).values() -+ return list(self._impl.find_by_kind(kind).values()) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/exposure.py -@@ -8,8 +8,11 @@ from .runtime_enabled_features import Ru - class _Feature(str): - """Represents a runtime-enabled feature.""" - -+ def __new__(cls, value): -+ return str.__new__(cls, value) -+ - def __init__(self, value): -- str.__init__(self, value) -+ str.__init__(self) - self._is_context_dependent = ( - RuntimeEnabledFeatures.is_context_dependent(self)) - ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/function_like.py -@@ -71,8 +71,9 @@ class FunctionLike(WithIdentifier): - def num_of_required_arguments(self): - """Returns the number of required arguments.""" - return len( -- filter(lambda arg: not (arg.is_optional or arg.is_variadic), -- self.arguments)) -+ list( -+ filter(lambda arg: not (arg.is_optional or arg.is_variadic), -+ self.arguments))) - - - class OverloadGroup(WithIdentifier): -@@ -171,8 +172,7 @@ class OverloadGroup(WithIdentifier): - Returns the effective overload set. - https://heycam.github.io/webidl/#compute-the-effective-overload-set - """ -- assert argument_count is None or isinstance(argument_count, -- (int, long)) -+ assert argument_count is None or isinstance(argument_count, int) - - N = argument_count - S = [] -@@ -188,21 +188,21 @@ class OverloadGroup(WithIdentifier): - - S.append( - OverloadGroup.EffectiveOverloadItem( -- X, map(lambda arg: arg.idl_type, X.arguments), -- map(lambda arg: arg.optionality, X.arguments))) -+ X, list(map(lambda arg: arg.idl_type, X.arguments)), -+ list(map(lambda arg: arg.optionality, X.arguments)))) - - if X.is_variadic: -- for i in xrange(n, max(maxarg, N)): -- t = map(lambda arg: arg.idl_type, X.arguments) -- o = map(lambda arg: arg.optionality, X.arguments) -- for _ in xrange(n, i + 1): -+ for i in range(n, max(maxarg, N)): -+ t = list(map(lambda arg: arg.idl_type, X.arguments)) -+ o = list(map(lambda arg: arg.optionality, X.arguments)) -+ for _ in range(n, i + 1): - t.append(X.arguments[-1].idl_type) - o.append(X.arguments[-1].optionality) - S.append(OverloadGroup.EffectiveOverloadItem(X, t, o)) - -- t = map(lambda arg: arg.idl_type, X.arguments) -- o = map(lambda arg: arg.optionality, X.arguments) -- for i in xrange(n - 1, -1, -1): -+ t = list(map(lambda arg: arg.idl_type, X.arguments)) -+ o = list(map(lambda arg: arg.optionality, X.arguments)) -+ for i in range(n - 1, -1, -1): - if X.arguments[i].optionality == IdlType.Optionality.REQUIRED: - break - S.append(OverloadGroup.EffectiveOverloadItem(X, t[:i], o[:i])) -@@ -222,7 +222,7 @@ class OverloadGroup(WithIdentifier): - for item in items) - assert len(items) > 1 - -- for index in xrange(len(items[0].type_list)): -+ for index in range(len(items[0].type_list)): - # Assume that the given items are valid, and we only need to test - # the two types. - if OverloadGroup.are_distinguishable_types( ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py -@@ -149,8 +149,8 @@ class IdlCompiler(object): - for old_ir in old_irs: - new_ir = make_copy(old_ir) - self._ir_map.add(new_ir) -- new_ir.attributes = filter(not_disabled, new_ir.attributes) -- new_ir.operations = filter(not_disabled, new_ir.operations) -+ new_ir.attributes = list(filter(not_disabled, new_ir.attributes)) -+ new_ir.operations = list(filter(not_disabled, new_ir.operations)) - - def _record_defined_in_partial_and_mixin(self): - old_irs = self._ir_map.irs_of_kinds( -@@ -231,7 +231,7 @@ class IdlCompiler(object): - only_to_members_of_partial_or_mixin=False) - propagate_to_exposure(propagate) - -- map(process_member_like, ir.iter_all_members()) -+ list(map(process_member_like, ir.iter_all_members())) - - def process_member_like(ir): - propagate = functools.partial(propagate_extattr, ir=ir) -@@ -257,7 +257,7 @@ class IdlCompiler(object): - - self._ir_map.move_to_new_phase() - -- map(process_interface_like, old_irs) -+ list(map(process_interface_like, old_irs)) - - def _determine_blink_headers(self): - irs = self._ir_map.irs_of_kinds( -@@ -422,9 +422,9 @@ class IdlCompiler(object): - assert not new_interface.deriveds - derived_set = identifier_to_derived_set.get( - new_interface.identifier, set()) -- new_interface.deriveds = map( -- lambda id_: self._ref_to_idl_def_factory.create(id_), -- sorted(derived_set)) -+ new_interface.deriveds = list( -+ map(lambda id_: self._ref_to_idl_def_factory.create(id_), -+ sorted(derived_set))) - - def _supplement_missing_html_constructor_operation(self): - # Temporary mitigation of misuse of [HTMLConstructor] -@@ -553,7 +553,8 @@ class IdlCompiler(object): - self._ir_map.add(new_ir) - - for group in new_ir.iter_all_overload_groups(): -- exposures = map(lambda overload: overload.exposure, group) -+ exposures = list(map(lambda overload: overload.exposure, -+ group)) - - # [Exposed] - if any(not exposure.global_names_and_features -@@ -653,8 +654,8 @@ class IdlCompiler(object): - constructs = set() - for global_name in global_names: - constructs.update(exposed_map.get(global_name, [])) -- new_ir.exposed_constructs = map( -- self._ref_to_idl_def_factory.create, sorted(constructs)) -+ new_ir.exposed_constructs = list( -+ map(self._ref_to_idl_def_factory.create, sorted(constructs))) - - assert not new_ir.legacy_window_aliases - if new_ir.identifier != 'Window': ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/interface.py -@@ -180,8 +180,9 @@ class Interface(UserDefinedType, WithExt - self._constructor_groups = tuple([ - ConstructorGroup( - group_ir, -- filter(lambda x: x.identifier == group_ir.identifier, -- self._constructors), -+ list( -+ filter(lambda x: x.identifier == group_ir.identifier, -+ self._constructors)), - owner=self) for group_ir in ir.constructor_groups - ]) - assert len(self._constructor_groups) <= 1 -@@ -192,8 +193,9 @@ class Interface(UserDefinedType, WithExt - self._named_constructor_groups = tuple([ - ConstructorGroup( - group_ir, -- filter(lambda x: x.identifier == group_ir.identifier, -- self._named_constructors), -+ list( -+ filter(lambda x: x.identifier == group_ir.identifier, -+ self._named_constructors)), - owner=self) for group_ir in ir.named_constructor_groups - ]) - self._operations = tuple([ -@@ -203,22 +205,23 @@ class Interface(UserDefinedType, WithExt - self._operation_groups = tuple([ - OperationGroup( - group_ir, -- filter(lambda x: x.identifier == group_ir.identifier, -- self._operations), -+ list( -+ filter(lambda x: x.identifier == group_ir.identifier, -+ self._operations)), - owner=self) for group_ir in ir.operation_groups - ]) - self._exposed_constructs = tuple(ir.exposed_constructs) - self._legacy_window_aliases = tuple(ir.legacy_window_aliases) - self._indexed_and_named_properties = None -- indexed_and_named_property_operations = filter( -- lambda x: x.is_indexed_or_named_property_operation, -- self._operations) -+ indexed_and_named_property_operations = list( -+ filter(lambda x: x.is_indexed_or_named_property_operation, -+ self._operations)) - if indexed_and_named_property_operations: - self._indexed_and_named_properties = IndexedAndNamedProperties( - indexed_and_named_property_operations, owner=self) - self._stringifier = None -- stringifier_operation_irs = filter(lambda x: x.is_stringifier, -- ir.operations) -+ stringifier_operation_irs = list( -+ filter(lambda x: x.is_stringifier, ir.operations)) - if stringifier_operation_irs: - assert len(stringifier_operation_irs) == 1 - op_ir = make_copy(stringifier_operation_irs[0]) -@@ -231,8 +234,9 @@ class Interface(UserDefinedType, WithExt - attribute = None - if operation.stringifier_attribute: - attr_id = operation.stringifier_attribute -- attributes = filter(lambda x: x.identifier == attr_id, -- self._attributes) -+ attributes = list( -+ filter(lambda x: x.identifier == attr_id, -+ self._attributes)) - assert len(attributes) == 1 - attribute = attributes[0] - self._stringifier = Stringifier(operation, attribute, owner=self) -@@ -578,8 +582,9 @@ class Iterable(WithDebugInfo): - self._operation_groups = tuple([ - OperationGroup( - group_ir, -- filter(lambda x: x.identifier == group_ir.identifier, -- self._operations), -+ list( -+ filter(lambda x: x.identifier == group_ir.identifier, -+ self._operations)), - owner=owner) for group_ir in ir.operation_groups - ]) - -@@ -666,8 +671,9 @@ class Maplike(WithDebugInfo): - self._operation_groups = tuple([ - OperationGroup( - group_ir, -- filter(lambda x: x.identifier == group_ir.identifier, -- self._operations), -+ list( -+ filter(lambda x: x.identifier == group_ir.identifier, -+ self._operations)), - owner=owner) for group_ir in ir.operation_groups - ]) - -@@ -755,8 +761,9 @@ class Setlike(WithDebugInfo): - self._operation_groups = tuple([ - OperationGroup( - group_ir, -- filter(lambda x: x.identifier == group_ir.identifier, -- self._operations), -+ list( -+ filter(lambda x: x.identifier == group_ir.identifier, -+ self._operations)), - owner=owner) for group_ir in ir.operation_groups - ]) - ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/ir_builder.py -@@ -2,6 +2,8 @@ - # Use of this source code is governed by a BSD-style license that can be - # found in the LICENSE file. - -+import sys -+ - from .argument import Argument - from .ast_group import AstGroup - from .attribute import Attribute -@@ -30,6 +32,11 @@ from .operation import Operation - from .typedef import Typedef - - -+# TODO: Remove this once Python2 is obsoleted. -+if sys.version_info.major != 2: -+ long = int -+ -+ - def load_and_register_idl_definitions(filepaths, register_ir, - create_ref_to_idl_def, idl_type_factory): - """ -@@ -160,7 +167,7 @@ class _IRBuilder(object): - child_nodes = list(node.GetChildren()) - extended_attributes = self._take_extended_attributes(child_nodes) - -- members = map(self._build_interface_member, child_nodes) -+ members = list(map(self._build_interface_member, child_nodes)) - attributes = [] - constants = [] - operations = [] -@@ -302,7 +309,7 @@ class _IRBuilder(object): - child_nodes = list(node.GetChildren()) - inherited = self._take_inheritance(child_nodes) - extended_attributes = self._take_extended_attributes(child_nodes) -- own_members = map(self._build_dictionary_member, child_nodes) -+ own_members = list(map(self._build_dictionary_member, child_nodes)) - - return Dictionary.IR( - identifier=Identifier(node.GetName()), -@@ -336,7 +343,7 @@ class _IRBuilder(object): - - child_nodes = list(node.GetChildren()) - extended_attributes = self._take_extended_attributes(child_nodes) -- members = map(self._build_interface_member, child_nodes) -+ members = list(map(self._build_interface_member, child_nodes)) - constants = [] - operations = [] - for member in members: -@@ -456,8 +463,8 @@ class _IRBuilder(object): - assert len(child_nodes) == 1 - child = child_nodes[0] - if child.GetClass() == 'Arguments': -- arguments = map(build_extattr_argument, -- child.GetChildren()) -+ arguments = list( -+ map(build_extattr_argument, child.GetChildren())) - elif child.GetClass() == 'Call': - assert len(child.GetChildren()) == 1 - grand_child = child.GetChildren()[0] -@@ -486,7 +493,9 @@ class _IRBuilder(object): - - assert node.GetClass() == 'ExtAttributes' - return ExtendedAttributes( -- filter(None, map(build_extended_attribute, node.GetChildren()))) -+ list( -+ filter(None, map(build_extended_attribute, -+ node.GetChildren())))) - - def _build_inheritance(self, node): - assert node.GetClass() == 'Inherit' -@@ -506,7 +515,7 @@ class _IRBuilder(object): - - def _build_iterable(self, node): - assert node.GetClass() == 'Iterable' -- types = map(self._build_type, node.GetChildren()) -+ types = list(map(self._build_type, node.GetChildren())) - assert len(types) == 1 or len(types) == 2 - if len(types) == 1: # value iterator - key_type, value_type = (None, types[0]) -@@ -584,7 +593,7 @@ class _IRBuilder(object): - def _build_maplike(self, node, interface_identifier): - assert node.GetClass() == 'Maplike' - assert isinstance(interface_identifier, Identifier) -- types = map(self._build_type, node.GetChildren()) -+ types = list(map(self._build_type, node.GetChildren())) - assert len(types) == 2 - key_type, value_type = types - is_readonly = bool(node.GetProperty('READONLY')) -@@ -676,7 +685,7 @@ class _IRBuilder(object): - def _build_setlike(self, node, interface_identifier): - assert node.GetClass() == 'Setlike' - assert isinstance(interface_identifier, Identifier) -- types = map(self._build_type, node.GetChildren()) -+ types = list(map(self._build_type, node.GetChildren())) - assert len(types) == 1 - value_type = types[0] - is_readonly = bool(node.GetProperty('READONLY')) -@@ -838,7 +847,7 @@ class _IRBuilder(object): - - def build_union_type(node, extended_attributes): - return self._idl_type_factory.union_type( -- member_types=map(self._build_type, node.GetChildren()), -+ member_types=list(map(self._build_type, node.GetChildren())), - is_optional=is_optional, - extended_attributes=extended_attributes, - debug_info=self._build_debug_info(node)) ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/make_copy.py -@@ -3,6 +3,13 @@ - # found in the LICENSE file. - - -+import sys -+ -+# TODO: Remove this once Python2 is obsoleted. -+if sys.version_info.major != 2: -+ long = int -+ basestring = str -+ - def make_copy(obj, memo=None): - """ - Creates a copy of the given object, which should be an IR or part of IR. ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/scripts/web_idl/namespace.py -@@ -107,11 +107,13 @@ class Namespace(UserDefinedType, WithExt - for operation_ir in ir.operations - ]) - self._operation_groups = tuple([ -- OperationGroup( -- operation_group_ir, -- filter(lambda x: x.identifier == operation_group_ir.identifier, -- self._operations), -- owner=self) for operation_group_ir in ir.operation_groups -+ OperationGroup(operation_group_ir, -+ list( -+ filter( -+ lambda x: x.identifier == operation_group_ir -+ .identifier, self._operations)), -+ owner=self) -+ for operation_group_ir in ir.operation_groups - ]) - - @property ---- a/src/3rdparty/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl -+++ b/src/3rdparty/chromium/third_party/blink/renderer/bindings/templates/dictionary_v8.cc.tmpl -@@ -59,9 +59,9 @@ void {{v8_class}}::ToImpl(v8::Isolate* i - DCHECK(executionContext); - {% endif %}{# has_origin_trial_members #} - {% endif %}{# members #} -- {% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %} -+ {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %} - {% filter origin_trial_enabled(origin_trial_test, "executionContext") %} -- {% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %} -+ {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {% for member in member_list %} - v8::Local {{member.v8_value}}; -@@ -147,9 +147,9 @@ bool toV8{{cpp_class}}(const {{cpp_class - DCHECK(executionContext); - {% endif %}{# has_origin_trial_members #} - {% endif %}{# members #} -- {% for origin_trial_test, origin_trial_member_list in members | groupby('origin_trial_feature_name') %} -+ {% for origin_trial_test, origin_trial_member_list in members | stringifykeygroupby('origin_trial_feature_name') %} - {% filter origin_trial_enabled(origin_trial_test, "executionContext") %} -- {% for feature_name, member_list in origin_trial_member_list | groupby('runtime_enabled_feature_name') %} -+ {% for feature_name, member_list in origin_trial_member_list | stringifykeygroupby('runtime_enabled_feature_name') %} - {% filter runtime_enabled(feature_name) %} - {% for member in member_list %} - v8::Local {{member.v8_value}}; ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/make_style_shorthands.py -@@ -71,7 +71,7 @@ class Expansion(object): - def enabled_longhands(self): - include = lambda longhand: not longhand[ - 'runtime_flag'] or self.is_enabled(longhand['runtime_flag']) -- return filter(include, self._longhands) -+ return list(filter(include, self._longhands)) - - @property - def index(self): -@@ -87,8 +87,9 @@ class Expansion(object): - - def create_expansions(longhands): - flags = collect_runtime_flags(longhands) -- expansions = map(lambda mask: Expansion(longhands, flags, mask), -- range(1 << len(flags))) -+ expansions = list( -+ map(lambda mask: Expansion(longhands, flags, mask), -+ range(1 << len(flags)))) - assert len(expansions) > 0 - # We generate 2^N expansions for N flags, so enforce some limit. - assert len(flags) <= 4, 'Too many runtime flags for a single shorthand' -@@ -114,14 +115,14 @@ class StylePropertyShorthandWriter(json5 - - self._longhand_dictionary = defaultdict(list) - for property_ in json5_properties.shorthands: -- property_['longhand_enum_keys'] = map(enum_key_for_css_property, -- property_['longhands']) -- property_['longhand_property_ids'] = map(id_for_css_property, -- property_['longhands']) -- -- longhands = map( -- lambda name: json5_properties.properties_by_name[name], -- property_['longhands']) -+ property_['longhand_enum_keys'] = list( -+ map(enum_key_for_css_property, property_['longhands'])) -+ property_['longhand_property_ids'] = list( -+ map(id_for_css_property, property_['longhands'])) -+ -+ longhands = list( -+ map(lambda name: json5_properties.properties_by_name[name], -+ property_['longhands'])) - property_['expansions'] = create_expansions(longhands) - for longhand_enum_key in property_['longhand_enum_keys']: - self._longhand_dictionary[longhand_enum_key].append(property_) ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/core/css/properties/make_css_property_instances.py -@@ -42,8 +42,8 @@ class CSSPropertyInstancesWriter(json5_g - aliases = self._css_properties.aliases - - # Lists of PropertyClassData. -- self._property_classes_by_id = map(self.get_class, properties) -- self._alias_classes_by_id = map(self.get_class, aliases) -+ self._property_classes_by_id = list(map(self.get_class, properties)) -+ self._alias_classes_by_id = list(map(self.get_class, aliases)) - - # Sort by enum value. - self._property_classes_by_id.sort(key=lambda t: t.enum_value) ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/gperf.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/gperf.py -@@ -95,7 +95,7 @@ def main(): - - open(args.output_file, 'wb').write( - generate_gperf(gperf_path, -- open(infile).read(), gperf_args)) -+ open(infile).read(), gperf_args).encode('utf-8')) - - - if __name__ == '__main__': ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_file.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_file.py -@@ -66,7 +66,7 @@ class InFile(object): - self._defaults = defaults - self._valid_values = copy.deepcopy( - valid_values if valid_values else {}) -- self._parse(map(str.strip, lines)) -+ self._parse(list(map(str.strip, lines))) - - @classmethod - def load_from_files(self, file_paths, defaults, valid_values, ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_generator.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/in_generator.py -@@ -32,10 +32,15 @@ import os - import os.path - import shlex - import shutil -+import sys - import optparse - - from in_file import InFile - -+# TODO: Remove this once Python2 is obsoleted. -+if sys.version_info.major != 2: -+ basestring = str -+ - - ######################################################### - # This is now deprecated - use json5_generator.py instead ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/make_runtime_features.py -@@ -138,7 +138,7 @@ class RuntimeFeatureWriter(BaseRuntimeFe - except Exception: - # If trouble unpickling, overwrite - pass -- with open(os.path.abspath(file_name), 'w') as pickle_file: -+ with open(os.path.abspath(file_name), 'wb') as pickle_file: - pickle.dump(features_map, pickle_file) - - def _template_inputs(self): ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_factory.cc.tmpl -@@ -26,7 +26,7 @@ using {{namespace}}FunctionMap = HashMap - - static {{namespace}}FunctionMap* g_{{namespace|lower}}_constructors = nullptr; - --{% for tag in tags|sort if not tag.noConstructor %} -+{% for tag in tags|sort(attribute='name') if not tag.noConstructor %} - static {{namespace}}Element* {{namespace}}{{tag.name.to_upper_camel_case()}}Constructor( - Document& document, const CreateElementFlags flags) { - {% if tag.runtimeEnabled %} -@@ -52,7 +52,7 @@ static void Create{{namespace}}FunctionM - // Empty array initializer lists are illegal [dcl.init.aggr] and will not - // compile in MSVC. If tags list is empty, add check to skip this. - static const Create{{namespace}}FunctionMapData data[] = { -- {% for tag in tags|sort if not tag.noConstructor %} -+ {% for tag in tags|sort(attribute='name') if not tag.noConstructor %} - { {{cpp_namespace}}::{{tag|symbol}}Tag, {{namespace}}{{tag.name.to_upper_camel_case()}}Constructor }, - {% endfor %} - }; ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.cc.tmpl -@@ -22,7 +22,7 @@ HTMLTypeMap CreateHTMLTypeMap() { - const char* name; - HTMLElementType type; - } kTags[] = { -- {% for tag in tags|sort %} -+ {% for tag in tags|sort(attribute='name') %} - { "{{tag.name}}", HTMLElementType::k{{tag.js_interface}} }, - {% endfor %} - }; -@@ -42,7 +42,7 @@ HTMLElementType htmlElementTypeForTag(co - if (it == html_type_map.end()) - return HTMLElementType::kHTMLUnknownElement; - -- {% for tag in tags|sort %} -+ {% for tag in tags|sort(attribute='name') %} - {% if tag.runtimeEnabled %} - if (tagName == "{{tag.name}}") { - if (!RuntimeEnabledFeatures::{{tag.runtimeEnabled}}Enabled(document->GetExecutionContext())) { ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/element_type_helpers.h.tmpl -@@ -15,7 +15,7 @@ namespace blink { - class Document; - - // Type checking. --{% for tag in tags|sort if not tag.multipleTagNames and not tag.noTypeHelpers %} -+{% for tag in tags|sort(attribute='name') if not tag.multipleTagNames and not tag.noTypeHelpers %} - class {{tag.interface}}; - template <> - inline bool IsElementOfType(const Node& node) { ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/macros.tmpl -@@ -25,7 +25,7 @@ - - - {% macro trie_leaf(index, object, return_macro, lowercase_data) %} --{% set name, value = object.items()[0] %} -+{% set name, value = (object.items()|list)[0] %} - {% if name|length %} - if ( - {%- for c in name -%} -@@ -45,7 +45,7 @@ return {{ return_macro(value) }}; - - - {% macro trie_switch(trie, index, return_macro, lowercase_data) %} --{% if trie|length == 1 and trie.values()[0] is string %} -+{% if trie|length == 1 and (trie.values()|list)[0] is string %} - {{ trie_leaf(index, trie, return_macro, lowercase_data) -}} - {% else %} - {% if lowercase_data %} ---- a/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl -+++ b/src/3rdparty/chromium/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl -@@ -24,12 +24,12 @@ namespace {{cpp_namespace}} { - {{symbol_export}}extern const WTF::AtomicString& {{namespace_prefix}}NamespaceURI; - - // Tags --{% for tag in tags|sort %} -+{% for tag in tags|sort(attribute='name') %} - {{symbol_export}}extern const blink::{{namespace}}QualifiedName& {{tag|symbol}}Tag; - {% endfor %} - - // Attributes --{% for attr in attrs|sort %} -+{% for attr in attrs|sort(attribute='name') %} - {{symbol_export}}extern const blink::QualifiedName& {{attr|symbol}}Attr; - {% endfor %} - ---- a/src/3rdparty/chromium/third_party/dawn/generator/generator_lib.py -+++ b/src/3rdparty/chromium/third_party/dawn/generator/generator_lib.py -@@ -201,6 +201,10 @@ def _compute_python_dependencies(root_di - - paths = set() - for path in module_paths: -+ # Builtin/namespaced modules may return None for the file path. -+ if not path: -+ continue -+ - path = os.path.abspath(path) - - if not path.startswith(root_dir): ---- a/src/3rdparty/chromium/third_party/devtools-frontend/src/BUILD.gn -+++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/BUILD.gn -@@ -2,6 +2,8 @@ - # Use of this source code is governed by a BSD-style license that can be - # found in the LICENSE file. - -+import("//build/config/python.gni") -+ - import("//third_party/blink/public/public_features.gni") - import("./all_devtools_files.gni") - import("./all_devtools_modules.gni") ---- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py -+++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_inspector_overlay.py -@@ -45,7 +45,8 @@ def rollup(input_path, output_path, file - ['--format', 'iife', '-n', 'InspectorOverlay'] + ['--input', target] + - ['--plugin', rollup_plugin], - stdout=subprocess.PIPE, -- stderr=subprocess.PIPE) -+ stderr=subprocess.PIPE, -+ text=True) - out, error = rollup_process.communicate() - if not out: - raise Exception("rollup failed: " + error) ---- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py -+++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/build_release_applications.py -@@ -10,7 +10,7 @@ Builds applications in release mode: - and the application loader into a single script. - """ - --from cStringIO import StringIO -+from io import StringIO - from os import path - from os.path import join - import copy -@@ -145,8 +145,7 @@ class ReleaseBuilder(object): - resource_content = read_file(path.join(self.application_dir, resource_name)) - if not (resource_name.endswith('.html') - or resource_name.endswith('md')): -- resource_content += resource_source_url(resource_name).encode( -- 'utf-8') -+ resource_content += resource_source_url(resource_name) - resource_content = resource_content.replace('\\', '\\\\') - resource_content = resource_content.replace('\n', '\\n') - resource_content = resource_content.replace('"', '\\"') -@@ -173,7 +172,9 @@ class ReleaseBuilder(object): - def _concatenate_application_script(self, output): - output.write('Root.allDescriptors.push(...%s);' % self._release_module_descriptors()) - if self.descriptors.extends: -- output.write('Root.applicationDescriptor.modules.push(...%s);' % json.dumps(self.descriptors.application.values())) -+ output.write( -+ 'Root.applicationDescriptor.modules.push(...%s);' % -+ json.dumps(list(self.descriptors.application.values()))) - else: - output.write('Root.applicationDescriptor = %s;' % self.descriptors.application_json()) - ---- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py -+++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/generate_devtools_grd.py -@@ -123,7 +123,7 @@ def main(argv): - - try: - os.makedirs(path.join(output_directory, 'Images')) -- except OSError, e: -+ except OSError as e: - if e.errno != errno.EEXIST: - raise e - -@@ -147,7 +147,7 @@ def main(argv): - shutil.copy(path.join(dirname, filename), path.join(output_directory, 'Images')) - add_file_to_grd(doc, path.join('Images', filename)) - -- with open(parsed_args.output_filename, 'w') as output_file: -+ with open(parsed_args.output_filename, 'wb') as output_file: - output_file.write(doc.toxml(encoding='UTF-8')) - - ---- a/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py -+++ b/src/3rdparty/chromium/third_party/devtools-frontend/src/scripts/build/modular_build.py -@@ -7,6 +7,8 @@ - Utilities for the modular DevTools build. - """ - -+from __future__ import print_function -+ - import collections - from os import path - import os -@@ -40,7 +42,7 @@ def load_and_parse_json(filename): - try: - return json.loads(read_file(filename)) - except: -- print 'ERROR: Failed to parse %s' % filename -+ print('ERROR: Failed to parse %s' % filename) - raise - - class Descriptors: -@@ -57,7 +59,7 @@ class Descriptors: - - def application_json(self): - result = dict() -- result['modules'] = self.application.values() -+ result['modules'] = list(self.application.values()) - return json.dumps(result) - - def all_compiled_files(self): ---- a/src/3rdparty/chromium/third_party/jinja2/tests.py -+++ b/src/3rdparty/chromium/third_party/jinja2/tests.py -@@ -10,7 +10,7 @@ - """ - import operator - import re --from collections import Mapping -+from collections.abc import Mapping - from jinja2.runtime import Undefined - from jinja2._compat import text_type, string_types, integer_types - import decimal ---- a/src/3rdparty/chromium/tools/metrics/ukm/gen_builders.py -+++ b/src/3rdparty/chromium/tools/metrics/ukm/gen_builders.py -@@ -48,9 +48,10 @@ def ReadFilteredData(path): - data = ukm_model.UKM_XML_TYPE.Parse(ukm_file.read()) - event_tag = ukm_model._EVENT_TYPE.tag - metric_tag = ukm_model._METRIC_TYPE.tag -- data[event_tag] = filter(ukm_model.IsNotObsolete, data[event_tag]) -+ data[event_tag] = list(filter(ukm_model.IsNotObsolete, data[event_tag])) - for event in data[event_tag]: -- event[metric_tag] = filter(ukm_model.IsNotObsolete, event[metric_tag]) -+ event[metric_tag] = list( -+ filter(ukm_model.IsNotObsolete, event[metric_tag])) - return data - - ---- a/src/3rdparty/chromium/ui/ozone/generate_constructor_list.py -+++ b/src/3rdparty/chromium/ui/ozone/generate_constructor_list.py -@@ -45,12 +45,15 @@ Example Output: ./ui/ozone/generate_cons - } // namespace ui - """ - -+try: -+ from StringIO import StringIO # for Python 2 -+except ImportError: -+ from io import StringIO # for Python 3 - import optparse - import os - import collections - import re - import sys --import string - - - def GetTypedefName(typename): -@@ -68,7 +71,7 @@ def GetConstructorName(typename, platfor - This is just "Create" + typename + platform. - """ - -- return 'Create' + typename + string.capitalize(platform) -+ return 'Create' + typename + platform.capitalize() - - - def GenerateConstructorList(out, namespace, export, typenames, platforms, -@@ -163,12 +166,14 @@ def main(argv): - sys.exit(1) - - # Write to standard output or file specified by --output_cc. -- out_cc = sys.stdout -+ out_cc = getattr(sys.stdout, 'buffer', sys.stdout) - if options.output_cc: - out_cc = open(options.output_cc, 'wb') - -- GenerateConstructorList(out_cc, options.namespace, options.export, -+ out_cc_str = StringIO() -+ GenerateConstructorList(out_cc_str, options.namespace, options.export, - typenames, platforms, includes, usings) -+ out_cc.write(out_cc_str.getvalue().encode('utf-8')) - - if options.output_cc: - out_cc.close() ---- a/src/3rdparty/chromium/ui/ozone/generate_ozone_platform_list.py -+++ b/src/3rdparty/chromium/ui/ozone/generate_ozone_platform_list.py -@@ -49,12 +49,15 @@ Example Output: ./generate_ozone_platfor - - """ - -+try: -+ from StringIO import StringIO # for Python 2 -+except ImportError: -+ from io import StringIO # for Python 3 - import optparse - import os - import collections - import re - import sys --import string - - - def GetConstantName(name): -@@ -63,7 +66,7 @@ def GetConstantName(name): - We just capitalize the platform name and prepend "CreateOzonePlatform". - """ - -- return 'kPlatform' + string.capitalize(name) -+ return 'kPlatform' + name.capitalize() - - - def GeneratePlatformListText(out, platforms): -@@ -149,9 +152,9 @@ def main(argv): - platforms.insert(0, options.default) - - # Write to standard output or file specified by --output_{cc,h}. -- out_cc = sys.stdout -- out_h = sys.stdout -- out_txt = sys.stdout -+ out_cc = getattr(sys.stdout, 'buffer', sys.stdout) -+ out_h = getattr(sys.stdout, 'buffer', sys.stdout) -+ out_txt = getattr(sys.stdout, 'buffer', sys.stdout) - if options.output_cc: - out_cc = open(options.output_cc, 'wb') - if options.output_h: -@@ -159,9 +162,16 @@ def main(argv): - if options.output_txt: - out_txt = open(options.output_txt, 'wb') - -- GeneratePlatformListText(out_txt, platforms) -- GeneratePlatformListHeader(out_h, platforms) -- GeneratePlatformListSource(out_cc, platforms) -+ out_txt_str = StringIO() -+ out_h_str = StringIO() -+ out_cc_str = StringIO() -+ -+ GeneratePlatformListText(out_txt_str, platforms) -+ out_txt.write(out_txt_str.getvalue().encode('utf-8')) -+ GeneratePlatformListHeader(out_h_str, platforms) -+ out_h.write(out_h_str.getvalue().encode('utf-8')) -+ GeneratePlatformListSource(out_cc_str, platforms) -+ out_cc.write(out_cc_str.getvalue().encode('utf-8')) - - if options.output_cc: - out_cc.close() diff --git a/disable-catapult.patch b/disable-catapult.patch index fe5ad07..3893755 100644 --- a/disable-catapult.patch +++ b/disable-catapult.patch @@ -137,7 +137,7 @@ Last-Update: 2022-11-26 } --- a/src/3rdparty/chromium/content/browser/BUILD.gn +++ b/src/3rdparty/chromium/content/browser/BUILD.gn -@@ -2169,7 +2169,6 @@ jumbo_static_library("browser") { +@@ -2170,7 +2170,6 @@ jumbo_static_library("browser") { if (!is_android) { deps += [ "//components/vector_icons", diff --git a/fix-build-tools-to-run-with-python3.11.patch b/fix-build-tools-to-run-with-python3.11.patch deleted file mode 100644 index be279e9..0000000 --- a/fix-build-tools-to-run-with-python3.11.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 82c9b1d3f4383cd8059690bd34c9d7fa86398b78 Mon Sep 17 00:00:00 2001 -From: Kadir Yilmaz -Date: Sat, 21 Oct 2023 22:45:03 +0200 -Subject: [PATCH] Fix build tools to run with python3.11 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Upstream: N/A buildroot uses python3.11 which apparently is not yet -supported by upstream - -- re error: global flags not at the start - - https://docs.python.org/3/library/re.html#re-syntax - (?aiLmsux) - .... - Changed in version 3.11: This construction can only be used at the - start of the expression - -- ValueError: invalid mode: 'rU' - - open(), io.open(), codecs.open() and fileinput.FileInput no longer - accept 'U' (“universal newline”) in the file mode. In Python 3, - “universal newline” mode is used by default whenever a file is - opened in text mode, and the 'U' flag has been deprecated since - Python 3.3. The newline parameter to these functions controls how - universal newlines work. (Contributed by Victor Stinner in bpo-37330.) - -Signed-off-by: Kadir Yilmaz ---- - src/3rdparty/chromium/tools/grit/grit/util.py | 2 +- - src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/3rdparty/chromium/tools/grit/grit/util.py b/src/3rdparty/chromium/tools/grit/grit/util.py -index 528d766ad6b..6e8cdb0ebfa 100644 ---- a/src/3rdparty/chromium/tools/grit/grit/util.py -+++ b/src/3rdparty/chromium/tools/grit/grit/util.py -@@ -211,7 +211,7 @@ def ReadFile(filename, encoding): - mode = 'rb' - encoding = None - else: -- mode = 'rU' -+ mode = 'r' - - with io.open(abs(filename), mode, encoding=encoding) as f: - return f.read() -diff --git a/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py b/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py -index ec24dd57360..57decab3ccc 100644 ---- a/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py -+++ b/src/3rdparty/chromium/tools/metrics/ukm/ukm_model.py -@@ -42,7 +42,7 @@ _INDEX_TYPE = models.ObjectNodeType( - _STATISTICS_TYPE = models.ObjectNodeType( - 'statistics', - attributes=[ -- ('export', str, r'^(?i)(|true|false)$'), -+ ('export', str, r'(?i)^(|true|false)$'), - ], - children=[ - models.ChildType(_QUANTILES_TYPE.tag, _QUANTILES_TYPE, multiple=False), -@@ -94,7 +94,7 @@ _EVENT_TYPE = models.ObjectNodeType( - 'event', - attributes=[ - ('name', str, r'^[A-Za-z0-9.]+$'), -- ('singular', str, r'^(?i)(|true|false)$'), -+ ('singular', str, r'(?i)^(|true|false)$'), - ], - alphabetization=[ - (_OBSOLETE_TYPE.tag, _KEEP_ORDER), --- -2.25.1 - diff --git a/pulseaudio-12.2-headers.tar.gz b/pulseaudio-12.2-headers.tar.gz index 251e70e17ed15010f523ab92b0a997fecd389900..4f9a12be3997febe2923143cf1a465189e240305 100644 GIT binary patch literal 130 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 -Last-Update: 2022-11-25 -Forwarded: not-needed - ---- a/configure.pri -+++ b/configure.pri -@@ -6,23 +6,6 @@ QTWEBENGINE_SOURCE_TREE = $$PWD - - equals(QMAKE_HOST.os, Windows): EXE_SUFFIX = .exe - --defineTest(isPythonVersionSupported) { -- python = $$system_quote($$system_path($$1)) -- python_version = $$system('$$python -c "import sys; print(sys.version_info[0:3])"') -- python_version ~= s/[()]//g -- python_version = $$split(python_version, ',') -- python_major_version = $$first(python_version) -- greaterThan(python_major_version, 2) { -- qtLog("Python version 3 is not supported by Chromium.") -- return(false) -- } -- python_minor_version = $$member(python_version, 1) -- python_patch_version = $$member(python_version, 2) -- greaterThan(python_major_version, 1): greaterThan(python_minor_version, 6): greaterThan(python_patch_version, 4): return(true) -- qtLog("Unsupported python version: $${python_major_version}.$${python_minor_version}.$${python_patch_version}.") -- return(false) --} -- - defineTest(qtConfTest_detectJumboBuild) { - mergeLimit = $$eval(config.input.merge_limit) - mergeLimit = $$find(mergeLimit, "\\d") -@@ -52,22 +35,18 @@ defineTest(qtConfReport_jumboBuild) { - qtConfReportPadded($${1}, $$mergeLimit) - } - --defineTest(qtConfTest_detectPython2) { -- python = $$qtConfFindInPath("python2$$EXE_SUFFIX") -+defineTest(qtConfTest_detectPython3) { -+ python = $$qtConfFindInPath("python3$$EXE_SUFFIX") - isEmpty(python) { -- qtLog("'python2$$EXE_SUFFIX' not found in PATH. Checking for 'python$$EXE_SUFFIX'.") -+ qtLog("'python3$$EXE_SUFFIX' not found in PATH. Checking for 'python$$EXE_SUFFIX'.") - python = $$qtConfFindInPath("python$$EXE_SUFFIX") - } - isEmpty(python) { - qtLog("'python$$EXE_SUFFIX' not found in PATH. Giving up.") - return(false) - } -- !isPythonVersionSupported($$python) { -- qtLog("A suitable Python 2 executable could not be located.") -- return(false) -- } - -- # Make tests.python2.location available in configure.json. -+ # Make tests.python3.location available in configure.json. - $${1}.location = $$clean_path($$python) - export($${1}.location) - $${1}.cache += location ---- a/mkspecs/features/functions.prf -+++ b/mkspecs/features/functions.prf -@@ -44,11 +44,11 @@ defineReplace(which) { - - # Returns the unquoted path to the python executable. - defineReplace(pythonPath) { -- isEmpty(QMAKE_PYTHON2) { -+ isEmpty(QMAKE_PYTHON3) { - # Fallback for building QtWebEngine with Qt < 5.8 -- QMAKE_PYTHON2 = python -+ QMAKE_PYTHON3 = python - } -- return($$QMAKE_PYTHON2) -+ return($$QMAKE_PYTHON3) - } - - # Returns the python executable for use with shell / make targets. ---- a/src/buildtools/config/support.pri -+++ b/src/buildtools/config/support.pri -@@ -21,7 +21,7 @@ defineReplace(qtwebengine_checkWebEngine - !qtwebengine_checkForGperf(QtWebEngine):return(false) - !qtwebengine_checkForBison(QtWebEngine):return(false) - !qtwebengine_checkForFlex(QtWebEngine):return(false) -- !qtwebengine_checkForPython2(QtWebEngine):return(false) -+ !qtwebengine_checkForPython3(QtWebEngine):return(false) - !qtwebengine_checkForNodejs(QtWebEngine):return(false) - !qtwebengine_checkForSanitizer(QtWebEngine):return(false) - linux:!qtwebengine_checkForPkgCfg(QtWebEngine):return(false) -@@ -51,7 +51,7 @@ defineReplace(qtwebengine_checkPdfError) - !qtwebengine_checkForGperf(QtPdf):return(false) - !qtwebengine_checkForBison(QtPdf):return(false) - !qtwebengine_checkForFlex(QtPdf):return(false) -- !qtwebengine_checkForPython2(QtPdf):return(false) -+ !qtwebengine_checkForPython3(QtPdf):return(false) - !qtwebengine_checkForSanitizer(QtPdf):return(false) - linux:!qtwebengine_checkForPkgCfg(QtPdf):return(false) - linux:!qtwebengine_checkForHostPkgCfg(QtPdf):return(false) -@@ -143,10 +143,10 @@ defineTest(qtwebengine_checkForFlex) { - return(true) - } - --defineTest(qtwebengine_checkForPython2) { -+defineTest(qtwebengine_checkForPython3) { - module = $$1 -- !qtConfig(webengine-python2) { -- qtwebengine_skipBuild("Python version 2 (2.7.5 or later) is required to build $${module}.") -+ !qtConfig(webengine-python3) { -+ qtwebengine_skipBuild("Python version 3 is required to build $${module}.") - return(false) - } - return(true) ---- a/src/buildtools/configure.json -+++ b/src/buildtools/configure.json -@@ -295,9 +295,9 @@ - "label": "system ninja", - "type": "detectNinja" - }, -- "webengine-python2": { -- "label": "python2", -- "type": "detectPython2", -+ "webengine-python3": { -+ "label": "python3", -+ "type": "detectPython3", - "log": "location" - }, - "webengine-winversion": { -@@ -374,7 +374,7 @@ - && features.webengine-gperf - && features.webengine-bison - && features.webengine-flex -- && features.webengine-python2 -+ && features.webengine-python3 - && features.webengine-nodejs - && (!config.sanitizer || features.webengine-sanitizer) - && (!config.linux || features.pkg-config) -@@ -400,7 +400,7 @@ - && features.webengine-gperf - && features.webengine-bison - && features.webengine-flex -- && features.webengine-python2 -+ && features.webengine-python3 - && (!config.sanitizer || features.webengine-sanitizer) - && (!config.linux || features.pkg-config) - && (!config.linux || features.webengine-host-pkg-config) -@@ -423,12 +423,12 @@ - "autoDetect": "features.private_tests", - "output": [ "privateFeature" ] - }, -- "webengine-python2": { -- "label": "python2", -- "condition": "tests.webengine-python2", -+ "webengine-python3": { -+ "label": "python3", -+ "condition": "tests.webengine-python3", - "output": [ - "privateFeature", -- { "type": "varAssign", "name": "QMAKE_PYTHON2", "value": "tests.webengine-python2.location" } -+ { "type": "varAssign", "name": "QMAKE_PYTHON3", "value": "tests.webengine-python3.location" } - ] - }, - "webengine-gperf": { diff --git a/riscv-qt5-webengine-ffmpeg7.patch b/qt5-qtwebengine-ffmpeg7.patch similarity index 81% rename from riscv-qt5-webengine-ffmpeg7.patch rename to qt5-qtwebengine-ffmpeg7.patch index 9d4de35..182239f 100644 --- a/riscv-qt5-webengine-ffmpeg7.patch +++ b/qt5-qtwebengine-ffmpeg7.patch @@ -1,26 +1,35 @@ -From 9b649e1c49617fba134be6ef50aac03bcd7a506a Mon Sep 17 00:00:00 2001 +From 6e554a30893150793c2638e3689cf208ffc8e375 Mon Sep 17 00:00:00 2001 From: Dale Curtis -Date: Thu, 6 Mar 2025 13:03:29 +0800 -Subject: [PATCH] Roll src/3rdparty/chromium/third_party/ffmpeg/ - 574c39cce..32b2d1d526 (1125 commits) +Date: Sat, 2 Apr 2022 05:13:53 +0000 +Subject: [PATCH] Roll src/third_party/ffmpeg/ 574c39cce..32b2d1d526 (1125 + commits) https://chromium.googlesource.com/chromium/third_party/ffmpeg.git/+log/574c39cce323..32b2d1d526 Created with: - roll-dep src/3rdparty/chromium/third_party/ffmpeg + roll-dep src/third_party/ffmpeg Fixed: 1293918 Cq-Include-Trybots: luci.chromium.try:mac_chromium_asan_rel_ng,linux_chromium_asan_rel_ng,linux_chromium_chromeos_asan_rel_ng Change-Id: I41945d0f963e3d1f65940067bac22f63b68e37d2 -Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/3rdparty/chromium/+/3565647 +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3565647 Auto-Submit: Dale Curtis Reviewed-by: Dan Sanders Commit-Queue: Dale Curtis Cr-Commit-Position: refs/heads/main@{#988253} -Signed-off-by: Xin Liu +--- + .../clear_key_cdm/ffmpeg_cdm_audio_decoder.cc | 29 ++++++++++--------- + media/ffmpeg/ffmpeg_common.cc | 11 +++---- + media/filters/audio_file_reader.cc | 9 +++--- + media/filters/audio_file_reader_unittest.cc | 6 ++-- + .../filters/audio_video_metadata_extractor.cc | 11 +++++-- + .../filters/ffmpeg_aac_bitstream_converter.cc | 7 +++-- + ...ffmpeg_aac_bitstream_converter_unittest.cc | 2 +- + media/filters/ffmpeg_audio_decoder.cc | 13 +++++---- + 8 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc b/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc -index a043005d5..69ef5ccaa 100644 +index a043005..9ae2ca9 100644 --- a/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc +++ b/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc @@ -73,7 +73,7 @@ void CdmAudioDecoderConfigToAVCodecContext( @@ -69,9 +78,9 @@ index a043005d5..69ef5ccaa 100644 + frame->format != av_sample_format_) { DLOG(ERROR) << "Unsupported midstream configuration change!" << " Sample Rate: " << frame->sample_rate << " vs " - << samples_per_second_ << ", Channels: " << frame->channels -- << " vs " << channels_ << ", Sample Format: " << frame->format +- << samples_per_second_ << ", Channels: " << frame->channels + << samples_per_second_ << ", Channels: " << frame->ch_layout.nb_channels + << " vs " << channels_ << ", Sample Format: " << frame->format << " vs " << av_sample_format_; return cdm::kDecodeError; } @@ -87,12 +96,12 @@ index a043005d5..69ef5ccaa 100644 std::vector>* audio_frames, AVFrame* frame) { - *total_size += av_samples_get_buffer_size(nullptr, codec_context_->channels, -+ *total_size += av_samples_get_buffer_size(nullptr, codec_context_->ch_layout.nb_channels, ++ *total_size += av_samples_get_buffer_size(nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples, codec_context_->sample_fmt, 1); audio_frames->emplace_back(av_frame_clone(frame)); diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc -index c17dd9f83..c47791bda 100644 +index c17dd9f..0448cb5 100644 --- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc +++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc @@ -341,10 +341,11 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context, @@ -100,7 +109,7 @@ index c17dd9f83..c47791bda 100644 ChannelLayout channel_layout = - codec_context->channels > 8 -+ codec_context->ch_layout.nb_channels > 88 ++ codec_context->ch_layout.nb_channels > 8 ? CHANNEL_LAYOUT_DISCRETE - : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout, - codec_context->channels); @@ -119,18 +128,7 @@ index c17dd9f83..c47791bda 100644 #if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO) // These are bitstream formats unknown to ffmpeg, so they don't have -@@ -413,7 +414,9 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context, - #if BUILDFLAG(USE_PROPRIETARY_CODECS) - // TODO(dalecurtis): Just use the profile from the codec context if ffmpeg - // ever starts supporting xHE-AAC. -- if (codec == kCodecAAC && codec_context->profile == FF_PROFILE_UNKNOWN) { -+ constexpr uint8_t kXHEAAc = 41; -+ if (codec == kCodecAAC && codec_context->profile == FF_PROFILE_UNKNOWN || -+ codec_context->profile == kXHEAAc) { - // Errors aren't fatal here, so just drop any MediaLog messages. - NullMediaLog media_log; - mp4::AAC aac_parser; -@@ -462,7 +465,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, +@@ -462,7 +463,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config, // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses // said information to decode. @@ -139,57 +137,8 @@ index c17dd9f83..c47791bda 100644 codec_context->sample_rate = config.samples_per_second(); if (config.extra_data().empty()) { -diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc -index ebd1babb4..04d5eccf6 100644 ---- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc -+++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc -@@ -86,16 +86,16 @@ FFMPEG_TEST_CASE(Cr47761, "crbug47761.ogg", PIPELINE_OK, PIPELINE_OK); - FFMPEG_TEST_CASE(Cr50045, "crbug50045.mp4", PIPELINE_OK, PIPELINE_OK); - FFMPEG_TEST_CASE(Cr62127, "crbug62127.webm", PIPELINE_OK, PIPELINE_OK); - FFMPEG_TEST_CASE(Cr93620, "security/93620.ogg", PIPELINE_OK, PIPELINE_OK); --FFMPEG_TEST_CASE(Cr100492, -- "security/100492.webm", -- DECODER_ERROR_NOT_SUPPORTED, -- DECODER_ERROR_NOT_SUPPORTED); -+FFMPEG_TEST_CASE(Cr100492, "security/100492.webm", PIPELINE_OK, PIPELINE_OK); - FFMPEG_TEST_CASE(Cr100543, "security/100543.webm", PIPELINE_OK, PIPELINE_OK); - FFMPEG_TEST_CASE(Cr101458, - "security/101458.webm", - PIPELINE_ERROR_DECODE, - PIPELINE_ERROR_DECODE); --FFMPEG_TEST_CASE(Cr108416, "security/108416.webm", PIPELINE_OK, PIPELINE_OK); -+FFMPEG_TEST_CASE(Cr108416, -+ "security/108416.webm", -+ PIPELINE_ERROR_DECODE, -+ PIPELINE_ERROR_DECODE); - FFMPEG_TEST_CASE(Cr110849, - "security/110849.mkv", - DEMUXER_ERROR_COULD_NOT_OPEN, -@@ -150,7 +150,10 @@ FFMPEG_TEST_CASE(Cr234630b, - "security/234630b.mov", - DEMUXER_ERROR_NO_SUPPORTED_STREAMS, - DEMUXER_ERROR_NO_SUPPORTED_STREAMS); --FFMPEG_TEST_CASE(Cr242786, "security/242786.webm", PIPELINE_OK, PIPELINE_OK); -+FFMPEG_TEST_CASE(Cr242786, -+ "security/242786.webm", -+ PIPELINE_OK, -+ PIPELINE_ERROR_DECODE); - // Test for out-of-bounds access with slightly corrupt file (detection logic - // thinks it's a MONO file, but actually contains STEREO audio). - FFMPEG_TEST_CASE(Cr275590, -@@ -371,8 +374,8 @@ FFMPEG_TEST_CASE(WEBM_2, - DEMUXER_ERROR_NO_SUPPORTED_STREAMS); - FFMPEG_TEST_CASE(WEBM_4, - "security/out.webm.68798.1929", -- DECODER_ERROR_NOT_SUPPORTED, -- DECODER_ERROR_NOT_SUPPORTED); -+ PIPELINE_OK, -+ PIPELINE_OK); - FFMPEG_TEST_CASE(WEBM_5, "frame_size_change.webm", PIPELINE_OK, PIPELINE_OK); - - // General MKV test cases. diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader.cc b/src/3rdparty/chromium/media/filters/audio_file_reader.cc -index cb81d920d..6261ee988 100644 +index bd73908..745c4c7 100644 --- a/src/3rdparty/chromium/media/filters/audio_file_reader.cc +++ b/src/3rdparty/chromium/media/filters/audio_file_reader.cc @@ -112,14 +112,15 @@ bool AudioFileReader::OpenDecoder() { @@ -220,21 +169,8 @@ index cb81d920d..6261ee988 100644 if (frame->sample_rate != sample_rate_ || channels != channels_ || frame->format != av_sample_format_) { DLOG(ERROR) << "Unsupported midstream configuration change!" -@@ -241,10 +242,10 @@ bool AudioFileReader::OnNewFrame( - // silence from being output. In the case where we are also discarding some - // portion of the packet (as indicated by a negative pts), we further want to - // adjust the duration downward by however much exists before zero. -- if (audio_codec_ == kCodecAAC && frame->pkt_duration) { -+ if (audio_codec_ == kCodecAAC && frame->duration) { - const base::TimeDelta pkt_duration = ConvertFromTimeBase( - glue_->format_context()->streams[stream_index_]->time_base, -- frame->pkt_duration + std::min(static_cast(0), frame->pts)); -+ frame->duration + std::min(static_cast(0), frame->pts)); - const base::TimeDelta frame_duration = base::TimeDelta::FromSecondsD( - frames_read / static_cast(sample_rate_)); - diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc -index 6f231c857..ca5e5fb92 100644 +index 6f231c8..ca5e5fb 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc @@ -195,14 +195,15 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) { @@ -265,7 +201,7 @@ index 6f231c857..ca5e5fb92 100644 } diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc -index ac8bb1357..3e4e3f6ca 100644 +index ac8bb13..3e4e3f6 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc @@ -29,7 +29,7 @@ class FFmpegAACBitstreamConverterTest : public testing::Test { @@ -278,7 +214,7 @@ index ac8bb1357..3e4e3f6ca 100644 test_parameters_.extradata_size = sizeof(extradata_header_); } diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc -index 0d825ed79..acf91d81e 100644 +index 72fac61..ab49fd5 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc @@ -27,7 +27,7 @@ namespace media { @@ -295,7 +231,7 @@ index 0d825ed79..acf91d81e 100644 // ffmpeg does not have a labeled discrete configuration internally. ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout( - codec_context_->channel_layout, codec_context_->channels); -+ codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels); ++ codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels); if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED && config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) { channel_layout = CHANNEL_LAYOUT_DISCRETE; @@ -332,8 +268,105 @@ index 0d825ed79..acf91d81e 100644 if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) { DLOG(ERROR) << "Unsupported channel layout."; +commit 62274859104bd828373ae406aa9309e610449ac5 +Author: Ted Meyer +Date: Fri Mar 22 19:56:55 2024 +0000 + + Replace deprecated use of AVCodecContext::reordered_opaque + + We can use the AV_CODEC_FLAG_COPY_OPAQUE flag on the codec context + now to trigger timestamp propagation. + + Bug: 330573128 + Change-Id: I6bc57241a35ab5283742aad8d42acb4dc5e85858 + Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5384308 + Commit-Queue: Ted (Chromium) Meyer + Reviewed-by: Dan Sanders + Cr-Commit-Position: refs/heads/main@{#1277051} + +diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc +index 0448cb5..89e9cf9 100644 +--- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc ++++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc +@@ -414,7 +414,9 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context, + #if BUILDFLAG(USE_PROPRIETARY_CODECS) + // TODO(dalecurtis): Just use the profile from the codec context if ffmpeg + // ever starts supporting xHE-AAC. +- if (codec == kCodecAAC && codec_context->profile == FF_PROFILE_UNKNOWN) { ++ constexpr uint8_t kXHEAAc = 41; ++ if (codec == kCodecAAC && codec_context->profile == FF_PROFILE_UNKNOWN || ++ codec_context->profile == kXHEAAc) { + // Errors aren't fatal here, so just drop any MediaLog messages. + NullMediaLog media_log; + mp4::AAC aac_parser; +diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc +index ebd1bab..04d5ecc 100644 +--- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc ++++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc +@@ -86,16 +86,16 @@ FFMPEG_TEST_CASE(Cr47761, "crbug47761.ogg", PIPELINE_OK, PIPELINE_OK); + FFMPEG_TEST_CASE(Cr50045, "crbug50045.mp4", PIPELINE_OK, PIPELINE_OK); + FFMPEG_TEST_CASE(Cr62127, "crbug62127.webm", PIPELINE_OK, PIPELINE_OK); + FFMPEG_TEST_CASE(Cr93620, "security/93620.ogg", PIPELINE_OK, PIPELINE_OK); +-FFMPEG_TEST_CASE(Cr100492, +- "security/100492.webm", +- DECODER_ERROR_NOT_SUPPORTED, +- DECODER_ERROR_NOT_SUPPORTED); ++FFMPEG_TEST_CASE(Cr100492, "security/100492.webm", PIPELINE_OK, PIPELINE_OK); + FFMPEG_TEST_CASE(Cr100543, "security/100543.webm", PIPELINE_OK, PIPELINE_OK); + FFMPEG_TEST_CASE(Cr101458, + "security/101458.webm", + PIPELINE_ERROR_DECODE, + PIPELINE_ERROR_DECODE); +-FFMPEG_TEST_CASE(Cr108416, "security/108416.webm", PIPELINE_OK, PIPELINE_OK); ++FFMPEG_TEST_CASE(Cr108416, ++ "security/108416.webm", ++ PIPELINE_ERROR_DECODE, ++ PIPELINE_ERROR_DECODE); + FFMPEG_TEST_CASE(Cr110849, + "security/110849.mkv", + DEMUXER_ERROR_COULD_NOT_OPEN, +@@ -150,7 +150,10 @@ FFMPEG_TEST_CASE(Cr234630b, + "security/234630b.mov", + DEMUXER_ERROR_NO_SUPPORTED_STREAMS, + DEMUXER_ERROR_NO_SUPPORTED_STREAMS); +-FFMPEG_TEST_CASE(Cr242786, "security/242786.webm", PIPELINE_OK, PIPELINE_OK); ++FFMPEG_TEST_CASE(Cr242786, ++ "security/242786.webm", ++ PIPELINE_OK, ++ PIPELINE_ERROR_DECODE); + // Test for out-of-bounds access with slightly corrupt file (detection logic + // thinks it's a MONO file, but actually contains STEREO audio). + FFMPEG_TEST_CASE(Cr275590, +@@ -371,8 +374,8 @@ FFMPEG_TEST_CASE(WEBM_2, + DEMUXER_ERROR_NO_SUPPORTED_STREAMS); + FFMPEG_TEST_CASE(WEBM_4, + "security/out.webm.68798.1929", +- DECODER_ERROR_NOT_SUPPORTED, +- DECODER_ERROR_NOT_SUPPORTED); ++ PIPELINE_OK, ++ PIPELINE_OK); + FFMPEG_TEST_CASE(WEBM_5, "frame_size_change.webm", PIPELINE_OK, PIPELINE_OK); + + // General MKV test cases. +diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader.cc b/src/3rdparty/chromium/media/filters/audio_file_reader.cc +index 745c4c7..2b3abba 100644 +--- a/src/3rdparty/chromium/media/filters/audio_file_reader.cc ++++ b/src/3rdparty/chromium/media/filters/audio_file_reader.cc +@@ -242,10 +242,10 @@ bool AudioFileReader::OnNewFrame( + // silence from being output. In the case where we are also discarding some + // portion of the packet (as indicated by a negative pts), we further want to + // adjust the duration downward by however much exists before zero. +- if (audio_codec_ == kCodecAAC && frame->pkt_duration) { ++ if (audio_codec_ == kCodecAAC && frame->duration) { + const base::TimeDelta pkt_duration = ConvertFromTimeBase( + glue_->format_context()->streams[stream_index_]->time_base, +- frame->pkt_duration + std::min(static_cast(0), frame->pts)); ++ frame->duration + std::min(static_cast(0), frame->pts)); + const base::TimeDelta frame_duration = base::TimeDelta::FromSecondsD( + frames_read / static_cast(sample_rate_)); + diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc -index ef12477ee..45c30a02e 100644 +index 7996606..a15aafc 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc @@ -86,7 +86,7 @@ bool FFmpegVideoDecoder::IsCodecSupported(VideoCodec codec) { @@ -341,7 +374,7 @@ index ef12477ee..45c30a02e 100644 FFmpegVideoDecoder::FFmpegVideoDecoder(MediaLog* media_log) - : media_log_(media_log), state_(kUninitialized), decode_nalus_(false) { -+ : media_log_(media_log), state_(kUninitialized), decode_nalus_(false), timestamp_map_(128) { ++ : media_log_(media_log), state_(kUninitialized), decode_nalus_(false), timestamp_map_(128) { DVLOG(1) << __func__; thread_checker_.DetachFromThread(); } @@ -381,8 +414,11 @@ index ef12477ee..45c30a02e 100644 video_frame->metadata()->power_efficient = false; output_cb_.Run(video_frame); return true; -@@ -387,6 +393,7 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config, +@@ -385,8 +391,10 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config, + codec_context_->thread_count = GetFFmpegVideoDecoderThreadCount(config); + codec_context_->thread_type = FF_THREAD_SLICE | (low_delay ? 0 : FF_THREAD_FRAME); ++ codec_context_->opaque = this; codec_context_->get_buffer2 = GetVideoBufferImpl; + codec_context_->flags |= AV_CODEC_FLAG_COPY_OPAQUE; @@ -390,7 +426,7 @@ index ef12477ee..45c30a02e 100644 if (decode_nalus_) codec_context_->flags2 |= AV_CODEC_FLAG2_CHUNKS; diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h -index f13ce417f..ee2444b0f 100644 +index f13ce41..ee2444b 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h +++ b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h @@ -8,6 +8,8 @@ @@ -423,5 +459,35 @@ index f13ce417f..ee2444b0f 100644 VideoDecoderConfig config_; VideoFramePool frame_pool_; --- -2.48.1 +diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc +index d12fade..8abfbbf 100644 +--- a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc ++++ b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc +@@ -114,7 +114,6 @@ int H264DecoderImpl::AVGetBuffer2(AVCodecContext* context, + int total_size = y_size + 2 * uv_size; + + av_frame->format = context->pix_fmt; +- av_frame->reordered_opaque = context->reordered_opaque; + + // Set |av_frame| members as required by FFmpeg. + av_frame->data[kYPlaneIndex] = frame_buffer->MutableDataY(); +@@ -273,8 +272,6 @@ int32_t H264DecoderImpl::Decode(const EncodedImage& input_image, + return WEBRTC_VIDEO_CODEC_ERROR; + } + packet.size = static_cast(input_image.size()); +- int64_t frame_timestamp_us = input_image.ntp_time_ms_ * 1000; // ms -> μs +- av_context_->reordered_opaque = frame_timestamp_us; + + int result = avcodec_send_packet(av_context_.get(), &packet); + if (result < 0) { +@@ -290,10 +287,6 @@ int32_t H264DecoderImpl::Decode(const EncodedImage& input_image, + return WEBRTC_VIDEO_CODEC_ERROR; + } + +- // We don't expect reordering. Decoded frame tamestamp should match +- // the input one. +- RTC_DCHECK_EQ(av_frame_->reordered_opaque, frame_timestamp_us); +- + absl::optional qp; + // TODO(sakal): Maybe it is possible to get QP directly from FFmpeg. + h264_bitstream_parser_.ParseBitstream(input_image.data(), input_image.size()); diff --git a/qt5-qtwebengine.spec b/qt5-qtwebengine.spec index d2ddaec..42a9314 100644 --- a/qt5-qtwebengine.spec +++ b/qt5-qtwebengine.spec @@ -2,13 +2,12 @@ %global _hardened_build 1 +# qtwebengine-chromium branch commit +%global commit_id 6d29e9cfcfffa7632cc3858ceaf8940677ba9c91 + # package-notes causes FTBFS (#2043178) %undefine _package_note_file -# define to build docs, may need to undef this for bootstrapping -# where qt5-qttools (qt5-doctools) builds are not yet available -%global docs 0 - # need libvpx >= 1.8.0 (need commit 297dfd869609d7c3c5cd5faa3ebc7b43a394434e) %global use_system_libvpx 1 # For screen sharing on Wayland, currently Fedora only thing - no epel @@ -42,8 +41,6 @@ # spellchecking dictionary directory %global _qtwebengine_dictionaries_dir %{_qt5_datadir}/qtwebengine_dictionaries -%global rpm_macros_dir %(d=%{_rpmconfigdir}/macros.d; [ -d $d ] || d=%{_sysconfdir}/rpm; echo $d) - # exclude plugins %global __provides_exclude ^lib.*plugin\\.so.*$ # and designer plugins @@ -51,7 +48,7 @@ Summary: Qt5 - QtWebEngine components Name: qt5-qtwebengine -Version: 5.15.16 +Version: 5.15.17 Release: 1 # See LICENSE.GPL LICENSE.LGPL LGPL_EXCEPTION.txt, for details @@ -60,8 +57,7 @@ Release: 1 License: (LGPLv2 with exceptions or GPLv3 with exceptions) and BSD and LGPLv2+ and ASL 2.0 and IJG and MIT and GPLv2+ and ISC and OpenSSL and (MPLv1.1 or GPLv2 or LGPLv2) URL: https://www.qt.io Source0: https://download.qt.io/official_releases/qt/%{version}/submodules/qtwebengine-everywhere-opensource-src-%{version}.tar.xz -# release script used above -Source1: qtwebengine-release.sh +Source1: https://github.com/qt/qtwebengine-chromium/archive/%{commit_id}.tar.gz # cleanup scripts used above Source2: clean_qtwebengine.sh Source3: clean_ffmpeg.sh @@ -72,12 +68,12 @@ Source10: macros.qt5-qtwebengine # pulseaudio headers Source20: pulseaudio-12.2-headers.tar.gz +# disable NEON vector instructions on ARM where the NEON code FTBFS due to +# GCC bug https://bugzilla.redhat.com/show_bug.cgi?id=1282495 +Patch0: qtwebengine-opensource-src-5.9.0-no-neon.patch # fix extractCFlag to also look in QMAKE_CFLAGS_RELEASE, needed to detect the # ARM flags with our %%qmake_qt5 macro, including for the next patch Patch2: qtwebengine-opensource-src-5.12.4-fix-extractcflag.patch -# disable NEON vector instructions on ARM where the NEON code FTBFS due to -# GCC bug https://bugzilla.redhat.com/show_bug.cgi?id=1282495 -Patch3: qtwebengine-opensource-src-5.9.0-no-neon.patch # workaround FTBFS against kernel-headers-5.2.0+ Patch4: qtwebengine-SIOCGSTAMP.patch # fix build when using qt < 5.14 @@ -89,15 +85,14 @@ Patch8: qtwebengine-everywhere-5.15.8-libpipewire-0.3.patch # Fix/workaround FTBFS on aarch64 with newer glibc Patch24: qtwebengine-everywhere-src-5.11.3-aarch64-new-stat.patch Patch34: qtwebengine-support-clang-compile.patch -#https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/518607 -Patch35: CVE-2023-6112.patch -## Upstream patches: -Patch36: qtwebengine-icu-74.patch -## From: https://git.videolan.org/?p=ffmpeg.git;a=commit;h=effadce6c756247ea8bae32dc13bb3e6f464f0eb -Patch37: Backport-ffmpeg-avcodec-x86-mathops-clip-constants-used-with-.patch # From: https://gitlab.archlinux.org/archlinux/packaging/packages/qt5-webengine Patch38: qt5-webengine-icu-75.patch Patch39: qtwebengine-5.15.13_p20240322-ninja1.12.patch + +# Working with ffmpeg +Patch60: qtwebengine-ffmpeg5.patch +# Adapt for ffmpeg7 (from openSUSE) +Patch61: qt5-qtwebengine-ffmpeg7.patch # handled by qt5-srpm-macros, which defines %%qt5_qtwebengine_arches #ExclusiveArch: %{qt5_qtwebengine_arches} @@ -105,28 +100,19 @@ Patch39: qtwebengine-5.15.13_p20240322-ninja1.12.patch # Also porting Python 2 to Python 3 ## From: https://salsa.debian.org/qt-kde-team/qt/qtwebengine/-/blob/082c7f7e9ee899ff5ab68a166819e2f0aaa87617/debian/patches/disable-catapult.patch Patch50: disable-catapult.patch -## From: https://salsa.debian.org/qt-kde-team/qt/qtwebengine/-/blob/0db62e47f0e2f5e4e00193b65da912fe0083088c/debian/patches/chromium-python3.patch -Patch51: python3.patch -## From: https://salsa.debian.org/qt-kde-team/qt/qtwebengine/-/blob/0db62e47f0e2f5e4e00193b65da912fe0083088c/debian/patches/python3.patch -Patch52: chromium-python3.patch -# re.error: global flags not at the start of the expression at position 1 -## From: https://lore.kernel.org/buildroot/20231025205233.1925727-1-kadir.c.yilmaz@gmail.com/T/ -Patch53: fix-build-tools-to-run-with-python3.11.patch # bit-field.h:43:29: error: integer value 7 is outside the valid range of values [0, 3] for the enumeration type 'Kind' Patch54: fix-qt5-qtwebengine-build-with-clang-17.patch # riscv64 support patch from Arch Linux Patch1000: riscv-v8.patch Patch1001: riscv-qt5-qtwebengine.patch -Patch1002: riscv-Fix-build-with-ffmpeg.patch -Patch1003: riscv-qt5-webengine-ffmpeg7.patch BuildRequires: make -BuildRequires: qt5-qtbase-devel +BuildRequires: qt5-qtbase-devel >= %{version} BuildRequires: qt5-qtbase-private-devel # TODO: check of = is really needed or if >= would be good enough -- rex %{?_qt5:Requires: %{_qt5}%{?_isa} = %{_qt5_version}} -BuildRequires: qt5-qtdeclarative-devel +BuildRequires: qt5-qtdeclarative-devel >= %{version} BuildRequires: qt5-qtxmlpatterns-devel BuildRequires: qt5-qtlocation-devel BuildRequires: qt5-qtsensors-devel @@ -207,19 +193,16 @@ BuildRequires: pkgconfig(xkbfile) BuildRequires: perl-interpreter # Only the interpreter is needed BuildRequires: python3 +BuildRequires: /usr/bin/python %if 0%{?use_system_libvpx} BuildRequires: libvpx libvpx-devel %endif BuildRequires: libtirpc BuildRequires: libnsl2 BuildRequires: python-rpm-macros - -%ifarch riscv64 -# We don't use bundled ffmpeg -BuildRequires: pkgconfig(libavcodec) -BuildRequires: pkgconfig(libavformat) -BuildRequires: pkgconfig(libavutil) -%endif +BuildRequires: pkgconfig(libavcodec) +BuildRequires: pkgconfig(libavformat) +BuildRequires: pkgconfig(libavutil) # extra (non-upstream) functions needed, see # src/3rdparty/chromium/third_party/sqlite/README.chromium for details @@ -261,11 +244,6 @@ Provides: bundled(angle) = 2422 # i.e., use the BoringSSL code and the system NSS certificates. Provides: bundled(boringssl) Provides: bundled(brotli) -# Don't get too excited. MPEG and other legally problematic stuff is stripped -# out. See clean_qtwebengine.sh, clean_ffmpeg.sh, and -# get_free_ffmpeg_source_files.py. -# see src/3rdparty/chromium/third_party/ffmpeg/Changelog for the version number -Provides: bundled(ffmpeg) = 4.3 Provides: bundled(hunspell) = 1.6.0 Provides: bundled(iccjpeg) # bundled as "khronos", headers only @@ -285,7 +263,7 @@ Provides: bundled(libwebp) = 1.1.0-28-g55a080e5 # bundled as "libxml" # see src/3rdparty/chromium/third_party/libxml/linux/include/libxml/xmlversion.h # post 2.9.9 snapshot?, 2.9.9-0b3c64d9f2f3e9ce1a98d8f19ee7a763c87e27d5 -Provides: bundled(libxml2) = 2.9.10 +Provides: bundled(libxml2) = 2.11.0 # see src/3rdparty/chromium/third_party/libxslt/linux/config.h for version Provides: bundled(libxslt) = 1.1.34 Provides: bundled(libXNVCtrl) = 302.17 @@ -375,66 +353,24 @@ Summary: Example files for %{name} %description examples %{summary}. - -%if 0%{?docs} %package doc Summary: API documentation for %{name} -BuildRequires: qt5-qdoc -BuildRequires: qt5-qhelpgenerator -BuildRequires: qt5-qtbase-doc -Requires: qt5-qtbase-doc -BuildRequires: qt5-qtxmlpatterns-doc -Requires: qt5-qtxmlpatterns-doc -BuildRequires: qt5-qtdeclarative-doc -Requires: qt5-qtdeclarative-doc BuildArch: noarch + %description doc %{summary}. -%endif - %prep -%setup -q -n %{qt_module}-everywhere-src-%{version}%{?prerelease:-%{prerelease}} -a20 +%setup -q -n %{qt_module}-everywhere-src-%{version}%{?prerelease:-%{prerelease}} -a1 -a20 +rm -fr src/3rdparty/* +mv qtwebengine-chromium-%{commit_id}/* src/3rdparty mv pulse src/3rdparty/chromium/ -pushd src/3rdparty/chromium -popd - -%patch -P2 -p1 -b .fix-extractcflag %if !0%{?arm_neon} -%patch -P3 -p1 -b .no-neon -%endif -%patch -P4 -p1 -b .SIOCGSTAMP -%patch -P5 -p1 -b .QT_DEPRECATED_VERSION -%patch -P6 -p1 -b .angle_nullptr -%patch -P7 -p1 -b .hunspell_nullptr -#if 0%{?pipewire} -%patch -P8 -p1 -b .libpipewire-0.3 -#endif - -## upstream patches -%patch -P24 -p1 -b .aarch64-new-stat -%patch -P34 -p1 -b .support-clang-compile - -%patch -P35 -p1 -%patch -P36 -p1 -%patch -P37 -p1 -%patch -P38 -p1 -%patch -P39 -p1 - -%patch -P50 -p1 -b .disable-catapult -%patch -P51 -p1 -b .python3 -%patch -P52 -p1 -b .chromium-python3 -%patch -P53 -p1 -b .fix-build-tools-to-run-with-python3.11 -%patch -P54 -p1 -b .fix-qt5-qtwebengine-build-with-clang-17 - -%ifarch riscv64 -%patch -P1000 -p1 -b .riscv-v8 -%patch -P1001 -p1 -b .riscv-qt5-qtwebengine -%patch -P1002 -p1 -b .riscv-qt5-webengine-ffmpeg7 -%patch -P1003 -p1 -b .riscv-Fix-build-with-ffmpeg +%patch -P0 -p1 -b .no-neon %endif +%autopatch -p1 -m1 # delete all "toolprefix = " lines from build/toolchain/linux/BUILD.gn, as we # never cross-compile in native Fedora RPMs, fixes ARM and aarch64 FTBFS @@ -456,7 +392,6 @@ sed -i -e '/toolprefix = /d' -e 's/\${toolprefix}//g' \ sed -i -e 's/symbol_level=1/symbol_level=2/g' src/core/config/common.pri %endif -%if 0%{?docs} # generate qtwebengine-3rdparty.qdoc, it is missing from the tarball pushd src/3rdparty %{__python3} chromium/tools/licenses.py \ @@ -464,7 +399,6 @@ pushd src/3rdparty --entry-template ../../tools/about_credits_entry.tmpl \ credits >../webengine/doc/src/qtwebengine-3rdparty.qdoc popd -%endif # copy the Chromium license so it is installed with the appropriate name cp -p src/3rdparty/chromium/LICENSE LICENSE.Chromium @@ -488,40 +422,30 @@ export NINJA_PATH=%{__ninja} %{qmake_qt5} \ %{?debug_config:CONFIG+="%{debug_config}}" \ -%ifarch riscv64 CONFIG+="link_pulseaudio" \ QMAKE_EXTRA_ARGS+="-system-webengine-ffmpeg -system-webengine-webp -system-webengine-opus" \ -%else - CONFIG+="link_pulseaudio use_gold_linker" \ -%endif %{?use_system_libicu:QMAKE_EXTRA_ARGS+="-system-webengine-icu"} \ QMAKE_EXTRA_ARGS+="-webengine-kerberos" \ %{?pipewire:QMAKE_EXTRA_ARGS+="-webengine-webrtc-pipewire"} \ . # avoid %%make_build for now, the -O flag buffers output from intermediate build steps done via ninja -make - -%if 0%{?docs} -%make_build docs -%endif +make %{?_smp_mflags} +%qmake_qt5_build docs %install -make install INSTALL_ROOT=%{buildroot} - -%if 0%{?docs} -make install_docs INSTALL_ROOT=%{buildroot} -%endif +%{qmake_qt5_install} +%qmake_qt5_install install_docs # rpm macros install -p -m644 -D %{SOURCE10} \ - %{buildroot}%{rpm_macros_dir}/macros.qt5-qtwebengine + %{buildroot}%{_rpmmacrodir}/macros.qt5-qtwebengine sed -i \ -e "s|@@NAME@@|%{name}|g" \ -e "s|@@EPOCH@@|%{?epoch}%{!?epoch:0}|g" \ -e "s|@@VERSION@@|%{version}|g" \ -e "s|@@EVR@@|%{?epoch:%{epoch:}}%{version}-%{release}|g" \ - %{buildroot}%{rpm_macros_dir}/macros.qt5-qtwebengine + %{buildroot}%{_rpmmacrodir}/macros.qt5-qtwebengine ## .prl/.la file love # nuke .prl reference(s) to %%buildroot, excessive (.la-like) libs @@ -558,9 +482,7 @@ done %files %license LICENSE.* -%if 0%{?docs} %license src/webengine/doc/src/qtwebengine-3rdparty.qdoc -%endif %{_qt5_libdir}/libQt5*.so.* %{_qt5_bindir}/qwebengine_convert_dict %{_qt5_libdir}/qt5/qml/* @@ -631,7 +553,7 @@ done %lang(zh_TW) %{_qt5_translationdir}/qtwebengine_locales/zh-TW.pak %files devel -%{rpm_macros_dir}/macros.qt5-qtwebengine +%{_rpmmacrodir}/macros.qt5-qtwebengine %{_qt5_headerdir}/Qt*/ %{_qt5_libdir}/libQt5*.so %{_qt5_libdir}/libQt5*.prl @@ -645,13 +567,15 @@ done %files examples %{_qt5_examplesdir}/ -%if 0%{?docs} %files doc +%license LICENSE.FDL %{_qt5_docdir}/* -%endif - %changelog +* Fri Aug 08 2025 Funda Wang - 5.15.17-1 +- update to 5.15.17 +- use git snapshot for qtwebengine-chromium + * Tue Apr 22 2025 Funda Wang - 5.15.16-1 - update to 5.15.16 diff --git a/qtwebengine-everywhere-opensource-src-5.15.17.tar.xz b/qtwebengine-everywhere-opensource-src-5.15.17.tar.xz new file mode 100644 index 0000000..c54e6c2 --- /dev/null +++ b/qtwebengine-everywhere-opensource-src-5.15.17.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8edce3406939b892d301c5f4be56d64806a48664d555dbb34c93bcd5bc81186 +size 319707540 diff --git a/riscv-Fix-build-with-ffmpeg.patch b/qtwebengine-ffmpeg5.patch similarity index 92% rename from riscv-Fix-build-with-ffmpeg.patch rename to qtwebengine-ffmpeg5.patch index 1c8f3a0..87f259e 100644 --- a/riscv-Fix-build-with-ffmpeg.patch +++ b/qtwebengine-ffmpeg5.patch @@ -1,12 +1,8 @@ -From 08bb68ad429cb7b30fb676a27ee7ac0c75f4fb8f Mon Sep 17 00:00:00 2001 -From: Antonio Rojas -Date: Thu, 6 Mar 2025 15:51:18 +0800 -Subject: [PATCH] Fix build with ffmpeg 5 - -Signed-off-by: Xin Liu +Allow building qtwebengine using ffmpeg 5 +Origin: ArchLinux, https://github.com/archlinux/svntogit-packages/tree/packages/qt5-webengine/trunk diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h -index 2734a485c..70b1877a4 100644 +index 2734a48..70b1877 100644 --- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h +++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.h @@ -29,6 +29,7 @@ extern "C" { @@ -18,12 +14,12 @@ index 2734a485c..70b1877a4 100644 #include #include diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader.cc b/src/3rdparty/chromium/media/filters/audio_file_reader.cc -index 6261ee988..2b3abba8b 100644 +index cb81d92..bd73908 100644 --- a/src/3rdparty/chromium/media/filters/audio_file_reader.cc +++ b/src/3rdparty/chromium/media/filters/audio_file_reader.cc @@ -85,7 +85,7 @@ bool AudioFileReader::OpenDemuxer() { } - + bool AudioFileReader::OpenDecoder() { - AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); + const AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); @@ -31,24 +27,24 @@ index 6261ee988..2b3abba8b 100644 // MP3 decodes to S16P which we don't support, tell it to use S16 instead. if (codec_context_->sample_fmt == AV_SAMPLE_FMT_S16P) diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc -index acf91d81e..0d198c091 100644 +index 0d825ed..72fac61 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc @@ -329,7 +329,7 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) { } } - + - AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); + const AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); if (!codec || avcodec_open2(codec_context_.get(), codec, &codec_options) < 0) { DLOG(ERROR) << "Could not initialize audio decoder: " diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc b/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc -index d34db63f3..427565b00 100644 +index d34db63..427565b 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_demuxer.cc @@ -98,12 +98,12 @@ static base::TimeDelta ExtractStartTime(AVStream* stream) { - + // Next try to use the first DTS value, for codecs where we know PTS == DTS // (excludes all H26x codecs). The start time must be returned in PTS. - if (stream->first_dts != kNoFFmpegTimestamp && @@ -64,18 +60,18 @@ index d34db63f3..427565b00 100644 } @@ -408,11 +408,11 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { scoped_refptr buffer; - + if (type() == DemuxerStream::TEXT) { - int id_size = 0; + size_t id_size = 0; uint8_t* id_data = av_packet_get_side_data( packet.get(), AV_PKT_DATA_WEBVTT_IDENTIFIER, &id_size); - + - int settings_size = 0; + size_t settings_size = 0; uint8_t* settings_data = av_packet_get_side_data( packet.get(), AV_PKT_DATA_WEBVTT_SETTINGS, &settings_size); - + @@ -424,7 +424,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { buffer = DecoderBuffer::CopyFrom(packet->data, packet->size, side_data.data(), side_data.size()); @@ -84,32 +80,32 @@ index d34db63f3..427565b00 100644 + size_t side_data_size = 0; uint8_t* side_data = av_packet_get_side_data( packet.get(), AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, &side_data_size); - + @@ -485,7 +485,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) { packet->size - data_offset); } - + - int skip_samples_size = 0; + size_t skip_samples_size = 0; const uint32_t* skip_samples_ptr = reinterpret_cast(av_packet_get_side_data( packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size)); diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc b/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc -index 0ef352147..8483ecc34 100644 +index 0ef3521..8483ecc 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_glue.cc @@ -59,7 +59,6 @@ static int64_t AVIOSeekOperation(void* opaque, int64_t offset, int whence) { } - + void FFmpegGlue::InitializeFFmpeg() { - av_register_all(); } - + static void LogContainer(bool is_local_file, @@ -95,9 +94,6 @@ FFmpegGlue::FFmpegGlue(FFmpegURLProtocol* protocol) { // Enable fast, but inaccurate seeks for MP3. format_context_->flags |= AVFMT_FLAG_FAST_SEEK; - + - // Ensures we can read out various metadata bits like vp8 alpha. - format_context_->flags |= AVFMT_FLAG_KEEP_SIDE_DATA; - @@ -117,20 +113,20 @@ index 0ef352147..8483ecc34 100644 // instances were real failures. Solves bugs like http://crbug.com/710791. format_context_->error_recognition |= AV_EF_EXPLODE; diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc -index 45c30a02e..712fe6271 100644 +index ef12477..7996606 100644 --- a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc +++ b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc -@@ -398,7 +398,7 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config, +@@ -391,7 +391,7 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config, if (decode_nalus_) codec_context_->flags2 |= AV_CODEC_FLAG2_CHUNKS; - + - AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); + const AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); if (!codec || avcodec_open2(codec_context_.get(), codec, NULL) < 0) { ReleaseFFmpegResources(); return false; diff --git a/src/3rdparty/chromium/media/filters/media_file_checker.cc b/src/3rdparty/chromium/media/filters/media_file_checker.cc -index 59c2a2fc6..1a9872c7a 100644 +index 59c2a2f..1a9872c 100644 --- a/src/3rdparty/chromium/media/filters/media_file_checker.cc +++ b/src/3rdparty/chromium/media/filters/media_file_checker.cc @@ -68,7 +68,7 @@ bool MediaFileChecker::Start(base::TimeDelta check_time) { @@ -143,17 +139,16 @@ index 59c2a2fc6..1a9872c7a 100644 auto loop = std::make_unique(context.get()); stream_contexts[i] = {std::move(context), std::move(loop)}; diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc -index 9002b8746..d12fade8b 100644 +index 9002b87..d12fade 100644 --- a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc +++ b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc @@ -203,7 +203,7 @@ int32_t H264DecoderImpl::InitDecode(const VideoCodec* codec_settings, // a pointer |this|. av_context_->opaque = this; - + - AVCodec* codec = avcodec_find_decoder(av_context_->codec_id); + const AVCodec* codec = avcodec_find_decoder(av_context_->codec_id); if (!codec) { // This is an indication that FFmpeg has not been initialized or it has not // been compiled/initialized with the correct set of codecs. --- -2.48.1 + diff --git a/qtwebengine-icu-74.patch b/qtwebengine-icu-74.patch deleted file mode 100644 index 703f5f3..0000000 --- a/qtwebengine-icu-74.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc b/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc -index e34b07372..c0f9268aa 100644 ---- a/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc -+++ b/src/3rdparty/chromium/third_party/blink/renderer/platform/text/text_break_iterator.cc -@@ -162,7 +162,9 @@ static const unsigned char kAsciiLineBreakTable[][(kAsciiLineBreakTableLastChar - }; - // clang-format on - --#if U_ICU_VERSION_MAJOR_NUM >= 58 -+#if U_ICU_VERSION_MAJOR_NUM >= 74 -+#define BA_LB_COUNT (U_LB_COUNT - 8) -+#elif U_ICU_VERSION_MAJOR_NUM >= 58 - #define BA_LB_COUNT (U_LB_COUNT - 3) - #else - #define BA_LB_COUNT U_LB_COUNT diff --git a/qtwebengine-release.sh b/qtwebengine-release.sh deleted file mode 100755 index a05c100..0000000 --- a/qtwebengine-release.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -set -x -VERSION=5.15.8 -CHROMIUMHASH=`wget https://code.qt.io/cgit/qt/qtwebengine.git/tree/src/3rdparty?h=$VERSION -q --content-on-error -O - | grep "Bad object name: " | sed 's/^.*Bad object name: \([0-9a-f]\{40\}\).*$/\1/g'` -rm -rf qtwebengine-$VERSION qtwebengine-$VERSION.tar.gz qtwebengine-chromium-$CHROMIUMHASH qtwebengine-chromium-$CHROMIUMHASH.tar.gz qtwebengine-everywhere-src-$VERSION -wget https://github.com/qt/qtwebengine/archive/$VERSION.tar.gz -O qtwebengine-$VERSION.tar.gz || exit $? -tar xzf qtwebengine-$VERSION.tar.gz || exit $? -wget https://github.com/qt/qtwebengine-chromium/archive/$CHROMIUMHASH.tar.gz -O qtwebengine-chromium-$CHROMIUMHASH.tar.gz || exit $? -tar xzf qtwebengine-chromium-$CHROMIUMHASH.tar.gz || exit $? -mv qtwebengine-$VERSION qtwebengine-everywhere-src-$VERSION || exit $? -(cd qtwebengine-everywhere-src-$VERSION ; syncqt.pl -version $VERSION ) || exit $? -rmdir qtwebengine-everywhere-src-$VERSION/src/3rdparty || exit $? -mv qtwebengine-chromium-$CHROMIUMHASH qtwebengine-everywhere-src-$VERSION/src/3rdparty || exit $? -XZ_OPT="-9 -T2" tar cJf qtwebengine-everywhere-src-$VERSION.tar.xz qtwebengine-everywhere-src-$VERSION || exit $? -rm -rf qtwebengine-$VERSION qtwebengine-$VERSION.tar.gz qtwebengine-chromium-$CHROMIUMHASH qtwebengine-chromium-$CHROMIUMHASH.tar.gz qtwebengine-everywhere-src-$VERSION diff --git a/riscv-qt5-qtwebengine.patch b/riscv-qt5-qtwebengine.patch index 58b852a..b3aad46 100644 --- a/riscv-qt5-qtwebengine.patch +++ b/riscv-qt5-qtwebengine.patch @@ -205,16 +205,16 @@ Index: qtwebengine-everywhere-src-5.15.7/src/3rdparty/chromium/sandbox/linux/sec =================================================================== --- qtwebengine-everywhere-src-5.15.7.orig/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc +++ qtwebengine-everywhere-src-5.15.7/src/3rdparty/chromium/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.cc -@@ -37,7 +37,7 @@ +@@ -41,7 +41,7 @@ #include #include #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(__arm__) && \ - !defined(__aarch64__) && !defined(PTRACE_GET_THREAD_AREA) + !defined(__aarch64__) && !defined(__riscv) && !defined(PTRACE_GET_THREAD_AREA) + // Also include asm/ptrace-abi.h since ptrace.h in older libc (for instance // the one in Ubuntu 16.04 LTS) is missing PTRACE_GET_THREAD_AREA. - // asm/ptrace-abi.h doesn't exist on arm32 and PTRACE_GET_THREAD_AREA isn't -@@ -406,7 +406,7 @@ ResultExpr RestrictPrlimitToGetrlimit(pi +@@ -411,7 +411,7 @@ ResultExpr RestrictPtrace() { const Arg request(0); return Switch(request).CASES(( -- Gitee