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 19 namespace chrome { 20 namespace { 21 22 // Parse two comma-separated integers from str. Return true on success. 23 bool 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 44 std::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 53 bool 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 default: 63 return false; 64 } 65 } 66 67 void SaveWindowPlacement(const Browser* browser, 68 const gfx::Rect& bounds, 69 ui::WindowShowState show_state) { 70 // Save to the session storage service, used when reloading a past session. 71 // Note that we don't want to be the ones who cause lazy initialization of 72 // the session service. This function gets called during initial window 73 // showing, and we don't want to bring in the session service this early. 74 SessionService* session_service = 75 SessionServiceFactory::GetForProfileIfExisting(browser->profile()); 76 if (session_service) 77 session_service->SetWindowBounds(browser->session_id(), bounds, show_state); 78 } 79 80 void GetSavedWindowBoundsAndShowState(const Browser* browser, 81 gfx::Rect* bounds, 82 ui::WindowShowState* show_state) { 83 DCHECK(browser); 84 DCHECK(bounds); 85 DCHECK(show_state); 86 *bounds = browser->override_bounds(); 87 WindowSizer::GetBrowserWindowBoundsAndShowState(browser->app_name(), 88 *bounds, 89 browser, 90 bounds, 91 show_state); 92 93 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); 94 bool record_mode = parsed_command_line.HasSwitch(switches::kRecordMode); 95 bool playback_mode = parsed_command_line.HasSwitch(switches::kPlaybackMode); 96 if (record_mode || playback_mode) { 97 // In playback/record mode we always fix the size of the browser and 98 // move it to (0,0). The reason for this is two reasons: First we want 99 // resize/moves in the playback to still work, and Second we want 100 // playbacks to work (as much as possible) on machines w/ different 101 // screen sizes. 102 *bounds = gfx::Rect(0, 0, 800, 600); 103 } 104 105 // The following options override playback/record. 106 if (parsed_command_line.HasSwitch(switches::kWindowSize)) { 107 std::string str = 108 parsed_command_line.GetSwitchValueASCII(switches::kWindowSize); 109 int width, height; 110 if (ParseCommaSeparatedIntegers(str, &width, &height)) 111 bounds->set_size(gfx::Size(width, height)); 112 } 113 if (parsed_command_line.HasSwitch(switches::kWindowPosition)) { 114 std::string str = 115 parsed_command_line.GetSwitchValueASCII(switches::kWindowPosition); 116 int x, y; 117 if (ParseCommaSeparatedIntegers(str, &x, &y)) 118 bounds->set_origin(gfx::Point(x, y)); 119 } 120 } 121 122 } // namespace chrome 123