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 #include "components/search_engines/template_url.h" | 5 #include "components/search_engines/template_url.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 const SearchTermsData& search_terms_data) const { | 452 const SearchTermsData& search_terms_data) const { |
453 ParseIfNecessary(search_terms_data); | 453 ParseIfNecessary(search_terms_data); |
454 return search_term_key_location_; | 454 return search_term_key_location_; |
455 } | 455 } |
456 | 456 |
457 base::string16 TemplateURLRef::SearchTermToString16( | 457 base::string16 TemplateURLRef::SearchTermToString16( |
458 const std::string& term) const { | 458 const std::string& term) const { |
459 const std::vector<std::string>& encodings = owner_->input_encodings(); | 459 const std::vector<std::string>& encodings = owner_->input_encodings(); |
460 base::string16 result; | 460 base::string16 result; |
461 | 461 |
462 std::string unescaped = net::UnescapeURLComponent( | 462 net::UnescapeRule::Type unescape_rules = |
463 term, | 463 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS; |
464 net::UnescapeRule::REPLACE_PLUS_WITH_SPACE | | 464 if (search_term_key_location_ != url::Parsed::PATH) |
465 net::UnescapeRule::URL_SPECIAL_CHARS); | 465 unescape_rules |= net::UnescapeRule::REPLACE_PLUS_WITH_SPACE; |
| 466 |
| 467 std::string unescaped = net::UnescapeURLComponent(term, unescape_rules); |
466 for (size_t i = 0; i < encodings.size(); ++i) { | 468 for (size_t i = 0; i < encodings.size(); ++i) { |
467 if (base::CodepageToUTF16(unescaped, encodings[i].c_str(), | 469 if (base::CodepageToUTF16(unescaped, encodings[i].c_str(), |
468 base::OnStringConversionError::FAIL, &result)) | 470 base::OnStringConversionError::FAIL, &result)) |
469 return result; | 471 return result; |
470 } | 472 } |
471 | 473 |
472 // Always fall back on UTF-8 if it works. | 474 // Always fall back on UTF-8 if it works. |
473 if (base::CodepageToUTF16(unescaped, base::kCodepageUTF8, | 475 if (base::CodepageToUTF16(unescaped, base::kCodepageUTF8, |
474 base::OnStringConversionError::FAIL, &result)) | 476 base::OnStringConversionError::FAIL, &result)) |
475 return result; | 477 return result; |
476 | 478 |
477 // When nothing worked, just use the escaped text. We have no idea what the | 479 // When nothing worked, just use the escaped text. We have no idea what the |
478 // encoding is. We need to substitute spaces for pluses ourselves since we're | 480 // encoding is. We need to substitute spaces for pluses ourselves since we're |
479 // not sending it through an unescaper. | 481 // not sending it through an unescaper. |
480 result = base::UTF8ToUTF16(term); | 482 result = base::UTF8ToUTF16(term); |
481 std::replace(result.begin(), result.end(), '+', ' '); | 483 if (unescape_rules & net::UnescapeRule::REPLACE_PLUS_WITH_SPACE) |
| 484 std::replace(result.begin(), result.end(), '+', ' '); |
482 return result; | 485 return result; |
483 } | 486 } |
484 | 487 |
485 bool TemplateURLRef::HasGoogleBaseURLs( | 488 bool TemplateURLRef::HasGoogleBaseURLs( |
486 const SearchTermsData& search_terms_data) const { | 489 const SearchTermsData& search_terms_data) const { |
487 ParseIfNecessary(search_terms_data); | 490 ParseIfNecessary(search_terms_data); |
488 for (size_t i = 0; i < replacements_.size(); ++i) { | 491 for (size_t i = 0; i < replacements_.size(); ++i) { |
489 if ((replacements_[i].type == GOOGLE_BASE_URL) || | 492 if ((replacements_[i].type == GOOGLE_BASE_URL) || |
490 (replacements_[i].type == GOOGLE_BASE_SUGGEST_URL)) | 493 (replacements_[i].type == GOOGLE_BASE_SUGGEST_URL)) |
491 return true; | 494 return true; |
(...skipping 25 matching lines...) Expand all Loading... |
517 // Host, path and port must match. | 520 // Host, path and port must match. |
518 if ((url.port() != pattern.port()) || | 521 if ((url.port() != pattern.port()) || |
519 (url.host() != host_) || | 522 (url.host() != host_) || |
520 ((url.path() != path_) && | 523 ((url.path() != path_) && |
521 (search_term_key_location_ != url::Parsed::PATH))) { | 524 (search_term_key_location_ != url::Parsed::PATH))) { |
522 return false; | 525 return false; |
523 } | 526 } |
524 | 527 |
525 std::string source; | 528 std::string source; |
526 url::Component position; | 529 url::Component position; |
527 net::UnescapeRule::Type unescape_rules = | |
528 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS; | |
529 | 530 |
530 if (search_term_key_location_ == url::Parsed::PATH) { | 531 if (search_term_key_location_ == url::Parsed::PATH) { |
531 source = url.path(); | 532 source = url.path(); |
532 | 533 |
533 // Characters in the path before and after search terms must match. | 534 // Characters in the path before and after search terms must match. |
534 if (source.length() < path_.length()) | 535 if (source.length() < path_.length()) |
535 return false; | 536 return false; |
536 position.begin = search_term_position_in_path_; | 537 position.begin = search_term_position_in_path_; |
537 position.len = source.length() - path_.length(); | 538 position.len = source.length() - path_.length(); |
538 if (source.substr(0, position.begin) + source.substr(position.end()) != | 539 if (source.substr(0, position.begin) + source.substr(position.end()) != |
(...skipping 14 matching lines...) Expand all Loading... |
553 // Fail if search term key is found twice. | 554 // Fail if search term key is found twice. |
554 if (key_found) | 555 if (key_found) |
555 return false; | 556 return false; |
556 key_found = true; | 557 key_found = true; |
557 position = value; | 558 position = value; |
558 } | 559 } |
559 } | 560 } |
560 } | 561 } |
561 if (!key_found) | 562 if (!key_found) |
562 return false; | 563 return false; |
563 unescape_rules |= net::UnescapeRule::REPLACE_PLUS_WITH_SPACE; | |
564 } | 564 } |
565 | 565 |
566 // Extract the search term. | 566 // Extract the search term. |
567 *search_terms = net::UnescapeAndDecodeUTF8URLComponent( | 567 *search_terms = SearchTermToString16( |
568 source.substr(position.begin, position.len), unescape_rules); | 568 source.substr(position.begin, position.len)); |
569 if (search_terms_component) | 569 if (search_terms_component) |
570 *search_terms_component = search_term_key_location_; | 570 *search_terms_component = search_term_key_location_; |
571 if (search_terms_position) | 571 if (search_terms_position) |
572 *search_terms_position = position; | 572 *search_terms_position = position; |
573 return true; | 573 return true; |
574 } | 574 } |
575 | 575 |
576 void TemplateURLRef::InvalidateCachedValues() const { | 576 void TemplateURLRef::InvalidateCachedValues() const { |
577 supports_replacements_ = valid_ = parsed_ = false; | 577 supports_replacements_ = valid_ = parsed_ = false; |
578 host_.clear(); | 578 host_.clear(); |
(...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 // patterns. This means that given patterns | 1543 // patterns. This means that given patterns |
1544 // [ "http://foo/#q={searchTerms}", "http://foo/?q={searchTerms}" ], | 1544 // [ "http://foo/#q={searchTerms}", "http://foo/?q={searchTerms}" ], |
1545 // calling ExtractSearchTermsFromURL() on "http://foo/?q=bar#q=' would | 1545 // calling ExtractSearchTermsFromURL() on "http://foo/?q=bar#q=' would |
1546 // return false. This is important for at least Google, where such URLs | 1546 // return false. This is important for at least Google, where such URLs |
1547 // are invalid. | 1547 // are invalid. |
1548 return !search_terms->empty(); | 1548 return !search_terms->empty(); |
1549 } | 1549 } |
1550 } | 1550 } |
1551 return false; | 1551 return false; |
1552 } | 1552 } |
OLD | NEW |