Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 71cebfd8153a1e5aacff520e1e5ed6d86d4b3bf9
      
https://github.com/WebKit/WebKit/commit/71cebfd8153a1e5aacff520e1e5ed6d86d4b3bf9
  Author: Kiara Rose <[email protected]>
  Date:   2025-12-12 (Fri, 12 Dec 2025)

  Changed paths:
    M Source/WebKit/Shared/Extensions/WebExtensionUtilities.cpp
    M Source/WebKit/Shared/Extensions/WebExtensionUtilities.h
    M Source/WebKit/UIProcess/Extensions/API/WebExtensionContextAPIStorage.cpp
    M Source/WebKit/UIProcess/Extensions/WebExtensionContext.h
    M Source/WebKit/UIProcess/Extensions/WebExtensionContext.messages.in
    M 
Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIStorageAreaCocoa.mm
    M 
Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIStorageCocoa.mm
    M Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h
    M Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.messages.in

  Log Message:
  -----------
  Retrieving a large amount of data at once from browser.local.get() causes a 
crash
https://bugs.webkit.org/show_bug.cgi?id=303940
rdar://164358359

Reviewed by Timothy Hatcher.

Converting a large amount of data into a JSON string at once was causing to 
buffer in StringBuilder
to overflow. Since StringBuilder can only allocate space for INT_MAX number of 
characters, convert
the data retrieved from storage in chunks instead of all at once if we've hit a 
conservative threshold.

With this new approach, we send an array of serialized JSON strings back to the 
WebProcess, where
these strings will be converted into dictionaries and merged into one.

I attempted to write a test to verify this, but storing this much data at once 
was causing the test
to timeout.

Testing:
- Verified that a call to browser.storage.local.get() after storing 2GB of data 
does not lead to a crash.
- Verified that firing the storage onChanged event after storing 2GB of data 
does not lead to a crash.

* Source/WebKit/Shared/Extensions/WebExtensionUtilities.cpp:
(WebKit::serializeToMultipleJSONStrings):
* Source/WebKit/Shared/Extensions/WebExtensionUtilities.h:
* Source/WebKit/UIProcess/Extensions/API/WebExtensionContextAPIStorage.cpp:
(WebKit::WebExtensionContext::storageGet):
(WebKit::WebExtensionContext::fireStorageChangedEventIfNeeded):
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.h:
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.messages.in:
* 
Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIStorageAreaCocoa.mm:
(WebKit::WebExtensionAPIStorageArea::get):
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIStorageCocoa.mm:
(WebKit::WebExtensionContextProxy::dispatchStorageChangedEvent):
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h:
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.messages.in:

Canonical link: https://commits.webkit.org/304381@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to