OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All r
ights 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 COMPUTER, 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 COMPUTER, 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 #ifndef KURL_h | |
27 #define KURL_h | |
28 | |
29 #include "weborigin/WebOriginExport.h" | |
30 #include "wtf/Forward.h" | |
31 #include "wtf/HashMap.h" | |
32 #include "wtf/HashTableDeletedValueType.h" | |
33 #include "wtf/OwnPtr.h" | |
34 #include "wtf/text/CString.h" | |
35 #include "wtf/text/TextEncoding.h" | |
36 #include "wtf/text/WTFString.h" | |
37 #include <url/third_party/mozilla/url_parse.h> | |
38 #include <url/url_canon.h> | |
39 | |
40 namespace WebCore { | |
41 | |
42 struct KURLHash; | |
43 | |
44 enum ParsedURLStringTag { ParsedURLString }; | |
45 | |
46 class WEBORIGIN_EXPORT KURL { | |
47 public: | |
48 KURL() | |
49 : m_isValid(false) | |
50 , m_protocolIsInHTTPFamily(false) | |
51 { | |
52 } | |
53 | |
54 KURL(const KURL&); | |
55 KURL& operator=(const KURL&); | |
56 | |
57 // The argument is an absolute URL string. The string is assumed to be | |
58 // output of KURL::string() called on a valid KURL object, or indiscernible | |
59 // from such. It is usually best to avoid repeatedly parsing a string, | |
60 // unless memory saving outweigh the possible slow-downs. | |
61 KURL(ParsedURLStringTag, const String&); | |
62 explicit KURL(WTF::HashTableDeletedValueType); | |
63 | |
64 // Creates an isolated URL object suitable for sending to another thread. | |
65 static KURL createIsolated(ParsedURLStringTag, const String&); | |
66 | |
67 bool isHashTableDeletedValue() const { return string().isHashTableDeletedVal
ue(); } | |
68 | |
69 // Resolves the relative URL with the given base URL. If provided, the | |
70 // TextEncoding is used to encode non-ASCII characers. The base URL can be | |
71 // null or empty, in which case the relative URL will be interpreted as | |
72 // absolute. | |
73 // FIXME: If the base URL is invalid, this always creates an invalid | |
74 // URL. Instead I think it would be better to treat all invalid base URLs | |
75 // the same way we treate null and empty base URLs. | |
76 KURL(const KURL& base, const String& relative); | |
77 KURL(const KURL& base, const String& relative, const WTF::TextEncoding&); | |
78 | |
79 // For conversions from other structures that have already parsed and | |
80 // canonicalized the URL. The input must be exactly what KURL would have | |
81 // done with the same input. | |
82 KURL(const AtomicString& canonicalString, const url_parse::Parsed&, bool isV
alid); | |
83 | |
84 String strippedForUseAsReferrer() const; | |
85 | |
86 // FIXME: The above functions should be harmonized so that passing a | |
87 // base of null or the empty string gives the same result as the | |
88 // standard String constructor. | |
89 | |
90 // Makes a deep copy. Helpful only if you need to use a KURL on another | |
91 // thread. Since the underlying StringImpl objects are immutable, there's | |
92 // no other reason to ever prefer copy() over plain old assignment. | |
93 KURL copy() const; | |
94 | |
95 bool isNull() const; | |
96 bool isEmpty() const; | |
97 bool isValid() const; | |
98 | |
99 // Returns true if this URL has a path. Note that "http://foo.com/" has a | |
100 // path of "/", so this function will return true. Only invalid or | |
101 // non-hierarchical (like "javascript:") URLs will have no path. | |
102 bool hasPath() const; | |
103 | |
104 // Returns true if you can set the host and port for the URL. | |
105 // Non-hierarchical URLs don't have a host and port. | |
106 bool canSetHostOrPort() const { return isHierarchical(); } | |
107 | |
108 bool canSetPathname() const { return isHierarchical(); } | |
109 bool isHierarchical() const; | |
110 | |
111 const String& string() const { return m_string; } | |
112 | |
113 String elidedString() const; | |
114 | |
115 String protocol() const; | |
116 String host() const; | |
117 unsigned short port() const; | |
118 bool hasPort() const; | |
119 String user() const; | |
120 String pass() const; | |
121 String path() const; | |
122 String lastPathComponent() const; | |
123 String query() const; | |
124 String fragmentIdentifier() const; | |
125 bool hasFragmentIdentifier() const; | |
126 | |
127 String baseAsString() const; | |
128 | |
129 // Returns true if the current URL's protocol is the same as the null- | |
130 // terminated ASCII argument. The argument must be lower-case. | |
131 bool protocolIs(const char*) const; | |
132 bool protocolIsData() const { return protocolIs("data"); } | |
133 bool protocolIsInHTTPFamily() const; | |
134 bool isLocalFile() const; | |
135 bool isBlankURL() const; | |
136 | |
137 bool setProtocol(const String&); | |
138 void setHost(const String&); | |
139 | |
140 void removePort(); | |
141 void setPort(unsigned short); | |
142 void setPort(const String&); | |
143 | |
144 // Input is like "foo.com" or "foo.com:8000". | |
145 void setHostAndPort(const String&); | |
146 | |
147 void setUser(const String&); | |
148 void setPass(const String&); | |
149 | |
150 // If you pass an empty path for HTTP or HTTPS URLs, the resulting path | |
151 // will be "/". | |
152 void setPath(const String&); | |
153 | |
154 // The query may begin with a question mark, or, if not, one will be added | |
155 // for you. Setting the query to the empty string will leave a "?" in the | |
156 // URL (with nothing after it). To clear the query, pass a null string. | |
157 void setQuery(const String&); | |
158 | |
159 void setFragmentIdentifier(const String&); | |
160 void removeFragmentIdentifier(); | |
161 | |
162 WEBORIGIN_EXPORT friend bool equalIgnoringFragmentIdentifier(const KURL&, co
nst KURL&); | |
163 | |
164 unsigned hostStart() const; | |
165 unsigned hostEnd() const; | |
166 | |
167 unsigned pathStart() const; | |
168 unsigned pathEnd() const; | |
169 unsigned pathAfterLastSlash() const; | |
170 | |
171 operator const String&() const { return string(); } | |
172 | |
173 const url_parse::Parsed& parsed() const { return m_parsed; } | |
174 | |
175 const KURL* innerURL() const { return m_innerURL.get(); } | |
176 | |
177 #ifndef NDEBUG | |
178 void print() const; | |
179 #endif | |
180 | |
181 bool isSafeToSendToAnotherThread() const; | |
182 | |
183 private: | |
184 void init(const KURL& base, const String& relative, const WTF::TextEncoding*
queryEncoding); | |
185 | |
186 String componentString(const url_parse::Component&) const; | |
187 String stringForInvalidComponent() const; | |
188 | |
189 template<typename CHAR> | |
190 void replaceComponents(const url_canon::Replacements<CHAR>&); | |
191 | |
192 template <typename CHAR> | |
193 void init(const KURL& base, const CHAR* relative, int relativeLength, const
WTF::TextEncoding* queryEncoding); | |
194 void initInnerURL(); | |
195 void initProtocolIsInHTTPFamily(); | |
196 | |
197 bool m_isValid; | |
198 bool m_protocolIsInHTTPFamily; | |
199 url_parse::Parsed m_parsed; | |
200 String m_string; | |
201 OwnPtr<KURL> m_innerURL; | |
202 }; | |
203 | |
204 WEBORIGIN_EXPORT bool operator==(const KURL&, const KURL&); | |
205 WEBORIGIN_EXPORT bool operator==(const KURL&, const String&); | |
206 WEBORIGIN_EXPORT bool operator==(const String&, const KURL&); | |
207 WEBORIGIN_EXPORT bool operator!=(const KURL&, const KURL&); | |
208 WEBORIGIN_EXPORT bool operator!=(const KURL&, const String&); | |
209 WEBORIGIN_EXPORT bool operator!=(const String&, const KURL&); | |
210 | |
211 WEBORIGIN_EXPORT bool equalIgnoringFragmentIdentifier(const KURL&, const KURL&); | |
212 | |
213 WEBORIGIN_EXPORT const KURL& blankURL(); | |
214 | |
215 // Functions to do URL operations on strings. | |
216 // These are operations that aren't faster on a parsed URL. | |
217 // These are also different from the KURL functions in that they don't require t
he string to be a valid and parsable URL. | |
218 // This is especially important because valid javascript URLs are not necessaril
y considered valid by KURL. | |
219 | |
220 WEBORIGIN_EXPORT bool protocolIs(const String& url, const char* protocol); | |
221 WEBORIGIN_EXPORT bool protocolIsJavaScript(const String& url); | |
222 | |
223 WEBORIGIN_EXPORT bool isValidProtocol(const String&); | |
224 | |
225 // Unescapes the given string using URL escaping rules, given an optional | |
226 // encoding (defaulting to UTF-8 otherwise). DANGER: If the URL has "%00" | |
227 // in it, the resulting string will have embedded null characters! | |
228 WEBORIGIN_EXPORT String decodeURLEscapeSequences(const String&); | |
229 WEBORIGIN_EXPORT String decodeURLEscapeSequences(const String&, const WTF::TextE
ncoding&); | |
230 | |
231 WEBORIGIN_EXPORT String encodeWithURLEscapeSequences(const String&); | |
232 | |
233 // Inlines. | |
234 | |
235 inline bool operator==(const KURL& a, const KURL& b) | |
236 { | |
237 return a.string() == b.string(); | |
238 } | |
239 | |
240 inline bool operator==(const KURL& a, const String& b) | |
241 { | |
242 return a.string() == b; | |
243 } | |
244 | |
245 inline bool operator==(const String& a, const KURL& b) | |
246 { | |
247 return a == b.string(); | |
248 } | |
249 | |
250 inline bool operator!=(const KURL& a, const KURL& b) | |
251 { | |
252 return a.string() != b.string(); | |
253 } | |
254 | |
255 inline bool operator!=(const KURL& a, const String& b) | |
256 { | |
257 return a.string() != b; | |
258 } | |
259 | |
260 inline bool operator!=(const String& a, const KURL& b) | |
261 { | |
262 return a != b.string(); | |
263 } | |
264 | |
265 } // namespace WebCore | |
266 | |
267 namespace WTF { | |
268 | |
269 // KURLHash is the default hash for String | |
270 template<typename T> struct DefaultHash; | |
271 template<> struct DefaultHash<WebCore::KURL> { | |
272 typedef WebCore::KURLHash Hash; | |
273 }; | |
274 | |
275 } // namespace WTF | |
276 | |
277 #endif // KURL_h | |
OLD | NEW |