[WinCairo] Unreviewed test gardening
[WebKit-https.git] / Source / WebKit / mac / replace-webkit-additions-includes.py
1 #!/usr/bin/env python
2 #
3 # Copyright (C) 2019 Apple Inc. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 # THE POSSIBILITY OF SUCH DAMAGE.
25 #
26
27 import os
28 import re
29 import sys
30
31
32 def read_content_from_webkit_additions(built_products_directory, sdk_root_directory, filename):
33     additions_path = os.path.join("usr/local/include/WebKitAdditions", filename)
34     try:
35         file_in_build_directory = open(os.path.join(built_products_directory, additions_path), "r")
36         return file_in_build_directory.read()
37     except Exception as ex:
38         try:
39             file_in_sdk_root = open(os.path.join(sdk_root_directory, additions_path), "r")
40             return file_in_sdk_root.read()
41         except Exception as ex:
42             return ""
43
44
45 def is_supported_os():
46     os_version_string = os.environ.get("MACOSX_DEPLOYMENT_TARGET")
47     if os_version_string is not None:
48         os_version = float('.'.join(os_version_string.split('.')[:2]))
49         return os_version >= 13.0
50     os_version_string = os.environ.get("IPHONEOS_DEPLOYMENT_TARGET")
51     if os_version_string is not None:
52         os_version = float('.'.join(os_version_string.split('.')[:2]))
53         return os_version >= 16.0
54     os_version_string = os.environ.get("WATCHOS_DEPLOYMENT_TARGET")
55     if os_version_string is not None:
56         os_version = float('.'.join(os_version_string.split('.')[:2]))
57         return os_version >= 9.0
58     os_version_string = os.environ.get("TVOS_DEPLOYMENT_TARGET")
59     if os_version_string is not None:
60         os_version = float('.'.join(os_version_string.split('.')[:2]))
61         return os_version >= 16.0
62     return True
63
64
65 def main(argv=None):
66     if not argv:
67         argv = sys.argv
68
69     if len(argv) != 4:
70         print("Usage: replace-webkit-additions-includes.py <header_path> <built_products_directory> <sdk_root_directory>")
71         return 1
72
73     header_path = argv[1]
74     built_products_directory = argv[2]
75     sdk_root_directory = argv[3]
76     if not len(header_path):
77         print("(%s): header path unspecified" % argv[0])
78         return 1
79
80     if not len(built_products_directory):
81         print("(%s): built products directory unspecified" % argv[0])
82         return 1
83
84     if not len(sdk_root_directory):
85         print("(%s): SDK root directory unspecified" % argv[0])
86         return 1
87
88     # We currently only support WebKitAdditions in Framework headers on macOS 13+ and iOS 16+.
89     should_do_replacement = is_supported_os()
90
91     additions_import_pattern = re.compile(r"\#if USE\(APPLE_INTERNAL_SDK\)\n#import <WebKitAdditions/(.*)>\n#endif")
92     try:
93         with open(header_path, "r") as header:
94             header_contents = header.read()
95             match = additions_import_pattern.search(header_contents)
96             while match:
97                 if should_do_replacement:
98                     header_contents = header_contents[:match.start()] + read_content_from_webkit_additions(built_products_directory, sdk_root_directory, match.groups()[0]) + header_contents[match.end():]
99                 else:
100                     header_contents = header_contents[:match.start()] + header_contents[match.end():]
101                 match = additions_import_pattern.search(header_contents)
102             try:
103                 with open(header_path, "w") as header:
104                     header.write(header_contents)
105             except Exception as ex:
106                 print("(%s): failed to write to file: %s" % (argv[0], header_path))
107                 return 1
108         return 0
109     except Exception as ex:
110         print("(%s): failed to read file: %s" % (argv[0], header_path))
111         return 1
112
113
114 if __name__ == "__main__":
115     sys.exit(main(sys.argv))