Skip to content

Commit

Permalink
Cherry-pick 1e5e288. rdar://123199880
Browse files Browse the repository at this point in the history
    Use Expected for error reporting in Web Extensions completionHandlers.
    https://webkit.org/b/269681
    rdar://123199880

    Reviewed by Brian Weinstein.

    Instead of using std::optional<String> for errors, and std::optional for the
    real result, wrap them together with Expected to be more efficient.

    Also use r-value references for these results, so the result is moved instead
    of copied when the completionHandler is called.

    Added two helper templates for toWebAPI that that return nil for std::optional
    wrapped objects that have a toWebAPI function, and similarly for Vector wrapped
    objects to get an NSArray result.

    Some other misc drive-by fixes too, like using Ref and RefPtr explicitly, and
    not using toUInt64() when sending a message for the destination identifier.

    All existing Web Extension API tests pass, except WKWebExtensionAPIWindows,
    CreateIncognitoWithoutPrivateAccess needed updated expectations for null.

    * Source/WebKit/Scripts/webkit/messages.py:
    (headers_for_type):
    * Source/WebKit/Shared/Extensions/WebExtensionConstants.h:
    * Source/WebKit/Shared/Extensions/WebExtensionError.h: Added.
    * Source/WebKit/Shared/Extensions/WebExtensionUtilities.h:
    (WebKit::toWebAPI):
    (WebKit::toWebExtensionError):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIActionCocoa.mm:
    (WebKit::getActionWithIdentifiers):
    (WebKit::getOrCreateActionWithIdentifiers):
    (WebKit::WebExtensionContext::actionGetTitle):
    (WebKit::WebExtensionContext::actionSetTitle):
    (WebKit::WebExtensionContext::actionSetIcon):
    (WebKit::WebExtensionContext::actionGetPopup):
    (WebKit::WebExtensionContext::actionSetPopup):
    (WebKit::WebExtensionContext::actionOpenPopup):
    (WebKit::WebExtensionContext::actionGetBadgeText):
    (WebKit::WebExtensionContext::actionSetBadgeText):
    (WebKit::WebExtensionContext::actionGetEnabled):
    (WebKit::WebExtensionContext::actionSetEnabled):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIAlarmsCocoa.mm:
    (WebKit::WebExtensionContext::alarmsGet):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPICookiesCocoa.mm:
    (WebKit::WebExtensionContext::fetchCookies):
    (WebKit::WebExtensionContext::cookiesGet):
    (WebKit::WebExtensionContext::cookiesGetAll):
    (WebKit::WebExtensionContext::cookiesSet):
    (WebKit::WebExtensionContext::cookiesRemove):
    (WebKit::WebExtensionContext::cookiesGetAllCookieStores):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIDeclarativeNetRequestCocoa.mm:
    (WebKit::WebExtensionContext::declarativeNetRequestGetEnabledRulesets):
    (WebKit::WebExtensionContext::declarativeNetRequestValidateRulesetIdentifiers):
    (WebKit::WebExtensionContext::declarativeNetRequestUpdateEnabledRulesets):
    (WebKit::WebExtensionContext::declarativeNetRequestDisplayActionCountAsBadgeText):
    (WebKit::WebExtensionContext::declarativeNetRequestIncrementActionCount):
    (WebKit::WebExtensionContext::declarativeNetRequestGetMatchedRules):
    (WebKit::WebExtensionContext::updateDeclarativeNetRequestRulesInStorage):
    (WebKit::WebExtensionContext::declarativeNetRequestGetDynamicRules):
    (WebKit::WebExtensionContext::declarativeNetRequestUpdateDynamicRules):
    (WebKit::WebExtensionContext::declarativeNetRequestGetSessionRules):
    (WebKit::WebExtensionContext::declarativeNetRequestUpdateSessionRules):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIDevToolsInspectedWindow.mm:
    (WebKit::WebExtensionContext::devToolsInspectedWindowEval):
    (WebKit::WebExtensionContext::devToolsInspectedWindowReload):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIDevToolsPanels.mm:
    (WebKit::WebExtensionContext::devToolsPanelsCreate):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIMenusCocoa.mm:
    (WebKit::WebExtensionContext::menusCreate):
    (WebKit::WebExtensionContext::menusUpdate):
    (WebKit::WebExtensionContext::menusRemove):
    (WebKit::WebExtensionContext::menusRemoveAll):
    (WebKit::WebExtensionContext::fireMenusClickedEventIfNeeded):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIPermissionsCocoa.mm:
    (WebKit::WebExtensionContext::permissionsGetAll):
    (WebKit::WebExtensionContext::permissionsContains):
    (WebKit::WebExtensionContext::permissionsRequest):
    (WebKit::WebExtensionContext::permissionsRemove):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIRuntimeCocoa.mm:
    (WebKit::WebExtensionContext::runtimeGetBackgroundPage):
    (WebKit::WebExtensionContext::runtimeOpenOptionsPage):
    (WebKit::WebExtensionContext::runtimeSendMessage):
    (WebKit::WebExtensionContext::runtimeConnect):
    (WebKit::WebExtensionContext::runtimeSendNativeMessage):
    (WebKit::WebExtensionContext::runtimeConnectNative):
    (WebKit::WebExtensionContext::runtimeWebPageSendMessage):
    (WebKit::WebExtensionContext::runtimeWebPageConnect):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIScriptingCocoa.mm:
    (WebKit::WebExtensionContext::scriptingExecuteScript):
    (WebKit::WebExtensionContext::scriptingInsertCSS):
    (WebKit::WebExtensionContext::scriptingRemoveCSS):
    (WebKit::WebExtensionContext::scriptingRegisterContentScripts):
    (WebKit::WebExtensionContext::scriptingUpdateRegisteredScripts):
    (WebKit::WebExtensionContext::scriptingGetRegisteredScripts):
    (WebKit::WebExtensionContext::scriptingUnregisterContentScripts):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIStorageCocoa.mm:
    (WebKit::WebExtensionContext::storageGet):
    (WebKit::WebExtensionContext::storageGetBytesInUse):
    (WebKit::WebExtensionContext::storageSet):
    (WebKit::WebExtensionContext::storageRemove):
    (WebKit::WebExtensionContext::storageClear):
    (WebKit::WebExtensionContext::storageSetAccessLevel):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPITabsCocoa.mm:
    (WebKit::WebExtensionContext::tabsCreate):
    (WebKit::WebExtensionContext::tabsUpdate):
    (WebKit::WebExtensionContext::tabsDuplicate):
    (WebKit::WebExtensionContext::tabsGet):
    (WebKit::WebExtensionContext::tabsGetCurrent):
    (WebKit::WebExtensionContext::tabsQuery):
    (WebKit::WebExtensionContext::tabsReload):
    (WebKit::WebExtensionContext::tabsGoBack):
    (WebKit::WebExtensionContext::tabsGoForward):
    (WebKit::WebExtensionContext::tabsDetectLanguage):
    (WebKit::WebExtensionContext::tabsCaptureVisibleTab):
    (WebKit::WebExtensionContext::tabsToggleReaderMode):
    (WebKit::WebExtensionContext::tabsSendMessage):
    (WebKit::WebExtensionContext::tabsConnect):
    (WebKit::WebExtensionContext::tabsGetZoom):
    (WebKit::WebExtensionContext::tabsSetZoom):
    (WebKit::WebExtensionContext::tabsRemove):
    (WebKit::WebExtensionContext::tabsExecuteScript):
    (WebKit::WebExtensionContext::tabsInsertCSS):
    (WebKit::WebExtensionContext::tabsRemoveCSS):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIWebNavigationCocoa.mm:
    (WebKit::frameParametersForFrame):
    (WebKit::WebExtensionContext::webNavigationGetFrame):
    (WebKit::WebExtensionContext::webNavigationGetAllFrames):
    * Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIWindowsCocoa.mm:
    (WebKit::WebExtensionContext::windowsCreate):
    (WebKit::WebExtensionContext::windowsGet):
    (WebKit::WebExtensionContext::windowsGetLastFocused):
    (WebKit::WebExtensionContext::windowsGetAll):
    (WebKit::WebExtensionContext::windowsUpdate):
    (WebKit::WebExtensionContext::windowsRemove):
    * Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
    (WebKit::WebExtensionContext::openNewTab):
    * Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionDynamicScriptsCocoa.mm:
    (WebKit::WebExtensionDynamicScripts::InjectionResultHolder::create):
    (WebKit::WebExtensionDynamicScripts::executeScript):
    * Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionTabCocoa.mm:
    (WebKit::WebExtensionTab::setParentTab):
    (WebKit::WebExtensionTab::pin):
    (WebKit::WebExtensionTab::unpin):
    (WebKit::WebExtensionTab::toggleReaderMode):
    (WebKit::WebExtensionTab::mute):
    (WebKit::WebExtensionTab::unmute):
    (WebKit::WebExtensionTab::setZoomFactor):
    (WebKit::WebExtensionTab::detectWebpageLocale):
    (WebKit::WebExtensionTab::captureVisibleWebpage):
    (WebKit::WebExtensionTab::loadURL):
    (WebKit::WebExtensionTab::reload):
    (WebKit::WebExtensionTab::reloadFromOrigin):
    (WebKit::WebExtensionTab::goBack):
    (WebKit::WebExtensionTab::goForward):
    (WebKit::WebExtensionTab::activate):
    (WebKit::WebExtensionTab::select):
    (WebKit::WebExtensionTab::deselect):
    (WebKit::WebExtensionTab::duplicate):
    (WebKit::WebExtensionTab::close):
    * Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionWindowCocoa.mm:
    (WebKit::WebExtensionWindow::setState):
    (WebKit::WebExtensionWindow::focus):
    (WebKit::WebExtensionWindow::setFrame):
    (WebKit::WebExtensionWindow::close):
    * Source/WebKit/UIProcess/Extensions/WebExtensionContext.h:
    * Source/WebKit/UIProcess/Extensions/WebExtensionContext.messages.in:
    * Source/WebKit/UIProcess/Extensions/WebExtensionController.messages.in:
    * Source/WebKit/UIProcess/Extensions/WebExtensionDynamicScripts.h:
    (WebKit::WebExtensionDynamicScripts::InjectionResultHolder::create): Deleted.
    (WebKit::WebExtensionDynamicScripts::InjectionResultHolder::InjectionResultHolder): Deleted.
    * Source/WebKit/UIProcess/Extensions/WebExtensionTab.h:
    * Source/WebKit/UIProcess/Extensions/WebExtensionWindow.h:
    * Source/WebKit/WebKit.xcodeproj/project.pbxproj:
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIActionCocoa.mm:
    (WebKit::WebExtensionAPIAction::getTitle):
    (WebKit::WebExtensionAPIAction::setTitle):
    (WebKit::WebExtensionAPIAction::getBadgeText):
    (WebKit::WebExtensionAPIAction::setBadgeText):
    (WebKit::WebExtensionAPIAction::enable):
    (WebKit::WebExtensionAPIAction::disable):
    (WebKit::WebExtensionAPIAction::isEnabled):
    (WebKit::WebExtensionAPIAction::setIcon):
    (WebKit::WebExtensionAPIAction::getPopup):
    (WebKit::WebExtensionAPIAction::setPopup):
    (WebKit::WebExtensionAPIAction::openPopup):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIAlarmsCocoa.mm:
    (WebKit::toWebAPI):
    (WebKit::WebExtensionAPIAlarms::get):
    (WebKit::WebExtensionAPIAlarms::getAll):
    (WebKit::WebExtensionAPIAlarms::clear):
    (WebKit::WebExtensionAPIAlarms::clearAll):
    (WebKit::WebExtensionContextProxy::dispatchAlarmsEvent):
    (WebKit::toAPI): Deleted.
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPICommandsCocoa.mm:
    (WebKit::WebExtensionAPICommands::getAll):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPICookiesCocoa.mm:
    (WebKit::WebExtensionAPICookies::get):
    (WebKit::WebExtensionAPICookies::getAll):
    (WebKit::WebExtensionAPICookies::set):
    (WebKit::WebExtensionAPICookies::remove):
    (WebKit::WebExtensionAPICookies::getAllCookieStores):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIDeclarativeNetRequestCocoa.mm:
    (WebKit::WebExtensionAPIDeclarativeNetRequest::updateEnabledRulesets):
    (WebKit::WebExtensionAPIDeclarativeNetRequest::updateDynamicRules):
    (WebKit::WebExtensionAPIDeclarativeNetRequest::getDynamicRules):
    (WebKit::WebExtensionAPIDeclarativeNetRequest::updateSessionRules):
    (WebKit::WebExtensionAPIDeclarativeNetRequest::getSessionRules):
    (WebKit::toWebAPI):
    (WebKit::WebExtensionAPIDeclarativeNetRequest::getMatchedRules):
    (WebKit::WebExtensionAPIDeclarativeNetRequest::setExtensionActionOptions):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIDevToolsInspectedWindowCocoa.mm:
    (WebKit::WebExtensionAPIDevToolsInspectedWindow::eval):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIDevToolsPanelsCocoa.mm:
    (WebKit::WebExtensionAPIDevToolsPanels::createPanel):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIMenusCocoa.mm:
    (WebKit::WebExtensionAPIMenus::createMenu):
    (WebKit::WebExtensionAPIMenus::update):
    (WebKit::WebExtensionAPIMenus::remove):
    (WebKit::WebExtensionAPIMenus::removeAll):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIPermissionsCocoa.mm:
    (WebKit::WebExtensionAPIPermissions::getAll):
    (WebKit::WebExtensionAPIPermissions::contains):
    (WebKit::WebExtensionAPIPermissions::request):
    (WebKit::WebExtensionAPIPermissions::remove):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIRuntimeCocoa.mm:
    (WebKit::WebExtensionAPIRuntime::getBackgroundPage):
    (WebKit::WebExtensionAPIRuntime::openOptionsPage):
    (WebKit::WebExtensionAPIRuntime::sendMessage):
    (WebKit::WebExtensionAPIRuntime::connect):
    (WebKit::WebExtensionAPIRuntime::sendNativeMessage):
    (WebKit::WebExtensionAPIRuntime::connectNative):
    (WebKit::WebExtensionAPIWebPageRuntime::sendMessage):
    (WebKit::WebExtensionAPIWebPageRuntime::connect):
    (WebKit::WebExtensionContextProxy::internalDispatchRuntimeMessageEvent):
    (WebKit::WebExtensionContextProxy::dispatchRuntimeMessageEvent):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIScriptingCocoa.mm:
    (WebKit::toWebAPI):
    (WebKit::WebExtensionAPIScripting::executeScript):
    (WebKit::WebExtensionAPIScripting::insertCSS):
    (WebKit::WebExtensionAPIScripting::removeCSS):
    (WebKit::WebExtensionAPIScripting::registerContentScripts):
    (WebKit::WebExtensionAPIScripting::getRegisteredContentScripts):
    (WebKit::WebExtensionAPIScripting::updateContentScripts):
    (WebKit::WebExtensionAPIScripting::unregisterContentScripts):
    (WebKit::WebExtensionAPIScripting::validateScript):
    (WebKit::WebExtensionAPIScripting::parseScriptInjectionOptions):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIStorageAreaCocoa.mm:
    (WebKit::WebExtensionAPIStorageArea::get):
    (WebKit::WebExtensionAPIStorageArea::getBytesInUse):
    (WebKit::WebExtensionAPIStorageArea::set):
    (WebKit::WebExtensionAPIStorageArea::remove):
    (WebKit::WebExtensionAPIStorageArea::clear):
    (WebKit::WebExtensionAPIStorageArea::setAccessLevel):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPITabsCocoa.mm:
    (WebKit::WebExtensionAPITabs::createTab):
    (WebKit::WebExtensionAPITabs::query):
    (WebKit::WebExtensionAPITabs::get):
    (WebKit::WebExtensionAPITabs::getCurrent):
    (WebKit::WebExtensionAPITabs::getSelected):
    (WebKit::WebExtensionAPITabs::duplicate):
    (WebKit::WebExtensionAPITabs::update):
    (WebKit::WebExtensionAPITabs::remove):
    (WebKit::WebExtensionAPITabs::reload):
    (WebKit::WebExtensionAPITabs::goBack):
    (WebKit::WebExtensionAPITabs::goForward):
    (WebKit::WebExtensionAPITabs::getZoom):
    (WebKit::WebExtensionAPITabs::setZoom):
    (WebKit::WebExtensionAPITabs::detectLanguage):
    (WebKit::WebExtensionAPITabs::toggleReaderMode):
    (WebKit::WebExtensionAPITabs::captureVisibleTab):
    (WebKit::WebExtensionAPITabs::sendMessage):
    (WebKit::WebExtensionAPITabs::connect):
    (WebKit::WebExtensionAPITabs::executeScript):
    (WebKit::WebExtensionAPITabs::insertCSS):
    (WebKit::WebExtensionAPITabs::removeCSS):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIWebNavigationCocoa.mm:
    (WebKit::WebExtensionAPIWebNavigation::getAllFrames):
    (WebKit::WebExtensionAPIWebNavigation::getFrame):
    * Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIWindowsCocoa.mm:
    (WebKit::WebExtensionAPIWindows::createWindow):
    (WebKit::WebExtensionAPIWindows::get):
    (WebKit::WebExtensionAPIWindows::getCurrent):
    (WebKit::WebExtensionAPIWindows::getLastFocused):
    (WebKit::WebExtensionAPIWindows::getAll):
    (WebKit::WebExtensionAPIWindows::update):
    (WebKit::WebExtensionAPIWindows::remove):
    (WebKit::WebExtensionContextProxy::dispatchWindowsEvent):
    * Source/WebKit/WebProcess/Extensions/API/WebExtensionAPIScripting.h:
    * Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h:
    * Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.messages.in:

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

Identifier: 274471.484@safari-7619.1.5-branch
  • Loading branch information
xeenon authored and Dan Robson committed Feb 23, 2024
1 parent 9e131aa commit 7b50310
Show file tree
Hide file tree
Showing 52 changed files with 1,418 additions and 1,430 deletions.
1 change: 1 addition & 0 deletions Source/WebKit/Scripts/webkit/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -1000,6 +1000,7 @@ def headers_for_type(type):
'WebKit::WebEventType': ['"WebEvent.h"'],
'WebKit::WebExtensionContext::InstallReason': ['"WebExtensionContext.h"'],
'WebKit::WebExtensionCookieFilterParameters': ['"WebExtensionCookieParameters.h"'],
'WebKit::WebExtensionError': ['"WebExtensionError.h"'],
'WebKit::WebExtensionTab::ImageFormat': ['"WebExtensionTab.h"'],
'WebKit::WebGPU::BindGroupDescriptor': ['"WebGPUBindGroupDescriptor.h"'],
'WebKit::WebGPU::BindGroupEntry': ['"WebGPUBindGroupEntry.h"'],
Expand Down
8 changes: 6 additions & 2 deletions Source/WebKit/Shared/Extensions/WebExtensionConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,16 @@

namespace WebKit {

// MARK: Declarative Net Request constants.
// MARK: Message Passing
/// This matches the maximum message length enforced by Chromium in its `MessageFromJSONString()` function.
constexpr size_t webExtensionMaxMessageLength = 1024 * 1024 * 64;

// MARK: Declarative Net Request
static constexpr size_t webExtensionDeclarativeNetRequestMaximumNumberOfStaticRulesets = 100;
static constexpr size_t webExtensionDeclarativeNetRequestMaximumNumberOfEnabledRulesets = 50;
static constexpr size_t webExtensionDeclarativeNetRequestMaximumNumberOfDynamicAndSessionRules = 5000;

// MARK: Storage constants.
// MARK: Storage
static constexpr double webExtensionUnlimitedStorageQuotaBytes = std::numeric_limits<double>::max();

static constexpr size_t webExtensionStorageAreaLocalQuotaBytes = 5 * 1024 * 1024;
Expand Down
38 changes: 38 additions & 0 deletions Source/WebKit/Shared/Extensions/WebExtensionError.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright (C) 2024 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

#if ENABLE(WK_WEB_EXTENSIONS)

#include <wtf/text/WTFString.h>

namespace WebKit {

using WebExtensionError = String;

} // namespace WTF

#endif // ENABLE(WK_WEB_EXTENSIONS)
8 changes: 4 additions & 4 deletions Source/WebKit/Shared/Extensions/WebExtensionFrameIdentifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ inline WebCore::FrameIdentifier toWebCoreFrameIdentifier(const WebExtensionFrame

inline bool matchesFrame(const WebExtensionFrameIdentifier& identifier, const WebFrame& frame)
{
if (auto* coreFrame = frame.coreFrame(); coreFrame->isMainFrame() && isMainFrame(identifier))
if (RefPtr coreFrame = frame.coreFrame(); coreFrame && coreFrame->isMainFrame() && isMainFrame(identifier))
return true;

if (auto* page = frame.page(); &page->mainWebFrame() == &frame && isMainFrame(identifier))
if (RefPtr page = frame.page(); page && &page->mainWebFrame() == &frame && isMainFrame(identifier))
return true;

return frame.frameID().object().toUInt64() == identifier.toUInt64();
Expand All @@ -107,10 +107,10 @@ inline WebExtensionFrameIdentifier toWebExtensionFrameIdentifier(WebCore::FrameI

inline WebExtensionFrameIdentifier toWebExtensionFrameIdentifier(const WebFrame& frame)
{
if (auto* coreFrame = frame.coreFrame(); coreFrame->isMainFrame())
if (RefPtr coreFrame = frame.coreFrame(); coreFrame && coreFrame->isMainFrame())
return WebExtensionFrameConstants::MainFrameIdentifier;

if (auto* page = frame.page(); &page->mainWebFrame() == &frame)
if (RefPtr page = frame.page(); page && &page->mainWebFrame() == &frame)
return WebExtensionFrameConstants::MainFrameIdentifier;

return toWebExtensionFrameIdentifier(frame.frameID());
Expand Down
43 changes: 40 additions & 3 deletions Source/WebKit/Shared/Extensions/WebExtensionUtilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,18 @@

#if ENABLE(WK_WEB_EXTENSIONS)

#import "WebExtensionError.h"
#import <JavaScriptCore/JSBase.h>

#ifdef __OBJC__
#import <wtf/RetainPtr.h>
#import <wtf/cocoa/VectorCocoa.h>
#endif

namespace WebKit {

#ifdef __OBJC__

/// Verifies that a dictionary:
/// - Contains a required set of string keys, as listed in `requiredKeys`, all other types specified in `keyTypes` are optional keys.
/// - Has values that are the appropriate type for each key, as specified by `keyTypes`. The keys in this dictionary
Expand Down Expand Up @@ -59,9 +67,6 @@ JSObjectRef toJSError(JSContextRef, NSString *callingAPIName, NSString *sourceKe

NSString *toWebAPI(NSLocale *);

/// This matches the maximum message length enforced by Chromium in its `MessageFromJSONString()` function.
constexpr size_t webExtensionMaxMessageLength = 1024 * 1024 * 64;

/// Returns the storage size of a string.
size_t storageSizeOf(NSString *);

Expand All @@ -71,6 +76,38 @@ size_t storageSizeOf(NSDictionary<NSString *, NSString *> *);
/// Returns true if the size of any item in the dictionary exceeds the given quota.
bool anyItemsExceedQuota(NSDictionary *, size_t quota, NSString **outKeyWithError = nullptr);

enum class UseNullValue : bool { No, Yes };

template<typename T>
id toWebAPI(const std::optional<T>& result, UseNullValue useNull = UseNullValue::Yes)
{
if (!result)
return useNull == UseNullValue::Yes ? NSNull.null : nil;
return toWebAPI(result.value());
}

template<typename T>
NSArray *toWebAPI(const Vector<T>& items)
{
return createNSArray(items, [](const T& item) {
return toWebAPI(item);
}).get();
}

inline NSNumber *toWebAPI(size_t index)
{
return index != notFound ? @(index) : @(std::numeric_limits<double>::quiet_NaN());
}

/// Returns an error for Expected results in CompletionHandler.
template<typename... Args>
Unexpected<WebExtensionError> toWebExtensionError(NSString *callingAPIName, NSString *sourceKey, NSString *underlyingErrorString, Args&&... args)
{
return makeUnexpected(String(toErrorString(callingAPIName, sourceKey, underlyingErrorString, std::forward<Args>(args)...)));
}

#endif // __OBJC__

} // namespace WebKit

#endif // ENABLE(WK_WEB_EXTENSIONS)
Loading

0 comments on commit 7b50310

Please sign in to comment.