Title: [196881] trunk/Source/_javascript_Core
Revision
196881
Author
[email protected]
Date
2016-02-21 16:08:37 -0800 (Sun, 21 Feb 2016)

Log Message

Web Inspector: it should be possible to omit generated code guarded by INSPECTOR_ALTERNATE_DISPATCHERS
https://bugs.webkit.org/show_bug.cgi?id=154508
<rdar://problem/24759077>

Reviewed by Timothy Hatcher.

In preparation for being able to generate protocol files for WebKit2,
make it possible to not emit generated code that's guarded by
ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS). This code is not needed by
backend dispatchers generated outside of _javascript_Core. We can't just
define it to 0 for WebKit2, since it's defined to 1 in <wtf/Platform.h>
in the configurations where the code is actually used.

Add a new opt-in Framework configuration option that turns on generating
this code. Adjust how the code is generated so that it can be easily excluded.

* inspector/scripts/codegen/cpp_generator_templates.py:
Make a separate template for the declarations that are guarded.
Add an initializer _expression_ so the order of initalizers doesn't matter.

* inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py:
(CppBackendDispatcherHeaderGenerator.generate_output): Add a setting check.
(CppBackendDispatcherHeaderGenerator._generate_dispatcher_declarations_for_domain):
If the declarations are needed, they will be appended to the end of the
declarations list.

* inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py:
(CppBackendDispatcherImplementationGenerator.generate_output): Add a setting check.
(CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command): Add a setting check.

* inspector/scripts/codegen/models.py: Set the 'alternate_dispatchers' setting
to True for Framework._javascript_Core only. It's not needed elsewhere.

Rebaseline affected tests.

* inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
* inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
* inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result:
* inspector/scripts/tests/expected/enum-values.json-result:
* inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (196880 => 196881)


--- trunk/Source/_javascript_Core/ChangeLog	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-02-22 00:08:37 UTC (rev 196881)
@@ -1,5 +1,48 @@
 2016-02-21  Brian Burg  <[email protected]>
 
+        Web Inspector: it should be possible to omit generated code guarded by INSPECTOR_ALTERNATE_DISPATCHERS
+        https://bugs.webkit.org/show_bug.cgi?id=154508
+        <rdar://problem/24759077>
+
+        Reviewed by Timothy Hatcher.
+
+        In preparation for being able to generate protocol files for WebKit2,
+        make it possible to not emit generated code that's guarded by
+        ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS). This code is not needed by
+        backend dispatchers generated outside of _javascript_Core. We can't just
+        define it to 0 for WebKit2, since it's defined to 1 in <wtf/Platform.h>
+        in the configurations where the code is actually used.
+
+        Add a new opt-in Framework configuration option that turns on generating
+        this code. Adjust how the code is generated so that it can be easily excluded.
+
+        * inspector/scripts/codegen/cpp_generator_templates.py:
+        Make a separate template for the declarations that are guarded.
+        Add an initializer _expression_ so the order of initalizers doesn't matter.
+
+        * inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py:
+        (CppBackendDispatcherHeaderGenerator.generate_output): Add a setting check.
+        (CppBackendDispatcherHeaderGenerator._generate_dispatcher_declarations_for_domain):
+        If the declarations are needed, they will be appended to the end of the
+        declarations list.
+
+        * inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py:
+        (CppBackendDispatcherImplementationGenerator.generate_output): Add a setting check.
+        (CppBackendDispatcherImplementationGenerator._generate_dispatcher_implementation_for_command): Add a setting check.
+
+        * inspector/scripts/codegen/models.py: Set the 'alternate_dispatchers' setting
+        to True for Framework._javascript_Core only. It's not needed elsewhere.
+
+        Rebaseline affected tests.
+
+        * inspector/scripts/tests/expected/commands-with-async-attribute.json-result:
+        * inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result:
+        * inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result:
+        * inspector/scripts/tests/expected/enum-values.json-result:
+        * inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result:
+
+2016-02-21  Brian Burg  <[email protected]>
+
         Web Inspector: clean up generator selection in generate-inspector-protocol-bindings.py
         https://bugs.webkit.org/show_bug.cgi?id=154505
         <rdar://problem/24758042>

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/cpp_generator_templates.py (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/cpp_generator_templates.py	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/cpp_generator_templates.py	2016-02-22 00:08:37 UTC (rev 196881)
@@ -105,14 +105,16 @@
 ${commandDeclarations}
 private:
     ${domainName}BackendDispatcher(BackendDispatcher&, ${domainName}BackendDispatcherHandler*);
-    ${domainName}BackendDispatcherHandler* m_agent;
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
+    ${domainName}BackendDispatcherHandler* m_agent { nullptr };
+};""")
+
+    BackendDispatcherHeaderDomainDispatcherAlternatesDeclaration = (
+    """#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(Alternate${domainName}BackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    Alternate${domainName}BackendDispatcher* m_alternateDispatcher;
-#endif
-};""")
+    Alternate${domainName}BackendDispatcher* m_alternateDispatcher { nullptr };
+#endif""")
 
     BackendDispatcherHeaderAsyncCommandDeclaration = (
     """    ${classAndExportMacro} ${callbackName} : public BackendDispatcher::CallbackBase {
@@ -176,9 +178,6 @@
 ${domainName}BackendDispatcher::${domainName}BackendDispatcher(BackendDispatcher& backendDispatcher, ${domainName}BackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("${domainName}"), this);
 }""")

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_cpp_backend_dispatcher_header.py	2016-02-22 00:08:37 UTC (rev 196881)
@@ -67,7 +67,8 @@
         sections = []
         sections.append(self.generate_license())
         sections.append(Template(CppTemplates.HeaderPrelude).substitute(None, **header_args))
-        sections.append(self._generate_alternate_handler_forward_declarations_for_domains(domains))
+        if self.model().framework.setting('alternate_dispatchers', False):
+            sections.append(self._generate_alternate_handler_forward_declarations_for_domains(domains))
         sections.extend(map(self._generate_handler_declarations_for_domain, domains))
         sections.extend(map(self._generate_dispatcher_declarations_for_domain, domains))
         sections.append(Template(CppTemplates.HeaderPostlude).substitute(None, **header_args))
@@ -196,6 +197,14 @@
             declarations.append('private:')
         declarations.extend(map(self._generate_dispatcher_declaration_for_command, domain.commands))
 
+        declaration_args = {
+            'domainName': domain.domain_name,
+        }
+
+        # Add in a few more declarations at the end if needed.
+        if self.model().framework.setting('alternate_dispatchers', False):
+            declarations.append(Template(CppTemplates.BackendDispatcherHeaderDomainDispatcherAlternatesDeclaration).substitute(None, **declaration_args))
+
         handler_args = {
             'classAndExportMacro': " ".join(classComponents),
             'domainName': domain.domain_name,

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/generate_cpp_backend_dispatcher_implementation.py	2016-02-22 00:08:37 UTC (rev 196881)
@@ -55,11 +55,13 @@
             '<wtf/text/CString.h>']
 
         secondary_includes = ['#include %s' % header for header in secondary_headers]
-        secondary_includes.append('')
-        secondary_includes.append('#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)')
-        secondary_includes.append('#include "InspectorAlternateBackendDispatchers.h"')
-        secondary_includes.append('#endif')
 
+        if self.model().framework.setting('alternate_dispatchers', False):
+            secondary_includes.append('')
+            secondary_includes.append('#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)')
+            secondary_includes.append('#include "InspectorAlternateBackendDispatchers.h"')
+            secondary_includes.append('#endif')
+
         header_args = {
             'primaryInclude': '"InspectorBackendDispatchers.h"',
             'secondaryIncludes': '\n'.join(secondary_includes),
@@ -276,13 +278,14 @@
         if len(command.call_parameters) > 0:
             lines.append(Template(CppTemplates.BackendDispatcherImplementationPrepareCommandArguments).substitute(None, **command_args))
 
-        lines.append('#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)')
-        lines.append('    if (m_alternateDispatcher) {')
-        lines.append('        m_alternateDispatcher->%(commandName)s(%(alternateInvocationParameters)s);' % command_args)
-        lines.append('        return;')
-        lines.append('    }')
-        lines.append('#endif')
-        lines.append('')
+        if self.model().framework.setting('alternate_dispatchers', False):
+            lines.append('#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)')
+            lines.append('    if (m_alternateDispatcher) {')
+            lines.append('        m_alternateDispatcher->%(commandName)s(%(alternateInvocationParameters)s);' % command_args)
+            lines.append('        return;')
+            lines.append('    }')
+            lines.append('#endif')
+            lines.append('')
 
         lines.append('    ErrorString error;')
         lines.append('    Ref<InspectorObject> result = InspectorObject::create();')

Modified: trunk/Source/_javascript_Core/inspector/scripts/codegen/models.py (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/codegen/models.py	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/codegen/models.py	2016-02-22 00:08:37 UTC (rev 196881)
@@ -42,12 +42,14 @@
     "Global": {
     },
     "_javascript_Core": {
-        "export_macro": "JS_EXPORT_PRIVATE"
+        "export_macro": "JS_EXPORT_PRIVATE",
+        "alternate_dispatchers": True,
     },
     "WebInspector": {
     },
     # Used for code generator tests.
     "Test": {
+        "alternate_dispatchers": True,
     }
 }
 

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-async-attribute.json-result (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-async-attribute.json-result	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-async-attribute.json-result	2016-02-22 00:08:37 UTC (rev 196881)
@@ -194,15 +194,15 @@
     void executeSQLAsyncOptionalReturnValues(long requestId, RefPtr<InspectorObject>&& parameters);
     void executeSQLSync(long requestId, RefPtr<InspectorObject>&& parameters);
     void executeSQLAsync(long requestId, RefPtr<InspectorObject>&& parameters);
-private:
-    DatabaseBackendDispatcher(BackendDispatcher&, DatabaseBackendDispatcherHandler*);
-    DatabaseBackendDispatcherHandler* m_agent;
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(AlternateDatabaseBackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    AlternateDatabaseBackendDispatcher* m_alternateDispatcher;
+    AlternateDatabaseBackendDispatcher* m_alternateDispatcher { nullptr };
 #endif
+private:
+    DatabaseBackendDispatcher(BackendDispatcher&, DatabaseBackendDispatcherHandler*);
+    DatabaseBackendDispatcherHandler* m_agent { nullptr };
 };
 
 } // namespace Inspector
@@ -265,9 +265,6 @@
 DatabaseBackendDispatcher::DatabaseBackendDispatcher(BackendDispatcher& backendDispatcher, DatabaseBackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Database"), this);
 }

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/commands-with-optional-call-return-parameters.json-result	2016-02-22 00:08:37 UTC (rev 196881)
@@ -175,15 +175,15 @@
 private:
     void executeAllOptionalParameters(long requestId, RefPtr<InspectorObject>&& parameters);
     void executeNoOptionalParameters(long requestId, RefPtr<InspectorObject>&& parameters);
-private:
-    DatabaseBackendDispatcher(BackendDispatcher&, DatabaseBackendDispatcherHandler*);
-    DatabaseBackendDispatcherHandler* m_agent;
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(AlternateDatabaseBackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    AlternateDatabaseBackendDispatcher* m_alternateDispatcher;
+    AlternateDatabaseBackendDispatcher* m_alternateDispatcher { nullptr };
 #endif
+private:
+    DatabaseBackendDispatcher(BackendDispatcher&, DatabaseBackendDispatcherHandler*);
+    DatabaseBackendDispatcherHandler* m_agent { nullptr };
 };
 
 } // namespace Inspector
@@ -246,9 +246,6 @@
 DatabaseBackendDispatcher::DatabaseBackendDispatcher(BackendDispatcher& backendDispatcher, DatabaseBackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Database"), this);
 }

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/domains-with-varying-command-sizes.json-result	2016-02-22 00:08:37 UTC (rev 196881)
@@ -192,15 +192,15 @@
     virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
 private:
     void loadResource1(long requestId, RefPtr<InspectorObject>&& parameters);
-private:
-    Network1BackendDispatcher(BackendDispatcher&, Network1BackendDispatcherHandler*);
-    Network1BackendDispatcherHandler* m_agent;
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(AlternateNetwork1BackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    AlternateNetwork1BackendDispatcher* m_alternateDispatcher;
+    AlternateNetwork1BackendDispatcher* m_alternateDispatcher { nullptr };
 #endif
+private:
+    Network1BackendDispatcher(BackendDispatcher&, Network1BackendDispatcherHandler*);
+    Network1BackendDispatcherHandler* m_agent { nullptr };
 };
 
 class Network3BackendDispatcher final : public SupplementalBackendDispatcher {
@@ -215,15 +215,15 @@
     void loadResource5(long requestId, RefPtr<InspectorObject>&& parameters);
     void loadResource6(long requestId, RefPtr<InspectorObject>&& parameters);
     void loadResource7(long requestId, RefPtr<InspectorObject>&& parameters);
-private:
-    Network3BackendDispatcher(BackendDispatcher&, Network3BackendDispatcherHandler*);
-    Network3BackendDispatcherHandler* m_agent;
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(AlternateNetwork3BackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    AlternateNetwork3BackendDispatcher* m_alternateDispatcher;
+    AlternateNetwork3BackendDispatcher* m_alternateDispatcher { nullptr };
 #endif
+private:
+    Network3BackendDispatcher(BackendDispatcher&, Network3BackendDispatcherHandler*);
+    Network3BackendDispatcherHandler* m_agent { nullptr };
 };
 
 } // namespace Inspector
@@ -287,9 +287,6 @@
 Network1BackendDispatcher::Network1BackendDispatcher(BackendDispatcher& backendDispatcher, Network1BackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Network1"), this);
 }
@@ -334,9 +331,6 @@
 Network3BackendDispatcher::Network3BackendDispatcher(BackendDispatcher& backendDispatcher, Network3BackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Network3"), this);
 }

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/enum-values.json-result (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/enum-values.json-result	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/enum-values.json-result	2016-02-22 00:08:37 UTC (rev 196881)
@@ -173,15 +173,15 @@
     virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
 private:
     void commandWithEnumReturnValue(long requestId, RefPtr<InspectorObject>&& parameters);
-private:
-    CommandDomainBackendDispatcher(BackendDispatcher&, CommandDomainBackendDispatcherHandler*);
-    CommandDomainBackendDispatcherHandler* m_agent;
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(AlternateCommandDomainBackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    AlternateCommandDomainBackendDispatcher* m_alternateDispatcher;
+    AlternateCommandDomainBackendDispatcher* m_alternateDispatcher { nullptr };
 #endif
+private:
+    CommandDomainBackendDispatcher(BackendDispatcher&, CommandDomainBackendDispatcherHandler*);
+    CommandDomainBackendDispatcherHandler* m_agent { nullptr };
 };
 
 } // namespace Inspector
@@ -244,9 +244,6 @@
 CommandDomainBackendDispatcher::CommandDomainBackendDispatcher(BackendDispatcher& backendDispatcher, CommandDomainBackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("CommandDomain"), this);
 }

Modified: trunk/Source/_javascript_Core/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result (196880 => 196881)


--- trunk/Source/_javascript_Core/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result	2016-02-22 00:05:07 UTC (rev 196880)
+++ trunk/Source/_javascript_Core/inspector/scripts/tests/expected/generate-domains-with-feature-guards.json-result	2016-02-22 00:08:37 UTC (rev 196881)
@@ -169,15 +169,15 @@
     virtual void dispatch(long requestId, const String& method, Ref<InspectorObject>&& message) override;
 private:
     void loadResource(long requestId, RefPtr<InspectorObject>&& parameters);
-private:
-    Network1BackendDispatcher(BackendDispatcher&, Network1BackendDispatcherHandler*);
-    Network1BackendDispatcherHandler* m_agent;
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
 public:
     void setAlternateDispatcher(AlternateNetwork1BackendDispatcher* alternateDispatcher) { m_alternateDispatcher = alternateDispatcher; }
 private:
-    AlternateNetwork1BackendDispatcher* m_alternateDispatcher;
+    AlternateNetwork1BackendDispatcher* m_alternateDispatcher { nullptr };
 #endif
+private:
+    Network1BackendDispatcher(BackendDispatcher&, Network1BackendDispatcherHandler*);
+    Network1BackendDispatcherHandler* m_agent { nullptr };
 };
 #endif // PLATFORM(WEB_COMMANDS)
 
@@ -244,9 +244,6 @@
 Network1BackendDispatcher::Network1BackendDispatcher(BackendDispatcher& backendDispatcher, Network1BackendDispatcherHandler* agent)
     : SupplementalBackendDispatcher(backendDispatcher)
     , m_agent(agent)
-#if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    , m_alternateDispatcher(nullptr)
-#endif
 {
     m_backendDispatcher->registerDispatcherForDomain(ASCIILiteral("Network1"), this);
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to