Index: chrome/browser/first_run/first_run.cc |
diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc |
index 255a6da4c41e3ff96fac76976fc0431d87c43e9b..d93d65aa75896dd5906587401c02285571385de7 100644 |
--- a/chrome/browser/first_run/first_run.cc |
+++ b/chrome/browser/first_run/first_run.cc |
@@ -10,10 +10,12 @@ |
#include "base/compiler_specific.h" |
#include "base/file_util.h" |
#include "base/lazy_instance.h" |
+#include "base/message_loop.h" |
#include "base/metrics/histogram.h" |
#include "base/path_service.h" |
#include "base/prefs/pref_service.h" |
#include "base/stringprintf.h" |
+#include "base/time.h" |
#include "base/utf_string_conversions.h" |
#include "build/build_config.h" |
#include "chrome/browser/browser_process.h" |
@@ -35,6 +37,7 @@ |
#include "chrome/browser/shell_integration.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_finder.h" |
+#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/global_error/global_error_service.h" |
#include "chrome/browser/ui/global_error/global_error_service_factory.h" |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
@@ -61,6 +64,9 @@ using content::UserMetricsAction; |
namespace { |
+// How long to delay showing the first run bubble (in milliseconds). |
+const int kFirstRunBubbleDelayMs = 200; |
+ |
// Flags for functions of similar name. |
bool should_show_welcome_page_ = false; |
bool should_do_autofill_personal_data_manager_first_run_ = false; |
@@ -512,12 +518,16 @@ void FirstRunBubbleLauncher::ShowFirstRunBubbleSoon() { |
new FirstRunBubbleLauncher(); |
} |
-FirstRunBubbleLauncher::FirstRunBubbleLauncher() { |
+FirstRunBubbleLauncher::FirstRunBubbleLauncher() |
+ : browser_(NULL) { |
+ BrowserList::AddObserver(this); |
registrar_.Add(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
content::NotificationService::AllSources()); |
} |
-FirstRunBubbleLauncher::~FirstRunBubbleLauncher() {} |
+FirstRunBubbleLauncher::~FirstRunBubbleLauncher() { |
+ BrowserList::RemoveObserver(this); |
+} |
void FirstRunBubbleLauncher::Observe( |
int type, |
@@ -570,12 +580,37 @@ void FirstRunBubbleLauncher::Observe( |
if (global_error_service->GetFirstGlobalErrorWithBubbleView() != NULL) |
return; |
+ // Make sure we don't get notified again after resetting the |
+ // kShowFirstRunBubbleOption preference below. |
+ registrar_.Remove(this, content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
+ content::NotificationService::AllSources()); |
+ |
// Reset the preference and notifications to avoid showing the bubble again. |
prefs->SetInteger(prefs::kShowFirstRunBubbleOption, |
FIRST_RUN_BUBBLE_DONT_SHOW); |
+ // Show the bubble soon. |
+ browser_ = browser; |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &FirstRunBubbleLauncher::DoShowFirstRunBubble, |
+ AsWeakPtr()), |
+ base::TimeDelta::FromMilliseconds(kFirstRunBubbleDelayMs)); |
+} |
+ |
+void FirstRunBubbleLauncher::OnBrowserRemoved(Browser* browser) { |
+ if (browser_ == browser) { |
+ // Destroy this bubble launcher. |
+ delete this; |
+ } |
+} |
+ |
+void FirstRunBubbleLauncher::DoShowFirstRunBubble() { |
+ DCHECK(browser_); |
+ |
// Show the bubble now and destroy this bubble launcher. |
- browser->ShowFirstRunBubble(); |
+ browser_->ShowFirstRunBubble(); |
delete this; |
} |