1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/path_service.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/string16.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/stringprintf.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/app_window/app_window_registry.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/constants.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/remote_window_tree_host_win.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool ChromeLauncherController::LaunchedInNativeDesktop( 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& app_id) { 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If an app has any existing windows on the native desktop, funnel the 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // launch request through the viewer process to desktop Chrome. This allows 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Ash to relinquish foreground window status and trigger a switch to 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // desktop mode. 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::AppWindow* any_existing_window = 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::AppWindowRegistry::Get(profile()) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->GetCurrentAppWindowForApp(app_id); 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!any_existing_window || 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::GetHostDesktopTypeForNativeWindow( 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) any_existing_window->GetNativeWindow()) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) != chrome::HOST_DESKTOP_TYPE_NATIVE) { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath exe_path; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!PathService::Get(base::FILE_EXE, &exe_path)) { 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Construct parameters for ShellExecuteEx that mimic a desktop shortcut 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // for the app in the current Profile. 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string spec = base::StringPrintf("\"--%s=%s\" \"--%s=%s\"", 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) switches::kProfileDirectory, 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_->GetPath().BaseName().AsUTF8Unsafe().c_str(), 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) switches::kAppId, 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) app_id.c_str()); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::RemoteWindowTreeHostWin::Instance()->HandleOpenURLOnDesktop( 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) exe_path, base::UTF8ToUTF16(spec)); 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return true; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 51