4f424837dea8a9a2c4d57caf6c83daaf84e72a61
[WebKit-https.git] / Source / WebKitLegacy / mac / WebCoreSupport / WebSecurityOrigin.mm
1 /*
2  * Copyright (C) 2007, 2010, 2012 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import "WebSecurityOriginInternal.h"
30
31 #import "WebApplicationCacheQuotaManager.h"
32 #import "WebDatabaseQuotaManager.h"
33 #import "WebQuotaManager.h"
34 #import <WebCore/DatabaseTracker.h>
35 #import <WebCore/SecurityOrigin.h>
36 #import <WebCore/SecurityOriginData.h>
37 #import <WebCore/URL.h>
38
39 using namespace WebCore;
40
41 @implementation WebSecurityOrigin
42
43 + (id)webSecurityOriginFromDatabaseIdentifier:(NSString *)databaseIdentifier
44 {
45     auto origin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier);
46     if (!origin)
47         return nil;
48
49     return [[[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:origin->securityOrigin().ptr()] autorelease];
50 }
51
52 - (id)initWithURL:(NSURL *)url
53 {
54     self = [super init];
55     if (!self)
56         return nil;
57
58     _private = reinterpret_cast<WebSecurityOriginPrivate *>(&SecurityOrigin::create(URL([url absoluteURL])).leakRef());
59     return self;
60 }
61
62 - (NSString *)protocol
63 {
64     return reinterpret_cast<SecurityOrigin*>(_private)->protocol();
65 }
66
67 - (NSString *)host
68 {
69     return reinterpret_cast<SecurityOrigin*>(_private)->host();
70 }
71
72 - (NSString *)databaseIdentifier
73 {
74     return SecurityOriginData::fromSecurityOrigin(*reinterpret_cast<SecurityOrigin*>(_private)).databaseIdentifier();
75 }
76
77 #if PLATFORM(IOS)
78 - (NSString *)toString
79 {
80     return reinterpret_cast<SecurityOrigin*>(_private)->toString();
81 }
82 #endif
83
84 - (NSString *)stringValue
85 {
86     return reinterpret_cast<SecurityOrigin*>(_private)->toString();
87 }
88
89 - (unsigned short)port
90 {
91     return reinterpret_cast<SecurityOrigin*>(_private)->port().value_or(0);
92 }
93
94 // FIXME: Overriding isEqual: without overriding hash will cause trouble if this ever goes into an NSSet or is the key in an NSDictionary,
95 // since two equal objects could have different hashes.
96 - (BOOL)isEqual:(id)anObject
97 {
98     if (![anObject isMemberOfClass:[WebSecurityOrigin class]])
99         return NO;
100     
101     return [self _core]->equal([anObject _core]);
102 }
103
104 - (void)dealloc
105 {
106     if (_private)
107         reinterpret_cast<SecurityOrigin*>(_private)->deref();
108     if (_applicationCacheQuotaManager)
109         [(NSObject *)_applicationCacheQuotaManager release];
110     if (_databaseQuotaManager)
111         [(NSObject *)_databaseQuotaManager release];
112     [super dealloc];
113 }
114
115 @end
116
117 @implementation WebSecurityOrigin (WebInternal)
118
119 - (id)_initWithWebCoreSecurityOrigin:(SecurityOrigin*)origin
120 {
121     ASSERT(origin);
122     self = [super init];
123     if (!self)
124         return nil;
125
126     origin->ref();
127     _private = reinterpret_cast<WebSecurityOriginPrivate *>(origin);
128
129     return self;
130 }
131
132 - (SecurityOrigin *)_core
133 {
134     return reinterpret_cast<SecurityOrigin*>(_private);
135 }
136
137 @end
138
139
140 // MARK: -
141 // MARK: WebQuotaManagers
142
143 @implementation WebSecurityOrigin (WebQuotaManagers)
144
145 - (id<WebQuotaManager>)applicationCacheQuotaManager
146 {
147     if (!_applicationCacheQuotaManager)
148         _applicationCacheQuotaManager = [[WebApplicationCacheQuotaManager alloc] initWithOrigin:self];
149     return _applicationCacheQuotaManager;
150 }
151
152 - (id<WebQuotaManager>)databaseQuotaManager
153 {
154     if (!_databaseQuotaManager)
155         _databaseQuotaManager = [[WebDatabaseQuotaManager alloc] initWithOrigin:self];
156     return _databaseQuotaManager;
157 }
158
159 @end
160
161
162 // MARK: -
163 // MARK: Deprecated
164
165 // FIXME: The following methods are deprecated and should removed later.
166 // Clients should instead get a WebQuotaManager, and query / set the quota via the Manager.
167
168 @implementation WebSecurityOrigin (Deprecated)
169
170 - (unsigned long long)usage
171 {
172     return DatabaseTracker::singleton().usage(SecurityOriginData::fromSecurityOrigin(*reinterpret_cast<SecurityOrigin*>(_private)));
173 }
174
175 - (unsigned long long)quota
176 {
177     return DatabaseTracker::singleton().quota(SecurityOriginData::fromSecurityOrigin(*reinterpret_cast<SecurityOrigin*>(_private)));
178 }
179
180 - (void)setQuota:(unsigned long long)quota
181 {
182     DatabaseTracker::singleton().setQuota(SecurityOriginData::fromSecurityOrigin(*reinterpret_cast<SecurityOrigin*>(_private)), quota);
183 }
184
185 @end