| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/upgrade_detector.h" | 5 #include "chrome/browser/upgrade_detector.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/scoped_ptr.h" | 10 #include "base/scoped_ptr.h" |
| 11 #include "base/time.h" | 11 #include "base/time.h" |
| 12 #include "base/task.h" | 12 #include "base/task.h" |
| 13 #include "base/string_number_conversions.h" | 13 #include "base/string_number_conversions.h" |
| 14 #include "base/string_util.h" | 14 #include "base/string_util.h" |
| 15 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 16 #include "chrome/browser/chrome_thread.h" | 16 #include "chrome/browser/chrome_thread.h" |
| 17 #include "chrome/browser/platform_util.h" |
| 17 #include "chrome/browser/prefs/pref_service.h" | 18 #include "chrome/browser/prefs/pref_service.h" |
| 18 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
| 19 #include "chrome/common/chrome_version_info.h" | 20 #include "chrome/common/chrome_version_info.h" |
| 20 #include "chrome/common/notification_service.h" | 21 #include "chrome/common/notification_service.h" |
| 21 #include "chrome/common/notification_type.h" | 22 #include "chrome/common/notification_type.h" |
| 22 #include "chrome/common/pref_names.h" | 23 #include "chrome/common/pref_names.h" |
| 23 #include "chrome/installer/util/browser_distribution.h" | 24 #include "chrome/installer/util/browser_distribution.h" |
| 24 | 25 |
| 25 #if defined(OS_WIN) | 26 #if defined(OS_WIN) |
| 26 #include "chrome/installer/util/install_util.h" | 27 #include "chrome/installer/util/install_util.h" |
| 27 #elif defined(OS_MACOSX) | 28 #elif defined(OS_MACOSX) |
| 28 #include "chrome/browser/cocoa/keystone_glue.h" | 29 #include "chrome/browser/cocoa/keystone_glue.h" |
| 29 #elif defined(OS_POSIX) | 30 #elif defined(OS_POSIX) |
| 30 #include "base/process_util.h" | 31 #include "base/process_util.h" |
| 31 #include "chrome/installer/util/version.h" | 32 #include "chrome/installer/util/version.h" |
| 32 #endif | 33 #endif |
| 33 | 34 |
| 34 namespace { | 35 namespace { |
| 35 | 36 |
| 36 // How often to check for an upgrade. | 37 // How often to check for an upgrade. |
| 37 // TODO(finnur): Once we have a good way of determining which branch the user | 38 int GetCheckForUpgradeEveryMs() { |
| 38 // is on at runtime we should check more frequently for the dev branch. | 39 // Check for a value passed via the command line. |
| 39 const int kCheckForUpgradeEveryMs = 24 * 60 * 60 * 1000; // Check daily. | 40 int interval_ms; |
| 41 const CommandLine& cmd_line = *CommandLine::ForCurrentProcess(); |
| 42 std::string interval = |
| 43 cmd_line.GetSwitchValueASCII(switches::kCheckForUpdateIntervalSec); |
| 44 if (!interval.empty() && base::StringToInt(interval, &interval_ms)) |
| 45 return interval_ms * 1000; // Command line value is in seconds. |
| 46 |
| 47 // Otherwise check once an hour for dev channel and once a day for all other |
| 48 // channels/builds. |
| 49 const std::string channel = platform_util::GetVersionStringModifier(); |
| 50 int hours; |
| 51 if (channel == "dev") |
| 52 hours = 1; |
| 53 else |
| 54 hours = 24; |
| 55 |
| 56 return hours * 60 * 60 * 1000; |
| 57 } |
| 40 | 58 |
| 41 // How long to wait before notifying the user about the upgrade. | 59 // How long to wait before notifying the user about the upgrade. |
| 42 const int kNotifyUserAfterMs = 0; | 60 const int kNotifyUserAfterMs = 0; |
| 43 | 61 |
| 44 // The thread to run the upgrade detection code on. We use FILE for Linux | 62 // The thread to run the upgrade detection code on. We use FILE for Linux |
| 45 // because we don't want to block the UI thread while launching a background | 63 // because we don't want to block the UI thread while launching a background |
| 46 // process and reading its output; on the Mac, checking for an upgrade | 64 // process and reading its output; on the Mac, checking for an upgrade |
| 47 // requires reading a file. | 65 // requires reading a file. |
| 48 const ChromeThread::ID kDetectUpgradeTaskID = | 66 const ChromeThread::ID kDetectUpgradeTaskID = |
| 49 #if defined(OS_POSIX) | 67 #if defined(OS_POSIX) |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), | 158 : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), |
| 141 notify_upgrade_(false) { | 159 notify_upgrade_(false) { |
| 142 // Windows: only enable upgrade notifications for official builds. | 160 // Windows: only enable upgrade notifications for official builds. |
| 143 // Mac: only enable them if the updater (Keystone) is present. | 161 // Mac: only enable them if the updater (Keystone) is present. |
| 144 // Linux (and other POSIX): always enable regardless of branding. | 162 // Linux (and other POSIX): always enable regardless of branding. |
| 145 #if (defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)) || defined(OS_POSIX) | 163 #if (defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)) || defined(OS_POSIX) |
| 146 #if defined(OS_MACOSX) | 164 #if defined(OS_MACOSX) |
| 147 if (keystone_glue::KeystoneEnabled()) | 165 if (keystone_glue::KeystoneEnabled()) |
| 148 #endif | 166 #endif |
| 149 { | 167 { |
| 150 int interval_ms = kCheckForUpgradeEveryMs; | |
| 151 const CommandLine& cmd_line = *CommandLine::ForCurrentProcess(); | |
| 152 std::string interval = | |
| 153 cmd_line.GetSwitchValueASCII(switches::kCheckForUpdateIntervalSec); | |
| 154 if (!interval.empty() && base::StringToInt(interval, &interval_ms)) | |
| 155 interval_ms *= 1000; // Command line value is in seconds. | |
| 156 | |
| 157 detect_upgrade_timer_.Start( | 168 detect_upgrade_timer_.Start( |
| 158 base::TimeDelta::FromMilliseconds(interval_ms), | 169 base::TimeDelta::FromMilliseconds(GetCheckForUpgradeEveryMs()), |
| 159 this, &UpgradeDetector::CheckForUpgrade); | 170 this, &UpgradeDetector::CheckForUpgrade); |
| 160 } | 171 } |
| 161 #endif | 172 #endif |
| 162 } | 173 } |
| 163 | 174 |
| 164 UpgradeDetector::~UpgradeDetector() { | 175 UpgradeDetector::~UpgradeDetector() { |
| 165 } | 176 } |
| 166 | 177 |
| 167 void UpgradeDetector::CheckForUpgrade() { | 178 void UpgradeDetector::CheckForUpgrade() { |
| 168 method_factory_.RevokeAll(); | 179 method_factory_.RevokeAll(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 190 } | 201 } |
| 191 | 202 |
| 192 void UpgradeDetector::NotifyOnUpgrade() { | 203 void UpgradeDetector::NotifyOnUpgrade() { |
| 193 notify_upgrade_ = true; | 204 notify_upgrade_ = true; |
| 194 | 205 |
| 195 NotificationService::current()->Notify( | 206 NotificationService::current()->Notify( |
| 196 NotificationType::UPGRADE_RECOMMENDED, | 207 NotificationType::UPGRADE_RECOMMENDED, |
| 197 Source<UpgradeDetector>(this), | 208 Source<UpgradeDetector>(this), |
| 198 NotificationService::NoDetails()); | 209 NotificationService::NoDetails()); |
| 199 } | 210 } |
| OLD | NEW |