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

Side by Side Diff: chrome/browser/instant/instant_controller.cc

Issue 11233076: Fix spurious visibility events when committing Instant. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/instant/instant_controller.h" 5 #include "chrome/browser/instant/instant_controller.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/i18n/case_conversion.h" 8 #include "base/i18n/case_conversion.h"
9 #include "base/metrics/histogram.h" 9 #include "base/metrics/histogram.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 loader_->OnUpOrDownKeyPressed(count); 321 loader_->OnUpOrDownKeyPressed(count);
322 return true; 322 return true;
323 } 323 }
324 324
325 TabContents* InstantController::GetPreviewContents() const { 325 TabContents* InstantController::GetPreviewContents() const {
326 return loader_.get() ? loader_->preview_contents() : NULL; 326 return loader_.get() ? loader_->preview_contents() : NULL;
327 } 327 }
328 328
329 void InstantController::Hide() { 329 void InstantController::Hide() {
330 last_active_tab_ = NULL; 330 last_active_tab_ = NULL;
331 model_.SetDisplayState(InstantModel::NOT_READY, 0, INSTANT_SIZE_PERCENT); 331
332 // The only time when the model is not already in the desired NOT_READY state
333 // and GetPreviewContents() returns NULL is when we are in the commit path.
334 // In that case, don't change the state just yet; otherwise we may cause the
335 // preview to hide unnecessarily. Instead, the state will be set correctly
336 // after the commit is done.
337 if (GetPreviewContents())
338 model_.SetDisplayState(InstantModel::NOT_READY, 0, INSTANT_SIZE_PERCENT);
332 339
333 if (GetPreviewContents() && !last_full_text_.empty()) { 340 if (GetPreviewContents() && !last_full_text_.empty()) {
334 // Send a blank query to ask the preview to clear out old results. 341 // Send a blank query to ask the preview to clear out old results.
335 last_full_text_.clear(); 342 last_full_text_.clear();
336 last_user_text_.clear(); 343 last_user_text_.clear();
337 loader_->Update(last_full_text_, true); 344 loader_->Update(last_full_text_, true);
338 } 345 }
339 } 346 }
340 347
341 bool InstantController::IsCurrent() const { 348 bool InstantController::IsCurrent() const {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 // Add a fake history entry with a non-Instant search URL, so that search 399 // Add a fake history entry with a non-Instant search URL, so that search
393 // terms extraction (for autocomplete history matches) works. 400 // terms extraction (for autocomplete history matches) works.
394 if (HistoryService* history = HistoryServiceFactory::GetForProfile( 401 if (HistoryService* history = HistoryServiceFactory::GetForProfile(
395 preview->profile(), Profile::EXPLICIT_ACCESS)) { 402 preview->profile(), Profile::EXPLICIT_ACCESS)) {
396 history->AddPage(url_for_history_, base::Time::Now(), NULL, 0, GURL(), 403 history->AddPage(url_for_history_, base::Time::Now(), NULL, 0, GURL(),
397 history::RedirectList(), last_transition_type_, 404 history::RedirectList(), last_transition_type_,
398 history::SOURCE_BROWSED, false); 405 history::SOURCE_BROWSED, false);
399 } 406 }
400 407
401 AddPreviewUsageForHistogram(mode_, PREVIEW_COMMITTED); 408 AddPreviewUsageForHistogram(mode_, PREVIEW_COMMITTED);
402
403 // We may have gotten here from CommitInstant(), which means the loader may
404 // still be on the stack. So, schedule a destruction for later.
405 MessageLoop::current()->DeleteSoon(FROM_HERE, loader_.release());
406
407 // This call is here to reset view state. It won't actually delete |loader_|
408 // because it was just released to DeleteSoon().
409 DeleteLoader(); 409 DeleteLoader();
410 410
411 preview->web_contents()->GetController().PruneAllButActive(); 411 preview->web_contents()->GetController().PruneAllButActive();
412 412
413 if (type != INSTANT_COMMIT_PRESSED_ALT_ENTER) { 413 if (type != INSTANT_COMMIT_PRESSED_ALT_ENTER) {
414 const TabContents* active_tab = delegate_->GetActiveTabContents(); 414 const TabContents* active_tab = delegate_->GetActiveTabContents();
415 AddSessionStorageHistogram(mode_, active_tab, preview); 415 AddSessionStorageHistogram(mode_, active_tab, preview);
416 preview->web_contents()->GetController().CopyStateFromAndPrune( 416 preview->web_contents()->GetController().CopyStateFromAndPrune(
417 &active_tab->web_contents()->GetController()); 417 &active_tab->web_contents()->GetController());
418 } 418 }
419 419
420 // Delegate takes ownership of the preview. 420 // Delegate takes ownership of the preview.
421 delegate_->CommitInstant(preview, type == INSTANT_COMMIT_PRESSED_ALT_ENTER); 421 delegate_->CommitInstant(preview, type == INSTANT_COMMIT_PRESSED_ALT_ENTER);
422 422
423 content::NotificationService::current()->Notify( 423 content::NotificationService::current()->Notify(
424 chrome::NOTIFICATION_INSTANT_COMMITTED, 424 chrome::NOTIFICATION_INSTANT_COMMITTED,
425 content::Source<content::WebContents>(preview->web_contents()), 425 content::Source<content::WebContents>(preview->web_contents()),
426 content::NotificationService::NoDetails()); 426 content::NotificationService::NoDetails());
427 427
428 model_.SetDisplayState(InstantModel::NOT_READY, 0, INSTANT_SIZE_PERCENT);
429
428 // Try to create another loader immediately so that it is ready for the next 430 // Try to create another loader immediately so that it is ready for the next
429 // user interaction. 431 // user interaction.
430 CreateDefaultLoader(); 432 CreateDefaultLoader();
431 } 433 }
432 434
433 void InstantController::OnAutocompleteLostFocus( 435 void InstantController::OnAutocompleteLostFocus(
434 gfx::NativeView view_gaining_focus) { 436 gfx::NativeView view_gaining_focus) {
435 is_omnibox_focused_ = false; 437 is_omnibox_focused_ = false;
436 438
437 // If there is no preview, nothing to do. 439 // If there is no preview, nothing to do.
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 void InstantController::InstantLoaderPreviewLoaded(InstantLoader* loader) { 613 void InstantController::InstantLoaderPreviewLoaded(InstantLoader* loader) {
612 AddPreviewUsageForHistogram(mode_, PREVIEW_LOADED); 614 AddPreviewUsageForHistogram(mode_, PREVIEW_LOADED);
613 } 615 }
614 616
615 void InstantController::InstantSupportDetermined(InstantLoader* loader, 617 void InstantController::InstantSupportDetermined(InstantLoader* loader,
616 bool supports_instant) { 618 bool supports_instant) {
617 if (supports_instant) { 619 if (supports_instant) {
618 blacklisted_urls_.erase(loader->instant_url()); 620 blacklisted_urls_.erase(loader->instant_url());
619 } else { 621 } else {
620 ++blacklisted_urls_[loader->instant_url()]; 622 ++blacklisted_urls_[loader->instant_url()];
621 if (loader_ == loader) { 623 if (loader_ == loader)
622 if (GetPreviewContents())
623 AddPreviewUsageForHistogram(mode_, PREVIEW_DELETED);
624
625 // Because of the state of the stack, we can't destroy the loader now.
626 MessageLoop::current()->DeleteSoon(FROM_HERE, loader_.release());
627 DeleteLoader(); 624 DeleteLoader();
628 }
629 } 625 }
630 626
631 content::NotificationService::current()->Notify( 627 content::NotificationService::current()->Notify(
632 chrome::NOTIFICATION_INSTANT_SUPPORT_DETERMINED, 628 chrome::NOTIFICATION_INSTANT_SUPPORT_DETERMINED,
633 content::Source<InstantController>(this), 629 content::Source<InstantController>(this),
634 content::NotificationService::NoDetails()); 630 content::NotificationService::NoDetails());
635 } 631 }
636 632
637 void InstantController::SwappedTabContents(InstantLoader* loader) { 633 void InstantController::SwappedTabContents(InstantLoader* loader) {
638 if (loader_ == loader) 634 if (loader_ == loader)
(...skipping 24 matching lines...) Expand all
663 } 659 }
664 660
665 void InstantController::ResetLoader(const std::string& instant_url, 661 void InstantController::ResetLoader(const std::string& instant_url,
666 const TabContents* active_tab) { 662 const TabContents* active_tab) {
667 if (GetPreviewContents() && loader_->instant_url() != instant_url) 663 if (GetPreviewContents() && loader_->instant_url() != instant_url)
668 DeleteLoader(); 664 DeleteLoader();
669 665
670 if (!GetPreviewContents()) { 666 if (!GetPreviewContents()) {
671 loader_.reset(new InstantLoader(this, instant_url, active_tab)); 667 loader_.reset(new InstantLoader(this, instant_url, active_tab));
672 loader_->Init(); 668 loader_->Init();
669
673 // Ensure the searchbox API has the correct focus state and context. 670 // Ensure the searchbox API has the correct focus state and context.
674 if (is_omnibox_focused_) 671 if (is_omnibox_focused_)
675 loader_->OnAutocompleteGotFocus(); 672 loader_->OnAutocompleteGotFocus();
676 else 673 else
677 loader_->OnAutocompleteLostFocus(); 674 loader_->OnAutocompleteLostFocus();
678 loader_->OnActiveTabModeChanged(active_tab_is_ntp_); 675 loader_->OnActiveTabModeChanged(active_tab_is_ntp_);
676
679 AddPreviewUsageForHistogram(mode_, PREVIEW_CREATED); 677 AddPreviewUsageForHistogram(mode_, PREVIEW_CREATED);
680 678
681 // Reset the loader timer. 679 // Reset the loader timer.
682 stale_loader_timer_.Stop(); 680 stale_loader_timer_.Stop();
683 stale_loader_timer_.Start( 681 stale_loader_timer_.Start(
684 FROM_HERE, 682 FROM_HERE,
685 base::TimeDelta::FromMilliseconds(kStaleLoaderTimeoutMS), this, 683 base::TimeDelta::FromMilliseconds(kStaleLoaderTimeoutMS), this,
686 &InstantController::OnStaleLoader); 684 &InstantController::OnStaleLoader);
687 } 685 }
688 } 686 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 OnStaleLoader(); 719 OnStaleLoader();
722 } 720 }
723 721
724 void InstantController::DeleteLoader() { 722 void InstantController::DeleteLoader() {
725 last_active_tab_ = NULL; 723 last_active_tab_ = NULL;
726 last_full_text_.clear(); 724 last_full_text_.clear();
727 last_user_text_.clear(); 725 last_user_text_.clear();
728 last_verbatim_ = false; 726 last_verbatim_ = false;
729 last_suggestion_ = InstantSuggestion(); 727 last_suggestion_ = InstantSuggestion();
730 last_match_was_search_ = false; 728 last_match_was_search_ = false;
731 model_.SetDisplayState(InstantModel::NOT_READY, 0, INSTANT_SIZE_PERCENT);
732 loader_processed_last_update_ = false; 729 loader_processed_last_update_ = false;
733 last_omnibox_bounds_ = gfx::Rect(); 730 last_omnibox_bounds_ = gfx::Rect();
734 url_for_history_ = GURL(); 731 url_for_history_ = GURL();
735 if (GetPreviewContents()) 732 if (GetPreviewContents()) {
736 AddPreviewUsageForHistogram(mode_, PREVIEW_DELETED); 733 AddPreviewUsageForHistogram(mode_, PREVIEW_DELETED);
737 loader_.reset(); 734 model_.SetDisplayState(InstantModel::NOT_READY, 0, INSTANT_SIZE_PERCENT);
735 }
736 MessageLoop::current()->DeleteSoon(FROM_HERE, loader_.release());
sky 2012/10/24 03:51:16 Add comment as to why delayed delete.
sreeram 2012/10/24 16:46:45 Done.
738 } 737 }
739 738
740 void InstantController::Show(int height, InstantSizeUnits units) { 739 void InstantController::Show(int height, InstantSizeUnits units) {
741 // Call even if showing in case height changed. 740 // Call even if showing in case height changed.
742 if (!model_.is_ready()) 741 if (!model_.is_ready())
743 AddPreviewUsageForHistogram(mode_, PREVIEW_SHOWED); 742 AddPreviewUsageForHistogram(mode_, PREVIEW_SHOWED);
744 model_.SetDisplayState(InstantModel::QUERY_RESULTS, height, units); 743 model_.SetDisplayState(InstantModel::QUERY_RESULTS, height, units);
745 } 744 }
746 745
747 void InstantController::SendBoundsToPage() { 746 void InstantController::SendBoundsToPage() {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 iter->second > kMaxInstantSupportFailures) 821 iter->second > kMaxInstantSupportFailures)
823 return false; 822 return false;
824 823
825 return true; 824 return true;
826 } 825 }
827 826
828 bool InstantController::IsOutOfDate() const { 827 bool InstantController::IsOutOfDate() const {
829 return !last_active_tab_ || 828 return !last_active_tab_ ||
830 last_active_tab_ != delegate_->GetActiveTabContents(); 829 last_active_tab_ != delegate_->GetActiveTabContents();
831 } 830 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698