Unreviewed, fix iOS build with recent SDKs.
[WebKit-https.git] / Source / WebKit / UIProcess / API / Cocoa / WKHTTPCookieStore.mm
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "WKHTTPCookieStoreInternal.h"
28
29 #import "HTTPCookieAcceptPolicy.h"
30 #import <WebCore/Cookie.h>
31 #import <pal/spi/cf/CFNetworkSPI.h>
32 #import <wtf/HashMap.h>
33 #import <wtf/RetainPtr.h>
34 #import <wtf/URL.h>
35 #import <wtf/WeakObjCPtr.h>
36
37 static NSArray<NSHTTPCookie *> *coreCookiesToNSCookies(const Vector<WebCore::Cookie>& coreCookies)
38 {
39     NSMutableArray<NSHTTPCookie *> *nsCookies = [NSMutableArray arrayWithCapacity:coreCookies.size()];
40
41     for (auto& cookie : coreCookies)
42         [nsCookies addObject:(NSHTTPCookie *)cookie];
43
44     return nsCookies;
45 }
46
47 class WKHTTPCookieStoreObserver : public API::HTTPCookieStore::Observer {
48     WTF_MAKE_FAST_ALLOCATED;
49 public:
50     explicit WKHTTPCookieStoreObserver(id<WKHTTPCookieStoreObserver> observer)
51         : m_observer(observer)
52     {
53     }
54
55 private:
56     void cookiesDidChange(API::HTTPCookieStore& cookieStore) final
57     {
58         [m_observer cookiesDidChangeInCookieStore:wrapper(cookieStore)];
59     }
60
61     WeakObjCPtr<id<WKHTTPCookieStoreObserver>> m_observer;
62 };
63
64 @implementation WKHTTPCookieStore {
65     HashMap<CFTypeRef, std::unique_ptr<WKHTTPCookieStoreObserver>> _observers;
66 }
67
68 - (void)dealloc
69 {
70     for (auto& observer : _observers.values())
71         _cookieStore->unregisterObserver(*observer);
72
73     _cookieStore->API::HTTPCookieStore::~HTTPCookieStore();
74
75     [super dealloc];
76 }
77
78 - (void)getAllCookies:(void (^)(NSArray<NSHTTPCookie *> *))completionHandler
79 {
80     _cookieStore->cookies([handler = adoptNS([completionHandler copy])](const Vector<WebCore::Cookie>& cookies) {
81         auto rawHandler = (void (^)(NSArray<NSHTTPCookie *> *))handler.get();
82         rawHandler(coreCookiesToNSCookies(cookies));
83     });
84 }
85
86 - (void)setCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler
87 {
88     _cookieStore->setCookies({ cookie }, [handler = adoptNS([completionHandler copy])]() {
89         auto rawHandler = (void (^)())handler.get();
90         if (rawHandler)
91             rawHandler();
92     });
93
94 }
95
96 - (void)deleteCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler
97 {
98     _cookieStore->deleteCookie(cookie, [handler = adoptNS([completionHandler copy])]() {
99         auto rawHandler = (void (^)())handler.get();
100         if (rawHandler)
101             rawHandler();
102     });
103 }
104
105 - (void)addObserver:(id<WKHTTPCookieStoreObserver>)observer
106 {
107     auto result = _observers.add((__bridge CFTypeRef)observer, nullptr);
108     if (!result.isNewEntry)
109         return;
110
111     result.iterator->value = std::make_unique<WKHTTPCookieStoreObserver>(observer);
112     _cookieStore->registerObserver(*result.iterator->value);
113 }
114
115 - (void)removeObserver:(id<WKHTTPCookieStoreObserver>)observer
116 {
117     auto result = _observers.take((__bridge CFTypeRef)observer);
118     if (!result)
119         return;
120
121     _cookieStore->unregisterObserver(*result);
122 }
123
124 #pragma mark WKObject protocol implementation
125
126 - (API::Object&)_apiObject
127 {
128     return *_cookieStore;
129 }
130
131 @end