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

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

Issue 12386019: Instant: Use only one hidden WebContents per profile. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 9 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_page.h" 5 #include "chrome/browser/instant/instant_page.h"
6 6
7 #include "base/utf_string_conversions.h" 7 #include "chrome/browser/instant/instant_service.h"
8 #include "chrome/common/render_messages.h" 8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/common/instant_messages.h"
10 #include "content/public/browser/render_process_host.h"
9 #include "content/public/browser/web_contents.h" 11 #include "content/public/browser/web_contents.h"
10 #include "ui/base/resource/resource_bundle.h"
11 #include "ui/gfx/font.h"
12 12
13 InstantPage::Delegate::~Delegate() { 13 InstantPage::Delegate::~Delegate() {
14 } 14 }
15 15
16 InstantPage::InstantPage(Delegate* delegate, InstantService* service)
17 : delegate_(delegate),
18 service_(service),
19 routing_id_(MSG_ROUTING_NONE),
20 supports_instant_(false),
21 navigated_after_change_(false) {
22 }
23
16 InstantPage::~InstantPage() { 24 InstantPage::~InstantPage() {
17 } 25 }
18 26
19 void InstantPage::Update(const string16& text,
20 size_t selection_start,
21 size_t selection_end,
22 bool verbatim) {
23 Send(new ChromeViewMsg_SearchBoxChange(routing_id(), text, verbatim,
24 selection_start, selection_end));
25 }
26
27 void InstantPage::Submit(const string16& text) {
28 Send(new ChromeViewMsg_SearchBoxSubmit(routing_id(), text));
29 }
30
31 void InstantPage::Cancel(const string16& text) {
32 Send(new ChromeViewMsg_SearchBoxCancel(routing_id(), text));
33 }
34
35 void InstantPage::SetPopupBounds(const gfx::Rect& bounds) {
36 Send(new ChromeViewMsg_SearchBoxPopupResize(routing_id(), bounds));
37 }
38
39 void InstantPage::SetOmniboxBounds(const gfx::Rect& bounds) {
40 Send(new ChromeViewMsg_SearchBoxMarginChange(
41 routing_id(), bounds.x(), bounds.width()));
42 }
43
44 void InstantPage::InitializeFonts() {
45 // TODO(sail) Remove this once the Mac omnibox font size is updated.
46 #if defined(OS_MACOSX)
47 ui::ResourceBundle::FontStyle font_style = ui::ResourceBundle::BaseFont;
48 #else
49 ui::ResourceBundle::FontStyle font_style = ui::ResourceBundle::MediumFont;
50 #endif
51 const gfx::Font& omnibox_font =
52 ui::ResourceBundle::GetSharedInstance().GetFont(font_style);
53 string16 omnibox_font_name = UTF8ToUTF16(omnibox_font.GetFontName());
54 size_t omnibox_font_size = omnibox_font.GetFontSize();
55 Send(new ChromeViewMsg_SearchBoxFontInformation(
56 routing_id(), omnibox_font_name, omnibox_font_size));
57 }
58
59 void InstantPage::GrantChromeSearchAccessFromOrigin(const GURL& origin_url) {
60 DCHECK(origin_url.is_valid());
61 Send(new ChromeViewMsg_SearchBoxGrantChromeSearchAccessFromOrigin(
62 routing_id(), origin_url));
63 }
64
65 void InstantPage::DetermineIfPageSupportsInstant() {
66 Send(new ChromeViewMsg_DetermineIfPageSupportsInstant(routing_id()));
67 }
68
69 void InstantPage::SendAutocompleteResults(
70 const std::vector<InstantAutocompleteResult>& results) {
71 Send(new ChromeViewMsg_SearchBoxAutocompleteResults(routing_id(), results));
72 }
73
74 void InstantPage::UpOrDownKeyPressed(int count) {
75 Send(new ChromeViewMsg_SearchBoxUpOrDownKeyPressed(routing_id(), count));
76 }
77
78 void InstantPage::CancelSelection(const string16& user_text) {
79 Send(new ChromeViewMsg_SearchBoxCancelSelection(routing_id(), user_text));
80 }
81
82 void InstantPage::SendThemeBackgroundInfo(
83 const ThemeBackgroundInfo& theme_info) {
84 Send(new ChromeViewMsg_SearchBoxThemeChanged(routing_id(), theme_info));
85 }
86
87 void InstantPage::SetDisplayInstantResults(bool display_instant_results) {
88 Send(new ChromeViewMsg_SearchBoxSetDisplayInstantResults(
89 routing_id(), display_instant_results));
90 }
91
92 void InstantPage::KeyCaptureChanged(bool is_key_capture_enabled) {
93 Send(new ChromeViewMsg_SearchBoxKeyCaptureChanged(
94 routing_id(), is_key_capture_enabled));
95 }
96
97 void InstantPage::SendMostVisitedItems(
98 const std::vector<MostVisitedItem>& items) {
99 Send(new ChromeViewMsg_InstantMostVisitedItemsChanged(routing_id(), items));
100 }
101
102 InstantPage::InstantPage(Delegate* delegate)
103 : delegate_(delegate),
104 supports_instant_(false) {
105 }
106
107 void InstantPage::SetContents(content::WebContents* contents) { 27 void InstantPage::SetContents(content::WebContents* contents) {
108 Observe(contents); 28 Observe(contents);
109 } 29 }
110 30
111 bool InstantPage::ShouldProcessRenderViewCreated() { 31 void InstantPage::DetermineInstantSupport() {
112 return false; 32 SendMessage(scoped_ptr<IPC::Message>(
113 } 33 new ChromeViewMsg_SearchBoxDetermineInstantSupport(routing_id())));
114 34 }
115 bool InstantPage::ShouldProcessRenderViewGone() { 35
116 return false; 36 void InstantPage::Change(const string16& query,
117 } 37 bool verbatim,
118 38 size_t selection_start,
119 bool InstantPage::ShouldProcessAboutToNavigateMainFrame() { 39 size_t selection_end) {
120 return false; 40 navigated_after_change_ = false;
121 } 41 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxChange(
122 42 routing_id(), query, verbatim, selection_start, selection_end)));
123 bool InstantPage::ShouldProcessSetSuggestions() { 43 }
124 return false; 44
125 } 45 void InstantPage::Submit(const string16& query) {
126 46 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxSubmit(
127 bool InstantPage::ShouldProcessShowInstantOverlay() { 47 routing_id(), query)));
128 return false; 48 }
129 } 49
130 50 void InstantPage::AutocompleteResults(
131 bool InstantPage::ShouldProcessFocusOmnibox() { 51 const std::vector<InstantAutocompleteResult>& results) {
132 return false; 52 SendMessage(scoped_ptr<IPC::Message>(
133 } 53 new ChromeViewMsg_SearchBoxAutocompleteResults(routing_id(), results)));
134 54 }
135 bool InstantPage::ShouldProcessStartCapturingKeyStrokes() { 55
136 return false; 56 void InstantPage::Select(int count) {
137 } 57 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxSelect(
138 58 routing_id(), count)));
139 bool InstantPage::ShouldProcessStopCapturingKeyStrokes() { 59 }
140 return false; 60
141 } 61 void InstantPage::Cancel(const string16& query) {
142 62 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxCancel(
143 bool InstantPage::ShouldProcessNavigateToURL() { 63 routing_id(), query)));
144 return false; 64 }
145 } 65
146 66 void InstantPage::Blur(const string16& query) {
147 void InstantPage::RenderViewCreated(content::RenderViewHost* render_view_host) { 67 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxBlur(
148 if (ShouldProcessRenderViewCreated()) 68 routing_id(), query)));
149 delegate_->InstantPageRenderViewCreated(contents()); 69 }
70
71 void InstantPage::PopupBounds(const gfx::Rect& bounds) {
72 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxPopupBounds(
73 routing_id(), bounds)));
74 }
75
76 void InstantPage::OmniboxBounds(const gfx::Rect& bounds) {
77 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxOmniboxBounds(
78 routing_id(), bounds)));
79 }
80
81 void InstantPage::KeyCaptureChanged(bool is_key_capture_enabled) {
82 SendMessage(scoped_ptr<IPC::Message>(
83 new ChromeViewMsg_SearchBoxKeyCaptureChanged(routing_id(),
84 is_key_capture_enabled)));
85 }
86
87 void InstantPage::DisplayInstantResults(bool display_instant_results) {
88 SendMessage(scoped_ptr<IPC::Message>(
89 new ChromeViewMsg_SearchBoxDisplayInstantResults(
90 routing_id(), display_instant_results)));
91 }
92
93 void InstantPage::ThemeChanged(const ThemeBackgroundInfo& theme_info) {
94 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxThemeChanged(
95 routing_id(), theme_info)));
96 }
97
98 void InstantPage::FontChanged(const string16& font_name, size_t font_size) {
99 SendMessage(scoped_ptr<IPC::Message>(new ChromeViewMsg_SearchBoxFontChanged(
100 routing_id(), font_name, font_size)));
101 }
102
103 void InstantPage::MostVisitedItems(const std::vector<MostVisitedItem>& items) {
104 SendMessage(scoped_ptr<IPC::Message>(
105 new ChromeViewMsg_SearchBoxMostVisitedItems(routing_id(), items)));
106 }
107
108 void InstantPage::GrantChromeSearchAccessFromOrigin(const GURL& origin_url) {
109 SendMessage(scoped_ptr<IPC::Message>(
110 new ChromeViewMsg_SearchBoxGrantChromeSearchAccessFromOrigin(
111 routing_id(), origin_url)));
112 }
113
114 void InstantPage::RenderViewGone(base::TerminationStatus /* status */) {
115 delegate_->RenderViewGone(contents());
116 }
117
118 void InstantPage::DidNavigateMainFrame(
119 const content::LoadCommittedDetails& /* details */,
120 const content::FrameNavigateParams& /* params */) {
121 navigated_after_change_ = true;
122 if (routing_id_ != routing_id()) {
123 routing_id_ = routing_id();
124 delegate_->InitSearchBox(contents());
125 }
150 } 126 }
151 127
152 void InstantPage::DidFinishLoad( 128 void InstantPage::DidFinishLoad(
153 int64 /* frame_id */, 129 int64 /* frame_id */,
154 const GURL& /* validated_url */, 130 const GURL& /* validated_url */,
155 bool is_main_frame, 131 bool is_main_frame,
156 content::RenderViewHost* /* render_view_host */) { 132 content::RenderViewHost* /* render_view_host */) {
157 if (is_main_frame && !supports_instant_) 133 if (is_main_frame && !supports_instant_)
158 DetermineIfPageSupportsInstant(); 134 DetermineInstantSupport();
159 } 135 }
160 136
161 bool InstantPage::OnMessageReceived(const IPC::Message& message) { 137 bool InstantPage::OnMessageReceived(const IPC::Message& message) {
162 bool handled = true; 138 bool handled = true;
163 IPC_BEGIN_MESSAGE_MAP(InstantPage, message) 139 IPC_BEGIN_MESSAGE_MAP(InstantPage, message)
164 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SetSuggestions, OnSetSuggestions) 140 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxInstantSupportDetermined,
165 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_InstantSupportDetermined,
166 OnInstantSupportDetermined) 141 OnInstantSupportDetermined)
167 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ShowInstantOverlay, 142 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxSetSuggestion,
168 OnShowInstantOverlay) 143 OnSetSuggestion)
169 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_FocusOmnibox, OnFocusOmnibox) 144 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxNavigateToURL,
170 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_StartCapturingKeyStrokes, 145 OnNavigateToURL)
171 OnStartCapturingKeyStrokes); 146 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxShowOverlay, OnShowOverlay)
172 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_StopCapturingKeyStrokes, 147 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxSetFocusState,
173 OnStopCapturingKeyStrokes); 148 OnSetFocusState)
174 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxNavigate, 149 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxDeleteMostVisitedItem,
175 OnSearchBoxNavigate); 150 OnDeleteMostVisitedItem)
176 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_InstantDeleteMostVisitedItem, 151 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_SearchBoxUndoMostVisitedItemDeletion,
177 OnDeleteMostVisitedItem); 152 OnUndoMostVisitedItemDeletion)
178 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_InstantUndoMostVisitedDeletion, 153 IPC_MESSAGE_HANDLER(
179 OnUndoMostVisitedDeletion); 154 ChromeViewHostMsg_SearchBoxUndoAllMostVisitedItemDeletions,
180 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_InstantUndoAllMostVisitedDeletions, 155 OnUndoAllMostVisitedItemDeletions)
181 OnUndoAllMostVisitedDeletions);
182 IPC_MESSAGE_UNHANDLED(handled = false) 156 IPC_MESSAGE_UNHANDLED(handled = false)
183 IPC_END_MESSAGE_MAP() 157 IPC_END_MESSAGE_MAP()
184 return handled; 158 return handled;
185 } 159 }
186 160
187 void InstantPage::RenderViewGone(base::TerminationStatus /* status */) { 161 void InstantPage::SendMessage(scoped_ptr<IPC::Message> message) {
188 if (ShouldProcessRenderViewGone()) 162 if (!contents())
189 delegate_->InstantPageRenderViewGone(contents()); 163 return;
190 } 164
191 165 content::RenderProcessHost* process = contents()->GetRenderProcessHost();
192 void InstantPage::DidCommitProvisionalLoadForFrame( 166 if (!process)
193 int64 /* frame_id */, 167 return;
194 bool is_main_frame, 168
195 const GURL& url, 169 if (service_->IsInstantProcess(process->GetID()))
196 content::PageTransition /* transition_type */, 170 Send(message.release());
197 content::RenderViewHost* /* render_view_host */) {
198 if (is_main_frame && ShouldProcessAboutToNavigateMainFrame())
199 delegate_->InstantPageAboutToNavigateMainFrame(contents(), url);
200 }
201
202 void InstantPage::OnSetSuggestions(
203 int page_id,
204 const std::vector<InstantSuggestion>& suggestions) {
205 if (contents()->IsActiveEntry(page_id)) {
206 OnInstantSupportDetermined(page_id, true);
207 if (ShouldProcessSetSuggestions())
208 delegate_->SetSuggestions(contents(), suggestions);
209 }
210 } 171 }
211 172
212 void InstantPage::OnInstantSupportDetermined(int page_id, 173 void InstantPage::OnInstantSupportDetermined(int page_id,
213 bool supports_instant) { 174 bool supports_instant) {
214 if (!contents()->IsActiveEntry(page_id) || supports_instant_) { 175 if (contents()->IsActiveEntry(page_id) && !supports_instant_) {
215 // Nothing to do if the page already supports Instant. 176 supports_instant_ = supports_instant;
216 return; 177 delegate_->InstantSupportDetermined(contents());
217 } 178 }
218 179 }
219 supports_instant_ = supports_instant; 180
220 delegate_->InstantSupportDetermined(contents(), supports_instant); 181 void InstantPage::OnSetSuggestion(int page_id,
221 182 const InstantSuggestion& suggestion) {
222 // If the page doesn't support Instant, stop listening to it. 183 if (contents()->IsActiveEntry(page_id)) {
223 if (!supports_instant) 184 OnInstantSupportDetermined(page_id, true);
224 Observe(NULL); 185 delegate_->SetSuggestion(contents(), suggestion);
225 } 186 }
226 187 }
227 void InstantPage::OnShowInstantOverlay(int page_id, 188
228 InstantShownReason reason, 189 void InstantPage::OnNavigateToURL(int page_id,
229 int height, 190 const GURL& url,
230 InstantSizeUnits units) { 191 content::PageTransition transition,
231 if (contents()->IsActiveEntry(page_id)) { 192 WindowOpenDisposition disposition) {
232 OnInstantSupportDetermined(page_id, true); 193 if (contents()->IsActiveEntry(page_id)) {
233 if (ShouldProcessShowInstantOverlay()) 194 OnInstantSupportDetermined(page_id, true);
234 delegate_->ShowInstantOverlay(contents(), reason, height, units); 195 delegate_->NavigateToURL(contents(), url, transition, disposition);
235 } 196 }
236 } 197 }
237 198
238 void InstantPage::OnFocusOmnibox(int page_id) { 199 void InstantPage::OnShowOverlay(int page_id,
239 if (contents()->IsActiveEntry(page_id)) { 200 int height,
240 OnInstantSupportDetermined(page_id, true); 201 InstantSizeUnits height_units) {
241 if (ShouldProcessFocusOmnibox()) 202 if (contents()->IsActiveEntry(page_id)) {
242 delegate_->FocusOmnibox(contents()); 203 OnInstantSupportDetermined(page_id, true);
243 } 204 delegate_->ShowOverlay(contents(), height, height_units);
244 } 205 }
245 206 }
246 void InstantPage::OnStartCapturingKeyStrokes(int page_id) { 207
247 if (contents()->IsActiveEntry(page_id)) { 208 void InstantPage::OnSetFocusState(int page_id, OmniboxFocusState focus_state) {
248 OnInstantSupportDetermined(page_id, true); 209 if (contents()->IsActiveEntry(page_id)) {
249 if (ShouldProcessStartCapturingKeyStrokes()) 210 OnInstantSupportDetermined(page_id, true);
250 delegate_->StartCapturingKeyStrokes(contents()); 211 delegate_->SetFocusState(contents(), focus_state);
251 } 212 }
252 } 213 }
253 214
254 void InstantPage::OnStopCapturingKeyStrokes(int page_id) { 215 void InstantPage::OnDeleteMostVisitedItem(int page_id, const GURL& url) {
255 if (contents()->IsActiveEntry(page_id)) { 216 if (contents()->IsActiveEntry(page_id)) {
256 OnInstantSupportDetermined(page_id, true); 217 OnInstantSupportDetermined(page_id, true);
257 if (ShouldProcessStopCapturingKeyStrokes()) 218 delegate_->DeleteMostVisitedItem(contents(), url);
258 delegate_->StopCapturingKeyStrokes(contents()); 219 }
259 } 220 }
260 } 221
261 222 void InstantPage::OnUndoMostVisitedItemDeletion(int page_id, const GURL& url) {
262 void InstantPage::OnSearchBoxNavigate(int page_id, 223 if (contents()->IsActiveEntry(page_id)) {
263 const GURL& url, 224 OnInstantSupportDetermined(page_id, true);
264 content::PageTransition transition, 225 delegate_->UndoMostVisitedItemDeletion(contents(), url);
265 WindowOpenDisposition disposition) { 226 }
266 if (contents()->IsActiveEntry(page_id)) { 227 }
267 OnInstantSupportDetermined(page_id, true); 228
268 if (ShouldProcessNavigateToURL()) 229 void InstantPage::OnUndoAllMostVisitedItemDeletions(int page_id) {
269 delegate_->NavigateToURL(contents(), url, transition, disposition); 230 if (contents()->IsActiveEntry(page_id)) {
270 } 231 OnInstantSupportDetermined(page_id, true);
271 } 232 delegate_->UndoAllMostVisitedItemDeletions(contents());
272 233 }
273 void InstantPage::OnDeleteMostVisitedItem(const GURL& url) { 234 }
274 delegate_->DeleteMostVisitedItem(url);
275 }
276
277 void InstantPage::OnUndoMostVisitedDeletion(const GURL& url) {
278 delegate_->UndoMostVisitedDeletion(url);
279 }
280
281 void InstantPage::OnUndoAllMostVisitedDeletions() {
282 delegate_->UndoAllMostVisitedDeletions();
283 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698