blob: 9c0d48c9e74e2578da49b09171019a91a45b5633 [file] [log] [blame] [edit]
// Copyright (c) 2012 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/ui/browser_window_state.h"
#include "base/command_line.h"
#include "base/string_number_conversions.h"
#include "chrome/browser/defaults.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_service.h"
#include "chrome/browser/sessions/session_service_factory.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/window_sizer/window_sizer.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
namespace chrome {
namespace {
// Parse two comma-separated integers from str. Return true on success.
bool ParseCommaSeparatedIntegers(const std::string& str,
int* ret_num1,
int* ret_num2) {
size_t num1_size = str.find_first_of(',');
if (num1_size == std::string::npos)
return false;
size_t num2_pos = num1_size + 1;
size_t num2_size = str.size() - num2_pos;
int num1, num2;
if (!base::StringToInt(str.substr(0, num1_size), &num1) ||
!base::StringToInt(str.substr(num2_pos, num2_size), &num2))
return false;
*ret_num1 = num1;
*ret_num2 = num2;
return true;
}
} // namespace
std::string GetWindowPlacementKey(const Browser* browser) {
std::string name(prefs::kBrowserWindowPlacement);
if (!browser->app_name().empty()) {
name.append("_");
name.append(browser->app_name());
}
return name;
}
bool ShouldSaveWindowPlacement(const Browser* browser) {
switch (browser->type()) {
case Browser::TYPE_TABBED:
return true;
case Browser::TYPE_POPUP:
// Only save the window placement of popups if they are restored,
// or the window belongs to DevTools or an App.
return browser_defaults::kRestorePopups || browser->is_devtools() ||
browser->is_app();
case Browser::TYPE_PANEL:
// Do not save the window placement of panels.
return false;
default:
return false;
}
}
void SaveWindowPlacement(const Browser* browser,
const gfx::Rect& bounds,
ui::WindowShowState show_state) {
// Save to the session storage service, used when reloading a past session.
// Note that we don't want to be the ones who cause lazy initialization of
// the session service. This function gets called during initial window
// showing, and we don't want to bring in the session service this early.
SessionService* session_service =
SessionServiceFactory::GetForProfileIfExisting(browser->profile());
if (session_service)
session_service->SetWindowBounds(browser->session_id(), bounds, show_state);
}
gfx::Rect GetSavedWindowBounds(const Browser* browser) {
gfx::Rect restored_bounds = browser->override_bounds();
WindowSizer::GetBrowserWindowBounds(browser->app_name(),
restored_bounds,
browser,
&restored_bounds);
const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
bool record_mode = parsed_command_line.HasSwitch(switches::kRecordMode);
bool playback_mode = parsed_command_line.HasSwitch(switches::kPlaybackMode);
if (record_mode || playback_mode) {
// In playback/record mode we always fix the size of the browser and
// move it to (0,0). The reason for this is two reasons: First we want
// resize/moves in the playback to still work, and Second we want
// playbacks to work (as much as possible) on machines w/ different
// screen sizes.
restored_bounds = gfx::Rect(0, 0, 800, 600);
}
// The following options override playback/record.
if (parsed_command_line.HasSwitch(switches::kWindowSize)) {
std::string str =
parsed_command_line.GetSwitchValueASCII(switches::kWindowSize);
int width, height;
if (ParseCommaSeparatedIntegers(str, &width, &height))
restored_bounds.set_size(gfx::Size(width, height));
}
if (parsed_command_line.HasSwitch(switches::kWindowPosition)) {
std::string str =
parsed_command_line.GetSwitchValueASCII(switches::kWindowPosition);
int x, y;
if (ParseCommaSeparatedIntegers(str, &x, &y))
restored_bounds.set_origin(gfx::Point(x, y));
}
return restored_bounds;
}
ui::WindowShowState GetSavedWindowShowState(const Browser* browser) {
// Only tabbed browsers use the command line or preference state, with the
// exception of devtools.
bool show_state = !browser->is_type_tabbed() && !browser->is_devtools();
#if defined(USE_AURA)
// Apps save state on aura.
show_state &= !browser->is_app();
#endif
if (show_state)
return browser->initial_show_state();
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kStartMaximized))
return ui::SHOW_STATE_MAXIMIZED;
if (browser->initial_show_state() != ui::SHOW_STATE_DEFAULT)
return browser->initial_show_state();
const DictionaryValue* window_pref = browser->profile()->GetPrefs()->
GetDictionary(GetWindowPlacementKey(browser).c_str());
bool maximized = false;
window_pref->GetBoolean("maximized", &maximized);
return maximized ? ui::SHOW_STATE_MAXIMIZED : ui::SHOW_STATE_DEFAULT;
}
} // namespace chrome