Index: components/ssl_errors/error_classification.cc |
diff --git a/components/ssl_errors/error_classification.cc b/components/ssl_errors/error_classification.cc |
index f55d754faab06869a23309177189c4418ca6c128..076fc6a1868e4fe94fe67d3e6125f3406dd4b0b6 100644 |
--- a/components/ssl_errors/error_classification.cc |
+++ b/components/ssl_errors/error_classification.cc |
@@ -67,37 +67,6 @@ void RecordSSLInterstitialCause(bool overridable, SSLInterstitialCause event) { |
} |
} |
-// Returns the Levenshtein distance between |str1| and |str2|. |
-// Which is the minimum number of single-character edits (i.e. insertions, |
-// deletions or substitutions) required to change one word into the other. |
-// https://en.wikipedia.org/wiki/Levenshtein_distance |
-size_t GetLevenshteinDistance(const std::string& str1, |
- const std::string& str2) { |
- if (str1 == str2) |
- return 0; |
- if (str1.size() == 0) |
- return str2.size(); |
- if (str2.size() == 0) |
- return str1.size(); |
- std::vector<size_t> kFirstRow(str2.size() + 1, 0); |
- std::vector<size_t> kSecondRow(str2.size() + 1, 0); |
- |
- for (size_t i = 0; i < kFirstRow.size(); ++i) |
- kFirstRow[i] = i; |
- for (size_t i = 0; i < str1.size(); ++i) { |
- kSecondRow[0] = i + 1; |
- for (size_t j = 0; j < str2.size(); ++j) { |
- int cost = str1[i] == str2[j] ? 0 : 1; |
- kSecondRow[j + 1] = |
- std::min(std::min(kSecondRow[j] + 1, kFirstRow[j + 1] + 1), |
- kFirstRow[j] + cost); |
- } |
- for (size_t j = 0; j < kFirstRow.size(); j++) |
- kFirstRow[j] = kSecondRow[j]; |
- } |
- return kSecondRow[str2.size()]; |
-} |
- |
std::vector<HostnameTokens> GetTokenizedDNSNames( |
const std::vector<std::string>& dns_names) { |
std::vector<HostnameTokens> dns_name_tokens; |
@@ -149,6 +118,37 @@ base::LazyInstance<base::Time> g_testing_build_time = LAZY_INSTANCE_INITIALIZER; |
} // namespace |
+// Returns the Levenshtein distance between |str1| and |str2|. |
+// Which is the minimum number of single-character edits (i.e. insertions, |
+// deletions or substitutions) required to change one word into the other. |
+// https://en.wikipedia.org/wiki/Levenshtein_distance |
+size_t GetLevenshteinDistance(const std::string& str1, |
+ const std::string& str2) { |
+ if (str1 == str2) |
+ return 0; |
+ if (str1.size() == 0) |
+ return str2.size(); |
+ if (str2.size() == 0) |
+ return str1.size(); |
+ |
+ std::vector<size_t> row(str2.size() + 1); |
+ for (size_t i = 0; i < row.size(); ++i) |
+ row[i] = i; |
+ |
+ for (size_t i = 0; i < str1.size(); ++i) { |
+ row[0] = i + 1; |
+ size_t previous = i; |
+ for (size_t j = 0; j < str2.size(); ++j) { |
+ size_t old_row = row[j + 1]; |
+ int cost = str1[i] == str2[j] ? 0 : 1; |
+ row[j + 1] = std::min(std::min(row[j], row[j + 1]) + 1, previous + cost); |
+ previous = old_row; |
+ } |
+ } |
+ return row[str2.size()]; |
+} |
+ |
+ |
void RecordUMAStatistics(bool overridable, |
const base::Time& current_time, |
const GURL& request_url, |
@@ -388,11 +388,11 @@ bool IsCertLikelyFromMultiTenantHosting(const GURL& request_url, |
// considered as a shared certificate. Include the host name in the URL also |
// while comparing. |
dns_names.push_back(host_name); |
- static const size_t kMinimumEditDsitance = 5; |
+ static const size_t kMinimumEditDistance = 5; |
for (size_t i = 0; i < dns_names_size; ++i) { |
for (size_t j = i + 1; j < dns_names_size; ++j) { |
size_t edit_distance = GetLevenshteinDistance(dns_names[i], dns_names[j]); |
- if (edit_distance < kMinimumEditDsitance) |
+ if (edit_distance < kMinimumEditDistance) |
return false; |
} |
} |