1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef IDNBlocklistUtils_h__
7 #define IDNBlocklistUtils_h__
8 
9 #include <utility>
10 #include "nsTArray.h"
11 
12 namespace mozilla {
13 namespace net {
14 
15 // A blocklist range is defined as all of the characters between:
16 // { firstCharacterInRange, lastCharacterInRange }
17 using BlocklistRange = std::pair<char16_t, char16_t>;
18 
19 // Used to perform a binary search of the needle in the sorted array of pairs
20 class BlocklistPairToCharComparator {
21  public:
Equals(const BlocklistRange & pair,char16_t needle)22   bool Equals(const BlocklistRange& pair, char16_t needle) const {
23     // If the needle is between pair.first and pair.second it
24     // is part of the range.
25     return pair.first <= needle && needle <= pair.second;
26   }
27 
LessThan(const BlocklistRange & pair,char16_t needle)28   bool LessThan(const BlocklistRange& pair, char16_t needle) const {
29     // The needle has to be larger than the second value,
30     // otherwise it may be equal.
31     return pair.second < needle;
32   }
33 };
34 
35 // Used to sort the array of pairs
36 class BlocklistEntryComparator {
37  public:
Equals(const BlocklistRange & a,const BlocklistRange & b)38   bool Equals(const BlocklistRange& a, const BlocklistRange& b) const {
39     return a.first == b.first && a.second == b.second;
40   }
41 
LessThan(const BlocklistRange & a,const BlocklistRange & b)42   bool LessThan(const BlocklistRange& a, const BlocklistRange& b) const {
43     return a.first < b.first;
44   }
45 };
46 
47 // Returns true if the char can be found in the blocklist
CharInBlocklist(char16_t aChar,const nsTArray<BlocklistRange> & aBlocklist)48 inline bool CharInBlocklist(char16_t aChar,
49                             const nsTArray<BlocklistRange>& aBlocklist) {
50   return aBlocklist.ContainsSorted(aChar, BlocklistPairToCharComparator());
51 }
52 
53 // Initializes the blocklist based on the statically defined list and the
54 // values of the following preferences:
55 //     - network.IDN.extra_allowed_chars
56 //     - network.IDN.extra_blocked_chars
57 void InitializeBlocklist(nsTArray<BlocklistRange>& aBlocklist);
58 
59 void RemoveCharFromBlocklist(char16_t aChar,
60                              nsTArray<BlocklistRange>& aBlocklist);
61 
62 }  // namespace net
63 }  // namespace mozilla
64 
65 #endif  // IDNBlocklistUtils_h__
66