| Index: chrome/browser/extensions/launch_util.cc
|
| diff --git a/chrome/browser/extensions/launch_util.cc b/chrome/browser/extensions/launch_util.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aaef29cabd89c1c917ca61ce8a85248a94abbf39
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/launch_util.cc
|
| @@ -0,0 +1,136 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/extensions/launch_util.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/extensions/extension_prefs.h"
|
| +#include "chrome/browser/ui/host_desktop.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
|
| +#include "extensions/common/extension.h"
|
| +
|
| +#if defined(OS_WIN)
|
| +#include "win8/util/win8_util.h"
|
| +#endif
|
| +
|
| +#if defined(USE_ASH)
|
| +#include "ash/shell.h"
|
| +#endif
|
| +
|
| +namespace extensions {
|
| +namespace {
|
| +
|
| +// A preference set by the the NTP to persist the desired launch container type
|
| +// used for apps.
|
| +const char kPrefLaunchType[] = "launchType";
|
| +
|
| +} // namespace
|
| +
|
| +LaunchType GetLaunchType(const ExtensionPrefs* prefs,
|
| + const Extension* extension) {
|
| + int value = -1;
|
| + LaunchType result = LAUNCH_TYPE_DEFAULT;
|
| +
|
| + // Launch hosted apps as windows by default for streamlined hosted apps.
|
| + if (CommandLine::ForCurrentProcess()->
|
| + HasSwitch(switches::kEnableStreamlinedHostedApps)) {
|
| + result = LAUNCH_TYPE_WINDOW;
|
| + }
|
| +
|
| + if (prefs->ReadPrefAsInteger(extension->id(), kPrefLaunchType, &value) &&
|
| + (value == LAUNCH_TYPE_PINNED ||
|
| + value == LAUNCH_TYPE_REGULAR ||
|
| + value == LAUNCH_TYPE_FULLSCREEN ||
|
| + value == LAUNCH_TYPE_WINDOW)) {
|
| + result = static_cast<LaunchType>(value);
|
| + }
|
| +#if defined(OS_MACOSX)
|
| + // App windows are not yet supported on mac. Pref sync could make
|
| + // the launch type LAUNCH_TYPE_WINDOW, even if there is no UI to set it
|
| + // on mac.
|
| + if (!extension->is_platform_app() && result == LAUNCH_TYPE_WINDOW)
|
| + result = LAUNCH_TYPE_REGULAR;
|
| +#endif
|
| +
|
| +#if defined(OS_WIN)
|
| + // We don't support app windows in Windows 8 single window Metro mode.
|
| + if (win8::IsSingleWindowMetroMode() && result == LAUNCH_TYPE_WINDOW)
|
| + result = LAUNCH_TYPE_REGULAR;
|
| +#endif // OS_WIN
|
| +
|
| + return result;
|
| +}
|
| +
|
| +void SetLaunchType(ExtensionPrefs* prefs,
|
| + const std::string& extension_id,
|
| + LaunchType launch_type) {
|
| + prefs->UpdateExtensionPref(extension_id, kPrefLaunchType,
|
| + new base::FundamentalValue(static_cast<int>(launch_type)));
|
| +}
|
| +
|
| +LaunchContainer GetLaunchContainer(const ExtensionPrefs* prefs,
|
| + const Extension* extension) {
|
| + LaunchContainer manifest_launch_container =
|
| + AppLaunchInfo::GetLaunchContainer(extension);
|
| +
|
| + const LaunchContainer kInvalidLaunchContainer =
|
| + static_cast<LaunchContainer>(-1);
|
| +
|
| + LaunchContainer result = kInvalidLaunchContainer;
|
| +
|
| + if (manifest_launch_container == LAUNCH_PANEL) {
|
| + // Apps with app.launch.container = 'panel' should always respect the
|
| + // manifest setting.
|
| + result = manifest_launch_container;
|
| + } else if (manifest_launch_container == LAUNCH_TAB) {
|
| + // Look for prefs that indicate the user's choice of launch container. The
|
| + // app's menu on the NTP provides a UI to set this preference.
|
| + LaunchType prefs_launch_type = GetLaunchType(prefs, extension);
|
| +
|
| + if (prefs_launch_type == LAUNCH_TYPE_WINDOW) {
|
| + // If the pref is set to launch a window (or no pref is set, and
|
| + // window opening is the default), make the container a window.
|
| + result = LAUNCH_WINDOW;
|
| +#if defined(USE_ASH)
|
| + } else if (prefs_launch_type == LAUNCH_TYPE_FULLSCREEN &&
|
| + chrome::GetActiveDesktop() == chrome::HOST_DESKTOP_TYPE_ASH) {
|
| + // LAUNCH_TYPE_FULLSCREEN launches in a maximized app window in ash.
|
| + // For desktop chrome AURA on all platforms we should open the
|
| + // application in full screen mode in the current tab, on the same
|
| + // lines as non AURA chrome.
|
| + result = LAUNCH_WINDOW;
|
| +#endif
|
| + } else {
|
| + // All other launch types (tab, pinned, fullscreen) are
|
| + // implemented as tabs in a window.
|
| + result = LAUNCH_TAB;
|
| + }
|
| + } else {
|
| + // If a new value for app.launch.container is added, logic for it should be
|
| + // added here. LAUNCH_WINDOW is not present because there is no way to set
|
| + // it in a manifest.
|
| + NOTREACHED() << manifest_launch_container;
|
| + }
|
| +
|
| + // All paths should set |result|.
|
| + if (result == kInvalidLaunchContainer) {
|
| + DLOG(FATAL) << "Failed to set a launch container.";
|
| + result = LAUNCH_TAB;
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +bool HasPreferredLaunchContainer(const ExtensionPrefs* prefs,
|
| + const Extension* extension) {
|
| + int value = -1;
|
| + LaunchContainer manifest_launch_container =
|
| + AppLaunchInfo::GetLaunchContainer(extension);
|
| + return manifest_launch_container == LAUNCH_TAB &&
|
| + prefs->ReadPrefAsInteger(extension->id(), kPrefLaunchType, &value);
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|