| Index: chrome/browser/instant/instant_overlay.cc | 
| diff --git a/chrome/browser/instant/instant_overlay.cc b/chrome/browser/instant/instant_overlay.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..ebe1a4a09816b6cf8c1713a2c05f112325e78782 | 
| --- /dev/null | 
| +++ b/chrome/browser/instant/instant_overlay.cc | 
| @@ -0,0 +1,154 @@ | 
| +// Copyright 2013 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "chrome/browser/instant/instant_overlay.h" | 
| + | 
| +#include "base/auto_reset.h" | 
| +#include "base/supports_user_data.h" | 
| +#include "content/public/browser/web_contents.h" | 
| + | 
| +namespace { | 
| + | 
| +int kUserDataKey; | 
| + | 
| +class InstantOverlayUserData : public base::SupportsUserData::Data { | 
| + public: | 
| +  explicit InstantOverlayUserData(InstantOverlay* overlay) | 
| +      : overlay_(overlay) {} | 
| + | 
| +  virtual InstantOverlay* overlay() const { return overlay_; } | 
| + | 
| + private: | 
| +  ~InstantOverlayUserData() {} | 
| + | 
| +  InstantOverlay* const overlay_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(InstantOverlayUserData); | 
| +}; | 
| + | 
| +}  // namespace | 
| + | 
| +// static | 
| +InstantOverlay* InstantOverlay::FromWebContents( | 
| +    const content::WebContents* web_contents) { | 
| +  InstantOverlayUserData* data = static_cast<InstantOverlayUserData*>( | 
| +      web_contents->GetUserData(&kUserDataKey)); | 
| +  return data ? data->overlay() : NULL; | 
| +} | 
| + | 
| +InstantOverlay::InstantOverlay(InstantController* controller, | 
| +                               const std::string& instant_url) | 
| +    : InstantPage(controller), | 
| +      loader_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 
| +      instant_url_(instant_url), | 
| +      is_stale_(false), | 
| +      is_pointer_down_from_activate_(false) { | 
| +} | 
| + | 
| +InstantOverlay::~InstantOverlay() { | 
| +} | 
| + | 
| +void InstantOverlay::InitContents(Profile* profile, | 
| +                                  const content::WebContents* active_tab) { | 
| +  loader_.Init(GURL(instant_url_), profile, active_tab, | 
| +               base::Bind(&InstantOverlay::HandleStalePage, | 
| +                           base::Unretained(this))); | 
| +  SetContents(loader_.contents()); | 
| +  contents()->SetUserData(&kUserDataKey, new InstantOverlayUserData(this)); | 
| +  loader_.Load(); | 
| +} | 
| + | 
| +scoped_ptr<content::WebContents> InstantOverlay::ReleaseContents() { | 
| +  contents()->RemoveUserData(&kUserDataKey); | 
| +  SetContents(NULL); | 
| +  return loader_.ReleaseContents(); | 
| +} | 
| + | 
| +void InstantOverlay::DidNavigate( | 
| +    const history::HistoryAddPageArgs& add_page_args) { | 
| +  last_navigation_ = add_page_args; | 
| +} | 
| + | 
| +bool InstantOverlay::IsUsingLocalPreview() const { | 
| +  return instant_url_ == InstantController::kLocalOmniboxPopupURL; | 
| +} | 
| + | 
| +void InstantOverlay::Update(const string16& text, | 
| +                            size_t selection_start, | 
| +                            size_t selection_end, | 
| +                            bool verbatim) { | 
| +  last_navigation_ = history::HistoryAddPageArgs(); | 
| +  InstantPage::Update(text, selection_start, selection_end, verbatim); | 
| +} | 
| + | 
| +bool InstantOverlay::ShouldProcessRenderViewCreated() { | 
| +  return true; | 
| +} | 
| + | 
| +bool InstantOverlay::ShouldProcessRenderViewGone() { | 
| +  return true; | 
| +} | 
| + | 
| +bool InstantOverlay::ShouldProcessAboutToNavigateMainFrame() { | 
| +  return true; | 
| +} | 
| + | 
| +bool InstantOverlay::ShouldProcessSetSuggestions() { | 
| +  return true; | 
| +} | 
| + | 
| +bool InstantOverlay::ShouldProcessShowInstantPreview() { | 
| +  return true; | 
| +} | 
| + | 
| +bool InstantOverlay::ShouldProcessNavigateToURL() { | 
| +  return true; | 
| +} | 
| + | 
| +void InstantOverlay::OnSwappedContents() { | 
| +  contents()->RemoveUserData(&kUserDataKey); | 
| +  SetContents(loader_.contents()); | 
| +  contents()->SetUserData(&kUserDataKey, new InstantOverlayUserData(this)); | 
| +  instant_controller()->SwappedOverlayContents(); | 
| +} | 
| + | 
| +void InstantOverlay::OnFocus() { | 
| +  // The preview is getting focus. Equivalent to it being clicked. | 
| +  base::AutoReset<bool> reset(&is_pointer_down_from_activate_, true); | 
| +  instant_controller()->FocusedOverlayContents(); | 
| +} | 
| + | 
| +void InstantOverlay::OnMouseDown() { | 
| +  is_pointer_down_from_activate_ = true; | 
| +} | 
| + | 
| +void InstantOverlay::OnMouseUp() { | 
| +  if (is_pointer_down_from_activate_) { | 
| +    is_pointer_down_from_activate_ = false; | 
| +    instant_controller()->CommitIfPossible(INSTANT_COMMIT_FOCUS_LOST); | 
| +  } | 
| +} | 
| + | 
| +content::WebContents* InstantOverlay::OpenURLFromTab( | 
| +    content::WebContents* source, | 
| +    const content::OpenURLParams& params) { | 
| +  // We will allow the navigate to continue if we are able to commit the | 
| +  // overlay. | 
| +  // | 
| +  // First, cache the overlay contents since committing it will cause the | 
| +  // contents to be released (and be set to NULL). | 
| +  content::WebContents* overlay = contents(); | 
| +  if (instant_controller()->CommitIfPossible(INSTANT_COMMIT_NAVIGATED)) { | 
| +    // If the commit was successful, the overlay's delegate should be the tab | 
| +    // strip, which will be able to handle the navigation. | 
| +    DCHECK_NE(&loader_, overlay->GetDelegate()); | 
| +    return overlay->GetDelegate()->OpenURLFromTab(source, params); | 
| +  } | 
| +  return NULL; | 
| +} | 
| + | 
| +void InstantOverlay::HandleStalePage() { | 
| +  is_stale_ = true; | 
| +  instant_controller()->ReloadOverlayIfStale(); | 
| +} | 
|  |