WKWebView provides no access to cookies.
[WebKit-https.git] / Source / WebCore / platform / network / cocoa / NetworkStorageSessionCocoa.mm
1 /*
2  * Copyright (C) 2015 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "NetworkStorageSession.h"
28
29 #import "Cookie.h"
30 #import "URL.h"
31 #import <wtf/BlockObjCExceptions.h>
32
33 namespace WebCore {
34
35 void NetworkStorageSession::setCookie(const Cookie& cookie)
36 {
37     BEGIN_BLOCK_OBJC_EXCEPTIONS;
38     [nsCookieStorage() setCookie:(NSHTTPCookie *)cookie];
39     END_BLOCK_OBJC_EXCEPTIONS;
40 }
41
42 void NetworkStorageSession::setCookies(const Vector<Cookie>& cookies, const URL& url, const URL& mainDocumentURL)
43 {
44     RetainPtr<NSMutableArray> nsCookies = adoptNS([[NSMutableArray alloc] initWithCapacity:cookies.size()]);
45     for (auto cookie : cookies)
46         [nsCookies addObject:(NSHTTPCookie *)cookie];
47
48     BEGIN_BLOCK_OBJC_EXCEPTIONS;
49     [nsCookieStorage() setCookies:nsCookies.get() forURL:(NSURL *)url mainDocumentURL:(NSURL *)mainDocumentURL];
50     END_BLOCK_OBJC_EXCEPTIONS;
51 }
52
53 void NetworkStorageSession::deleteCookie(const Cookie& cookie)
54 {
55     [nsCookieStorage() deleteCookie:(NSHTTPCookie *)cookie];
56 }
57
58 static Vector<Cookie> nsCookiesToCookieVector(NSArray<NSHTTPCookie *> *nsCookies)
59 {
60     Vector<Cookie> cookies;
61     cookies.reserveInitialCapacity(nsCookies.count);
62     for (NSHTTPCookie *nsCookie in nsCookies)
63         cookies.uncheckedAppend(nsCookie);
64
65     return cookies;
66 }
67
68 Vector<Cookie> NetworkStorageSession::getAllCookies()
69 {
70     return nsCookiesToCookieVector(nsCookieStorage().cookies);
71 }
72
73 Vector<Cookie> NetworkStorageSession::getCookies(const URL& url)
74 {
75     return nsCookiesToCookieVector([nsCookieStorage() cookiesForURL:(NSURL *)url]);
76 }
77
78 NSHTTPCookieStorage *NetworkStorageSession::nsCookieStorage() const
79 {
80     auto cfCookieStorage = cookieStorage();
81     if (!cfCookieStorage || [NSHTTPCookieStorage sharedHTTPCookieStorage]._cookieStorage == cfCookieStorage)
82         return [NSHTTPCookieStorage sharedHTTPCookieStorage];
83
84     return [[[NSHTTPCookieStorage alloc] _initWithCFHTTPCookieStorage:cfCookieStorage.get()] autorelease];
85 }
86
87 } // namespace WebCore