Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Side by Side Diff: chrome/browser/net/predictor.cc

Issue 9555017: Fix a crash when viewing about:dns. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/net/predictor_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "chrome/browser/net/predictor.h" 5 #include "chrome/browser/net/predictor.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <set> 9 #include <set>
10 #include <sstream> 10 #include <sstream>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/stl_util.h" 16 #include "base/stl_util.h"
17 #include "base/string_split.h"
18 #include "base/string_util.h"
17 #include "base/stringprintf.h" 19 #include "base/stringprintf.h"
18 #include "base/synchronization/waitable_event.h" 20 #include "base/synchronization/waitable_event.h"
19 #include "base/time.h" 21 #include "base/time.h"
20 #include "base/values.h" 22 #include "base/values.h"
21 #include "chrome/browser/io_thread.h" 23 #include "chrome/browser/io_thread.h"
22 #include "chrome/browser/net/preconnect.h" 24 #include "chrome/browser/net/preconnect.h"
23 #include "chrome/browser/prefs/browser_prefs.h" 25 #include "chrome/browser/prefs/browser_prefs.h"
24 #include "chrome/browser/prefs/pref_service.h" 26 #include "chrome/browser/prefs/pref_service.h"
25 #include "chrome/browser/prefs/scoped_user_pref_update.h" 27 #include "chrome/browser/prefs/scoped_user_pref_update.h"
26 #include "chrome/browser/prefs/session_startup_pref.h" 28 #include "chrome/browser/prefs/session_startup_pref.h"
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 if (predictor && predictor->predictor_enabled()) { 471 if (predictor && predictor->predictor_enabled()) {
470 predictor->GetHtmlInfo(output); 472 predictor->GetHtmlInfo(output);
471 } else { 473 } else {
472 output->append("DNS pre-resolution and TCP pre-connection is disabled."); 474 output->append("DNS pre-resolution and TCP pre-connection is disabled.");
473 } 475 }
474 output->append("</body></html>"); 476 output->append("</body></html>");
475 } 477 }
476 478
477 // Provide sort order so all .com's are together, etc. 479 // Provide sort order so all .com's are together, etc.
478 struct RightToLeftStringSorter { 480 struct RightToLeftStringSorter {
479 bool operator()(const GURL& left, 481 bool operator()(const GURL& left, const GURL& right) const {
480 const GURL& right) const { 482 return ReverseComponents(left) < ReverseComponents(right);
481 return string_compare(left.host(), right.host());
482 } 483 }
483 484
484 static bool string_compare(const std::string& left_host, 485 private:
485 const std::string& right_host) { 486 // Transforms something like "http://www.google.com/xyz" to
486 if (left_host == right_host) return true; 487 // "http://com.google.www/xyz".
487 size_t left_already_matched = left_host.size(); 488 static std::string ReverseComponents(const GURL& url) {
488 size_t right_already_matched = right_host.size(); 489 // Reverse the components in the hostname.
490 std::vector<std::string> parts;
491 base::SplitString(url.host(), '.', &parts);
492 std::reverse(parts.begin(), parts.end());
493 std::string reversed_host = JoinString(parts, '.');
489 494
490 // Ensure both strings have characters. 495 // Return the new URL.
491 if (!left_already_matched) return true; 496 GURL::Replacements url_components;
492 if (!right_already_matched) return false; 497 url_components.SetHostStr(reversed_host);
493 498 return url.ReplaceComponents(url_components).spec();
494 // Watch for trailing dot, so we'll always be safe to go one beyond dot.
495 if ('.' == left_host[left_already_matched - 1]) {
496 if ('.' != right_host[right_already_matched - 1])
497 return true;
498 // Both have dots at end of string.
499 --left_already_matched;
500 --right_already_matched;
501 } else {
502 if ('.' == right_host[right_already_matched - 1])
503 return false;
504 }
505
506 while (1) {
507 if (!left_already_matched) return true;
508 if (!right_already_matched) return false;
509
510 size_t left_start = left_host.find_last_of('.', left_already_matched - 1);
511 if (std::string::npos == left_start) {
512 left_already_matched = left_start = 0;
513 } else {
514 left_already_matched = left_start;
515 ++left_start; // Don't compare the dot.
516 }
517 size_t right_start = right_host.find_last_of('.',
518 right_already_matched - 1);
519 if (std::string::npos == right_start) {
520 right_already_matched = right_start = 0;
521 } else {
522 right_already_matched = right_start;
523 ++right_start; // Don't compare the dot.
524 }
525
526 int diff = left_host.compare(left_start, left_host.size(),
527 right_host, right_start, right_host.size());
528 if (diff > 0) return false;
529 if (diff < 0) return true;
530 }
531 } 499 }
532 }; 500 };
533 501
534 void Predictor::GetHtmlReferrerLists(std::string* output) { 502 void Predictor::GetHtmlReferrerLists(std::string* output) {
535 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 503 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
536 if (referrers_.empty()) 504 if (referrers_.empty())
537 return; 505 return;
538 506
539 // TODO(jar): Remove any plausible JavaScript from names before displaying. 507 // TODO(jar): Remove any plausible JavaScript from names before displaying.
540 508
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 IOThread* io_thread, 1187 IOThread* io_thread,
1220 net::URLRequestContextGetter* getter) { 1188 net::URLRequestContextGetter* getter) {
1221 // Empty function for unittests. 1189 // Empty function for unittests.
1222 } 1190 }
1223 1191
1224 void SimplePredictor::ShutdownOnUIThread(PrefService* user_prefs) { 1192 void SimplePredictor::ShutdownOnUIThread(PrefService* user_prefs) {
1225 SetShutdown(true); 1193 SetShutdown(true);
1226 } 1194 }
1227 1195
1228 } // namespace chrome_browser_net 1196 } // namespace chrome_browser_net
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/net/predictor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698