Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/search_engines/template_url_service.h" | 5 #include "chrome/browser/search_engines/template_url_service.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/environment.h" | 9 #include "base/environment.h" |
| 10 #include "base/i18n/case_conversion.h" | 10 #include "base/i18n/case_conversion.h" |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 247 // We already have a TemplateURL for this keyword. Only allow it to be | 247 // We already have a TemplateURL for this keyword. Only allow it to be |
| 248 // replaced if the TemplateURL can be replaced. | 248 // replaced if the TemplateURL can be replaced. |
| 249 return CanReplace(existing_url); | 249 return CanReplace(existing_url); |
| 250 } | 250 } |
| 251 | 251 |
| 252 // We don't have a TemplateURL with keyword. Only allow a new one if there | 252 // We don't have a TemplateURL with keyword. Only allow a new one if there |
| 253 // isn't a TemplateURL for the specified host, or there is one but it can | 253 // isn't a TemplateURL for the specified host, or there is one but it can |
| 254 // be replaced. We do this to ensure that if the user assigns a different | 254 // be replaced. We do this to ensure that if the user assigns a different |
| 255 // keyword to a generated TemplateURL, we won't regenerate another keyword for | 255 // keyword to a generated TemplateURL, we won't regenerate another keyword for |
| 256 // the same host. | 256 // the same host. |
| 257 if (url.is_valid() && !url.host().empty()) | 257 return !url.is_valid() || url.host().empty() || |
| 258 return CanReplaceKeywordForHost(url.host(), template_url_to_replace); | 258 CanReplaceKeywordForHost(url.host(), template_url_to_replace); |
| 259 return true; | |
| 260 } | 259 } |
| 261 | 260 |
| 262 void TemplateURLService::FindMatchingKeywords( | 261 void TemplateURLService::FindMatchingKeywords( |
| 263 const string16& prefix, | 262 const string16& prefix, |
| 264 bool support_replacement_only, | 263 bool support_replacement_only, |
| 265 std::vector<string16>* matches) const { | 264 std::vector<string16>* matches) const { |
| 266 // Sanity check args. | 265 // Sanity check args. |
| 267 if (prefix.empty()) | 266 if (prefix.empty()) |
| 268 return; | 267 return; |
| 269 DCHECK(matches != NULL); | 268 DCHECK(matches != NULL); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 288 DCHECK(!i->second->url().empty()); | 287 DCHECK(!i->second->url().empty()); |
| 289 if (!support_replacement_only || i->second->url_ref().SupportsReplacement()) | 288 if (!support_replacement_only || i->second->url_ref().SupportsReplacement()) |
| 290 matches->push_back(i->first); | 289 matches->push_back(i->first); |
| 291 } | 290 } |
| 292 } | 291 } |
| 293 | 292 |
| 294 const TemplateURL* TemplateURLService::GetTemplateURLForKeyword( | 293 const TemplateURL* TemplateURLService::GetTemplateURLForKeyword( |
| 295 const string16& keyword) const { | 294 const string16& keyword) const { |
| 296 KeywordToTemplateMap::const_iterator elem( | 295 KeywordToTemplateMap::const_iterator elem( |
| 297 keyword_to_template_map_.find(keyword)); | 296 keyword_to_template_map_.find(keyword)); |
| 298 return (elem == keyword_to_template_map_.end()) ? NULL : elem->second; | 297 if (elem != keyword_to_template_map_.end()) |
| 298 return elem->second; | |
| 299 return (initial_default_search_provider_.get() && | |
| 300 (initial_default_search_provider_->keyword() == keyword)) ? | |
| 301 initial_default_search_provider_.get() : NULL; | |
| 299 } | 302 } |
| 300 | 303 |
| 301 const TemplateURL* TemplateURLService::GetTemplateURLForGUID( | 304 const TemplateURL* TemplateURLService::GetTemplateURLForGUID( |
| 302 const std::string& sync_guid) const { | 305 const std::string& sync_guid) const { |
| 303 GUIDToTemplateMap::const_iterator elem( | 306 GUIDToTemplateMap::const_iterator elem( |
| 304 guid_to_template_map_.find(sync_guid)); | 307 guid_to_template_map_.find(sync_guid)); |
| 305 return (elem == guid_to_template_map_.end()) ? NULL : elem->second; | 308 if (elem != guid_to_template_map_.end()) |
| 309 return elem->second; | |
| 310 return (initial_default_search_provider_.get() && | |
| 311 (initial_default_search_provider_->sync_guid() == sync_guid)) ? | |
| 312 initial_default_search_provider_.get() : NULL; | |
| 306 } | 313 } |
| 307 | 314 |
| 308 const TemplateURL* TemplateURLService::GetTemplateURLForHost( | 315 const TemplateURL* TemplateURLService::GetTemplateURLForHost( |
| 309 const std::string& host) const { | 316 const std::string& host) const { |
| 310 return provider_map_.GetTemplateURLForHost(host); | 317 const TemplateURL* t_url = provider_map_.GetTemplateURLForHost(host); |
| 318 if (t_url) | |
| 319 return t_url; | |
| 320 return (initial_default_search_provider_.get() && | |
| 321 (GenerateSearchURL(initial_default_search_provider_.get()).host() == | |
| 322 host)) ? initial_default_search_provider_.get() : NULL; | |
| 311 } | 323 } |
| 312 | 324 |
| 313 void TemplateURLService::Add(TemplateURL* template_url) { | 325 void TemplateURLService::Add(TemplateURL* template_url) { |
| 314 AddNoNotify(template_url); | 326 AddNoNotify(template_url, true); |
| 315 NotifyObservers(); | 327 NotifyObservers(); |
| 316 } | 328 } |
| 317 | 329 |
| 318 void TemplateURLService::AddWithOverrides(const TemplateURL* template_url, | 330 void TemplateURLService::AddWithOverrides(const TemplateURL* template_url, |
| 319 const string16& short_name, | 331 const string16& short_name, |
| 320 const string16& keyword, | 332 const string16& keyword, |
| 321 const std::string& url) { | 333 const std::string& url) { |
| 322 TemplateURL* modifiable_url = const_cast<TemplateURL*>(template_url); | 334 TemplateURL* modifiable_url = const_cast<TemplateURL*>(template_url); |
| 323 modifiable_url->data_.short_name = short_name; | 335 modifiable_url->data_.short_name = short_name; |
| 324 modifiable_url->data_.SetKeyword(keyword); | 336 modifiable_url->data_.SetKeyword(keyword); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 // TODO(mpcomplete): disable the keyword when the extension is disabled. | 380 // TODO(mpcomplete): disable the keyword when the extension is disabled. |
| 369 if (extension->omnibox_keyword().empty()) | 381 if (extension->omnibox_keyword().empty()) |
| 370 return; | 382 return; |
| 371 | 383 |
| 372 Load(); | 384 Load(); |
| 373 if (!loaded_) { | 385 if (!loaded_) { |
| 374 pending_extension_ids_.push_back(extension->id()); | 386 pending_extension_ids_.push_back(extension->id()); |
| 375 return; | 387 return; |
| 376 } | 388 } |
| 377 | 389 |
| 378 const TemplateURL* existing_url = GetTemplateURLForExtension(extension); | 390 if (!GetTemplateURLForExtension(extension)) { |
| 379 string16 keyword = UTF8ToUTF16(extension->omnibox_keyword()); | 391 TemplateURLData data; |
| 380 | 392 data.short_name = UTF8ToUTF16(extension->name()); |
| 381 TemplateURLData data; | 393 data.SetKeyword(UTF8ToUTF16(extension->omnibox_keyword())); |
| 382 data.short_name = UTF8ToUTF16(extension->name()); | 394 // This URL is not actually used for navigation. It holds the extension's |
| 383 data.SetKeyword(UTF8ToUTF16(extension->omnibox_keyword())); | 395 // ID, as well as forcing the TemplateURL to be treated as a search keyword. |
| 384 // This URL is not actually used for navigation. It holds the extension's | 396 data.SetURL(std::string(chrome::kExtensionScheme) + "://" + |
| 385 // ID, as well as forcing the TemplateURL to be treated as a search keyword. | 397 extension->id() + "/?q={searchTerms}"); |
| 386 data.SetURL(std::string(chrome::kExtensionScheme) + "://" + extension->id() + | 398 Add(new TemplateURL(data)); |
| 387 "/?q={searchTerms}"); | |
| 388 scoped_ptr<TemplateURL> template_url(new TemplateURL(data)); | |
| 389 | |
| 390 if (existing_url) { | |
| 391 // TODO(mpcomplete): only replace if the user hasn't changed the keyword. | |
| 392 // (We don't have UI for that yet). | |
| 393 UpdateNoNotify(existing_url, *template_url); | |
| 394 } else { | |
| 395 AddNoNotify(template_url.release()); | |
| 396 } | 399 } |
| 397 NotifyObservers(); | |
| 398 } | 400 } |
| 399 | 401 |
| 400 void TemplateURLService::UnregisterExtensionKeyword( | 402 void TemplateURLService::UnregisterExtensionKeyword( |
| 401 const Extension* extension) { | 403 const Extension* extension) { |
| 402 const TemplateURL* url = GetTemplateURLForExtension(extension); | 404 if (loaded_) { |
| 403 if (url) | 405 const TemplateURL* url = GetTemplateURLForExtension(extension); |
| 404 Remove(url); | 406 if (url) |
| 407 Remove(url); | |
| 408 } else { | |
| 409 PendingExtensionIDs::iterator i = std::find(pending_extension_ids_.begin(), | |
| 410 pending_extension_ids_.end(), extension->id()); | |
| 411 if (i != pending_extension_ids_.end()) | |
| 412 pending_extension_ids_.erase(i); | |
| 413 } | |
| 405 } | 414 } |
| 406 | 415 |
| 407 const TemplateURL* TemplateURLService::GetTemplateURLForExtension( | 416 const TemplateURL* TemplateURLService::GetTemplateURLForExtension( |
| 408 const Extension* extension) const { | 417 const Extension* extension) const { |
| 409 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | 418 for (TemplateURLVector::const_iterator i = template_urls_.begin(); |
| 410 i != template_urls_.end(); ++i) { | 419 i != template_urls_.end(); ++i) { |
| 411 if ((*i)->IsExtensionKeyword() && | 420 if ((*i)->IsExtensionKeyword() && |
| 412 ((*i)->url_ref().GetHost() == extension->id())) | 421 ((*i)->url_ref().GetHost() == extension->id())) |
| 413 return *i; | 422 return *i; |
| 414 } | 423 } |
| 415 | 424 |
| 416 return NULL; | 425 return NULL; |
| 417 } | 426 } |
| 418 | 427 |
| 419 std::vector<const TemplateURL*> TemplateURLService::GetTemplateURLs() const { | 428 TemplateURLService::TemplateURLVector |
| 429 TemplateURLService::GetTemplateURLs() const { | |
| 420 return template_urls_; | 430 return template_urls_; |
| 421 } | 431 } |
| 422 | 432 |
| 423 void TemplateURLService::IncrementUsageCount(const TemplateURL* url) { | 433 void TemplateURLService::IncrementUsageCount(const TemplateURL* url) { |
| 424 DCHECK(url && std::find(template_urls_.begin(), template_urls_.end(), url) != | 434 DCHECK(url && std::find(template_urls_.begin(), template_urls_.end(), url) != |
| 425 template_urls_.end()); | 435 template_urls_.end()); |
| 426 ++const_cast<TemplateURL*>(url)->data_.usage_count; | 436 ++const_cast<TemplateURL*>(url)->data_.usage_count; |
| 427 if (service_.get()) | 437 // Extension keywords are not persisted. |
| 428 service_->UpdateKeyword(*url); | 438 // TODO(mpcomplete): If we allow editing extension keywords, then those should |
| 439 // be persisted to disk and synced. | |
| 440 if (service_.get() && !url->IsExtensionKeyword()) | |
| 441 service_.get()->UpdateKeyword(*url); | |
| 429 } | 442 } |
| 430 | 443 |
| 431 void TemplateURLService::ResetTemplateURL(const TemplateURL* url, | 444 void TemplateURLService::ResetTemplateURL(const TemplateURL* url, |
| 432 const string16& title, | 445 const string16& title, |
| 433 const string16& keyword, | 446 const string16& keyword, |
| 434 const std::string& search_url) { | 447 const std::string& search_url) { |
| 435 TemplateURLData data(url->data()); | 448 TemplateURLData data(url->data()); |
| 436 data.short_name = title; | 449 data.short_name = title; |
| 437 data.SetKeyword(keyword); | 450 data.SetKeyword(keyword); |
| 438 if (search_url != data.url()) { | 451 if (search_url != data.url()) { |
| 439 data.SetURL(search_url); | 452 data.SetURL(search_url); |
| 440 // The urls have changed, reset the favicon url. | 453 // The urls have changed, reset the favicon url. |
| 441 data.favicon_url = GURL(); | 454 data.favicon_url = GURL(); |
| 442 } | 455 } |
| 443 data.safe_for_autoreplace = false; | 456 data.safe_for_autoreplace = false; |
| 444 data.last_modified = time_provider_(); | 457 data.last_modified = time_provider_(); |
| 445 TemplateURL new_url(data); | 458 TemplateURL new_url(data); |
| 446 UpdateNoNotify(url, new_url); | 459 UpdateNoNotify(url, new_url); |
| 447 NotifyObservers(); | 460 NotifyObservers(); |
| 448 } | 461 } |
| 449 | 462 |
| 450 bool TemplateURLService::CanMakeDefault(const TemplateURL* url) { | 463 bool TemplateURLService::CanMakeDefault(const TemplateURL* url) { |
| 451 return url != GetDefaultSearchProvider() && | 464 return url != GetDefaultSearchProvider() && |
| 452 url->url_ref().SupportsReplacement() && !is_default_search_managed(); | 465 url->url_ref().SupportsReplacement() && !is_default_search_managed(); |
| 453 } | 466 } |
| 454 | 467 |
| 455 void TemplateURLService::SetDefaultSearchProvider(const TemplateURL* url) { | 468 void TemplateURLService::SetDefaultSearchProvider(const TemplateURL* url) { |
| 456 if (is_default_search_managed_) { | 469 DCHECK(!is_default_search_managed_); |
| 457 NOTREACHED(); | 470 // Extension keywords cannot be made default, as they are inherently async. |
| 458 return; | 471 DCHECK(!url || !url->IsExtensionKeyword()); |
| 459 } | 472 |
| 460 // Always persist the setting in the database, that way if the backup | 473 // Always persist the setting in the database, that way if the backup |
| 461 // signature has changed out from under us it gets reset correctly. | 474 // signature has changed out from under us it gets reset correctly. |
| 462 SetDefaultSearchProviderNoNotify(url); | 475 SetDefaultSearchProviderNoNotify(url); |
| 463 NotifyObservers(); | 476 NotifyObservers(); |
| 464 } | 477 } |
| 465 | 478 |
| 466 const TemplateURL* TemplateURLService::GetDefaultSearchProvider() { | 479 const TemplateURL* TemplateURLService::GetDefaultSearchProvider() { |
| 467 if (loaded_ && !load_failed_) | 480 if (loaded_ && !load_failed_) |
| 468 return default_search_provider_; | 481 return default_search_provider_; |
| 469 | 482 |
| 470 // We're not loaded, rely on the default search provider stored in prefs. | 483 // We're not loaded, rely on the default search provider stored in prefs. |
| 471 return initial_default_search_provider_.get(); | 484 return initial_default_search_provider_.get(); |
| 472 } | 485 } |
| 473 | 486 |
| 474 const TemplateURL* TemplateURLService::FindNewDefaultSearchProvider() { | 487 const TemplateURL* TemplateURLService::FindNewDefaultSearchProvider() { |
| 475 // See if the prepoluated default still exists. | 488 // See if the prepopulated default still exists. |
| 476 scoped_ptr<TemplateURL> prepopulated_default( | 489 scoped_ptr<TemplateURL> prepopulated_default( |
| 477 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(GetPrefs())); | 490 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(GetPrefs())); |
| 478 for (TemplateURLVector::iterator i = template_urls_.begin(); | 491 for (TemplateURLVector::iterator i = template_urls_.begin(); |
| 479 i != template_urls_.end(); ++i) { | 492 i != template_urls_.end(); ++i) { |
| 480 if ((*i)->prepopulate_id() == prepopulated_default->prepopulate_id()) | 493 if ((*i)->prepopulate_id() == prepopulated_default->prepopulate_id()) |
| 481 return *i; | 494 return *i; |
| 482 } | 495 } |
| 483 // If not, use the first of the templates. | 496 // If not, use the first non-extension keyword of the templates. |
| 484 return template_urls_.empty() ? NULL : template_urls_[0]; | 497 for (TemplateURLVector::const_iterator i(template_urls_.begin()); |
| 498 i != template_urls_.end(); ++i) { | |
| 499 if (!(*i)->IsExtensionKeyword()) | |
| 500 return *i; | |
| 501 } | |
| 502 return NULL; | |
| 485 } | 503 } |
| 486 | 504 |
| 487 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) { | 505 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) { |
| 488 model_observers_.AddObserver(observer); | 506 model_observers_.AddObserver(observer); |
| 489 } | 507 } |
| 490 | 508 |
| 491 void TemplateURLService::RemoveObserver(TemplateURLServiceObserver* observer) { | 509 void TemplateURLService::RemoveObserver(TemplateURLServiceObserver* observer) { |
| 492 model_observers_.RemoveObserver(observer); | 510 model_observers_.RemoveObserver(observer); |
| 493 } | 511 } |
| 494 | 512 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 524 } | 542 } |
| 525 | 543 |
| 526 // initial_default_search_provider_ is only needed before we've finished | 544 // initial_default_search_provider_ is only needed before we've finished |
| 527 // loading. Now that we've loaded we can nuke it. | 545 // loading. Now that we've loaded we can nuke it. |
| 528 initial_default_search_provider_.reset(); | 546 initial_default_search_provider_.reset(); |
| 529 is_default_search_managed_ = false; | 547 is_default_search_managed_ = false; |
| 530 | 548 |
| 531 std::vector<TemplateURL*> template_urls; | 549 std::vector<TemplateURL*> template_urls; |
| 532 const TemplateURL* default_search_provider = NULL; | 550 const TemplateURL* default_search_provider = NULL; |
| 533 int new_resource_keyword_version = 0; | 551 int new_resource_keyword_version = 0; |
| 534 GetSearchProvidersUsingKeywordResult(*result, | 552 GetSearchProvidersUsingKeywordResult(*result, service_.get(), GetPrefs(), |
| 535 service_.get(), | 553 &template_urls, &default_search_provider, &new_resource_keyword_version); |
| 536 GetPrefs(), | |
| 537 &template_urls, | |
| 538 &default_search_provider, | |
| 539 &new_resource_keyword_version); | |
| 540 | 554 |
| 541 bool database_specified_a_default = (default_search_provider != NULL); | 555 bool database_specified_a_default = (default_search_provider != NULL); |
| 542 | 556 |
| 543 // Check if default search provider is now managed. | 557 // Check if default search provider is now managed. |
| 544 scoped_ptr<TemplateURL> default_from_prefs; | 558 scoped_ptr<TemplateURL> default_from_prefs; |
| 545 LoadDefaultSearchProviderFromPrefs(&default_from_prefs, | 559 LoadDefaultSearchProviderFromPrefs(&default_from_prefs, |
| 546 &is_default_search_managed_); | 560 &is_default_search_managed_); |
| 547 | 561 |
| 548 // Check if the default search provider has been changed in Web Data by | 562 // Check if the default search provider has been changed in Web Data by |
| 549 // another program. No immediate action is performed because the default | 563 // another program. No immediate action is performed because the default |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 577 // The value from the preferences was previously stored in the database. | 591 // The value from the preferences was previously stored in the database. |
| 578 // Reuse it. | 592 // Reuse it. |
| 579 } else { | 593 } else { |
| 580 // The value from the preferences takes over. | 594 // The value from the preferences takes over. |
| 581 default_search_provider = NULL; | 595 default_search_provider = NULL; |
| 582 if (default_from_prefs.get()) { | 596 if (default_from_prefs.get()) { |
| 583 TemplateURLData data(default_from_prefs->data()); | 597 TemplateURLData data(default_from_prefs->data()); |
| 584 data.created_by_policy = true; | 598 data.created_by_policy = true; |
| 585 data.id = kInvalidTemplateURLID; | 599 data.id = kInvalidTemplateURLID; |
| 586 TemplateURL* managed_default = new TemplateURL(data); | 600 TemplateURL* managed_default = new TemplateURL(data); |
| 587 AddNoNotify(managed_default); | 601 AddNoNotify(managed_default, true); |
| 588 default_search_provider = managed_default; | 602 default_search_provider = managed_default; |
| 589 } | 603 } |
| 590 } | 604 } |
| 591 // Note that this saves the default search provider to prefs. | 605 // Note that this saves the default search provider to prefs. |
| 592 SetDefaultSearchProviderNoNotify(default_search_provider); | 606 if (!default_search_provider || |
| 607 !default_search_provider->IsExtensionKeyword()) | |
| 608 SetDefaultSearchProviderNoNotify(default_search_provider); | |
| 593 } else { | 609 } else { |
| 594 // If we had a managed default, replace it with the synced default if | 610 // If we had a managed default, replace it with the synced default if |
| 595 // applicable, or the first provider of the list. | 611 // applicable, or the first provider of the list. |
| 596 const TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); | 612 const TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); |
| 597 if (synced_default) { | 613 if (synced_default) { |
| 598 default_search_provider = synced_default; | 614 default_search_provider = synced_default; |
| 599 pending_synced_default_search_ = false; | 615 pending_synced_default_search_ = false; |
| 600 } else if (database_specified_a_default && | 616 } else if (database_specified_a_default && |
| 601 default_search_provider == NULL && | 617 default_search_provider == NULL) { |
| 602 !template_urls.empty()) { | 618 for (std::vector<TemplateURL*>::const_iterator i = template_urls.begin(); |
| 603 default_search_provider = template_urls[0]; | 619 i != template_urls.end(); ++i) { |
| 620 if (!(*i)->IsExtensionKeyword()) { | |
| 621 default_search_provider = *i; | |
| 622 break; | |
| 623 } | |
| 624 } | |
| 604 } | 625 } |
| 605 | 626 |
| 606 // If the default search provider existed previously, then just | 627 // If the default search provider existed previously, then just |
| 607 // set the member variable. Otherwise, we'll set it using the method | 628 // set the member variable. Otherwise, we'll set it using the method |
| 608 // to ensure that it is saved properly after its id is set. | 629 // to ensure that it is saved properly after its id is set. |
| 609 if (default_search_provider && | 630 if (default_search_provider && |
| 610 (default_search_provider->id() != kInvalidTemplateURLID)) { | 631 (default_search_provider->id() != kInvalidTemplateURLID)) { |
| 611 default_search_provider_ = default_search_provider; | 632 default_search_provider_ = default_search_provider; |
| 612 default_search_provider = NULL; | 633 default_search_provider = NULL; |
| 613 } | 634 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 733 } | 754 } |
| 734 | 755 |
| 735 SyncDataList TemplateURLService::GetAllSyncData( | 756 SyncDataList TemplateURLService::GetAllSyncData( |
| 736 syncable::ModelType type) const { | 757 syncable::ModelType type) const { |
| 737 DCHECK_EQ(syncable::SEARCH_ENGINES, type); | 758 DCHECK_EQ(syncable::SEARCH_ENGINES, type); |
| 738 | 759 |
| 739 SyncDataList current_data; | 760 SyncDataList current_data; |
| 740 for (TemplateURLVector::const_iterator iter = template_urls_.begin(); | 761 for (TemplateURLVector::const_iterator iter = template_urls_.begin(); |
| 741 iter != template_urls_.end(); ++iter) { | 762 iter != template_urls_.end(); ++iter) { |
| 742 // We don't sync extension keywords. | 763 // We don't sync extension keywords. |
| 764 // TODO(mpcomplete): If we allow editing extension keywords, then those | |
| 765 // should be persisted to disk and synced. | |
| 743 if ((*iter)->IsExtensionKeyword()) | 766 if ((*iter)->IsExtensionKeyword()) |
| 744 continue; | 767 continue; |
| 745 // We don't sync keywords managed by policy. | 768 // We don't sync keywords managed by policy. |
| 746 if ((*iter)->created_by_policy()) | 769 if ((*iter)->created_by_policy()) |
| 747 continue; | 770 continue; |
| 748 current_data.push_back(CreateSyncDataFromTemplateURL(**iter)); | 771 current_data.push_back(CreateSyncDataFromTemplateURL(**iter)); |
| 749 } | 772 } |
| 750 | 773 |
| 751 return current_data; | 774 return current_data; |
| 752 } | 775 } |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 897 local_data_map[local_turl->sync_guid()])); | 920 local_data_map[local_turl->sync_guid()])); |
| 898 } | 921 } |
| 899 local_data_map.erase(iter->first); | 922 local_data_map.erase(iter->first); |
| 900 } else { | 923 } else { |
| 901 // The search engine from the cloud has not been synced locally, but there | 924 // The search engine from the cloud has not been synced locally, but there |
| 902 // might be a local search engine that is a duplicate that needs to be | 925 // might be a local search engine that is a duplicate that needs to be |
| 903 // merged. | 926 // merged. |
| 904 const TemplateURL* dupe_turl = FindDuplicateOfSyncTemplateURL(*sync_turl); | 927 const TemplateURL* dupe_turl = FindDuplicateOfSyncTemplateURL(*sync_turl); |
| 905 if (dupe_turl) { | 928 if (dupe_turl) { |
| 906 // Merge duplicates and remove the processed local TURL from the map. | 929 // Merge duplicates and remove the processed local TURL from the map. |
| 907 TemplateURL* modifiable_dupe_turl = | |
| 908 const_cast<TemplateURL*>(dupe_turl); | |
| 909 std::string old_guid = dupe_turl->sync_guid(); | 930 std::string old_guid = dupe_turl->sync_guid(); |
| 910 MergeSyncAndLocalURLDuplicates(sync_turl.release(), | 931 MergeSyncAndLocalURLDuplicates(sync_turl.release(), |
| 911 modifiable_dupe_turl, | 932 const_cast<TemplateURL*>(dupe_turl), |
| 912 &new_changes); | 933 &new_changes); |
| 913 local_data_map.erase(old_guid); | 934 local_data_map.erase(old_guid); |
| 914 } else { | 935 } else { |
| 915 std::string guid = sync_turl->sync_guid(); | 936 std::string guid = sync_turl->sync_guid(); |
| 916 // Keyword conflict is possible in this case. Resolve it first before | 937 // Keyword conflict is possible in this case. Resolve it first before |
| 917 // adding the new TemplateURL. Note that we don't remove the local TURL | 938 // adding the new TemplateURL. Note that we don't remove the local TURL |
| 918 // from local_data_map in this case as it may still need to be pushed to | 939 // from local_data_map in this case as it may still need to be pushed to |
| 919 // the cloud. | 940 // the cloud. |
| 920 ResolveSyncKeywordConflict(sync_turl.get(), &new_changes); | 941 ResolveSyncKeywordConflict(sync_turl.get(), &new_changes); |
| 921 // Force the local ID to kInvalidTemplateURLID so we can add it. | 942 // Force the local ID to kInvalidTemplateURLID so we can add it. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 956 DCHECK_NE(type, SyncChange::ACTION_INVALID); | 977 DCHECK_NE(type, SyncChange::ACTION_INVALID); |
| 957 DCHECK(turl); | 978 DCHECK(turl); |
| 958 | 979 |
| 959 if (!models_associated_) | 980 if (!models_associated_) |
| 960 return; // Not syncing. | 981 return; // Not syncing. |
| 961 | 982 |
| 962 if (processing_syncer_changes_) | 983 if (processing_syncer_changes_) |
| 963 return; // These are changes originating from us. Ignore. | 984 return; // These are changes originating from us. Ignore. |
| 964 | 985 |
| 965 // Avoid syncing Extension keywords. | 986 // Avoid syncing Extension keywords. |
| 987 // TODO(mpcomplete): If we allow editing extension keywords, then those should | |
| 988 // be persisted to disk and synced. | |
| 966 if (turl->IsExtensionKeyword()) | 989 if (turl->IsExtensionKeyword()) |
| 967 return; | 990 return; |
| 968 | 991 |
| 969 // Avoid syncing keywords managed by policy. | 992 // Avoid syncing keywords managed by policy. |
| 970 if (turl->created_by_policy()) | 993 if (turl->created_by_policy()) |
| 971 return; | 994 return; |
| 972 | 995 |
| 973 SyncChangeList changes; | 996 SyncChangeList changes; |
| 974 | 997 |
| 975 SyncData sync_data = CreateSyncDataFromTemplateURL(*turl); | 998 SyncData sync_data = CreateSyncDataFromTemplateURL(*turl); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1025 base::SplitString(specifics.input_encodings(), ';', &data.input_encodings); | 1048 base::SplitString(specifics.input_encodings(), ';', &data.input_encodings); |
| 1026 data.date_created = base::Time::FromInternalValue(specifics.date_created()); | 1049 data.date_created = base::Time::FromInternalValue(specifics.date_created()); |
| 1027 data.last_modified = base::Time::FromInternalValue(specifics.last_modified()); | 1050 data.last_modified = base::Time::FromInternalValue(specifics.last_modified()); |
| 1028 data.prepopulate_id = specifics.prepopulate_id(); | 1051 data.prepopulate_id = specifics.prepopulate_id(); |
| 1029 data.sync_guid = specifics.sync_guid(); | 1052 data.sync_guid = specifics.sync_guid(); |
| 1030 if (existing_turl) { | 1053 if (existing_turl) { |
| 1031 data.id = existing_turl->id(); | 1054 data.id = existing_turl->id(); |
| 1032 data.created_by_policy = existing_turl->created_by_policy(); | 1055 data.created_by_policy = existing_turl->created_by_policy(); |
| 1033 data.usage_count = existing_turl->usage_count(); | 1056 data.usage_count = existing_turl->usage_count(); |
| 1034 } | 1057 } |
| 1035 return new TemplateURL(data); | 1058 |
| 1059 TemplateURL* turl = new TemplateURL(data); | |
| 1060 DCHECK(!turl->IsExtensionKeyword()); | |
| 1061 return turl; | |
| 1036 } | 1062 } |
| 1037 | 1063 |
| 1038 // static | 1064 // static |
| 1039 SyncDataMap TemplateURLService::CreateGUIDToSyncDataMap( | 1065 SyncDataMap TemplateURLService::CreateGUIDToSyncDataMap( |
| 1040 const SyncDataList& sync_data) { | 1066 const SyncDataList& sync_data) { |
| 1041 SyncDataMap data_map; | 1067 SyncDataMap data_map; |
| 1042 SyncDataList::const_iterator iter; | 1068 for (SyncDataList::const_iterator i(sync_data.begin()); i != sync_data.end(); |
| 1043 for (iter = sync_data.begin(); iter != sync_data.end(); ++iter) { | 1069 ++i) |
| 1044 data_map[iter->GetSpecifics().search_engine().sync_guid()] = *iter; | 1070 data_map[i->GetSpecifics().search_engine().sync_guid()] = *i; |
| 1045 } | |
| 1046 return data_map; | 1071 return data_map; |
| 1047 } | 1072 } |
| 1048 | 1073 |
| 1049 void TemplateURLService::SetKeywordSearchTermsForURL(const TemplateURL* t_url, | 1074 void TemplateURLService::SetKeywordSearchTermsForURL(const TemplateURL* t_url, |
| 1050 const GURL& url, | 1075 const GURL& url, |
| 1051 const string16& term) { | 1076 const string16& term) { |
| 1052 HistoryService* history = profile_ ? | 1077 HistoryService* history = profile_ ? |
| 1053 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : NULL; | 1078 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : NULL; |
| 1054 if (!history) | 1079 if (!history) |
| 1055 return; | 1080 return; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1090 std::string osd_url(initializers[i].url); | 1115 std::string osd_url(initializers[i].url); |
| 1091 osd_url.replace(template_position, arraysize(kTemplateParameter) - 1, | 1116 osd_url.replace(template_position, arraysize(kTemplateParameter) - 1, |
| 1092 kSearchTermParameter); | 1117 kSearchTermParameter); |
| 1093 | 1118 |
| 1094 // TemplateURLService ends up owning the TemplateURL, don't try and free | 1119 // TemplateURLService ends up owning the TemplateURL, don't try and free |
| 1095 // it. | 1120 // it. |
| 1096 TemplateURLData data; | 1121 TemplateURLData data; |
| 1097 data.short_name = UTF8ToUTF16(initializers[i].content); | 1122 data.short_name = UTF8ToUTF16(initializers[i].content); |
| 1098 data.SetKeyword(UTF8ToUTF16(initializers[i].keyword)); | 1123 data.SetKeyword(UTF8ToUTF16(initializers[i].keyword)); |
| 1099 data.SetURL(osd_url); | 1124 data.SetURL(osd_url); |
| 1100 AddNoNotify(new TemplateURL(data)); | 1125 AddNoNotify(new TemplateURL(data), true); |
| 1101 } | 1126 } |
| 1102 } | 1127 } |
| 1103 | 1128 |
| 1104 // Initialize default search. | 1129 // Initialize default search. |
| 1105 UpdateDefaultSearch(); | 1130 UpdateDefaultSearch(); |
| 1106 | 1131 |
| 1107 // Request a server check for the correct Google URL if Google is the | 1132 // Request a server check for the correct Google URL if Google is the |
| 1108 // default search engine, not in headless mode and not in Chrome Frame. | 1133 // default search engine, not in headless mode and not in Chrome Frame. |
| 1109 if (initial_default_search_provider_.get() && | 1134 if (initial_default_search_provider_.get() && |
| 1110 initial_default_search_provider_->url_ref().HasGoogleBaseURLs()) { | 1135 initial_default_search_provider_->url_ref().HasGoogleBaseURLs()) { |
| 1111 scoped_ptr<base::Environment> env(base::Environment::Create()); | 1136 scoped_ptr<base::Environment> env(base::Environment::Create()); |
| 1112 if (!env->HasVar(env_vars::kHeadless) && | 1137 if (!env->HasVar(env_vars::kHeadless) && |
| 1113 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) | 1138 !CommandLine::ForCurrentProcess()->HasSwitch(switches::kChromeFrame)) |
| 1114 GoogleURLTracker::RequestServerCheck(); | 1139 GoogleURLTracker::RequestServerCheck(); |
| 1115 } | 1140 } |
| 1116 } | 1141 } |
| 1117 | 1142 |
| 1118 void TemplateURLService::RemoveFromMaps(const TemplateURL* template_url) { | 1143 void TemplateURLService::RemoveFromMaps(const TemplateURL* template_url) { |
| 1119 if (!template_url->keyword().empty()) | 1144 if (!template_url->keyword().empty()) |
| 1120 keyword_to_template_map_.erase(template_url->keyword()); | 1145 keyword_to_template_map_.erase(template_url->keyword()); |
| 1146 | |
| 1147 // If the keyword we're removing is from an extension, we're now done, since | |
| 1148 // it won't be synced or stored in the provider map. | |
| 1149 // TODO(mpcomplete): If we allow editing extension keywords, then those should | |
| 1150 // be synced. | |
| 1151 if (template_url->IsExtensionKeyword()) | |
| 1152 return; | |
| 1153 | |
| 1121 if (!template_url->sync_guid().empty()) | 1154 if (!template_url->sync_guid().empty()) |
| 1122 guid_to_template_map_.erase(template_url->sync_guid()); | 1155 guid_to_template_map_.erase(template_url->sync_guid()); |
| 1123 if (loaded_) | 1156 if (loaded_) |
| 1124 provider_map_.Remove(template_url); | 1157 provider_map_.Remove(template_url); |
| 1125 } | 1158 } |
| 1126 | 1159 |
| 1127 void TemplateURLService::RemoveFromKeywordMapByPointer( | 1160 void TemplateURLService::RemoveFromKeywordMapByPointer( |
| 1128 const TemplateURL* template_url) { | 1161 const TemplateURL* template_url) { |
| 1129 DCHECK(template_url); | 1162 DCHECK(template_url); |
| 1130 for (KeywordToTemplateMap::iterator i = keyword_to_template_map_.begin(); | 1163 for (KeywordToTemplateMap::iterator i = keyword_to_template_map_.begin(); |
| 1131 i != keyword_to_template_map_.end(); ++i) { | 1164 i != keyword_to_template_map_.end(); ++i) { |
| 1132 if (i->second == template_url) { | 1165 if (i->second == template_url) { |
| 1133 keyword_to_template_map_.erase(i); | 1166 keyword_to_template_map_.erase(i); |
| 1134 // A given TemplateURL only occurs once in the map. As soon as we find the | 1167 // A given TemplateURL only occurs once in the map. As soon as we find the |
| 1135 // entry, stop. | 1168 // entry, stop. |
| 1136 break; | 1169 break; |
| 1137 } | 1170 } |
| 1138 } | 1171 } |
| 1139 } | 1172 } |
| 1140 | 1173 |
| 1141 void TemplateURLService::AddToMaps(const TemplateURL* template_url) { | 1174 void TemplateURLService::AddToMaps(const TemplateURL* template_url) { |
| 1142 if (!template_url->keyword().empty()) | 1175 if (!template_url->keyword().empty()) |
| 1143 keyword_to_template_map_[template_url->keyword()] = template_url; | 1176 keyword_to_template_map_[template_url->keyword()] = template_url; |
| 1177 | |
| 1178 // Extension keywords are not synced, so they don't go into the GUID map, | |
| 1179 // and do not use host-based search URLs, so they don't go into the provider | |
| 1180 // map, so at this point we're done. | |
| 1181 // TODO(mpcomplete): If we allow editing extension keywords, then those should | |
| 1182 // be persisted to disk and synced. | |
| 1183 if (template_url->IsExtensionKeyword()) | |
| 1184 return; | |
| 1185 | |
| 1144 if (!template_url->sync_guid().empty()) | 1186 if (!template_url->sync_guid().empty()) |
| 1145 guid_to_template_map_[template_url->sync_guid()] = template_url; | 1187 guid_to_template_map_[template_url->sync_guid()] = template_url; |
| 1146 if (loaded_) { | 1188 if (loaded_) { |
| 1147 UIThreadSearchTermsData search_terms_data; | 1189 UIThreadSearchTermsData search_terms_data; |
| 1148 provider_map_.Add(template_url, search_terms_data); | 1190 provider_map_.Add(template_url, search_terms_data); |
| 1149 } | 1191 } |
| 1150 } | 1192 } |
| 1151 | 1193 |
| 1152 void TemplateURLService::SetTemplateURLs( | 1194 void TemplateURLService::SetTemplateURLs( |
| 1153 const std::vector<TemplateURL*>& urls) { | 1195 const std::vector<TemplateURL*>& urls) { |
| 1154 // Add mappings for the new items. | 1196 // Add mappings for the new items. |
| 1155 | 1197 |
| 1156 // First, add the items that already have id's, so that the next_id_ | 1198 // First, add the items that already have id's, so that the next_id_ |
| 1157 // gets properly set. | 1199 // gets properly set. |
| 1158 for (std::vector<TemplateURL*>::const_iterator i = urls.begin(); | 1200 for (std::vector<TemplateURL*>::const_iterator i = urls.begin(); |
| 1159 i != urls.end(); | 1201 i != urls.end(); ++i) { |
| 1160 ++i) { | |
| 1161 if ((*i)->id() != kInvalidTemplateURLID) { | 1202 if ((*i)->id() != kInvalidTemplateURLID) { |
| 1162 next_id_ = std::max(next_id_, (*i)->id()); | 1203 next_id_ = std::max(next_id_, (*i)->id()); |
| 1163 AddToMaps(*i); | 1204 AddNoNotify(*i, false); |
|
Peter Kasting
2012/04/10 01:24:33
I changed this call because in the future I need t
| |
| 1164 template_urls_.push_back(*i); | |
| 1165 } | 1205 } |
| 1166 } | 1206 } |
| 1167 | 1207 |
| 1168 // Next add the new items that don't have id's. | 1208 // Next add the new items that don't have id's. |
| 1169 for (std::vector<TemplateURL*>::const_iterator i = urls.begin(); | 1209 for (std::vector<TemplateURL*>::const_iterator i = urls.begin(); |
| 1170 i != urls.end(); | 1210 i != urls.end(); ++i) { |
| 1171 ++i) { | |
| 1172 if ((*i)->id() == kInvalidTemplateURLID) | 1211 if ((*i)->id() == kInvalidTemplateURLID) |
| 1173 AddNoNotify(*i); | 1212 AddNoNotify(*i, true); |
| 1174 } | 1213 } |
| 1175 } | 1214 } |
| 1176 | 1215 |
| 1177 void TemplateURLService::ChangeToLoadedState() { | 1216 void TemplateURLService::ChangeToLoadedState() { |
| 1178 DCHECK(!loaded_); | 1217 DCHECK(!loaded_); |
| 1179 | 1218 |
| 1180 UIThreadSearchTermsData search_terms_data; | 1219 UIThreadSearchTermsData search_terms_data; |
| 1181 provider_map_.Init(template_urls_, search_terms_data); | 1220 provider_map_.Init(template_urls_, search_terms_data); |
| 1182 loaded_ = true; | 1221 loaded_ = true; |
| 1183 } | 1222 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1208 std::string search_url; | 1247 std::string search_url; |
| 1209 std::string suggest_url; | 1248 std::string suggest_url; |
| 1210 std::string instant_url; | 1249 std::string instant_url; |
| 1211 std::string icon_url; | 1250 std::string icon_url; |
| 1212 std::string encodings; | 1251 std::string encodings; |
| 1213 std::string short_name; | 1252 std::string short_name; |
| 1214 std::string keyword; | 1253 std::string keyword; |
| 1215 std::string id_string; | 1254 std::string id_string; |
| 1216 std::string prepopulate_id; | 1255 std::string prepopulate_id; |
| 1217 if (t_url) { | 1256 if (t_url) { |
| 1257 DCHECK(!t_url->IsExtensionKeyword()); | |
| 1218 enabled = true; | 1258 enabled = true; |
| 1219 search_url = t_url->url(); | 1259 search_url = t_url->url(); |
| 1220 suggest_url = t_url->suggestions_url(); | 1260 suggest_url = t_url->suggestions_url(); |
| 1221 instant_url = t_url->instant_url(); | 1261 instant_url = t_url->instant_url(); |
| 1222 GURL icon_gurl = t_url->favicon_url(); | 1262 GURL icon_gurl = t_url->favicon_url(); |
| 1223 if (!icon_gurl.is_empty()) | 1263 if (!icon_gurl.is_empty()) |
| 1224 icon_url = icon_gurl.spec(); | 1264 icon_url = icon_gurl.spec(); |
| 1225 encodings = JoinString(t_url->input_encodings(), ';'); | 1265 encodings = JoinString(t_url->input_encodings(), ';'); |
| 1226 short_name = UTF16ToUTF8(t_url->short_name()); | 1266 short_name = UTF16ToUTF8(t_url->short_name()); |
| 1227 keyword = UTF16ToUTF8(t_url->keyword()); | 1267 keyword = UTF16ToUTF8(t_url->keyword()); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1291 int64 value; | 1331 int64 value; |
| 1292 base::StringToInt64(id_string, &value); | 1332 base::StringToInt64(id_string, &value); |
| 1293 data.id = value; | 1333 data.id = value; |
| 1294 } | 1334 } |
| 1295 if (!prepopulate_id.empty() && !*is_managed) { | 1335 if (!prepopulate_id.empty() && !*is_managed) { |
| 1296 int value; | 1336 int value; |
| 1297 base::StringToInt(prepopulate_id, &value); | 1337 base::StringToInt(prepopulate_id, &value); |
| 1298 data.prepopulate_id = value; | 1338 data.prepopulate_id = value; |
| 1299 } | 1339 } |
| 1300 default_provider->reset(new TemplateURL(data)); | 1340 default_provider->reset(new TemplateURL(data)); |
| 1341 DCHECK(!(*default_provider)->IsExtensionKeyword()); | |
| 1301 return true; | 1342 return true; |
| 1302 } | 1343 } |
| 1303 | 1344 |
| 1304 bool TemplateURLService::CanReplaceKeywordForHost( | 1345 bool TemplateURLService::CanReplaceKeywordForHost( |
| 1305 const std::string& host, | 1346 const std::string& host, |
| 1306 const TemplateURL** to_replace) { | 1347 const TemplateURL** to_replace) { |
| 1348 DCHECK(to_replace); | |
| 1349 DCHECK(!*to_replace); | |
| 1307 const TemplateURLSet* urls = provider_map_.GetURLsForHost(host); | 1350 const TemplateURLSet* urls = provider_map_.GetURLsForHost(host); |
| 1308 if (urls) { | 1351 if (!urls) |
| 1309 for (TemplateURLSet::const_iterator i = urls->begin(); | 1352 return true; |
| 1310 i != urls->end(); ++i) { | 1353 for (TemplateURLSet::const_iterator i(urls->begin()); i != urls->end(); ++i) { |
| 1311 const TemplateURL* url = *i; | 1354 if (CanReplace(*i)) { |
| 1312 if (CanReplace(url)) { | 1355 if (to_replace) |
| 1313 if (to_replace) | 1356 *to_replace = *i; |
| 1314 *to_replace = url; | 1357 return true; |
| 1315 return true; | |
| 1316 } | |
| 1317 } | 1358 } |
| 1318 } | 1359 } |
| 1319 | 1360 return false; |
| 1320 if (to_replace) | |
| 1321 *to_replace = NULL; | |
| 1322 return !urls; | |
| 1323 } | 1361 } |
| 1324 | 1362 |
| 1325 bool TemplateURLService::CanReplace(const TemplateURL* t_url) { | 1363 bool TemplateURLService::CanReplace(const TemplateURL* t_url) { |
| 1326 return (t_url != default_search_provider_ && !t_url->show_in_default_list() && | 1364 return (t_url != default_search_provider_ && !t_url->show_in_default_list() && |
| 1327 t_url->safe_for_autoreplace()); | 1365 t_url->safe_for_autoreplace()); |
| 1328 } | 1366 } |
| 1329 | 1367 |
| 1330 void TemplateURLService::UpdateNoNotify(const TemplateURL* existing_turl, | 1368 void TemplateURLService::UpdateNoNotify(const TemplateURL* existing_turl, |
| 1331 const TemplateURL& new_values) { | 1369 const TemplateURL& new_values) { |
| 1332 DCHECK(loaded_); | 1370 DCHECK(loaded_); |
| 1333 DCHECK(existing_turl); | 1371 DCHECK(existing_turl); |
| 1334 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), | 1372 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), |
| 1335 existing_turl) != template_urls_.end()); | 1373 existing_turl) != template_urls_.end()); |
| 1336 | 1374 |
| 1337 if (!existing_turl->keyword().empty()) | 1375 // TODO(mpcomplete): If we allow editing extension keywords, then those should |
| 1338 keyword_to_template_map_.erase(existing_turl->keyword()); | 1376 // be persisted to disk and synced. In this case this DCHECK should be |
| 1377 // removed. | |
| 1378 DCHECK(!existing_turl->IsExtensionKeyword()); | |
| 1379 | |
| 1380 string16 old_keyword(existing_turl->keyword()); | |
| 1381 if (!old_keyword.empty()) | |
| 1382 keyword_to_template_map_.erase(old_keyword); | |
| 1339 if (!existing_turl->sync_guid().empty()) | 1383 if (!existing_turl->sync_guid().empty()) |
| 1340 guid_to_template_map_.erase(existing_turl->sync_guid()); | 1384 guid_to_template_map_.erase(existing_turl->sync_guid()); |
| 1341 | 1385 |
| 1342 provider_map_.Remove(existing_turl); | 1386 provider_map_.Remove(existing_turl); |
| 1343 TemplateURLID previous_id = existing_turl->id(); | 1387 TemplateURLID previous_id = existing_turl->id(); |
| 1344 TemplateURL* modifiable_turl = const_cast<TemplateURL*>(existing_turl); | 1388 TemplateURL* modifiable_turl = const_cast<TemplateURL*>(existing_turl); |
| 1345 *modifiable_turl = new_values; | 1389 *modifiable_turl = new_values; |
| 1346 modifiable_turl->data_.id = previous_id; | 1390 modifiable_turl->data_.id = previous_id; |
| 1347 UIThreadSearchTermsData search_terms_data; | 1391 UIThreadSearchTermsData search_terms_data; |
| 1348 provider_map_.Add(existing_turl, search_terms_data); | 1392 provider_map_.Add(existing_turl, search_terms_data); |
| 1349 | 1393 |
| 1350 if (!existing_turl->keyword().empty()) | 1394 const string16& keyword = existing_turl->keyword(); |
| 1351 keyword_to_template_map_[existing_turl->keyword()] = existing_turl; | 1395 if (!keyword.empty()) |
| 1396 keyword_to_template_map_[keyword] = existing_turl; | |
| 1352 if (!existing_turl->sync_guid().empty()) | 1397 if (!existing_turl->sync_guid().empty()) |
| 1353 guid_to_template_map_[existing_turl->sync_guid()] = existing_turl; | 1398 guid_to_template_map_[existing_turl->sync_guid()] = existing_turl; |
| 1354 | 1399 |
| 1355 if (service_.get()) | 1400 if (service_.get()) |
| 1356 service_->UpdateKeyword(*existing_turl); | 1401 service_->UpdateKeyword(*existing_turl); |
| 1357 | 1402 |
| 1358 // Inform sync of the update. | 1403 // Inform sync of the update. |
| 1359 ProcessTemplateURLChange(existing_turl, SyncChange::ACTION_UPDATE); | 1404 ProcessTemplateURLChange(existing_turl, SyncChange::ACTION_UPDATE); |
| 1360 | 1405 |
| 1361 if (default_search_provider_ == existing_turl) | 1406 if (default_search_provider_ == existing_turl) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1407 built_terms = true; | 1452 built_terms = true; |
| 1408 | 1453 |
| 1409 if (content::PageTransitionStripQualifier(details.transition) == | 1454 if (content::PageTransitionStripQualifier(details.transition) == |
| 1410 content::PAGE_TRANSITION_KEYWORD) { | 1455 content::PAGE_TRANSITION_KEYWORD) { |
| 1411 // The visit is the result of the user entering a keyword, generate a | 1456 // The visit is the result of the user entering a keyword, generate a |
| 1412 // KEYWORD_GENERATED visit for the KEYWORD so that the keyword typed | 1457 // KEYWORD_GENERATED visit for the KEYWORD so that the keyword typed |
| 1413 // count is boosted. | 1458 // count is boosted. |
| 1414 AddTabToSearchVisit(**i); | 1459 AddTabToSearchVisit(**i); |
| 1415 } | 1460 } |
| 1416 | 1461 |
| 1417 QueryTerms::iterator terms_iterator = | 1462 QueryTerms::iterator j(query_terms.find(search_ref.GetSearchTermKey())); |
| 1418 query_terms.find(search_ref.GetSearchTermKey()); | 1463 if (j != query_terms.end() && !j->second.empty()) { |
| 1419 if (terms_iterator != query_terms.end() && | |
| 1420 !terms_iterator->second.empty()) { | |
| 1421 SetKeywordSearchTermsForURL(*i, row.url(), | 1464 SetKeywordSearchTermsForURL(*i, row.url(), |
| 1422 search_ref.SearchTermToString16(terms_iterator->second)); | 1465 search_ref.SearchTermToString16(j->second)); |
| 1423 } | 1466 } |
| 1424 } | 1467 } |
| 1425 } | 1468 } |
| 1426 } | 1469 } |
| 1427 | 1470 |
| 1428 void TemplateURLService::AddTabToSearchVisit(const TemplateURL& t_url) { | 1471 void TemplateURLService::AddTabToSearchVisit(const TemplateURL& t_url) { |
| 1429 // Only add visits for entries the user hasn't modified. If the user modified | 1472 // Only add visits for entries the user hasn't modified. If the user modified |
| 1430 // the entry the keyword may no longer correspond to the host name. It may be | 1473 // the entry the keyword may no longer correspond to the host name. It may be |
| 1431 // possible to do something more sophisticated here, but it's so rare as to | 1474 // possible to do something more sophisticated here, but it's so rare as to |
| 1432 // not be worth it. | 1475 // not be worth it. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1480 valid_term_count++; | 1523 valid_term_count++; |
| 1481 (*query_terms)[key_string] = value_string; | 1524 (*query_terms)[key_string] = value_string; |
| 1482 } | 1525 } |
| 1483 } | 1526 } |
| 1484 } | 1527 } |
| 1485 return (valid_term_count > 0); | 1528 return (valid_term_count > 0); |
| 1486 } | 1529 } |
| 1487 | 1530 |
| 1488 void TemplateURLService::GoogleBaseURLChanged() { | 1531 void TemplateURLService::GoogleBaseURLChanged() { |
| 1489 bool something_changed = false; | 1532 bool something_changed = false; |
| 1490 for (size_t i = 0; i < template_urls_.size(); ++i) { | 1533 for (TemplateURLVector::iterator i(template_urls_.begin()); |
| 1491 const TemplateURL* t_url = template_urls_[i]; | 1534 i != template_urls_.end(); ++i) { |
| 1535 TemplateURL* t_url = const_cast<TemplateURL*>(*i); | |
| 1492 if (t_url->url_ref().HasGoogleBaseURLs() || | 1536 if (t_url->url_ref().HasGoogleBaseURLs() || |
| 1493 t_url->suggestions_url_ref().HasGoogleBaseURLs()) { | 1537 t_url->suggestions_url_ref().HasGoogleBaseURLs()) { |
| 1538 something_changed = true; | |
| 1539 string16 original_keyword(t_url->keyword()); | |
| 1540 t_url->InvalidateCachedValues(); | |
| 1541 const string16& new_keyword(t_url->keyword()); | |
| 1494 RemoveFromKeywordMapByPointer(t_url); | 1542 RemoveFromKeywordMapByPointer(t_url); |
| 1495 t_url->InvalidateCachedValues(); | 1543 if (!new_keyword.empty()) |
| 1496 if (!t_url->keyword().empty()) | 1544 keyword_to_template_map_[new_keyword] = t_url; |
| 1497 keyword_to_template_map_[t_url->keyword()] = t_url; | |
| 1498 something_changed = true; | |
| 1499 } | 1545 } |
| 1500 } | 1546 } |
| 1501 | 1547 |
| 1502 if (something_changed && loaded_) { | 1548 if (something_changed && loaded_) { |
| 1503 UIThreadSearchTermsData search_terms_data; | 1549 UIThreadSearchTermsData search_terms_data; |
| 1504 provider_map_.UpdateGoogleBaseURLs(search_terms_data); | 1550 provider_map_.UpdateGoogleBaseURLs(search_terms_data); |
| 1505 NotifyObservers(); | 1551 NotifyObservers(); |
| 1506 } | 1552 } |
| 1507 } | 1553 } |
| 1508 | 1554 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1548 // invalid value. | 1594 // invalid value. |
| 1549 const TemplateURL* old_default = default_search_provider_; | 1595 const TemplateURL* old_default = default_search_provider_; |
| 1550 SetDefaultSearchProviderNoNotify(NULL); | 1596 SetDefaultSearchProviderNoNotify(NULL); |
| 1551 RemoveNoNotify(old_default); | 1597 RemoveNoNotify(old_default); |
| 1552 } else if (default_search_provider_) { | 1598 } else if (default_search_provider_) { |
| 1553 TemplateURLData data(new_default_from_prefs->data()); | 1599 TemplateURLData data(new_default_from_prefs->data()); |
| 1554 data.created_by_policy = true; | 1600 data.created_by_policy = true; |
| 1555 TemplateURL new_values(data); | 1601 TemplateURL new_values(data); |
| 1556 UpdateNoNotify(default_search_provider_, new_values); | 1602 UpdateNoNotify(default_search_provider_, new_values); |
| 1557 } else { | 1603 } else { |
| 1558 // AddNoNotify will take ownership of new_template, so it's safe to | |
| 1559 // release. | |
| 1560 TemplateURL* new_template = NULL; | 1604 TemplateURL* new_template = NULL; |
| 1561 if (new_default_from_prefs.get()) { | 1605 if (new_default_from_prefs.get()) { |
| 1562 TemplateURLData data(new_default_from_prefs->data()); | 1606 TemplateURLData data(new_default_from_prefs->data()); |
| 1563 data.created_by_policy = true; | 1607 data.created_by_policy = true; |
| 1564 new_template = new TemplateURL(data); | 1608 new_template = new TemplateURL(data); |
| 1565 AddNoNotify(new_template); | 1609 AddNoNotify(new_template, true); |
| 1566 } | 1610 } |
| 1567 SetDefaultSearchProviderNoNotify(new_template); | 1611 SetDefaultSearchProviderNoNotify(new_template); |
| 1568 } | 1612 } |
| 1569 } else if (!is_default_search_managed_ && new_is_default_managed) { | 1613 } else if (!is_default_search_managed_ && new_is_default_managed) { |
| 1570 // The default used to be unmanaged and is now managed. Add the new | 1614 // The default used to be unmanaged and is now managed. Add the new |
| 1571 // managed default to the list of URLs and set it as default. | 1615 // managed default to the list of URLs and set it as default. |
| 1572 is_default_search_managed_ = new_is_default_managed; | 1616 is_default_search_managed_ = new_is_default_managed; |
| 1573 // AddNoNotify will take ownership of new_template, so it's safe to | |
| 1574 // release. | |
| 1575 TemplateURL* new_template = NULL; | 1617 TemplateURL* new_template = NULL; |
| 1576 if (new_default_from_prefs.get()) { | 1618 if (new_default_from_prefs.get()) { |
| 1577 TemplateURLData data(new_default_from_prefs->data()); | 1619 TemplateURLData data(new_default_from_prefs->data()); |
| 1578 data.created_by_policy = true; | 1620 data.created_by_policy = true; |
| 1579 new_template = new TemplateURL(data); | 1621 new_template = new TemplateURL(data); |
| 1580 AddNoNotify(new_template); | 1622 AddNoNotify(new_template, true); |
| 1581 } | 1623 } |
| 1582 SetDefaultSearchProviderNoNotify(new_template); | 1624 SetDefaultSearchProviderNoNotify(new_template); |
| 1583 } else { | 1625 } else { |
| 1584 // The default was managed and is no longer. | 1626 // The default was managed and is no longer. |
| 1585 DCHECK(is_default_search_managed_ && !new_is_default_managed); | 1627 DCHECK(is_default_search_managed_ && !new_is_default_managed); |
| 1586 is_default_search_managed_ = new_is_default_managed; | 1628 is_default_search_managed_ = new_is_default_managed; |
| 1587 // If we had a default, delete the previous default if created by policy | 1629 // If we had a default, delete the previous default if created by policy |
| 1588 // and set a likely default. | 1630 // and set a likely default. |
| 1589 if ((default_search_provider_ != NULL) && | 1631 if ((default_search_provider_ != NULL) && |
| 1590 default_search_provider_->created_by_policy()) { | 1632 default_search_provider_->created_by_policy()) { |
| 1591 const TemplateURL* old_default = default_search_provider_; | 1633 const TemplateURL* old_default = default_search_provider_; |
| 1592 default_search_provider_ = NULL; | 1634 default_search_provider_ = NULL; |
| 1593 RemoveNoNotify(old_default); | 1635 RemoveNoNotify(old_default); |
| 1594 } | 1636 } |
| 1595 | 1637 |
| 1596 // The likely default should be from Sync if we were waiting on Sync. | 1638 // The likely default should be from Sync if we were waiting on Sync. |
| 1597 // Otherwise, it should be FindNewDefaultSearchProvider. | 1639 // Otherwise, it should be FindNewDefaultSearchProvider. |
| 1598 const TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); | 1640 const TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); |
| 1599 if (synced_default) | 1641 if (synced_default) |
| 1600 pending_synced_default_search_ = false; | 1642 pending_synced_default_search_ = false; |
| 1601 SetDefaultSearchProviderNoNotify(synced_default ? synced_default : | 1643 SetDefaultSearchProviderNoNotify(synced_default ? synced_default : |
| 1602 FindNewDefaultSearchProvider()); | 1644 FindNewDefaultSearchProvider()); |
| 1603 } | 1645 } |
| 1604 NotifyObservers(); | 1646 NotifyObservers(); |
| 1605 } | 1647 } |
| 1606 | 1648 |
| 1607 void TemplateURLService::SetDefaultSearchProviderNoNotify( | 1649 void TemplateURLService::SetDefaultSearchProviderNoNotify( |
| 1608 const TemplateURL* url) { | 1650 const TemplateURL* url) { |
| 1609 DCHECK(!url || std::find(template_urls_.begin(), template_urls_.end(), url) != | 1651 if (url) { |
| 1610 template_urls_.end()); | 1652 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), url) != |
| 1653 template_urls_.end()); | |
| 1654 // Extension keywords cannot be made default, as they're inherently async. | |
| 1655 DCHECK(!url->IsExtensionKeyword()); | |
| 1656 } | |
| 1657 | |
| 1611 default_search_provider_ = url; | 1658 default_search_provider_ = url; |
| 1612 | 1659 |
| 1613 if (url) { | 1660 if (url) { |
| 1614 TemplateURL* modifiable_url = const_cast<TemplateURL*>(url); | 1661 TemplateURL* modifiable_url = const_cast<TemplateURL*>(url); |
| 1615 // Don't mark the url as edited, otherwise we won't be able to rev the | 1662 // Don't mark the url as edited, otherwise we won't be able to rev the |
| 1616 // template urls we ship with. | 1663 // template urls we ship with. |
| 1617 modifiable_url->data_.show_in_default_list = true; | 1664 modifiable_url->data_.show_in_default_list = true; |
| 1618 if (service_.get()) | 1665 if (service_.get()) |
| 1619 service_->UpdateKeyword(*url); | 1666 service_->UpdateKeyword(*url); |
| 1620 | 1667 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1643 } | 1690 } |
| 1644 | 1691 |
| 1645 if (service_.get()) | 1692 if (service_.get()) |
| 1646 service_->SetDefaultSearchProvider(url); | 1693 service_->SetDefaultSearchProvider(url); |
| 1647 | 1694 |
| 1648 // Inform sync the change to the show_in_default_list flag. | 1695 // Inform sync the change to the show_in_default_list flag. |
| 1649 if (url) | 1696 if (url) |
| 1650 ProcessTemplateURLChange(url, SyncChange::ACTION_UPDATE); | 1697 ProcessTemplateURLChange(url, SyncChange::ACTION_UPDATE); |
| 1651 } | 1698 } |
| 1652 | 1699 |
| 1653 void TemplateURLService::AddNoNotify(TemplateURL* template_url) { | 1700 void TemplateURLService::AddNoNotify(TemplateURL* template_url, |
| 1701 bool newly_adding) { | |
| 1654 DCHECK(template_url); | 1702 DCHECK(template_url); |
| 1655 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); | 1703 |
| 1656 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), | 1704 if (newly_adding) { |
| 1657 template_url) == template_urls_.end()); | 1705 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
| 1658 template_url->data_.id = ++next_id_; | 1706 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), |
| 1707 template_url) == template_urls_.end()); | |
| 1708 template_url->data_.id = ++next_id_; | |
| 1709 } | |
| 1710 | |
| 1659 template_urls_.push_back(template_url); | 1711 template_urls_.push_back(template_url); |
| 1660 AddToMaps(template_url); | 1712 AddToMaps(template_url); |
| 1661 | 1713 |
| 1662 if (service_.get()) | 1714 if (newly_adding) { |
| 1663 service_->AddKeyword(*template_url); | 1715 // Don't persist extension keywords to disk. They'll get re-added on each |
| 1716 // launch as the extensions are loaded. | |
| 1717 // TODO(mpcomplete): If we allow editing extension keywords, then those | |
| 1718 // should be persisted to disk and synced. | |
| 1719 if (service_.get() && !template_url->IsExtensionKeyword()) | |
| 1720 service_->AddKeyword(*template_url); | |
| 1664 | 1721 |
| 1665 // Inform sync of the addition. Note that this will assign a GUID to | 1722 // Inform sync of the addition. Note that this will assign a GUID to |
| 1666 // template_url and add it to the guid_to_template_map_. | 1723 // template_url and add it to the guid_to_template_map_. |
| 1667 ProcessTemplateURLChange(template_url, SyncChange::ACTION_ADD); | 1724 ProcessTemplateURLChange(template_url, SyncChange::ACTION_ADD); |
| 1725 } | |
| 1668 } | 1726 } |
| 1669 | 1727 |
| 1670 void TemplateURLService::RemoveNoNotify(const TemplateURL* template_url) { | 1728 void TemplateURLService::RemoveNoNotify(const TemplateURL* template_url) { |
| 1671 TemplateURLVector::iterator i = | 1729 TemplateURLVector::iterator i = |
| 1672 std::find(template_urls_.begin(), template_urls_.end(), template_url); | 1730 std::find(template_urls_.begin(), template_urls_.end(), template_url); |
| 1673 if (i == template_urls_.end()) | 1731 if (i == template_urls_.end()) |
| 1674 return; | 1732 return; |
| 1675 | 1733 |
| 1676 if (template_url == default_search_provider_) { | 1734 if (template_url == default_search_provider_) { |
| 1677 // Should never delete the default search provider. | 1735 // Should never delete the default search provider. |
| 1678 NOTREACHED(); | 1736 NOTREACHED(); |
| 1679 return; | 1737 return; |
| 1680 } | 1738 } |
| 1681 | 1739 |
| 1682 RemoveFromMaps(template_url); | 1740 RemoveFromMaps(template_url); |
| 1683 | 1741 |
| 1684 // Remove it from the vector containing all TemplateURLs. | 1742 // Remove it from the vector containing all TemplateURLs. |
| 1685 template_urls_.erase(i); | 1743 template_urls_.erase(i); |
| 1686 | 1744 |
| 1687 if (service_.get()) | 1745 // Extension keywords are not persisted. |
| 1746 // TODO(mpcomplete): If we allow editing extension keywords, then those should | |
| 1747 // be persisted to disk and synced. | |
| 1748 if (service_.get() && !template_url->IsExtensionKeyword()) | |
| 1688 service_->RemoveKeyword(template_url->id()); | 1749 service_->RemoveKeyword(template_url->id()); |
| 1689 | 1750 |
| 1690 // Inform sync of the deletion. | 1751 // Inform sync of the deletion. |
| 1691 ProcessTemplateURLChange(template_url, SyncChange::ACTION_DELETE); | 1752 ProcessTemplateURLChange(template_url, SyncChange::ACTION_DELETE); |
| 1692 | 1753 |
| 1693 if (profile_) { | 1754 if (profile_) { |
| 1694 content::Source<Profile> source(profile_); | 1755 content::Source<Profile> source(profile_); |
| 1695 TemplateURLID id = template_url->id(); | 1756 TemplateURLID id = template_url->id(); |
| 1696 content::NotificationService::current()->Notify( | 1757 content::NotificationService::current()->Notify( |
| 1697 chrome::NOTIFICATION_TEMPLATE_URL_REMOVED, | 1758 chrome::NOTIFICATION_TEMPLATE_URL_REMOVED, |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1719 // This function removes from the vector and the database all the TemplateURLs | 1780 // This function removes from the vector and the database all the TemplateURLs |
| 1720 // that were set by policy, unless it is the current default search provider | 1781 // that were set by policy, unless it is the current default search provider |
| 1721 // and matches what is set by a managed preference. | 1782 // and matches what is set by a managed preference. |
| 1722 void TemplateURLService::RemoveProvidersCreatedByPolicy( | 1783 void TemplateURLService::RemoveProvidersCreatedByPolicy( |
| 1723 std::vector<TemplateURL*>* template_urls, | 1784 std::vector<TemplateURL*>* template_urls, |
| 1724 const TemplateURL** default_search_provider, | 1785 const TemplateURL** default_search_provider, |
| 1725 const TemplateURL* default_from_prefs) { | 1786 const TemplateURL* default_from_prefs) { |
| 1726 DCHECK(template_urls); | 1787 DCHECK(template_urls); |
| 1727 DCHECK(default_search_provider); | 1788 DCHECK(default_search_provider); |
| 1728 for (std::vector<TemplateURL*>::iterator i = template_urls->begin(); | 1789 for (std::vector<TemplateURL*>::iterator i = template_urls->begin(); |
| 1729 i != template_urls->end(); ) { | 1790 i != template_urls->end(); ) { |
| 1730 TemplateURL* template_url = *i; | 1791 TemplateURL* template_url = *i; |
| 1731 if (template_url->created_by_policy()) { | 1792 if (template_url->created_by_policy()) { |
| 1732 if (template_url == *default_search_provider && | 1793 if (template_url == *default_search_provider && |
| 1733 is_default_search_managed_ && | 1794 is_default_search_managed_ && |
| 1734 TemplateURLsHaveSamePrefs(template_url, | 1795 TemplateURLsHaveSamePrefs(template_url, |
| 1735 default_from_prefs)) { | 1796 default_from_prefs)) { |
| 1736 // If the database specified a default search provider that was set | 1797 // If the database specified a default search provider that was set |
| 1737 // by policy, and the default search provider from the preferences | 1798 // by policy, and the default search provider from the preferences |
| 1738 // is also set by policy and they are the same, keep the entry in the | 1799 // is also set by policy and they are the same, keep the entry in the |
| 1739 // database and the |default_search_provider|. | 1800 // database and the |default_search_provider|. |
| 1740 ++i; | 1801 ++i; |
| 1741 continue; | 1802 continue; |
| 1742 } | 1803 } |
| 1743 | 1804 |
| 1744 // The database loaded a managed |default_search_provider|, but it has | 1805 // The database loaded a managed |default_search_provider|, but it has |
| 1745 // been updated in the prefs. Remove it from the database, and update the | 1806 // been updated in the prefs. Remove it from the database, and update the |
| 1746 // |default_search_provider| pointer here. | 1807 // |default_search_provider| pointer here. |
| 1747 if (*default_search_provider && | 1808 if (*default_search_provider && |
| 1748 (*default_search_provider)->id() == template_url->id()) | 1809 (*default_search_provider)->id() == template_url->id()) |
| 1749 *default_search_provider = NULL; | 1810 *default_search_provider = NULL; |
| 1750 | 1811 |
| 1751 i = template_urls->erase(i); | 1812 i = template_urls->erase(i); |
| 1752 if (service_.get()) | 1813 // Extension keywords are not persisted. |
| 1814 // TODO(mpcomplete): If we allow editing extension keywords, then those | |
| 1815 // should be persisted to disk and synced. | |
| 1816 if (service_.get() && !template_url->IsExtensionKeyword()) | |
| 1753 service_->RemoveKeyword(template_url->id()); | 1817 service_->RemoveKeyword(template_url->id()); |
| 1754 delete template_url; | 1818 delete template_url; |
| 1755 } else { | 1819 } else { |
| 1756 ++i; | 1820 ++i; |
| 1757 } | 1821 } |
| 1758 } | 1822 } |
| 1759 } | 1823 } |
| 1760 | 1824 |
| 1761 void TemplateURLService::ResetTemplateURLGUID(const TemplateURL* url, | 1825 void TemplateURLService::ResetTemplateURLGUID(const TemplateURL* url, |
| 1762 const std::string& guid) { | 1826 const std::string& guid) { |
| 1763 DCHECK(!guid.empty()); | 1827 DCHECK(!guid.empty()); |
| 1764 | 1828 |
| 1765 TemplateURLData data(url->data()); | 1829 TemplateURLData data(url->data()); |
| 1766 data.sync_guid = guid; | 1830 data.sync_guid = guid; |
| 1767 TemplateURL new_url(data); | 1831 TemplateURL new_url(data); |
| 1768 UpdateNoNotify(url, new_url); | 1832 UpdateNoNotify(url, new_url); |
| 1769 } | 1833 } |
| 1770 | 1834 |
| 1771 string16 TemplateURLService::UniquifyKeyword(const TemplateURL& turl) const { | 1835 string16 TemplateURLService::UniquifyKeyword(const TemplateURL& turl) const { |
| 1772 // Already unique. | 1836 // Already unique. |
| 1773 if (!GetTemplateURLForKeyword(turl.keyword())) | 1837 if (!GetTemplateURLForKeyword(turl.keyword())) |
| 1774 return turl.keyword(); | 1838 return turl.keyword(); |
| 1775 | 1839 |
| 1776 // First, try to return the generated keyword for the TemplateURL. | 1840 // First, try to return the generated keyword for the TemplateURL. |
| 1777 GURL gurl(turl.url()); | 1841 GURL gurl(turl.url()); |
| 1778 string16 keyword_candidate = GenerateKeyword(gurl, true); | 1842 if (gurl.is_valid()) { |
| 1779 if (!GetTemplateURLForKeyword(keyword_candidate) && | 1843 string16 keyword_candidate = GenerateKeyword(gurl, true); |
| 1780 !keyword_candidate.empty()) { | 1844 if (!GetTemplateURLForKeyword(keyword_candidate) && |
| 1781 return keyword_candidate; | 1845 !keyword_candidate.empty()) |
| 1846 return keyword_candidate; | |
| 1782 } | 1847 } |
| 1783 | 1848 |
| 1784 // We try to uniquify the keyword by appending a special character to the end. | 1849 // We try to uniquify the keyword by appending a special character to the end. |
| 1785 // This is a best-effort approach where we try to preserve the original | 1850 // This is a best-effort approach where we try to preserve the original |
| 1786 // keyword and let the user do what they will after our attempt. | 1851 // keyword and let the user do what they will after our attempt. |
| 1787 keyword_candidate = turl.keyword(); | 1852 string16 keyword_candidate(turl.keyword()); |
| 1788 do { | 1853 do { |
| 1789 keyword_candidate.append(ASCIIToUTF16("_")); | 1854 keyword_candidate.append(ASCIIToUTF16("_")); |
| 1790 } while (GetTemplateURLForKeyword(keyword_candidate)); | 1855 } while (GetTemplateURLForKeyword(keyword_candidate)); |
| 1791 | 1856 |
| 1792 return keyword_candidate; | 1857 return keyword_candidate; |
| 1793 } | 1858 } |
| 1794 | 1859 |
| 1795 bool TemplateURLService::ResolveSyncKeywordConflict( | 1860 bool TemplateURLService::ResolveSyncKeywordConflict( |
| 1796 TemplateURL* sync_turl, | 1861 TemplateURL* sync_turl, |
| 1797 SyncChangeList* change_list) { | 1862 SyncChangeList* change_list) { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1821 UpdateNoNotify(existing_turl, new_turl); | 1886 UpdateNoNotify(existing_turl, new_turl); |
| 1822 NotifyObservers(); | 1887 NotifyObservers(); |
| 1823 } | 1888 } |
| 1824 return true; | 1889 return true; |
| 1825 } | 1890 } |
| 1826 | 1891 |
| 1827 const TemplateURL* TemplateURLService::FindDuplicateOfSyncTemplateURL( | 1892 const TemplateURL* TemplateURLService::FindDuplicateOfSyncTemplateURL( |
| 1828 const TemplateURL& sync_turl) { | 1893 const TemplateURL& sync_turl) { |
| 1829 const TemplateURL* existing_turl = | 1894 const TemplateURL* existing_turl = |
| 1830 GetTemplateURLForKeyword(sync_turl.keyword()); | 1895 GetTemplateURLForKeyword(sync_turl.keyword()); |
| 1831 if (!existing_turl) | 1896 return existing_turl && !existing_turl->url().empty() && |
| 1832 return NULL; | 1897 (existing_turl->url() == sync_turl.url()) ? existing_turl : NULL; |
| 1833 | |
| 1834 if (!existing_turl->url().empty() && | |
| 1835 existing_turl->url() == sync_turl.url()) { | |
| 1836 return existing_turl; | |
| 1837 } | |
| 1838 return NULL; | |
| 1839 } | 1898 } |
| 1840 | 1899 |
| 1841 void TemplateURLService::MergeSyncAndLocalURLDuplicates( | 1900 void TemplateURLService::MergeSyncAndLocalURLDuplicates( |
| 1842 TemplateURL* sync_turl, | 1901 TemplateURL* sync_turl, |
| 1843 TemplateURL* local_turl, | 1902 TemplateURL* local_turl, |
| 1844 SyncChangeList* change_list) { | 1903 SyncChangeList* change_list) { |
| 1845 DCHECK(sync_turl); | 1904 DCHECK(sync_turl); |
| 1846 DCHECK(local_turl); | 1905 DCHECK(local_turl); |
| 1847 DCHECK(change_list); | 1906 DCHECK(change_list); |
| 1848 scoped_ptr<TemplateURL> scoped_sync_turl(sync_turl); | 1907 scoped_ptr<TemplateURL> scoped_sync_turl(sync_turl); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1902 prefs->GetString(prefs::kSyncedDefaultSearchProviderGUID)); | 1961 prefs->GetString(prefs::kSyncedDefaultSearchProviderGUID)); |
| 1903 } | 1962 } |
| 1904 | 1963 |
| 1905 void TemplateURLService::PatchMissingSyncGUIDs( | 1964 void TemplateURLService::PatchMissingSyncGUIDs( |
| 1906 std::vector<TemplateURL*>* template_urls) { | 1965 std::vector<TemplateURL*>* template_urls) { |
| 1907 DCHECK(template_urls); | 1966 DCHECK(template_urls); |
| 1908 for (std::vector<TemplateURL*>::iterator i = template_urls->begin(); | 1967 for (std::vector<TemplateURL*>::iterator i = template_urls->begin(); |
| 1909 i != template_urls->end(); ++i) { | 1968 i != template_urls->end(); ++i) { |
| 1910 TemplateURL* template_url = *i; | 1969 TemplateURL* template_url = *i; |
| 1911 DCHECK(template_url); | 1970 DCHECK(template_url); |
| 1912 if (template_url->sync_guid().empty()) { | 1971 // Extension keywords are never synced. |
| 1972 // TODO(mpcomplete): If we allow editing extension keywords, then those | |
| 1973 // should be persisted to disk and synced. | |
| 1974 if (template_url->sync_guid().empty() && | |
| 1975 !template_url->IsExtensionKeyword()) { | |
| 1913 template_url->data_.sync_guid = guid::GenerateGUID(); | 1976 template_url->data_.sync_guid = guid::GenerateGUID(); |
| 1914 if (service_.get()) | 1977 if (service_.get()) |
| 1915 service_->UpdateKeyword(*template_url); | 1978 service_->UpdateKeyword(*template_url); |
| 1916 } | 1979 } |
| 1917 } | 1980 } |
| 1918 } | 1981 } |
| OLD | NEW |