WebKit Bugzilla
Attachment 348693 Details for
Bug 187773
: Add Web API Statistics Collection
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-187773-20180831175509.patch (text/plain), 113.77 KB, created by
Woodrow Wang
on 2018-08-31 17:55:10 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Woodrow Wang
Created:
2018-08-31 17:55:10 PDT
Size:
113.77 KB
patch
obsolete
>Subversion Revision: 235561 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 4d5e2e36ff39eb349b80e45070cd2547f9139fdc..346e1151714e642db8eea5e308d765a861c3c663 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,15 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new flag ENABLE_WEB_API_STATISTICS to wrap all code in compile time flags for when >+ we would like to collect various web API statistics for analysis. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ > 2018-08-31 Mark Lam <mark.lam@apple.com> > > Fix exception check accounting in constructJSWebAssemblyCompileError(). >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 4b8cbc070ac2bf05988c9e301c04b20093165c99..64ab88b166f92703368a91c788ccce68dff72ac3 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,113 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new flag ENABLE_WEB_API_STATISTICS to wrap all code in compile time flags for when >+ we would like to collect various web API statistics for analysis. >+ >+ Added data collection for web API statistics, specifically regarding the canvas, font loads, >+ screen functions, and navigator functions. All of the code is placed under the compile time flag >+ ENABLE_WEB_API_STATISTICS. The statistics are stored in a ResourceLoadStatistics object and written >+ to a plist on disk. Added a new file CanvasActivityRecord.h and CanvasActivityRecord.cpp which >+ includes a struct to keep track of HTML5 canvas element read and writes. >+ >+ Tests: http/tests/webAPIStatistics/canvas-read-and-write-data-collection.html >+ http/tests/webAPIStatistics/font-load-data-collection.html >+ http/tests/webAPIStatistics/navigator-functions-accessed-data-collection.html >+ http/tests/webAPIStatistics/screen-functions-accessed-data-collection.html >+ >+ * Configurations/FeatureDefines.xcconfig: >+ * WebCore.xcodeproj/project.pbxproj: >+ * css/CSSFontFaceSource.cpp: >+ (WebCore::CSSFontFaceSource::load): >+ * css/CSSFontSelector.cpp: >+ (WebCore::CSSFontSelector::fontRangesForFamily): >+ (WebCore::CSSFontSelector::fallbackFontAt): >+ >+ The following are the functions where we'd like to record a canvas read. >+ >+ * html/HTMLCanvasElement.cpp: >+ (WebCore::HTMLCanvasElement::toDataURL): >+ (WebCore::HTMLCanvasElement::toBlob): >+ (WebCore::HTMLCanvasElement::getImageData): >+ (WebCore::HTMLCanvasElement::toMediaSample): >+ (WebCore::HTMLCanvasElement::captureStream): >+ >+ The following are the functions where we'd like to record a canvas write. >+ >+ * html/canvas/CanvasRenderingContext2D.cpp: >+ (WebCore::CanvasRenderingContext2D::measureText): >+ (WebCore::CanvasRenderingContext2D::drawTextInternal): >+ >+ The following files and functions handle the CanvasActivityRecord struct and >+ its respective functions. >+ >+ * loader/CanvasActivityRecord.cpp: Added. >+ (WebCore::CanvasActivityRecord::recordWrittenOrMeasuredText): >+ (WebCore::CanvasActivityRecord::mergeWith): >+ * loader/CanvasActivityRecord.h: Added. >+ (WebCore::CanvasActivityRecord::encode const): >+ (WebCore::CanvasActivityRecord::decode): >+ >+ * loader/ResourceLoadObserver.cpp: >+ (WebCore::ResourceLoadObserver::logFontLoad): >+ (WebCore::ResourceLoadObserver::logCanvasRead): >+ (WebCore::ResourceLoadObserver::logCanvasWriteOrMeasure): >+ (WebCore::ResourceLoadObserver::logNavigatorAPIAccessed): >+ (WebCore::ResourceLoadObserver::logScreenAPIAccessed): >+ >+ Before, entries in the ResourceLoadStatistics involving HashSets used "origin" as the key. >+ Now the encodeHashSet function has been generalized to take any key to encode the entries >+ in the HashSet. Also added functionality to encode an OptionSet by converting it to its >+ raw bitmask state. >+ >+ * loader/ResourceLoadObserver.h: >+ * loader/ResourceLoadStatistics.cpp: >+ (WebCore::encodeHashSet): >+ (WebCore::encodeOriginHashSet): >+ (WebCore::encodeOptionSet): >+ (WebCore::encodeFontHashSet): >+ (WebCore::encodeCanvasActivityRecord): >+ (WebCore::ResourceLoadStatistics::encode const): >+ (WebCore::decodeHashSet): >+ (WebCore::decodeOriginHashSet): >+ (WebCore::decodeOptionSet): >+ (WebCore::decodeFontHashSet): >+ (WebCore::decodeCanvasActivityRecord): >+ (WebCore::ResourceLoadStatistics::decode): >+ (WebCore::navigatorEnumToString): >+ (WebCore::screenEnumToString): >+ (WebCore::appendNavigatorOptionSet): >+ (WebCore::appendScreenOptionSet): >+ (WebCore::ResourceLoadStatistics::toString const): >+ (WebCore::ResourceLoadStatistics::merge): >+ * loader/ResourceLoadStatistics.h: >+ >+ The following are the navigator functions recorded for the web API statistics. >+ >+ * page/Navigator.cpp: >+ (WebCore::Navigator::appVersion const): >+ (WebCore::Navigator::userAgent const): >+ (WebCore::Navigator::plugins): >+ (WebCore::Navigator::mimeTypes): >+ (WebCore::Navigator::cookieEnabled const): >+ (WebCore::Navigator::javaEnabled const): >+ >+ The following are the screen functions recorded for the web API statistics. >+ >+ * page/Screen.cpp: >+ (WebCore::Screen::height const): >+ (WebCore::Screen::width const): >+ (WebCore::Screen::colorDepth const): >+ (WebCore::Screen::pixelDepth const): >+ (WebCore::Screen::availLeft const): >+ (WebCore::Screen::availTop const): >+ (WebCore::Screen::availHeight const): >+ (WebCore::Screen::availWidth const): >+ > 2018-08-31 Woodrow Wang <woodrow_wang@apple.com> > > Added functionality to encode and decode a uint64_t in KeyedCoding. >diff --git a/Source/WebCore/PAL/ChangeLog b/Source/WebCore/PAL/ChangeLog >index e695f7a594990c43e0bfb56dc806670f2f6eb4bd..a15a110ed6c289a6028239835fc7e93f1889fa58 100644 >--- a/Source/WebCore/PAL/ChangeLog >+++ b/Source/WebCore/PAL/ChangeLog >@@ -1,3 +1,15 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new flag ENABLE_WEB_API_STATISTICS to wrap all code in compile time flags for when >+ we would like to collect various web API statistics for analysis. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ > 2018-08-30 Don Olmstead <don.olmstead@sony.com> > > [CMake] Replace AVFoundationSupport.py using CMake >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 2088cb0473e5631d95f3d11594e6f09be11bdd44..6a633bafd2162a9f2622d8172814073eb7e1d07b 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,19 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new flag ENABLE_WEB_API_STATISTICS to wrap all code in compile time flags for when >+ we would like to collect various web API statistics for analysis. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ * Shared/WebCoreArgumentCoders.cpp: >+ (IPC::ArgumentCoder<ResourceLoadStatistics>::encode): >+ (IPC::ArgumentCoder<ResourceLoadStatistics>::decode): >+ * UIProcess/ResourceLoadStatisticsMemoryStore.cpp: >+ > 2018-08-31 Woodrow Wang <woodrow_wang@apple.com> > > Added dumping function for testing resource load statistics >diff --git a/Source/WebKitLegacy/mac/ChangeLog b/Source/WebKitLegacy/mac/ChangeLog >index e0c685c01be426f4569c2c49f9ad2e8ba318ff0d..06bc19c80599678e79b8a48494e9009c8f3bf07c 100644 >--- a/Source/WebKitLegacy/mac/ChangeLog >+++ b/Source/WebKitLegacy/mac/ChangeLog >@@ -1,3 +1,15 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new flag ENABLE_WEB_API_STATISTICS to wrap all code in compile time flags for when >+ we would like to collect various web API statistics for analysis. >+ >+ * Configurations/FeatureDefines.xcconfig: >+ > 2018-08-31 Antti Koivisto <antti@apple.com> > > Replace OptionSet |= and -= operators with add() and remove() functions >diff --git a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig b/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig >index dfa4a259773f597db7eae6005dd81beb3d68de87..75739d69e14f4e5fd9c08781c0b9fc7e65cfaaa1 100644 >--- a/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig >+++ b/Source/JavaScriptCore/Configurations/FeatureDefines.xcconfig >@@ -358,6 +358,8 @@ ENABLE_WEBGPU_watchos = ENABLE_WEBGPU; > ENABLE_WEBGPU_appletvos = ENABLE_WEBGPU; > ENABLE_WEBGPU_macosx = ENABLE_WEBGPU; > >+ENABLE_WEB_API_STATISTICS = ENABLE_WEB_API_STATISTICS; >+ > ENABLE_WEB_AUDIO = ENABLE_WEB_AUDIO; > > ENABLE_WEB_AUTHN = $(ENABLE_WEB_AUTHN_$(WK_PLATFORM_NAME)); >@@ -374,4 +376,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebCore/Configurations/FeatureDefines.xcconfig b/Source/WebCore/Configurations/FeatureDefines.xcconfig >index dfa4a259773f597db7eae6005dd81beb3d68de87..75739d69e14f4e5fd9c08781c0b9fc7e65cfaaa1 100644 >--- a/Source/WebCore/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebCore/Configurations/FeatureDefines.xcconfig >@@ -358,6 +358,8 @@ ENABLE_WEBGPU_watchos = ENABLE_WEBGPU; > ENABLE_WEBGPU_appletvos = ENABLE_WEBGPU; > ENABLE_WEBGPU_macosx = ENABLE_WEBGPU; > >+ENABLE_WEB_API_STATISTICS = ENABLE_WEB_API_STATISTICS; >+ > ENABLE_WEB_AUDIO = ENABLE_WEB_AUDIO; > > ENABLE_WEB_AUTHN = $(ENABLE_WEB_AUTHN_$(WK_PLATFORM_NAME)); >@@ -374,4 +376,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig b/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig >index dfa4a259773f597db7eae6005dd81beb3d68de87..75739d69e14f4e5fd9c08781c0b9fc7e65cfaaa1 100644 >--- a/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebCore/PAL/Configurations/FeatureDefines.xcconfig >@@ -358,6 +358,8 @@ ENABLE_WEBGPU_watchos = ENABLE_WEBGPU; > ENABLE_WEBGPU_appletvos = ENABLE_WEBGPU; > ENABLE_WEBGPU_macosx = ENABLE_WEBGPU; > >+ENABLE_WEB_API_STATISTICS = ENABLE_WEB_API_STATISTICS; >+ > ENABLE_WEB_AUDIO = ENABLE_WEB_AUDIO; > > ENABLE_WEB_AUTHN = $(ENABLE_WEB_AUTHN_$(WK_PLATFORM_NAME)); >@@ -374,4 +376,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 3c65e976a7ae442504580519fcb2babdc165208c..d617fa2ed8b86411a59cfb6432c11d6803ecebcc 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -4802,6 +4802,8 @@ > ED2BA83C09A24B91006C0AC4 /* DocumentMarker.h in Headers */ = {isa = PBXBuildFile; fileRef = ED2BA83B09A24B91006C0AC4 /* DocumentMarker.h */; settings = {ATTRIBUTES = (Private, ); }; }; > EDE3A5000C7A430600956A37 /* ColorMac.h in Headers */ = {isa = PBXBuildFile; fileRef = EDE3A4FF0C7A430600956A37 /* ColorMac.h */; settings = {ATTRIBUTES = (Private, ); }; }; > EDEC98030AED7E170059137F /* WebCorePrefix.h in Headers */ = {isa = PBXBuildFile; fileRef = EDEC98020AED7E170059137F /* WebCorePrefix.h */; }; >+ EFB728812124CA38005C2558 /* CanvasActivityRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EFB7287B2124C73D005C2558 /* CanvasActivityRecord.cpp */; }; >+ EFCC6C8F20FE914400A2321B /* CanvasActivityRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = EFCC6C8D20FE914000A2321B /* CanvasActivityRecord.h */; settings = {ATTRIBUTES = (Private, ); }; }; > F12171F516A8CED2000053CA /* WebVTTElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F12171F316A8BC63000053CA /* WebVTTElement.cpp */; }; > F12171F616A8CF0B000053CA /* WebVTTElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F12171F416A8BC63000053CA /* WebVTTElement.h */; }; > F344C7141125B82C00F26EEE /* InspectorFrontendClient.h in Headers */ = {isa = PBXBuildFile; fileRef = F344C7121125B82C00F26EEE /* InspectorFrontendClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -14453,6 +14455,8 @@ > ED501DC50B249F2900AE18D9 /* EditorMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = EditorMac.mm; sourceTree = "<group>"; }; > EDE3A4FF0C7A430600956A37 /* ColorMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorMac.h; sourceTree = "<group>"; }; > EDEC98020AED7E170059137F /* WebCorePrefix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebCorePrefix.h; sourceTree = "<group>"; tabWidth = 4; usesTabs = 0; }; >+ EFB7287B2124C73D005C2558 /* CanvasActivityRecord.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CanvasActivityRecord.cpp; sourceTree = "<group>"; }; >+ EFCC6C8D20FE914000A2321B /* CanvasActivityRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanvasActivityRecord.h; sourceTree = "<group>"; }; > F12171F316A8BC63000053CA /* WebVTTElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebVTTElement.cpp; sourceTree = "<group>"; }; > F12171F416A8BC63000053CA /* WebVTTElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebVTTElement.h; sourceTree = "<group>"; }; > F344C7121125B82C00F26EEE /* InspectorFrontendClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorFrontendClient.h; sourceTree = "<group>"; }; >@@ -24141,6 +24145,8 @@ > 93A1EAA20A5634D8006960A0 /* mac */, > 63152D181F9531EE007A5E4B /* ApplicationManifestLoader.cpp */, > 63152D171F9531EE007A5E4B /* ApplicationManifestLoader.h */, >+ EFB7287B2124C73D005C2558 /* CanvasActivityRecord.cpp */, >+ EFCC6C8D20FE914000A2321B /* CanvasActivityRecord.h */, > A149786C1ABAF33800CEF7E4 /* ContentFilter.cpp */, > A149786D1ABAF33800CEF7E4 /* ContentFilter.h */, > E1424C91164B52C800F32D40 /* CookieJar.cpp */, >@@ -27222,6 +27228,7 @@ > 7C1E8D011ED0C2DA00B1D983 /* CallbackResult.h in Headers */, > 952076051F2675FE007D2AAB /* CallTracer.h in Headers */, > 952076061F2675FE007D2AAB /* CallTracerTypes.h in Headers */, >+ EFCC6C8F20FE914400A2321B /* CanvasActivityRecord.h in Headers */, > 313171561FB079E5008D91FC /* CanvasBase.h in Headers */, > 415CDAF51E6B8F8B004F11EE /* CanvasCaptureMediaStreamTrack.h in Headers */, > 7C193BBB1F5E0EED0088F3E6 /* CanvasDirection.h in Headers */, >@@ -31355,6 +31362,7 @@ > 070363E7181A1CDC00C074A5 /* AVVideoCaptureSource.mm in Sources */, > 7A45032F18DB717200377B34 /* BufferedLineReader.cpp in Sources */, > 0753860214489E9800B78452 /* CachedTextTrack.cpp in Sources */, >+ EFB728812124CA38005C2558 /* CanvasActivityRecord.cpp in Sources */, > CDF4B7151E00B7E500E235A2 /* CDM.cpp in Sources */, > CD94A5DD1F71D5D800F525C5 /* CDMClearKey.cpp in Sources */, > CDB7045B1F7465A1003923DF /* CDMFairPlayStreaming.cpp in Sources */, >diff --git a/Source/WebCore/css/CSSFontFaceSource.cpp b/Source/WebCore/css/CSSFontFaceSource.cpp >index 4d603b5769587cad4cd6669ad2a65ba37baeb8e8..4f532d69d3cc31531ee4c5369cd8237cfe73946e 100644 >--- a/Source/WebCore/css/CSSFontFaceSource.cpp >+++ b/Source/WebCore/css/CSSFontFaceSource.cpp >@@ -37,6 +37,10 @@ > #include "SVGToOTFFontConversion.h" > #include "SharedBuffer.h" > >+#if ENABLE(WEB_API_STATISTICS) >+#include "ResourceLoadObserver.h" >+#endif >+ > #if ENABLE(SVG_FONTS) > #include "CachedSVGFont.h" > #include "FontCustomPlatformData.h" >@@ -181,6 +185,10 @@ void CSSFontFaceSource::load(CSSFontSelector* fontSelector) > fontDescription.setComputedSize(1); > fontDescription.setShouldAllowUserInstalledFonts(m_face.allowUserInstalledFonts()); > success = FontCache::singleton().fontForFamily(fontDescription, m_familyNameOrURI, nullptr, nullptr, FontSelectionSpecifiedCapabilities(), true); >+#if ENABLE(WEB_API_STATISTICS) >+ if (auto document = fontSelector->document()) >+ ResourceLoadObserver::shared().logFontLoad(*document, m_familyNameOrURI.string(), success); >+#endif > } > setStatus(success ? Status::Success : Status::Failure); > } >diff --git a/Source/WebCore/css/CSSFontSelector.cpp b/Source/WebCore/css/CSSFontSelector.cpp >index 9ad88a2a4df62a851786c0f34a9541d0a3cffdcc..a1bfa0d844d4f97e123781590be03edb114a8efc 100644 >--- a/Source/WebCore/css/CSSFontSelector.cpp >+++ b/Source/WebCore/css/CSSFontSelector.cpp >@@ -54,6 +54,10 @@ > #include <wtf/SetForScope.h> > #include <wtf/text/AtomicString.h> > >+#if ENABLE(WEB_API_STATISTICS) >+#include "ResourceLoadObserver.h" >+#endif >+ > namespace WebCore { > > static unsigned fontSelectorId; >@@ -304,13 +308,22 @@ FontRanges CSSFontSelector::fontRangesForFamily(const FontDescription& fontDescr > > AtomicString familyForLookup = resolveGenericFamilyFirst ? resolveGenericFamily(m_document, fontDescription, familyName) : familyName; > auto* face = m_cssFontFaceSet->fontFace(fontDescription.fontSelectionRequest(), familyForLookup); >- if (!face) { >- if (!resolveGenericFamilyFirst) >- familyForLookup = resolveGenericFamily(m_document, fontDescription, familyName); >- return FontRanges(FontCache::singleton().fontForFamily(fontDescription, familyForLookup)); >+ if (face) { >+#if ENABLE(WEB_API_STATISTICS) >+ // This logs an attempted font load by setting the loadStatus boolean to true >+ if (m_document) >+ ResourceLoadObserver::shared().logFontLoad(*m_document, familyName.string(), true); >+#endif >+ return face->fontRanges(fontDescription); > } >- >- return face->fontRanges(fontDescription); >+ if (!resolveGenericFamilyFirst) >+ familyForLookup = resolveGenericFamily(m_document, fontDescription, familyName); >+ auto font = FontCache::singleton().fontForFamily(fontDescription, familyForLookup); >+#if ENABLE(WEB_API_STATISTICS) >+ if (m_document) >+ ResourceLoadObserver::shared().logFontLoad(*m_document, familyName.string(), !!font); >+#endif >+ return FontRanges { WTFMove(font) }; > } > > void CSSFontSelector::clearDocument() >@@ -390,8 +403,13 @@ RefPtr<Font> CSSFontSelector::fallbackFontAt(const FontDescription& fontDescript > > if (!m_document->settings().fontFallbackPrefersPictographs()) > return nullptr; >- >- return FontCache::singleton().fontForFamily(fontDescription, m_document->settings().pictographFontFamily()); >+ RefPtr<Font> font = FontCache::singleton().fontForFamily(fontDescription, m_document->settings().pictographFontFamily()); >+#if ENABLE(WEB_API_STATISTICS) >+ if (m_document) >+ ResourceLoadObserver::shared().logFontLoad(*m_document, m_document->settings().pictographFontFamily().string(), !!font); >+#endif >+ >+ return font; > } > > } >diff --git a/Source/WebCore/html/HTMLCanvasElement.cpp b/Source/WebCore/html/HTMLCanvasElement.cpp >index 6298643a2d96092a4cfee988dd28b6d937c5da73..a564f80ea60e14eea009c23fbd91f5f6f4d186d3 100644 >--- a/Source/WebCore/html/HTMLCanvasElement.cpp >+++ b/Source/WebCore/html/HTMLCanvasElement.cpp >@@ -64,6 +64,10 @@ > #include "MediaStream.h" > #endif > >+#if ENABLE(WEB_API_STATISTICS) >+#include "ResourceLoadObserver.h" >+#endif >+ > #if ENABLE(WEBGL) > #include "WebGLContextAttributes.h" > #include "WebGLRenderingContext.h" >@@ -698,6 +702,9 @@ ExceptionOr<UncachedString> HTMLCanvasElement::toDataURL(const String& mimeType, > > if (m_size.isEmpty() || !buffer()) > return UncachedString { "data:,"_s }; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logCanvasRead(document()); >+#endif > > auto encodingMIMEType = toEncodingMimeType(mimeType); > auto quality = qualityFromJSValue(qualityValue); >@@ -727,6 +734,9 @@ ExceptionOr<void> HTMLCanvasElement::toBlob(ScriptExecutionContext& context, Ref > callback->scheduleCallback(context, nullptr); > return { }; > } >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logCanvasRead(document()); >+#endif > > auto encodingMIMEType = toEncodingMimeType(mimeType); > auto quality = qualityFromJSValue(qualityValue); >@@ -755,8 +765,12 @@ ExceptionOr<void> HTMLCanvasElement::toBlob(ScriptExecutionContext& context, Ref > RefPtr<ImageData> HTMLCanvasElement::getImageData() > { > #if ENABLE(WEBGL) >- if (is<WebGLRenderingContextBase>(m_context.get())) >+ if (is<WebGLRenderingContextBase>(m_context.get())) { >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logCanvasRead(document()); >+#endif > return downcast<WebGLRenderingContextBase>(*m_context).paintRenderingResultsToImageData(); >+ } > #endif > return nullptr; > } >@@ -768,6 +782,9 @@ RefPtr<MediaSample> HTMLCanvasElement::toMediaSample() > auto* imageBuffer = buffer(); > if (!imageBuffer) > return nullptr; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logCanvasRead(document()); >+#endif > > #if PLATFORM(COCOA) > makeRenderingResultsAvailable(); >@@ -781,6 +798,9 @@ ExceptionOr<Ref<MediaStream>> HTMLCanvasElement::captureStream(ScriptExecutionCo > { > if (!originClean()) > return Exception(SecurityError, "Canvas is tainted"_s); >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logCanvasRead(document()); >+#endif > > if (frameRequestRate && frameRequestRate.value() < 0) > return Exception(NotSupportedError, "frameRequestRate is negative"_s); >diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp >index e27d95194819b02e9414d49bfa8faff2ea1761de..88860497462a249293d4969effa6bed0008a4c31 100644 >--- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp >+++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp >@@ -49,6 +49,10 @@ > #include <wtf/MathExtras.h> > #include <wtf/text/StringBuilder.h> > >+#if ENABLE(WEB_API_STATISTICS) >+#include "ResourceLoadObserver.h" >+#endif >+ > namespace WebCore { > > using namespace HTMLNames; >@@ -363,6 +367,12 @@ static void normalizeSpaces(String& text) > > Ref<TextMetrics> CanvasRenderingContext2D::measureText(const String& text) > { >+#if ENABLE(WEB_API_STATISTICS) >+ HTMLCanvasElement& canvas = this->canvas(); >+ ResourceLoadObserver::shared().logCanvasWriteOrMeasure(canvas.document(), text); >+ ResourceLoadObserver::shared().logCanvasRead(canvas.document()); >+#endif >+ > Ref<TextMetrics> metrics = TextMetrics::create(); > > String normalizedText = text; >@@ -451,6 +461,11 @@ FloatPoint CanvasRenderingContext2D::textOffset(float width, TextDirection direc > > void CanvasRenderingContext2D::drawTextInternal(const String& text, float x, float y, bool fill, std::optional<float> maxWidth) > { >+#if ENABLE(WEB_API_STATISTICS) >+ HTMLCanvasElement& canvas = this->canvas(); >+ ResourceLoadObserver::shared().logCanvasWriteOrMeasure(canvas.document(), text); >+#endif >+ > auto& fontProxy = this->fontProxy(); > const auto& fontMetrics = fontProxy.fontMetrics(); > >diff --git a/Source/WebCore/loader/CanvasActivityRecord.cpp b/Source/WebCore/loader/CanvasActivityRecord.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..c4f78723168cc53b38b401c2d5080bb08da06189 >--- /dev/null >+++ b/Source/WebCore/loader/CanvasActivityRecord.cpp >@@ -0,0 +1,46 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "CanvasActivityRecord.h" >+ >+const unsigned textCapacity = 10; >+namespace WebCore { >+bool CanvasActivityRecord::recordWrittenOrMeasuredText(const String& text) >+{ >+ // We limit the size of the textWritten HashSet to save memory and prevent bloating >+ // the plist with the resourceLoadStatistics entries. A few strings is often enough >+ // to provide sufficient information about the state of canvas activity. >+ if (textWritten.size() < textCapacity && textWritten.add(text).isNewEntry) >+ return true; >+ return false; >+} >+ >+void CanvasActivityRecord::mergeWith(const CanvasActivityRecord& otherCanvasActivityRecord) >+{ >+ textWritten.add(otherCanvasActivityRecord.textWritten.begin(), otherCanvasActivityRecord.textWritten.end()); >+ wasDataRead |= otherCanvasActivityRecord.wasDataRead; >+} >+} // namespace WebCore >diff --git a/Source/WebCore/loader/CanvasActivityRecord.h b/Source/WebCore/loader/CanvasActivityRecord.h >new file mode 100644 >index 0000000000000000000000000000000000000000..1e13f48cba6d2c83f0e7a30f3d361950bc124e51 >--- /dev/null >+++ b/Source/WebCore/loader/CanvasActivityRecord.h >@@ -0,0 +1,59 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+#include <wtf/HashSet.h> >+#include <wtf/text/StringHash.h> >+#include <wtf/text/WTFString.h> >+ >+namespace WebCore { >+struct CanvasActivityRecord { >+ HashSet<String> textWritten; >+ bool wasDataRead { false }; >+ >+ bool recordWrittenOrMeasuredText(const String&); >+ void mergeWith(const CanvasActivityRecord&); >+ >+ template <class Encoder> void encode(Encoder&) const; >+ template <class Decoder> static bool decode(Decoder&, CanvasActivityRecord&); >+}; >+ >+template <class Encoder> >+void CanvasActivityRecord::encode(Encoder& encoder) const >+{ >+ encoder << textWritten; >+ encoder << wasDataRead; >+} >+ >+template <class Decoder> >+bool CanvasActivityRecord::decode(Decoder& decoder, CanvasActivityRecord& canvasActivityRecord) >+{ >+ if (!decoder.decode(canvasActivityRecord.textWritten)) >+ return false; >+ if (!decoder.decode(canvasActivityRecord.wasDataRead)) >+ return false; >+ return true; >+} >+} // namespace WebCore >diff --git a/Source/WebCore/loader/ResourceLoadObserver.cpp b/Source/WebCore/loader/ResourceLoadObserver.cpp >index 8d03ba06755fa4570650f4e6d9b03bb68483df3a..389cf4607a617cb12d7385437540c44a2efc7429 100644 >--- a/Source/WebCore/loader/ResourceLoadObserver.cpp >+++ b/Source/WebCore/loader/ResourceLoadObserver.cpp >@@ -242,6 +242,86 @@ void ResourceLoadObserver::requestStorageAccessUnderOpener(const String& domainI > } > #endif > >+#if ENABLE(WEB_API_STATISTICS) >+void ResourceLoadObserver::logFontLoad(const Document& document, const String& familyName, bool loadStatus) >+{ >+ if (!shouldLog(document.sessionID().isEphemeral()) || !document.frame()) >+ return; >+ auto registrableDomain = primaryDomain(document.url()); >+ auto& statistics = ensureResourceStatisticsForPrimaryDomain(registrableDomain); >+ if (!loadStatus) >+ statistics.fontsFailedToLoad.add(familyName); >+ statistics.fontsLoaded.add(familyName); >+ auto mainFrameRegistrableDomain = primaryDomain(document.frame()->mainFrame().document()->url()); >+ if (statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs.add(mainFrameRegistrableDomain).isNewEntry) >+ scheduleNotificationIfNeeded(); >+} >+ >+void ResourceLoadObserver::logCanvasRead(const Document& document) >+{ >+ if (!shouldLog(document.sessionID().isEphemeral()) || !document.frame()) >+ return; >+ auto registrableDomain = primaryDomain(document.url()); >+ auto& statistics = ensureResourceStatisticsForPrimaryDomain(registrableDomain); >+ auto mainFrameRegistrableDomain = primaryDomain(document.frame()->mainFrame().document()->url()); >+ statistics.canvasActivityRecord.wasDataRead = true; >+ if (statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs.add(mainFrameRegistrableDomain).isNewEntry) >+ scheduleNotificationIfNeeded(); >+} >+ >+void ResourceLoadObserver::logCanvasWriteOrMeasure(const Document& document, const String& textWritten) >+{ >+ if (!shouldLog(document.sessionID().isEphemeral()) || !document.frame()) >+ return; >+ auto registrableDomain = primaryDomain(document.url()); >+ auto& statistics = ensureResourceStatisticsForPrimaryDomain(registrableDomain); >+ bool shouldCallNotificationCallback = false; >+ auto mainFrameRegistrableDomain = primaryDomain(document.frame()->mainFrame().document()->url()); >+ if (statistics.canvasActivityRecord.recordWrittenOrMeasuredText(textWritten)) >+ shouldCallNotificationCallback = true; >+ if (statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs.add(mainFrameRegistrableDomain).isNewEntry) >+ shouldCallNotificationCallback = true; >+ if (shouldCallNotificationCallback) >+ scheduleNotificationIfNeeded(); >+} >+ >+void ResourceLoadObserver::logNavigatorAPIAccessed(const Document& document, const ResourceLoadStatistics::NavigatorAPI functionName) >+{ >+ if (!shouldLog(document.sessionID().isEphemeral()) || !document.frame()) >+ return; >+ auto registrableDomain = primaryDomain(document.url()); >+ auto& statistics = ensureResourceStatisticsForPrimaryDomain(registrableDomain); >+ bool shouldCallNotificationCallback = false; >+ if (!statistics.navigatorFunctionsAccessed.contains(functionName)) { >+ statistics.navigatorFunctionsAccessed.add(functionName); >+ shouldCallNotificationCallback = true; >+ } >+ auto mainFrameRegistrableDomain = primaryDomain(document.frame()->mainFrame().document()->url()); >+ if (statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs.add(mainFrameRegistrableDomain).isNewEntry) >+ shouldCallNotificationCallback = true; >+ if (shouldCallNotificationCallback) >+ scheduleNotificationIfNeeded(); >+} >+ >+void ResourceLoadObserver::logScreenAPIAccessed(const Document& document, const ResourceLoadStatistics::ScreenAPI functionName) >+{ >+ if (!shouldLog(document.sessionID().isEphemeral()) || !document.frame()) >+ return; >+ auto registrableDomain = primaryDomain(document.url()); >+ auto& statistics = ensureResourceStatisticsForPrimaryDomain(registrableDomain); >+ bool shouldCallNotificationCallback = false; >+ if (!statistics.screenFunctionsAccessed.contains(functionName)) { >+ statistics.screenFunctionsAccessed.add(functionName); >+ shouldCallNotificationCallback = true; >+ } >+ auto mainFrameRegistrableDomain = primaryDomain(document.frame()->mainFrame().document()->url()); >+ if (statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs.add(mainFrameRegistrableDomain).isNewEntry) >+ shouldCallNotificationCallback = true; >+ if (shouldCallNotificationCallback) >+ scheduleNotificationIfNeeded(); >+} >+#endif >+ > ResourceLoadStatistics& ResourceLoadObserver::ensureResourceStatisticsForPrimaryDomain(const String& primaryDomain) > { > auto addResult = m_resourceStatisticsMap.ensure(primaryDomain, [&primaryDomain] { >diff --git a/Source/WebCore/loader/ResourceLoadObserver.h b/Source/WebCore/loader/ResourceLoadObserver.h >index 5b6d9188fbd2228a913f81f33ad7dbc90534bb26..947a735d397da95cb3e1686a7f1cf079e5ce326d 100644 >--- a/Source/WebCore/loader/ResourceLoadObserver.h >+++ b/Source/WebCore/loader/ResourceLoadObserver.h >@@ -31,6 +31,11 @@ > #include <wtf/NeverDestroyed.h> > #include <wtf/text/WTFString.h> > >+#if ENABLE(WEB_API_STATISTICS) >+#include "CanvasActivityRecord.h" >+#include "ResourceLoadStatistics.h" >+#endif >+ > namespace WTF { > class Lock; > class WorkQueue; >@@ -58,6 +63,14 @@ public: > void logWebSocketLoading(const URL& targetURL, const URL& mainFrameURL, bool usesEphemeralSession); > void logUserInteractionWithReducedTimeResolution(const Document&); > void logWindowCreation(const URL& popupUrl, uint64_t openerPageID, Document& openerDocument); >+ >+#if ENABLE(WEB_API_STATISTICS) >+ void logFontLoad(const Document&, const String& familyName, bool loadStatus); >+ void logCanvasRead(const Document&); >+ void logCanvasWriteOrMeasure(const Document&, const String& textWritten); >+ void logNavigatorAPIAccessed(const Document&, const ResourceLoadStatistics::NavigatorAPI); >+ void logScreenAPIAccessed(const Document&, const ResourceLoadStatistics::ScreenAPI); >+#endif > > WEBCORE_EXPORT String statisticsForOrigin(const String&); > >diff --git a/Source/WebCore/loader/ResourceLoadStatistics.cpp b/Source/WebCore/loader/ResourceLoadStatistics.cpp >index 9e2b7cf31519ceb3856c38616c75720724f70ede..b2f9cc5515ea00449144dfc580f54fcad2e00813 100644 >--- a/Source/WebCore/loader/ResourceLoadStatistics.cpp >+++ b/Source/WebCore/loader/ResourceLoadStatistics.cpp >@@ -49,16 +49,48 @@ static void encodeHashCountedSet(KeyedEncoder& encoder, const String& label, con > }); > } > >-static void encodeHashSet(KeyedEncoder& encoder, const String& label, const HashSet<String>& hashSet) >+static void encodeHashSet(KeyedEncoder& encoder, const String& label, const HashSet<String>& hashSet, const String& key) > { > if (hashSet.isEmpty()) > return; > >- encoder.encodeObjects(label, hashSet.begin(), hashSet.end(), [](KeyedEncoder& encoderInner, const String& origin) { >- encoderInner.encodeString("origin", origin); >+ encoder.encodeObjects(label, hashSet.begin(), hashSet.end(), [&key](KeyedEncoder& encoderInner, const String& origin) { >+ encoderInner.encodeString(key, origin); > }); > } > >+static void encodeOriginHashSet(KeyedEncoder& encoder, const String& label, const HashSet<String>& hashSet) >+{ >+ encodeHashSet(encoder, label, hashSet, "origin"); >+} >+ >+#if ENABLE(WEB_API_STATISTICS) >+template<typename T> >+static void encodeOptionSet(KeyedEncoder& encoder, const String& label, const OptionSet<T>& optionSet) >+{ >+ if (optionSet.isEmpty()) >+ return; >+ >+ uint64_t optionSetBitMask = optionSet.toRaw(); >+ encoder.encodeUInt64(label, optionSetBitMask); >+} >+ >+static void encodeFontHashSet(KeyedEncoder& encoder, const String& label, const HashSet<String>& hashSet) >+{ >+ encodeHashSet(encoder, label, hashSet, "font"); >+} >+ >+static void encodeCanvasActivityRecord(KeyedEncoder& encoder, const String& label, const CanvasActivityRecord& canvasActivityRecord) >+{ >+ encoder.encodeObject(label, canvasActivityRecord, [] (KeyedEncoder& encoderInner, const CanvasActivityRecord& canvasActivityRecord) { >+ encoderInner.encodeBool("wasDataRead", canvasActivityRecord.wasDataRead); >+ encoderInner.encodeObjects("textWritten", canvasActivityRecord.textWritten.begin(), canvasActivityRecord.textWritten.end(), [] (KeyedEncoder& encoderInner2, const String& text) { >+ encoderInner2.encodeString("text", text); >+ }); >+ }); >+} >+#endif >+ > void ResourceLoadStatistics::encode(KeyedEncoder& encoder) const > { > encoder.encodeString("PrevalentResourceOrigin", highLevelDomain); >@@ -71,7 +103,7 @@ void ResourceLoadStatistics::encode(KeyedEncoder& encoder) const > encoder.encodeBool("grandfathered", grandfathered); > > // Storage access >- encodeHashSet(encoder, "storageAccessUnderTopFrameOrigins", storageAccessUnderTopFrameOrigins); >+ encodeOriginHashSet(encoder, "storageAccessUnderTopFrameOrigins", storageAccessUnderTopFrameOrigins); > > // Top frame stats > encodeHashCountedSet(encoder, "topFrameUniqueRedirectsTo", topFrameUniqueRedirectsTo); >@@ -92,6 +124,15 @@ void ResourceLoadStatistics::encode(KeyedEncoder& encoder) const > > encoder.encodeUInt32("timesAccessedAsFirstPartyDueToUserInteraction", timesAccessedAsFirstPartyDueToUserInteraction); > encoder.encodeUInt32("timesAccessedAsFirstPartyDueToStorageAccessAPI", timesAccessedAsFirstPartyDueToStorageAccessAPI); >+ >+#if ENABLE(WEB_API_STATISTICS) >+ encodeFontHashSet(encoder, "fontsFailedToLoad", fontsFailedToLoad); >+ encodeFontHashSet(encoder, "fontsLoaded", fontsLoaded); >+ encodeHashCountedSet(encoder, "topFrameRegistrableDomainsWhichAccessedWebAPIs", topFrameRegistrableDomainsWhichAccessedWebAPIs); >+ encodeCanvasActivityRecord(encoder, "canvasActivityRecord", canvasActivityRecord); >+ encodeOptionSet(encoder, "navigatorFunctionsAccessedBitMask", navigatorFunctionsAccessed); >+ encodeOptionSet(encoder, "screenFunctionsAccessedBitMask", screenFunctionsAccessed); >+#endif > } > > static void decodeHashCountedSet(KeyedDecoder& decoder, const String& label, HashCountedSet<String>& hashCountedSet) >@@ -110,11 +151,11 @@ static void decodeHashCountedSet(KeyedDecoder& decoder, const String& label, Has > }); > } > >-static void decodeHashSet(KeyedDecoder& decoder, const String& label, HashSet<String>& hashSet) >+static void decodeHashSet(KeyedDecoder& decoder, const String& label, HashSet<String>& hashSet, const String& key) > { > Vector<String> ignore; >- decoder.decodeObjects(label, ignore, [&hashSet](KeyedDecoder& decoderInner, String& origin) { >- if (!decoderInner.decodeString("origin", origin)) >+ decoder.decodeObjects(label, ignore, [&hashSet, &key](KeyedDecoder& decoderInner, String& origin) { >+ if (!decoderInner.decodeString(key, origin)) > return false; > > hashSet.add(origin); >@@ -122,6 +163,42 @@ static void decodeHashSet(KeyedDecoder& decoder, const String& label, HashSet<St > }); > } > >+static void decodeOriginHashSet(KeyedDecoder& decoder, const String& label, HashSet<String>& hashSet) >+{ >+ decodeHashSet(decoder, label, hashSet, "origin"); >+} >+ >+#if ENABLE(WEB_API_STATISTICS) >+template<typename T> >+static void decodeOptionSet(KeyedDecoder& decoder, const String& label, OptionSet<T>& optionSet) >+{ >+ uint64_t optionSetBitMask = 0; >+ decoder.decodeUInt64(label, optionSetBitMask); >+ optionSet.add(OptionSet<T>::fromRaw(optionSetBitMask)); >+} >+ >+static void decodeFontHashSet(KeyedDecoder& decoder, const String& label, HashSet<String>& hashSet) >+{ >+ decodeHashSet(decoder, label, hashSet, "font"); >+} >+ >+static void decodeCanvasActivityRecord(KeyedDecoder& decoder, const String& label, CanvasActivityRecord& canvasActivityRecord) >+{ >+ decoder.decodeObject(label, canvasActivityRecord, [] (KeyedDecoder& decoderInner, CanvasActivityRecord& canvasActivityRecord) { >+ if (!decoderInner.decodeBool("wasDataRead", canvasActivityRecord.wasDataRead)) >+ return false; >+ Vector<String> ignore; >+ decoderInner.decodeObjects("textWritten", ignore, [&canvasActivityRecord] (KeyedDecoder& decoderInner2, String& text) { >+ if (!decoderInner2.decodeString("text", text)) >+ return false; >+ canvasActivityRecord.textWritten.add(text); >+ return true; >+ }); >+ return true; >+ }); >+} >+#endif >+ > bool ResourceLoadStatistics::decode(KeyedDecoder& decoder, unsigned modelVersion) > { > if (!decoder.decodeString("PrevalentResourceOrigin", highLevelDomain)) >@@ -132,7 +209,7 @@ bool ResourceLoadStatistics::decode(KeyedDecoder& decoder, unsigned modelVersion > return false; > > // Storage access >- decodeHashSet(decoder, "storageAccessUnderTopFrameOrigins", storageAccessUnderTopFrameOrigins); >+ decodeOriginHashSet(decoder, "storageAccessUnderTopFrameOrigins", storageAccessUnderTopFrameOrigins); > > // Top frame stats > if (modelVersion >= 11) { >@@ -180,6 +257,18 @@ bool ResourceLoadStatistics::decode(KeyedDecoder& decoder, unsigned modelVersion > if (!decoder.decodeUInt32("timesAccessedAsFirstPartyDueToStorageAccessAPI", timesAccessedAsFirstPartyDueToStorageAccessAPI)) > timesAccessedAsFirstPartyDueToStorageAccessAPI = 0; > } >+ >+#if ENABLE(WEB_API_STATISTICS) >+ if (modelVersion >= 13) { >+ decodeFontHashSet(decoder, "fontsFailedToLoad", fontsFailedToLoad); >+ decodeFontHashSet(decoder, "fontsLoaded", fontsLoaded); >+ decodeHashCountedSet(decoder, "topFrameRegistrableDomainsWhichAccessedWebAPIs", topFrameRegistrableDomainsWhichAccessedWebAPIs); >+ decodeCanvasActivityRecord(decoder, "canvasActivityRecord", canvasActivityRecord); >+ decodeOptionSet(decoder, "navigatorFunctionsAccessedBitMask", navigatorFunctionsAccessed); >+ decodeOptionSet(decoder, "screenFunctionsAccessedBitMask", screenFunctionsAccessed); >+ } >+#endif >+ > return true; > } > >@@ -225,11 +314,87 @@ static void appendHashSet(StringBuilder& builder, const String& label, const Has > } > } > >+#if ENABLE(WEB_API_STATISTICS) >+static String navigatorEnumToString(ResourceLoadStatistics::NavigatorAPI navigatorEnum) >+{ >+ switch (navigatorEnum) { >+ case ResourceLoadStatistics::NavigatorAPI::JavaEnabled: >+ return "javaEnabled"; >+ case ResourceLoadStatistics::NavigatorAPI::MimeTypes: >+ return "mimeTypes"; >+ case ResourceLoadStatistics::NavigatorAPI::CookieEnabled: >+ return "cookieEnabled"; >+ case ResourceLoadStatistics::NavigatorAPI::Plugins: >+ return "plugins"; >+ case ResourceLoadStatistics::NavigatorAPI::UserAgent: >+ return "userAgent"; >+ case ResourceLoadStatistics::NavigatorAPI::AppVersion: >+ return "appVersion"; >+ default: >+ return "Not a recognized navigator function"; >+ } >+} >+ >+static String screenEnumToString(ResourceLoadStatistics::ScreenAPI screenEnum) >+{ >+ switch (screenEnum) { >+ case ResourceLoadStatistics::ScreenAPI::Height: >+ return "height"; >+ case ResourceLoadStatistics::ScreenAPI::Width: >+ return "width"; >+ case ResourceLoadStatistics::ScreenAPI::ColorDepth: >+ return "colorDepth"; >+ case ResourceLoadStatistics::ScreenAPI::PixelDepth: >+ return "pixelDepth"; >+ case ResourceLoadStatistics::ScreenAPI::AvailLeft: >+ return "availLeft"; >+ case ResourceLoadStatistics::ScreenAPI::AvailTop: >+ return "availTop"; >+ case ResourceLoadStatistics::ScreenAPI::AvailHeight: >+ return "availHeight"; >+ case ResourceLoadStatistics::ScreenAPI::AvailWidth: >+ return "availWidth"; >+ default: >+ return "Not a recognized screen function"; >+ } >+} >+ >+static void appendNavigatorOptionSet(StringBuilder& builder, const OptionSet<ResourceLoadStatistics::NavigatorAPI>& optionSet) >+{ >+ if (optionSet.isEmpty()) >+ return; >+ builder.appendLiteral(" "); >+ builder.append("navigatorFunctionsAccessed:"); >+ builder.append('\n'); >+ for (OptionSet<ResourceLoadStatistics::NavigatorAPI>::iterator it = optionSet.begin(); it != optionSet.end(); ++it) { >+ builder.appendLiteral(" "); >+ builder.append(navigatorEnumToString(*it)); >+ builder.append('\n'); >+ } >+} >+ >+static void appendScreenOptionSet(StringBuilder& builder, const OptionSet<ResourceLoadStatistics::ScreenAPI>& optionSet) >+{ >+ if (optionSet.isEmpty()) >+ return; >+ builder.appendLiteral(" "); >+ builder.append("screenFunctionsAccessed:"); >+ builder.append('\n'); >+ for (OptionSet<ResourceLoadStatistics::ScreenAPI>::iterator it = optionSet.begin(); it != optionSet.end(); ++it) { >+ builder.appendLiteral(" "); >+ builder.append(screenEnumToString(*it)); >+ builder.append('\n'); >+ } >+} >+#endif >+ > String ResourceLoadStatistics::toString() const > { > StringBuilder builder; >- >- builder.appendLiteral("lastSeen"); >+ builder.appendLiteral("High level domain: "); >+ builder.append(highLevelDomain); >+ builder.append('\n'); >+ builder.appendLiteral(" lastSeen: "); > builder.appendNumber(lastSeen.secondsSinceEpoch().value()); > builder.append('\n'); > >@@ -239,7 +404,7 @@ String ResourceLoadStatistics::toString() const > builder.appendLiteral(" mostRecentUserInteraction: "); > builder.appendNumber(mostRecentUserInteractionTime.secondsSinceEpoch().value()); > builder.append('\n'); >- appendBoolean(builder, " grandfathered", grandfathered); >+ appendBoolean(builder, "grandfathered", grandfathered); > builder.append('\n'); > > // Storage access >@@ -259,7 +424,9 @@ String ResourceLoadStatistics::toString() const > > // Prevalent Resource > appendBoolean(builder, "isPrevalentResource", isPrevalentResource); >- appendBoolean(builder, " isVeryPrevalentResource", isVeryPrevalentResource); >+ builder.append('\n'); >+ appendBoolean(builder, "isVeryPrevalentResource", isVeryPrevalentResource); >+ builder.append('\n'); > builder.appendLiteral(" dataRecordsRemoved: "); > builder.appendNumber(dataRecordsRemoved); > builder.append('\n'); >@@ -268,6 +435,16 @@ String ResourceLoadStatistics::toString() const > appendBoolean(builder, "isMarkedForCookieBlocking", isMarkedForCookieBlocking); > builder.append('\n'); > >+#if ENABLE(WEB_API_STATISTICS) >+ appendHashSet(builder, "fontsFailedToLoad", fontsFailedToLoad); >+ appendHashSet(builder, "fontsLoaded", fontsLoaded); >+ appendHashCountedSet(builder, "topFrameRegistrableDomainsWhichAccessedWebAPIs", topFrameRegistrableDomainsWhichAccessedWebAPIs); >+ appendNavigatorOptionSet(builder, navigatorFunctionsAccessed); >+ appendScreenOptionSet(builder, screenFunctionsAccessed); >+ appendHashSet(builder, "canvasTextWritten", canvasActivityRecord.textWritten); >+ appendBoolean(builder, "canvasReadData", canvasActivityRecord.wasDataRead); >+ builder.append('\n'); >+#endif > builder.append('\n'); > > return builder.toString(); >@@ -330,6 +507,15 @@ void ResourceLoadStatistics::merge(const ResourceLoadStatistics& other) > > // In-memory only > isMarkedForCookieBlocking |= other.isMarkedForCookieBlocking; >+ >+#if ENABLE(WEB_API_STATISTICS) >+ mergeHashSet(fontsFailedToLoad, other.fontsFailedToLoad); >+ mergeHashSet(fontsLoaded, other.fontsLoaded); >+ mergeHashCountedSet(topFrameRegistrableDomainsWhichAccessedWebAPIs, other.topFrameRegistrableDomainsWhichAccessedWebAPIs); >+ canvasActivityRecord.mergeWith(other.canvasActivityRecord); >+ navigatorFunctionsAccessed.add(other.navigatorFunctionsAccessed); >+ screenFunctionsAccessed.add(other.screenFunctionsAccessed); >+#endif > } > > String ResourceLoadStatistics::primaryDomain(const URL& url) >diff --git a/Source/WebCore/loader/ResourceLoadStatistics.h b/Source/WebCore/loader/ResourceLoadStatistics.h >index 27a17ff93551619013ebb8ec05ac25d3d561b668..7d54bd3d2cbf0da8d8eafbf1daa6e2cfa50ae316 100644 >--- a/Source/WebCore/loader/ResourceLoadStatistics.h >+++ b/Source/WebCore/loader/ResourceLoadStatistics.h >@@ -28,10 +28,15 @@ > #include "URL.h" > #include <wtf/HashCountedSet.h> > #include <wtf/HashSet.h> >+#include <wtf/OptionSet.h> > #include <wtf/WallTime.h> > #include <wtf/text/StringHash.h> > #include <wtf/text/WTFString.h> > >+#if ENABLE(WEB_API_STATISTICS) >+#include "CanvasActivityRecord.h" >+#endif >+ > namespace WebCore { > > class KeyedDecoder; >@@ -96,6 +101,35 @@ struct ResourceLoadStatistics { > > // In-memory only > bool isMarkedForCookieBlocking { false }; >+ >+#if ENABLE(WEB_API_STATISTICS) >+ // This set represents the registrable domain of the top frame where web API >+ // were used in the top frame or one of its subframes. >+ HashCountedSet<String> topFrameRegistrableDomainsWhichAccessedWebAPIs; >+ HashSet<String> fontsFailedToLoad; >+ HashSet<String> fontsLoaded; >+ CanvasActivityRecord canvasActivityRecord; >+ enum class NavigatorAPI : uint64_t { >+ AppVersion = 1 << 0, >+ UserAgent = 1 << 1, >+ Plugins = 1 << 2, >+ MimeTypes = 1 << 3, >+ CookieEnabled = 1 << 4, >+ JavaEnabled = 1 << 5, >+ }; >+ enum class ScreenAPI : uint64_t { >+ Height = 1 << 0, >+ Width = 1 << 1, >+ ColorDepth = 1 << 2, >+ PixelDepth = 1 << 3, >+ AvailLeft = 1 << 4, >+ AvailTop = 1 << 5, >+ AvailHeight = 1 << 6, >+ AvailWidth = 1 << 7, >+ }; >+ OptionSet<NavigatorAPI> navigatorFunctionsAccessed; >+ OptionSet<ScreenAPI> screenFunctionsAccessed; >+#endif > }; > > } // namespace WebCore >diff --git a/Source/WebCore/page/Navigator.cpp b/Source/WebCore/page/Navigator.cpp >index 7569ca854ec6bb0993e5c3a7d0ee82419f52b3a3..9566467bcfd8126c5ccfa2002fa83e61203e4096 100644 >--- a/Source/WebCore/page/Navigator.cpp >+++ b/Source/WebCore/page/Navigator.cpp >@@ -44,6 +44,9 @@ > #include <wtf/StdLibExtras.h> > #include <wtf/WeakPtr.h> > >+#if ENABLE(WEB_API_STATISTICS) >+#include "ResourceLoadObserver.h" >+#endif > > namespace WebCore { > using namespace WTF; >@@ -74,6 +77,9 @@ String Navigator::appVersion() const > { > if (!m_frame) > return String(); >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logNavigatorAPIAccessed(*m_frame->document(), ResourceLoadStatistics::NavigatorAPI::AppVersion); >+#endif > String appVersion = NavigatorBase::appVersion(); > if (shouldHideFourDot(*m_frame)) > appVersion.replace("4.", "4_"); >@@ -82,7 +88,12 @@ String Navigator::appVersion() const > > const String& Navigator::userAgent() const > { >- if (m_userAgent.isNull() && m_frame && m_frame->page()) >+ if (!m_frame || !m_frame->page()) >+ return m_userAgent; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logNavigatorAPIAccessed(*m_frame->document(), ResourceLoadStatistics::NavigatorAPI::UserAgent); >+#endif >+ if (m_userAgent.isNull()) > m_userAgent = m_frame->loader().userAgent(m_frame->document()->url()); > return m_userAgent; > } >@@ -136,6 +147,10 @@ void Navigator::share(ScriptExecutionContext& context, ShareData data, Ref<Defer > > DOMPluginArray& Navigator::plugins() > { >+#if ENABLE(WEB_API_STATISTICS) >+ if (m_frame) >+ ResourceLoadObserver::shared().logNavigatorAPIAccessed(*m_frame->document(), ResourceLoadStatistics::NavigatorAPI::Plugins); >+#endif > if (!m_plugins) > m_plugins = DOMPluginArray::create(m_frame); > return *m_plugins; >@@ -143,6 +158,10 @@ DOMPluginArray& Navigator::plugins() > > DOMMimeTypeArray& Navigator::mimeTypes() > { >+#if ENABLE(WEB_API_STATISTICS) >+ if (m_frame) >+ ResourceLoadObserver::shared().logNavigatorAPIAccessed(*m_frame->document(), ResourceLoadStatistics::NavigatorAPI::MimeTypes); >+#endif > if (!m_mimeTypes) > m_mimeTypes = DOMMimeTypeArray::create(m_frame); > return *m_mimeTypes; >@@ -152,6 +171,10 @@ bool Navigator::cookieEnabled() const > { > if (!m_frame) > return false; >+ >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logNavigatorAPIAccessed(*m_frame->document(), ResourceLoadStatistics::NavigatorAPI::CookieEnabled); >+#endif > > if (m_frame->page() && !m_frame->page()->settings().cookieEnabled()) > return false; >@@ -167,6 +190,10 @@ bool Navigator::javaEnabled() const > { > if (!m_frame) > return false; >+ >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logNavigatorAPIAccessed(*m_frame->document(), ResourceLoadStatistics::NavigatorAPI::JavaEnabled); >+#endif > > if (!m_frame->settings().isJavaEnabled()) > return false; >diff --git a/Source/WebCore/page/Screen.cpp b/Source/WebCore/page/Screen.cpp >index ff487d7cad06c754f00fbbd0244bdaa87ae9d2c0..e58feb40e68cd1e0fa97d9f0dd63a98e0c169ae3 100644 >--- a/Source/WebCore/page/Screen.cpp >+++ b/Source/WebCore/page/Screen.cpp >@@ -34,6 +34,10 @@ > #include "FrameView.h" > #include "PlatformScreen.h" > >+#if ENABLE(WEB_API_STATISTICS) >+#include "ResourceLoadObserver.h" >+#endif >+ > namespace WebCore { > > Screen::Screen(Frame* frame) >@@ -45,6 +49,9 @@ unsigned Screen::height() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::Height); >+#endif > long height = static_cast<long>(screenRect(m_frame->view()).height()); > return static_cast<unsigned>(height); > } >@@ -53,6 +60,9 @@ unsigned Screen::width() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::Width); >+#endif > long width = static_cast<long>(screenRect(m_frame->view()).width()); > return static_cast<unsigned>(width); > } >@@ -61,6 +71,9 @@ unsigned Screen::colorDepth() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::ColorDepth); >+#endif > return static_cast<unsigned>(screenDepth(m_frame->view())); > } > >@@ -68,6 +81,9 @@ unsigned Screen::pixelDepth() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::PixelDepth); >+#endif > return static_cast<unsigned>(screenDepth(m_frame->view())); > } > >@@ -75,6 +91,9 @@ int Screen::availLeft() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::AvailLeft); >+#endif > return static_cast<int>(screenAvailableRect(m_frame->view()).x()); > } > >@@ -82,6 +101,9 @@ int Screen::availTop() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::AvailTop); >+#endif > return static_cast<int>(screenAvailableRect(m_frame->view()).y()); > } > >@@ -89,6 +111,9 @@ unsigned Screen::availHeight() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::AvailHeight); >+#endif > return static_cast<unsigned>(screenAvailableRect(m_frame->view()).height()); > } > >@@ -96,6 +121,9 @@ unsigned Screen::availWidth() const > { > if (!m_frame) > return 0; >+#if ENABLE(WEB_API_STATISTICS) >+ ResourceLoadObserver::shared().logScreenAPIAccessed(*m_frame->document(), ResourceLoadStatistics::ScreenAPI::AvailWidth); >+#endif > return static_cast<unsigned>(screenAvailableRect(m_frame->view()).width()); > } > >diff --git a/Source/WebKit/Configurations/FeatureDefines.xcconfig b/Source/WebKit/Configurations/FeatureDefines.xcconfig >index dfa4a259773f597db7eae6005dd81beb3d68de87..75739d69e14f4e5fd9c08781c0b9fc7e65cfaaa1 100644 >--- a/Source/WebKit/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebKit/Configurations/FeatureDefines.xcconfig >@@ -358,6 +358,8 @@ ENABLE_WEBGPU_watchos = ENABLE_WEBGPU; > ENABLE_WEBGPU_appletvos = ENABLE_WEBGPU; > ENABLE_WEBGPU_macosx = ENABLE_WEBGPU; > >+ENABLE_WEB_API_STATISTICS = ENABLE_WEB_API_STATISTICS; >+ > ENABLE_WEB_AUDIO = ENABLE_WEB_AUDIO; > > ENABLE_WEB_AUTHN = $(ENABLE_WEB_AUTHN_$(WK_PLATFORM_NAME)); >@@ -374,4 +376,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >index 9dab37dd60302bf2ea0e296c396809ca6cd80d70..354ae209aad646c24c8cc46d0557fc99a13d4c12 100644 >--- a/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >+++ b/Source/WebKit/Shared/WebCoreArgumentCoders.cpp >@@ -2664,6 +2664,18 @@ void ArgumentCoder<ResourceLoadStatistics>::encode(Encoder& encoder, const WebCo > encoder << statistics.isPrevalentResource; > encoder << statistics.isVeryPrevalentResource; > encoder << statistics.dataRecordsRemoved; >+ >+#if ENABLE(WEB_API_STATISTICS) >+ encoder << statistics.fontsFailedToLoad; >+ encoder << statistics.fontsLoaded; >+ encoder << statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs; >+ >+ encoder << statistics.canvasActivityRecord; >+ >+ encoder << statistics.navigatorFunctionsAccessed; >+ encoder << statistics.screenFunctionsAccessed; >+#endif >+ > } > > std::optional<ResourceLoadStatistics> ArgumentCoder<ResourceLoadStatistics>::decode(Decoder& decoder) >@@ -2723,7 +2735,26 @@ std::optional<ResourceLoadStatistics> ArgumentCoder<ResourceLoadStatistics>::dec > > if (!decoder.decode(statistics.dataRecordsRemoved)) > return std::nullopt; >- >+#if ENABLE(WEB_API_STATISTICS) >+ if (!decoder.decode(statistics.fontsFailedToLoad)) >+ return std::nullopt; >+ >+ if (!decoder.decode(statistics.fontsLoaded)) >+ return std::nullopt; >+ >+ if (!decoder.decode(statistics.topFrameRegistrableDomainsWhichAccessedWebAPIs)) >+ return std::nullopt; >+ >+ if (!decoder.decode(statistics.canvasActivityRecord)) >+ return std::nullopt; >+ >+ if (!decoder.decode(statistics.navigatorFunctionsAccessed)) >+ return std::nullopt; >+ >+ if (!decoder.decode(statistics.screenFunctionsAccessed)) >+ return std::nullopt; >+#endif >+ > return WTFMove(statistics); > } > >diff --git a/Source/WebKit/UIProcess/ResourceLoadStatisticsMemoryStore.cpp b/Source/WebKit/UIProcess/ResourceLoadStatisticsMemoryStore.cpp >index a7992d6c75b8e75856dc2380345ebf71caf0c58c..6a9206723a89bde274bfb8ca0d97edc6d90d8ba0 100644 >--- a/Source/WebKit/UIProcess/ResourceLoadStatisticsMemoryStore.cpp >+++ b/Source/WebKit/UIProcess/ResourceLoadStatisticsMemoryStore.cpp >@@ -46,7 +46,7 @@ > namespace WebKit { > using namespace WebCore; > >-constexpr unsigned statisticsModelVersion { 12 }; >+constexpr unsigned statisticsModelVersion { 13 }; > constexpr unsigned maxNumberOfRecursiveCallsInRedirectTraceBack { 50 }; > constexpr Seconds minimumStatisticsProcessingInterval { 5_s }; > constexpr unsigned operatingDatesWindow { 30 }; >diff --git a/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig b/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig >index dfa4a259773f597db7eae6005dd81beb3d68de87..75739d69e14f4e5fd9c08781c0b9fc7e65cfaaa1 100644 >--- a/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig >+++ b/Source/WebKitLegacy/mac/Configurations/FeatureDefines.xcconfig >@@ -358,6 +358,8 @@ ENABLE_WEBGPU_watchos = ENABLE_WEBGPU; > ENABLE_WEBGPU_appletvos = ENABLE_WEBGPU; > ENABLE_WEBGPU_macosx = ENABLE_WEBGPU; > >+ENABLE_WEB_API_STATISTICS = ENABLE_WEB_API_STATISTICS; >+ > ENABLE_WEB_AUDIO = ENABLE_WEB_AUDIO; > > ENABLE_WEB_AUTHN = $(ENABLE_WEB_AUTHN_$(WK_PLATFORM_NAME)); >@@ -374,4 +376,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 0dda0c46aecbc97a75942fa7d7c1c1d65e3caaf1..4f0132181211d68d08bd9f89fbd725387855328d 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,15 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added a new flag ENABLE_WEB_API_STATISTICS to wrap all code in compile time flags for when >+ we would like to collect various web API statistics for analysis. >+ >+ * TestWebKitAPI/Configurations/FeatureDefines.xcconfig: >+ > 2018-08-31 Woodrow Wang <woodrow_wang@apple.com> > > Added dumping function for testing resource load statistics >diff --git a/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig b/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig >index dfa4a259773f597db7eae6005dd81beb3d68de87..75739d69e14f4e5fd9c08781c0b9fc7e65cfaaa1 100644 >--- a/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig >+++ b/Tools/TestWebKitAPI/Configurations/FeatureDefines.xcconfig >@@ -358,6 +358,8 @@ ENABLE_WEBGPU_watchos = ENABLE_WEBGPU; > ENABLE_WEBGPU_appletvos = ENABLE_WEBGPU; > ENABLE_WEBGPU_macosx = ENABLE_WEBGPU; > >+ENABLE_WEB_API_STATISTICS = ENABLE_WEB_API_STATISTICS; >+ > ENABLE_WEB_AUDIO = ENABLE_WEB_AUDIO; > > ENABLE_WEB_AUTHN = $(ENABLE_WEB_AUTHN_$(WK_PLATFORM_NAME)); >@@ -374,4 +376,4 @@ ENABLE_WIRELESS_PLAYBACK_TARGET = ENABLE_WIRELESS_PLAYBACK_TARGET; > > ENABLE_XSLT = ENABLE_XSLT; > >-FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >+FEATURE_DEFINES = $(ENABLE_3D_TRANSFORMS) $(ENABLE_ACCELERATED_2D_CANVAS) $(ENABLE_ACCELERATED_OVERFLOW_SCROLLING) $(ENABLE_APPLE_PAY) $(ENABLE_APPLE_PAY_SESSION_V3) $(ENABLE_APPLE_PAY_SESSION_V4) $(ENABLE_APPLICATION_MANIFEST) $(ENABLE_ATTACHMENT_ELEMENT) $(ENABLE_AVF_CAPTIONS) $(ENABLE_CACHE_PARTITIONING) $(ENABLE_CHANNEL_MESSAGING) $(ENABLE_CONTENT_FILTERING) $(ENABLE_CSS3_TEXT) $(ENABLE_CSS_ANIMATIONS_LEVEL_2) $(ENABLE_CSS_BOX_DECORATION_BREAK) $(ENABLE_CSS_COMPOSITING) $(ENABLE_CSS_DEVICE_ADAPTATION) $(ENABLE_CSS_IMAGE_ORIENTATION) $(ENABLE_CSS_IMAGE_RESOLUTION) $(ENABLE_CSS_SCROLL_SNAP) $(ENABLE_CSS_SELECTORS_LEVEL4) $(ENABLE_CSS_TRAILING_WORD) $(ENABLE_CURSOR_VISIBILITY) $(ENABLE_CUSTOM_SCHEME_HANDLER) $(ENABLE_DASHBOARD_SUPPORT) $(ENABLE_DATA_INTERACTION) $(ENABLE_DATACUE_VALUE) $(ENABLE_DATALIST_ELEMENT) $(ENABLE_DEVICE_ORIENTATION) $(ENABLE_DRAG_SUPPORT) $(ENABLE_ENCRYPTED_MEDIA) $(ENABLE_EXPERIMENTAL_FEATURES) $(ENABLE_FAST_JIT_PERMISSIONS) $(ENABLE_FILTERS_LEVEL_2) $(ENABLE_FTL_JIT) $(ENABLE_FULLSCREEN_API) $(ENABLE_GAMEPAD) $(ENABLE_GEOLOCATION) $(ENABLE_ICONDATABASE) $(ENABLE_INDEXED_DATABASE) $(ENABLE_INDEXED_DATABASE_IN_WORKERS) $(ENABLE_INPUT_TYPE_COLOR) $(ENABLE_INPUT_TYPE_DATE) $(ENABLE_INPUT_TYPE_DATETIME_INCOMPLETE) $(ENABLE_INPUT_TYPE_DATETIMELOCAL) $(ENABLE_INPUT_TYPE_MONTH) $(ENABLE_INPUT_TYPE_TIME) $(ENABLE_INPUT_TYPE_WEEK) $(ENABLE_INTERSECTION_OBSERVER) $(ENABLE_INTL) $(ENABLE_IOS_GESTURE_EVENTS) $(ENABLE_IOS_TOUCH_EVENTS) $(ENABLE_JIT) $(ENABLE_JS_ASYNC_ITERATION) $(ENABLE_KEYBOARD_CODE_ATTRIBUTE) $(ENABLE_KEYBOARD_KEY_ATTRIBUTE) $(ENABLE_LAYOUT_FORMATTING_CONTEXT) $(ENABLE_LEGACY_CSS_VENDOR_PREFIXES) $(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER) $(ENABLE_LEGACY_ENCRYPTED_MEDIA) $(ENABLE_LETTERPRESS) $(ENABLE_MAC_GESTURE_EVENTS) $(ENABLE_MAC_VIDEO_TOOLBOX) $(ENABLE_MATHML) $(ENABLE_MEDIA_CAPTURE) $(ENABLE_MEDIA_CONTROLS_SCRIPT) $(ENABLE_MEDIA_SESSION) $(ENABLE_MEDIA_SOURCE) $(ENABLE_MEDIA_STATISTICS) $(ENABLE_MEDIA_STREAM) $(ENABLE_METER_ELEMENT) $(ENABLE_MHTML) $(ENABLE_MOUSE_CURSOR_SCALE) $(ENABLE_NAVIGATOR_CONTENT_UTILS) $(ENABLE_NAVIGATOR_STANDALONE) $(ENABLE_NOTIFICATIONS) $(ENABLE_PAYMENT_REQUEST) $(ENABLE_PDFKIT_PLUGIN) $(ENABLE_POINTER_LOCK) $(ENABLE_PUBLIC_SUFFIX_LIST) $(ENABLE_QUOTA) $(ENABLE_REMOTE_INSPECTOR) $(ENABLE_RESOLUTION_MEDIA_QUERY) $(ENABLE_RESOURCE_USAGE) $(ENABLE_RUBBER_BANDING) $(ENABLE_SERVICE_CONTROLS) $(ENABLE_SERVICE_WORKER) $(ENABLE_SPEECH_SYNTHESIS) $(ENABLE_STREAMS_API) $(ENABLE_SUBTLE_CRYPTO) $(ENABLE_SVG_FONTS) $(ENABLE_TELEPHONE_NUMBER_DETECTION) $(ENABLE_TEXT_AUTOSIZING) $(ENABLE_TOUCH_EVENTS) $(ENABLE_USER_MESSAGE_HANDLERS) $(ENABLE_USERSELECT_ALL) $(ENABLE_VARIATION_FONTS) $(ENABLE_VIDEO) $(ENABLE_VIDEO_PRESENTATION_MODE) $(ENABLE_VIDEO_TRACK) $(ENABLE_VIDEO_USES_ELEMENT_FULLSCREEN) $(ENABLE_WEB_API_STATISTICS) $(ENABLE_WEB_AUDIO) $(ENABLE_WEB_AUTHN) $(ENABLE_WEB_RTC) $(ENABLE_WEBASSEMBLY) $(ENABLE_WEBASSEMBLY_STREAMING_API) $(ENABLE_WEBGL) $(ENABLE_WEBGL2) $(ENABLE_WEBGPU) $(ENABLE_WIRELESS_PLAYBACK_TARGET) $(ENABLE_XSLT); >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 79d6cc866e8b67a8d0396c7878af8e97a55bee0e..01a0eb25891c1bf66b799e7b49525e0232a2d822 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,24 @@ >+2018-08-31 Woodrow Wang <woodrow_wang@apple.com> >+ >+ Added Web API Statistics Collection. >+ https://bugs.webkit.org/show_bug.cgi?id=1897773 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Added new tests and expectations for the web API statistics data collection. >+ >+ * TestExpectations: >+ * http/tests/webAPIStatistics/canvas-read-and-write-data-collection-expected.txt: Added. >+ * http/tests/webAPIStatistics/canvas-read-and-write-data-collection.html: Added. >+ * http/tests/webAPIStatistics/font-load-data-collection-expected.txt: Added. >+ * http/tests/webAPIStatistics/font-load-data-collection.html: Added. >+ * http/tests/webAPIStatistics/navigator-functions-accessed-data-collection-expected.txt: Added. >+ * http/tests/webAPIStatistics/navigator-functions-accessed-data-collection.html: Added. >+ * http/tests/webAPIStatistics/screen-functions-accessed-data-collection-expected.txt: Added. >+ * http/tests/webAPIStatistics/screen-functions-accessed-data-collection.html: Added. >+ * platform/ios-wk2/TestExpectations: >+ * platform/mac-wk2/TestExpectations: >+ > 2018-08-31 Zalan Bujtas <zalan@apple.com> > > [LFC] Add margin box verification back now that Display::Box has non-computed horizontal margin. >diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations >index 3193ba318f7c2e78767641b59922e8c4c6805e2e..c4be4578b07b6cbf0a911698f3c3a8762b2f314b 100644 >--- a/LayoutTests/TestExpectations >+++ b/LayoutTests/TestExpectations >@@ -2241,3 +2241,5 @@ webkit.org/b/185308 legacy-animation-engine/animations/combo-transform-translate > > # This test is currently only relevant on mac-wk2 > fast/canvas/webgl/context-update-on-display-configuration.html [ Skip ] >+ >+webkit.org/b/187773 http/tests/webAPIStatistics [ Skip ] >diff --git a/LayoutTests/http/tests/webAPIStatistics/canvas-read-and-write-data-collection-expected.txt b/LayoutTests/http/tests/webAPIStatistics/canvas-read-and-write-data-collection-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..59e12cc4c1469f31351d788843a883829aa0586b >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/canvas-read-and-write-data-collection-expected.txt >@@ -0,0 +1,30 @@ >+Tests for canvas read and write data collection in ResourceLoadStatistics plist by rendering and reading text on the canvas and dumping the entire resource load statistics map. >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+ >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >+Resource load statistics: >+ >+High level domain: 127.0.0.1 >+ lastSeen: 0 >+ hadUserInteraction: No >+ mostRecentUserInteraction: -1 >+ grandfathered: No >+ isPrevalentResource: No >+ isVeryPrevalentResource: No >+ dataRecordsRemoved: 0 >+ isMarkedForCookieBlocking: No >+ fontsLoaded: >+ -webkit-standard >+ -webkit-sans-serif >+ -webkit-monospace >+ topFrameRegistrableDomainsWhichAccessedWebAPIs: >+ 127.0.0.1: 8 >+ canvasTextWritten: >+ suspicious invisible text >+ canvasReadData: Yes >+ >diff --git a/LayoutTests/http/tests/webAPIStatistics/canvas-read-and-write-data-collection.html b/LayoutTests/http/tests/webAPIStatistics/canvas-read-and-write-data-collection.html >new file mode 100644 >index 0000000000000000000000000000000000000000..3c183d2ea0d892af815e7bb4e76a2916349570fe >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/canvas-read-and-write-data-collection.html >@@ -0,0 +1,39 @@ >+<!DOCTYPE html> >+<head> >+ <meta charset="UTF-8"> >+ <title>Test for canvas read and write data collection in resource load statistics</title> >+ <script src="/js-test-resources/js-test.js"></script> >+</head> >+<body> >+<script> >+ description("Tests for canvas read and write data collection in ResourceLoadStatistics plist by rendering and reading text on the canvas and dumping the entire resource load statistics map."); >+ const hostUnderTest = "127.0.0.1:8000"; >+ const statisticsUrl = "http://" + hostUnderTest + "/temp"; >+ >+ function completeTest() { >+ testRunner.setDumpResourceLoadStatistics(true); >+ >+ testRunner.statisticsResetToConsistentState(function() { >+ testRunner.notifyDone(); >+ }); >+ } >+ >+ function runTestRunnerTest() { >+ testRunner.setStatisticsNotifyPagesWhenDataRecordsWereScanned(true); >+ >+ testRunner.installStatisticsDidScanDataRecordsCallback(completeTest); >+ >+ var canvas = document.createElement('canvas'); >+ var context = canvas.getContext('2d'); >+ context.fillText('suspicious invisible text', 2, 15); >+ canvas.toDataURL(); >+ } >+ >+ if (document.location.host === hostUnderTest && window.testRunner && window.internals) { >+ testRunner.waitUntilDone(); >+ internals.setResourceLoadStatisticsEnabled(true); >+ runTestRunnerTest(); >+ } >+</script> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/http/tests/webAPIStatistics/font-load-data-collection-expected.txt b/LayoutTests/http/tests/webAPIStatistics/font-load-data-collection-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..20f2368631305f0c32a866eedf4cf676140adf21 >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/font-load-data-collection-expected.txt >@@ -0,0 +1,35 @@ >+Tests for font loading data collection in ResourceLoadStatistics plist by loading fonts and dumping the entire resource load statistics map. The test tries to load various fonts through a comma separated font-family list to draw a string with many m's since they differ in width more prominently among fonts. >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+ >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+mmmmmmmmmmlli >+Resource load statistics: >+ >+High level domain: 127.0.0.1 >+ lastSeen: 0 >+ hadUserInteraction: No >+ mostRecentUserInteraction: -1 >+ grandfathered: No >+ isPrevalentResource: No >+ isVeryPrevalentResource: No >+ dataRecordsRemoved: 0 >+ isMarkedForCookieBlocking: No >+ fontsFailedToLoad: >+ Fransiscan >+ Andale >+ notARealFont >+ fontsLoaded: >+ notARealFont >+ Andale >+ -webkit-monospace >+ Fransiscan >+ -webkit-standard >+ -webkit-serif >+ topFrameRegistrableDomainsWhichAccessedWebAPIs: >+ 127.0.0.1: 9 >+ canvasReadData: No >+ >diff --git a/LayoutTests/http/tests/webAPIStatistics/font-load-data-collection.html b/LayoutTests/http/tests/webAPIStatistics/font-load-data-collection.html >new file mode 100644 >index 0000000000000000000000000000000000000000..a9a2c51ae5dd7fd9c5b51a43a5491baaa995233f >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/font-load-data-collection.html >@@ -0,0 +1,44 @@ >+<!DOCTYPE html> >+<head> >+ <meta charset="UTF-8"> >+ <title>Test for font loading data collection in resource load statistics</title> >+ <script src="/js-test-resources/js-test.js"></script> >+</head> >+<body> >+<script> >+ description("Tests for font loading data collection in ResourceLoadStatistics plist by loading fonts and dumping the entire resource load statistics map. The test tries to load various fonts through a comma separated font-family list to draw a string with many m's since they differ in width more prominently among fonts."); >+ const hostUnderTest = "127.0.0.1:8000"; >+ const statisticsUrl = "http://" + hostUnderTest + "/temp"; >+ >+ function completeTest() { >+ testRunner.setDumpResourceLoadStatistics(true); >+ >+ testRunner.statisticsResetToConsistentState(function() { >+ testRunner.notifyDone(); >+ }); >+ } >+ >+ function runTestRunnerTest() { >+ testRunner.setStatisticsNotifyPagesWhenDataRecordsWereScanned(true); >+ >+ testRunner.installStatisticsDidScanDataRecordsCallback(completeTest); >+ >+ var body = document.getElementsByTagName('body')[0] >+ >+ var span = document.createElement('span'); >+ var testFontString = 'mmmmmmmmmmlli'; >+ >+ span.innerHTML = testFontString; >+ span.style.fontFamily = 'sans-serif'; >+ span.style.fontFamily = 'Andale, Fransiscan, notARealFont, serif'; >+ body.appendChild(span); >+ } >+ >+ if (document.location.host === hostUnderTest && window.testRunner && window.internals) { >+ testRunner.waitUntilDone(); >+ internals.setResourceLoadStatisticsEnabled(true); >+ runTestRunnerTest(); >+ } >+</script> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/http/tests/webAPIStatistics/navigator-functions-accessed-data-collection-expected.txt b/LayoutTests/http/tests/webAPIStatistics/navigator-functions-accessed-data-collection-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..f802db9ff09094f7578853994e033b0a6c174f4d >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/navigator-functions-accessed-data-collection-expected.txt >@@ -0,0 +1,34 @@ >+Tests for navigator functions accessed data collection in ResourceLoadStatistics plist by querying for all the navigator properties and dumping the entire resource load statistics map. >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+ >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >+Resource load statistics: >+ >+High level domain: 127.0.0.1 >+ lastSeen: 0 >+ hadUserInteraction: No >+ mostRecentUserInteraction: -1 >+ grandfathered: No >+ isPrevalentResource: No >+ isVeryPrevalentResource: No >+ dataRecordsRemoved: 0 >+ isMarkedForCookieBlocking: No >+ fontsLoaded: >+ -webkit-standard >+ -webkit-monospace >+ topFrameRegistrableDomainsWhichAccessedWebAPIs: >+ 127.0.0.1: 12 >+ navigatorFunctionsAccessed: >+ appVersion >+ userAgent >+ plugins >+ mimeTypes >+ cookieEnabled >+ javaEnabled >+ canvasReadData: No >+ >diff --git a/LayoutTests/http/tests/webAPIStatistics/navigator-functions-accessed-data-collection.html b/LayoutTests/http/tests/webAPIStatistics/navigator-functions-accessed-data-collection.html >new file mode 100644 >index 0000000000000000000000000000000000000000..a905e405c1f32a6b17d62d23161b07a1f4cc9619 >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/navigator-functions-accessed-data-collection.html >@@ -0,0 +1,41 @@ >+<!DOCTYPE html> >+<head> >+ <meta charset="UTF-8"> >+ <title>Test for navigator functions accessed data collection in resource load statistics</title> >+ <script src="/js-test-resources/js-test.js"></script> >+</head> >+<body> >+<script> >+ description("Tests for navigator functions accessed data collection in ResourceLoadStatistics plist by querying for all the navigator properties and dumping the entire resource load statistics map."); >+ const hostUnderTest = "127.0.0.1:8000"; >+ const statisticsUrl = "http://" + hostUnderTest + "/temp"; >+ >+ function completeTest() { >+ testRunner.setDumpResourceLoadStatistics(true); >+ >+ testRunner.statisticsResetToConsistentState(function() { >+ testRunner.notifyDone(); >+ }); >+ } >+ >+ function runTestRunnerTest() { >+ testRunner.setStatisticsNotifyPagesWhenDataRecordsWereScanned(true); >+ >+ testRunner.installStatisticsDidScanDataRecordsCallback(completeTest); >+ >+ var useragent = navigator.userAgent; >+ var javaenabled = navigator.javaEnabled(); >+ var cookieEnabled = navigator.cookieEnabled; >+ var mimetypes = navigator.mimeTypes; >+ var plugins = navigator.plugins; >+ var appversion = navigator.appVersion; >+ } >+ >+ if (document.location.host === hostUnderTest && window.testRunner && window.internals) { >+ testRunner.waitUntilDone(); >+ internals.setResourceLoadStatisticsEnabled(true); >+ runTestRunnerTest(); >+ } >+</script> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/http/tests/webAPIStatistics/screen-functions-accessed-data-collection-expected.txt b/LayoutTests/http/tests/webAPIStatistics/screen-functions-accessed-data-collection-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..b9e689fee751cce4fe9a85bf5ea3a050a08de1c1 >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/screen-functions-accessed-data-collection-expected.txt >@@ -0,0 +1,36 @@ >+Tests for screen functions accessed data collection in ResourceLoadStatistics plist by querying for all the screen properties and dumping the entire resource load statistics map. >+ >+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". >+ >+ >+PASS successfullyParsed is true >+ >+TEST COMPLETE >+ >+Resource load statistics: >+ >+High level domain: 127.0.0.1 >+ lastSeen: 0 >+ hadUserInteraction: No >+ mostRecentUserInteraction: -1 >+ grandfathered: No >+ isPrevalentResource: No >+ isVeryPrevalentResource: No >+ dataRecordsRemoved: 0 >+ isMarkedForCookieBlocking: No >+ fontsLoaded: >+ -webkit-standard >+ -webkit-monospace >+ topFrameRegistrableDomainsWhichAccessedWebAPIs: >+ 127.0.0.1: 13 >+ screenFunctionsAccessed: >+ height >+ width >+ colorDepth >+ pixelDepth >+ availLeft >+ availTop >+ availHeight >+ availWidth >+ canvasReadData: No >+ >diff --git a/LayoutTests/http/tests/webAPIStatistics/screen-functions-accessed-data-collection.html b/LayoutTests/http/tests/webAPIStatistics/screen-functions-accessed-data-collection.html >new file mode 100644 >index 0000000000000000000000000000000000000000..a0e7d68cf438623b39b8f4f590886fc40eb9d259 >--- /dev/null >+++ b/LayoutTests/http/tests/webAPIStatistics/screen-functions-accessed-data-collection.html >@@ -0,0 +1,43 @@ >+<!DOCTYPE html> >+<head> >+ <meta charset="UTF-8"> >+ <title>Test for screen functions accessed data collection in resource load statistics</title> >+ <script src="/js-test-resources/js-test.js"></script> >+</head> >+<body> >+<script> >+ description("Tests for screen functions accessed data collection in ResourceLoadStatistics plist by querying for all the screen properties and dumping the entire resource load statistics map."); >+ const hostUnderTest = "127.0.0.1:8000"; >+ const statisticsUrl = "http://" + hostUnderTest + "/temp"; >+ >+ function completeTest() { >+ testRunner.setDumpResourceLoadStatistics(true); >+ >+ testRunner.statisticsResetToConsistentState(function() { >+ testRunner.notifyDone(); >+ }); >+ } >+ >+ function runTestRunnerTest() { >+ testRunner.setStatisticsNotifyPagesWhenDataRecordsWereScanned(true); >+ >+ testRunner.installStatisticsDidScanDataRecordsCallback(completeTest); >+ >+ var availTop = screen.availTop; >+ var colorDepth = screen.colorDepth; >+ var pixelDepth = screen.pixelDepth; >+ var height = screen.height; >+ var width = screen.width; >+ var availLeft = screen.availLeft; >+ var availHeight = screen.availHeight; >+ var availWidth = screen.availWidth; >+ } >+ >+ if (document.location.host === hostUnderTest && window.testRunner && window.internals) { >+ testRunner.waitUntilDone(); >+ internals.setResourceLoadStatisticsEnabled(true); >+ runTestRunnerTest(); >+ } >+</script> >+</body> >+</html> >\ No newline at end of file >diff --git a/LayoutTests/platform/ios-wk2/TestExpectations b/LayoutTests/platform/ios-wk2/TestExpectations >index cb19c7582bc29d4711149203d33c9c9293a00b63..378adbce24d0e277ff09f8d7755935d0007a1461 100644 >--- a/LayoutTests/platform/ios-wk2/TestExpectations >+++ b/LayoutTests/platform/ios-wk2/TestExpectations >@@ -65,6 +65,8 @@ http/tests/security/contentSecurityPolicy/manifest-src-allowed.html [ Pass ] > http/tests/security/contentSecurityPolicy/manifest-src-blocked.html [ Pass ] > applicationmanifest/ [ Pass ] > >+webkit.org/b/187773 http/tests/webAPIStatistics [ Pass ] >+ > #////////////////////////////////////////////////////////////////////////////////////////// > # End platform-specific directories. > #////////////////////////////////////////////////////////////////////////////////////////// >diff --git a/LayoutTests/platform/mac-wk2/TestExpectations b/LayoutTests/platform/mac-wk2/TestExpectations >index 8eebfdfff757c8c226aa1fc2b8f8c20c164395f2..f334c1b4b2724e62f254a8de57af72f1a8f840d2 100644 >--- a/LayoutTests/platform/mac-wk2/TestExpectations >+++ b/LayoutTests/platform/mac-wk2/TestExpectations >@@ -51,6 +51,8 @@ applicationmanifest/ [ Pass ] > > webkit.org/b/187183 http/tests/security/pasteboard-file-url.html [ Pass ] > >+webkit.org/b/187773 http/tests/webAPIStatistics [ Pass ] >+ > #////////////////////////////////////////////////////////////////////////////////////////// > # End platform-specific directories. > #//////////////////////////////////////////////////////////////////////////////////////////
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 187773
:
345263
|
345271
|
345272
|
345274
|
345278
|
345335
|
345578
|
345617
|
345851
|
345865
|
345969
|
346072
|
346089
|
346092
|
346108
|
346115
|
346123
|
346126
|
346127
|
346172
|
347273
|
347277
|
347282
|
348041
|
348057
|
348065
|
348067
|
348068
|
348070
|
348227
|
348230
|
348253
|
348309
|
348323
|
348326
|
348512
|
348523
|
348528
|
348542
|
348653
|
348660
|
348682
|
348693
|
348964
|
348968
|
348976
|
349156
|
349175
|
349193
|
349196
|
349314
|
349328
|
349330
|
349353