Chromium Code Reviews| 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_service.h" | 5 #include "components/search_engines/template_url_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 181 // The meaningful keyword length is the length of any portion before the | 181 // The meaningful keyword length is the length of any portion before the |
| 182 // registry ("co.uk") and its preceding dot. | 182 // registry ("co.uk") and its preceding dot. |
| 183 return keyword.length() - (registry_length ? (registry_length + 1) : 0); | 183 return keyword.length() - (registry_length ? (registry_length + 1) : 0); |
| 184 } | 184 } |
| 185 | 185 |
| 186 bool Contains(TemplateURLService::OwnedTemplateURLVector* template_urls, | 186 bool Contains(TemplateURLService::OwnedTemplateURLVector* template_urls, |
| 187 TemplateURL* turl) { | 187 TemplateURL* turl) { |
| 188 return FindTemplateURL(template_urls, turl) != template_urls->end(); | 188 return FindTemplateURL(template_urls, turl) != template_urls->end(); |
| 189 } | 189 } |
| 190 | 190 |
| 191 bool IsCreatedByExtension(TemplateURL* template_url) { | 191 bool IsCreatedByExtension(const TemplateURL* template_url) { |
| 192 return template_url->type() == | 192 return template_url->type() == |
| 193 TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION || | 193 TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION || |
| 194 template_url->type() == TemplateURL::OMNIBOX_API_EXTENSION; | 194 template_url->type() == TemplateURL::OMNIBOX_API_EXTENSION; |
| 195 } | 195 } |
| 196 | 196 |
| 197 } // namespace | 197 } // namespace |
| 198 | 198 |
| 199 // TemplateURLService::LessWithPrefix ----------------------------------------- | 199 // TemplateURLService::LessWithPrefix ----------------------------------------- |
| 200 | 200 |
| 201 class TemplateURLService::LessWithPrefix { | 201 class TemplateURLService::LessWithPrefix { |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 523 should_notify = true; | 523 should_notify = true; |
| 524 } else { | 524 } else { |
| 525 ++i; | 525 ++i; |
| 526 } | 526 } |
| 527 } | 527 } |
| 528 if (should_notify) | 528 if (should_notify) |
| 529 NotifyObservers(); | 529 NotifyObservers(); |
| 530 } | 530 } |
| 531 | 531 |
| 532 void TemplateURLService::RegisterOmniboxKeyword( | 532 void TemplateURLService::RegisterOmniboxKeyword( |
| 533 const std::string& extension_id, | 533 const std::string& extension_id, |
| 534 const std::string& extension_name, | 534 const std::string& extension_name, |
| 535 const std::string& keyword, | 535 const std::string& keyword, |
| 536 const std::string& template_url_string) { | 536 const std::string& template_url_string, |
| 537 const base::Time& extension_install_time) { | |
| 537 DCHECK(loaded_); | 538 DCHECK(loaded_); |
| 538 | 539 |
| 539 if (FindTemplateURLForExtension(extension_id, | 540 if (FindTemplateURLForExtension(extension_id, |
| 540 TemplateURL::OMNIBOX_API_EXTENSION)) | 541 TemplateURL::OMNIBOX_API_EXTENSION)) |
| 541 return; | 542 return; |
| 542 | 543 |
| 543 TemplateURLData data; | 544 TemplateURLData data; |
| 544 data.SetShortName(base::UTF8ToUTF16(extension_name)); | 545 data.SetShortName(base::UTF8ToUTF16(extension_name)); |
| 545 data.SetKeyword(base::UTF8ToUTF16(keyword)); | 546 data.SetKeyword(base::UTF8ToUTF16(keyword)); |
| 546 data.SetURL(template_url_string); | 547 data.SetURL(template_url_string); |
| 547 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info( | 548 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info( |
| 548 new TemplateURL::AssociatedExtensionInfo(extension_id)); | 549 new TemplateURL::AssociatedExtensionInfo(extension_id)); |
| 550 info->install_time = extension_install_time; | |
| 549 AddExtensionControlledTURL( | 551 AddExtensionControlledTURL( |
| 550 base::MakeUnique<TemplateURL>(data, TemplateURL::OMNIBOX_API_EXTENSION), | 552 base::MakeUnique<TemplateURL>(data, TemplateURL::OMNIBOX_API_EXTENSION), |
| 551 std::move(info)); | 553 std::move(info)); |
| 552 } | 554 } |
| 553 | 555 |
| 554 TemplateURLService::TemplateURLVector TemplateURLService::GetTemplateURLs() { | 556 TemplateURLService::TemplateURLVector TemplateURLService::GetTemplateURLs() { |
| 555 TemplateURLVector result; | 557 TemplateURLVector result; |
| 556 for (const auto& turl : template_urls_) | 558 for (const auto& turl : template_urls_) |
| 557 result.push_back(turl.get()); | 559 result.push_back(turl.get()); |
| 558 return result; | 560 return result; |
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1436 if (i == 0) | 1438 if (i == 0) |
| 1437 default_search_manager_.SetUserSelectedDefaultSearchEngine(data); | 1439 default_search_manager_.SetUserSelectedDefaultSearchEngine(data); |
| 1438 } | 1440 } |
| 1439 } | 1441 } |
| 1440 | 1442 |
| 1441 // Request a server check for the correct Google URL if Google is the | 1443 // Request a server check for the correct Google URL if Google is the |
| 1442 // default search engine. | 1444 // default search engine. |
| 1443 RequestGoogleURLTrackerServerCheckIfNecessary(); | 1445 RequestGoogleURLTrackerServerCheckIfNecessary(); |
| 1444 } | 1446 } |
| 1445 | 1447 |
| 1448 TemplateURL* TemplateURLService::BestEngineForKeyword( | |
| 1449 TemplateURL* existing_engine, | |
| 1450 TemplateURL* new_engine) { | |
| 1451 DCHECK(new_engine); | |
| 1452 if (!existing_engine) | |
| 1453 return new_engine; // Better than nothing. | |
| 1454 | |
| 1455 DCHECK_EQ(new_engine->keyword(), existing_engine->keyword()); | |
| 1456 // We should only have overlapping keywords when at least one comes from | |
| 1457 // an extension. | |
| 1458 DCHECK(IsCreatedByExtension(existing_engine) || | |
| 1459 IsCreatedByExtension(new_engine)); | |
| 1460 | |
| 1461 // Following ranking is implemented: | |
| 1462 // omnibox api keyword > extension search engine > normal engine. | |
| 1463 // If both extensions are of same type, latest installed wins. | |
| 1464 if (new_engine->type() == existing_engine->type()) { | |
| 1465 return existing_engine->extension_info_->install_time > | |
| 1466 new_engine->extension_info_->install_time | |
| 1467 ? existing_engine | |
| 1468 : new_engine; | |
| 1469 } else if (new_engine->type() == | |
|
vasilii
2017/02/20 15:30:08
You don't need else as the previous block always r
Alexander Yashkin
2017/02/20 19:52:47
Done.
| |
| 1470 TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) { | |
| 1471 return existing_engine->type() == TemplateURL::OMNIBOX_API_EXTENSION | |
| 1472 ? existing_engine | |
| 1473 : new_engine; | |
| 1474 } else { | |
| 1475 // Omnibox api keyword always wins. Normal engine loses to any extensions | |
| 1476 // keywords. | |
| 1477 return new_engine->type() == TemplateURL::OMNIBOX_API_EXTENSION | |
| 1478 ? new_engine | |
| 1479 : existing_engine; | |
| 1480 } | |
| 1481 } | |
| 1482 | |
| 1446 void TemplateURLService::RemoveFromMaps(TemplateURL* template_url) { | 1483 void TemplateURLService::RemoveFromMaps(TemplateURL* template_url) { |
| 1447 const base::string16& keyword = template_url->keyword(); | 1484 const base::string16& keyword = template_url->keyword(); |
| 1448 DCHECK_NE(0U, keyword_to_turl_and_length_.count(keyword)); | 1485 DCHECK_NE(0U, keyword_to_turl_and_length_.count(keyword)); |
| 1449 if (keyword_to_turl_and_length_[keyword].first == template_url) { | 1486 if (keyword_to_turl_and_length_[keyword].first == template_url) { |
| 1450 // We need to check whether the keyword can now be provided by another | 1487 // We need to check whether the keyword can now be provided by another |
| 1451 // TemplateURL. See the comments in AddToMaps() for more information on | 1488 // TemplateURL. See the comments in AddToMaps() for more information on |
| 1452 // extension keywords and how they can coexist with non-extension keywords. | 1489 // extension keywords and how they can coexist with non-extension keywords. |
| 1453 // In the case of more than one extension, we use the most recently | 1490 // In the case of more than one extension, we use the most recently |
| 1454 // installed (which will be the most recently added, which will have the | 1491 // installed (which will be the most recently added, which will have the |
| 1455 // highest ID). | 1492 // highest ID). |
| 1456 TemplateURL* best_fallback = nullptr; | 1493 TemplateURL* best_fallback = nullptr; |
| 1457 for (const auto& turl : template_urls_) { | 1494 for (const auto& turl : template_urls_) { |
| 1458 // This next statement relies on the fact that there can only be one | 1495 if ((turl.get() != template_url) && (turl->keyword() == keyword)) |
| 1459 // non-Omnibox API TemplateURL with a given keyword. | 1496 best_fallback = BestEngineForKeyword(best_fallback, turl.get()); |
| 1460 if ((turl.get() != template_url) && (turl->keyword() == keyword) && | |
| 1461 (!best_fallback || | |
| 1462 (best_fallback->type() != TemplateURL::OMNIBOX_API_EXTENSION) || | |
| 1463 ((turl->type() == TemplateURL::OMNIBOX_API_EXTENSION) && | |
| 1464 (turl->id() > best_fallback->id())))) | |
| 1465 best_fallback = turl.get(); | |
| 1466 } | 1497 } |
| 1467 RemoveFromDomainMap(template_url); | 1498 RemoveFromDomainMap(template_url); |
| 1468 if (best_fallback) { | 1499 if (best_fallback) { |
| 1469 AddToMap(best_fallback); | 1500 AddToMap(best_fallback); |
| 1470 AddToDomainMap(best_fallback); | 1501 AddToDomainMap(best_fallback); |
| 1471 } else { | 1502 } else { |
| 1472 keyword_to_turl_and_length_.erase(keyword); | 1503 keyword_to_turl_and_length_.erase(keyword); |
| 1473 } | 1504 } |
| 1474 } | 1505 } |
| 1475 | 1506 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1487 void TemplateURLService::AddToMaps(TemplateURL* template_url) { | 1518 void TemplateURLService::AddToMaps(TemplateURL* template_url) { |
| 1488 bool template_url_is_omnibox_api = | 1519 bool template_url_is_omnibox_api = |
| 1489 template_url->type() == TemplateURL::OMNIBOX_API_EXTENSION; | 1520 template_url->type() == TemplateURL::OMNIBOX_API_EXTENSION; |
| 1490 const base::string16& keyword = template_url->keyword(); | 1521 const base::string16& keyword = template_url->keyword(); |
| 1491 KeywordToTURLAndMeaningfulLength::const_iterator i = | 1522 KeywordToTURLAndMeaningfulLength::const_iterator i = |
| 1492 keyword_to_turl_and_length_.find(keyword); | 1523 keyword_to_turl_and_length_.find(keyword); |
| 1493 if (i == keyword_to_turl_and_length_.end()) { | 1524 if (i == keyword_to_turl_and_length_.end()) { |
| 1494 AddToMap(template_url); | 1525 AddToMap(template_url); |
| 1495 AddToDomainMap(template_url); | 1526 AddToDomainMap(template_url); |
| 1496 } else { | 1527 } else { |
| 1497 const TemplateURL* existing_url = i->second.first; | 1528 TemplateURL* existing_url = i->second.first; |
| 1498 // We should only have overlapping keywords when at least one comes from | 1529 if (BestEngineForKeyword(existing_url, template_url) != existing_url) { |
| 1499 // an extension. In that case, the ranking order is: | |
| 1500 // Manually-modified keywords > extension keywords > replaceable keywords | |
| 1501 // When there are multiple extensions, the last-added wins. | |
| 1502 bool existing_url_is_omnibox_api = | |
| 1503 existing_url->type() == TemplateURL::OMNIBOX_API_EXTENSION; | |
| 1504 DCHECK(existing_url_is_omnibox_api || template_url_is_omnibox_api); | |
| 1505 if (existing_url_is_omnibox_api ? | |
| 1506 !CanReplace(template_url) : CanReplace(existing_url)) { | |
| 1507 RemoveFromDomainMap(existing_url); | 1530 RemoveFromDomainMap(existing_url); |
| 1508 AddToMap(template_url); | 1531 AddToMap(template_url); |
| 1509 AddToDomainMap(template_url); | 1532 AddToDomainMap(template_url); |
| 1510 } | 1533 } |
| 1511 } | 1534 } |
| 1512 | 1535 |
| 1513 if (template_url_is_omnibox_api) | 1536 if (template_url_is_omnibox_api) |
| 1514 return; | 1537 return; |
| 1515 | 1538 |
| 1516 if (!template_url->sync_guid().empty()) | 1539 if (!template_url->sync_guid().empty()) |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1644 } | 1667 } |
| 1645 return nullptr; | 1668 return nullptr; |
| 1646 } | 1669 } |
| 1647 | 1670 |
| 1648 bool TemplateURLService::UpdateNoNotify(TemplateURL* existing_turl, | 1671 bool TemplateURLService::UpdateNoNotify(TemplateURL* existing_turl, |
| 1649 const TemplateURL& new_values) { | 1672 const TemplateURL& new_values) { |
| 1650 DCHECK(existing_turl); | 1673 DCHECK(existing_turl); |
| 1651 if (!Contains(&template_urls_, existing_turl)) | 1674 if (!Contains(&template_urls_, existing_turl)) |
| 1652 return false; | 1675 return false; |
| 1653 | 1676 |
| 1654 DCHECK_NE(TemplateURL::OMNIBOX_API_EXTENSION, existing_turl->type()); | 1677 DCHECK(!IsCreatedByExtension(existing_turl)); |
| 1655 | 1678 |
| 1656 base::string16 old_keyword(existing_turl->keyword()); | 1679 base::string16 old_keyword(existing_turl->keyword()); |
| 1657 keyword_to_turl_and_length_.erase(old_keyword); | 1680 keyword_to_turl_and_length_.erase(old_keyword); |
| 1658 RemoveFromDomainMap(existing_turl); | 1681 RemoveFromDomainMap(existing_turl); |
| 1659 if (!existing_turl->sync_guid().empty()) | 1682 if (!existing_turl->sync_guid().empty()) |
| 1660 guid_to_turl_.erase(existing_turl->sync_guid()); | 1683 guid_to_turl_.erase(existing_turl->sync_guid()); |
| 1661 | 1684 |
| 1662 // |provider_map_| is only initialized after loading has completed. | 1685 // |provider_map_| is only initialized after loading has completed. |
| 1663 if (loaded_) | 1686 if (loaded_) |
| 1664 provider_map_->Remove(existing_turl); | 1687 provider_map_->Remove(existing_turl); |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1955 } | 1978 } |
| 1956 | 1979 |
| 1957 // |default_search_provider_source_| must be set before calling | 1980 // |default_search_provider_source_| must be set before calling |
| 1958 // UpdateNoNotify(), since that function needs to know the source of the | 1981 // UpdateNoNotify(), since that function needs to know the source of the |
| 1959 // update in question. | 1982 // update in question. |
| 1960 default_search_provider_source_ = source; | 1983 default_search_provider_source_ = source; |
| 1961 | 1984 |
| 1962 if (!data) { | 1985 if (!data) { |
| 1963 default_search_provider_ = nullptr; | 1986 default_search_provider_ = nullptr; |
| 1964 } else if (source == DefaultSearchManager::FROM_EXTENSION) { | 1987 } else if (source == DefaultSearchManager::FROM_EXTENSION) { |
| 1965 default_search_provider_ = FindMatchingExtensionTemplateURL( | 1988 default_search_provider_ = FindMatchingDefaultExtensionTemplateURL(*data); |
| 1966 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); | |
| 1967 } else if (source == DefaultSearchManager::FROM_FALLBACK) { | 1989 } else if (source == DefaultSearchManager::FROM_FALLBACK) { |
| 1968 default_search_provider_ = | 1990 default_search_provider_ = |
| 1969 FindPrepopulatedTemplateURL(data->prepopulate_id); | 1991 FindPrepopulatedTemplateURL(data->prepopulate_id); |
| 1970 if (default_search_provider_) { | 1992 if (default_search_provider_) { |
| 1971 TemplateURLData update_data(*data); | 1993 TemplateURLData update_data(*data); |
| 1972 update_data.sync_guid = default_search_provider_->sync_guid(); | 1994 update_data.sync_guid = default_search_provider_->sync_guid(); |
| 1973 if (!default_search_provider_->safe_for_autoreplace()) { | 1995 if (!default_search_provider_->safe_for_autoreplace()) { |
| 1974 update_data.safe_for_autoreplace = false; | 1996 update_data.safe_for_autoreplace = false; |
| 1975 update_data.SetKeyword(default_search_provider_->keyword()); | 1997 update_data.SetKeyword(default_search_provider_->keyword()); |
| 1976 update_data.SetShortName(default_search_provider_->short_name()); | 1998 update_data.SetShortName(default_search_provider_->short_name()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2025 bool newly_adding) { | 2047 bool newly_adding) { |
| 2026 DCHECK(template_url); | 2048 DCHECK(template_url); |
| 2027 | 2049 |
| 2028 if (newly_adding) { | 2050 if (newly_adding) { |
| 2029 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); | 2051 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
| 2030 DCHECK(!Contains(&template_urls_, template_url.get())); | 2052 DCHECK(!Contains(&template_urls_, template_url.get())); |
| 2031 template_url->data_.id = ++next_id_; | 2053 template_url->data_.id = ++next_id_; |
| 2032 } | 2054 } |
| 2033 | 2055 |
| 2034 template_url->ResetKeywordIfNecessary(search_terms_data(), false); | 2056 template_url->ResetKeywordIfNecessary(search_terms_data(), false); |
| 2035 // Check whether |template_url|'s keyword conflicts with any already in the | |
| 2036 // model. | |
| 2037 TemplateURL* existing_keyword_turl = | |
| 2038 GetTemplateURLForKeyword(template_url->keyword()); | |
| 2039 | 2057 |
| 2040 // Check whether |template_url|'s keyword conflicts with any already in the | 2058 // Check for conflicts between non extension engines keywords. |
| 2041 // model. Note that we can reach here during the loading phase while | 2059 if (!IsCreatedByExtension(template_url.get())) { |
| 2042 // processing the template URLs from the web data service. In this case, | 2060 // Check whether |template_url|'s keyword conflicts with any already in the |
| 2043 // GetTemplateURLForKeyword() will look not only at what's already in the | 2061 // model. |
| 2044 // model, but at the |initial_default_search_provider_|. Since this engine | 2062 TemplateURL* existing_turl = |
| 2045 // will presumably also be present in the web data, we need to double-check | 2063 FindNonExtensionTemplateURLForKeyword(template_url->keyword()); |
| 2046 // that any "pre-existing" entries we find are actually coming from | 2064 |
| 2047 // |template_urls_|, lest we detect a "conflict" between the | 2065 // Check whether |template_url|'s keyword conflicts with any already in the |
| 2048 // |initial_default_search_provider_| and the web data version of itself. | 2066 // model. Note that we can reach here during the loading phase while |
| 2049 if (template_url->type() != TemplateURL::OMNIBOX_API_EXTENSION && | 2067 // processing the template URLs from the web data service. In this case, |
| 2050 existing_keyword_turl && | 2068 // GetTemplateURLForKeyword() will look not only at what's already in the |
| 2051 existing_keyword_turl->type() != TemplateURL::OMNIBOX_API_EXTENSION && | 2069 // model, but at the |initial_default_search_provider_|. Since this engine |
| 2052 Contains(&template_urls_, existing_keyword_turl)) { | 2070 // will presumably also be present in the web data, we need to double-check |
| 2053 DCHECK_NE(existing_keyword_turl, template_url.get()); | 2071 // that any "pre-existing" entries we find are actually coming from |
| 2054 // Only replace one of the TemplateURLs if they are either both extensions, | 2072 // |template_urls_|, lest we detect a "conflict" between the |
| 2055 // or both not extensions. | 2073 // |initial_default_search_provider_| and the web data version of itself. |
| 2056 bool are_same_type = IsCreatedByExtension(existing_keyword_turl) == | 2074 if (existing_turl && Contains(&template_urls_, existing_turl)) { |
| 2057 IsCreatedByExtension(template_url.get()); | 2075 DCHECK_NE(existing_turl, template_url.get()); |
| 2058 if (CanReplace(existing_keyword_turl) && are_same_type) { | 2076 if (CanReplace(existing_turl)) |
|
vasilii
2017/02/20 15:30:08
{} here and below.
Alexander Yashkin
2017/02/20 19:52:47
Done.
| |
| 2059 RemoveNoNotify(existing_keyword_turl); | 2077 RemoveNoNotify(existing_turl); |
| 2060 } else if (CanReplace(template_url.get()) && are_same_type) { | 2078 else if (CanReplace(template_url.get())) |
| 2061 return nullptr; | 2079 return nullptr; |
| 2062 } else { | 2080 else { |
| 2063 base::string16 new_keyword = | 2081 base::string16 new_keyword = UniquifyKeyword(*existing_turl, false); |
| 2064 UniquifyKeyword(*existing_keyword_turl, false); | 2082 // Resolve keyword conflicts for engines that can not be replaced. |
| 2065 ResetTemplateURLNoNotify(existing_keyword_turl, | 2083 // Replace keyword for existing engine. |
| 2066 existing_keyword_turl->short_name(), new_keyword, | 2084 ResetTemplateURLNoNotify(existing_turl, existing_turl->short_name(), |
| 2067 existing_keyword_turl->url()); | 2085 new_keyword, existing_turl->url()); |
| 2086 } | |
| 2068 } | 2087 } |
| 2069 } | 2088 } |
| 2070 TemplateURL* template_url_ptr = template_url.get(); | 2089 TemplateURL* template_url_ptr = template_url.get(); |
| 2071 template_urls_.push_back(std::move(template_url)); | 2090 template_urls_.push_back(std::move(template_url)); |
| 2072 AddToMaps(template_url_ptr); | 2091 AddToMaps(template_url_ptr); |
| 2073 | 2092 |
| 2074 if (newly_adding && (template_url_ptr->type() == TemplateURL::NORMAL)) { | 2093 if (newly_adding && (template_url_ptr->type() == TemplateURL::NORMAL)) { |
| 2075 if (web_data_service_.get()) | 2094 if (web_data_service_.get()) |
| 2076 web_data_service_->AddKeyword(template_url_ptr->data()); | 2095 web_data_service_->AddKeyword(template_url_ptr->data()); |
| 2077 | 2096 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2201 DCHECK(loaded_); | 2220 DCHECK(loaded_); |
| 2202 DCHECK(!guid.empty()); | 2221 DCHECK(!guid.empty()); |
| 2203 | 2222 |
| 2204 TemplateURLData data(url->data()); | 2223 TemplateURLData data(url->data()); |
| 2205 data.sync_guid = guid; | 2224 data.sync_guid = guid; |
| 2206 UpdateNoNotify(url, TemplateURL(data)); | 2225 UpdateNoNotify(url, TemplateURL(data)); |
| 2207 } | 2226 } |
| 2208 | 2227 |
| 2209 base::string16 TemplateURLService::UniquifyKeyword(const TemplateURL& turl, | 2228 base::string16 TemplateURLService::UniquifyKeyword(const TemplateURL& turl, |
| 2210 bool force) { | 2229 bool force) { |
| 2230 DCHECK(!IsCreatedByExtension(&turl)); | |
| 2211 if (!force) { | 2231 if (!force) { |
| 2212 // Already unique. | 2232 // Already unique. |
| 2213 if (!GetTemplateURLForKeyword(turl.keyword())) | 2233 if (!GetTemplateURLForKeyword(turl.keyword())) |
| 2214 return turl.keyword(); | 2234 return turl.keyword(); |
| 2215 | 2235 |
| 2216 // First, try to return the generated keyword for the TemplateURL (except | 2236 // First, try to return the generated keyword for the TemplateURL (except |
| 2217 // for extensions, as their keywords are not associated with their URLs). | 2237 // for extensions, as their keywords are not associated with their URLs). |
| 2218 GURL gurl(turl.url()); | 2238 GURL gurl(turl.url()); |
| 2219 if (gurl.is_valid() && | 2239 if (gurl.is_valid()) { |
| 2220 (turl.type() != TemplateURL::OMNIBOX_API_EXTENSION)) { | |
| 2221 base::string16 keyword_candidate = TemplateURL::GenerateKeyword(gurl); | 2240 base::string16 keyword_candidate = TemplateURL::GenerateKeyword(gurl); |
| 2222 if (!GetTemplateURLForKeyword(keyword_candidate)) | 2241 if (!GetTemplateURLForKeyword(keyword_candidate)) |
| 2223 return keyword_candidate; | 2242 return keyword_candidate; |
| 2224 } | 2243 } |
| 2225 } | 2244 } |
| 2226 | 2245 |
| 2227 // We try to uniquify the keyword by appending a special character to the end. | 2246 // We try to uniquify the keyword by appending a special character to the end. |
| 2228 // This is a best-effort approach where we try to preserve the original | 2247 // This is a best-effort approach where we try to preserve the original |
| 2229 // keyword and let the user do what they will after our attempt. | 2248 // keyword and let the user do what they will after our attempt. |
| 2230 base::string16 keyword_candidate(turl.keyword()); | 2249 base::string16 keyword_candidate(turl.keyword()); |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2463 const std::string& extension_id, | 2482 const std::string& extension_id, |
| 2464 TemplateURL::Type type) { | 2483 TemplateURL::Type type) { |
| 2465 DCHECK_NE(TemplateURL::NORMAL, type); | 2484 DCHECK_NE(TemplateURL::NORMAL, type); |
| 2466 for (const auto& turl : template_urls_) { | 2485 for (const auto& turl : template_urls_) { |
| 2467 if (turl->type() == type && turl->GetExtensionId() == extension_id) | 2486 if (turl->type() == type && turl->GetExtensionId() == extension_id) |
| 2468 return turl.get(); | 2487 return turl.get(); |
| 2469 } | 2488 } |
| 2470 return nullptr; | 2489 return nullptr; |
| 2471 } | 2490 } |
| 2472 | 2491 |
| 2473 TemplateURL* TemplateURLService::FindMatchingExtensionTemplateURL( | 2492 TemplateURL* TemplateURLService::FindMatchingDefaultExtensionTemplateURL( |
| 2474 const TemplateURLData& data, | 2493 const TemplateURLData& data) { |
| 2475 TemplateURL::Type type) { | |
| 2476 DCHECK_NE(TemplateURL::NORMAL, type); | |
| 2477 for (const auto& turl : template_urls_) { | 2494 for (const auto& turl : template_urls_) { |
| 2478 if (turl->type() == type && | 2495 if (turl->type() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION && |
| 2496 turl->extension_info_->wants_to_be_default_engine && | |
| 2479 TemplateURL::MatchesData(turl.get(), &data, search_terms_data())) | 2497 TemplateURL::MatchesData(turl.get(), &data, search_terms_data())) |
| 2480 return turl.get(); | 2498 return turl.get(); |
| 2481 } | 2499 } |
| 2482 return nullptr; | 2500 return nullptr; |
| 2483 } | 2501 } |
| 2484 | 2502 |
| 2485 void TemplateURLService::UpdateExtensionDefaultSearchEngine() { | 2503 void TemplateURLService::UpdateExtensionDefaultSearchEngine() { |
| 2486 TemplateURL* most_recently_intalled_default = nullptr; | 2504 TemplateURL* most_recently_intalled_default = nullptr; |
| 2487 for (const auto& turl : template_urls_) { | 2505 for (const auto& turl : template_urls_) { |
| 2488 if ((turl->type() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) && | 2506 if ((turl->type() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) && |
| 2489 turl->extension_info_->wants_to_be_default_engine && | 2507 turl->extension_info_->wants_to_be_default_engine && |
| 2490 turl->SupportsReplacement(search_terms_data()) && | 2508 turl->SupportsReplacement(search_terms_data()) && |
| 2491 (!most_recently_intalled_default || | 2509 (!most_recently_intalled_default || |
| 2492 (most_recently_intalled_default->extension_info_->install_time < | 2510 (most_recently_intalled_default->extension_info_->install_time < |
| 2493 turl->extension_info_->install_time))) | 2511 turl->extension_info_->install_time))) |
| 2494 most_recently_intalled_default = turl.get(); | 2512 most_recently_intalled_default = turl.get(); |
| 2495 } | 2513 } |
| 2496 | 2514 |
| 2497 if (most_recently_intalled_default) { | 2515 if (most_recently_intalled_default) { |
| 2498 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 2516 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
| 2499 &dsp_change_origin_, DSP_CHANGE_OVERRIDE_SETTINGS_EXTENSION); | 2517 &dsp_change_origin_, DSP_CHANGE_OVERRIDE_SETTINGS_EXTENSION); |
| 2500 default_search_manager_.SetExtensionControlledDefaultSearchEngine( | 2518 default_search_manager_.SetExtensionControlledDefaultSearchEngine( |
| 2501 most_recently_intalled_default->data()); | 2519 most_recently_intalled_default->data()); |
| 2502 } else { | 2520 } else { |
| 2503 default_search_manager_.ClearExtensionControlledDefaultSearchEngine(); | 2521 default_search_manager_.ClearExtensionControlledDefaultSearchEngine(); |
| 2504 } | 2522 } |
| 2505 } | 2523 } |
| OLD | NEW |