Update base/timer.h code to pass through Location from call sites. (reland) original CL w/LGTMs: http://codereview.chromium.org/7812036/

Review URL: http://codereview.chromium.org/7824041

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@99409 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/system_monitor/system_monitor.cc b/base/system_monitor/system_monitor.cc
index 7b1349c..2631789a 100644
--- a/base/system_monitor/system_monitor.cc
+++ b/base/system_monitor/system_monitor.cc
@@ -27,7 +27,7 @@
 
   DCHECK(MessageLoop::current());
 #if defined(ENABLE_BATTERY_MONITORING)
-  delayed_battery_check_.Start(
+  delayed_battery_check_.Start(FROM_HERE,
       base::TimeDelta::FromMilliseconds(kDelayedBatteryCheckMs), this,
       &SystemMonitor::BatteryCheck);
 #endif  // defined(ENABLE_BATTERY_MONITORING)
diff --git a/base/timer.cc b/base/timer.cc
index ce5fab68..8c06693 100644
--- a/base/timer.cc
+++ b/base/timer.cc
@@ -21,7 +21,7 @@
   delayed_task_ = timer_task;
   delayed_task_->timer_ = this;
   MessageLoop::current()->PostDelayedTask(
-      FROM_HERE, timer_task,
+      timer_task->posted_from_, timer_task,
       static_cast<int>(timer_task->delay_.InMillisecondsRoundedUp()));
 }
 
diff --git a/base/timer.h b/base/timer.h
index 2e21582a..30cb109 100644
--- a/base/timer.h
+++ b/base/timer.h
@@ -87,9 +87,14 @@
   // We have access to the timer_ member so we can orphan this task.
   class TimerTask : public Task {
    public:
-    explicit TimerTask(TimeDelta delay) : timer_(NULL), delay_(delay) {
+    TimerTask(const tracked_objects::Location& posted_from,
+              TimeDelta delay)
+        : posted_from_(posted_from),
+          timer_(NULL),
+          delay_(delay) {
     }
     virtual ~TimerTask() {}
+    tracked_objects::Location posted_from_;
     BaseTimer_Helper* timer_;
     TimeDelta delay_;
   };
@@ -116,9 +121,12 @@
 
   // Call this method to start the timer.  It is an error to call this method
   // while the timer is already running.
-  void Start(TimeDelta delay, Receiver* receiver, ReceiverMethod method) {
+  void Start(const tracked_objects::Location& posted_from,
+             TimeDelta delay,
+             Receiver* receiver,
+             ReceiverMethod method) {
     DCHECK(!IsRunning());
-    InitiateDelayedTask(new TimerTask(delay, receiver, method));
+    InitiateDelayedTask(new TimerTask(posted_from, delay, receiver, method));
   }
 
   // Call this method to stop the timer.  It is a no-op if the timer is not
@@ -138,8 +146,11 @@
 
   class TimerTask : public BaseTimer_Helper::TimerTask {
    public:
-    TimerTask(TimeDelta delay, Receiver* receiver, ReceiverMethod method)
-        : BaseTimer_Helper::TimerTask(delay),
+    TimerTask(const tracked_objects::Location& posted_from,
+              TimeDelta delay,
+              Receiver* receiver,
+              ReceiverMethod method)
+        : BaseTimer_Helper::TimerTask(posted_from, delay),
           receiver_(receiver),
           method_(method) {
     }
@@ -162,7 +173,7 @@
     }
 
     TimerTask* Clone() const {
-      return new TimerTask(delay_, receiver_, method_);
+      return new TimerTask(posted_from_, delay_, receiver_, method_);
     }
 
    private:
@@ -221,8 +232,12 @@
  public:
   typedef void (Receiver::*ReceiverMethod)();
 
-  DelayTimer(TimeDelta delay, Receiver* receiver, ReceiverMethod method)
-      : receiver_(receiver),
+  DelayTimer(const tracked_objects::Location& posted_from,
+             TimeDelta delay,
+             Receiver* receiver,
+             ReceiverMethod method)
+      : posted_from_(posted_from),
+        receiver_(receiver),
         method_(method),
         delay_(delay) {
   }
@@ -242,7 +257,7 @@
 
     // The timer isn't running, or will expire too late, so restart it.
     timer_.Stop();
-    timer_.Start(delay, this, &DelayTimer<Receiver>::Check);
+    timer_.Start(posted_from_, delay, this, &DelayTimer<Receiver>::Check);
   }
 
   void Check() {
@@ -259,6 +274,7 @@
     (receiver_->*method_)();
   }
 
+  tracked_objects::Location posted_from_;
   Receiver *const receiver_;
   const ReceiverMethod method_;
   const TimeDelta delay_;
diff --git a/base/timer_unittest.cc b/base/timer_unittest.cc
index bb0eade8..0013bcc 100644
--- a/base/timer_unittest.cc
+++ b/base/timer_unittest.cc
@@ -19,7 +19,7 @@
         delay_ms_(milliseconds) {
   }
   void Start() {
-    timer_.Start(TimeDelta::FromMilliseconds(delay_ms_), this,
+    timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this,
                  &OneShotTimerTester::Run);
   }
  private:
@@ -39,7 +39,7 @@
       timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) {
   }
   void Start() {
-    timer_->Start(TimeDelta::FromMilliseconds(10), this,
+    timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this,
                   &OneShotSelfDeletingTimerTester::Run);
   }
  private:
@@ -59,7 +59,7 @@
   }
 
   void Start() {
-    timer_.Start(TimeDelta::FromMilliseconds(10), this,
+    timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this,
                  &RepeatingTimerTester::Run);
   }
  private:
@@ -176,7 +176,7 @@
 
   // If Delay is never called, the timer shouldn't go off.
   DelayTimerTarget target;
-  base::DelayTimer<DelayTimerTarget> timer(
+  base::DelayTimer<DelayTimerTarget> timer(FROM_HERE,
       TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
 
   bool did_run = false;
@@ -191,7 +191,7 @@
   MessageLoop loop(message_loop_type);
 
   DelayTimerTarget target;
-  base::DelayTimer<DelayTimerTarget> timer(
+  base::DelayTimer<DelayTimerTarget> timer(FROM_HERE,
       TimeDelta::FromMilliseconds(1), &target, &DelayTimerTarget::Signal);
   timer.Reset();
 
@@ -225,7 +225,7 @@
 
   // If Delay is never called, the timer shouldn't go off.
   DelayTimerTarget target;
-  base::DelayTimer<DelayTimerTarget> timer(
+  base::DelayTimer<DelayTimerTarget> timer(FROM_HERE,
       TimeDelta::FromMilliseconds(50), &target, &DelayTimerTarget::Signal);
   timer.Reset();
 
@@ -233,8 +233,8 @@
 
   base::OneShotTimer<ResetHelper> timers[20];
   for (size_t i = 0; i < arraysize(timers); ++i) {
-    timers[i].Start(TimeDelta::FromMilliseconds(i * 10), &reset_helper,
-                    &ResetHelper::Reset);
+    timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10),
+                    &reset_helper, &ResetHelper::Reset);
   }
 
   bool did_run = false;
@@ -260,7 +260,7 @@
 
   {
     base::DelayTimer<DelayTimerFatalTarget> timer(
-        TimeDelta::FromMilliseconds(50), &target,
+        FROM_HERE, TimeDelta::FromMilliseconds(50), &target,
         &DelayTimerFatalTarget::Signal);
     timer.Reset();
   }
diff --git a/chrome/browser/autocomplete/autocomplete.cc b/chrome/browser/autocomplete/autocomplete.cc
index 585fdd5..8d1a3639 100644
--- a/chrome/browser/autocomplete/autocomplete.cc
+++ b/chrome/browser/autocomplete/autocomplete.cc
@@ -1018,6 +1018,7 @@
 
 void AutocompleteController::StartExpireTimer() {
   if (result_.HasCopiedMatches())
-    expire_timer_.Start(base::TimeDelta::FromMilliseconds(kExpireTimeMS),
+    expire_timer_.Start(FROM_HERE,
+                        base::TimeDelta::FromMilliseconds(kExpireTimeMS),
                         this, &AutocompleteController::ExpireCopiedEntries);
 }
diff --git a/chrome/browser/autocomplete/search_provider.cc b/chrome/browser/autocomplete/search_provider.cc
index 11a335b..c50b8c8 100644
--- a/chrome/browser/autocomplete/search_provider.cc
+++ b/chrome/browser/autocomplete/search_provider.cc
@@ -365,7 +365,8 @@
   // Kick off a timer that will start the URL fetch if it completes before
   // the user types another character.
   int delay = query_suggest_immediately_ ? 0 : kQueryDelayMs;
-  timer_.Start(TimeDelta::FromMilliseconds(delay), this, &SearchProvider::Run);
+  timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay), this,
+               &SearchProvider::Run);
 }
 
 bool SearchProvider::IsQuerySuitableForSuggest() const {
diff --git a/chrome/browser/bookmarks/bookmark_drop_info.cc b/chrome/browser/bookmarks/bookmark_drop_info.cc
index 30d1f03..1b0b3e6 100644
--- a/chrome/browser/bookmarks/bookmark_drop_info.cc
+++ b/chrome/browser/bookmarks/bookmark_drop_info.cc
@@ -42,7 +42,7 @@
   scroll_up_ = (last_y_ <= top_margin_ + views::kAutoscrollSize);
   if (scroll_up_ || scroll_down) {
     if (!scroll_timer_.IsRunning()) {
-      scroll_timer_.Start(
+      scroll_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(views::kAutoscrollRowTimerMS),
           this,
           &BookmarkDropInfo::Scroll);
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 57fc0c4..f40047f 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -653,7 +653,7 @@
 
 #if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(OS_CHROMEOS)
 void BrowserProcessImpl::StartAutoupdateTimer() {
-  autoupdate_timer_.Start(
+  autoupdate_timer_.Start(FROM_HERE,
       base::TimeDelta::FromHours(kUpdateCheckIntervalHours),
       this,
       &BrowserProcessImpl::OnAutoupdateTimer);
diff --git a/chrome/browser/chromeos/cros/login_library.cc b/chrome/browser/chromeos/cros/login_library.cc
index af42d4ab..238b52b66 100644
--- a/chrome/browser/chromeos/cros/login_library.cc
+++ b/chrome/browser/chromeos/cros/login_library.cc
@@ -89,7 +89,7 @@
         // just kills us so settings may be lost. See http://crosbug.com/13102
         local_state_->CommitPendingWrite();
         timer_.Start(
-            base::TimeDelta::FromSeconds(3), this,
+            FROM_HERE, base::TimeDelta::FromSeconds(3), this,
             &JobRestartRequest::RestartJob);
         // Post task on file thread thus it occurs last on task queue, so it
         // would be executed after committing pending write on file thread.
diff --git a/chrome/browser/chromeos/cros/power_library.cc b/chrome/browser/chromeos/cros/power_library.cc
index a8e62dc2..721202b9 100644
--- a/chrome/browser/chromeos/cros/power_library.cc
+++ b/chrome/browser/chromeos/cros/power_library.cc
@@ -172,6 +172,7 @@
         battery_percentage_(20),
         pause_count_(0) {
     timer_.Start(
+        FROM_HERE,
         base::TimeDelta::FromMilliseconds(100),
         this,
         &PowerLibraryStubImpl::Update);
diff --git a/chrome/browser/chromeos/customization_document.cc b/chrome/browser/chromeos/customization_document.cc
index 4f944e6..bd47d4a 100644
--- a/chrome/browser/chromeos/customization_document.cc
+++ b/chrome/browser/chromeos/customization_document.cc
@@ -346,7 +346,8 @@
     NetworkLibrary* network = CrosLibrary::Get()->GetNetworkLibrary();
     if (!network->Connected() && num_retries_ < kMaxFetchRetries) {
       num_retries_++;
-      retry_timer_.Start(base::TimeDelta::FromSeconds(kRetriesDelayInSec),
+      retry_timer_.Start(FROM_HERE,
+                         base::TimeDelta::FromSeconds(kRetriesDelayInSec),
                          this, &ServicesCustomizationDocument::StartFileFetch);
       return;
     }
diff --git a/chrome/browser/chromeos/login/network_screen.cc b/chrome/browser/chromeos/login/network_screen.cc
index 7fabbb90..a860934e 100644
--- a/chrome/browser/chromeos/login/network_screen.cc
+++ b/chrome/browser/chromeos/login/network_screen.cc
@@ -170,7 +170,8 @@
 void NetworkScreen::WaitForConnection(const string16& network_id) {
   if (network_id_ != network_id || !connection_timer_.IsRunning()) {
     connection_timer_.Stop();
-    connection_timer_.Start(base::TimeDelta::FromSeconds(kConnectionTimeoutSec),
+    connection_timer_.Start(FROM_HERE,
+                            base::TimeDelta::FromSeconds(kConnectionTimeoutSec),
                             this,
                             &NetworkScreen::OnConnectionTimeout);
   }
diff --git a/chrome/browser/chromeos/login/screen_locker.cc b/chrome/browser/chromeos/login/screen_locker.cc
index fe1616b..b9d40f9 100644
--- a/chrome/browser/chromeos/login/screen_locker.cc
+++ b/chrome/browser/chromeos/login/screen_locker.cc
@@ -675,7 +675,8 @@
   explicit LockerInputEventObserver(ScreenLocker* screen_locker)
       : screen_locker_(screen_locker),
         ALLOW_THIS_IN_INITIALIZER_LIST(
-            timer_(base::TimeDelta::FromSeconds(kScreenSaverIdleTimeout), this,
+            timer_(FROM_HERE,
+                   base::TimeDelta::FromSeconds(kScreenSaverIdleTimeout), this,
                    &LockerInputEventObserver::StartScreenSaver)) {
   }
 
diff --git a/chrome/browser/chromeos/login/update_screen.cc b/chrome/browser/chromeos/login/update_screen.cc
index 8e70834a..676c22e 100644
--- a/chrome/browser/chromeos/login/update_screen.cc
+++ b/chrome/browser/chromeos/login/update_screen.cc
@@ -156,7 +156,8 @@
         actor_->ShowCurtain(false);
         VLOG(1) << "Initiate reboot after update";
         CrosLibrary::Get()->GetUpdateLibrary()->RebootAfterUpdate();
-        reboot_timer_.Start(base::TimeDelta::FromSeconds(reboot_check_delay_),
+        reboot_timer_.Start(FROM_HERE,
+                            base::TimeDelta::FromSeconds(reboot_check_delay_),
                             this,
                             &UpdateScreen::OnWaitForRebootTimeElapsed);
       } else {
diff --git a/chrome/browser/chromeos/login/web_page_screen.cc b/chrome/browser/chromeos/login/web_page_screen.cc
index 694cad7..ae5d33f1 100644
--- a/chrome/browser/chromeos/login/web_page_screen.cc
+++ b/chrome/browser/chromeos/login/web_page_screen.cc
@@ -50,7 +50,8 @@
 
 void WebPageScreen::StartTimeoutTimer() {
   StopTimeoutTimer();
-  timeout_timer_.Start(TimeDelta::FromSeconds(kNetworkTimeoutSec),
+  timeout_timer_.Start(FROM_HERE,
+                       TimeDelta::FromSeconds(kNetworkTimeoutSec),
                        this,
                        &WebPageScreen::OnNetworkTimeout);
 }
diff --git a/chrome/browser/chromeos/login/web_page_view.cc b/chrome/browser/chromeos/login/web_page_view.cc
index 7c4826d..4ce06c545 100644
--- a/chrome/browser/chromeos/login/web_page_view.cc
+++ b/chrome/browser/chromeos/login/web_page_view.cc
@@ -123,7 +123,8 @@
   connecting_label_->SetVisible(false);
   AddChildView(connecting_label_ );
 
-  start_timer_.Start(TimeDelta::FromMilliseconds(kStartDelayMs),
+  start_timer_.Start(FROM_HERE,
+                     TimeDelta::FromMilliseconds(kStartDelayMs),
                      this,
                      &WebPageView::ShowWaitingControls);
 }
@@ -150,7 +151,8 @@
   // TODO(nkostylev): Show throbber as an overlay until page has been rendered.
   start_timer_.Stop();
   if (!stop_timer_.IsRunning()) {
-    stop_timer_.Start(TimeDelta::FromMilliseconds(kStopDelayMs),
+    stop_timer_.Start(FROM_HERE,
+                      TimeDelta::FromMilliseconds(kStopDelayMs),
                       this,
                       &WebPageView::ShowRenderedPage);
   }
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index a2445314..5fc5e5e 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -502,6 +502,7 @@
 
   if (use_smoothing) {
     smooth_show_timer_.Start(
+        FROM_HERE,
         base::TimeDelta::FromMilliseconds(kShowDelayMs),
         this,
         &WizardController::ShowCurrentScreen);
diff --git a/chrome/browser/chromeos/setting_level_bubble.cc b/chrome/browser/chromeos/setting_level_bubble.cc
index 116c4457..7a35a99c 100644
--- a/chrome/browser/chromeos/setting_level_bubble.cc
+++ b/chrome/browser/chromeos/setting_level_bubble.cc
@@ -148,7 +148,8 @@
     view_->SetEnabled(enabled);
   }
 
-  hide_timer_.Start(base::TimeDelta::FromMilliseconds(kBubbleShowTimeoutMs),
+  hide_timer_.Start(FROM_HERE,
+                    base::TimeDelta::FromMilliseconds(kBubbleShowTimeoutMs),
                     this, &SettingLevelBubble::OnHideTimeout);
 }
 
@@ -232,7 +233,8 @@
     target_time_ = now + TimeDelta::FromMilliseconds(duration_ms);
 
     if (!is_animating_) {
-      animation_timer_.Start(TimeDelta::FromMilliseconds(kAnimationIntervalMs),
+      animation_timer_.Start(FROM_HERE,
+                             TimeDelta::FromMilliseconds(kAnimationIntervalMs),
                              this,
                              &SettingLevelBubble::OnAnimationTimeout);
       is_animating_ = true;
diff --git a/chrome/browser/chromeos/status/clock_menu_button.cc b/chrome/browser/chromeos/status/clock_menu_button.cc
index ac5b0b6..5df5502 100644
--- a/chrome/browser/chromeos/status/clock_menu_button.cc
+++ b/chrome/browser/chromeos/status/clock_menu_button.cc
@@ -80,7 +80,7 @@
   // called just a teeny bit early, then it will skip the next minute.
   seconds_left += kTimerSlopSeconds;
 
-  timer_.Start(base::TimeDelta::FromSeconds(seconds_left), this,
+  timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(seconds_left), this,
                &ClockMenuButton::UpdateTextAndSetNextTimer);
 }
 
diff --git a/chrome/browser/chromeos/status/memory_menu_button.cc b/chrome/browser/chromeos/status/memory_menu_button.cc
index fe4c33cb..cda69ff 100644
--- a/chrome/browser/chromeos/status/memory_menu_button.cc
+++ b/chrome/browser/chromeos/status/memory_menu_button.cc
@@ -66,7 +66,8 @@
 void MemoryMenuButton::UpdateTextAndSetNextTimer() {
   UpdateText();
 
-  timer_.Start(base::TimeDelta::FromSeconds(kUpdateIntervalSeconds), this,
+  timer_.Start(FROM_HERE,
+               base::TimeDelta::FromSeconds(kUpdateIntervalSeconds), this,
                &MemoryMenuButton::UpdateTextAndSetNextTimer);
 }
 
diff --git a/chrome/browser/chromeos/upgrade_detector_chromeos.cc b/chrome/browser/chromeos/upgrade_detector_chromeos.cc
index 809ba4a..9445c04 100644
--- a/chrome/browser/chromeos/upgrade_detector_chromeos.cc
+++ b/chrome/browser/chromeos/upgrade_detector_chromeos.cc
@@ -37,7 +37,7 @@
 
   // Setup timer to to move along the upgrade advisory system.
   upgrade_notification_timer_.Start(
-      base::TimeDelta::FromMilliseconds(kNotifyCycleTimeMs),
+      FROM_HERE, base::TimeDelta::FromMilliseconds(kNotifyCycleTimeMs),
       this, &UpgradeDetectorChromeos::NotifyOnUpgrade);
 }
 
diff --git a/chrome/browser/component_updater/component_updater_service.cc b/chrome/browser/component_updater/component_updater_service.cc
index 8b78857..d92516a 100644
--- a/chrome/browser/component_updater/component_updater_service.cc
+++ b/chrome/browser/component_updater/component_updater_service.cc
@@ -336,7 +336,7 @@
     Source<ComponentUpdateService>(this),
     NotificationService::NoDetails());
 
-  timer_.Start(base::TimeDelta::FromSeconds(config_->InitialDelay()),
+  timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(config_->InitialDelay()),
                this, &CrxUpdateService::ProcessPendingItems);
   return kOk;
 }
@@ -374,7 +374,7 @@
       return;
   }
 
-  timer_.Start(base::TimeDelta::FromSeconds(delay),
+  timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(delay),
                this, &CrxUpdateService::ProcessPendingItems);
 }
 
diff --git a/chrome/browser/enumerate_modules_model_win.cc b/chrome/browser/enumerate_modules_model_win.cc
index e056cd4..694de06 100644
--- a/chrome/browser/enumerate_modules_model_win.cc
+++ b/chrome/browser/enumerate_modules_model_win.cc
@@ -904,7 +904,7 @@
       suspected_bad_modules_detected_(0) {
   const CommandLine& cmd_line = *CommandLine::ForCurrentProcess();
   if (cmd_line.HasSwitch(switches::kConflictingModulesCheck)) {
-    check_modules_timer_.Start(
+    check_modules_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kModuleCheckDelayMs),
         this, &EnumerateModulesModel::ScanNow);
   }
diff --git a/chrome/browser/extensions/extension_updater.cc b/chrome/browser/extensions/extension_updater.cc
index 2959077..45705b6 100644
--- a/chrome/browser/extensions/extension_updater.cc
+++ b/chrome/browser/extensions/extension_updater.cc
@@ -941,7 +941,7 @@
   prefs_->SetInt64(kNextExtensionsUpdateCheck, next.ToInternalValue());
   prefs_->ScheduleSavePersistentPrefs();
 
-  timer_.Start(actual_delay, this, &ExtensionUpdater::TimerFired);
+  timer_.Start(FROM_HERE, actual_delay, this, &ExtensionUpdater::TimerFired);
 }
 
 void ExtensionUpdater::TimerFired() {
diff --git a/chrome/browser/extensions/extension_web_socket_proxy_private_api.cc b/chrome/browser/extensions/extension_web_socket_proxy_private_api.cc
index 1eaf24cb..9b38568 100644
--- a/chrome/browser/extensions/extension_web_socket_proxy_private_api.cc
+++ b/chrome/browser/extensions/extension_web_socket_proxy_private_api.cc
@@ -59,7 +59,7 @@
 
   if (delay_response) {
     const int kTimeout = 3;
-    timer_.Start(base::TimeDelta::FromSeconds(kTimeout),
+    timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(kTimeout),
         this, &WebSocketProxyPrivateGetPassportForTCPFunction::Finalize);
   } else {
     Finalize();
diff --git a/chrome/browser/extensions/extensions_quota_service.cc b/chrome/browser/extensions/extensions_quota_service.cc
index 0c41656..6c441b1f 100644
--- a/chrome/browser/extensions/extensions_quota_service.cc
+++ b/chrome/browser/extensions/extensions_quota_service.cc
@@ -18,7 +18,8 @@
 
 ExtensionsQuotaService::ExtensionsQuotaService() {
   if (MessageLoop::current() != NULL) {  // Null in unit tests.
-    purge_timer_.Start(base::TimeDelta::FromDays(kPurgeIntervalInDays),
+    purge_timer_.Start(FROM_HERE,
+                       base::TimeDelta::FromDays(kPurgeIntervalInDays),
                        this, &ExtensionsQuotaService::Purge);
   }
 }
diff --git a/chrome/browser/history/top_sites.cc b/chrome/browser/history/top_sites.cc
index d6bb0dc1..25e333b 100644
--- a/chrome/browser/history/top_sites.cc
+++ b/chrome/browser/history/top_sites.cc
@@ -946,7 +946,7 @@
 
   timer_start_time_ = base::TimeTicks::Now();
   timer_.Stop();
-  timer_.Start(delta, this, &TopSites::TimerFired);
+  timer_.Start(FROM_HERE, delta, this, &TopSites::TimerFired);
 }
 
 void TopSites::OnHistoryMigrationWrittenToDisk(TopSitesBackend::Handle handle) {
diff --git a/chrome/browser/instant/instant_controller.cc b/chrome/browser/instant/instant_controller.cc
index deac866..f24cf5e 100644
--- a/chrome/browser/instant/instant_controller.cc
+++ b/chrome/browser/instant/instant_controller.cc
@@ -520,7 +520,7 @@
     // Status isn't ok, start a timer that when fires shows the result. This
     // delays showing 403 pages and the like.
     show_timer_.Stop();
-    show_timer_.Start(
+    show_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kShowDelayMS),
         this, &InstantController::ShowTimerFired);
     UpdateDisplayableLoader();
@@ -669,7 +669,8 @@
   scheduled_url_ = url;
 
   update_timer_.Stop();
-  update_timer_.Start(base::TimeDelta::FromMilliseconds(kUpdateDelayMS),
+  update_timer_.Start(FROM_HERE,
+                      base::TimeDelta::FromMilliseconds(kUpdateDelayMS),
                       this, &InstantController::ProcessScheduledUpdate);
 }
 
@@ -724,7 +725,7 @@
                          user_text, verbatim, suggested_text)) {
     show_timer_.Stop();
     if (!new_loader->http_status_ok()) {
-      show_timer_.Start(
+      show_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(kShowDelayMS),
           this, &InstantController::ShowTimerFired);
     }
diff --git a/chrome/browser/instant/instant_loader.cc b/chrome/browser/instant/instant_loader.cc
index 8b28bc0..cb2d593 100644
--- a/chrome/browser/instant/instant_loader.cc
+++ b/chrome/browser/instant/instant_loader.cc
@@ -684,7 +684,7 @@
     if (omnibox_bounds_.height() > last_omnibox_bounds_.height()) {
       SendBoundsToPage(false);
     } else {
-      update_bounds_timer_.Start(
+      update_bounds_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(kUpdateBoundsDelayMS),
           this, &InstantLoader::ProcessBoundsChange);
     }
diff --git a/chrome/browser/internal_auth.cc b/chrome/browser/internal_auth.cc
index ac8d91f..76e32b4 100644
--- a/chrome/browser/internal_auth.cc
+++ b/chrome/browser/internal_auth.cc
@@ -343,7 +343,7 @@
   void GenerateNewKey() {
     DCHECK(CalledOnValidThread());
     if (!timer_.IsRunning()) {
-      timer_.Start(
+      timer_.Start(FROM_HERE,
           base::TimeDelta::FromMicroseconds(
               kKeyRegenerationSoftTicks * kTickUs),
           this,
diff --git a/chrome/browser/net/predictor_unittest.cc b/chrome/browser/net/predictor_unittest.cc
index 70a39c9..23b4ca05 100644
--- a/chrome/browser/net/predictor_unittest.cc
+++ b/chrome/browser/net/predictor_unittest.cc
@@ -85,7 +85,7 @@
 
   void WaitForResolution(Predictor* predictor, const UrlList& hosts) {
     HelperTimer* timer = new HelperTimer();
-    timer->Start(TimeDelta::FromMilliseconds(100),
+    timer->Start(FROM_HERE, TimeDelta::FromMilliseconds(100),
                  new WaitForResolutionHelper(predictor, hosts, timer),
                  &WaitForResolutionHelper::Run);
     MessageLoop::current()->Run();
diff --git a/chrome/browser/notifications/notification_ui_manager.cc b/chrome/browser/notifications/notification_ui_manager.cc
index a2fdf24..f4ed3d83 100644
--- a/chrome/browser/notifications/notification_ui_manager.cc
+++ b/chrome/browser/notifications/notification_ui_manager.cc
@@ -164,7 +164,7 @@
     ShowNotifications();
   } else if (!user_state_check_timer_.IsRunning()) {
     // Start a timer to detect the moment at which the user becomes active.
-    user_state_check_timer_.Start(
+    user_state_check_timer_.Start(FROM_HERE,
         base::TimeDelta::FromSeconds(kUserStatePollingIntervalSeconds), this,
         &NotificationUIManager::CheckUserState);
   }
diff --git a/chrome/browser/oom_priority_manager.cc b/chrome/browser/oom_priority_manager.cc
index fcd7a91..d3db051 100644
--- a/chrome/browser/oom_priority_manager.cc
+++ b/chrome/browser/oom_priority_manager.cc
@@ -48,7 +48,8 @@
 
 void OomPriorityManager::StartTimer() {
   if (!timer_.IsRunning()) {
-    timer_.Start(TimeDelta::FromSeconds(ADJUSTMENT_INTERVAL_SECONDS),
+    timer_.Start(FROM_HERE,
+                 TimeDelta::FromSeconds(ADJUSTMENT_INTERVAL_SECONDS),
                  this,
                  &OomPriorityManager::AdjustOomPriorities);
   }
diff --git a/chrome/browser/policy/delayed_work_scheduler.cc b/chrome/browser/policy/delayed_work_scheduler.cc
index b751cb6a..35fd049 100644
--- a/chrome/browser/policy/delayed_work_scheduler.cc
+++ b/chrome/browser/policy/delayed_work_scheduler.cc
@@ -30,7 +30,8 @@
     const base::Closure& callback,
     int64 delay) {
   callback_ = callback;
-  timer_.Start(base::TimeDelta::FromMilliseconds(delay),
+  timer_.Start(FROM_HERE,
+               base::TimeDelta::FromMilliseconds(delay),
                this,
                &DelayedWorkScheduler::DoDelayedWork);
 }
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index b33d31f..6c53557 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -180,7 +180,7 @@
     if (profile && profile->GetTopSitesWithoutCreating()) {
       Init();
     } else {
-      timer_.Start(base::TimeDelta::FromSeconds(3), this,
+      timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(3), this,
                    &prerender::PrerenderManager::MostVisitedSites::Init);
     }
   }
@@ -795,7 +795,7 @@
   DCHECK(CalledOnValidThread());
   if (repeating_timer_.IsRunning())
     return;
-  repeating_timer_.Start(
+  repeating_timer_.Start(FROM_HERE,
       base::TimeDelta::FromMilliseconds(kPeriodicCleanupIntervalMs),
       this,
       &PrerenderManager::PeriodicCleanup);
diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc
index c1e61e3..0b180a2 100644
--- a/chrome/browser/printing/print_job.cc
+++ b/chrome/browser/printing/print_job.cc
@@ -183,7 +183,7 @@
   // wrong.
   base::OneShotTimer<MessageLoop> quit_task;
   if (timeout_ms) {
-    quit_task.Start(TimeDelta::FromMilliseconds(timeout_ms),
+    quit_task.Start(FROM_HERE, TimeDelta::FromMilliseconds(timeout_ms),
                     MessageLoop::current(), &MessageLoop::Quit);
   }
 
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index 2fbd080..015b1f3 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -481,7 +481,8 @@
   // memory-bound.
   static const int kPrinterSettingsTimeout = 60000;
   base::OneShotTimer<MessageLoop> quit_timer;
-  quit_timer.Start(TimeDelta::FromMilliseconds(kPrinterSettingsTimeout),
+  quit_timer.Start(FROM_HERE,
+                   TimeDelta::FromMilliseconds(kPrinterSettingsTimeout),
                    MessageLoop::current(), &MessageLoop::Quit);
 
   inside_inner_message_loop_ = true;
diff --git a/chrome/browser/process_singleton_linux.cc b/chrome/browser/process_singleton_linux.cc
index 9055e59..f4808e6 100644
--- a/chrome/browser/process_singleton_linux.cc
+++ b/chrome/browser/process_singleton_linux.cc
@@ -470,7 +470,7 @@
       // Wait for reads.
       MessageLoopForIO::current()->WatchFileDescriptor(
           fd, true, MessageLoopForIO::WATCH_READ, &fd_reader_, this);
-      timer_.Start(base::TimeDelta::FromSeconds(kTimeoutInSeconds),
+      timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(kTimeoutInSeconds),
                    this, &SocketReader::OnTimerExpiry);
     }
 
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index db3a11c..159e6b8 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -312,7 +312,7 @@
   DCHECK(!path.empty()) << "Using an empty path will attempt to write " <<
                             "profile files to the root directory!";
 
-  create_session_service_timer_.Start(
+  create_session_service_timer_.Start(FROM_HERE,
       TimeDelta::FromMilliseconds(kCreateSessionServiceDelayMS), this,
       &ProfileImpl::EnsureSessionServiceCreated);
 
diff --git a/chrome/browser/renderer_host/safe_browsing_resource_handler.cc b/chrome/browser/renderer_host/safe_browsing_resource_handler.cc
index 043b6e0..97a2bb9c 100644
--- a/chrome/browser/renderer_host/safe_browsing_resource_handler.cc
+++ b/chrome/browser/renderer_host/safe_browsing_resource_handler.cc
@@ -282,7 +282,8 @@
   url_check_start_time_ = base::TimeTicks::Now();
 
   // Start a timer to abort the check if it takes too long.
-  timer_.Start(base::TimeDelta::FromMilliseconds(kCheckUrlTimeoutMs),
+  timer_.Start(FROM_HERE,
+               base::TimeDelta::FromMilliseconds(kCheckUrlTimeoutMs),
                this, &SafeBrowsingResourceHandler::OnCheckUrlTimeout);
 
   return false;
diff --git a/chrome/browser/safe_browsing/protocol_manager.cc b/chrome/browser/safe_browsing/protocol_manager.cc
index 78c1bab5..f412b04 100644
--- a/chrome/browser/safe_browsing/protocol_manager.cc
+++ b/chrome/browser/safe_browsing/protocol_manager.cc
@@ -502,8 +502,8 @@
   DCHECK_GE(next_update_msec, 0);
   // Unschedule any current timer.
   update_timer_.Stop();
-  update_timer_.Start(TimeDelta::FromMilliseconds(next_update_msec), this,
-                      &SafeBrowsingProtocolManager::GetNextUpdate);
+  update_timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(next_update_msec),
+                      this, &SafeBrowsingProtocolManager::GetNextUpdate);
 }
 
 // According to section 5 of the SafeBrowsing protocol specification, we must
@@ -620,7 +620,8 @@
   request_->Start();
 
   // Begin the update request timeout.
-  update_timer_.Start(TimeDelta::FromSeconds(kSbMaxUpdateWaitSec), this,
+  update_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(kSbMaxUpdateWaitSec),
+                      this,
                       &SafeBrowsingProtocolManager::UpdateResponseTimeout);
 }
 
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index 2cbe188..ddf793d 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -222,7 +222,7 @@
     force_load_timer_.Stop();
     // Each time we load a tab we also set a timer to force us to start loading
     // the next tab if this one doesn't load quickly enough.
-    force_load_timer_.Start(
+    force_load_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(force_load_delay_),
         this, &TabLoader::ForceLoadTimerFired);
   }
diff --git a/chrome/browser/spellchecker/spellcheck_host_metrics.cc b/chrome/browser/spellchecker/spellcheck_host_metrics.cc
index 87021cb..1ad9ba45 100644
--- a/chrome/browser/spellchecker/spellcheck_host_metrics.cc
+++ b/chrome/browser/spellchecker/spellcheck_host_metrics.cc
@@ -14,7 +14,7 @@
       replaced_word_count_(0),
       start_time_(base::Time::Now()) {
   const uint64 kHistogramTimerDurationInMinutes = 30;
-  recording_timer_.Start(
+  recording_timer_.Start(FROM_HERE,
       base::TimeDelta::FromMinutes(kHistogramTimerDurationInMinutes),
       this, &SpellCheckHostMetrics::OnHistogramTimerExpired);
   RecordWordCounts();
diff --git a/chrome/browser/sync/engine/sync_scheduler.cc b/chrome/browser/sync/engine/sync_scheduler.cc
index 3782aff..d7d68abd 100644
--- a/chrome/browser/sync/engine/sync_scheduler.cc
+++ b/chrome/browser/sync/engine/sync_scheduler.cc
@@ -901,13 +901,13 @@
 
   // Adjust poll rate.
   poll_timer_.Stop();
-  poll_timer_.Start(poll, this, &SyncScheduler::PollTimerCallback);
+  poll_timer_.Start(FROM_HERE, poll, this, &SyncScheduler::PollTimerCallback);
 }
 
 void SyncScheduler::RestartWaiting() {
   CHECK(wait_interval_.get());
   wait_interval_->timer.Stop();
-  wait_interval_->timer.Start(wait_interval_->length,
+  wait_interval_->timer.Start(FROM_HERE, wait_interval_->length,
                               this, &SyncScheduler::DoCanaryJob);
 }
 
@@ -1077,7 +1077,7 @@
   DCHECK_EQ(MessageLoop::current(), sync_loop_);
   wait_interval_.reset(new WaitInterval(WaitInterval::THROTTLED,
                                         silenced_until - TimeTicks::Now()));
-  wait_interval_->timer.Start(wait_interval_->length, this,
+  wait_interval_->timer.Start(FROM_HERE, wait_interval_->length, this,
       &SyncScheduler::Unthrottle);
 }
 
diff --git a/chrome/browser/sync/glue/database_model_worker_unittest.cc b/chrome/browser/sync/glue/database_model_worker_unittest.cc
index 40fc97817..150dd31 100644
--- a/chrome/browser/sync/glue/database_model_worker_unittest.cc
+++ b/chrome/browser/sync/glue/database_model_worker_unittest.cc
@@ -38,7 +38,7 @@
   void ScheduleWork() {
     scoped_ptr<Callback0::Type> c(NewCallback(this,
         &DatabaseModelWorkerTest::DoWork));
-    timer()->Start(TimeDelta::FromSeconds(10),
+    timer()->Start(FROM_HERE, TimeDelta::FromSeconds(10),
                    this, &DatabaseModelWorkerTest::Timeout);
     worker()->DoWorkAndWaitUntilDone(c.get());
   }
diff --git a/chrome/browser/sync/glue/sync_backend_host.cc b/chrome/browser/sync/glue/sync_backend_host.cc
index 486ca47..f8a1849 100644
--- a/chrome/browser/sync/glue/sync_backend_host.cc
+++ b/chrome/browser/sync/glue/sync_backend_host.cc
@@ -896,7 +896,7 @@
 }
 
 void SyncBackendHost::Core::StartSavingChanges() {
-  save_changes_timer_.Start(
+  save_changes_timer_.Start(FROM_HERE,
       base::TimeDelta::FromSeconds(kSaveChangesIntervalSeconds),
       this, &Core::SaveChanges);
 }
diff --git a/chrome/browser/sync/notifier/registration_manager.cc b/chrome/browser/sync/notifier/registration_manager.cc
index 0308dbe..b505729 100644
--- a/chrome/browser/sync/notifier/registration_manager.cc
+++ b/chrome/browser/sync/notifier/registration_manager.cc
@@ -192,7 +192,7 @@
             << syncable::ModelTypeToString(model_type) << " in "
             << delay.InMilliseconds() << " ms";
     status->registration_timer.Stop();
-    status->registration_timer.Start(
+    status->registration_timer.Start(FROM_HERE,
         delay, status, &RegistrationManager::RegistrationStatus::DoRegister);
     double next_delay_seconds =
         CalculateBackoff(static_cast<double>(status->next_delay.InSeconds()),
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc
index 4d23502..80c60098 100644
--- a/chrome/browser/sync/profile_sync_service.cc
+++ b/chrome/browser/sync/profile_sync_service.cc
@@ -482,7 +482,7 @@
 
 void ProfileSyncService::ClearServerData() {
   clear_server_data_state_ = CLEAR_CLEARING;
-  clear_server_data_timer_.Start(
+  clear_server_data_timer_.Start(FROM_HERE,
       base::TimeDelta::FromSeconds(kSyncClearDataTimeoutInSeconds), this,
       &ProfileSyncService::OnClearServerDataTimeout);
   backend_->RequestClearServerData();
diff --git a/chrome/browser/ui/fullscreen_exit_bubble.cc b/chrome/browser/ui/fullscreen_exit_bubble.cc
index 8c42fa1d..be3db4e6 100644
--- a/chrome/browser/ui/fullscreen_exit_bubble.cc
+++ b/chrome/browser/ui/fullscreen_exit_bubble.cc
@@ -26,11 +26,12 @@
 
 void FullscreenExitBubble::StartWatchingMouse() {
   // Start the initial delay timer and begin watching the mouse.
-  initial_delay_.Start(base::TimeDelta::FromMilliseconds(kInitialDelayMs), this,
+  initial_delay_.Start(FROM_HERE,
+                       base::TimeDelta::FromMilliseconds(kInitialDelayMs), this,
                        &FullscreenExitBubble::CheckMousePosition);
   gfx::Point cursor_pos = GetCursorScreenPoint();
   last_mouse_pos_ = cursor_pos;
-  mouse_position_checker_.Start(
+  mouse_position_checker_.Start(FROM_HERE,
       base::TimeDelta::FromMilliseconds(1000 / kPositionCheckHz), this,
       &FullscreenExitBubble::CheckMousePosition);
 }
@@ -62,7 +63,8 @@
   if (cursor_pos != last_mouse_pos_) {
     // The mouse moved; reset the idle timer.
     idle_timeout_.Stop();  // If the timer isn't running, this is a no-op.
-    idle_timeout_.Start(base::TimeDelta::FromMilliseconds(kIdleTimeMs), this,
+    idle_timeout_.Start(FROM_HERE,
+                        base::TimeDelta::FromMilliseconds(kIdleTimeMs), this,
                         &FullscreenExitBubble::CheckMousePosition);
   }
   last_mouse_pos_ = cursor_pos;
diff --git a/chrome/browser/ui/gtk/browser_window_gtk.cc b/chrome/browser/ui/gtk/browser_window_gtk.cc
index 4c52e9f..94f6066 100644
--- a/chrome/browser/ui/gtk/browser_window_gtk.cc
+++ b/chrome/browser/ui/gtk/browser_window_gtk.cc
@@ -792,7 +792,7 @@
   if (should_animate) {
     if (!loading_animation_timer_.IsRunning()) {
       // Loads are happening, and the timer isn't running, so start it.
-      loading_animation_timer_.Start(
+      loading_animation_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(kLoadingAnimationFrameTimeMs), this,
           &BrowserWindowGtk::LoadingAnimationCallback);
     }
@@ -1419,8 +1419,8 @@
   // (In that case Stop() is a no-op.)
   if (!debounce_timer_disabled_) {
     window_configure_debounce_timer_.Stop();
-    window_configure_debounce_timer_.Start(base::TimeDelta::FromMilliseconds(
-        kDebounceTimeoutMilliseconds), this,
+    window_configure_debounce_timer_.Start(FROM_HERE,
+        base::TimeDelta::FromMilliseconds(kDebounceTimeoutMilliseconds), this,
         &BrowserWindowGtk::OnDebouncedBoundsChanged);
   }
 
diff --git a/chrome/browser/ui/gtk/download/download_item_gtk.cc b/chrome/browser/ui/gtk/download/download_item_gtk.cc
index 57667389..5f9218e 100644
--- a/chrome/browser/ui/gtk/download/download_item_gtk.cc
+++ b/chrome/browser/ui/gtk/download/download_item_gtk.cc
@@ -424,7 +424,7 @@
 void DownloadItemGtk::StartDownloadProgress() {
   if (progress_timer_.IsRunning())
     return;
-  progress_timer_.Start(
+  progress_timer_.Start(FROM_HERE,
       base::TimeDelta::FromMilliseconds(download_util::kProgressRateMs), this,
       &DownloadItemGtk::UpdateDownloadProgress);
 }
diff --git a/chrome/browser/ui/gtk/reload_button_gtk.cc b/chrome/browser/ui/gtk/reload_button_gtk.cc
index d6e2501b..b9459348 100644
--- a/chrome/browser/ui/gtk/reload_button_gtk.cc
+++ b/chrome/browser/ui/gtk/reload_button_gtk.cc
@@ -119,7 +119,7 @@
     // Go ahead and change to reload after a bit, which allows repeated reloads
     // without moving the mouse.
     if (!stop_to_reload_timer_.IsRunning()) {
-      stop_to_reload_timer_.Start(stop_to_reload_timer_delay_, this,
+      stop_to_reload_timer_.Start(FROM_HERE, stop_to_reload_timer_delay_, this,
                                   &ReloadButtonGtk::OnStopToReloadTimer);
     }
   }
@@ -185,7 +185,7 @@
     // here as the browser will do that when it actually starts loading (which
     // may happen synchronously, thus the need to do this before telling the
     // browser to execute the reload command).
-    double_click_timer_.Start(double_click_timer_delay_, this,
+    double_click_timer_.Start(FROM_HERE, double_click_timer_delay_, this,
                               &ReloadButtonGtk::OnDoubleClickTimer);
 
     if (browser_)
diff --git a/chrome/browser/ui/gtk/status_bubble_gtk.cc b/chrome/browser/ui/gtk/status_bubble_gtk.cc
index df31d84..6640a8b 100644
--- a/chrome/browser/ui/gtk/status_bubble_gtk.cc
+++ b/chrome/browser/ui/gtk/status_bubble_gtk.cc
@@ -99,7 +99,8 @@
   int desired_width = parent->allocation.width;
   if (!expanded()) {
     expand_timer_.Stop();
-    expand_timer_.Start(base::TimeDelta::FromMilliseconds(kExpandHoverDelay),
+    expand_timer_.Start(FROM_HERE,
+                        base::TimeDelta::FromMilliseconds(kExpandHoverDelay),
                         this, &StatusBubbleGtk::ExpandURL);
     // When not expanded, we limit the size to one third the browser's
     // width.
@@ -133,7 +134,7 @@
 void StatusBubbleGtk::SetStatusTextTo(const std::string& status_utf8) {
   if (status_utf8.empty()) {
     hide_timer_.Stop();
-    hide_timer_.Start(base::TimeDelta::FromMilliseconds(kHideDelay),
+    hide_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kHideDelay),
                       this, &StatusBubbleGtk::Hide);
   } else {
     gtk_label_set_text(GTK_LABEL(label_.get()), status_utf8.c_str());
diff --git a/chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.cc b/chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.cc
index 73dd699..ac086916 100644
--- a/chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.cc
+++ b/chrome/browser/ui/gtk/tabs/dragged_tab_controller_gtk.cc
@@ -245,7 +245,7 @@
   }
 
   if (!target_tabstrip) {
-    bring_to_front_timer_.Start(
+    bring_to_front_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kBringToFrontDelay), this,
         &DraggedTabControllerGtk::BringWindowUnderMouseToFront);
   }
diff --git a/chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc b/chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc
index 944c6b1..b10aadd8 100644
--- a/chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc
+++ b/chrome/browser/ui/panels/auto_hiding_desktop_bar_win.cc
@@ -43,7 +43,7 @@
   // called due to the work area change.
   if (taskbar_exists) {
     if (!polling_timer_.IsRunning()) {
-      polling_timer_.Start(
+      polling_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(kCheckTaskbarPollingIntervalMs),
           this,
           &AutoHidingDesktopBarWin::OnPollingTimer);
diff --git a/chrome/browser/ui/views/compact_nav/compact_location_bar_view_host.cc b/chrome/browser/ui/views/compact_nav/compact_location_bar_view_host.cc
index 88e81945..216473d 100644
--- a/chrome/browser/ui/views/compact_nav/compact_location_bar_view_host.cc
+++ b/chrome/browser/ui/views/compact_nav/compact_location_bar_view_host.cc
@@ -478,7 +478,8 @@
     // Restart the timer.
     auto_hide_timer_->Reset();
   } else {
-    auto_hide_timer_->Start(base::TimeDelta::FromSeconds(kHideTimeoutInSeconds),
+    auto_hide_timer_->Start(FROM_HERE,
+                            base::TimeDelta::FromSeconds(kHideTimeoutInSeconds),
                             this, &CompactLocationBarViewHost::HideCallback);
   }
 }
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index 836504a..58c42d3 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -315,7 +315,7 @@
 void DownloadItemView::StartDownloadProgress() {
   if (progress_timer_.IsRunning())
     return;
-  progress_timer_.Start(
+  progress_timer_.Start(FROM_HERE,
       base::TimeDelta::FromMilliseconds(download_util::kProgressRateMs), this,
       &DownloadItemView::UpdateDownloadProgress);
 }
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 4020129..7f586b6 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -759,7 +759,7 @@
     if (!loading_animation_timer_.IsRunning()) {
       // Loads are happening, and the timer isn't running, so start it.
       last_animation_time_ = base::TimeTicks::Now();
-      loading_animation_timer_.Start(
+      loading_animation_timer_.Start(FROM_HERE,
           TimeDelta::FromMilliseconds(kLoadingAnimationFrameTimeMs), this,
           &BrowserView::LoadingAnimationCallback);
     }
diff --git a/chrome/browser/ui/views/reload_button.cc b/chrome/browser/ui/views/reload_button.cc
index 0670d630..db95490 100644
--- a/chrome/browser/ui/views/reload_button.cc
+++ b/chrome/browser/ui/views/reload_button.cc
@@ -60,7 +60,7 @@
     // Go ahead and change to reload after a bit, which allows repeated reloads
     // without moving the mouse.
     if (!stop_to_reload_timer_.IsRunning()) {
-      stop_to_reload_timer_.Start(stop_to_reload_timer_delay_, this,
+      stop_to_reload_timer_.Start(FROM_HERE, stop_to_reload_timer_delay_, this,
                                   &ReloadButton::OnStopToReloadTimer);
     }
   }
@@ -106,7 +106,7 @@
     // here as the browser will do that when it actually starts loading (which
     // may happen synchronously, thus the need to do this before telling the
     // browser to execute the reload command).
-    double_click_timer_.Start(double_click_timer_delay_, this,
+    double_click_timer_.Start(FROM_HERE, double_click_timer_delay_, this,
                               &ReloadButton::OnDoubleClickTimer);
 
     if (browser_)
diff --git a/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc b/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc
index 0c2f2f3..ab91362 100644
--- a/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc
+++ b/chrome/browser/ui/views/tab_contents/tab_contents_view_views.cc
@@ -385,8 +385,8 @@
 
 void TabContentsViewViews::OnNativeTabContentsViewDraggingEnded() {
   if (close_tab_after_drag_ends_) {
-    close_tab_timer_.Start(base::TimeDelta::FromMilliseconds(0), this,
-                           &TabContentsViewViews::CloseTab);
+    close_tab_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(0),
+                           this, &TabContentsViewViews::CloseTab);
   }
   tab_contents_->SystemDragEnded();
 }
diff --git a/chrome/browser/ui/views/tabs/dragged_tab_controller.cc b/chrome/browser/ui/views/tabs/dragged_tab_controller.cc
index 685e0d5..eab3310 100644
--- a/chrome/browser/ui/views/tabs/dragged_tab_controller.cc
+++ b/chrome/browser/ui/views/tabs/dragged_tab_controller.cc
@@ -667,7 +667,7 @@
       Attach(target_tabstrip, screen_point);
   }
   if (!target_tabstrip) {
-    bring_to_front_timer_.Start(
+    bring_to_front_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kBringToFrontDelay), this,
         &DraggedTabController::BringWindowUnderMouseToFront);
   }
diff --git a/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc b/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc
index ef94964..2f088a1 100644
--- a/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/mobile_setup_ui.cc
@@ -1127,6 +1127,7 @@
       // limbo by the network library.
       if (!reconnect_timer_.IsRunning()) {
         reconnect_timer_.Start(
+            FROM_HERE,
             base::TimeDelta::FromMilliseconds(kReconnectTimerDelayMS),
             this, &MobileSetupHandler::ReconnectTimerFired);
       }
diff --git a/chrome/browser/ui/webui/flash_ui.cc b/chrome/browser/ui/webui/flash_ui.cc
index a973bfa..f69bc77 100644
--- a/chrome/browser/ui/webui/flash_ui.cc
+++ b/chrome/browser/ui/webui/flash_ui.cc
@@ -133,7 +133,7 @@
 
   // And lastly, we fire off a timer to make sure we never get stuck at the
   // "Loading..." message.
-  timeout_.Start(base::TimeDelta::FromMilliseconds(kTimeout),
+  timeout_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeout),
                  this, &FlashDOMHandler::OnTimeout);
 }
 
diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui.cc b/chrome/browser/ui/webui/ntp/new_tab_ui.cc
index b0ce383..2ad0c41a 100644
--- a/chrome/browser/ui/webui/ntp/new_tab_ui.cc
+++ b/chrome/browser/ui/webui/ntp/new_tab_ui.cc
@@ -278,7 +278,7 @@
     // Not enough quiet time has elapsed.
     // Some more paints must've occurred since we set the timeout.
     // Wait some more.
-    timer_.Start(base::TimeDelta::FromMilliseconds(kTimeoutMs), this,
+    timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeoutMs), this,
                  &NewTabUI::PaintTimeout);
   }
 }
@@ -288,7 +288,7 @@
   last_paint_ = start_;
   registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_HOST_DID_PAINT,
       Source<RenderWidgetHost>(render_view_host));
-  timer_.Start(base::TimeDelta::FromMilliseconds(kTimeoutMs), this,
+  timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kTimeoutMs), this,
                &NewTabUI::PaintTimeout);
 
 }
diff --git a/chrome/browser/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector_impl.cc
index d6fa033..34b58c1 100644
--- a/chrome/browser/upgrade_detector_impl.cc
+++ b/chrome/browser/upgrade_detector_impl.cc
@@ -159,7 +159,7 @@
   if (keystone_glue::KeystoneEnabled())
 #endif
   {
-    detect_upgrade_timer_.Start(
+    detect_upgrade_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(GetCheckForUpgradeEveryMs()),
         this, &UpgradeDetectorImpl::CheckForUpgrade);
   }
@@ -195,7 +195,7 @@
   // and stop the timer.
   int cycle_time = CmdLineInterval().empty() ? kNotifyCycleTimeMs :
                                                kNotifyCycleTimeForTestingMs;
-  upgrade_notification_timer_.Start(
+  upgrade_notification_timer_.Start(FROM_HERE,
       base::TimeDelta::FromMilliseconds(cycle_time),
       this, &UpgradeDetectorImpl::NotifyOnUpgrade);
 }
diff --git a/chrome/browser/visitedlink/visitedlink_event_listener.cc b/chrome/browser/visitedlink/visitedlink_event_listener.cc
index 478faac..0741bc82 100644
--- a/chrome/browser/visitedlink/visitedlink_event_listener.cc
+++ b/chrome/browser/visitedlink/visitedlink_event_listener.cc
@@ -134,7 +134,7 @@
   pending_visited_links_.push_back(fingerprint);
 
   if (!coalesce_timer_.IsRunning()) {
-    coalesce_timer_.Start(
+    coalesce_timer_.Start(FROM_HERE,
         TimeDelta::FromMilliseconds(kCommitIntervalMs), this,
         &VisitedLinkEventListener::CommitVisitedLinks);
   }
diff --git a/chrome/common/important_file_writer.cc b/chrome/common/important_file_writer.cc
index 73381d1..b7583d6 100644
--- a/chrome/common/important_file_writer.cc
+++ b/chrome/common/important_file_writer.cc
@@ -146,7 +146,7 @@
   }
 
   if (!timer_.IsRunning()) {
-    timer_.Start(commit_interval_, this,
+    timer_.Start(FROM_HERE, commit_interval_, this,
                  &ImportantFileWriter::DoScheduledWrite);
   }
 }
diff --git a/chrome/renderer/extensions/extension_dispatcher.cc b/chrome/renderer/extensions/extension_dispatcher.cc
index a21cabf..d2f06ef5 100644
--- a/chrome/renderer/extensions/extension_dispatcher.cc
+++ b/chrome/renderer/extensions/extension_dispatcher.cc
@@ -79,7 +79,7 @@
   // For extensions, we want to ensure we call the IdleHandler every so often,
   // even if the extension keeps up activity.
   if (is_extension_process_) {
-    forced_idle_timer_.Start(
+    forced_idle_timer_.Start(FROM_HERE,
         base::TimeDelta::FromSeconds(kMaxExtensionIdleHandlerDelayS),
         RenderThread::current(), &RenderThread::IdleHandler);
   }
@@ -118,7 +118,7 @@
         RenderThread::current()->idle_notification_delay_in_s()),
         kMaxExtensionIdleHandlerDelayS);
     forced_idle_timer_.Stop();
-    forced_idle_timer_.Start(
+    forced_idle_timer_.Start(FROM_HERE,
         base::TimeDelta::FromSeconds(forced_delay_s),
         RenderThread::current(), &RenderThread::IdleHandler);
   }
diff --git a/content/browser/download/download_file_manager.cc b/content/browser/download/download_file_manager.cc
index f21c67b1..0df8a3f 100644
--- a/content/browser/download/download_file_manager.cc
+++ b/content/browser/download/download_file_manager.cc
@@ -88,7 +88,8 @@
 void DownloadFileManager::StartUpdateTimer() {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
   if (!update_timer_.IsRunning()) {
-    update_timer_.Start(base::TimeDelta::FromMilliseconds(kUpdatePeriodMs),
+    update_timer_.Start(FROM_HERE,
+                        base::TimeDelta::FromMilliseconds(kUpdatePeriodMs),
                         this, &DownloadFileManager::UpdateInProgressDownloads);
   }
 }
diff --git a/content/browser/download/download_item.cc b/content/browser/download/download_item.cc
index eefb8ddd..fa6c436 100644
--- a/content/browser/download/download_item.cc
+++ b/content/browser/download/download_item.cc
@@ -325,7 +325,8 @@
   // TODO(rdsmith): Change to DCHECK after http://crbug.com/85408 resolved.
   CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
-  update_timer_.Start(base::TimeDelta::FromMilliseconds(kUpdateTimeMs), this,
+  update_timer_.Start(FROM_HERE,
+                      base::TimeDelta::FromMilliseconds(kUpdateTimeMs), this,
                       &DownloadItem::UpdateObservers);
 }
 
diff --git a/content/browser/download/download_resource_handler.cc b/content/browser/download/download_resource_handler.cc
index 5846c63..003a34e 100644
--- a/content/browser/download/download_resource_handler.cc
+++ b/content/browser/download/download_resource_handler.cc
@@ -238,7 +238,8 @@
 
 void DownloadResourceHandler::StartPauseTimer() {
   if (!pause_timer_.IsRunning())
-    pause_timer_.Start(base::TimeDelta::FromMilliseconds(kThrottleTimeMs), this,
+    pause_timer_.Start(FROM_HERE,
+                       base::TimeDelta::FromMilliseconds(kThrottleTimeMs), this,
                        &DownloadResourceHandler::CheckWriteProgress);
 }
 
diff --git a/content/browser/net/url_request_slow_http_job.cc b/content/browser/net/url_request_slow_http_job.cc
index 398298f2..3f1a6b6 100644
--- a/content/browser/net/url_request_slow_http_job.cc
+++ b/content/browser/net/url_request_slow_http_job.cc
@@ -50,7 +50,7 @@
     : URLRequestMockHTTPJob(request, file_path) { }
 
 void URLRequestSlowHTTPJob::Start() {
-  delay_timer_.Start(TimeDelta::FromMilliseconds(kDelayMs), this,
+  delay_timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(kDelayMs), this,
                      &URLRequestSlowHTTPJob::RealStart);
 }
 
diff --git a/content/browser/renderer_host/browser_render_process_host.cc b/content/browser/renderer_host/browser_render_process_host.cc
index 8fe12eb..ee649c72 100644
--- a/content/browser/renderer_host/browser_render_process_host.cc
+++ b/content/browser/renderer_host/browser_render_process_host.cc
@@ -185,7 +185,7 @@
           visible_widgets_(0),
           backgrounded_(true),
           ALLOW_THIS_IN_INITIALIZER_LIST(cached_dibs_cleaner_(
-                base::TimeDelta::FromSeconds(5),
+                FROM_HERE, base::TimeDelta::FromSeconds(5),
                 this, &BrowserRenderProcessHost::ClearTransportDIBCache)),
           accessibility_enabled_(false),
           is_initialized_(false) {
diff --git a/content/browser/renderer_host/render_widget_host.cc b/content/browser/renderer_host/render_widget_host.cc
index 2a506d0..e370fe4 100644
--- a/content/browser/renderer_host/render_widget_host.cc
+++ b/content/browser/renderer_host/render_widget_host.cc
@@ -482,7 +482,7 @@
   // fire sooner.
   time_when_considered_hung_ = Time::Now() + delay;
   hung_renderer_timer_.Stop();
-  hung_renderer_timer_.Start(delay, this,
+  hung_renderer_timer_.Start(FROM_HERE, delay, this,
       &RenderWidgetHost::CheckRendererIsUnresponsive);
 }
 
diff --git a/content/browser/renderer_host/resource_dispatcher_host.cc b/content/browser/renderer_host/resource_dispatcher_host.cc
index cccc121..d845c8f0 100644
--- a/content/browser/renderer_host/resource_dispatcher_host.cc
+++ b/content/browser/renderer_host/resource_dispatcher_host.cc
@@ -1575,7 +1575,7 @@
 
   // Make sure we have the load state monitor running
   if (!update_load_states_timer_.IsRunning()) {
-    update_load_states_timer_.Start(
+    update_load_states_timer_.Start(FROM_HERE,
         TimeDelta::FromMilliseconds(kUpdateLoadStatesIntervalMsec),
         this, &ResourceDispatcherHost::UpdateLoadStates);
   }
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index cc900cd..c5df75c8 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -37,7 +37,7 @@
 
 RenderProcessImpl::RenderProcessImpl()
     : ALLOW_THIS_IN_INITIALIZER_LIST(shared_mem_cache_cleaner_(
-          base::TimeDelta::FromSeconds(5),
+          FROM_HERE, base::TimeDelta::FromSeconds(5),
           this, &RenderProcessImpl::ClearTransportDIBCache)),
       transport_dib_next_sequence_number_(0) {
   in_process_plugins_ = InProcessPlugins();
diff --git a/content/renderer/render_thread.cc b/content/renderer/render_thread.cc
index 5dd064b..19522d5 100644
--- a/content/renderer/render_thread.cc
+++ b/content/renderer/render_thread.cc
@@ -688,7 +688,7 @@
 void RenderThread::ScheduleIdleHandler(double initial_delay_s) {
   idle_notification_delay_in_s_ = initial_delay_s;
   idle_timer_.Stop();
-  idle_timer_.Start(
+  idle_timer_.Start(FROM_HERE,
       base::TimeDelta::FromSeconds(static_cast<int64>(initial_delay_s)),
       this, &RenderThread::IdleHandler);
 }
diff --git a/content/renderer/render_view.cc b/content/renderer/render_view.cc
index c7833120..4d97023 100644
--- a/content/renderer/render_view.cc
+++ b/content/renderer/render_view.cc
@@ -1788,8 +1788,8 @@
     nav_state_sync_timer_.Stop();
   }
 
-  nav_state_sync_timer_.Start(
-      TimeDelta::FromSeconds(delay), this, &RenderView::SyncNavigationState);
+  nav_state_sync_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(delay), this,
+                              &RenderView::SyncNavigationState);
 }
 
 void RenderView::setMouseOverURL(const WebURL& url) {
@@ -2842,7 +2842,8 @@
 
   if (check_preferred_size_timer_.IsRunning())
     return;
-  check_preferred_size_timer_.Start(TimeDelta::FromMilliseconds(0), this,
+  check_preferred_size_timer_.Start(FROM_HERE,
+                                    TimeDelta::FromMilliseconds(0), this,
                                     &RenderView::CheckPreferredSize);
 }
 
diff --git a/jingle/glue/pseudotcp_adapter.cc b/jingle/glue/pseudotcp_adapter.cc
index a34ddd53..e2b31300 100644
--- a/jingle/glue/pseudotcp_adapter.cc
+++ b/jingle/glue/pseudotcp_adapter.cc
@@ -369,7 +369,8 @@
   long timeout = 0;
   if (pseudo_tcp_.GetNextClock(PseudoTcp::Now(), timeout)) {
     timer_.Stop();
-    timer_.Start(base::TimeDelta::FromMilliseconds(std::max(timeout, 0L)), this,
+    timer_.Start(FROM_HERE,
+                 base::TimeDelta::FromMilliseconds(std::max(timeout, 0L)), this,
                  &PseudoTcpAdapter::Core::HandleTcpClock);
   }
 }
diff --git a/jingle/notifier/communicator/login.cc b/jingle/notifier/communicator/login.cc
index 42fa0fc..70d37008 100644
--- a/jingle/notifier/communicator/login.cc
+++ b/jingle/notifier/communicator/login.cc
@@ -117,7 +117,7 @@
   VLOG(1) << "Reconnecting in "
           << reconnect_interval_.InSeconds() << " seconds";
   reconnect_timer_.Start(
-      reconnect_interval_, this, &Login::DoReconnect);
+      FROM_HERE, reconnect_interval_, this, &Login::DoReconnect);
   delegate_->OnDisconnect();
 }
 
diff --git a/media/audio/audio_input_controller.cc b/media/audio/audio_input_controller.cc
index da957e6c..cedbb24b 100644
--- a/media/audio/audio_input_controller.cc
+++ b/media/audio/audio_input_controller.cc
@@ -21,7 +21,7 @@
                                            SyncWriter* sync_writer)
     : handler_(handler),
       stream_(NULL),
-      ALLOW_THIS_IN_INITIALIZER_LIST(no_data_timer_(
+      ALLOW_THIS_IN_INITIALIZER_LIST(no_data_timer_(FROM_HERE,
           base::TimeDelta::FromSeconds(kTimerResetInterval),
           this,
           &AudioInputController::DoReportNoDataError)),
diff --git a/media/audio/audio_output_dispatcher.cc b/media/audio/audio_output_dispatcher.cc
index c7070693..ac08bcbf 100644
--- a/media/audio/audio_output_dispatcher.cc
+++ b/media/audio/audio_output_dispatcher.cc
@@ -18,7 +18,7 @@
       pause_delay_milliseconds_(2 * params.samples_per_packet *
           base::Time::kMillisecondsPerSecond / params.sample_rate),
       paused_proxies_(0),
-      ALLOW_THIS_IN_INITIALIZER_LIST(close_timer_(
+      ALLOW_THIS_IN_INITIALIZER_LIST(close_timer_(FROM_HERE,
           base::TimeDelta::FromMilliseconds(close_delay_ms),
           this, &AudioOutputDispatcher::ClosePendingStreams)) {
 }
diff --git a/media/filters/adaptive_demuxer.cc b/media/filters/adaptive_demuxer.cc
index f08e32d..5902900 100644
--- a/media/filters/adaptive_demuxer.cc
+++ b/media/filters/adaptive_demuxer.cc
@@ -98,7 +98,8 @@
   playing_ = true;
 
   if (video_ids_.size() > 1) {
-    timer_.Start(base::TimeDelta::FromMilliseconds(kSwitchTimerPeriod),
+    timer_.Start(FROM_HERE,
+                 base::TimeDelta::FromMilliseconds(kSwitchTimerPeriod),
                  this, &StreamSwitchManager::OnSwitchTimer);
   }
 }
diff --git a/net/base/network_change_notifier_win.cc b/net/base/network_change_notifier_win.cc
index 0d1f23c..91d6ffbf 100644
--- a/net/base/network_change_notifier_win.cc
+++ b/net/base/network_change_notifier_win.cc
@@ -153,7 +153,7 @@
   // The one second delay chosen here was determined experimentally
   // by adamk on Windows 7.
   timer_.Stop();  // cancel any already waiting notification
-  timer_.Start(base::TimeDelta::FromSeconds(1), this,
+  timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), this,
                &NetworkChangeNotifierWin::NotifyParentOfOnlineStateChange);
 
   // Start watching for the next address change.
diff --git a/net/curvecp/messenger.cc b/net/curvecp/messenger.cc
index 703bc2e..ad6ed31 100644
--- a/net/curvecp/messenger.cc
+++ b/net/curvecp/messenger.cc
@@ -94,7 +94,8 @@
 
   int len = send_buffer_.write(buf->data(), buf_len);
   if (!send_timer_.IsRunning())
-    send_timer_.Start(base::TimeDelta(), this, &Messenger::OnSendTimer);
+    send_timer_.Start(FROM_HERE, base::TimeDelta(),
+                      this, &Messenger::OnSendTimer);
   if (len)
     return len;
 
@@ -183,7 +184,7 @@
     LOG(ERROR) << "RttTimeout is " << rtt_.rtt_timeout();
     base::TimeDelta delay =
         base::TimeDelta::FromMicroseconds(rtt_.rtt_timeout());
-    send_timeout_timer_.Start(delay, this, &Messenger::OnTimeout);
+    send_timeout_timer_.Start(FROM_HERE, delay, this, &Messenger::OnTimeout);
   }
 }
 
@@ -214,9 +215,9 @@
 
   // Set the next send timer.
   LOG(ERROR) << "SendRate is: " << rtt_.send_rate() << "us";
-  send_timer_.Start(base::TimeDelta::FromMicroseconds(rtt_.send_rate()),
-                    this,
-                    &Messenger::OnSendTimer);
+  send_timer_.Start(FROM_HERE,
+                    base::TimeDelta::FromMicroseconds(rtt_.send_rate()),
+                    this, &Messenger::OnSendTimer);
 
   // Create a block from the send_buffer.
   if (!sent_list_.is_full()) {
diff --git a/net/disk_cache/backend_impl.cc b/net/disk_cache/backend_impl.cc
index ed69dcd4a..3b2a4ca 100644
--- a/net/disk_cache/backend_impl.cc
+++ b/net/disk_cache/backend_impl.cc
@@ -472,7 +472,7 @@
     trace_object_ = TraceObject::GetTraceObject();
     // Create a recurrent timer of 30 secs.
     int timer_delay = unit_test_ ? 1000 : 30000;
-    timer_.Start(TimeDelta::FromMilliseconds(timer_delay), this,
+    timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(timer_delay), this,
                  &BackendImpl::OnStatsTimer);
   }
 
diff --git a/net/disk_cache/disk_cache_test_util.cc b/net/disk_cache/disk_cache_test_util.cc
index 054a41e2..b68e3eb 100644
--- a/net/disk_cache/disk_cache_test_util.cc
+++ b/net/disk_cache/disk_cache_test_util.cc
@@ -141,7 +141,7 @@
   ExpectCallbacks(num_callbacks);
   // Create a recurrent timer of 50 mS.
   if (!timer_.IsRunning())
-    timer_.Start(TimeDelta::FromMilliseconds(50), this,
+    timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(50), this,
                  &MessageLoopHelper::TimerExpired);
   MessageLoop::current()->Run();
   return completed_;
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index 6e287c8..30fd7bf 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -306,7 +306,7 @@
 }
 
 void DnsTransaction::StartTimer(base::TimeDelta delay) {
-  timer_.Start(delay, this, &DnsTransaction::OnTimeout);
+  timer_.Start(FROM_HERE, delay, this, &DnsTransaction::OnTimeout);
 }
 
 void DnsTransaction::RevokeTimer() {
diff --git a/net/http/http_response_body_drainer.cc b/net/http/http_response_body_drainer.cc
index cf32aaa..aefb180 100644
--- a/net/http/http_response_body_drainer.cc
+++ b/net/http/http_response_body_drainer.cc
@@ -30,7 +30,8 @@
   int rv = DoLoop(OK);
 
   if (rv == ERR_IO_PENDING) {
-    timer_.Start(base::TimeDelta::FromSeconds(kTimeoutInSeconds),
+    timer_.Start(FROM_HERE,
+                 base::TimeDelta::FromSeconds(kTimeoutInSeconds),
                  this,
                  &HttpResponseBodyDrainer::OnTimerFired);
     session_ = session;
diff --git a/net/proxy/dhcp_proxy_script_adapter_fetcher_win.cc b/net/proxy/dhcp_proxy_script_adapter_fetcher_win.cc
index 6b7283df..aaefc273 100644
--- a/net/proxy/dhcp_proxy_script_adapter_fetcher_win.cc
+++ b/net/proxy/dhcp_proxy_script_adapter_fetcher_win.cc
@@ -58,7 +58,7 @@
   state_ = STATE_WAIT_DHCP;
   callback_ = callback;
 
-  wait_timer_.Start(ImplGetTimeout(),
+  wait_timer_.Start(FROM_HERE, ImplGetTimeout(),
                     this, &DhcpProxyScriptAdapterFetcher::OnTimeout);
   worker_thread_ = ImplCreateWorkerThread(AsWeakPtr());
   worker_thread_->Start(adapter_name);
diff --git a/net/proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc b/net/proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc
index 47852a9..b8ed53c 100644
--- a/net/proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc
+++ b/net/proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc
@@ -53,7 +53,7 @@
     // the caller.
     fetcher_ = new MockProxyScriptFetcher();
     if (fetcher_delay_ms_ != -1) {
-      fetcher_timer_.Start(
+      fetcher_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(fetcher_delay_ms_),
           this, &MockDhcpProxyScriptAdapterFetcher::OnFetcherTimer);
     }
diff --git a/net/proxy/dhcp_proxy_script_fetcher_win.cc b/net/proxy/dhcp_proxy_script_fetcher_win.cc
index 5453284..000c918 100644
--- a/net/proxy/dhcp_proxy_script_fetcher_win.cc
+++ b/net/proxy/dhcp_proxy_script_fetcher_win.cc
@@ -169,7 +169,7 @@
   // for the rest of the results.
   if (state_ == STATE_NO_RESULTS) {
     state_ = STATE_SOME_RESULTS;
-    wait_timer_.Start(
+    wait_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(ImplGetMaxWaitMs()),
         this, &DhcpProxyScriptFetcherWin::OnWaitTimer);
   }
diff --git a/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc b/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc
index fe103b7..9ecd9234 100644
--- a/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc
+++ b/net/proxy/dhcp_proxy_script_fetcher_win_unittest.cc
@@ -53,7 +53,7 @@
             completion_callback_(this, &RealFetchTester::OnCompletion)),
         on_completion_is_error_(false) {
     // Make sure the test ends.
-    timeout_.Start(
+    timeout_.Start(FROM_HERE,
         base::TimeDelta::FromSeconds(5), this, &RealFetchTester::OnTimeout);
   }
 
@@ -72,7 +72,7 @@
     // Put the cancellation into the queue before even running the
     // test to avoid the chance of one of the adapter fetcher worker
     // threads completing before cancellation.  See http://crbug.com/86756.
-    cancel_timer_.Start(base::TimeDelta::FromMilliseconds(0),
+    cancel_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(0),
                         this, &RealFetchTester::OnCancelTimer);
     RunTest();
   }
@@ -225,7 +225,7 @@
   void Fetch(const std::string& adapter_name,
              CompletionCallback* callback) OVERRIDE {
     client_callback_ = callback;
-    timer_.Start(base::TimeDelta::FromMilliseconds(fetch_delay_ms_),
+    timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(fetch_delay_ms_),
                  this, &DummyDhcpProxyScriptAdapterFetcher::OnTimer);
   }
 
diff --git a/net/proxy/init_proxy_resolver.cc b/net/proxy/init_proxy_resolver.cc
index d2983b6..26d2e62 100644
--- a/net/proxy/init_proxy_resolver.cc
+++ b/net/proxy/init_proxy_resolver.cc
@@ -165,7 +165,8 @@
     return OK;
 
   // Otherwise wait the specified amount of time.
-  wait_timer_.Start(wait_delay_, this, &InitProxyResolver::OnWaitTimerFired);
+  wait_timer_.Start(FROM_HERE, wait_delay_, this,
+                    &InitProxyResolver::OnWaitTimerFired);
   net_log_.BeginEvent(NetLog::TYPE_INIT_PROXY_RESOLVER_WAIT, NULL);
   return ERR_IO_PENDING;
 }
diff --git a/net/proxy/proxy_config_service_linux.cc b/net/proxy/proxy_config_service_linux.cc
index 2e1958944..1f601bd 100644
--- a/net/proxy/proxy_config_service_linux.cc
+++ b/net/proxy/proxy_config_service_linux.cc
@@ -453,7 +453,7 @@
     // We don't use Reset() because the timer may not yet be running.
     // (In that case Stop() is a no-op.)
     debounce_timer_.Stop();
-    debounce_timer_.Start(
+    debounce_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kDebounceTimeoutMilliseconds),
         this, &SettingGetterImplGConf::OnDebouncedNotification);
   }
@@ -781,7 +781,7 @@
     // We don't use Reset() because the timer may not yet be running.
     // (In that case Stop() is a no-op.)
     debounce_timer_.Stop();
-    debounce_timer_.Start(
+    debounce_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kDebounceTimeoutMilliseconds),
         this, &SettingGetterImplGSettings::OnDebouncedNotification);
   }
@@ -1341,7 +1341,7 @@
       // We don't use Reset() because the timer may not yet be running.
       // (In that case Stop() is a no-op.)
       debounce_timer_.Stop();
-      debounce_timer_.Start(base::TimeDelta::FromMilliseconds(
+      debounce_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(
           kDebounceTimeoutMilliseconds), this,
           &SettingGetterImplKDE::OnDebouncedNotification);
     }
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index 24966c0..75fd528e 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -90,7 +90,7 @@
 
 int ConnectJob::Connect() {
   if (timeout_duration_ != base::TimeDelta())
-    timer_.Start(timeout_duration_, this, &ConnectJob::OnTimeout);
+    timer_.Start(FROM_HERE, timeout_duration_, this, &ConnectJob::OnTimeout);
 
   idle_ = false;
 
@@ -131,7 +131,7 @@
 
 void ConnectJob::ResetTimer(base::TimeDelta remaining_time) {
   timer_.Stop();
-  timer_.Start(remaining_time, this, &ConnectJob::OnTimeout);
+  timer_.Start(FROM_HERE, remaining_time, this, &ConnectJob::OnTimeout);
 }
 
 void ConnectJob::LogConnectStart() {
@@ -697,7 +697,7 @@
 
 void ClientSocketPoolBaseHelper::IncrementIdleCount() {
   if (++idle_socket_count_ == 1)
-    timer_.Start(TimeDelta::FromSeconds(kCleanupInterval), this,
+    timer_.Start(FROM_HERE, TimeDelta::FromSeconds(kCleanupInterval), this,
                  &ClientSocketPoolBaseHelper::OnCleanupTimerFired);
 }
 
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
index 617ddc3..11ee568 100644
--- a/net/socket/ssl_client_socket_nss.cc
+++ b/net/socket/ssl_client_socket_nss.cc
@@ -2053,7 +2053,7 @@
 
   if (false_start && !that->handshake_callback_called_) {
     that->corked_ = true;
-    that->uncork_timer_.Start(
+    that->uncork_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kCorkTimeoutMs),
         that, &SSLClientSocketNSS::UncorkAfterTimeout);
   }
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index aa0932f..8cb9570 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -223,7 +223,7 @@
   int rv = transport_socket_->Connect(&callback_);
   if (rv == ERR_IO_PENDING &&
       AddressListStartsWithIPv6AndHasAnIPv4Addr(addresses_)) {
-    fallback_timer_.Start(
+    fallback_timer_.Start(FROM_HERE,
         base::TimeDelta::FromMilliseconds(kIPv6FallbackTimerInMs),
         this, &TransportConnectJob::DoIPv6FallbackTransportConnect);
   }
diff --git a/remoting/host/heartbeat_sender.cc b/remoting/host/heartbeat_sender.cc
index 589eb312..182c06e8 100644
--- a/remoting/host/heartbeat_sender.cc
+++ b/remoting/host/heartbeat_sender.cc
@@ -77,7 +77,7 @@
                                     base::Unretained(this)));
 
   DoSendStanza();
-  timer_.Start(base::TimeDelta::FromMilliseconds(interval_ms_), this,
+  timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_), this,
                &HeartbeatSender::DoSendStanza);
 }
 
@@ -143,8 +143,8 @@
     // Restart the timer with the new interval.
     if (state_ == STARTED) {
       timer_.Stop();
-      timer_.Start(base::TimeDelta::FromMilliseconds(interval_ms_), this,
-                   &HeartbeatSender::DoSendStanza);
+      timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(interval_ms_),
+                   this, &HeartbeatSender::DoSendStanza);
     }
   }
 }
diff --git a/remoting/host/screen_recorder.cc b/remoting/host/screen_recorder.cc
index d3f0e4992..e0cf90a2 100644
--- a/remoting/host/screen_recorder.cc
+++ b/remoting/host/screen_recorder.cc
@@ -181,7 +181,7 @@
 
   base::TimeDelta interval = base::TimeDelta::FromMilliseconds(
       static_cast<int>(base::Time::kMillisecondsPerSecond / max_rate_));
-  capture_timer_.Start(interval, this, &ScreenRecorder::DoCapture);
+  capture_timer_.Start(FROM_HERE, interval, this, &ScreenRecorder::DoCapture);
 }
 
 void ScreenRecorder::DoCapture() {
diff --git a/ui/base/animation/animation_container.cc b/ui/base/animation/animation_container.cc
index 1e316cd26..c82d26b 100644
--- a/ui/base/animation/animation_container.cc
+++ b/ui/base/animation/animation_container.cc
@@ -85,7 +85,7 @@
   // that shouldn't be a problem for uses of Animation/AnimationContainer.
   timer_.Stop();
   min_timer_interval_ = delta;
-  timer_.Start(min_timer_interval_, this, &AnimationContainer::Run);
+  timer_.Start(FROM_HERE, min_timer_interval_, this, &AnimationContainer::Run);
 }
 
 TimeDelta AnimationContainer::GetMinInterval() {
diff --git a/views/controls/menu/menu_controller.cc b/views/controls/menu/menu_controller.cc
index 18589933..acad114 100644
--- a/views/controls/menu/menu_controller.cc
+++ b/views/controls/menu/menu_controller.cc
@@ -168,8 +168,9 @@
     is_scrolling_up_ = new_is_up;
 
     if (!scrolling_timer_.IsRunning()) {
-      scrolling_timer_.Start(TimeDelta::FromMilliseconds(kScrollTimerMS), this,
-                             &MenuScrollTask::Run);
+      scrolling_timer_.Start(FROM_HERE,
+                             TimeDelta::FromMilliseconds(kScrollTimerMS),
+                             this, &MenuScrollTask::Run);
     }
   }
 
@@ -1437,7 +1438,7 @@
 }
 
 void MenuController::StartShowTimer() {
-  show_timer_.Start(TimeDelta::FromMilliseconds(kShowDelay), this,
+  show_timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(kShowDelay), this,
                     &MenuController::CommitPendingSelection);
 }
 
@@ -1446,7 +1447,8 @@
 }
 
 void MenuController::StartCancelAllTimer() {
-  cancel_all_timer_.Start(TimeDelta::FromMilliseconds(kCloseOnExitTime),
+  cancel_all_timer_.Start(FROM_HERE,
+                          TimeDelta::FromMilliseconds(kCloseOnExitTime),
                           this, &MenuController::CancelAll);
 }
 
diff --git a/views/controls/throbber.cc b/views/controls/throbber.cc
index 34f20a8..741b0a6 100644
--- a/views/controls/throbber.cc
+++ b/views/controls/throbber.cc
@@ -34,7 +34,7 @@
 
   start_time_ = Time::Now();
 
-  timer_.Start(frame_time_ - TimeDelta::FromMilliseconds(10),
+  timer_.Start(FROM_HERE, frame_time_ - TimeDelta::FromMilliseconds(10),
                this, &Throbber::Run);
 
   running_ = true;
@@ -110,8 +110,8 @@
   stop_timer_.Stop();
 
   if (!running_ && !start_timer_.IsRunning()) {
-    start_timer_.Start(TimeDelta::FromMilliseconds(start_delay_ms_), this,
-                       &SmoothedThrobber::StartDelayOver);
+    start_timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(start_delay_ms_),
+                       this, &SmoothedThrobber::StartDelayOver);
   }
 }
 
@@ -124,8 +124,8 @@
     start_timer_.Stop();
 
   stop_timer_.Stop();
-  stop_timer_.Start(TimeDelta::FromMilliseconds(stop_delay_ms_), this,
-                    &SmoothedThrobber::StopDelayOver);
+  stop_timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(stop_delay_ms_),
+                    this, &SmoothedThrobber::StopDelayOver);
 }
 
 void SmoothedThrobber::StopDelayOver() {
diff --git a/views/repeat_controller.cc b/views/repeat_controller.cc
index bb70852..37e0892 100644
--- a/views/repeat_controller.cc
+++ b/views/repeat_controller.cc
@@ -25,8 +25,8 @@
 
 void RepeatController::Start() {
   // The first timer is slightly longer than subsequent repeats.
-  timer_.Start(TimeDelta::FromMilliseconds(kInitialRepeatDelay), this,
-               &RepeatController::Run);
+  timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(kInitialRepeatDelay),
+               this, &RepeatController::Run);
 }
 
 void RepeatController::Stop() {
@@ -37,7 +37,7 @@
 // RepeatController, private:
 
 void RepeatController::Run() {
-  timer_.Start(TimeDelta::FromMilliseconds(kRepeatDelay), this,
+  timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(kRepeatDelay), this,
                &RepeatController::Run);
   callback_->Run();
 }
diff --git a/views/touchui/touch_factory.cc b/views/touchui/touch_factory.cc
index 65802289..81dd41d 100644
--- a/views/touchui/touch_factory.cc
+++ b/views/touchui/touch_factory.cc
@@ -351,7 +351,8 @@
   // The cursor is going to be shown. Reset the timer for hiding it.
   if (show && start_timer) {
     cursor_timer_.Stop();
-    cursor_timer_.Start(base::TimeDelta::FromSeconds(kCursorIdleSeconds),
+    cursor_timer_.Start(
+        FROM_HERE, base::TimeDelta::FromSeconds(kCursorIdleSeconds),
         this, &TouchFactory::HideCursorForInactivity);
   } else {
     cursor_timer_.Stop();
diff --git a/views/touchui/touch_selection_controller_impl.cc b/views/touchui/touch_selection_controller_impl.cc
index eff3be6..a34b6be 100644
--- a/views/touchui/touch_selection_controller_impl.cc
+++ b/views/touchui/touch_selection_controller_impl.cc
@@ -311,6 +311,7 @@
   // We do not want to show the context menu while dragging.
   HideContextMenu();
   context_menu_timer_.Start(
+      FROM_HERE,
       base::TimeDelta::FromMilliseconds(kContextMenuTimoutMs),
       this,
       &TouchSelectionControllerImpl::ContextMenuTimerFired);
@@ -387,6 +388,7 @@
   // If there is selection, we restart the context menu timer.
   if (p1 != p2) {
     context_menu_timer_.Start(
+        FROM_HERE,
         base::TimeDelta::FromMilliseconds(kContextMenuTimoutMs),
         this,
         &TouchSelectionControllerImpl::ContextMenuTimerFired);
diff --git a/views/widget/tooltip_manager_views.cc b/views/widget/tooltip_manager_views.cc
index b952b093..d0d2a86 100644
--- a/views/widget/tooltip_manager_views.cc
+++ b/views/widget/tooltip_manager_views.cc
@@ -77,7 +77,8 @@
   tooltip_widget_->SetContentsView(&tooltip_label_);
   tooltip_widget_->Activate();
   tooltip_widget_->SetAlwaysOnTop(true);
-  tooltip_timer_.Start(base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs),
+  tooltip_timer_.Start(FROM_HERE,
+      base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs),
       this, &TooltipManagerViews::TooltipTimerFired);
   MessageLoopForUI::current()->AddObserver(this);
 }
diff --git a/webkit/fileapi/obfuscated_file_system_file_util.cc b/webkit/fileapi/obfuscated_file_system_file_util.cc
index f07adfa..6c51cba 100644
--- a/webkit/fileapi/obfuscated_file_system_file_util.cc
+++ b/webkit/fileapi/obfuscated_file_system_file_util.cc
@@ -1195,8 +1195,8 @@
   if (timer_.IsRunning())
     timer_.Reset();
   else
-    timer_.Start(base::TimeDelta::FromSeconds(kFlushDelaySeconds), this,
-      &ObfuscatedFileSystemFileUtil::DropDatabases);
+    timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(kFlushDelaySeconds),
+                 this, &ObfuscatedFileSystemFileUtil::DropDatabases);
 }
 
 void ObfuscatedFileSystemFileUtil::DropDatabases() {
diff --git a/webkit/glue/resource_fetcher.cc b/webkit/glue/resource_fetcher.cc
index a22af59..ae8c917 100644
--- a/webkit/glue/resource_fetcher.cc
+++ b/webkit/glue/resource_fetcher.cc
@@ -127,7 +127,7 @@
     const GURL& url, WebFrame* frame, WebURLRequest::TargetType target_type,
     int timeout_secs, Callback* callback)
     : ResourceFetcher(url, frame, target_type, callback) {
-  timeout_timer_.Start(TimeDelta::FromSeconds(timeout_secs), this,
+  timeout_timer_.Start(FROM_HERE, TimeDelta::FromSeconds(timeout_secs), this,
                        &ResourceFetcherWithTimeout::TimeoutFired);
 }
 
diff --git a/webkit/glue/resource_fetcher_unittest.cc b/webkit/glue/resource_fetcher_unittest.cc
index 9ef0fc61..be878f3 100644
--- a/webkit/glue/resource_fetcher_unittest.cc
+++ b/webkit/glue/resource_fetcher_unittest.cc
@@ -70,7 +70,8 @@
   }
 
   void StartTimer() {
-    timer_.Start(base::TimeDelta::FromMilliseconds(kMaxWaitTimeMs),
+    timer_.Start(FROM_HERE,
+                 base::TimeDelta::FromMilliseconds(kMaxWaitTimeMs),
                  this,
                  &FetcherDelegate::TimerFired);
   }
diff --git a/webkit/glue/webkitplatformsupport_impl.cc b/webkit/glue/webkitplatformsupport_impl.cc
index 6405431..b3dfaec 100644
--- a/webkit/glue/webkitplatformsupport_impl.cc
+++ b/webkit/glue/webkitplatformsupport_impl.cc
@@ -528,8 +528,8 @@
     interval = 0;
 
   shared_timer_.Stop();
-  shared_timer_.Start(base::TimeDelta::FromMicroseconds(interval), this,
-                      &WebKitPlatformSupportImpl::DoTimeout);
+  shared_timer_.Start(FROM_HERE, base::TimeDelta::FromMicroseconds(interval),
+                      this, &WebKitPlatformSupportImpl::DoTimeout);
 }
 
 void WebKitPlatformSupportImpl::stopSharedTimer() {
diff --git a/webkit/plugins/npapi/webplugin_delegate_impl_mac.mm b/webkit/plugins/npapi/webplugin_delegate_impl_mac.mm
index bdd6eac..5de0b59 100644
--- a/webkit/plugins/npapi/webplugin_delegate_impl_mac.mm
+++ b/webkit/plugins/npapi/webplugin_delegate_impl_mac.mm
@@ -122,7 +122,8 @@
     // Adds |delegate| to this visibility group.
     void RegisterDelegate(WebPluginDelegateImpl* delegate) {
       if (delegates_.empty()) {
-        timer_.Start(base::TimeDelta::FromMilliseconds(timer_period_),
+        timer_.Start(FROM_HERE,
+                     base::TimeDelta::FromMilliseconds(timer_period_),
                      this, &VisibilityGroup::SendIdleEvents);
       }
       delegates_.insert(delegate);
@@ -1023,7 +1024,7 @@
   if (instance()->drawing_model() == NPDrawingModelCoreAnimation) {
     bool plugin_visible = container_is_visible_ && !clip_rect_.IsEmpty();
     if (plugin_visible && !redraw_timer_->IsRunning() && windowed_handle()) {
-      redraw_timer_->Start(
+      redraw_timer_->Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(kCoreAnimationRedrawPeriodMs),
           this, &WebPluginDelegateImpl::DrawLayerInSurface);
     } else if (!plugin_visible) {
diff --git a/webkit/quota/quota_database.cc b/webkit/quota/quota_database.cc
index c9f2056..d34451e8 100644
--- a/webkit/quota/quota_database.cc
+++ b/webkit/quota/quota_database.cc
@@ -430,8 +430,8 @@
 void QuotaDatabase::ScheduleCommit() {
   if (timer_.IsRunning())
     return;
-  timer_.Start(base::TimeDelta::FromMilliseconds(kCommitIntervalMs), this,
-               &QuotaDatabase::Commit);
+  timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kCommitIntervalMs),
+               this, &QuotaDatabase::Commit);
 }
 
 bool QuotaDatabase::FindOriginUsedCount(
diff --git a/webkit/quota/quota_manager.cc b/webkit/quota/quota_manager.cc
index b5d9196c..60d7c32 100644
--- a/webkit/quota/quota_manager.cc
+++ b/webkit/quota/quota_manager.cc
@@ -507,7 +507,8 @@
   virtual void DatabaseTaskCompleted() OVERRIDE {
     manager()->need_initialize_origins_ = need_initialize_origins_;
     manager()->DidInitializeTemporaryGlobalQuota(temporary_storage_quota_);
-    manager()->histogram_timer_.Start(QuotaManager::kReportHistogramInterval,
+    manager()->histogram_timer_.Start(FROM_HERE,
+                                      QuotaManager::kReportHistogramInterval,
                                       manager(),
                                       &QuotaManager::ReportHistogram);
   }
diff --git a/webkit/quota/quota_temporary_storage_evictor.cc b/webkit/quota/quota_temporary_storage_evictor.cc
index 8990331..49229c3 100644
--- a/webkit/quota/quota_temporary_storage_evictor.cc
+++ b/webkit/quota/quota_temporary_storage_evictor.cc
@@ -128,15 +128,15 @@
 
   if (histogram_timer_.IsRunning())
     return;
-  histogram_timer_.Start(kHistogramReportInterval, this,
+  histogram_timer_.Start(FROM_HERE, kHistogramReportInterval, this,
                          &QuotaTemporaryStorageEvictor::ReportPerHourHistogram);
 }
 
 void QuotaTemporaryStorageEvictor::StartEvictionTimerWithDelay(int delay_ms) {
   if (eviction_timer_.IsRunning())
     return;
-  eviction_timer_.Start(base::TimeDelta::FromMilliseconds(delay_ms), this,
-                        &QuotaTemporaryStorageEvictor::ConsiderEviction);
+  eviction_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(delay_ms),
+                        this, &QuotaTemporaryStorageEvictor::ConsiderEviction);
 }
 
 void QuotaTemporaryStorageEvictor::ConsiderEviction() {
diff --git a/webkit/tools/test_shell/layout_test_controller.cc b/webkit/tools/test_shell/layout_test_controller.cc
index 5a32064..4b3fda1 100644
--- a/webkit/tools/test_shell/layout_test_controller.cc
+++ b/webkit/tools/test_shell/layout_test_controller.cc
@@ -103,7 +103,7 @@
 
   if (!queue_.empty()) {
     // We delay processing queued work to avoid recursion problems.
-    timer_.Start(base::TimeDelta(), this, &WorkQueue::ProcessWork);
+    timer_.Start(FROM_HERE, base::TimeDelta(), this, &WorkQueue::ProcessWork);
   } else if (!wait_until_done_) {
     shell_->TestFinished();
   }
diff --git a/webkit/tools/test_shell/simple_resource_loader_bridge.cc b/webkit/tools/test_shell/simple_resource_loader_bridge.cc
index babefc1..73f9160e 100644
--- a/webkit/tools/test_shell/simple_resource_loader_bridge.cc
+++ b/webkit/tools/test_shell/simple_resource_loader_bridge.cc
@@ -321,7 +321,7 @@
 
     if (request_->has_upload() &&
         params->load_flags & net::LOAD_ENABLE_UPLOAD_PROGRESS) {
-      upload_progress_timer_.Start(
+      upload_progress_timer_.Start(FROM_HERE,
           base::TimeDelta::FromMilliseconds(kUpdateUploadProgressIntervalMsec),
           this, &RequestProxy::MaybeUpdateUploadProgress);
     }