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

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

Issue 5697003: Fixes bug in instant where we wouldn't initially tell the page the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Update test for new API Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/instant/instant_loader.h ('k') | chrome/test/data/instant/old_api.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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_loader.h" 5 #include "chrome/browser/instant/instant_loader.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "app/l10n_util.h" 10 #include "app/l10n_util.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 // Header and value set for all loads. 51 // Header and value set for all loads.
52 const char kPreviewHeader[] = "X-Purpose:"; 52 const char kPreviewHeader[] = "X-Purpose:";
53 const char kPreviewHeaderValue[] = "preview"; 53 const char kPreviewHeaderValue[] = "preview";
54 54
55 } // namespace 55 } // namespace
56 56
57 // FrameLoadObserver is responsible for determining if the page supports 57 // FrameLoadObserver is responsible for determining if the page supports
58 // instant after it has loaded. 58 // instant after it has loaded.
59 class InstantLoader::FrameLoadObserver : public NotificationObserver { 59 class InstantLoader::FrameLoadObserver : public NotificationObserver {
60 public: 60 public:
61 FrameLoadObserver(TabContents* tab_contents, 61 FrameLoadObserver(InstantLoader* loader,
62 TabContents* tab_contents,
62 const string16& text, 63 const string16& text,
63 bool verbatim) 64 bool verbatim)
64 : tab_contents_(tab_contents), 65 : loader_(loader),
66 tab_contents_(tab_contents),
65 text_(text), 67 text_(text),
66 verbatim_(verbatim), 68 verbatim_(verbatim),
67 unique_id_(tab_contents_->controller().pending_entry()->unique_id()) { 69 unique_id_(tab_contents_->controller().pending_entry()->unique_id()) {
68 registrar_.Add(this, NotificationType::LOAD_COMPLETED_MAIN_FRAME, 70 registrar_.Add(this, NotificationType::LOAD_COMPLETED_MAIN_FRAME,
69 Source<TabContents>(tab_contents_)); 71 Source<TabContents>(tab_contents_));
70 } 72 }
71 73
72 // Sets the text to send to the page. 74 // Sets the text to send to the page.
73 void set_text(const string16& text) { text_ = text; } 75 void set_text(const string16& text) { text_ = text; }
74 76
75 // Sets whether verbatim results are obtained rather than predictive. 77 // Sets whether verbatim results are obtained rather than predictive.
76 void set_verbatim(bool verbatim) { verbatim_ = verbatim; } 78 void set_verbatim(bool verbatim) { verbatim_ = verbatim; }
77 79
78 // NotificationObserver: 80 // NotificationObserver:
79 virtual void Observe(NotificationType type, 81 virtual void Observe(NotificationType type,
80 const NotificationSource& source, 82 const NotificationSource& source,
81 const NotificationDetails& details) { 83 const NotificationDetails& details) {
82 switch (type.value) { 84 switch (type.value) {
83 case NotificationType::LOAD_COMPLETED_MAIN_FRAME: { 85 case NotificationType::LOAD_COMPLETED_MAIN_FRAME: {
84 int page_id = *(Details<int>(details).ptr()); 86 int page_id = *(Details<int>(details).ptr());
85 NavigationEntry* active_entry = 87 NavigationEntry* active_entry =
86 tab_contents_->controller().GetActiveEntry(); 88 tab_contents_->controller().GetActiveEntry();
87 if (!active_entry || active_entry->page_id() != page_id || 89 if (!active_entry || active_entry->page_id() != page_id ||
88 active_entry->unique_id() != unique_id_) { 90 active_entry->unique_id() != unique_id_) {
89 return; 91 return;
90 } 92 }
93 loader_->SendBoundsToPage(true);
91 tab_contents_->render_view_host()->DetermineIfPageSupportsInstant( 94 tab_contents_->render_view_host()->DetermineIfPageSupportsInstant(
92 text_, verbatim_); 95 text_, verbatim_);
93 break; 96 break;
94 } 97 }
95 default: 98 default:
96 NOTREACHED(); 99 NOTREACHED();
97 break; 100 break;
98 } 101 }
99 } 102 }
100 103
101 private: 104 private:
105 InstantLoader* loader_;
106
102 // The TabContents we're listening for changes on. 107 // The TabContents we're listening for changes on.
103 TabContents* tab_contents_; 108 TabContents* tab_contents_;
104 109
105 // Text to send down to the page. 110 // Text to send down to the page.
106 string16 text_; 111 string16 text_;
107 112
108 // Whether verbatim results are obtained. 113 // Whether verbatim results are obtained.
109 bool verbatim_; 114 bool verbatim_;
110 115
111 // unique_id of the NavigationEntry we're waiting on. 116 // unique_id of the NavigationEntry we're waiting on.
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 else 384 else
380 loader_->SetCompleteSuggestedText(UTF8ToUTF16(suggestions[0])); 385 loader_->SetCompleteSuggestedText(UTF8ToUTF16(suggestions[0]));
381 } 386 }
382 387
383 virtual void OnInstantSupportDetermined(int32 page_id, bool result) { 388 virtual void OnInstantSupportDetermined(int32 page_id, bool result) {
384 TabContents* source = loader_->preview_contents()->tab_contents(); 389 TabContents* source = loader_->preview_contents()->tab_contents();
385 if (!source->controller().GetActiveEntry() || 390 if (!source->controller().GetActiveEntry() ||
386 page_id != source->controller().GetActiveEntry()->page_id()) 391 page_id != source->controller().GetActiveEntry()->page_id())
387 return; 392 return;
388 393
389 if (result) { 394 if (result)
390 gfx::Rect bounds = loader_->GetOmniboxBoundsInTermsOfPreview();
391 loader_->last_omnibox_bounds_ = loader_->omnibox_bounds_;
392 loader_->PageFinishedLoading(); 395 loader_->PageFinishedLoading();
393 } else { 396 else
394 loader_->PageDoesntSupportInstant(user_typed_before_load_); 397 loader_->PageDoesntSupportInstant(user_typed_before_load_);
395 }
396 } 398 }
397 399
398 private: 400 private:
399 typedef std::vector<scoped_refptr<history::HistoryAddPageArgs> > 401 typedef std::vector<scoped_refptr<history::HistoryAddPageArgs> >
400 AddPageVector; 402 AddPageVector;
401 403
402 void CommitFromMouseReleaseIfNecessary() { 404 void CommitFromMouseReleaseIfNecessary() {
403 bool was_down = is_mouse_down_from_activate_; 405 bool was_down = is_mouse_down_from_activate_;
404 is_mouse_down_from_activate_ = false; 406 is_mouse_down_from_activate_ = false;
405 if (was_down && loader_->ShouldCommitInstantOnMouseUp()) 407 if (was_down && loader_->ShouldCommitInstantOnMouseUp())
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 // TODO(sky): having to use a replaceable url is a bit of a hack here. 555 // TODO(sky): having to use a replaceable url is a bit of a hack here.
554 GURL instant_url( 556 GURL instant_url(
555 template_url->instant_url()->ReplaceSearchTerms( 557 template_url->instant_url()->ReplaceSearchTerms(
556 *template_url, std::wstring(), -1, std::wstring())); 558 *template_url, std::wstring(), -1, std::wstring()));
557 CommandLine* cl = CommandLine::ForCurrentProcess(); 559 CommandLine* cl = CommandLine::ForCurrentProcess();
558 if (cl->HasSwitch(switches::kInstantURL)) 560 if (cl->HasSwitch(switches::kInstantURL))
559 instant_url = GURL(cl->GetSwitchValueASCII(switches::kInstantURL)); 561 instant_url = GURL(cl->GetSwitchValueASCII(switches::kInstantURL));
560 preview_contents_->controller().LoadURL( 562 preview_contents_->controller().LoadURL(
561 instant_url, GURL(), transition_type); 563 instant_url, GURL(), transition_type);
562 frame_load_observer_.reset( 564 frame_load_observer_.reset(
563 new FrameLoadObserver(preview_contents()->tab_contents(), 565 new FrameLoadObserver(this,
564 user_text_, verbatim)); 566 preview_contents()->tab_contents(),
567 user_text_,
568 verbatim));
565 } 569 }
566 } else { 570 } else {
567 DCHECK(template_url_id_ == 0); 571 DCHECK(template_url_id_ == 0);
568 frame_load_observer_.reset(NULL); 572 frame_load_observer_.reset(NULL);
569 preview_contents_->controller().LoadURL(url_, GURL(), transition_type); 573 preview_contents_->controller().LoadURL(url_, GURL(), transition_type);
570 } 574 }
571 } 575 }
572 576
573 void InstantLoader::SetOmniboxBounds(const gfx::Rect& bounds) { 577 void InstantLoader::SetOmniboxBounds(const gfx::Rect& bounds) {
574 if (omnibox_bounds_ == bounds) 578 if (omnibox_bounds_ == bounds)
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 delegate_->AddToBlacklist(this, load_details->entry->url()); 714 delegate_->AddToBlacklist(this, load_details->entry->url());
711 } 715 }
712 return; 716 return;
713 } 717 }
714 718
715 NOTREACHED() << "Got a notification we didn't register for."; 719 NOTREACHED() << "Got a notification we didn't register for.";
716 } 720 }
717 721
718 void InstantLoader::PageFinishedLoading() { 722 void InstantLoader::PageFinishedLoading() {
719 frame_load_observer_.reset(); 723 frame_load_observer_.reset();
724
725 // Send the bounds of the omnibox down now.
726 SendBoundsToPage(false);
727
720 // Wait for the user input before showing, this way the page should be up to 728 // Wait for the user input before showing, this way the page should be up to
721 // date by the time we show it. 729 // date by the time we show it.
722 } 730 }
723 731
724 // TODO(tonyg): This method only fires when the omnibox bounds change. It also 732 // TODO(tonyg): This method only fires when the omnibox bounds change. It also
725 // needs to fire when the preview bounds change (e.g. open/close info bar). 733 // needs to fire when the preview bounds change (e.g. open/close info bar).
726 gfx::Rect InstantLoader::GetOmniboxBoundsInTermsOfPreview() { 734 gfx::Rect InstantLoader::GetOmniboxBoundsInTermsOfPreview() {
727 gfx::Rect preview_bounds(delegate_->GetInstantBounds()); 735 gfx::Rect preview_bounds(delegate_->GetInstantBounds());
728 gfx::Rect intersection(omnibox_bounds_.Intersect(preview_bounds)); 736 gfx::Rect intersection(omnibox_bounds_.Intersect(preview_bounds));
729 737
(...skipping 13 matching lines...) Expand all
743 return intersection; 751 return intersection;
744 } 752 }
745 753
746 void InstantLoader::PageDoesntSupportInstant(bool needs_reload) { 754 void InstantLoader::PageDoesntSupportInstant(bool needs_reload) {
747 frame_load_observer_.reset(NULL); 755 frame_load_observer_.reset(NULL);
748 756
749 delegate_->InstantLoaderDoesntSupportInstant(this); 757 delegate_->InstantLoaderDoesntSupportInstant(this);
750 } 758 }
751 759
752 void InstantLoader::ProcessBoundsChange() { 760 void InstantLoader::ProcessBoundsChange() {
761 SendBoundsToPage(false);
762 }
763
764 void InstantLoader::SendBoundsToPage(bool force_if_waiting) {
753 if (last_omnibox_bounds_ == omnibox_bounds_) 765 if (last_omnibox_bounds_ == omnibox_bounds_)
754 return; 766 return;
755 767
756 last_omnibox_bounds_ = omnibox_bounds_;
757 if (preview_contents_.get() && is_showing_instant() && 768 if (preview_contents_.get() && is_showing_instant() &&
758 !is_waiting_for_load()) { 769 (force_if_waiting || !is_waiting_for_load())) {
770 last_omnibox_bounds_ = omnibox_bounds_;
759 preview_contents_->render_view_host()->SearchBoxResize( 771 preview_contents_->render_view_host()->SearchBoxResize(
760 GetOmniboxBoundsInTermsOfPreview()); 772 GetOmniboxBoundsInTermsOfPreview());
761 } 773 }
762 } 774 }
763 775
764 void InstantLoader::CreatePreviewContents(TabContentsWrapper* tab_contents) { 776 void InstantLoader::CreatePreviewContents(TabContentsWrapper* tab_contents) {
765 TabContents* new_contents = 777 TabContents* new_contents =
766 new TabContents( 778 new TabContents(
767 tab_contents->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL); 779 tab_contents->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL);
768 preview_contents_.reset(new TabContentsWrapper(new_contents)); 780 preview_contents_.reset(new TabContentsWrapper(new_contents));
(...skipping 25 matching lines...) Expand all
794 Source<NavigationController>(&preview_contents_->controller())); 806 Source<NavigationController>(&preview_contents_->controller()));
795 #endif 807 #endif
796 808
797 registrar_.Add( 809 registrar_.Add(
798 this, 810 this,
799 NotificationType::NAV_ENTRY_COMMITTED, 811 NotificationType::NAV_ENTRY_COMMITTED,
800 Source<NavigationController>(&preview_contents_->controller())); 812 Source<NavigationController>(&preview_contents_->controller()));
801 813
802 preview_contents_->tab_contents()->ShowContents(); 814 preview_contents_->tab_contents()->ShowContents();
803 } 815 }
OLDNEW
« no previous file with comments | « chrome/browser/instant/instant_loader.h ('k') | chrome/test/data/instant/old_api.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698