browser_window_state.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/ui/browser_window_state.h"
6
7#include "base/command_line.h"
8#include "base/prefs/pref_service.h"
9#include "base/strings/string_number_conversions.h"
10#include "chrome/browser/defaults.h"
11#include "chrome/browser/profiles/profile.h"
12#include "chrome/browser/sessions/session_service.h"
13#include "chrome/browser/sessions/session_service_factory.h"
14#include "chrome/browser/ui/browser.h"
15#include "chrome/browser/ui/window_sizer/window_sizer.h"
16#include "chrome/common/chrome_switches.h"
17#include "chrome/common/pref_names.h"
18
19namespace chrome {
20namespace {
21
22// Parse two comma-separated integers from str. Return true on success.
23bool ParseCommaSeparatedIntegers(const std::string& str,
24                                 int* ret_num1,
25                                 int* ret_num2) {
26  size_t num1_size = str.find_first_of(',');
27  if (num1_size == std::string::npos)
28    return false;
29
30  size_t num2_pos = num1_size + 1;
31  size_t num2_size = str.size() - num2_pos;
32  int num1, num2;
33  if (!base::StringToInt(str.substr(0, num1_size), &num1) ||
34      !base::StringToInt(str.substr(num2_pos, num2_size), &num2))
35    return false;
36
37  *ret_num1 = num1;
38  *ret_num2 = num2;
39  return true;
40}
41
42}  // namespace
43
44std::string GetWindowPlacementKey(const Browser* browser) {
45  std::string name(prefs::kBrowserWindowPlacement);
46  if (!browser->app_name().empty()) {
47    name.append("_");
48    name.append(browser->app_name());
49  }
50  return name;
51}
52
53bool ShouldSaveWindowPlacement(const Browser* browser) {
54  switch (browser->type()) {
55  case Browser::TYPE_TABBED:
56    return true;
57  case Browser::TYPE_POPUP:
58    // Only save the window placement of popups if they are restored,
59    // or the window belongs to DevTools or an App.
60    return browser_defaults::kRestorePopups || browser->is_devtools() ||
61        browser->is_app();
62  case Browser::TYPE_PANEL:
63    // Do not save the window placement of panels.
64    return false;
65  default:
66    return false;
67  }
68}
69
70void SaveWindowPlacement(const Browser* browser,
71                         const gfx::Rect& bounds,
72                         ui::WindowShowState show_state) {
73  // Save to the session storage service, used when reloading a past session.
74  // Note that we don't want to be the ones who cause lazy initialization of
75  // the session service. This function gets called during initial window
76  // showing, and we don't want to bring in the session service this early.
77  SessionService* session_service =
78      SessionServiceFactory::GetForProfileIfExisting(browser->profile());
79  if (session_service)
80    session_service->SetWindowBounds(browser->session_id(), bounds, show_state);
81}
82
83void GetSavedWindowBoundsAndShowState(const Browser* browser,
84                                      gfx::Rect* bounds,
85                                      ui::WindowShowState* show_state) {
86  DCHECK(browser);
87  DCHECK(bounds);
88  DCHECK(show_state);
89  *bounds = browser->override_bounds();
90  WindowSizer::GetBrowserWindowBoundsAndShowState(browser->app_name(),
91                                                  *bounds,
92                                                  browser,
93                                                  bounds,
94                                                  show_state);
95
96  const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
97  bool record_mode = parsed_command_line.HasSwitch(switches::kRecordMode);
98  bool playback_mode = parsed_command_line.HasSwitch(switches::kPlaybackMode);
99  if (record_mode || playback_mode) {
100    // In playback/record mode we always fix the size of the browser and
101    // move it to (0,0).  The reason for this is two reasons:  First we want
102    // resize/moves in the playback to still work, and Second we want
103    // playbacks to work (as much as possible) on machines w/ different
104    // screen sizes.
105    *bounds = gfx::Rect(0, 0, 800, 600);
106  }
107
108  // The following options override playback/record.
109  if (parsed_command_line.HasSwitch(switches::kWindowSize)) {
110    std::string str =
111        parsed_command_line.GetSwitchValueASCII(switches::kWindowSize);
112    int width, height;
113    if (ParseCommaSeparatedIntegers(str, &width, &height))
114      bounds->set_size(gfx::Size(width, height));
115  }
116  if (parsed_command_line.HasSwitch(switches::kWindowPosition)) {
117    std::string str =
118        parsed_command_line.GetSwitchValueASCII(switches::kWindowPosition);
119    int x, y;
120    if (ParseCommaSeparatedIntegers(str, &x, &y))
121      bounds->set_origin(gfx::Point(x, y));
122  }
123}
124
125}  // namespace chrome
126