Index: chrome/browser/jumplist_win.cc |
diff --git a/chrome/browser/jumplist_win.cc b/chrome/browser/jumplist_win.cc |
index a0881e7c1c3d30ad92dfca44f4e6c6f5a13367d4..251f122cf77ad0874ece3f2f7f0c6365029f1e0a 100644 |
--- a/chrome/browser/jumplist_win.cc |
+++ b/chrome/browser/jumplist_win.cc |
@@ -9,6 +9,7 @@ |
#include "base/command_line.h" |
#include "base/files/file_util.h" |
#include "base/path_service.h" |
+#include "base/prefs/pref_change_registrar.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/threading/thread.h" |
@@ -24,6 +25,7 @@ |
#include "chrome/browser/shell_integration.h" |
#include "chrome/common/chrome_constants.h" |
#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/pref_names.h" |
#include "chrome/common/url_constants.h" |
#include "chrome/grit/generated_resources.h" |
#include "components/favicon_base/favicon_types.h" |
@@ -82,7 +84,9 @@ bool CreateIconFile(const SkBitmap& bitmap, |
} |
// Updates the "Tasks" category of the JumpList. |
-bool UpdateTaskCategory(JumpListUpdater* jumplist_updater) { |
+bool UpdateTaskCategory( |
+ JumpListUpdater* jumplist_updater, |
+ IncognitoModePrefs::Availability incognito_availability) { |
base::FilePath chrome_path; |
if (!PathService::Get(base::FILE_EXE, &chrome_path)) |
return false; |
@@ -93,24 +97,28 @@ bool UpdateTaskCategory(JumpListUpdater* jumplist_updater) { |
// collection. We use our application icon as the icon for this item. |
// We remove '&' characters from this string so we can share it with our |
// system menu. |
- scoped_refptr<ShellLinkItem> chrome = CreateShellLink(); |
- base::string16 chrome_title = l10n_util::GetStringUTF16(IDS_NEW_WINDOW); |
- ReplaceSubstringsAfterOffset(&chrome_title, 0, L"&", L""); |
- chrome->set_title(chrome_title); |
- chrome->set_icon(chrome_path.value(), 0); |
- items.push_back(chrome); |
+ if (incognito_availability != IncognitoModePrefs::FORCED) { |
+ scoped_refptr<ShellLinkItem> chrome = CreateShellLink(); |
+ base::string16 chrome_title = l10n_util::GetStringUTF16(IDS_NEW_WINDOW); |
+ ReplaceSubstringsAfterOffset(&chrome_title, 0, L"&", L""); |
+ chrome->set_title(chrome_title); |
+ chrome->set_icon(chrome_path.value(), 0); |
+ items.push_back(chrome); |
+ } |
// Create an IShellLink object which launches Chrome in incognito mode, and |
// add it to the collection. We use our application icon as the icon for |
// this item. |
- scoped_refptr<ShellLinkItem> incognito = CreateShellLink(); |
- incognito->GetCommandLine()->AppendSwitch(switches::kIncognito); |
- base::string16 incognito_title = |
- l10n_util::GetStringUTF16(IDS_NEW_INCOGNITO_WINDOW); |
- ReplaceSubstringsAfterOffset(&incognito_title, 0, L"&", L""); |
- incognito->set_title(incognito_title); |
- incognito->set_icon(chrome_path.value(), 0); |
- items.push_back(incognito); |
+ if (incognito_availability != IncognitoModePrefs::DISABLED) { |
+ scoped_refptr<ShellLinkItem> incognito = CreateShellLink(); |
+ incognito->GetCommandLine()->AppendSwitch(switches::kIncognito); |
+ base::string16 incognito_title = |
+ l10n_util::GetStringUTF16(IDS_NEW_INCOGNITO_WINDOW); |
+ ReplaceSubstringsAfterOffset(&incognito_title, 0, L"&", L""); |
+ incognito->set_title(incognito_title); |
+ incognito->set_icon(chrome_path.value(), 0); |
+ items.push_back(incognito); |
+ } |
return jumplist_updater->AddTasks(items); |
} |
@@ -118,7 +126,8 @@ bool UpdateTaskCategory(JumpListUpdater* jumplist_updater) { |
// Updates the application JumpList. |
bool UpdateJumpList(const wchar_t* app_id, |
const ShellLinkItemList& most_visited_pages, |
- const ShellLinkItemList& recently_closed_pages) { |
+ const ShellLinkItemList& recently_closed_pages, |
+ IncognitoModePrefs::Availability incognito_availability) { |
// JumpList is implemented only on Windows 7 or later. |
// So, we should return now when this function is called on earlier versions |
// of Windows. |
@@ -164,7 +173,7 @@ bool UpdateJumpList(const wchar_t* app_id, |
} |
// Update the "Tasks" category of the JumpList. |
- if (!UpdateTaskCategory(&jumplist_updater)) |
+ if (!UpdateTaskCategory(&jumplist_updater, incognito_availability)) |
return false; |
// Commit this transaction and send the updated JumpList to Windows. |
@@ -176,37 +185,23 @@ bool UpdateJumpList(const wchar_t* app_id, |
} // namespace |
-JumpList::JumpList() |
+JumpList::JumpList(Profile* profile) |
: weak_ptr_factory_(this), |
- profile_(NULL), |
- task_id_(base::CancelableTaskTracker::kBadTaskId) {} |
- |
-JumpList::~JumpList() { |
- Terminate(); |
-} |
- |
-// static |
-bool JumpList::Enabled() { |
- return JumpListUpdater::IsEnabled(); |
-} |
- |
-bool JumpList::AddObserver(Profile* profile) { |
+ profile_(profile), |
+ task_id_(base::CancelableTaskTracker::kBadTaskId) { |
+ DCHECK(Enabled()); |
// To update JumpList when a tab is added or removed, we add this object to |
// the observer list of the TabRestoreService class. |
// When we add this object to the observer list, we save the pointer to this |
// TabRestoreService object. This pointer is used when we remove this object |
// from the observer list. |
- if (!JumpListUpdater::IsEnabled() || !profile) |
- return false; |
- |
TabRestoreService* tab_restore_service = |
- TabRestoreServiceFactory::GetForProfile(profile); |
+ TabRestoreServiceFactory::GetForProfile(profile_); |
if (!tab_restore_service) |
- return false; |
+ return; |
- app_id_ = ShellIntegration::GetChromiumModelIdForProfile(profile->GetPath()); |
- icon_dir_ = profile->GetPath().Append(chrome::kJumpListIconDirname); |
- profile_ = profile; |
+ app_id_ = ShellIntegration::GetChromiumModelIdForProfile(profile_->GetPath()); |
+ icon_dir_ = profile_->GetPath().Append(chrome::kJumpListIconDirname); |
history::TopSites* top_sites = profile_->GetTopSites(); |
if (top_sites) { |
// TopSites updates itself after a delay. This is especially noticable when |
@@ -224,7 +219,20 @@ bool JumpList::AddObserver(Profile* profile) { |
content::Source<Profile>(profile_)); |
} |
tab_restore_service->AddObserver(this); |
- return true; |
+ pref_change_registrar_.reset(new PrefChangeRegistrar); |
+ pref_change_registrar_->Init(profile_->GetPrefs()); |
+ pref_change_registrar_->Add( |
+ prefs::kIncognitoModeAvailability, |
+ base::Bind(&JumpList::OnIncognitoAvailabilityChanged, this)); |
+} |
+ |
+JumpList::~JumpList() { |
+ Terminate(); |
+} |
+ |
+// static |
+bool JumpList::Enabled() { |
+ return JumpListUpdater::IsEnabled(); |
} |
void JumpList::Observe(int type, |
@@ -251,17 +259,6 @@ void JumpList::Observe(int type, |
} |
} |
-void JumpList::RemoveObserver() { |
- if (profile_) { |
- TabRestoreService* tab_restore_service = |
- TabRestoreServiceFactory::GetForProfile(profile_); |
- if (tab_restore_service) |
- tab_restore_service->RemoveObserver(this); |
- registrar_.reset(); |
- } |
- profile_ = NULL; |
-} |
- |
void JumpList::CancelPendingUpdate() { |
if (task_id_ != base::CancelableTaskTracker::kBadTaskId) { |
cancelable_task_tracker_.TryCancel(task_id_); |
@@ -271,7 +268,15 @@ void JumpList::CancelPendingUpdate() { |
void JumpList::Terminate() { |
CancelPendingUpdate(); |
- RemoveObserver(); |
+ if (profile_) { |
+ TabRestoreService* tab_restore_service = |
+ TabRestoreServiceFactory::GetForProfile(profile_); |
+ if (tab_restore_service) |
+ tab_restore_service->RemoveObserver(this); |
+ registrar_.reset(); |
+ pref_change_registrar_.reset(); |
+ } |
+ profile_ = NULL; |
} |
void JumpList::OnMostVisitedURLsAvailable( |
@@ -379,20 +384,24 @@ void JumpList::AddWindow(const TabRestoreService::Window* window, |
void JumpList::StartLoadingFavicon() { |
GURL url; |
+ bool waiting_for_icons = true; |
{ |
base::AutoLock auto_lock(list_lock_); |
- if (icon_urls_.empty()) { |
- // No more favicons are needed by the application JumpList. Schedule a |
- // RunUpdate call. |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&JumpList::RunUpdate, this)); |
- return; |
+ waiting_for_icons = !icon_urls_.empty(); |
+ if (waiting_for_icons) { |
+ // Ask FaviconService if it has a favicon of a URL. |
+ // When FaviconService has one, it will call OnFaviconDataAvailable(). |
+ url = GURL(icon_urls_.front().first); |
} |
- // Ask FaviconService if it has a favicon of a URL. |
- // When FaviconService has one, it will call OnFaviconDataAvailable(). |
- url = GURL(icon_urls_.front().first); |
} |
+ |
+ if (!waiting_for_icons) { |
+ // No more favicons are needed by the application JumpList. Schedule a |
+ // RunUpdate call. |
+ PostRunUpdate(); |
+ return; |
+ } |
+ |
FaviconService* favicon_service = |
FaviconServiceFactory::GetForProfile(profile_, Profile::EXPLICIT_ACCESS); |
task_id_ = favicon_service->GetFaviconImageForPageURL( |
@@ -423,7 +432,31 @@ void JumpList::OnFaviconDataAvailable( |
StartLoadingFavicon(); |
} |
-void JumpList::RunUpdate() { |
+void JumpList::OnIncognitoAvailabilityChanged() { |
+ bool waiting_for_icons = true; |
+ { |
+ base::AutoLock auto_lock(list_lock_); |
+ waiting_for_icons = !icon_urls_.empty(); |
+ } |
+ if (!waiting_for_icons) |
+ PostRunUpdate(); |
+ // If |icon_urls_| isn't empty then OnFaviconDataAvailable will eventually |
+ // call PostRunUpdate(). |
+} |
+ |
+void JumpList::PostRunUpdate() { |
+ // Check if incognito windows (or normal windows) are disabled by policy. |
+ IncognitoModePrefs::Availability incognito_availability = |
+ profile_ ? IncognitoModePrefs::GetAvailability(profile_->GetPrefs()) |
+ : IncognitoModePrefs::ENABLED; |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&JumpList::RunUpdate, this, incognito_availability)); |
+} |
+ |
+void JumpList::RunUpdate( |
+ IncognitoModePrefs::Availability incognito_availability) { |
ShellLinkItemList local_most_visited_pages; |
ShellLinkItemList local_recently_closed_pages; |
@@ -455,11 +488,11 @@ void JumpList::RunUpdate() { |
// category. |
CreateIconFiles(local_recently_closed_pages); |
- // We finished collecting all resources needed for updating an appliation |
+ // We finished collecting all resources needed for updating an application |
// JumpList. So, create a new JumpList and replace the current JumpList |
// with it. |
UpdateJumpList(app_id_.c_str(), local_most_visited_pages, |
- local_recently_closed_pages); |
+ local_recently_closed_pages, incognito_availability); |
} |
void JumpList::CreateIconFiles(const ShellLinkItemList& item_list) { |