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