diff options
author | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-05 21:44:34 +0000 |
---|---|---|
committer | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-05 21:44:34 +0000 |
commit | b9503276adc3f736b9a2c07116297fbfaf9a96fb (patch) | |
tree | 36b218b0532590cf1d54f1c9b51984e1e0cd2db3 | |
parent | 3fae4c589cc60e1b43a618d6e4bfdd078da507d1 (diff) | |
download | chromium_src-b9503276adc3f736b9a2c07116297fbfaf9a96fb.zip chromium_src-b9503276adc3f736b9a2c07116297fbfaf9a96fb.tar.gz chromium_src-b9503276adc3f736b9a2c07116297fbfaf9a96fb.tar.bz2 |
Ensure that the Chrome downloads folder option in Chrome ASH on Windows switches to desktop mode while opening the
downloads folder.
The current behavior is that the downloads folder is opened on the desktop while the user continues to stay in ASH mode
leading to confusion.
To fix this we reuse the ActivateDesktopHelper function in application_lifetime_win.cc. This function takes a boolean parameter
now which indicates if we should be exiting ash after activating the desktop. This flag is true when we launch desktop chrome from
ASH and is false when invoked to open the downloads folder via the functions in platform_util_win.cc. The MetroViewerHostMsg_ActivateDesktop
IPC now has a flag which indicates if we should exit ash after activating desktop. If this flag is false we terminate the
delegate_execute process which was launched to switch to desktop.
Fixes bug https://code.google.com/p/chromium/issues/detail?id=324252
BUG=324252
R=cpu@chromium.org, jschuh@chromium.org, sky@chromium.org, cpu
Review URL: https://codereview.chromium.org/102603006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239041 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/lifetime/application_lifetime.h | 12 | ||||
-rw-r--r-- | chrome/browser/lifetime/application_lifetime_win.cc | 14 | ||||
-rw-r--r-- | chrome/browser/platform_util_win.cc | 13 | ||||
-rw-r--r-- | ui/aura/remote_root_window_host_win.cc | 5 | ||||
-rw-r--r-- | ui/aura/remote_root_window_host_win.h | 9 | ||||
-rw-r--r-- | ui/metro_viewer/metro_viewer_messages.h | 5 | ||||
-rw-r--r-- | win8/metro_driver/chrome_app_view_ash.cc | 21 | ||||
-rw-r--r-- | win8/metro_driver/chrome_app_view_ash.h | 2 |
8 files changed, 66 insertions, 15 deletions
diff --git a/chrome/browser/lifetime/application_lifetime.h b/chrome/browser/lifetime/application_lifetime.h index 59c0d4a..8172e55 100644 --- a/chrome/browser/lifetime/application_lifetime.h +++ b/chrome/browser/lifetime/application_lifetime.h @@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_H_ #define CHROME_BROWSER_LIFETIME_APPLICATION_LIFETIME_H_ +#include "base/compiler_specific.h" + class Browser; namespace chrome { @@ -35,6 +37,16 @@ void AttemptRestart(); void AttemptRestartWithModeSwitch(); void AttemptRestartToDesktopMode(); void AttemptRestartToMetroMode(); + +enum AshExecutionStatus { + ASH_KEEP_RUNNING, + ASH_TERMINATE, +}; + +// Helper function to activate the desktop from Ash mode. The +// |ash_execution_status| parameter indicates if we should exit Ash after +// activating desktop. +void ActivateDesktopHelper(AshExecutionStatus ash_execution_status); #endif // Attempt to exit by closing all browsers. This is equivalent to diff --git a/chrome/browser/lifetime/application_lifetime_win.cc b/chrome/browser/lifetime/application_lifetime_win.cc index 9c5cbde..74615e9 100644 --- a/chrome/browser/lifetime/application_lifetime_win.cc +++ b/chrome/browser/lifetime/application_lifetime_win.cc @@ -66,7 +66,9 @@ void ActivateDesktopHelperReply() { AttemptRestart(); } -void ActivateDesktopHelper() { +void ActivateDesktopIgnore() {} + +void ActivateDesktopHelper(AshExecutionStatus ash_execution_status) { scoped_ptr<base::Environment> env(base::Environment::Create()); std::string version_str; @@ -88,11 +90,15 @@ void ActivateDesktopHelper() { path = path.Append(installer::kDelegateExecuteExe); + bool ash_exit = ash_execution_status == ASH_TERMINATE; // Actually launching the process needs to happen in the metro viewer, // otherwise it won't automatically transition to desktop. So we have // to send an IPC to the viewer to do the ShellExecute. - aura::HandleActivateDesktop(path, - base::Bind(ActivateDesktopHelperReply)); + aura::HandleActivateDesktop( + path, + ash_exit, + ash_exit ? base::Bind(ActivateDesktopHelperReply) : + base::Bind(ActivateDesktopIgnore)); } #endif @@ -106,7 +112,7 @@ void AttemptRestartToDesktopMode() { // We need to PostTask as there is some IO involved. content::BrowserThread::PostTask( content::BrowserThread::PROCESS_LAUNCHER, FROM_HERE, - base::Bind(&ActivateDesktopHelper)); + base::Bind(&ActivateDesktopHelper, ASH_TERMINATE)); #else AttemptRestart(); diff --git a/chrome/browser/platform_util_win.cc b/chrome/browser/platform_util_win.cc index 2a6a8d7..aa2a0a1 100644 --- a/chrome/browser/platform_util_win.cc +++ b/chrome/browser/platform_util_win.cc @@ -19,6 +19,8 @@ #include "base/win/scoped_co_mem.h" #include "base/win/scoped_comptr.h" #include "base/win/windows_version.h" +#include "chrome/browser/lifetime/application_lifetime.h" +#include "chrome/browser/ui/host_desktop.h" #include "content/public/browser/browser_thread.h" #include "ui/base/win/shell.h" #include "ui/gfx/native_widget_types.h" @@ -133,18 +135,29 @@ namespace platform_util { void ShowItemInFolder(const base::FilePath& full_path) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + if (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH) + chrome::ActivateDesktopHelper(chrome::ASH_KEEP_RUNNING); + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind(&ShowItemInFolderOnFileThread, full_path)); } void OpenItem(const base::FilePath& full_path) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + if (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH) + chrome::ActivateDesktopHelper(chrome::ASH_KEEP_RUNNING); + BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, base::Bind(base::IgnoreResult(&ui::win::OpenItemViaShell), full_path)); } void OpenExternal(const GURL& url) { + if (chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH) + chrome::ActivateDesktopHelper(chrome::ASH_KEEP_RUNNING); + // Quote the input scheme to be sure that the command does not have // parameters unexpected by the external program. This url should already // have been escaped. diff --git a/ui/aura/remote_root_window_host_win.cc b/ui/aura/remote_root_window_host_win.cc index 0b58d1a..f647566 100644 --- a/ui/aura/remote_root_window_host_win.cc +++ b/ui/aura/remote_root_window_host_win.cc @@ -135,9 +135,11 @@ void HandleSelectFolder(const base::string16& title, } void HandleActivateDesktop(const base::FilePath& shortcut, + bool ash_exit, const ActivateDesktopCompleted& on_success) { DCHECK(aura::RemoteRootWindowHostWin::Instance()); aura::RemoteRootWindowHostWin::Instance()->HandleActivateDesktop(shortcut, + ash_exit, on_success); } @@ -232,12 +234,13 @@ void RemoteRootWindowHostWin::HandleOpenURLOnDesktop( void RemoteRootWindowHostWin::HandleActivateDesktop( const base::FilePath& shortcut, + bool ash_exit, const ActivateDesktopCompleted& on_success) { if (!host_) return; DCHECK(activate_completed_callback_.is_null()); activate_completed_callback_ = on_success; - host_->Send(new MetroViewerHostMsg_ActivateDesktop(shortcut)); + host_->Send(new MetroViewerHostMsg_ActivateDesktop(shortcut, ash_exit)); } void RemoteRootWindowHostWin::HandleOpenFile( diff --git a/ui/aura/remote_root_window_host_win.h b/ui/aura/remote_root_window_host_win.h index 92788da..04bd6bc 100644 --- a/ui/aura/remote_root_window_host_win.h +++ b/ui/aura/remote_root_window_host_win.h @@ -88,8 +88,11 @@ AURA_EXPORT void HandleSelectFolder(const base::string16& title, // Handles the activate desktop command for Metro Chrome Ash. The on_success // callback passed in is invoked when activation is completed. +// The |ash_exit| parameter indicates whether the Ash process would be shutdown +// after activating the desktop. AURA_EXPORT void HandleActivateDesktop( const base::FilePath& shortcut, + bool ash_exit, const ActivateDesktopCompleted& on_success); // RootWindowHost implementaton that receives events from a different @@ -117,7 +120,11 @@ class AURA_EXPORT RemoteRootWindowHostWin void HandleOpenURLOnDesktop(const base::FilePath& shortcut, const base::string16& url); - void HandleActivateDesktop(const base::FilePath& shortcut, + // The |ash_exit| parameter indicates whether the Ash process would be + // shutdown after activating the desktop. + void HandleActivateDesktop( + const base::FilePath& shortcut, + bool ash_exit, const ActivateDesktopCompleted& on_success); void HandleOpenFile(const base::string16& title, diff --git a/ui/metro_viewer/metro_viewer_messages.h b/ui/metro_viewer/metro_viewer_messages.h index 3cddb2e..d562461 100644 --- a/ui/metro_viewer/metro_viewer_messages.h +++ b/ui/metro_viewer/metro_viewer_messages.h @@ -97,8 +97,9 @@ IPC_MESSAGE_CONTROL0(MetroViewerHostMsg_ActivateDesktopDone) // Messages sent from the browser to the viewer: // Requests the viewer to activate desktop mode. -IPC_MESSAGE_CONTROL1(MetroViewerHostMsg_ActivateDesktop, - base::FilePath /* shortcut */); +IPC_MESSAGE_CONTROL2(MetroViewerHostMsg_ActivateDesktop, + base::FilePath /* shortcut */, + bool /* ash exit */); // Requests the viewer to open a URL in desktop mode. IPC_MESSAGE_CONTROL2(MetroViewerHostMsg_OpenURLOnDesktop, diff --git a/win8/metro_driver/chrome_app_view_ash.cc b/win8/metro_driver/chrome_app_view_ash.cc index c557bb5..2e96a00 100644 --- a/win8/metro_driver/chrome_app_view_ash.cc +++ b/win8/metro_driver/chrome_app_view_ash.cc @@ -185,11 +185,11 @@ class ChromeChannelListener : public IPC::Listener { } private: - void OnActivateDesktop(const base::FilePath& shortcut) { + void OnActivateDesktop(const base::FilePath& shortcut, bool ash_exit) { ui_proxy_->PostTask(FROM_HERE, base::Bind(&ChromeAppViewAsh::OnActivateDesktop, base::Unretained(app_view_), - shortcut)); + shortcut, ash_exit)); } void OnOpenURLOnDesktop(const base::FilePath& shortcut, @@ -676,12 +676,15 @@ HRESULT ChromeAppViewAsh::Unsnap() { return hr; } -void ChromeAppViewAsh::OnActivateDesktop(const base::FilePath& file_path) { +void ChromeAppViewAsh::OnActivateDesktop(const base::FilePath& file_path, + bool ash_exit) { DVLOG(1) << "ChannelAppViewAsh::OnActivateDesktop\n"; - // As we are the top level window, the exiting is done async so we manage - // to execute the entire function including the final Send(). - MetroExit(core_window_hwnd()); + if (ash_exit) { + // As we are the top level window, the exiting is done async so we manage + // to execute the entire function including the final Send(). + MetroExit(core_window_hwnd()); + } // We are just executing delegate_execute here without parameters. Assumption // here is that this process will be reused by shell when asking for @@ -695,7 +698,13 @@ void ChromeAppViewAsh::OnActivateDesktop(const base::FilePath& file_path) { sei.nShow = SW_SHOWNORMAL; sei.lpFile = file_path.value().c_str(); sei.lpParameters = NULL; + if (!ash_exit) + sei.fMask |= SEE_MASK_NOCLOSEPROCESS; ::ShellExecuteExW(&sei); + if (!ash_exit) { + ::TerminateProcess(sei.hProcess, 0); + ::CloseHandle(sei.hProcess); + } ui_channel_->Send(new MetroViewerHostMsg_ActivateDesktopDone()); } diff --git a/win8/metro_driver/chrome_app_view_ash.h b/win8/metro_driver/chrome_app_view_ash.h index d50255b..c2e6d42 100644 --- a/win8/metro_driver/chrome_app_view_ash.h +++ b/win8/metro_driver/chrome_app_view_ash.h @@ -60,7 +60,7 @@ class ChromeAppViewAsh // Returns S_OK on success. static HRESULT Unsnap(); - void OnActivateDesktop(const base::FilePath& file_path); + void OnActivateDesktop(const base::FilePath& file_path, bool ash_exit); void OnOpenURLOnDesktop(const base::FilePath& shortcut, const string16& url); void OnSetCursor(HCURSOR cursor); void OnDisplayFileOpenDialog(const string16& title, |