| Index: chrome/browser/google/google_url_tracker.cc
|
| ===================================================================
|
| --- chrome/browser/google/google_url_tracker.cc (revision 134398)
|
| +++ chrome/browser/google/google_url_tracker.cc (working copy)
|
| @@ -86,11 +86,24 @@
|
| }
|
|
|
| void GoogleURLTrackerInfoBarDelegate::Show() {
|
| - owner()->AddInfoBar(this);
|
| showing_ = true;
|
| + owner()->AddInfoBar(this); // May delete |this| on failure!
|
| }
|
|
|
| void GoogleURLTrackerInfoBarDelegate::Close(bool redo_search) {
|
| + if (redo_search) {
|
| + // Re-do the user's search on the new domain.
|
| + url_canon::Replacements<char> replacements;
|
| + const std::string& host(new_google_url_.host());
|
| + replacements.SetHost(host.data(), url_parse::Component(0, host.length()));
|
| + GURL new_search_url(search_url_.ReplaceComponents(replacements));
|
| + if (new_search_url.is_valid()) {
|
| + content::OpenURLParams params(new_search_url, content::Referrer(),
|
| + CURRENT_TAB, content::PAGE_TRANSITION_GENERATED, false);
|
| + owner()->web_contents()->OpenURL(params);
|
| + }
|
| + }
|
| +
|
| if (!showing_) {
|
| // We haven't been added to a tab, so just delete ourselves.
|
| delete this;
|
| @@ -104,29 +117,15 @@
|
| google_url_tracker_->InfoBarClosed(map_key_);
|
| google_url_tracker_ = NULL;
|
|
|
| - // If we were showing in a background tab that was then closed, we could have
|
| - // been leaked, and subsequently reached here due to
|
| - // GoogleURLTracker::CloseAllInfoBars(). In this case our owner is now NULL
|
| - // so we should just do nothing.
|
| - // TODO(pkasting): This can go away once the InfoBar ownership model is fixed
|
| - // so that infobars in background tabs don't leak on tab closure.
|
| - if (!owner())
|
| - return;
|
| -
|
| - if (redo_search) {
|
| - // Re-do the user's search on the new domain.
|
| - url_canon::Replacements<char> replacements;
|
| - const std::string& host(new_google_url_.host());
|
| - replacements.SetHost(host.data(), url_parse::Component(0, host.length()));
|
| - GURL new_search_url(search_url_.ReplaceComponents(replacements));
|
| - if (new_search_url.is_valid()) {
|
| - content::OpenURLParams params(new_search_url, content::Referrer(),
|
| - CURRENT_TAB, content::PAGE_TRANSITION_GENERATED, false);
|
| - owner()->web_contents()->OpenURL(params);
|
| - }
|
| - }
|
| -
|
| - owner()->RemoveInfoBar(this);
|
| + // If we're already animating closed, we won't have an owner. Do nothing in
|
| + // this case.
|
| + // TODO(pkasting): For now, this can also happen if we were showing in a
|
| + // background tab that was then closed, in which case we'll have leaked and
|
| + // subsequently reached here due to GoogleURLTracker::CloseAllInfoBars().
|
| + // This case will no longer happen once infobars are refactored to own their
|
| + // delegates.
|
| + if (owner())
|
| + owner()->RemoveInfoBar(this);
|
| }
|
|
|
| GoogleURLTrackerInfoBarDelegate::~GoogleURLTrackerInfoBarDelegate() {
|
|
|