OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // All data that is passed through a WebSocket with type "Text" needs to be | 5 // All data that is passed through a WebSocket with type "Text" needs to be |
6 // validated as UTF8. Since this is done on the IO thread, it needs to be | 6 // validated as UTF8. Since this is done on the IO thread, it needs to be |
7 // reasonably fast. | 7 // reasonably fast. |
8 | 8 |
9 // We are only interested in the performance on valid UTF8. Invalid UTF8 will | 9 // We are only interested in the performance on valid UTF8. Invalid UTF8 will |
10 // result in a connection failure, so is unlikely to become a source of | 10 // result in a connection failure, so is unlikely to become a source of |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 // the results will not be meaningful with sequences containing | 49 // the results will not be meaningful with sequences containing |
50 // top-bit-set bytes. | 50 // top-bit-set bytes. |
51 bool IsString7Bit(const std::string& s) { | 51 bool IsString7Bit(const std::string& s) { |
52 for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) { | 52 for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) { |
53 if (*it & 0x80) | 53 if (*it & 0x80) |
54 return false; | 54 return false; |
55 } | 55 } |
56 return true; | 56 return true; |
57 } | 57 } |
58 | 58 |
| 59 bool IsStringUTF8(const std::string& s) { |
| 60 return base::IsStringUTF8(s); |
| 61 } |
| 62 |
59 // Assumes that |previous| is a valid UTF-8 sequence, and attempts to return | 63 // Assumes that |previous| is a valid UTF-8 sequence, and attempts to return |
60 // the next one. Is just barely smart enough to iterate through the ranges | 64 // the next one. Is just barely smart enough to iterate through the ranges |
61 // defined about. | 65 // defined about. |
62 std::string NextUtf8Sequence(const std::string& previous) { | 66 std::string NextUtf8Sequence(const std::string& previous) { |
63 DCHECK(StreamingUtf8Validator::Validate(previous)); | 67 DCHECK(StreamingUtf8Validator::Validate(previous)); |
64 std::string next = previous; | 68 std::string next = previous; |
65 for (int i = static_cast<int>(previous.length() - 1); i >= 0; --i) { | 69 for (int i = static_cast<int>(previous.length() - 1); i >= 0; --i) { |
66 // All bytes in a UTF-8 sequence except the first one are | 70 // All bytes in a UTF-8 sequence except the first one are |
67 // constrained to the range 0x80 to 0xbf, inclusive. When we | 71 // constrained to the range 0x80 to 0xbf, inclusive. When we |
68 // increment past 0xbf, we carry into the previous byte. | 72 // increment past 0xbf, we carry into the previous byte. |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 RunSomeTests("%s: bytes=4 ranged length=%d repeat=%d", | 229 RunSomeTests("%s: bytes=4 ranged length=%d repeat=%d", |
226 base::Bind(ConstructRangedTestString, | 230 base::Bind(ConstructRangedTestString, |
227 kFourByteSeqRangeStart, | 231 kFourByteSeqRangeStart, |
228 kFourByteSeqRangeEnd), | 232 kFourByteSeqRangeEnd), |
229 kTestFunctions, | 233 kTestFunctions, |
230 2); | 234 2); |
231 } | 235 } |
232 | 236 |
233 } // namespace | 237 } // namespace |
234 } // namespace base | 238 } // namespace base |
OLD | NEW |