Log Message
run-webkit-tests asserts when the iPhone XR simulator is running https://bugs.webkit.org/show_bug.cgi?id=200404 <rdar://problem/53878739>
Reviewed by Dean Jackson. Support unicode in all logging statements tied to device model. * Scripts/webkitpy/layout_tests/controllers/manager.py: (Manager.run): * Scripts/webkitpy/layout_tests/views/printing.py: (Printer.print_baseline_search_path): * Scripts/webkitpy/port/device.py: (Device.__repr__): * Scripts/webkitpy/port/device_port.py: (DevicePort._install): (DevicePort.setup_test_run): (DevicePort.clean_up_test_run): (DevicePort.configuration_for_upload): * Scripts/webkitpy/port/ios.py: (IOSPort.default_baseline_search_path): * Scripts/webkitpy/xcode/device_type.py: (DeviceType.__str__): * Scripts/webkitpy/xcode/simulated_device.py: (SimulatedDeviceManager.populate_available_devices): (SimulatedDeviceManager._find_available_name): (SimulatedDeviceManager._get_device_identifier_for_type): (SimulatedDeviceManager._create_or_find_device_for_request): (SimulatedDeviceManager._does_fulfill_request): (SimulatedDeviceManager._wait_until_device_in_state): (SimulatedDeviceManager._wait_until_device_is_usable): (SimulatedDeviceManager._boot_device): (SimulatedDeviceManager.initialize_devices): (SimulatedDeviceManager.max_supported_simulators): (SimulatedDeviceManager.swap): (SimulatedDevice.is_usable): (SimulatedDevice._shut_down): (SimulatedDevice._delete): (SimulatedDevice.launch_app): (SimulatedDevice.__repr__):
Modified Paths
- trunk/Tools/ChangeLog
- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
- trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py
- trunk/Tools/Scripts/webkitpy/port/device.py
- trunk/Tools/Scripts/webkitpy/port/device_port.py
- trunk/Tools/Scripts/webkitpy/port/ios.py
- trunk/Tools/Scripts/webkitpy/xcode/device_type.py
- trunk/Tools/Scripts/webkitpy/xcode/simulated_device.py
Diff
Modified: trunk/Tools/ChangeLog (248269 => 248270)
--- trunk/Tools/ChangeLog 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/ChangeLog 2019-08-05 16:42:24 UTC (rev 248270)
@@ -1,3 +1,46 @@
+2019-08-05 Jonathan Bedard <jbed...@apple.com>
+
+ run-webkit-tests asserts when the iPhone XR simulator is running
+ https://bugs.webkit.org/show_bug.cgi?id=200404
+ <rdar://problem/53878739>
+
+ Reviewed by Dean Jackson.
+
+ Support unicode in all logging statements tied to device model.
+
+ * Scripts/webkitpy/layout_tests/controllers/manager.py:
+ (Manager.run):
+ * Scripts/webkitpy/layout_tests/views/printing.py:
+ (Printer.print_baseline_search_path):
+ * Scripts/webkitpy/port/device.py:
+ (Device.__repr__):
+ * Scripts/webkitpy/port/device_port.py:
+ (DevicePort._install):
+ (DevicePort.setup_test_run):
+ (DevicePort.clean_up_test_run):
+ (DevicePort.configuration_for_upload):
+ * Scripts/webkitpy/port/ios.py:
+ (IOSPort.default_baseline_search_path):
+ * Scripts/webkitpy/xcode/device_type.py:
+ (DeviceType.__str__):
+ * Scripts/webkitpy/xcode/simulated_device.py:
+ (SimulatedDeviceManager.populate_available_devices):
+ (SimulatedDeviceManager._find_available_name):
+ (SimulatedDeviceManager._get_device_identifier_for_type):
+ (SimulatedDeviceManager._create_or_find_device_for_request):
+ (SimulatedDeviceManager._does_fulfill_request):
+ (SimulatedDeviceManager._wait_until_device_in_state):
+ (SimulatedDeviceManager._wait_until_device_is_usable):
+ (SimulatedDeviceManager._boot_device):
+ (SimulatedDeviceManager.initialize_devices):
+ (SimulatedDeviceManager.max_supported_simulators):
+ (SimulatedDeviceManager.swap):
+ (SimulatedDevice.is_usable):
+ (SimulatedDevice._shut_down):
+ (SimulatedDevice._delete):
+ (SimulatedDevice.launch_app):
+ (SimulatedDevice.__repr__):
+
2019-08-04 Chris Dumez <cdu...@apple.com>
Ping loads should not prevent page caching
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -184,8 +184,8 @@
device_type_list = self._port.supported_device_types()
for device_type in device_type_list:
"""Run the tests and return a RunDetails object with the results."""
- for_device_type = 'for {} '.format(device_type) if device_type else ''
- self._printer.write_update('Collecting tests {}...'.format(for_device_type))
+ for_device_type = u'for {} '.format(device_type) if device_type else ''
+ self._printer.write_update(u'Collecting tests {}...'.format(for_device_type))
try:
paths, test_names = self._collect_tests(args, device_type=device_type)
except IOError:
@@ -192,7 +192,7 @@
# This is raised if --test-list doesn't exist
return test_run_results.RunDetails(exit_code=-1)
- self._printer.write_update('Parsing expectations {}...'.format(for_device_type))
+ self._printer.write_update(u'Parsing expectations {}...'.format(for_device_type))
self._expectations[device_type] = test_expectations.TestExpectations(self._port, test_names, force_expectations_pass=self._options.force, device_type=device_type)
self._expectations[device_type].parse_all_expectations()
@@ -259,7 +259,7 @@
self._printer.print_baseline_search_path(device_type=device_type)
- _log.info('Running {}{}'.format(pluralize(len(tests_to_run_by_device[device_type]), 'test'), ' for {}'.format(str(device_type)) if device_type else ''))
+ _log.info(u'Running {}{}'.format(pluralize(len(tests_to_run_by_device[device_type]), 'test'), u' for {}'.format(device_type) if device_type else ''))
_log.info('')
start_time_for_device = time.time()
if not tests_to_run_by_device[device_type]:
Modified: trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/views/printing.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -99,12 +99,12 @@
normalize_baseline = lambda baseline_search_path: [
fs.relpath(x, self._port.layout_tests_dir()).replace("../", "") for x in baseline_search_path]
- self._print_default('Verbose baseline search path: {} -> generic'.format(
- ' -> '.join(normalize_baseline(full_baseline_search_path))))
+ self._print_default(u'Verbose baseline search path: {} -> generic'.format(
+ u' -> '.join(normalize_baseline(full_baseline_search_path))))
self._print_default('')
- self._print_default('Baseline search path: {} -> generic'.format(
- ' -> '.join(normalize_baseline([path for path in full_baseline_search_path if fs.exists(path)]))))
+ self._print_default(u'Baseline search path: {} -> generic'.format(
+ u' -> '.join(normalize_baseline([path for path in full_baseline_search_path if fs.exists(path)]))))
self._print_default('')
def print_found(self, num_all_test_files, num_to_run, repeat_each, iterations):
Modified: trunk/Tools/Scripts/webkitpy/port/device.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/port/device.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/port/device.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -115,4 +115,4 @@
return not self.__eq__(other)
def __repr__(self):
- return str(self.platform_device)
+ return u'{}'.format(self.platform_device)
Modified: trunk/Tools/Scripts/webkitpy/port/device_port.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/port/device_port.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/port/device_port.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -97,7 +97,7 @@
for i in xrange(self.child_processes()):
device = self.target_host(i)
- _log.debug('Installing to {}'.format(device))
+ _log.debug(u'Installing to {}'.format(device))
# Without passing DYLD_LIBRARY_PATH, libWebCoreTestSupport cannot be loaded and DRT/WKTR will crash pre-launch,
# leaving a crash log which will be picked up in results. DYLD_FRAMEWORK_PATH is needed to prevent an early crash.
if not device.install_app(self._path_to_driver(), {'DYLD_LIBRARY_PATH': self._build_path(), 'DYLD_FRAMEWORK_PATH': self._build_path()}):
@@ -162,7 +162,7 @@
raise RuntimeError(self.NO_DEVICE_MANAGER)
device_type = self._device_type_with_version(device_type)
- _log.debug('\nCreating devices for {}'.format(device_type))
+ _log.debug(u'\nCreating devices for {}'.format(device_type))
request = DeviceRequest(
device_type,
@@ -212,7 +212,7 @@
if isinstance(e, Exception):
exception_list.append([e, trace])
else:
- exception_list.append([Exception('Exception while tearing down {}'.format(device)), trace])
+ exception_list.append([Exception(u'Exception while tearing down {}'.format(device)), trace])
if len(exception_list) == 1:
raise
@@ -247,7 +247,7 @@
device_type = host.device_type if host else self.DEVICE_TYPE
model = device_type.hardware_family
if model and device_type.hardware_type:
- model += ' {}'.format(device_type.hardware_type)
+ model += u' {}'.format(device_type.hardware_type)
version = self.device_version()
version_name = None
Modified: trunk/Tools/Scripts/webkitpy/port/ios.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/port/ios.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/port/ios.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -74,12 +74,12 @@
base_variants = []
if hardware_family and hardware_type:
- base_variants.append('{}-{}-{}'.format(hardware_family, hardware_type, runtime_type))
+ base_variants.append(u'{}-{}-{}'.format(hardware_family, hardware_type, runtime_type))
if hardware_family:
- base_variants.append('{}-{}'.format(hardware_family, runtime_type))
- base_variants.append('{}-{}'.format(IOSPort.port_name, runtime_type))
+ base_variants.append(u'{}-{}'.format(hardware_family, runtime_type))
+ base_variants.append(u'{}-{}'.format(IOSPort.port_name, runtime_type))
if hardware_family and hardware_type:
- base_variants.append('{}-{}'.format(hardware_family, hardware_type))
+ base_variants.append(u'{}-{}'.format(hardware_family, hardware_type))
if hardware_family:
base_variants.append(hardware_family)
base_variants.append(IOSPort.port_name)
@@ -92,15 +92,15 @@
apple_name = VersionNameMap.map(self.host.platform).to_name(version, platform=IOSPort.port_name, table=INTERNAL_TABLE)
if apple_name:
- expectations.append(self._apple_baseline_path('{}-{}-{}'.format(variant, apple_name.lower().replace(' ', ''), wk_string)))
- expectations.append(self._webkit_baseline_path('{}-{}-{}'.format(variant, version.major, wk_string)))
+ expectations.append(self._apple_baseline_path(u'{}-{}-{}'.format(variant, apple_name.lower().replace(' ', ''), wk_string)))
+ expectations.append(self._webkit_baseline_path(u'{}-{}-{}'.format(variant, version.major, wk_string)))
if apple_name:
- expectations.append(self._apple_baseline_path('{}-{}'.format(variant, apple_name.lower().replace(' ', ''))))
- expectations.append(self._webkit_baseline_path('{}-{}'.format(variant, version.major)))
+ expectations.append(self._apple_baseline_path(u'{}-{}'.format(variant, apple_name.lower().replace(' ', ''))))
+ expectations.append(self._webkit_baseline_path(u'{}-{}'.format(variant, version.major)))
if apple_additions():
- expectations.append(self._apple_baseline_path('{}-{}'.format(variant, wk_string)))
- expectations.append(self._webkit_baseline_path('{}-{}'.format(variant, wk_string)))
+ expectations.append(self._apple_baseline_path(u'{}-{}'.format(variant, wk_string)))
+ expectations.append(self._webkit_baseline_path(u'{}-{}'.format(variant, wk_string)))
if apple_additions():
expectations.append(self._apple_baseline_path(variant))
expectations.append(self._webkit_baseline_path(variant))
Modified: trunk/Tools/Scripts/webkitpy/xcode/device_type.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/xcode/device_type.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/xcode/device_type.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -115,9 +115,9 @@
elif self.software_version:
version = VersionNameMap.map().to_name(self.software_version, platform=self.software_variant.lower())
- return '{hardware_family}{hardware_type} running {version}'.format(
+ return u'{hardware_family}{hardware_type} running {version}'.format(
hardware_family=self.hardware_family if self.hardware_family else 'Device',
- hardware_type=' {}'.format(self.hardware_type) if self.hardware_type else '',
+ hardware_type=u' {}'.format(self.hardware_type) if self.hardware_type else '',
version=version or self.software_variant,
)
Modified: trunk/Tools/Scripts/webkitpy/xcode/simulated_device.py (248269 => 248270)
--- trunk/Tools/Scripts/webkitpy/xcode/simulated_device.py 2019-08-05 16:26:00 UTC (rev 248269)
+++ trunk/Tools/Scripts/webkitpy/xcode/simulated_device.py 2019-08-05 16:42:24 UTC (rev 248270)
@@ -124,7 +124,7 @@
return
try:
- simctl_json = json.loads(host.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'list', '--json']))
+ simctl_json = json.loads(host.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'list', '--json'], decode_output=False))
except (ValueError, ScriptError):
return
@@ -184,7 +184,7 @@
def _find_available_name(name_base):
created_index = 0
while True:
- name = '{} {}'.format(name_base, created_index)
+ name = u'{} {}'.format(name_base, created_index)
created_index += 1
for device in SimulatedDeviceManager.INITIALIZED_DEVICES:
if device is None:
@@ -240,7 +240,7 @@
@staticmethod
def _get_device_identifier_for_type(device_type):
for type_id, type_name in SimulatedDeviceManager._device_identifier_to_name.iteritems():
- if type_name.lower() == '{} {}'.format(device_type.hardware_family.lower(), device_type.hardware_type.lower()):
+ if type_name.lower() == u'{} {}'.format(device_type.hardware_family.lower(), device_type.hardware_type.lower()):
return type_id
return None
@@ -265,7 +265,7 @@
device.platform_device._delete()
break
- _log.debug("Creating device '{}', of type {}".format(name, device_type))
+ _log.debug(u"Creating device '{}', of type {}".format(name, device_type))
host.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'create', name, device_identifier, runtime.identifier])
# We just added a device, so our list of _available_devices needs to be re-synced.
@@ -286,7 +286,7 @@
if not request.use_booted_simulator:
continue
if request.device_type == device.device_type:
- _log.debug("The request for '{}' matched {} exactly".format(request.device_type, device))
+ _log.debug(u"The request for '{}' matched {} exactly".format(request.device_type, device))
return request
# Contained-in match.
@@ -294,7 +294,7 @@
if not request.use_booted_simulator:
continue
if device.device_type in request.device_type:
- _log.debug("The request for '{}' fuzzy-matched {}".format(request.device_type, device))
+ _log.debug(u"The request for '{}' fuzzy-matched {}".format(request.device_type, device))
return request
# DeviceRequests are compared by reference
@@ -307,8 +307,8 @@
if not request.use_booted_simulator or not request.allow_incomplete_match:
continue
if request.device_type.software_variant == device.device_type.software_variant:
- _log.warn("The request for '{}' incomplete-matched {}".format(request.device_type, device))
- _log.warn("This may cause unexpected behavior in code that expected the device type {}".format(request.device_type))
+ _log.warn(u"The request for '{}' incomplete-matched {}".format(request.device_type, device))
+ _log.warn(u"This may cause unexpected behavior in code that expected the device type {}".format(request.device_type))
return request
return None
@@ -315,7 +315,7 @@
@staticmethod
def _wait_until_device_in_state(device, state, deadline):
while device.platform_device.state(force_update=True) != state:
- _log.debug('Waiting on {} to enter state {}...'.format(device, SimulatedDevice.NAME_FOR_STATE[state]))
+ _log.debug(u'Waiting on {} to enter state {}...'.format(device, SimulatedDevice.NAME_FOR_STATE[state]))
time.sleep(1)
if time.time() > deadline:
raise RuntimeError('Timed out while waiting for all devices to boot')
@@ -322,15 +322,15 @@
@staticmethod
def _wait_until_device_is_usable(device, deadline):
- _log.debug('Waiting until {} is usable'.format(device))
+ _log.debug(u'Waiting until {} is usable'.format(device))
while not device.platform_device.is_usable(force_update=True):
if time.time() > deadline:
- raise RuntimeError('Timed out while waiting for {} to become usable'.format(device))
+ raise RuntimeError(u'Timed out while waiting for {} to become usable'.format(device))
time.sleep(1)
@staticmethod
def _boot_device(device, host=SystemHost()):
- _log.debug("Booting device '{}'".format(device.udid))
+ _log.debug(u"Booting device '{}'".format(device.udid))
device.platform_device.booted_by_script = True
host.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'boot', device.udid])
SimulatedDeviceManager.INITIALIZED_DEVICES.append(device)
@@ -370,7 +370,7 @@
if matched_request is None:
continue
requests.remove(matched_request)
- _log.debug('Attached to running simulator {}'.format(device))
+ _log.debug(u'Attached to running simulator {}'.format(device))
SimulatedDeviceManager.INITIALIZED_DEVICES.append(device)
# DeviceRequests are compared by reference
@@ -413,7 +413,7 @@
try:
system_process_count_limit = int(host.executive.run_command(['/usr/bin/ulimit', '-u']).strip())
current_process_count = len(host.executive.run_command(['/bin/ps', 'aux']).strip().split('\n'))
- _log.debug('Process limit: {}, current #processes: {}'.format(system_process_count_limit, current_process_count))
+ _log.debug(u'Process limit: {}, current #processes: {}'.format(system_process_count_limit, current_process_count))
except (ValueError, ScriptError):
return 0
@@ -421,7 +421,7 @@
max_supported_simulators_locally = (system_process_count_limit - current_process_count) // SimulatedDeviceManager.PROCESS_COUNT_ESTIMATE_PER_SIMULATOR_INSTANCE
if (max_supported_simulators_locally < max_supported_simulators_for_hardware):
- _log.warn('This machine could support {} simulators, but is only configured for {}.'.format(max_supported_simulators_for_hardware, max_supported_simulators_locally))
+ _log.warn(u'This machine could support {} simulators, but is only configured for {}.'.format(max_supported_simulators_for_hardware, max_supported_simulators_locally))
_log.warn('Please see <https://trac.webkit.org/wiki/IncreasingKernelLimits>.')
if max_supported_simulators_locally == 0:
@@ -434,7 +434,7 @@
if SimulatedDeviceManager.INITIALIZED_DEVICES is None:
raise RuntimeError('Cannot swap when there are no initialized devices')
if device not in SimulatedDeviceManager.INITIALIZED_DEVICES:
- raise RuntimeError('{} is not initialized, cannot swap it'.format(device))
+ raise RuntimeError(u'{} is not initialized, cannot swap it'.format(device))
index = SimulatedDeviceManager.INITIALIZED_DEVICES.index(device)
SimulatedDeviceManager.INITIALIZED_DEVICES[index] = None
@@ -445,7 +445,7 @@
if not device.platform_device.is_booted_or_booting(force_update=True):
device.platform_device.booted_by_script = True
- _log.debug("Booting device '{}'".format(device.udid))
+ _log.debug(u"Booting device '{}'".format(device.udid))
host.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'boot', device.udid])
SimulatedDeviceManager.INITIALIZED_DEVICES[index] = device
@@ -531,7 +531,7 @@
elif self.device_type.software_variant == 'watchOS':
home_screen_service = 'com.apple.carousel.sessionservice'
else:
- _log.debug('{} has no service to check if the device is usable'.format(self.device_type.software_variant))
+ _log.debug(u'{} has no service to check if the device is usable'.format(self.device_type.software_variant))
return True
for line in self.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'spawn', self.udid, 'launchctl', 'print', 'system'], decode_output=False).splitlines():
@@ -545,17 +545,17 @@
# Either shutdown is successful, or the device was already shutdown when we attempted to shut it down.
exit_code = self.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'shutdown', self.udid], return_exit_code=True)
if exit_code != 0 and self.state() != SimulatedDevice.DeviceState.SHUT_DOWN:
- raise RuntimeError('Failed to shutdown {} with exit code {}'.format(self.udid, exit_code))
+ raise RuntimeError(u'Failed to shutdown {} with exit code {}'.format(self.udid, exit_code))
while self.state(force_update=True) != SimulatedDevice.DeviceState.SHUT_DOWN:
time.sleep(.5)
if time.time() > deadline:
- raise RuntimeError('Timed out while waiting for {} to shut down'.format(self.udid))
+ raise RuntimeError(u'Timed out while waiting for {} to shut down'.format(self.udid))
def _delete(self, timeout=10.0):
deadline = time.time() + timeout
self._shut_down(deadline - time.time())
- _log.debug("Removing device '{}'".format(self.name))
+ _log.debug(u"Removing device '{}'".format(self.name))
self.executive.run_command([SimulatedDeviceManager.xcrun, 'simctl', 'delete', self.udid])
# This will (by design) fail if run more than once on the same SimulatedDevice
@@ -603,7 +603,7 @@
output = None
- with Timeout(timeout, RuntimeError('Timed out waiting for process to open {} on {}'.format(bundle_id, self.udid))):
+ with Timeout(timeout, RuntimeError(u'Timed out waiting for process to open {} on {}'.format(bundle_id, self.udid))):
while True:
output = self.executive.run_command(
['xcrun', 'simctl', 'launch', self.udid, bundle_id] + args,
@@ -615,13 +615,13 @@
if match and self.executive.check_running_pid(int(match.group('pid'))):
break
if match:
- _log.debug('simctl launch reported pid {}, but this process is not running'.format(match.group('pid')))
+ _log.debug(u'simctl launch reported pid {}, but this process is not running'.format(match.group('pid')))
else:
_log.debug('simctl launch did not report a pid')
if match.group('bundle') != bundle_id:
- raise RuntimeError('Failed to find process id for {}: {}'.format(bundle_id, output))
- _log.debug('Returning pid {} of launched process'.format(match.group('pid')))
+ raise RuntimeError(u'Failed to find process id for {}: {}'.format(bundle_id, output))
+ _log.debug(u'Returning pid {} of launched process'.format(match.group('pid')))
return int(match.group('pid'))
def __eq__(self, other):
@@ -631,7 +631,7 @@
return not self.__eq__(other)
def __repr__(self):
- return '<Device "{name}": {udid}. State: {state}. Type: {type}>'.format(
+ return u'<Device "{name}": {udid}. State: {state}. Type: {type}>'.format(
name=self.name,
udid=self.udid,
state=SimulatedDevice.NAME_FOR_STATE[self.state()],
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes