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

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

Issue 11824050: InstantExtended: Committed NTP (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup. Created 7 years, 11 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/autocomplete/autocomplete_provider.h" 11 #include "chrome/browser/autocomplete/autocomplete_provider.h"
12 #include "chrome/browser/google/google_util.h" 12 #include "chrome/browser/google/google_util.h"
13 #include "chrome/browser/history/history.h" 13 #include "chrome/browser/history/history.h"
14 #include "chrome/browser/history/history_service_factory.h" 14 #include "chrome/browser/history/history_service_factory.h"
15 #include "chrome/browser/history/history_tab_helper.h" 15 #include "chrome/browser/history/history_tab_helper.h"
16 #include "chrome/browser/instant/instant_loader.h" 16 #include "chrome/browser/instant/instant_ntp.h"
17 #include "chrome/browser/instant/instant_overlay.h"
17 #include "chrome/browser/instant/instant_tab.h" 18 #include "chrome/browser/instant/instant_tab.h"
18 #include "chrome/browser/platform_util.h" 19 #include "chrome/browser/platform_util.h"
19 #include "chrome/browser/search_engines/template_url_service.h" 20 #include "chrome/browser/search_engines/template_url_service.h"
20 #include "chrome/browser/search_engines/template_url_service_factory.h" 21 #include "chrome/browser/search_engines/template_url_service_factory.h"
21 #include "chrome/browser/ui/browser_instant_controller.h" 22 #include "chrome/browser/ui/browser_instant_controller.h"
22 #include "chrome/browser/ui/search/search_tab_helper.h" 23 #include "chrome/browser/ui/search/search_tab_helper.h"
23 #include "chrome/common/chrome_notification_types.h" 24 #include "chrome/common/chrome_notification_types.h"
24 #include "chrome/common/chrome_switches.h" 25 #include "chrome/common/chrome_switches.h"
25 #include "content/public/browser/navigation_entry.h" 26 #include "content/public/browser/navigation_entry.h"
26 #include "content/public/browser/notification_service.h" 27 #include "content/public/browser/notification_service.h"
(...skipping 12 matching lines...) Expand all
39 // page about the new omnibox bounds, in cases where the bounds shrink. This is 40 // page about the new omnibox bounds, in cases where the bounds shrink. This is
40 // to avoid the page jumping up/down very fast in response to bounds changes. 41 // to avoid the page jumping up/down very fast in response to bounds changes.
41 const int kUpdateBoundsDelayMS = 1000; 42 const int kUpdateBoundsDelayMS = 1000;
42 43
43 // The maximum number of times we'll load a non-Instant-supporting search engine 44 // The maximum number of times we'll load a non-Instant-supporting search engine
44 // before we give up and blacklist it for the rest of the browsing session. 45 // before we give up and blacklist it for the rest of the browsing session.
45 const int kMaxInstantSupportFailures = 10; 46 const int kMaxInstantSupportFailures = 10;
46 47
47 // If an Instant page has not been used in these many milliseconds, it is 48 // If an Instant page has not been used in these many milliseconds, it is
48 // reloaded so that the page does not become stale. 49 // reloaded so that the page does not become stale.
49 const int kStaleLoaderTimeoutMS = 3 * 3600 * 1000; 50 const int kStalePageTimeoutMS = 3 * 3600 * 1000;
50 51
51 // For reporting events of interest. 52 // For reporting events of interest.
52 enum InstantControllerEvent { 53 enum InstantControllerEvent {
53 INSTANT_CONTROLLER_EVENT_URL_ADDED_TO_BLACKLIST = 0, 54 INSTANT_CONTROLLER_EVENT_URL_ADDED_TO_BLACKLIST = 0,
54 INSTANT_CONTROLLER_EVENT_URL_REMOVED_FROM_BLACKLIST = 1, 55 INSTANT_CONTROLLER_EVENT_URL_REMOVED_FROM_BLACKLIST = 1,
55 INSTANT_CONTROLLER_EVENT_URL_BLOCKED_BY_BLACKLIST = 2, 56 INSTANT_CONTROLLER_EVENT_URL_BLOCKED_BY_BLACKLIST = 2,
56 INSTANT_CONTROLLER_EVENT_MAX = 3, 57 INSTANT_CONTROLLER_EVENT_MAX = 3,
57 }; 58 };
58 59
59 void RecordEventHistogram(InstantControllerEvent event) { 60 void RecordEventHistogram(InstantControllerEvent event) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 << is_keyword_search; 209 << is_keyword_search;
209 210
210 // TODO(dhollowa): Complete keyword match UI. For now just hide suggestions. 211 // TODO(dhollowa): Complete keyword match UI. For now just hide suggestions.
211 // http://crbug.com/153932. Note, this early escape is happens prior to the 212 // http://crbug.com/153932. Note, this early escape is happens prior to the
212 // DCHECKs below because |user_text| and |full_text| have different semantics 213 // DCHECKs below because |user_text| and |full_text| have different semantics
213 // when keyword search is in effect. 214 // when keyword search is in effect.
214 if (is_keyword_search) { 215 if (is_keyword_search) {
215 if (instant_tab_) 216 if (instant_tab_)
216 instant_tab_->Update(string16(), 0, 0, true); 217 instant_tab_->Update(string16(), 0, 0, true);
217 else 218 else
218 HideLoader(); 219 HideOverlay();
219 last_match_was_search_ = false; 220 last_match_was_search_ = false;
220 return false; 221 return false;
221 } 222 }
222 223
223 // If the popup is open, the user has to be typing. 224 // If the popup is open, the user has to be typing.
224 DCHECK(!omnibox_popup_is_open || user_input_in_progress); 225 DCHECK(!omnibox_popup_is_open || user_input_in_progress);
225 226
226 // If the popup is closed, there should be no inline autocompletion. 227 // If the popup is closed, there should be no inline autocompletion.
227 DCHECK(omnibox_popup_is_open || user_text.empty() || user_text == full_text) 228 DCHECK(omnibox_popup_is_open || user_text.empty() || user_text == full_text)
228 << user_text << "|" << full_text; 229 << user_text << "|" << full_text;
229 230
230 // If there's no text in the omnibox, the user can't have typed any. 231 // If there's no text in the omnibox, the user can't have typed any.
231 DCHECK(!full_text.empty() || user_text.empty()) << user_text; 232 DCHECK(!full_text.empty() || user_text.empty()) << user_text;
232 233
233 // If the user isn't typing, and the popup is closed, there can't be any 234 // If the user isn't typing, and the popup is closed, there can't be any
234 // user-typed text. 235 // user-typed text.
235 DCHECK(user_input_in_progress || omnibox_popup_is_open || user_text.empty()) 236 DCHECK(user_input_in_progress || omnibox_popup_is_open || user_text.empty())
236 << user_text; 237 << user_text;
237 238
238 // The preview is being clicked and will commit soon. Don't change anything. 239 // The preview is being clicked and will commit soon. Don't change anything.
239 // TODO(sreeram): Add a browser test for this. 240 // TODO(sreeram): Add a browser test for this.
240 if (loader_ && loader_->is_pointer_down_from_activate()) 241 if (overlay_ && overlay_->is_pointer_down_from_activate())
241 return false; 242 return false;
242 243
243 // In non-extended mode, SearchModeChanged() is never called, so fake it. The 244 // In non-extended mode, SearchModeChanged() is never called, so fake it. The
244 // mode is set to "disallow suggestions" here, so that if one of the early 245 // mode is set to "disallow suggestions" here, so that if one of the early
245 // "return false" conditions is hit, suggestions will be disallowed. If the 246 // "return false" conditions is hit, suggestions will be disallowed. If the
246 // query is sent to the loader, the mode is set to "allow" further below. 247 // query is sent to the overlay, the mode is set to "allow" further below.
247 if (!extended_enabled_) 248 if (!extended_enabled_)
248 search_mode_.mode = chrome::search::Mode::MODE_DEFAULT; 249 search_mode_.mode = chrome::search::Mode::MODE_DEFAULT;
249 250
250 last_match_was_search_ = AutocompleteMatch::IsSearchType(match.type) && 251 last_match_was_search_ = AutocompleteMatch::IsSearchType(match.type) &&
251 !user_text.empty(); 252 !user_text.empty();
252 253
253 if (!ResetLoaderForMatch(match)) { 254 if (!ResetOverlayForMatch(match)) {
254 HideLoader(); 255 HideOverlay();
255 return false; 256 return false;
256 } 257 }
257 258
258 if (extended_enabled_) { 259 if (extended_enabled_) {
259 if (!omnibox_popup_is_open) { 260 if (!omnibox_popup_is_open) {
260 if (!user_input_in_progress) { 261 if (!user_input_in_progress) {
261 // If the user isn't typing and the omnibox popup is closed, it means a 262 // If the user isn't typing and the omnibox popup is closed, it means a
262 // regular navigation, tab-switch or the user hitting Escape. 263 // regular navigation, tab-switch or the user hitting Escape.
263 if (instant_tab_) { 264 if (instant_tab_) {
264 // The user is on a search results page. It may be showing results for 265 // The user is on a search results page. It may be showing results for
265 // a partial query the user typed before they hit Escape. Send the 266 // a partial query the user typed before they hit Escape. Send the
266 // omnibox text to the page to restore the original results. 267 // omnibox text to the page to restore the original results.
267 // 268 //
268 // In a tab switch, |instant_tab_| won't have updated yet, so it may 269 // In a tab switch, |instant_tab_| won't have updated yet, so it may
269 // be pointing to the previous tab (which was a search results page). 270 // be pointing to the previous tab (which was a search results page).
270 // Ensure we don't send the omnibox text to a random webpage (the new 271 // Ensure we don't send the omnibox text to a random webpage (the new
271 // tab), by comparing the old and new WebContents. 272 // tab), by comparing the old and new WebContents.
272 if (escape_pressed && 273 if (escape_pressed &&
273 instant_tab_->contents() == browser_->GetActiveWebContents()) { 274 instant_tab_->contents() == browser_->GetActiveWebContents()) {
274 instant_tab_->Submit(full_text); 275 instant_tab_->Submit(full_text);
275 } 276 }
276 } else if (!full_text.empty()) { 277 } else if (!full_text.empty()) {
277 // If |full_text| is empty, the user is on the NTP. The preview may 278 // If |full_text| is empty, the user is on the NTP. The preview may
278 // be showing custom NTP content; hide only if that's not the case. 279 // be showing custom NTP content; hide only if that's not the case.
279 HideLoader(); 280 HideOverlay();
280 } 281 }
281 } else if (full_text.empty()) { 282 } else if (full_text.empty()) {
282 // The user is typing, and backspaced away all omnibox text. Clear 283 // The user is typing, and backspaced away all omnibox text. Clear
283 // |last_omnibox_text_| so that we don't attempt to set suggestions. 284 // |last_omnibox_text_| so that we don't attempt to set suggestions.
284 last_omnibox_text_.clear(); 285 last_omnibox_text_.clear();
285 last_suggestion_ = InstantSuggestion(); 286 last_suggestion_ = InstantSuggestion();
286 if (instant_tab_) { 287 if (instant_tab_) {
287 // On a search results page, tell it to clear old results. 288 // On a search results page, tell it to clear old results.
288 instant_tab_->Update(string16(), 0, 0, true); 289 instant_tab_->Update(string16(), 0, 0, true);
289 } else if (search_mode_.is_origin_ntp()) { 290 } else if (search_mode_.is_origin_ntp()) {
290 // On the NTP, tell the preview to clear old results. Don't hide the 291 // On the NTP, tell the preview to clear old results. Don't hide the
291 // preview so it can show a blank page or logo if it wants. 292 // preview so it can show a blank page or logo if it wants.
292 loader_->Update(string16(), 0, 0, true); 293 overlay_->Update(string16(), 0, 0, true);
293 } else { 294 } else {
294 HideLoader(); 295 HideOverlay();
295 } 296 }
296 } else { 297 } else {
297 // The user switched to a tab with partial text already in the omnibox. 298 // The user switched to a tab with partial text already in the omnibox.
298 HideLoader(); 299 HideOverlay();
299 300
300 // The new tab may or may not be a search results page; we don't know 301 // The new tab may or may not be a search results page; we don't know
301 // since SearchModeChanged() hasn't been called yet. If it later turns 302 // since SearchModeChanged() hasn't been called yet. If it later turns
302 // out to be, we should store |full_text| now, so that if the user hits 303 // out to be, we should store |full_text| now, so that if the user hits
303 // Enter, we'll send the correct query to instant_tab_->Submit(). If the 304 // Enter, we'll send the correct query to instant_tab_->Submit(). If the
304 // partial text is not a query (|last_match_was_search_| is false), we 305 // partial text is not a query (|last_match_was_search_| is false), we
305 // won't Submit(), so no need to worry about that. 306 // won't Submit(), so no need to worry about that.
306 last_omnibox_text_ = full_text; 307 last_omnibox_text_ = full_text;
307 last_suggestion_ = InstantSuggestion(); 308 last_suggestion_ = InstantSuggestion();
308 } 309 }
309 return false; 310 return false;
310 } else if (full_text.empty()) { 311 } else if (full_text.empty()) {
311 // The user typed a solitary "?". Same as the backspace case above. 312 // The user typed a solitary "?". Same as the backspace case above.
312 last_omnibox_text_.clear(); 313 last_omnibox_text_.clear();
313 last_suggestion_ = InstantSuggestion(); 314 last_suggestion_ = InstantSuggestion();
314 if (instant_tab_) 315 if (instant_tab_)
315 instant_tab_->Update(string16(), 0, 0, true); 316 instant_tab_->Update(string16(), 0, 0, true);
316 else if (search_mode_.is_origin_ntp()) 317 else if (search_mode_.is_origin_ntp())
317 loader_->Update(string16(), 0, 0, true); 318 overlay_->Update(string16(), 0, 0, true);
318 else 319 else
319 HideLoader(); 320 HideOverlay();
320 return false; 321 return false;
321 } 322 }
322 } else if (!omnibox_popup_is_open || full_text.empty()) { 323 } else if (!omnibox_popup_is_open || full_text.empty()) {
323 // In the non-extended case, hide the preview as long as the user isn't 324 // In the non-extended case, hide the preview as long as the user isn't
324 // actively typing a non-empty query. 325 // actively typing a non-empty query.
325 HideLoader(); 326 HideOverlay();
326 return false; 327 return false;
327 } 328 }
328 329
329 last_omnibox_text_has_inline_autocompletion_ = user_text != full_text; 330 last_omnibox_text_has_inline_autocompletion_ = user_text != full_text;
330 331
331 // If the user continues typing the same query as the suggested text is 332 // If the user continues typing the same query as the suggested text is
332 // showing, reuse the suggestion (but only for INSTANT_COMPLETE_NEVER). 333 // showing, reuse the suggestion (but only for INSTANT_COMPLETE_NEVER).
333 bool reused_suggestion = false; 334 bool reused_suggestion = false;
334 if (last_suggestion_.behavior == INSTANT_COMPLETE_NEVER && 335 if (last_suggestion_.behavior == INSTANT_COMPLETE_NEVER &&
335 !last_omnibox_text_has_inline_autocompletion_) { 336 !last_omnibox_text_has_inline_autocompletion_) {
(...skipping 28 matching lines...) Expand all
364 // this, but it's not called in non-extended mode, so fake it. 365 // this, but it's not called in non-extended mode, so fake it.
365 if (!extended_enabled_) 366 if (!extended_enabled_)
366 search_mode_.mode = chrome::search::Mode::MODE_SEARCH_SUGGESTIONS; 367 search_mode_.mode = chrome::search::Mode::MODE_SEARCH_SUGGESTIONS;
367 368
368 if (instant_tab_) { 369 if (instant_tab_) {
369 instant_tab_->Update(user_text, selection_start, selection_end, verbatim); 370 instant_tab_->Update(user_text, selection_start, selection_end, verbatim);
370 } else { 371 } else {
371 if (first_interaction_time_.is_null()) 372 if (first_interaction_time_.is_null())
372 first_interaction_time_ = base::Time::Now(); 373 first_interaction_time_ = base::Time::Now();
373 allow_preview_to_show_search_suggestions_ = true; 374 allow_preview_to_show_search_suggestions_ = true;
374 loader_->Update(extended_enabled_ ? user_text : full_text, 375 overlay_->Update(extended_enabled_ ? user_text : full_text,
375 selection_start, selection_end, verbatim); 376 selection_start, selection_end, verbatim);
376 } 377 }
377 378
378 content::NotificationService::current()->Notify( 379 content::NotificationService::current()->Notify(
379 chrome::NOTIFICATION_INSTANT_CONTROLLER_UPDATED, 380 chrome::NOTIFICATION_INSTANT_CONTROLLER_UPDATED,
380 content::Source<InstantController>(this), 381 content::Source<InstantController>(this),
381 content::NotificationService::NoDetails()); 382 content::NotificationService::NoDetails());
382 383
383 // We don't have new suggestions yet, but we can either reuse the existing 384 // We don't have new suggestions yet, but we can either reuse the existing
384 // suggestion or reset the existing "gray text". 385 // suggestion or reset the existing "gray text".
385 browser_->SetInstantSuggestion(last_suggestion_); 386 browser_->SetInstantSuggestion(last_suggestion_);
386 387
387 // Though we may have handled a URL match above, we return false here, so that 388 // Though we may have handled a URL match above, we return false here, so that
388 // omnibox prerendering can kick in. TODO(sreeram): Remove this (and always 389 // omnibox prerendering can kick in. TODO(sreeram): Remove this (and always
389 // return true) once we are able to commit URLs as well. 390 // return true) once we are able to commit URLs as well.
390 return last_match_was_search_; 391 return last_match_was_search_;
391 } 392 }
392 393
394 content::WebContents* InstantController::ReleaseNTPContents() {
395 if (!extended_enabled_ || !ntp_)
396 return NULL;
397
398 content::WebContents* ntp_contents = ntp_->ReleaseContents();
399 ntp_.reset();
400 ResetNTP();
401 return ntp_contents;
402 }
403
393 // TODO(tonyg): This method only fires when the omnibox bounds change. It also 404 // TODO(tonyg): This method only fires when the omnibox bounds change. It also
394 // needs to fire when the preview bounds change (e.g.: open/close info bar). 405 // needs to fire when the preview bounds change (e.g.: open/close info bar).
395 void InstantController::SetPopupBounds(const gfx::Rect& bounds) { 406 void InstantController::SetPopupBounds(const gfx::Rect& bounds) {
396 if (!extended_enabled_ && !instant_enabled_) 407 if (!extended_enabled_ && !instant_enabled_)
397 return; 408 return;
398 409
399 if (popup_bounds_ == bounds) 410 if (popup_bounds_ == bounds)
400 return; 411 return;
401 412
402 popup_bounds_ = bounds; 413 popup_bounds_ = bounds;
403 if (popup_bounds_.height() > last_popup_bounds_.height()) { 414 if (popup_bounds_.height() > last_popup_bounds_.height()) {
404 update_bounds_timer_.Stop(); 415 update_bounds_timer_.Stop();
405 SendPopupBoundsToPage(); 416 SendPopupBoundsToPage();
406 } else if (!update_bounds_timer_.IsRunning()) { 417 } else if (!update_bounds_timer_.IsRunning()) {
407 update_bounds_timer_.Start(FROM_HERE, 418 update_bounds_timer_.Start(FROM_HERE,
408 base::TimeDelta::FromMilliseconds(kUpdateBoundsDelayMS), this, 419 base::TimeDelta::FromMilliseconds(kUpdateBoundsDelayMS), this,
409 &InstantController::SendPopupBoundsToPage); 420 &InstantController::SendPopupBoundsToPage);
410 } 421 }
411 } 422 }
412 423
413 void InstantController::SetMarginSize(int start, int end) { 424 void InstantController::SetMarginSize(int start, int end) {
414 if (!extended_enabled_ || (start_margin_ == start && end_margin_ == end)) 425 if (!extended_enabled_ || (start_margin_ == start && end_margin_ == end))
415 return; 426 return;
416 427
417 start_margin_ = start; 428 start_margin_ = start;
418 end_margin_ = end; 429 end_margin_ = end;
419 if (loader_) 430 if (overlay_)
420 loader_->SetMarginSize(start_margin_, end_margin_); 431 overlay_->SetMarginSize(start_margin_, end_margin_);
432 if (ntp_)
433 ntp_->SetMarginSize(start_margin_, end_margin_);
421 if (instant_tab_) 434 if (instant_tab_)
422 instant_tab_->SetMarginSize(start_margin_, end_margin_); 435 instant_tab_->SetMarginSize(start_margin_, end_margin_);
423 } 436 }
424 437
425 void InstantController::HandleAutocompleteResults( 438 void InstantController::HandleAutocompleteResults(
426 const std::vector<AutocompleteProvider*>& providers) { 439 const std::vector<AutocompleteProvider*>& providers) {
427 if (!extended_enabled_) 440 if (!extended_enabled_)
428 return; 441 return;
429 442
430 if (!instant_tab_ && !loader_) 443 if (!instant_tab_ && !overlay_)
431 return; 444 return;
432 445
433 DVLOG(1) << "AutocompleteResults:"; 446 DVLOG(1) << "AutocompleteResults:";
434 std::vector<InstantAutocompleteResult> results; 447 std::vector<InstantAutocompleteResult> results;
435 for (ACProviders::const_iterator provider = providers.begin(); 448 for (ACProviders::const_iterator provider = providers.begin();
436 provider != providers.end(); ++provider) { 449 provider != providers.end(); ++provider) {
437 for (ACMatches::const_iterator match = (*provider)->matches().begin(); 450 for (ACMatches::const_iterator match = (*provider)->matches().begin();
438 match != (*provider)->matches().end(); ++match) { 451 match != (*provider)->matches().end(); ++match) {
439 InstantAutocompleteResult result; 452 InstantAutocompleteResult result;
440 result.provider = UTF8ToUTF16((*provider)->GetName()); 453 result.provider = UTF8ToUTF16((*provider)->GetName());
441 result.type = UTF8ToUTF16(AutocompleteMatch::TypeToString(match->type)); 454 result.type = UTF8ToUTF16(AutocompleteMatch::TypeToString(match->type));
442 result.description = match->description; 455 result.description = match->description;
443 result.destination_url = UTF8ToUTF16(match->destination_url.spec()); 456 result.destination_url = UTF8ToUTF16(match->destination_url.spec());
444 result.transition = match->transition; 457 result.transition = match->transition;
445 result.relevance = match->relevance; 458 result.relevance = match->relevance;
446 DVLOG(1) << " " << result.relevance << " " << result.type << " " 459 DVLOG(1) << " " << result.relevance << " " << result.type << " "
447 << result.provider << " " << result.destination_url << " '" 460 << result.provider << " " << result.destination_url << " '"
448 << result.description << "' " << result.transition; 461 << result.description << "' " << result.transition;
449 results.push_back(result); 462 results.push_back(result);
450 } 463 }
451 } 464 }
452 465
453 if (instant_tab_) 466 if (instant_tab_)
454 instant_tab_->SendAutocompleteResults(results); 467 instant_tab_->SendAutocompleteResults(results);
455 else 468 else
456 loader_->SendAutocompleteResults(results); 469 overlay_->SendAutocompleteResults(results);
457 } 470 }
458 471
459 bool InstantController::OnUpOrDownKeyPressed(int count) { 472 bool InstantController::OnUpOrDownKeyPressed(int count) {
460 if (!extended_enabled_) 473 if (!extended_enabled_)
461 return false; 474 return false;
462 475
463 if (!instant_tab_ && !loader_) 476 if (!instant_tab_ && !overlay_)
464 return false; 477 return false;
465 478
466 if (instant_tab_) 479 if (instant_tab_)
467 instant_tab_->UpOrDownKeyPressed(count); 480 instant_tab_->UpOrDownKeyPressed(count);
468 else 481 else
469 loader_->UpOrDownKeyPressed(count); 482 overlay_->UpOrDownKeyPressed(count);
470 483
471 return true; 484 return true;
472 } 485 }
473 486
474 content::WebContents* InstantController::GetPreviewContents() const { 487 content::WebContents* InstantController::GetPreviewContents() const {
475 return loader_ ? loader_->contents() : NULL; 488 return overlay_ ? overlay_->contents() : NULL;
476 } 489 }
477 490
478 bool InstantController::IsPreviewingSearchResults() const { 491 bool InstantController::IsPreviewingSearchResults() const {
479 return model_.mode().is_search_suggestions() && last_match_was_search_ && 492 return model_.mode().is_search_suggestions() && last_match_was_search_ &&
480 IsFullHeight(model_); 493 IsFullHeight(model_);
481 } 494 }
482 495
483 bool InstantController::CommitIfPossible(InstantCommitType type) { 496 bool InstantController::CommitIfPossible(InstantCommitType type) {
484 if (!extended_enabled_ && !instant_enabled_) 497 if (!extended_enabled_ && !instant_enabled_)
485 return false; 498 return false;
(...skipping 11 matching lines...) Expand all
497 return true; 510 return true;
498 } 511 }
499 return false; 512 return false;
500 } 513 }
501 514
502 if (!IsPreviewingSearchResults() && type != INSTANT_COMMIT_NAVIGATED) 515 if (!IsPreviewingSearchResults() && type != INSTANT_COMMIT_NAVIGATED)
503 return false; 516 return false;
504 517
505 // There may re-entrance here, from the call to browser_->CommitInstant below, 518 // There may re-entrance here, from the call to browser_->CommitInstant below,
506 // which can cause a TabDeactivated notification which gets back here. 519 // which can cause a TabDeactivated notification which gets back here.
507 // In this case, loader_->ReleaseContents() was called already. 520 // In this case, overlay_->ReleaseContents() was called already.
508 if (!GetPreviewContents()) 521 if (!GetPreviewContents())
509 return false; 522 return false;
510 523
511 // Never commit the local omnibox. 524 // Never commit the local omnibox.
512 if (loader_->IsUsingLocalPreview()) 525 if (overlay_->IsUsingLocalPreview())
513 return false; 526 return false;
514 527
515 if (type == INSTANT_COMMIT_FOCUS_LOST) 528 if (type == INSTANT_COMMIT_FOCUS_LOST)
516 loader_->Cancel(last_omnibox_text_); 529 overlay_->Cancel(last_omnibox_text_);
517 else if (type != INSTANT_COMMIT_NAVIGATED && 530 else if (type != INSTANT_COMMIT_NAVIGATED &&
518 type != INSTANT_COMMIT_CLICKED_QUERY_SUGGESTION) 531 type != INSTANT_COMMIT_CLICKED_QUERY_SUGGESTION)
519 loader_->Submit(last_omnibox_text_); 532 overlay_->Submit(last_omnibox_text_);
520 533
521 content::WebContents* preview = loader_->ReleaseContents(); 534 content::WebContents* preview = overlay_->ReleaseContents();
522 535
523 if (extended_enabled_) { 536 if (extended_enabled_) {
524 // Consider what's happening: 537 // Consider what's happening:
525 // 1. The user has typed a query in the omnibox and committed it (either 538 // 1. The user has typed a query in the omnibox and committed it (either
526 // by pressing Enter or clicking on the preview). 539 // by pressing Enter or clicking on the preview).
527 // 2. We commit the preview to the tab strip, and tell the page. 540 // 2. We commit the preview to the tab strip, and tell the page.
528 // 3. The page will update the URL hash fragment with the query terms. 541 // 3. The page will update the URL hash fragment with the query terms.
529 // After steps 1 and 3, the omnibox will show the query terms. However, if 542 // After steps 1 and 3, the omnibox will show the query terms. However, if
530 // the URL we are committing at step 2 doesn't already have query terms, it 543 // the URL we are committing at step 2 doesn't already have query terms, it
531 // will flash for a brief moment as a plain URL. So, avoid that flicker by 544 // will flash for a brief moment as a plain URL. So, avoid that flicker by
(...skipping 17 matching lines...) Expand all
549 net::EscapeQueryParamValue(query, true))); 562 net::EscapeQueryParamValue(query, true)));
550 chrome::search::SearchTabHelper::FromWebContents(preview)-> 563 chrome::search::SearchTabHelper::FromWebContents(preview)->
551 NavigationEntryUpdated(); 564 NavigationEntryUpdated();
552 } 565 }
553 } 566 }
554 567
555 // If the preview page has navigated since the last Update(), we need to add 568 // If the preview page has navigated since the last Update(), we need to add
556 // the navigation to history ourselves. Else, the page will navigate after 569 // the navigation to history ourselves. Else, the page will navigate after
557 // commit, and it will be added to history in the usual manner. 570 // commit, and it will be added to history in the usual manner.
558 const history::HistoryAddPageArgs& last_navigation = 571 const history::HistoryAddPageArgs& last_navigation =
559 loader_->last_navigation(); 572 overlay_->last_navigation();
560 if (!last_navigation.url.is_empty()) { 573 if (!last_navigation.url.is_empty()) {
561 content::NavigationEntry* entry = preview->GetController().GetActiveEntry(); 574 content::NavigationEntry* entry = preview->GetController().GetActiveEntry();
562 575
563 // The last navigation should be the same as the active entry if the loader 576 // The last navigation should be the same as the active entry if the overlay
564 // is in search mode. During navigation, the active entry could have 577 // is in search mode. During navigation, the active entry could have
565 // changed since DidCommitProvisionalLoadForFrame is called after the entry 578 // changed since DidCommitProvisionalLoadForFrame is called after the entry
566 // is changed. 579 // is changed.
567 // TODO(shishir): Should we commit the last navigation for 580 // TODO(shishir): Should we commit the last navigation for
568 // INSTANT_COMMIT_NAVIGATED. 581 // INSTANT_COMMIT_NAVIGATED.
569 DCHECK(type == INSTANT_COMMIT_NAVIGATED || 582 DCHECK(type == INSTANT_COMMIT_NAVIGATED ||
570 last_navigation.url == entry->GetURL()); 583 last_navigation.url == entry->GetURL());
571 584
572 // Add the page to history. 585 // Add the page to history.
573 HistoryTabHelper* history_tab_helper = 586 HistoryTabHelper* history_tab_helper =
(...skipping 25 matching lines...) Expand all
599 } 612 }
600 613
601 // Browser takes ownership of the preview. 614 // Browser takes ownership of the preview.
602 browser_->CommitInstant(preview, type == INSTANT_COMMIT_PRESSED_ALT_ENTER); 615 browser_->CommitInstant(preview, type == INSTANT_COMMIT_PRESSED_ALT_ENTER);
603 616
604 content::NotificationService::current()->Notify( 617 content::NotificationService::current()->Notify(
605 chrome::NOTIFICATION_INSTANT_COMMITTED, 618 chrome::NOTIFICATION_INSTANT_COMMITTED,
606 content::Source<content::WebContents>(preview), 619 content::Source<content::WebContents>(preview),
607 content::NotificationService::NoDetails()); 620 content::NotificationService::NoDetails());
608 621
609 // Hide explicitly. See comments in HideLoader() for why. 622 // Hide explicitly. See comments in HideOverlay() for why.
610 model_.SetPreviewState(chrome::search::Mode(), 0, INSTANT_SIZE_PERCENT); 623 model_.SetPreviewState(chrome::search::Mode(), 0, INSTANT_SIZE_PERCENT);
611 624
612 // Delay deletion as we could've gotten here from an InstantLoader method. 625 // Delay deletion as we could've gotten here from an InstantOverlay method.
613 MessageLoop::current()->DeleteSoon(FROM_HERE, loader_.release()); 626 MessageLoop::current()->DeleteSoon(FROM_HERE, overlay_.release());
614 627
615 // Try to create another loader immediately so that it is ready for the next 628 // Try to create another overlay immediately so that it is ready for the next
616 // user interaction. 629 // user interaction.
617 CreateDefaultLoader(); 630 CreateDefaultOverlay();
618 631
619 return true; 632 return true;
620 } 633 }
621 634
622 void InstantController::OmniboxFocusChanged( 635 void InstantController::OmniboxFocusChanged(
623 OmniboxFocusState state, 636 OmniboxFocusState state,
624 OmniboxFocusChangeReason reason, 637 OmniboxFocusChangeReason reason,
625 gfx::NativeView view_gaining_focus) { 638 gfx::NativeView view_gaining_focus) {
626 DVLOG(1) << "OmniboxFocusChanged: " << omnibox_focus_state_ << " to " 639 DVLOG(1) << "OmniboxFocusChanged: " << omnibox_focus_state_ << " to "
627 << state << " for reason " << reason; 640 << state << " for reason " << reason;
628 641
629 OmniboxFocusState old_focus_state = omnibox_focus_state_; 642 OmniboxFocusState old_focus_state = omnibox_focus_state_;
630 omnibox_focus_state_ = state; 643 omnibox_focus_state_ = state;
631 if (!extended_enabled_ && !instant_enabled_) 644 if (!extended_enabled_ && !instant_enabled_)
632 return; 645 return;
633 646
634 // Tell the page if the key capture mode changed unless the focus state 647 // Tell the page if the key capture mode changed unless the focus state
635 // changed because of TYPING. This is because in that case, the browser hasn't 648 // changed because of TYPING. This is because in that case, the browser hasn't
636 // really stopped capturing key strokes. 649 // really stopped capturing key strokes.
637 // 650 //
638 // (More practically, if we don't do this check, the page would receive 651 // (More practically, if we don't do this check, the page would receive
639 // onkeycapturechange before the corresponding onchange, and the page would 652 // onkeycapturechange before the corresponding onchange, and the page would
640 // have no way of telling whether the keycapturechange happened because of 653 // have no way of telling whether the keycapturechange happened because of
641 // some actual user action or just because they started typing.) 654 // some actual user action or just because they started typing.)
642 if (extended_enabled_ && GetPreviewContents() && 655 if (extended_enabled_ && GetPreviewContents() &&
643 reason != OMNIBOX_FOCUS_CHANGE_TYPING) 656 reason != OMNIBOX_FOCUS_CHANGE_TYPING) {
644 loader_->KeyCaptureChanged(omnibox_focus_state_ == OMNIBOX_FOCUS_INVISIBLE); 657 const bool is_key_capture_enabled =
658 omnibox_focus_state_ == OMNIBOX_FOCUS_INVISIBLE;
659 if (overlay_)
660 overlay_->KeyCaptureChanged(is_key_capture_enabled);
661 if (instant_tab_)
662 instant_tab_->KeyCaptureChanged(is_key_capture_enabled);
663 }
645 664
646 // If focus went from outside the omnibox to the omnibox, preload the default 665 // If focus went from outside the omnibox to the omnibox, preload the default
647 // search engine, in anticipation of the user typing a query. If the reverse 666 // search engine, in anticipation of the user typing a query. If the reverse
648 // happened, commit or discard the preview. 667 // happened, commit or discard the preview.
649 if (state != OMNIBOX_FOCUS_NONE && old_focus_state == OMNIBOX_FOCUS_NONE) 668 if (state != OMNIBOX_FOCUS_NONE && old_focus_state == OMNIBOX_FOCUS_NONE)
650 CreateDefaultLoader(); 669 CreateDefaultOverlay();
651 else if (state == OMNIBOX_FOCUS_NONE && old_focus_state != OMNIBOX_FOCUS_NONE) 670 else if (state == OMNIBOX_FOCUS_NONE && old_focus_state != OMNIBOX_FOCUS_NONE)
652 OmniboxLostFocus(view_gaining_focus); 671 OmniboxLostFocus(view_gaining_focus);
653 } 672 }
654 673
655 void InstantController::SearchModeChanged( 674 void InstantController::SearchModeChanged(
656 const chrome::search::Mode& old_mode, 675 const chrome::search::Mode& old_mode,
657 const chrome::search::Mode& new_mode) { 676 const chrome::search::Mode& new_mode) {
658 if (!extended_enabled_) 677 if (!extended_enabled_)
659 return; 678 return;
660 679
661 DVLOG(1) << "SearchModeChanged: [origin:mode] " << old_mode.origin << ":" 680 DVLOG(1) << "SearchModeChanged: [origin:mode] " << old_mode.origin << ":"
662 << old_mode.mode << " to " << new_mode.origin << ":" 681 << old_mode.mode << " to " << new_mode.origin << ":"
663 << new_mode.mode; 682 << new_mode.mode;
664 683
665 search_mode_ = new_mode; 684 search_mode_ = new_mode;
666 if (!new_mode.is_search_suggestions()) 685 if (!new_mode.is_search_suggestions())
667 HideLoader(); 686 HideOverlay();
668 687
669 if (loader_) 688 if (overlay_)
670 loader_->SearchModeChanged(new_mode); 689 overlay_->SearchModeChanged(new_mode);
671 690
672 ResetInstantTab(); 691 ResetInstantTab();
673 } 692 }
674 693
675 void InstantController::ActiveTabChanged() { 694 void InstantController::ActiveTabChanged() {
676 if (!extended_enabled_ && !instant_enabled_) 695 if (!extended_enabled_ && !instant_enabled_)
677 return; 696 return;
678 697
679 DVLOG(1) << "ActiveTabChanged"; 698 DVLOG(1) << "ActiveTabChanged";
680 699
681 // When switching tabs, always hide the preview, except if it's showing NTP 700 // When switching tabs, always hide the preview.
682 // content, and the new tab is also an NTP. 701 HideOverlay();
683 if (!search_mode_.is_ntp() || !model_.mode().is_ntp())
684 HideLoader();
685 702
686 if (extended_enabled_) 703 if (extended_enabled_)
687 ResetInstantTab(); 704 ResetInstantTab();
688 } 705 }
689 706
690 void InstantController::TabDeactivated(content::WebContents* contents) { 707 void InstantController::TabDeactivated(content::WebContents* contents) {
691 DVLOG(1) << "TabDeactivated"; 708 DVLOG(1) << "TabDeactivated";
692 if (extended_enabled_ && !contents->IsBeingDestroyed()) 709 if (extended_enabled_ && !contents->IsBeingDestroyed())
693 CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); 710 CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST);
694 } 711 }
695 712
696 void InstantController::SetInstantEnabled(bool instant_enabled) { 713 void InstantController::SetInstantEnabled(bool instant_enabled) {
697 DVLOG(1) << "SetInstantEnabled: " << instant_enabled; 714 DVLOG(1) << "SetInstantEnabled: " << instant_enabled;
698 instant_enabled_ = instant_enabled; 715 instant_enabled_ = instant_enabled;
699 HideInternal(); 716 HideInternal();
700 loader_.reset(); 717 overlay_.reset();
701 if (extended_enabled_ || instant_enabled_) 718 if (extended_enabled_ || instant_enabled_)
702 CreateDefaultLoader(); 719 CreateDefaultOverlay();
720 if (extended_enabled_)
721 ResetNTP();
703 if (instant_tab_) 722 if (instant_tab_)
704 instant_tab_->SetDisplayInstantResults(instant_enabled_); 723 instant_tab_->SetDisplayInstantResults(instant_enabled_);
705 } 724 }
706 725
707 void InstantController::ThemeChanged(const ThemeBackgroundInfo& theme_info) { 726 void InstantController::ThemeChanged(const ThemeBackgroundInfo& theme_info) {
708 if (!extended_enabled_) 727 if (!extended_enabled_)
709 return; 728 return;
710 729
711 if (loader_) 730 if (overlay_)
712 loader_->SendThemeBackgroundInfo(theme_info); 731 overlay_->SendThemeBackgroundInfo(theme_info);
732 if (ntp_)
733 ntp_->SendThemeBackgroundInfo(theme_info);
713 } 734 }
714 735
715 void InstantController::ThemeAreaHeightChanged(int height) { 736 void InstantController::ThemeAreaHeightChanged(int height) {
716 if (!extended_enabled_) 737 if (!extended_enabled_)
717 return; 738 return;
718 739
719 if (loader_) 740 if (overlay_)
720 loader_->SendThemeAreaHeight(height); 741 overlay_->SendThemeAreaHeight(height);
742 if (ntp_)
743 ntp_->SendThemeAreaHeight(height);
721 } 744 }
722 745
723 void InstantController::SetSuggestions( 746 void InstantController::SetSuggestions(
724 const content::WebContents* contents, 747 const content::WebContents* contents,
725 const std::vector<InstantSuggestion>& suggestions) { 748 const std::vector<InstantSuggestion>& suggestions) {
726 DVLOG(1) << "SetSuggestions"; 749 DVLOG(1) << "SetSuggestions";
727 750
728 // Ignore if the message is from an unexpected source. 751 // Ignore if the message is from an unexpected source.
729 if (instant_tab_) { 752 if (instant_tab_) {
730 if (instant_tab_->contents() != contents) 753 if (instant_tab_->contents() != contents)
731 return; 754 return;
732 } else if (!loader_ || loader_->contents() != contents || 755 } else if (!overlay_ || overlay_->contents() != contents ||
733 !allow_preview_to_show_search_suggestions_) { 756 !allow_preview_to_show_search_suggestions_) {
734 return; 757 return;
735 } 758 }
736 759
737 InstantSuggestion suggestion; 760 InstantSuggestion suggestion;
738 if (!suggestions.empty()) 761 if (!suggestions.empty())
739 suggestion = suggestions[0]; 762 suggestion = suggestions[0];
740 763
741 if (instant_tab_ && search_mode_.is_search_results() && 764 if (instant_tab_ && search_mode_.is_search_results() &&
742 suggestion.behavior == INSTANT_COMPLETE_REPLACE) { 765 suggestion.behavior == INSTANT_COMPLETE_REPLACE) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 last_suggestion_ = suggestion; 825 last_suggestion_ = suggestion;
803 DVLOG(1) << "SetInstantSuggestion: text='" << suggestion.text << "'" 826 DVLOG(1) << "SetInstantSuggestion: text='" << suggestion.text << "'"
804 << " behavior=" << suggestion.behavior << " type=" 827 << " behavior=" << suggestion.behavior << " type="
805 << suggestion.type; 828 << suggestion.type;
806 browser_->SetInstantSuggestion(suggestion); 829 browser_->SetInstantSuggestion(suggestion);
807 } else { 830 } else {
808 last_suggestion_ = InstantSuggestion(); 831 last_suggestion_ = InstantSuggestion();
809 } 832 }
810 } 833 }
811 834
812 // Extended mode pages will call ShowLoader() when they are ready. 835 // Extended mode pages will call ShowOverlay() when they are ready.
813 if (!extended_enabled_) 836 if (!extended_enabled_)
814 ShowLoader(INSTANT_SHOWN_QUERY_SUGGESTIONS, 100, INSTANT_SIZE_PERCENT); 837 ShowOverlay(INSTANT_SHOWN_QUERY_SUGGESTIONS, 100, INSTANT_SIZE_PERCENT);
815 } 838 }
816 839
817 void InstantController::InstantSupportDetermined( 840 void InstantController::InstantSupportDetermined(
818 const content::WebContents* contents, 841 const content::WebContents* contents,
819 bool supports_instant) { 842 bool supports_instant) {
820 if (instant_tab_ && instant_tab_->contents() == contents) { 843 if (instant_tab_ && instant_tab_->contents() == contents) {
821 if (!supports_instant) 844 if (!supports_instant)
822 MessageLoop::current()->DeleteSoon(FROM_HERE, instant_tab_.release()); 845 MessageLoop::current()->DeleteSoon(FROM_HERE, instant_tab_.release());
823 return; 846 return;
824 } 847 }
825 848
826 if (loader_ && loader_->contents() == contents) { 849 if (ntp_ && ntp_->contents() == contents) {
827 if (supports_instant) { 850 if (supports_instant) {
828 if (blacklisted_urls_.erase(loader_->instant_url())) { 851 if (blacklisted_urls_.erase(ntp_->instant_url())) {
829 RecordEventHistogram( 852 RecordEventHistogram(
830 INSTANT_CONTROLLER_EVENT_URL_REMOVED_FROM_BLACKLIST); 853 INSTANT_CONTROLLER_EVENT_URL_REMOVED_FROM_BLACKLIST);
831 } 854 }
832 } else { 855 } else {
833 ++blacklisted_urls_[loader_->instant_url()]; 856 ++blacklisted_urls_[ntp_->instant_url()];
857 RecordEventHistogram(INSTANT_CONTROLLER_EVENT_URL_ADDED_TO_BLACKLIST);
858 delete ntp_->ReleaseContents();
859 MessageLoop::current()->DeleteSoon(FROM_HERE, ntp_.release());
860 ResetNTP();
861 }
862 }
863
864 if (overlay_ && overlay_->contents() == contents) {
865 if (supports_instant) {
866 if (blacklisted_urls_.erase(overlay_->instant_url())) {
867 RecordEventHistogram(
868 INSTANT_CONTROLLER_EVENT_URL_REMOVED_FROM_BLACKLIST);
869 }
870 } else {
871 ++blacklisted_urls_[overlay_->instant_url()];
834 RecordEventHistogram(INSTANT_CONTROLLER_EVENT_URL_ADDED_TO_BLACKLIST); 872 RecordEventHistogram(INSTANT_CONTROLLER_EVENT_URL_ADDED_TO_BLACKLIST);
835 HideInternal(); 873 HideInternal();
836 delete loader_->ReleaseContents(); 874 delete overlay_->ReleaseContents();
837 MessageLoop::current()->DeleteSoon(FROM_HERE, loader_.release()); 875 MessageLoop::current()->DeleteSoon(FROM_HERE, overlay_.release());
838 CreateDefaultLoader(); 876 CreateDefaultOverlay();
839 } 877 }
840 content::NotificationService::current()->Notify( 878 content::NotificationService::current()->Notify(
841 chrome::NOTIFICATION_INSTANT_SUPPORT_DETERMINED, 879 chrome::NOTIFICATION_INSTANT_SUPPORT_DETERMINED,
842 content::Source<InstantController>(this), 880 content::Source<InstantController>(this),
843 content::NotificationService::NoDetails()); 881 content::NotificationService::NoDetails());
844 } 882 }
845 } 883 }
846 884
847 void InstantController::ShowInstantPreview(InstantShownReason reason, 885 void InstantController::ShowInstantPreview(InstantShownReason reason,
848 int height, 886 int height,
849 InstantSizeUnits units) { 887 InstantSizeUnits units) {
850 if (extended_enabled_) 888 if (extended_enabled_)
851 ShowLoader(reason, height, units); 889 ShowOverlay(reason, height, units);
852 } 890 }
853 891
854 void InstantController::StartCapturingKeyStrokes() { 892 void InstantController::StartCapturingKeyStrokes(
855 // Ignore unless the loader is active and on the NTP. 893 content::WebContents* contents) {
856 if (extended_enabled_ && !instant_tab_ && model_.mode().is_ntp()) 894 if (!extended_enabled_)
895 return;
896
897 // Only honor the call if it comes from an active InstantTab or from an
898 // InstantOverlay that is being shown.
899 if ((instant_tab_ && instant_tab_->contents() == contents) ||
900 (overlay_ && overlay_->contents() == contents &&
901 !model_.mode().is_default())) {
857 browser_->FocusOmniboxInvisibly(); 902 browser_->FocusOmniboxInvisibly();
903 }
858 } 904 }
859 905
860 void InstantController::StopCapturingKeyStrokes() { 906 void InstantController::StopCapturingKeyStrokes(
861 // Ignore unless the loader is active and on the NTP, and the omnibox has 907 content::WebContents* contents) {
862 // invisible focus. 908 // Nothing to do if omnibox doesn't have invisible focus.
863 if (extended_enabled_ && !instant_tab_ && model_.mode().is_ntp() && 909 if (!extended_enabled_ || omnibox_focus_state_ != OMNIBOX_FOCUS_INVISIBLE)
864 omnibox_focus_state_ == OMNIBOX_FOCUS_INVISIBLE) 910 return;
865 loader_->contents()->Focus(); 911
912 // Only honor the call if it comes from an active InstantTab or from an
913 // InstantOverlay that is being shown.
914 if ((instant_tab_ && instant_tab_->contents() == contents) ||
915 (overlay_ && overlay_->contents() == contents &&
916 !model_.mode().is_default())) {
917 contents->Focus();
918 }
866 } 919 }
867 920
868 void InstantController::SwappedWebContents() { 921 void InstantController::SwappedOverlayWebContents() {
869 model_.SetPreviewContents(GetPreviewContents()); 922 model_.SetPreviewContents(GetPreviewContents());
870 } 923 }
871 924
872 void InstantController::InstantLoaderContentsFocused() { 925 void InstantController::InstantOverlayContentsFocused() {
873 #if defined(USE_AURA) 926 #if defined(USE_AURA)
874 // On aura the omnibox only receives a focus lost if we initiate the focus 927 // On aura the omnibox only receives a focus lost if we initiate the focus
875 // change. This does that. 928 // change. This does that.
876 if (!model_.mode().is_default()) 929 if (!model_.mode().is_default())
877 browser_->InstantPreviewFocused(); 930 browser_->InstantPreviewFocused();
878 #endif 931 #endif
879 } 932 }
880 933
881 void InstantController::InstantLoaderRenderViewGone() { 934 void InstantController::InstantOverlayRenderViewGone() {
882 ++blacklisted_urls_[loader_->instant_url()]; 935 ++blacklisted_urls_[overlay_->instant_url()];
883 HideInternal(); 936 HideInternal();
884 delete loader_->ReleaseContents(); 937 delete overlay_->ReleaseContents();
885 // Delay deletion as we have gotten here from an InstantLoader method. 938 // Delay deletion as we have gotten here from an InstantOverlay method.
886 MessageLoop::current()->DeleteSoon(FROM_HERE, loader_.release()); 939 MessageLoop::current()->DeleteSoon(FROM_HERE, overlay_.release());
887 CreateDefaultLoader(); 940 CreateDefaultOverlay();
888 } 941 }
889 942
890 void InstantController::InstantLoaderAboutToNavigateMainFrame(const GURL& url) { 943 void InstantController::InstantNTPRenderViewGone() {
944 ++blacklisted_urls_[ntp_->instant_url()];
945 delete ntp_->ReleaseContents();
946 // Delay deletion as we have gotten here from an InstantNTP method.
947 MessageLoop::current()->DeleteSoon(FROM_HERE, ntp_.release());
948 ResetNTP();
949 }
950
951 void InstantController::InstantOverlayAboutToNavigateMainFrame(
952 const GURL& url) {
891 // If the page does not yet support instant, we allow redirects and other 953 // If the page does not yet support instant, we allow redirects and other
892 // navigations to go through since the instant URL can redirect - e.g. to 954 // navigations to go through since the instant URL can redirect - e.g. to
893 // country specific pages. 955 // country specific pages.
894 if (!loader_->supports_instant()) 956 if (!overlay_->supports_instant())
895 return; 957 return;
896 958
897 GURL instant_url(loader_->instant_url()); 959 GURL instant_url(overlay_->instant_url());
898 960
899 // If we are navigating to the instant URL, do nothing. 961 // If we are navigating to the instant URL, do nothing.
900 if (url == instant_url) 962 if (url == instant_url)
901 return; 963 return;
902 964
903 // Commit the navigation if either: 965 // Commit the navigation if either:
904 // - The page is in NTP mode (so it could only navigate on a user click) or 966 // - The page is in NTP mode (so it could only navigate on a user click) or
905 // - The page is not in NTP mode and we are navigating to a URL with a 967 // - The page is not in NTP mode and we are navigating to a URL with a
906 // different host or path than the instant URL. This enables the instant 968 // different host or path than the instant URL. This enables the instant
907 // page when it is showing search results to change the query parameters 969 // page when it is showing search results to change the query parameters
908 // and fragments of the URL without it navigating. 970 // and fragments of the URL without it navigating.
909 if (model_.mode().is_ntp() || 971 if (model_.mode().is_ntp() ||
910 (url.host() != instant_url.host() || url.path() != instant_url.path())) { 972 (url.host() != instant_url.host() || url.path() != instant_url.path())) {
911 CommitIfPossible(INSTANT_COMMIT_NAVIGATED); 973 CommitIfPossible(INSTANT_COMMIT_NAVIGATED);
912 } 974 }
913 } 975 }
914 976
915 void InstantController::OmniboxLostFocus(gfx::NativeView view_gaining_focus) { 977 void InstantController::OmniboxLostFocus(gfx::NativeView view_gaining_focus) {
916 // If the preview is showing custom NTP content, don't hide it, commit it 978 // If the preview is showing custom NTP content, don't hide it, commit it
917 // (no matter where the user clicked) or try to recreate it. 979 // (no matter where the user clicked) or try to recreate it.
918 if (model_.mode().is_ntp()) 980 if (model_.mode().is_ntp())
919 return; 981 return;
920 982
921 // If the preview is not showing at all, recreate it if it's stale. 983 // If the preview is not showing at all, recreate it if it's stale.
922 if (model_.mode().is_default()) { 984 if (model_.mode().is_default()) {
923 OnStaleLoader(); 985 OnStaleOverlay();
924 return; 986 return;
925 } 987 }
926 988
927 // The preview is showing search suggestions. If GetPreviewContents() is NULL, 989 // The preview is showing search suggestions. If GetPreviewContents() is NULL,
928 // we are in the commit path. Don't do anything. 990 // we are in the commit path. Don't do anything.
929 if (!GetPreviewContents()) 991 if (!GetPreviewContents())
930 return; 992 return;
931 993
932 #if defined(OS_MACOSX) 994 #if defined(OS_MACOSX)
933 // TODO(sreeram): See if Mac really needs this special treatment. 995 // TODO(sreeram): See if Mac really needs this special treatment.
934 if (!loader_->is_pointer_down_from_activate()) 996 if (!overlay_->is_pointer_down_from_activate())
935 HideLoader(); 997 HideOverlay();
936 #else 998 #else
937 if (IsViewInContents(GetViewGainingFocus(view_gaining_focus), 999 if (IsViewInContents(GetViewGainingFocus(view_gaining_focus),
938 loader_->contents())) 1000 overlay_->contents()))
939 CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); 1001 CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST);
940 else 1002 else
941 HideLoader(); 1003 HideOverlay();
942 #endif 1004 #endif
943 } 1005 }
944 1006
945 void InstantController::NavigateToURL(const GURL& url, 1007 void InstantController::NavigateToURL(const GURL& url,
946 content::PageTransition transition) { 1008 content::PageTransition transition) {
947 if (!extended_enabled_) 1009 if (!extended_enabled_)
948 return; 1010 return;
949 if (loader_) 1011 if (overlay_)
950 HideLoader(); 1012 HideOverlay();
951 browser_->OpenURLInCurrentTab(url, transition); 1013 browser_->OpenURLInCurrentTab(url, transition);
952 } 1014 }
953 1015
954 bool InstantController::ResetLoader(const TemplateURL* template_url, 1016 bool InstantController::ResetOverlay(const TemplateURL* template_url,
955 const content::WebContents* active_tab, 1017 const content::WebContents* active_tab,
956 bool fallback_to_local) { 1018 bool fallback_to_local) {
957 std::string instant_url; 1019 std::string instant_url;
958 if (!GetInstantURL(template_url, &instant_url)) { 1020 if (!GetInstantURL(template_url, &instant_url)) {
959 if (!fallback_to_local || !extended_enabled_) 1021 if (!fallback_to_local || !extended_enabled_)
960 return false; 1022 return false;
961 1023
962 // If we are in extended mode, fallback to the local popup. 1024 // If we are in extended mode, fallback to the local popup.
963 instant_url = kLocalOmniboxPopupURL; 1025 instant_url = kLocalOmniboxPopupURL;
964 } 1026 }
965 1027
966 if (loader_ && loader_->instant_url() == instant_url) 1028 if (overlay_ && overlay_->instant_url() == instant_url)
967 return true; 1029 return true;
968 1030
969 HideInternal(); 1031 HideInternal();
970 loader_.reset(new InstantLoader(this, instant_url)); 1032 overlay_.reset(new InstantOverlay(this, instant_url));
971 loader_->InitContents(active_tab); 1033 overlay_->InitContents(browser_->profile(), active_tab);
972 1034
973 // Ensure the searchbox API has the correct initial state. 1035 // Ensure the searchbox API has the correct initial state.
974 if (extended_enabled_) { 1036 if (extended_enabled_) {
975 browser_->UpdateThemeInfoForPreview(); 1037 browser_->UpdateThemeInfoForPreview();
976 loader_->SetDisplayInstantResults(instant_enabled_); 1038 overlay_->SetDisplayInstantResults(instant_enabled_);
977 loader_->SearchModeChanged(search_mode_); 1039 overlay_->SearchModeChanged(search_mode_);
978 loader_->KeyCaptureChanged(omnibox_focus_state_ == OMNIBOX_FOCUS_INVISIBLE); 1040 overlay_->KeyCaptureChanged(
979 loader_->SetMarginSize(start_margin_, end_margin_); 1041 omnibox_focus_state_ == OMNIBOX_FOCUS_INVISIBLE);
1042 overlay_->SetMarginSize(start_margin_, end_margin_);
980 } 1043 }
981 1044
982 // Restart the stale loader timer. 1045 // Restart the stale overlay timer.
983 stale_loader_timer_.Start(FROM_HERE, 1046 stale_overlay_timer_.Start(FROM_HERE,
984 base::TimeDelta::FromMilliseconds(kStaleLoaderTimeoutMS), this, 1047 base::TimeDelta::FromMilliseconds(kStalePageTimeoutMS), this,
985 &InstantController::OnStaleLoader); 1048 &InstantController::OnStaleOverlay);
986 1049
987 return true; 1050 return true;
988 } 1051 }
989 1052
990 bool InstantController::CreateDefaultLoader() { 1053 bool InstantController::ResetNTP() {
991 // If there's no active tab, the browser is closing. 1054 const TemplateURL* template_url = TemplateURLServiceFactory::GetForProfile(
1055 browser_->profile())->GetDefaultSearchProvider();
1056 std::string instant_url;
1057 if (!GetInstantURL(template_url, &instant_url))
1058 return false;
1059
1060 ntp_.reset(new InstantNTP(this, instant_url));
1061 ntp_->InitContents(browser_->profile(), browser_->GetActiveWebContents());
1062
1063 // Ensure the searchbox API has the correct initial state.
1064 if (extended_enabled_) {
1065 browser_->UpdateThemeInfoForPreview();
1066 ntp_->SetDisplayInstantResults(instant_enabled_);
1067 ntp_->SetMarginSize(start_margin_, end_margin_);
1068 }
1069
1070 // Restart the stale NTP timer.
1071 stale_ntp_timer_.Start(FROM_HERE,
1072 base::TimeDelta::FromMilliseconds(kStalePageTimeoutMS), this,
1073 &InstantController::OnStaleNTP);
1074
1075 return true;
1076 }
1077
1078 bool InstantController::CreateDefaultOverlay() {
1079 // If there's no active tab, the browser is opening or closing.
992 const content::WebContents* active_tab = browser_->GetActiveWebContents(); 1080 const content::WebContents* active_tab = browser_->GetActiveWebContents();
993 if (!active_tab) 1081 if (!active_tab)
994 return false; 1082 return false;
995 1083
996 const TemplateURL* template_url = TemplateURLServiceFactory::GetForProfile( 1084 const TemplateURL* template_url = TemplateURLServiceFactory::GetForProfile(
997 Profile::FromBrowserContext(active_tab->GetBrowserContext()))-> 1085 Profile::FromBrowserContext(active_tab->GetBrowserContext()))->
998 GetDefaultSearchProvider(); 1086 GetDefaultSearchProvider();
999 1087
1000 return ResetLoader(template_url, active_tab, true); 1088 return ResetOverlay(template_url, active_tab, true);
1001 } 1089 }
1002 1090
1003 void InstantController::OnStaleLoader() { 1091 void InstantController::OnStaleOverlay() {
1004 // The local popup is never stale. 1092 // The local popup is never stale.
1005 if (loader_ && loader_->IsUsingLocalPreview()) 1093 if (overlay_ && overlay_->IsUsingLocalPreview())
1006 return; 1094 return;
1007 1095
1008 // If the preview is showing or the omnibox has focus, don't delete the 1096 // If the preview is showing or the omnibox has focus, don't delete the
1009 // loader. It will get refreshed the next time the preview is hidden or the 1097 // overlay. It will get refreshed the next time the preview is hidden or the
1010 // omnibox loses focus. 1098 // omnibox loses focus.
1011 if (!stale_loader_timer_.IsRunning() && 1099 if (!stale_overlay_timer_.IsRunning() &&
1012 omnibox_focus_state_ == OMNIBOX_FOCUS_NONE && 1100 omnibox_focus_state_ == OMNIBOX_FOCUS_NONE &&
1013 model_.mode().is_default()) { 1101 model_.mode().is_default()) {
1014 loader_.reset(); 1102 overlay_.reset();
1015 CreateDefaultLoader(); 1103 CreateDefaultOverlay();
1104 }
1105 }
1106
1107 void InstantController::OnStaleNTP() {
1108 if (!stale_ntp_timer_.IsRunning()) {
1109 ntp_.reset();
1110 ResetNTP();
1016 } 1111 }
1017 } 1112 }
1018 1113
1019 void InstantController::ResetInstantTab() { 1114 void InstantController::ResetInstantTab() {
1020 // Do not wire up the InstantTab if instant should only use local previews, to 1115 // Do not wire up the InstantTab if instant should only use local previews, to
1021 // prevent it from sending data to the page. 1116 // prevent it from sending data to the page.
1022 if (search_mode_.is_origin_search() && !use_local_preview_only_) { 1117 if (!search_mode_.is_origin_default() && !use_local_preview_only_) {
1023 content::WebContents* active_tab = browser_->GetActiveWebContents(); 1118 content::WebContents* active_tab = browser_->GetActiveWebContents();
1024 if (!instant_tab_ || active_tab != instant_tab_->contents()) { 1119 if (!instant_tab_ || active_tab != instant_tab_->contents()) {
1025 instant_tab_.reset(new InstantTab(this, active_tab)); 1120 instant_tab_.reset(new InstantTab(this, active_tab));
1026 instant_tab_->Init(); 1121 instant_tab_->Init();
1027 instant_tab_->SetDisplayInstantResults(instant_enabled_); 1122 instant_tab_->SetDisplayInstantResults(instant_enabled_);
1028 instant_tab_->SetMarginSize(start_margin_, end_margin_); 1123 instant_tab_->SetMarginSize(start_margin_, end_margin_);
1124 instant_tab_->KeyCaptureChanged(
1125 omnibox_focus_state_ == OMNIBOX_FOCUS_INVISIBLE);
1029 } 1126 }
1030 1127
1031 // Hide the |loader_| since we are now using |instant_tab_| instead. 1128 // Hide the |overlay_| since we are now using |instant_tab_| instead.
1032 HideLoader(); 1129 HideOverlay();
1033 } else { 1130 } else {
1034 instant_tab_.reset(); 1131 instant_tab_.reset();
1035 } 1132 }
1036 } 1133 }
1037 1134
1038 bool InstantController::ResetLoaderForMatch(const AutocompleteMatch& match) { 1135 bool InstantController::ResetOverlayForMatch(const AutocompleteMatch& match) {
1039 // If we are on a search results page, we'll use that instead of a loader. 1136 // If we are on a search results page, we'll use that instead of a overlay.
1040 // TODO(sreeram): If |instant_tab_|'s URL is not the same as the instant_url 1137 // TODO(sreeram): If |instant_tab_|'s URL is not the same as the instant_url
1041 // of |match|, we shouldn't use the committed tab. 1138 // of |match|, we shouldn't use the committed tab.
1042 if (instant_tab_) 1139 if (instant_tab_)
1043 return true; 1140 return true;
1044 1141
1045 // If there's no active tab, the browser is closing. 1142 // If there's no active tab, the browser is closing.
1046 const content::WebContents* active_tab = browser_->GetActiveWebContents(); 1143 const content::WebContents* active_tab = browser_->GetActiveWebContents();
1047 if (!active_tab) 1144 if (!active_tab)
1048 return false; 1145 return false;
1049 1146
1050 // Try to create a loader for the instant_url in the TemplateURL of |match|. 1147 // Try to create a overlay for the instant_url in the TemplateURL of |match|.
1051 // Do not fallback to the local preview because if the keyword specific 1148 // Do not fallback to the local preview because if the keyword specific
1052 // instant URL fails, we want to first try the default instant URL which 1149 // instant URL fails, we want to first try the default instant URL which
1053 // happens in the CreateDefaultLoader call below. 1150 // happens in the CreateDefaultOverlay call below.
1054 const TemplateURL* template_url = match.GetTemplateURL( 1151 const TemplateURL* template_url = match.GetTemplateURL(
1055 Profile::FromBrowserContext(active_tab->GetBrowserContext()), false); 1152 Profile::FromBrowserContext(active_tab->GetBrowserContext()), false);
1056 if (ResetLoader(template_url, active_tab, false)) 1153 if (ResetOverlay(template_url, active_tab, false))
1057 return true; 1154 return true;
1058 1155
1059 // In non-extended mode, stop if we couldn't get a loader for the |match|. 1156 // In non-extended mode, stop if we couldn't get a overlay for the |match|.
1060 if (!extended_enabled_) 1157 if (!extended_enabled_)
1061 return false; 1158 return false;
1062 1159
1063 // If the match is a query, it is for a non-Instant search engine; stop. 1160 // If the match is a query, it is for a non-Instant search engine; stop.
1064 if (last_match_was_search_) 1161 if (last_match_was_search_)
1065 return false; 1162 return false;
1066 1163
1067 // The match is a URL, or a blank query. Try the default search engine. 1164 // The match is a URL, or a blank query. Try the default search engine.
1068 return CreateDefaultLoader(); 1165 return CreateDefaultOverlay();
1069 } 1166 }
1070 1167
1071 void InstantController::HideLoader() { 1168 void InstantController::HideOverlay() {
1072 HideInternal(); 1169 HideInternal();
1073 OnStaleLoader(); 1170 OnStaleOverlay();
1074 } 1171 }
1075 1172
1076 void InstantController::HideInternal() { 1173 void InstantController::HideInternal() {
1077 DVLOG(1) << "Hide"; 1174 DVLOG(1) << "Hide";
1078 1175
1079 // If GetPreviewContents() returns NULL, either we're already in the desired 1176 // If GetPreviewContents() returns NULL, either we're already in the desired
1080 // MODE_DEFAULT state, or we're in the commit path. For the latter, don't 1177 // MODE_DEFAULT state, or we're in the commit path. For the latter, don't
1081 // change the state just yet; else we may hide the preview unnecessarily. 1178 // change the state just yet; else we may hide the preview unnecessarily.
1082 // Instead, the state will be set correctly after the commit is done. 1179 // Instead, the state will be set correctly after the commit is done.
1083 if (GetPreviewContents()) { 1180 if (GetPreviewContents()) {
1084 model_.SetPreviewState(chrome::search::Mode(), 0, INSTANT_SIZE_PERCENT); 1181 model_.SetPreviewState(chrome::search::Mode(), 0, INSTANT_SIZE_PERCENT);
1085 allow_preview_to_show_search_suggestions_ = false; 1182 allow_preview_to_show_search_suggestions_ = false;
1086 1183
1087 // Send a message asking the preview to clear out old results. 1184 // Send a message asking the preview to clear out old results.
1088 loader_->Update(string16(), 0, 0, true); 1185 overlay_->Update(string16(), 0, 0, true);
1089 } 1186 }
1090 1187
1091 // Clear the first interaction timestamp for later use. 1188 // Clear the first interaction timestamp for later use.
1092 first_interaction_time_ = base::Time(); 1189 first_interaction_time_ = base::Time();
1093 } 1190 }
1094 1191
1095 void InstantController::ShowLoader(InstantShownReason reason, 1192 void InstantController::ShowOverlay(InstantShownReason reason,
1096 int height, 1193 int height,
1097 InstantSizeUnits units) { 1194 InstantSizeUnits units) {
1098 // If we are on a committed search results page, the |loader_| is not in use. 1195 // If we are on a committed search results page, the |overlay_| is not in use.
1099 if (instant_tab_) 1196 if (instant_tab_)
1100 return; 1197 return;
1101 1198
1102 DVLOG(1) << "Show: reason=" << reason << " height=" << height << " units=" 1199 DVLOG(1) << "Show: reason=" << reason << " height=" << height << " units="
1103 << units; 1200 << units;
1104 1201
1105 // Must be on NTP to show NTP content. 1202 // INSTANT_SHOWN_CUSTOM_NTP_CONTENT is no longer supported.
1106 if (reason == INSTANT_SHOWN_CUSTOM_NTP_CONTENT && !search_mode_.is_ntp()) 1203 // TODO(samarth): remove once the server has been updated.
1204 if (reason == INSTANT_SHOWN_CUSTOM_NTP_CONTENT)
1107 return; 1205 return;
1108 1206
1109 // Must have updated omnibox after the last HideLoader() to show suggestions. 1207 // Must have updated omnibox after the last HideOverlay() to show suggestions.
1110 if ((reason == INSTANT_SHOWN_QUERY_SUGGESTIONS || 1208 if ((reason == INSTANT_SHOWN_QUERY_SUGGESTIONS ||
1111 reason == INSTANT_SHOWN_CLICKED_QUERY_SUGGESTION) && 1209 reason == INSTANT_SHOWN_CLICKED_QUERY_SUGGESTION) &&
1112 !allow_preview_to_show_search_suggestions_) 1210 !allow_preview_to_show_search_suggestions_)
1113 return; 1211 return;
1114 1212
1115 // The page is trying to hide itself. Hide explicitly (i.e., don't use 1213 // The page is trying to hide itself. Hide explicitly (i.e., don't use
1116 // HideLoader()) so that it can change its mind. 1214 // HideOverlay()) so that it can change its mind.
1117 if (height == 0) { 1215 if (height == 0) {
1118 model_.SetPreviewState(chrome::search::Mode(), 0, INSTANT_SIZE_PERCENT); 1216 model_.SetPreviewState(chrome::search::Mode(), 0, INSTANT_SIZE_PERCENT);
1119 return; 1217 return;
1120 } 1218 }
1121 1219
1122 // If the preview is being shown for the first time since the user started 1220 // If the preview is being shown for the first time since the user started
1123 // typing, record a histogram value. 1221 // typing, record a histogram value.
1124 if (!first_interaction_time_.is_null() && model_.mode().is_default()) { 1222 if (!first_interaction_time_.is_null() && model_.mode().is_default()) {
1125 base::TimeDelta delta = base::Time::Now() - first_interaction_time_; 1223 base::TimeDelta delta = base::Time::Now() - first_interaction_time_;
1126 UMA_HISTOGRAM_TIMES("Instant.TimeToFirstShow", delta); 1224 UMA_HISTOGRAM_TIMES("Instant.TimeToFirstShow", delta);
1127 } 1225 }
1128 1226
1129 // Show at 100% height except in the following cases: 1227 // Show at 100% height except in the following cases:
1130 // - The local omnibox popup is being loaded. 1228 // - The local omnibox popup is being loaded.
1131 // - Instant is disabled. The page needs to be able to show only a dropdown. 1229 // - Instant is disabled. The page needs to be able to show only a dropdown.
1132 // - The page wants to show custom NTP content. 1230 // - The page wants to show custom NTP content.
1133 // - The page is over a website other than search or an NTP, and is not 1231 // - The page is over a website other than search or an NTP, and is not
1134 // already showing at 100% height. 1232 // already showing at 100% height.
1135 if (loader_->IsUsingLocalPreview() || !instant_enabled_ || 1233 if (overlay_->IsUsingLocalPreview() || !instant_enabled_ ||
1136 reason == INSTANT_SHOWN_CUSTOM_NTP_CONTENT || 1234 reason == INSTANT_SHOWN_CUSTOM_NTP_CONTENT ||
1137 (search_mode_.is_origin_default() && !IsFullHeight(model_))) 1235 (search_mode_.is_origin_default() && !IsFullHeight(model_)))
1138 model_.SetPreviewState(search_mode_, height, units); 1236 model_.SetPreviewState(search_mode_, height, units);
1139 else 1237 else
1140 model_.SetPreviewState(search_mode_, 100, INSTANT_SIZE_PERCENT); 1238 model_.SetPreviewState(search_mode_, 100, INSTANT_SIZE_PERCENT);
1141 1239
1142 // If the user clicked on a query suggestion, also go ahead and commit the 1240 // If the user clicked on a query suggestion, also go ahead and commit the
1143 // overlay. This is necessary because if the overlay was partially visible 1241 // overlay. This is necessary because if the overlay was partially visible
1144 // when the suggestion was clicked, the click itself would not commit the 1242 // when the suggestion was clicked, the click itself would not commit the
1145 // overlay (because we're not full height). 1243 // overlay (because we're not full height).
1146 if (reason == INSTANT_SHOWN_CLICKED_QUERY_SUGGESTION) 1244 if (reason == INSTANT_SHOWN_CLICKED_QUERY_SUGGESTION)
1147 CommitIfPossible(INSTANT_COMMIT_CLICKED_QUERY_SUGGESTION); 1245 CommitIfPossible(INSTANT_COMMIT_CLICKED_QUERY_SUGGESTION);
1148 } 1246 }
1149 1247
1150 void InstantController::SendPopupBoundsToPage() { 1248 void InstantController::SendPopupBoundsToPage() {
1151 if (last_popup_bounds_ == popup_bounds_ || !loader_ || 1249 if (last_popup_bounds_ == popup_bounds_ || !overlay_ ||
1152 loader_->is_pointer_down_from_activate()) 1250 overlay_->is_pointer_down_from_activate())
1153 return; 1251 return;
1154 1252
1155 last_popup_bounds_ = popup_bounds_; 1253 last_popup_bounds_ = popup_bounds_;
1156 gfx::Rect preview_bounds = browser_->GetInstantBounds(); 1254 gfx::Rect preview_bounds = browser_->GetInstantBounds();
1157 gfx::Rect intersection = gfx::IntersectRects(popup_bounds_, preview_bounds); 1255 gfx::Rect intersection = gfx::IntersectRects(popup_bounds_, preview_bounds);
1158 1256
1159 // Translate into window coordinates. 1257 // Translate into window coordinates.
1160 if (!intersection.IsEmpty()) { 1258 if (!intersection.IsEmpty()) {
1161 intersection.Offset(-preview_bounds.origin().x(), 1259 intersection.Offset(-preview_bounds.origin().x(),
1162 -preview_bounds.origin().y()); 1260 -preview_bounds.origin().y());
1163 } 1261 }
1164 1262
1165 // In the current Chrome UI, these must always be true so they sanity check 1263 // In the current Chrome UI, these must always be true so they sanity check
1166 // the above operations. In a future UI, these may be removed or adjusted. 1264 // the above operations. In a future UI, these may be removed or adjusted.
1167 // There is no point in sanity-checking |intersection.y()| because the omnibox 1265 // There is no point in sanity-checking |intersection.y()| because the omnibox
1168 // can be placed anywhere vertically relative to the preview (for example, in 1266 // can be placed anywhere vertically relative to the preview (for example, in
1169 // Mac fullscreen mode, the omnibox is fully enclosed by the preview bounds). 1267 // Mac fullscreen mode, the omnibox is fully enclosed by the preview bounds).
1170 DCHECK_LE(0, intersection.x()); 1268 DCHECK_LE(0, intersection.x());
1171 DCHECK_LE(0, intersection.width()); 1269 DCHECK_LE(0, intersection.width());
1172 DCHECK_LE(0, intersection.height()); 1270 DCHECK_LE(0, intersection.height());
1173 1271
1174 loader_->SetPopupBounds(intersection); 1272 overlay_->SetPopupBounds(intersection);
1175 } 1273 }
1176 1274
1177 bool InstantController::GetInstantURL(const TemplateURL* template_url, 1275 bool InstantController::GetInstantURL(const TemplateURL* template_url,
1178 std::string* instant_url) const { 1276 std::string* instant_url) const {
1179 if (extended_enabled_ && use_local_preview_only_) { 1277 if (extended_enabled_ && use_local_preview_only_) {
1180 *instant_url = kLocalOmniboxPopupURL; 1278 *instant_url = kLocalOmniboxPopupURL;
1181 return true; 1279 return true;
1182 } 1280 }
1183 1281
1184 CommandLine* command_line = CommandLine::ForCurrentProcess(); 1282 CommandLine* command_line = CommandLine::ForCurrentProcess();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 std::map<std::string, int>::const_iterator iter = 1323 std::map<std::string, int>::const_iterator iter =
1226 blacklisted_urls_.find(*instant_url); 1324 blacklisted_urls_.find(*instant_url);
1227 if (iter != blacklisted_urls_.end() && 1325 if (iter != blacklisted_urls_.end() &&
1228 iter->second > kMaxInstantSupportFailures) { 1326 iter->second > kMaxInstantSupportFailures) {
1229 RecordEventHistogram(INSTANT_CONTROLLER_EVENT_URL_BLOCKED_BY_BLACKLIST); 1327 RecordEventHistogram(INSTANT_CONTROLLER_EVENT_URL_BLOCKED_BY_BLACKLIST);
1230 return false; 1328 return false;
1231 } 1329 }
1232 1330
1233 return true; 1331 return true;
1234 } 1332 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698