[CSS Exclusions] ExclusionShape API should use logical coordinates for input/output
[WebKit-https.git] / Source / WTF / wtf / url / src / URLQueryCanonicalizer.h
1 // Copyright 2010, Google Inc. All rights reserved.
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are
5 // met:
6 //
7 //     * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 //     * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following disclaimer
11 // in the documentation and/or other materials provided with the
12 // distribution.
13 //     * Neither the name of Google Inc. nor the names of its
14 // contributors may be used to endorse or promote products derived from
15 // this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29
30 #ifndef URLQueryCanonicalizer_h
31 #define URLQueryCanonicalizer_h
32
33 #if USE(WTFURL)
34
35 #include "RawURLBuffer.h"
36 #include "URLBuffer.h"
37 #include "URLCharacterTypes.h"
38 #include "URLComponent.h"
39 #include "URLEscape.h"
40
41 namespace WTF {
42
43 template<typename InChar, typename OutChar, void convertCharset(const InChar*, int length, URLBuffer<char>&)>
44 class URLQueryCanonicalizer {
45 public:
46     static void canonicalize(const InChar* spec, const URLComponent& query, URLBuffer<OutChar>& buffer, URLComponent& resultQuery)
47     {
48         if (query.length() < 0) {
49             resultQuery = URLComponent();
50             return;
51         }
52
53         buffer->append('?');
54         resultQuery.setBegin(buffer->length());
55         convertToQueryEncoding(spec, query, buffer);
56         resultQuery.setLength(buffer->length() - resultQuery.begin());
57     }
58
59 private:
60     static bool isAllASCII(const InChar* spec, const URLComponent& query)
61     {
62         int end = query.end();
63         for (int i = query.begin(); i < end; ++i) {
64             if (static_cast<unsigned>(spec[i]) >= 0x80)
65                 return false;
66         }
67         return true;
68     }
69
70 #ifndef NDEBUG
71     static bool isRaw8Bit(const InChar* source, int length)
72     {
73         for (int i = source; i < length; ++i) {
74             if (source[i] & 0xFF != source[i])
75                 return false;
76         }
77         return true;
78     }
79 #endif
80
81     static void appendRaw8BitQueryString(const InChar* source, int length, URLBuffer<OutChar>* buffer)
82     {
83         ASSERT(isRaw8Bit(source, length));
84         for (int i = 0; i < length; ++i) {
85             if (!URLCharacterTypes::isQueryChar(source[i]))
86                 appendURLEscapedCharacter(static_cast<unsigned char>(source[i]), buffer);
87             else
88                 buffer->append(static_cast<char>(source[i]));
89         }
90     }
91
92     static void convertToQueryEncoding(const InChar* spec, const URLComponent& query, URLBuffer<OutChar>& buffer)
93     {
94         if (isAllASCII(spec, query)) {
95             appendRaw8BitQueryString(&spec[query.begin()], query.length(), buffer);
96             return;
97         }
98
99         RawURLBuffer<char, 1024> convertedQuery;
100         convertCharset(spec, query, convertedQuery);
101         appendRaw8BitQueryString(convertedQuery.data(), convertedQuery.length(), buffer);
102     }
103 };
104
105 }
106
107 #endif // USE(WTFURL)
108
109 #endif