Test that CSS subresource loading are exposed to resource timing in case of a CORS...
[WebKit-https.git] / Source / WTF / wtf / cf / CFURLExtras.cpp
1 /*
2  * Copyright (C) 2013 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 #include "config.h"
27 #include "CFURLExtras.h"
28
29 #include <wtf/URL.h>
30 #include <wtf/text/CString.h>
31
32 namespace WTF {
33
34 RetainPtr<CFURLRef> createCFURLFromBuffer(const char* data, size_t size, CFURLRef baseURL)
35 {
36     // NOTE: We use UTF-8 here since this encoding is used when computing strings when returning URL components
37     // (e.g calls to NSURL -path). However, this function is not tolerant of illegal UTF-8 sequences, which
38     // could either be a malformed string or bytes in a different encoding, like Shift-JIS, so we fall back
39     // onto using ISO Latin-1 in those cases.
40     RetainPtr<CFURLRef> result = adoptCF(CFURLCreateAbsoluteURLWithBytes(0, reinterpret_cast<const UInt8*>(data), size, kCFStringEncodingUTF8, baseURL, true));
41     if (!result)
42         result = adoptCF(CFURLCreateAbsoluteURLWithBytes(0, reinterpret_cast<const UInt8*>(data), size, kCFStringEncodingISOLatin1, baseURL, true));
43     return result;
44 }
45
46 void getURLBytes(CFURLRef url, URLCharBuffer& result)
47 {
48     CFIndex bytesLength = CFURLGetBytes(url, 0, 0);
49     result.resize(bytesLength);
50     CFIndex finalLength = CFURLGetBytes(url, reinterpret_cast<UInt8*>(result.data()), bytesLength);
51     ASSERT_UNUSED(finalLength, finalLength == bytesLength);
52 }
53
54 void getURLBytes(CFURLRef url, CString& result)
55 {
56     CFIndex bytesLength = CFURLGetBytes(url, 0, 0);
57     char* bytes;
58     result = CString::newUninitialized(bytesLength, bytes);
59     CFIndex finalLength = CFURLGetBytes(url, reinterpret_cast<UInt8*>(bytes), bytesLength);
60     ASSERT_UNUSED(finalLength, finalLength == bytesLength);
61 }
62
63 bool isCFURLSameOrigin(CFURLRef cfURL, const URL& url)
64 {
65     ASSERT(url.protocolIsInHTTPFamily());
66
67     if (url.hasUsername() || url.hasPassword())
68         return protocolHostAndPortAreEqual(url, URL { cfURL });
69
70     URLCharBuffer bytes;
71     getURLBytes(cfURL, bytes);
72     StringView cfURLString { reinterpret_cast<const LChar*>(bytes.data()), static_cast<unsigned>(bytes.size()) };
73
74     if (!url.hasPath())
75         return StringView { url.string() } == cfURLString;
76
77     auto urlWithoutPath = StringView { url.string() }.substring(0, url.pathStart() + 1);
78     return cfURLString.startsWith(urlWithoutPath);
79 }
80
81 }