Skip to content

Commit

Permalink
Add interface and parsing support Web Extensions cookies API.
Browse files Browse the repository at this point in the history
https://webkit.org/b/261771
rdar://problem/115743156

Reviewed by Brian Weinstein.

* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources-output.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPICookiesCocoa.mm: Added.
(WebKit::WebExtensionAPICookies::get):
(WebKit::WebExtensionAPICookies::getAll):
(WebKit::WebExtensionAPICookies::set):
(WebKit::WebExtensionAPICookies::remove):
(WebKit::WebExtensionAPICookies::getAllCookieStores):
(WebKit::WebExtensionAPICookies::onChanged):
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPINamespaceCocoa.mm:
(WebKit::WebExtensionAPINamespace::cookies):
* Source/WebKit/WebProcess/Extensions/API/WebExtensionAPICookies.h: Added.
* Source/WebKit/WebProcess/Extensions/API/WebExtensionAPINamespace.h:
* Source/WebKit/WebProcess/Extensions/Interfaces/WebExtensionAPICookies.idl: Added.
* Source/WebKit/WebProcess/Extensions/Interfaces/WebExtensionAPINamespace.idl:
* Tools/TestWebKitAPI/SourcesCocoa.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionAPICookies.mm: Added.
(TestWebKitAPI::TEST):

Canonical link: https://commits.webkit.org/272157@main
  • Loading branch information
xeenon committed Dec 16, 2023
1 parent 7611f52 commit 6dd1c2e
Show file tree
Hide file tree
Showing 13 changed files with 508 additions and 1 deletion.
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources-input.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ $(PROJECT_DIR)/WebProcess/Extensions/Bindings/Scripts/IDLAttributes.json
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPIAction.idl
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPIAlarms.idl
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPICommands.idl
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPICookies.idl
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPIDeclarativeNetRequest.idl
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPIEvent.idl
$(PROJECT_DIR)/WebProcess/Extensions/Interfaces/WebExtensionAPIExtension.idl
Expand Down
2 changes: 2 additions & 0 deletions Source/WebKit/DerivedSources-output.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPIAlarms.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPIAlarms.mm
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPICommands.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPICommands.mm
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPICookies.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPICookies.mm
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPIDeclarativeNetRequest.h
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPIDeclarativeNetRequest.mm
$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/JSWebExtensionAPIEvent.h
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources.make
Original file line number Diff line number Diff line change
Expand Up @@ -790,6 +790,7 @@ EXTENSION_INTERFACES = \
WebExtensionAPIAction \
WebExtensionAPIAlarms \
WebExtensionAPICommands \
WebExtensionAPICookies \
WebExtensionAPIDeclarativeNetRequest \
WebExtensionAPIEvent \
WebExtensionAPIExtension \
Expand Down
18 changes: 18 additions & 0 deletions Source/WebKit/WebKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,10 @@
1C3BEB7C2888A01000E66E38 /* WebExtensionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CC23B1C288732A800D0A65A /* WebExtensionController.h */; };
1C3BEB7D2888A01600E66E38 /* WebExtensionControllerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CC23B20288732F600D0A65A /* WebExtensionControllerProxy.h */; };
1C3D0AC1291AE6210093F67E /* WebExtensionControllerProxyCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1C3D0AC0291AE6200093F67E /* WebExtensionControllerProxyCocoa.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
1C4005272B2B937E00F2D9EE /* WebExtensionAPICookies.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C4005262B2B937E00F2D9EE /* WebExtensionAPICookies.h */; };
1C4005292B2B938D00F2D9EE /* WebExtensionAPICookiesCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1C4005282B2B938D00F2D9EE /* WebExtensionAPICookiesCocoa.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
1C40052C2B2B953D00F2D9EE /* JSWebExtensionAPICookies.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1C40052A2B2B953C00F2D9EE /* JSWebExtensionAPICookies.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
1C40052D2B2B953D00F2D9EE /* JSWebExtensionAPICookies.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C40052B2B2B953D00F2D9EE /* JSWebExtensionAPICookies.h */; };
1C49579B2A9813AA007D0B64 /* WebExtensionContextAPIWindowsCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1C49579A2A9813AA007D0B64 /* WebExtensionContextAPIWindowsCocoa.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
1C49579D2A983DE4007D0B64 /* WebExtensionWindowParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C49579C2A983DE4007D0B64 /* WebExtensionWindowParameters.h */; };
1C4957A12A983E2B007D0B64 /* WebExtensionTabParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C4957A02A983E2B007D0B64 /* WebExtensionTabParameters.h */; };
Expand Down Expand Up @@ -3633,6 +3637,11 @@
1C3BEB6E288883E200E66E38 /* _WKWebExtension.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKWebExtension.mm; sourceTree = "<group>"; };
1C3BEB6F288883E300E66E38 /* _WKWebExtensionPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = _WKWebExtensionPrivate.h; sourceTree = "<group>"; };
1C3D0AC0291AE6200093F67E /* WebExtensionControllerProxyCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebExtensionControllerProxyCocoa.mm; sourceTree = "<group>"; };
1C4005252B2B932800F2D9EE /* WebExtensionAPICookies.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebExtensionAPICookies.idl; sourceTree = "<group>"; };
1C4005262B2B937E00F2D9EE /* WebExtensionAPICookies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebExtensionAPICookies.h; sourceTree = "<group>"; };
1C4005282B2B938D00F2D9EE /* WebExtensionAPICookiesCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebExtensionAPICookiesCocoa.mm; sourceTree = "<group>"; };
1C40052A2B2B953C00F2D9EE /* JSWebExtensionAPICookies.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JSWebExtensionAPICookies.mm; sourceTree = "<group>"; };
1C40052B2B2B953D00F2D9EE /* JSWebExtensionAPICookies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebExtensionAPICookies.h; sourceTree = "<group>"; };
1C49579A2A9813AA007D0B64 /* WebExtensionContextAPIWindowsCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebExtensionContextAPIWindowsCocoa.mm; sourceTree = "<group>"; };
1C49579C2A983DE4007D0B64 /* WebExtensionWindowParameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebExtensionWindowParameters.h; sourceTree = "<group>"; };
1C49579E2A983DF1007D0B64 /* WebExtensionWindow.serialization.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebExtensionWindow.serialization.in; sourceTree = "<group>"; };
Expand Down Expand Up @@ -9203,6 +9212,7 @@
1CC94E552AC92F960045F269 /* WebExtensionAPIAction.h */,
1C2B4D452A8199CC00C528A1 /* WebExtensionAPIAlarms.h */,
1C8ECFE32AFC79E9007BAA62 /* WebExtensionAPICommands.h */,
1C4005262B2B937E00F2D9EE /* WebExtensionAPICookies.h */,
3311023A2B17B49E00B21C8C /* WebExtensionAPIDeclarativeNetRequest.h */,
B6544F912937E45000034EB0 /* WebExtensionAPIEvent.h */,
1C5DC468290B239C0061EC62 /* WebExtensionAPIExtension.h */,
Expand Down Expand Up @@ -9231,6 +9241,7 @@
1CC94E572AC92FA50045F269 /* WebExtensionAPIActionCocoa.mm */,
1C2B4D432A8199C100C528A1 /* WebExtensionAPIAlarmsCocoa.mm */,
1C8ECFE52AFC79F9007BAA62 /* WebExtensionAPICommandsCocoa.mm */,
1C4005282B2B938D00F2D9EE /* WebExtensionAPICookiesCocoa.mm */,
3311023C2B17B4EE00B21C8C /* WebExtensionAPIDeclarativeNetRequestCocoa.mm */,
B6544F952937E46900034EB0 /* WebExtensionAPIEventCocoa.mm */,
1C5DC465290B23890061EC62 /* WebExtensionAPIExtensionCocoa.mm */,
Expand Down Expand Up @@ -9396,6 +9407,7 @@
1CC94E502AC92E9F0045F269 /* WebExtensionAPIAction.idl */,
1C2B4D472A819C4700C528A1 /* WebExtensionAPIAlarms.idl */,
1C8ECFE22AFC79BC007BAA62 /* WebExtensionAPICommands.idl */,
1C4005252B2B932800F2D9EE /* WebExtensionAPICookies.idl */,
331102392B17AFD800B21C8C /* WebExtensionAPIDeclarativeNetRequest.idl */,
B6544F7C29357B1B00034EB0 /* WebExtensionAPIEvent.idl */,
1C9DD99028FA19A30093BDB0 /* WebExtensionAPIExtension.idl */,
Expand Down Expand Up @@ -14244,6 +14256,8 @@
1C2B4D492A819D0C00C528A1 /* JSWebExtensionAPIAlarms.mm */,
1C8ECFE72AFC7DCB007BAA62 /* JSWebExtensionAPICommands.h */,
1C8ECFE82AFC7DCB007BAA62 /* JSWebExtensionAPICommands.mm */,
1C40052B2B2B953D00F2D9EE /* JSWebExtensionAPICookies.h */,
1C40052A2B2B953C00F2D9EE /* JSWebExtensionAPICookies.mm */,
3311023F2B17B99800B21C8C /* JSWebExtensionAPIDeclarativeNetRequest.h */,
3311023E2B17B99800B21C8C /* JSWebExtensionAPIDeclarativeNetRequest.mm */,
B6114A7C2939498000380B1B /* JSWebExtensionAPIEvent.h */,
Expand Down Expand Up @@ -15472,6 +15486,7 @@
9B47908F253151CC00EC11AB /* JSIPCBinding.h in Headers */,
1CC94E542AC92F190045F269 /* JSWebExtensionAPIAction.h in Headers */,
1C8ECFE92AFC7DCB007BAA62 /* JSWebExtensionAPICommands.h in Headers */,
1C40052D2B2B953D00F2D9EE /* JSWebExtensionAPICookies.h in Headers */,
331102412B17B99800B21C8C /* JSWebExtensionAPIDeclarativeNetRequest.h in Headers */,
1CCEE4522B0989FC0034E059 /* JSWebExtensionAPIMenus.h in Headers */,
1C386F352AF409F9004108F0 /* JSWebExtensionAPINotifications.h in Headers */,
Expand Down Expand Up @@ -15951,6 +15966,7 @@
1CC94E562AC92F960045F269 /* WebExtensionAPIAction.h in Headers */,
1C2B4D462A8199CD00C528A1 /* WebExtensionAPIAlarms.h in Headers */,
1C8ECFE42AFC79E9007BAA62 /* WebExtensionAPICommands.h in Headers */,
1C4005272B2B937E00F2D9EE /* WebExtensionAPICookies.h in Headers */,
3311023B2B17B49E00B21C8C /* WebExtensionAPIDeclarativeNetRequest.h in Headers */,
B6544F932937E45100034EB0 /* WebExtensionAPIEvent.h in Headers */,
1C5DC46D290B271E0061EC62 /* WebExtensionAPIExtension.h in Headers */,
Expand Down Expand Up @@ -18286,6 +18302,7 @@
1CC94E532AC92F190045F269 /* JSWebExtensionAPIAction.mm in Sources */,
1C2B4D4B2A819D0D00C528A1 /* JSWebExtensionAPIAlarms.mm in Sources */,
1C8ECFEA2AFC7DCB007BAA62 /* JSWebExtensionAPICommands.mm in Sources */,
1C40052C2B2B953D00F2D9EE /* JSWebExtensionAPICookies.mm in Sources */,
331102402B17B99800B21C8C /* JSWebExtensionAPIDeclarativeNetRequest.mm in Sources */,
B6114A7F29394A1600380B1B /* JSWebExtensionAPIEvent.mm in Sources */,
1C5DC471290B33A20061EC62 /* JSWebExtensionAPIExtension.mm in Sources */,
Expand Down Expand Up @@ -18624,6 +18641,7 @@
1CC94E582AC92FA50045F269 /* WebExtensionAPIActionCocoa.mm in Sources */,
1C2B4D442A8199C100C528A1 /* WebExtensionAPIAlarmsCocoa.mm in Sources */,
1C8ECFE62AFC79F9007BAA62 /* WebExtensionAPICommandsCocoa.mm in Sources */,
1C4005292B2B938D00F2D9EE /* WebExtensionAPICookiesCocoa.mm in Sources */,
3311023D2B17B4EE00B21C8C /* WebExtensionAPIDeclarativeNetRequestCocoa.mm in Sources */,
B6544F972937E46900034EB0 /* WebExtensionAPIEventCocoa.mm in Sources */,
1C5DC467290B23890061EC62 /* WebExtensionAPIExtensionCocoa.mm in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
/*
* Copyright (C) 2023 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.
*/

#if !__has_feature(objc_arc)
#error This file requires ARC. Add the "-fobjc-arc" compiler flag for this file.
#endif

#import "config.h"
#import "WebExtensionAPICookies.h"

#if ENABLE(WK_WEB_EXTENSIONS)

#import "CocoaHelpers.h"
#import "Logging.h"
#import "MessageSenderInlines.h"
#import "WebExtensionAPINamespace.h"
#import "WebExtensionContextMessages.h"
#import "WebExtensionContextProxy.h"
#import "WebExtensionUtilities.h"
#import "WebProcess.h"

namespace WebKit {

static NSString * const domainKey = @"domain";
static NSString * const expirationDateKey = @"expirationDate";
static NSString * const httpOnlyKey = @"httpOnly";
static NSString * const nameKey = @"name";
static NSString * const partitionKeyKey = @"partitionKey";
static NSString * const pathKey = @"path";
static NSString * const sameSiteKey = @"sameSite";
static NSString * const secureKey = @"secure";
static NSString * const sessionKey = @"session";
static NSString * const storeIdKey = @"storeId";
static NSString * const topLevelSiteKey = @"topLevelSite";
static NSString * const urlKey = @"url";
static NSString * const valueKey = @"value";

void WebExtensionAPICookies::get(NSDictionary *details, Ref<WebExtensionCallbackHandler>&& callback, NSString **outExceptionString)
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies/get

static NSArray<NSString *> *requiredKeys = @[
nameKey,
urlKey,
];

static NSDictionary<NSString *, id> *types = @{
nameKey: NSString.class,
partitionKeyKey: NSDictionary.class,
storeIdKey: NSString.class,
urlKey: NSString.class,
};

if (!validateDictionary(details, @"details", requiredKeys, types, outExceptionString))
return;

if (NSDictionary *partitionKey = details[partitionKeyKey]) {
if (!validateDictionary(partitionKey, partitionKeyKey, nil, @{ topLevelSiteKey: NSString.class }, outExceptionString))
return;
}

if (NSString *name = details[nameKey]; !name.length) {
*outExceptionString = toErrorString(nil, nameKey, @"it must not be empty");
return;
}

if (NSString *urlString = details[urlKey]) {
if (!urlString.length) {
*outExceptionString = toErrorString(nil, urlKey, @"it must not be empty");
return;
}

auto url = URL { urlString };
if (!url.isValid()) {
*outExceptionString = toErrorString(nil, urlKey, @"'%@' is not a valid URL", urlString);
return;
}
}

// FIXME: <https://webkit.org/b/261771> Implement.
callback->call();
}

void WebExtensionAPICookies::getAll(NSDictionary *details, Ref<WebExtensionCallbackHandler>&& callback, NSString **outExceptionString)
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies/getAll

static NSDictionary<NSString *, id> *types = @{
domainKey: NSString.class,
nameKey: NSString.class,
partitionKeyKey: NSDictionary.class,
pathKey: NSString.class,
secureKey: @YES.class,
sessionKey: @YES.class,
storeIdKey: NSString.class,
urlKey: NSString.class,
};

if (!validateDictionary(details, @"details", nil, types, outExceptionString))
return;

if (NSDictionary *partitionKey = details[partitionKeyKey]) {
if (!validateDictionary(partitionKey, partitionKeyKey, nil, @{ topLevelSiteKey: NSString.class }, outExceptionString))
return;
}

if (NSString *name = details[nameKey]; name && !name.length) {
*outExceptionString = toErrorString(nil, nameKey, @"it must not be empty");
return;
}

if (NSString *urlString = details[urlKey]) {
if (!urlString.length) {
*outExceptionString = toErrorString(nil, urlKey, @"it must not be empty");
return;
}

auto url = URL { urlString };
if (!url.isValid()) {
*outExceptionString = toErrorString(nil, urlKey, @"'%@' is not a valid URL", urlString);
return;
}
}

// FIXME: <https://webkit.org/b/261771> Implement.
callback->call(@[ ]);
}

void WebExtensionAPICookies::set(NSDictionary *details, Ref<WebExtensionCallbackHandler>&& callback, NSString **outExceptionString)
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies/set

static NSDictionary<NSString *, id> *types = @{
domainKey: NSString.class,
expirationDateKey: NSNumber.class,
httpOnlyKey: @YES.class,
nameKey: NSString.class,
partitionKeyKey: NSDictionary.class,
pathKey: NSString.class,
sameSiteKey: NSString.class,
secureKey: @YES.class,
storeIdKey: NSString.class,
urlKey: NSString.class,
valueKey: NSString.class,
};

if (!validateDictionary(details, @"details", nil, types, outExceptionString))
return;

if (NSDictionary *partitionKey = details[partitionKeyKey]) {
if (!validateDictionary(partitionKey, partitionKeyKey, nil, @{ topLevelSiteKey: NSString.class }, outExceptionString))
return;
}

if (NSString *name = details[nameKey]; name && !name.length) {
*outExceptionString = toErrorString(nil, nameKey, @"it must not be empty");
return;
}

if (NSString *urlString = details[urlKey]) {
if (!urlString.length) {
*outExceptionString = toErrorString(nil, urlKey, @"it must not be empty");
return;
}

auto url = URL { urlString };
if (!url.isValid()) {
*outExceptionString = toErrorString(nil, urlKey, @"'%@' is not a valid URL", urlString);
return;
}
}

// FIXME: <https://webkit.org/b/261771> Implement.
callback->call();
}

void WebExtensionAPICookies::remove(NSDictionary *details, Ref<WebExtensionCallbackHandler>&& callback, NSString **outExceptionString)
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies/remove

static NSArray<NSString *> *requiredKeys = @[
nameKey,
urlKey,
];

static NSDictionary<NSString *, id> *types = @{
nameKey: NSString.class,
partitionKeyKey: NSDictionary.class,
storeIdKey: NSString.class,
urlKey: NSString.class,
};

if (!validateDictionary(details, @"details", requiredKeys, types, outExceptionString))
return;

if (NSDictionary *partitionKey = details[partitionKeyKey]) {
if (!validateDictionary(partitionKey, partitionKeyKey, nil, @{ topLevelSiteKey: NSString.class }, outExceptionString))
return;
}

if (NSString *name = details[nameKey]; !name.length) {
*outExceptionString = toErrorString(nil, nameKey, @"it must not be empty");
return;
}

if (NSString *urlString = details[urlKey]) {
if (!urlString.length) {
*outExceptionString = toErrorString(nil, urlKey, @"it must not be empty");
return;
}

auto url = URL { urlString };
if (!url.isValid()) {
*outExceptionString = toErrorString(nil, urlKey, @"'%@' is not a valid URL", urlString);
return;
}
}

// FIXME: Implement.
callback->call();
}

void WebExtensionAPICookies::getAllCookieStores(Ref<WebExtensionCallbackHandler>&& callback)
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies/getAllCookieStores

// FIXME: <https://webkit.org/b/261771> Implement.
callback->call(@[ ]);
}

WebExtensionAPIEvent& WebExtensionAPICookies::onChanged()
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies/onChanged

if (!m_onChanged)
m_onChanged = WebExtensionAPIEvent::create(forMainWorld(), runtime(), extensionContext(), WebExtensionEventListenerType::CookiesOnChanged);

return *m_onChanged;
}

} // namespace WebKit

#endif // ENABLE(WK_WEB_EXTENSIONS)
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,16 @@
return *m_commands;
}

WebExtensionAPICookies& WebExtensionAPINamespace::cookies()
{
// Documentation: https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/cookies

if (!m_cookies)
m_cookies = WebExtensionAPICookies::create(forMainWorld(), runtime(), extensionContext());

return *m_cookies;
}

WebExtensionAPIDeclarativeNetRequest& WebExtensionAPINamespace::declarativeNetRequest()
{
if (!m_declarativeNetRequest)
Expand Down
Loading

0 comments on commit 6dd1c2e

Please sign in to comment.