Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(453)

Side by Side Diff: chrome/browser/browser.cc

Issue 10896: Re-do the way browser windows are shown:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/browser.h"
6
7 #include <windows.h> 5 #include <windows.h>
8 #include <shellapi.h> 6 #include <shellapi.h>
9 7
8 #include "chrome/browser/browser.h"
9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/file_version_info.h" 11 #include "base/file_version_info.h"
12 #include "base/idle_timer.h" 12 #include "base/idle_timer.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/string_util.h" 14 #include "base/string_util.h"
15 #include "chrome/app/chrome_dll_resource.h" 15 #include "chrome/app/chrome_dll_resource.h"
16 #include "chrome/app/locales/locale_settings.h" 16 #include "chrome/app/locales/locale_settings.h"
17 #include "chrome/browser/automation/ui_controls.h" 17 #include "chrome/browser/automation/ui_controls.h"
18 #include "chrome/browser/browser_list.h" 18 #include "chrome/browser/browser_list.h"
19 #include "chrome/browser/browser_process.h" 19 #include "chrome/browser/browser_process.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 // The source of the update. 145 // The source of the update.
146 const TabContents* source; 146 const TabContents* source;
147 147
148 // What changed in the UI. 148 // What changed in the UI.
149 unsigned changed_flags; 149 unsigned changed_flags;
150 }; 150 };
151 151
152 /////////////////////////////////////////////////////////////////////////////// 152 ///////////////////////////////////////////////////////////////////////////////
153 // Browser, Constructors, Creation, Showing: 153 // Browser, Constructors, Creation, Showing:
154 154
155 Browser::Browser(const gfx::Rect& initial_bounds, 155 Browser::Browser(BrowserType::Type type, Profile* profile)
156 int show_command, 156 : type_(type),
157 Profile* profile, 157 profile_(profile),
158 BrowserType::Type type,
159 const std::wstring& app_name)
160 : profile_(profile),
161 window_(NULL), 158 window_(NULL),
162 initial_show_command_(show_command), 159 tabstrip_model_(this, profile),
160 controller_(this),
161 toolbar_model_(this),
162 chrome_updater_factory_(this),
163 is_attempting_to_close_browser_(false), 163 is_attempting_to_close_browser_(false),
164 controller_(this), 164 override_maximized_(false),
165 chrome_updater_factory_(this),
166 method_factory_(this), 165 method_factory_(this),
167 tabstrip_model_(this, profile), 166 idle_task_(new BrowserIdleTimer) {
168 toolbar_model_(this),
169 type_(type),
170 app_name_(app_name),
171 idle_task_(new BrowserIdleTimer()) {
172 tabstrip_model_.AddObserver(this); 167 tabstrip_model_.AddObserver(this);
173 168
174 CommandLine parsed_command_line;
175
176 gfx::Rect create_bounds;
177 bool maximized = false;
178 WindowSizer::GetBrowserWindowBounds(app_name_, initial_bounds,
179 &create_bounds, &maximized);
180 if (parsed_command_line.HasSwitch(switches::kStartMaximized))
181 maximized = true;
182 if (maximized)
183 initial_show_command_ = SW_SHOWMAXIMIZED;
184 window_ = BrowserWindow::CreateBrowserWindow(this, create_bounds,
185 show_command);
186
187 NotificationService::current()->AddObserver( 169 NotificationService::current()->AddObserver(
188 this, NOTIFY_SSL_STATE_CHANGED, NotificationService::AllSources()); 170 this, NOTIFY_SSL_STATE_CHANGED, NotificationService::AllSources());
189 171
190 InitCommandState(); 172 InitCommandState();
191 BrowserList::AddBrowser(this); 173 BrowserList::AddBrowser(this);
192 174
193 encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector, 175 encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector,
194 profile_->GetPrefs(), NULL); 176 profile_->GetPrefs(), NULL);
195 177
196 // Trim browser memory on idle for low & medium memory models. 178 // Trim browser memory on idle for low & medium memory models.
197 if (g_browser_process->memory_model() < BrowserProcess::HIGH_MEMORY_MODEL) 179 if (g_browser_process->memory_model() < BrowserProcess::HIGH_MEMORY_MODEL)
198 idle_task_->Start(); 180 idle_task_->Start();
199
200 // Show the First Run information bubble if we've been told to.
201 PrefService* local_state = g_browser_process->local_state();
202 if (local_state->IsPrefRegistered(prefs::kShouldShowFirstRunBubble) &&
203 local_state->GetBoolean(prefs::kShouldShowFirstRunBubble)) {
204 // Reset the preference so we don't show the bubble for subsequent windows.
205 local_state->ClearPref(prefs::kShouldShowFirstRunBubble);
206 GetLocationBarView()->ShowFirstRunBubble();
207 }
208 } 181 }
209 182
210 Browser::~Browser() { 183 Browser::~Browser() {
211 // The tab strip should be empty at this point. 184 // The tab strip should be empty at this point.
212 DCHECK(tabstrip_model_.empty()); 185 DCHECK(tabstrip_model_.empty());
213 tabstrip_model_.RemoveObserver(this); 186 tabstrip_model_.RemoveObserver(this);
214 187
215 BrowserList::RemoveBrowser(this); 188 BrowserList::RemoveBrowser(this);
216 189
217 if (!BrowserList::HasBrowserWithProfile(profile_)) { 190 if (!BrowserList::HasBrowserWithProfile(profile_)) {
(...skipping 23 matching lines...) Expand all
241 // can just delete all of the cookies in the store. 214 // can just delete all of the cookies in the store.
242 profile_->GetRequestContext()->cookie_store()->DeleteAll(false); 215 profile_->GetRequestContext()->cookie_store()->DeleteAll(false);
243 } 216 }
244 217
245 // There may be pending file dialogs, we need to tell them that we've gone 218 // There may be pending file dialogs, we need to tell them that we've gone
246 // away so they don't try and call back to us. 219 // away so they don't try and call back to us.
247 if (select_file_dialog_.get()) 220 if (select_file_dialog_.get())
248 select_file_dialog_->ListenerDestroyed(); 221 select_file_dialog_->ListenerDestroyed();
249 } 222 }
250 223
251 void Browser::Show() { 224 // static
252 // TODO(beng): this entire function should move to BrowserWindow. 225 Browser* Browser::Create(Profile* profile) {
226 Browser* browser = new Browser(BrowserType::TABBED_BROWSER, profile);
227 browser->CreateBrowserWindow();
228 return browser;
229 }
253 230
254 // Only allow one call after the browser is created. 231 // static
255 if (initial_show_command_ < 0) { 232 Browser* Browser::CreateForPopup(Profile* profile) {
256 // The frame is already visible, we're being invoked again either by the 233 Browser* browser = new Browser(BrowserType::BROWSER, profile);
257 // user clicking a link in another app or from a desktop shortcut. 234 browser->CreateBrowserWindow();
258 window_->Activate(); 235 return browser;
259 return; 236 }
237
238 // static
239 Browser* Browser::CreateForApp(const std::wstring& app_name,
240 Profile* profile) {
241 Browser* browser = new Browser(BrowserType::APPLICATION, profile);
242 browser->app_name_ = app_name;
243 browser->CreateBrowserWindow();
244 return browser;
245 }
246
247 void Browser::CreateBrowserWindow() {
248 DCHECK(!window_);
249 window_ = BrowserWindow::CreateBrowserWindow(this);
250
251 // Show the First Run information bubble if we've been told to.
252 PrefService* local_state = g_browser_process->local_state();
253 if (local_state->IsPrefRegistered(prefs::kShouldShowFirstRunBubble) &&
254 local_state->GetBoolean(prefs::kShouldShowFirstRunBubble)) {
255 // Reset the preference so we don't show the bubble for subsequent windows.
256 local_state->ClearPref(prefs::kShouldShowFirstRunBubble);
257 GetLocationBarView()->ShowFirstRunBubble();
260 } 258 }
261 window_->Show(initial_show_command_, false);
262 if ((initial_show_command_ == SW_SHOWNORMAL) ||
263 (initial_show_command_ == SW_SHOWMAXIMIZED))
264 window_->Activate();
265 initial_show_command_ = -1;
266
267 // Setting the focus doesn't work when the window is invisible, so any focus
268 // initialization that happened before this will be lost.
269 //
270 // We really "should" restore the focus whenever the window becomes unhidden,
271 // but I think initializing is the only time where this can happen where there
272 // is some focus change we need to pick up, and this is easier than plumbing
273 // through an unhide message all the way from the frame.
274 //
275 // If we do find there are cases where we need to restore the focus on show,
276 // that should be added and this should be removed.
277 TabContents* selected_tab_contents = GetSelectedTabContents();
278 if (selected_tab_contents)
279 selected_tab_contents->RestoreFocus();
280 } 259 }
281 260
282 /////////////////////////////////////////////////////////////////////////////// 261 ///////////////////////////////////////////////////////////////////////////////
283 // Browser, Creation Helpers: 262 // Browser, Creation Helpers:
284 263
285 // static 264 // static
286 void Browser::OpenNewBrowserWindow(Profile* profile, int show_command) { 265 void Browser::OpenEmptyWindow(Profile* profile) {
287 Browser* browser = new Browser(gfx::Rect(), show_command, profile, 266 Browser* browser = Browser::Create(profile);
288 BrowserType::TABBED_BROWSER, L"");
289 browser->AddBlankTab(true); 267 browser->AddBlankTab(true);
290 browser->Show(); 268 browser->window()->Show();
291 } 269 }
292 270
293 // static 271 // static
294 void Browser::OpenURLOffTheRecord(Profile* profile, const GURL& url) { 272 void Browser::OpenURLOffTheRecord(Profile* profile, const GURL& url) {
295 Profile* off_the_record_profile = profile->GetOffTheRecordProfile(); 273 Profile* off_the_record_profile = profile->GetOffTheRecordProfile();
296 Browser* browser = BrowserList::FindBrowserWithType( 274 Browser* browser = BrowserList::FindBrowserWithType(
297 off_the_record_profile, BrowserType::TABBED_BROWSER); 275 off_the_record_profile,
298 if (browser == NULL) { 276 BrowserType::TABBED_BROWSER);
299 browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, off_the_record_profile, 277 if (!browser)
300 BrowserType::TABBED_BROWSER, L""); 278 browser = Browser::Create(off_the_record_profile);
301 }
302 // TODO(eroman): should we have referrer here? 279 // TODO(eroman): should we have referrer here?
303 browser->AddTabWithURL(url, GURL(), PageTransition::LINK, true, NULL); 280 browser->AddTabWithURL(url, GURL(), PageTransition::LINK, true, NULL);
304 browser->Show(); 281 browser->window()->Show();
305 browser->window()->Activate();
306 } 282 }
307 283
308 // static 284 // static
309 void Browser::OpenWebApplication(Profile* profile, 285 void Browser::OpenWebApplication(Profile* profile, WebApp* app) {
310 WebApp* app,
311 int show_command) {
312 const std::wstring& app_name = 286 const std::wstring& app_name =
313 app->name().empty() ? ComputeApplicationNameFromURL(app->url()) : 287 app->name().empty() ? ComputeApplicationNameFromURL(app->url()) :
314 app->name(); 288 app->name();
289 RegisterAppPrefs(app_name);
315 290
316 RegisterAppPrefs(app_name); 291 Browser* browser = Browser::CreateForApp(app_name, profile);
317 Browser* browser = new Browser(gfx::Rect(), show_command, profile,
318 BrowserType::APPLICATION, app_name);
319 browser->AddWebApplicationTab(profile, app, false); 292 browser->AddWebApplicationTab(profile, app, false);
320 browser->Show(); 293 browser->window()->Show();
321 } 294 }
322 295
323 /////////////////////////////////////////////////////////////////////////////// 296 ///////////////////////////////////////////////////////////////////////////////
324 // Browser, Command API: 297 // Browser, Command API:
325 298
326 bool Browser::SupportsCommand(int id) const { 299 bool Browser::SupportsCommand(int id) const {
327 return controller_.SupportsCommand(id); 300 return controller_.SupportsCommand(id);
328 } 301 }
329 302
330 bool Browser::IsCommandEnabled(int id) const { 303 bool Browser::IsCommandEnabled(int id) const {
(...skipping 18 matching lines...) Expand all
349 /////////////////////////////////////////////////////////////////////////////// 322 ///////////////////////////////////////////////////////////////////////////////
350 // Browser, DEPRECATED DEPRECATED DEPRECATED: 323 // Browser, DEPRECATED DEPRECATED DEPRECATED:
351 324
352 HWND Browser::GetTopLevelHWND() const { 325 HWND Browser::GetTopLevelHWND() const {
353 return window_ ? reinterpret_cast<HWND>(window_->GetNativeHandle()) : NULL; 326 return window_ ? reinterpret_cast<HWND>(window_->GetNativeHandle()) : NULL;
354 } 327 }
355 328
356 /////////////////////////////////////////////////////////////////////////////// 329 ///////////////////////////////////////////////////////////////////////////////
357 // Browser, State Storage and Retrieval for UI: 330 // Browser, State Storage and Retrieval for UI:
358 331
359 void Browser::SaveWindowPosition(const gfx::Rect& bounds, bool maximized) { 332 void Browser::SaveWindowPlacement(const gfx::Rect& bounds, bool maximized) {
360 // We don't save window position for popups. 333 // We don't save window position for popups.
361 if (type() == BrowserType::BROWSER) 334 if (type() == BrowserType::BROWSER)
362 return; 335 return;
363 336
364 // First save to local state, this is for remembering on subsequent starts. 337 // First save to local state, this is for remembering on subsequent starts.
365 PrefService* prefs = g_browser_process->local_state(); 338 PrefService* prefs = g_browser_process->local_state();
366 DCHECK(prefs); 339 DCHECK(prefs);
367 std::wstring name(prefs::kBrowserWindowPlacement); 340 std::wstring name(prefs::kBrowserWindowPlacement);
368 if (!app_name_.empty()) { 341 if (!app_name_.empty()) {
369 name.append(L"_"); 342 name.append(L"_");
(...skipping 13 matching lines...) Expand all
383 // initialization of the session service. This function gets called during 356 // initialization of the session service. This function gets called during
384 // initial window showing, and we don't want to bring in the session service 357 // initial window showing, and we don't want to bring in the session service
385 // this early. 358 // this early.
386 if (profile()->HasSessionService()) { 359 if (profile()->HasSessionService()) {
387 SessionService* session_service = profile()->GetSessionService(); 360 SessionService* session_service = profile()->GetSessionService();
388 if (session_service) 361 if (session_service)
389 session_service->SetWindowBounds(session_id_, bounds, maximized); 362 session_service->SetWindowBounds(session_id_, bounds, maximized);
390 } 363 }
391 } 364 }
392 365
393 void Browser::RestoreWindowPosition(gfx::Rect* bounds, bool* maximized) { 366 gfx::Rect Browser::GetSavedWindowBounds() const {
394 DCHECK(bounds && maximized); 367 CommandLine parsed_command_line;
395 WindowSizer::GetBrowserWindowBounds(app_name_, *bounds, bounds, maximized); 368 bool record_mode = parsed_command_line.HasSwitch(switches::kRecordMode);
369 bool playback_mode = parsed_command_line.HasSwitch(switches::kPlaybackMode);
370 if (record_mode || playback_mode) {
371 // In playback/record mode we always fix the size of the browser and
372 // move it to (0,0). The reason for this is two reasons: First we want
373 // resize/moves in the playback to still work, and Second we want
374 // playbacks to work (as much as possible) on machines w/ different
375 // screen sizes.
376 return gfx::Rect(0, 0, 800, 600);
377 }
378
379 gfx::Rect restored_bounds = override_bounds_;
380 bool maximized;
381 WindowSizer::GetBrowserWindowBounds(app_name_, restored_bounds,
382 &restored_bounds, &maximized);
383 return restored_bounds;
384 }
385
386 // TODO(beng): obtain maximized state some other way so we don't need to go
387 // through all this hassle.
388 bool Browser::GetSavedMaximizedState() const {
389 if (CommandLine().HasSwitch(switches::kStartMaximized))
390 return true;
391
392 gfx::Rect restored_bounds;
393 bool maximized = override_maximized_;
394 WindowSizer::GetBrowserWindowBounds(app_name_, restored_bounds,
395 &restored_bounds, &maximized);
396 return maximized;
396 } 397 }
397 398
398 SkBitmap Browser::GetCurrentPageIcon() const { 399 SkBitmap Browser::GetCurrentPageIcon() const {
399 TabContents* contents = tabstrip_model_.GetSelectedTabContents(); 400 TabContents* contents = tabstrip_model_.GetSelectedTabContents();
400 return contents ? contents->GetFavIcon() : SkBitmap(); 401 return contents ? contents->GetFavIcon() : SkBitmap();
401 } 402 }
402 403
403 std::wstring Browser::GetCurrentPageTitle() const { 404 std::wstring Browser::GetCurrentPageTitle() const {
404 TabContents* contents = tabstrip_model_.GetSelectedTabContents(); 405 TabContents* contents = tabstrip_model_.GetSelectedTabContents();
405 std::wstring title; 406 std::wstring title;
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 OpenURL(GURL(), GURL(), CURRENT_TAB, PageTransition::TYPED); 655 OpenURL(GURL(), GURL(), CURRENT_TAB, PageTransition::TYPED);
655 } 656 }
656 } 657 }
657 658
658 void Browser::NewTab() { 659 void Browser::NewTab() {
659 UserMetrics::RecordAction(L"NewTab", profile_); 660 UserMetrics::RecordAction(L"NewTab", profile_);
660 if (type() == BrowserType::TABBED_BROWSER) { 661 if (type() == BrowserType::TABBED_BROWSER) {
661 AddBlankTab(true); 662 AddBlankTab(true);
662 } else { 663 } else {
663 Browser* b = GetOrCreateTabbedBrowser(); 664 Browser* b = GetOrCreateTabbedBrowser();
664 DCHECK(b);
665 b->Show();
666 b->window()->Activate();
667 b->AddBlankTab(true); 665 b->AddBlankTab(true);
666 b->window()->Show();
668 } 667 }
669 } 668 }
670 669
671 void Browser::CloseTab() { 670 void Browser::CloseTab() {
672 UserMetrics::RecordAction(L"CloseTab_Accelerator", profile_); 671 UserMetrics::RecordAction(L"CloseTab_Accelerator", profile_);
673 tabstrip_model_.CloseTabContentsAt(tabstrip_model_.selected_index()); 672 tabstrip_model_.CloseTabContentsAt(tabstrip_model_.selected_index());
674 } 673 }
675 674
676 void Browser::CloseApp() { 675 void Browser::CloseApp() {
677 UserMetrics::RecordAction(L"CloseWebApp", profile_); 676 UserMetrics::RecordAction(L"CloseWebApp", profile_);
678 tabstrip_model_.CloseTabContentsAt(tabstrip_model_.selected_index()); 677 tabstrip_model_.CloseTabContentsAt(tabstrip_model_.selected_index());
679 } 678 }
680 679
681 void Browser::NewWindow() { 680 void Browser::NewWindow() {
682 UserMetrics::RecordAction(L"NewWindow", profile_); 681 UserMetrics::RecordAction(L"NewWindow", profile_);
683 Browser::OpenNewBrowserWindow(profile_->GetOriginalProfile(), 682 Browser::OpenEmptyWindow(profile_->GetOriginalProfile());
684 SW_SHOWNORMAL);
685 } 683 }
686 684
687 void Browser::NewIncognitoWindow() { 685 void Browser::NewIncognitoWindow() {
688 UserMetrics::RecordAction(L"NewIncognitoWindow", profile_); 686 UserMetrics::RecordAction(L"NewIncognitoWindow", profile_);
689 Browser::OpenNewBrowserWindow(profile_->GetOffTheRecordProfile(), 687 Browser::OpenEmptyWindow(profile_->GetOffTheRecordProfile());
690 SW_SHOWNORMAL);
691 } 688 }
692 689
693 void Browser::CloseWindow() { 690 void Browser::CloseWindow() {
694 UserMetrics::RecordAction(L"CloseWindow", profile_); 691 UserMetrics::RecordAction(L"CloseWindow", profile_);
695 window_->Close(); 692 window_->Close();
696 } 693 }
697 694
698 void Browser::SelectNextTab() { 695 void Browser::SelectNextTab() {
699 UserMetrics::RecordAction(L"SelectNextTab", profile_); 696 UserMetrics::RecordAction(L"SelectNextTab", profile_);
700 tabstrip_model_.SelectNextTab(); 697 tabstrip_model_.SelectNextTab();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 void Browser::ConvertPopupToTabbedBrowser() { 738 void Browser::ConvertPopupToTabbedBrowser() {
742 UserMetrics::RecordAction(L"ShowAsTab", profile_); 739 UserMetrics::RecordAction(L"ShowAsTab", profile_);
743 740
744 if (type() != BrowserType::BROWSER) { 741 if (type() != BrowserType::BROWSER) {
745 NOTREACHED(); 742 NOTREACHED();
746 return; 743 return;
747 } 744 }
748 745
749 int tab_strip_index = tabstrip_model_.selected_index(); 746 int tab_strip_index = tabstrip_model_.selected_index();
750 TabContents* contents = tabstrip_model_.DetachTabContentsAt(tab_strip_index); 747 TabContents* contents = tabstrip_model_.DetachTabContentsAt(tab_strip_index);
751 Browser* browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_, 748 Browser* browser = Browser::Create(profile_);
752 BrowserType::TABBED_BROWSER, L""); 749 browser->tabstrip_model()->AppendTabContents(contents, true);
753 browser->AddNewContents(NULL, contents, NEW_FOREGROUND_TAB, gfx::Rect(), 750 browser->window()->Show();
754 true);
755 browser->Show();
756 } 751 }
757 752
758 void Browser::Exit() { 753 void Browser::Exit() {
759 UserMetrics::RecordAction(L"Exit", profile_); 754 UserMetrics::RecordAction(L"Exit", profile_);
760 BrowserList::CloseAllBrowsers(true); 755 BrowserList::CloseAllBrowsers(true);
761 } 756 }
762 757
763 // TODO(devint): http://b/issue?id=1117225 Cut, Copy, and Paste are always 758 // TODO(devint): http://b/issue?id=1117225 Cut, Copy, and Paste are always
764 // enabled in the page menu regardless of whether the command will do 759 // enabled in the page menu regardless of whether the command will do
765 // anything. When someone selects the menu item, we just act as if they hit 760 // anything. When someone selects the menu item, we just act as if they hit
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 1274
1280 default: 1275 default:
1281 LOG(WARNING) << "Received Unimplemented Command: " << id; 1276 LOG(WARNING) << "Received Unimplemented Command: " << id;
1282 break; 1277 break;
1283 } 1278 }
1284 } 1279 }
1285 1280
1286 /////////////////////////////////////////////////////////////////////////////// 1281 ///////////////////////////////////////////////////////////////////////////////
1287 // Browser, TabStripModelDelegate implementation: 1282 // Browser, TabStripModelDelegate implementation:
1288 1283
1284 GURL Browser::GetBlankTabURL() const {
1285 return NewTabUIURL();
1286 }
1287
1289 void Browser::CreateNewStripWithContents(TabContents* detached_contents, 1288 void Browser::CreateNewStripWithContents(TabContents* detached_contents,
1290 const gfx::Point& drop_point) { 1289 const gfx::Point& drop_point) {
1291 DCHECK(type_ == BrowserType::TABBED_BROWSER); 1290 DCHECK(type_ == BrowserType::TABBED_BROWSER);
1292 1291
1293 // Create an empty new browser window the same size as the old one. 1292 // Create an empty new browser window the same size as the old one.
1294 // TODO(beng): move elsewhere 1293 // TODO(beng): move elsewhere
1295 CRect browser_rect; 1294 CRect browser_rect;
1296 GetWindowRect(reinterpret_cast<HWND>(window_->GetNativeHandle()), 1295 GetWindowRect(reinterpret_cast<HWND>(window_->GetNativeHandle()),
1297 &browser_rect); 1296 &browser_rect);
1298 gfx::Rect rect(0, 0); 1297 gfx::Rect rect(0, 0);
1299 if (drop_point.x() != 0 || drop_point.y() != 0) { 1298 if (drop_point.x() != 0 || drop_point.y() != 0) {
1300 rect.SetRect(drop_point.x(), drop_point.y(), browser_rect.Width(), 1299 rect.SetRect(drop_point.x(), drop_point.y(), browser_rect.Width(),
1301 browser_rect.Height()); 1300 browser_rect.Height());
1302 } 1301 }
1303 Browser* new_window = 1302 Browser* browser = new Browser(BrowserType::TABBED_BROWSER, profile_);
1304 new Browser(rect, SW_SHOWNORMAL, profile_, BrowserType::TABBED_BROWSER, 1303 browser->set_override_bounds(rect);
1305 std::wstring()); 1304 browser->CreateBrowserWindow();
1306 // Append the TabContents before showing it so the window doesn't flash 1305 browser->tabstrip_model()->AppendTabContents(detached_contents, true);
1307 // black. 1306 browser->window()->Show();
1308 new_window->tabstrip_model()->AppendTabContents(detached_contents, true);
1309 new_window->Show();
1310 1307
1311 // When we detach a tab we need to make sure any associated Find window moves 1308 // When we detach a tab we need to make sure any associated Find window moves
1312 // along with it to its new home (basically we just make new_window the parent 1309 // along with it to its new home (basically we just make new_window the parent
1313 // of the Find window). 1310 // of the Find window).
1314 // TODO(brettw) this could probably be improved, see 1311 // TODO(brettw) this could probably be improved, see
1315 // WebContentsView::ReparentFindWindow for more. 1312 // WebContentsView::ReparentFindWindow for more.
1316 if (detached_contents->AsWebContents()) 1313 if (detached_contents->AsWebContents())
1317 detached_contents->AsWebContents()->view()->ReparentFindWindow(new_window); 1314 detached_contents->AsWebContents()->view()->ReparentFindWindow(browser);
1318 } 1315 }
1319 1316
1320 int Browser::GetDragActions() const { 1317 int Browser::GetDragActions() const {
1321 int result = 0; 1318 int result = 0;
1322 if (BrowserList::GetBrowserCountForType(profile_, 1319 if (BrowserList::GetBrowserCountForType(profile_,
1323 BrowserType::TABBED_BROWSER) > 1 || 1320 BrowserType::TABBED_BROWSER) > 1 ||
1324 tab_count() > 1) 1321 tab_count() > 1)
1325 result |= TAB_TEAROFF_ACTION; 1322 result |= TAB_TEAROFF_ACTION;
1326 if (tab_count() > 1) 1323 if (tab_count() > 1)
1327 result |= TAB_MOVE_ACTION; 1324 result |= TAB_MOVE_ACTION;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 GetTopLevelHWND())->active_contents(); 1367 GetTopLevelHWND())->active_contents();
1371 // If you duplicate a tab that is not selected, we need to make sure to 1368 // If you duplicate a tab that is not selected, we need to make sure to
1372 // select the tab being duplicated so that DetermineInsertionIndex returns 1369 // select the tab being duplicated so that DetermineInsertionIndex returns
1373 // the right index (if tab 5 is selected and we right-click tab 1 we want 1370 // the right index (if tab 5 is selected and we right-click tab 1 we want
1374 // the new tab to appear in index position 2, not 6). 1371 // the new tab to appear in index position 2, not 6).
1375 if (tabstrip_model_.selected_index() != index) 1372 if (tabstrip_model_.selected_index() != index)
1376 tabstrip_model_.SelectTabContentsAt(index, true); 1373 tabstrip_model_.SelectTabContentsAt(index, true);
1377 tabstrip_model_.AddTabContents(new_contents, index + 1, 1374 tabstrip_model_.AddTabContents(new_contents, index + 1,
1378 PageTransition::LINK, true); 1375 PageTransition::LINK, true);
1379 } else { 1376 } else {
1380 Browser* new_browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile(), 1377 Browser* browser = NULL;
1381 BrowserType::APPLICATION, app_name_); 1378 if (type_ == BrowserType::APPLICATION) {
1379 browser = Browser::CreateForApp(app_name_, profile_);
1380 } else if (type_ == BrowserType::BROWSER) {
1381 browser = Browser::CreateForPopup(profile_);
1382 }
1382 1383
1383 // We need to show the browser now. Otherwise ContainerWin assumes the 1384 // We need to show the browser now. Otherwise ContainerWin assumes the
1384 // TabContents is invisible and won't size it. 1385 // TabContents is invisible and won't size it.
1385 new_browser->Show(); 1386 browser->window()->Show();
1386 1387
1387 // The page transition below is only for the purpose of inserting the tab. 1388 // The page transition below is only for the purpose of inserting the tab.
1388 new_contents = new_browser->AddTabWithNavigationController( 1389 new_contents = browser->AddTabWithNavigationController(
1389 contents->controller()->Clone(new_browser->GetTopLevelHWND()), 1390 contents->controller()->Clone(browser->GetTopLevelHWND()),
1390 PageTransition::LINK); 1391 PageTransition::LINK);
1391
1392 new_browser->window()->Activate();
1393 } 1392 }
1394 1393
1395 if (profile_->HasSessionService()) { 1394 if (profile_->HasSessionService()) {
1396 SessionService* session_service = profile_->GetSessionService(); 1395 SessionService* session_service = profile_->GetSessionService();
1397 if (session_service) 1396 if (session_service)
1398 session_service->TabRestored(new_contents->controller()); 1397 session_service->TabRestored(new_contents->controller());
1399 } 1398 }
1400 } 1399 }
1401 1400
1402 void Browser::ValidateLoadingAnimations() { 1401 void Browser::ValidateLoadingAnimations() {
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 1580
1582 Browser* b = GetOrCreateTabbedBrowser(); 1581 Browser* b = GetOrCreateTabbedBrowser();
1583 DCHECK(b); 1582 DCHECK(b);
1584 1583
1585 // If we have just created a new browser window, make sure we select the 1584 // If we have just created a new browser window, make sure we select the
1586 // tab. 1585 // tab.
1587 if (b->tab_count() == 0 && disposition == NEW_BACKGROUND_TAB) 1586 if (b->tab_count() == 0 && disposition == NEW_BACKGROUND_TAB)
1588 disposition = NEW_FOREGROUND_TAB; 1587 disposition = NEW_FOREGROUND_TAB;
1589 1588
1590 b->OpenURL(url, referrer, disposition, transition); 1589 b->OpenURL(url, referrer, disposition, transition);
1591 b->Show(); 1590 b->window()->Show();
1592 b->window()->Activate();
1593 return; 1591 return;
1594 } 1592 }
1595 1593
1596 if (profile_->IsOffTheRecord() && disposition == OFF_THE_RECORD) 1594 if (profile_->IsOffTheRecord() && disposition == OFF_THE_RECORD)
1597 disposition = NEW_FOREGROUND_TAB; 1595 disposition = NEW_FOREGROUND_TAB;
1598 1596
1599 if (disposition == NEW_WINDOW) { 1597 if (disposition == NEW_WINDOW) {
1600 Browser* new_browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_, 1598 Browser* browser = Browser::Create(profile_);
1601 BrowserType::TABBED_BROWSER, L""); 1599 new_contents = browser->AddTabWithURL(url, referrer, transition, true,
1602 new_contents = new_browser->AddTabWithURL(url, referrer, transition, true, 1600 instance);
1603 instance); 1601 browser->window()->Show();
1604 new_browser->Show();
1605 } else if ((disposition == CURRENT_TAB) && current_tab) { 1602 } else if ((disposition == CURRENT_TAB) && current_tab) {
1606 if (transition == PageTransition::TYPED || 1603 if (transition == PageTransition::TYPED ||
1607 transition == PageTransition::AUTO_BOOKMARK || 1604 transition == PageTransition::AUTO_BOOKMARK ||
1608 transition == PageTransition::GENERATED || 1605 transition == PageTransition::GENERATED ||
1609 transition == PageTransition::START_PAGE) { 1606 transition == PageTransition::START_PAGE) {
1610 // Don't forget the openers if this tab is a New Tab page opened at the 1607 // Don't forget the openers if this tab is a New Tab page opened at the
1611 // end of the TabStrip (e.g. by pressing Ctrl+T). Give the user one 1608 // end of the TabStrip (e.g. by pressing Ctrl+T). Give the user one
1612 // navigation of one of these transition types before resetting the 1609 // navigation of one of these transition types before resetting the
1613 // opener relationships (this allows for the use case of opening a new 1610 // opener relationships (this allows for the use case of opening a new
1614 // tab to do a quick look-up of something while viewing a tab earlier in 1611 // tab to do a quick look-up of something while viewing a tab earlier in
(...skipping 24 matching lines...) Expand all
1639 GetStatusBubble()->Hide(); 1636 GetStatusBubble()->Hide();
1640 1637
1641 // Synchronously update the location bar. This allows us to immediately 1638 // Synchronously update the location bar. This allows us to immediately
1642 // have the URL bar update when the user types something, rather than 1639 // have the URL bar update when the user types something, rather than
1643 // going through the normal system of ScheduleUIUpdate which has a delay. 1640 // going through the normal system of ScheduleUIUpdate which has a delay.
1644 UpdateToolbar(false); 1641 UpdateToolbar(false);
1645 } else if (disposition == OFF_THE_RECORD) { 1642 } else if (disposition == OFF_THE_RECORD) {
1646 OpenURLOffTheRecord(profile_, url); 1643 OpenURLOffTheRecord(profile_, url);
1647 return; 1644 return;
1648 } else if (disposition != SUPPRESS_OPEN) { 1645 } else if (disposition != SUPPRESS_OPEN) {
1649 new_contents = 1646 new_contents = AddTabWithURL(url, referrer, transition,
1650 AddTabWithURL(url, referrer, transition, 1647 disposition != NEW_BACKGROUND_TAB, instance);
1651 disposition != NEW_BACKGROUND_TAB, instance);
1652 } 1648 }
1653 1649
1654 if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost) { 1650 if (disposition != NEW_BACKGROUND_TAB && source_tab_was_frontmost) {
1655 // Give the focus to the newly navigated tab, if the source tab was 1651 // Give the focus to the newly navigated tab, if the source tab was
1656 // front-most. 1652 // front-most.
1657 new_contents->Focus(); 1653 new_contents->Focus();
1658 } 1654 }
1659 } 1655 }
1660 1656
1661 void Browser::NavigationStateChanged(const TabContents* source, 1657 void Browser::NavigationStateChanged(const TabContents* source,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 DCHECK(b); 1716 DCHECK(b);
1721 PageTransition::Type transition = PageTransition::LINK; 1717 PageTransition::Type transition = PageTransition::LINK;
1722 // If we were called from an "installed webapp" we want to emulate the code 1718 // If we were called from an "installed webapp" we want to emulate the code
1723 // that is run from browser_init.cc for links from external applications. 1719 // that is run from browser_init.cc for links from external applications.
1724 // This means we need to open the tab with the START PAGE transition. 1720 // This means we need to open the tab with the START PAGE transition.
1725 // AddNewContents doesn't support this but the TabStripModel's 1721 // AddNewContents doesn't support this but the TabStripModel's
1726 // AddTabContents method does. 1722 // AddTabContents method does.
1727 if (type_ == BrowserType::APPLICATION) 1723 if (type_ == BrowserType::APPLICATION)
1728 transition = PageTransition::START_PAGE; 1724 transition = PageTransition::START_PAGE;
1729 b->tabstrip_model()->AddTabContents(new_contents, -1, transition, true); 1725 b->tabstrip_model()->AddTabContents(new_contents, -1, transition, true);
1730 b->Show(); 1726 b->window()->Show();
1731 b->window()->Activate();
1732 return; 1727 return;
1733 } 1728 }
1734 1729
1735 if (disposition == NEW_POPUP) { 1730 if (disposition == NEW_POPUP) {
1736 BuildPopupWindow(source, new_contents, initial_pos); 1731 BuildPopupWindow(source, new_contents, initial_pos);
1737 } else if (disposition == NEW_WINDOW) { 1732 } else if (disposition == NEW_WINDOW) {
1738 Browser* new_browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_, 1733 Browser* browser = Browser::Create(profile_);
1739 BrowserType::TABBED_BROWSER, L""); 1734 browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB,
1740 new_browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB, 1735 initial_pos, user_gesture);
1741 initial_pos, user_gesture); 1736 browser->window()->Show();
1742 new_browser->Show();
1743 } else if (disposition == CURRENT_TAB) { 1737 } else if (disposition == CURRENT_TAB) {
1744 ReplaceContents(source, new_contents); 1738 ReplaceContents(source, new_contents);
1745 } else if (disposition != SUPPRESS_OPEN) { 1739 } else if (disposition != SUPPRESS_OPEN) {
1746 tabstrip_model_.AddTabContents(new_contents, -1, PageTransition::LINK, 1740 tabstrip_model_.AddTabContents(new_contents, -1, PageTransition::LINK,
1747 disposition == NEW_FOREGROUND_TAB); 1741 disposition == NEW_FOREGROUND_TAB);
1748 } 1742 }
1749 } 1743 }
1750 1744
1751 void Browser::ActivateContents(TabContents* contents) { 1745 void Browser::ActivateContents(TabContents* contents) {
1752 tabstrip_model_.SelectTabContentsAt( 1746 tabstrip_model_.SelectTabContentsAt(
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 if (index < 0) 1843 if (index < 0)
1850 return; 1844 return;
1851 1845
1852 WebApp* app = contents->AsWebContents()->web_app(); 1846 WebApp* app = contents->AsWebContents()->web_app();
1853 const std::wstring& app_name = 1847 const std::wstring& app_name =
1854 app->name().empty() ? ComputeApplicationNameFromURL(app->url()) : 1848 app->name().empty() ? ComputeApplicationNameFromURL(app->url()) :
1855 app->name(); 1849 app->name();
1856 RegisterAppPrefs(app_name); 1850 RegisterAppPrefs(app_name);
1857 1851
1858 tabstrip_model_.DetachTabContentsAt(index); 1852 tabstrip_model_.DetachTabContentsAt(index);
1859 Browser* browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_, 1853 Browser* browser = Browser::CreateForApp(app_name, profile_);
1860 BrowserType::APPLICATION, app_name); 1854 browser->tabstrip_model()->AppendTabContents(contents, true);
1861 browser->AddNewContents( 1855 browser->window()->Show();
1862 NULL, contents, NEW_FOREGROUND_TAB, gfx::Rect(), true);
1863 browser->Show();
1864 } 1856 }
1865 1857
1866 void Browser::ContentsStateChanged(TabContents* source) { 1858 void Browser::ContentsStateChanged(TabContents* source) {
1867 int index = tabstrip_model_.GetIndexOfTabContents(source); 1859 int index = tabstrip_model_.GetIndexOfTabContents(source);
1868 if (index != TabStripModel::kNoTab) 1860 if (index != TabStripModel::kNoTab)
1869 tabstrip_model_.UpdateTabContentsStateAt(index); 1861 tabstrip_model_.UpdateTabContentsStateAt(index);
1870 } 1862 }
1871 1863
1872 bool Browser::ShouldDisplayURLField() { 1864 bool Browser::ShouldDisplayURLField() {
1873 return !IsApplication(); 1865 return !IsApplication();
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 RemoveFromVector(&tabs_needing_unload_fired_, tab); 2391 RemoveFromVector(&tabs_needing_unload_fired_, tab);
2400 ProcessPendingTabs(); 2392 ProcessPendingTabs();
2401 } 2393 }
2402 2394
2403 /////////////////////////////////////////////////////////////////////////////// 2395 ///////////////////////////////////////////////////////////////////////////////
2404 // Browser, Assorted utility functions (private): 2396 // Browser, Assorted utility functions (private):
2405 2397
2406 Browser* Browser::GetOrCreateTabbedBrowser() { 2398 Browser* Browser::GetOrCreateTabbedBrowser() {
2407 Browser* browser = BrowserList::FindBrowserWithType( 2399 Browser* browser = BrowserList::FindBrowserWithType(
2408 profile_, BrowserType::TABBED_BROWSER); 2400 profile_, BrowserType::TABBED_BROWSER);
2409 if (!browser) { 2401 if (!browser)
2410 browser = new Browser(gfx::Rect(), SW_SHOWNORMAL, profile_, 2402 browser = Browser::Create(profile_);
2411 BrowserType::TABBED_BROWSER, std::wstring());
2412 }
2413 return browser; 2403 return browser;
2414 } 2404 }
2415 2405
2416 void Browser::BuildPopupWindow(TabContents* source, 2406 void Browser::BuildPopupWindow(TabContents* source,
2417 TabContents* new_contents, 2407 TabContents* new_contents,
2418 const gfx::Rect& initial_pos) { 2408 const gfx::Rect& initial_pos) {
2419 BrowserType::Type type = 2409 BrowserType::Type type =
2420 type_ == BrowserType::APPLICATION ? type_ : BrowserType::BROWSER; 2410 type_ == BrowserType::APPLICATION ? type_ : BrowserType::BROWSER;
2421 Browser* browser = new Browser(initial_pos, SW_SHOWNORMAL, profile_, type, 2411 Browser* browser = new Browser(type, profile_);
2422 std::wstring()); 2412 browser->set_override_bounds(initial_pos);
2423 browser->AddNewContents(source, new_contents, 2413 browser->CreateBrowserWindow();
2424 NEW_FOREGROUND_TAB, gfx::Rect(), true); 2414 // TODO(beng): See if this can be made to use
2425 browser->Show(); 2415 // TabStripModel::AppendTabContents.
2416 browser->AddNewContents(source, new_contents, NEW_FOREGROUND_TAB,
2417 gfx::Rect(), true);
2418 browser->window()->Show();
2426 } 2419 }
2427 2420
2428 GURL Browser::GetHomePage() { 2421 GURL Browser::GetHomePage() {
2429 if (profile_->GetPrefs()->GetBoolean(prefs::kHomePageIsNewTabPage)) { 2422 if (profile_->GetPrefs()->GetBoolean(prefs::kHomePageIsNewTabPage))
2430 return NewTabUIURL(); 2423 return NewTabUIURL();
2431 } else { 2424 GURL home_page = GURL(URLFixerUpper::FixupURL(
2432 GURL home_page = GURL(URLFixerUpper::FixupURL( 2425 profile_->GetPrefs()->GetString(prefs::kHomePage),
2433 profile_->GetPrefs()->GetString(prefs::kHomePage), 2426 std::wstring()));
2434 std::wstring())); 2427 if (!home_page.is_valid())
2435 if (!home_page.is_valid()) 2428 return NewTabUIURL();
2436 return NewTabUIURL(); 2429 return home_page;
2437
2438 return home_page;
2439 }
2440 } 2430 }
2441 2431
2442 void Browser::AdvanceFindSelection(bool forward_direction) { 2432 void Browser::AdvanceFindSelection(bool forward_direction) {
2443 GetSelectedTabContents()->AsWebContents()->view()->FindInPage( 2433 GetSelectedTabContents()->AsWebContents()->view()->FindInPage(
2444 *this, true, forward_direction); 2434 *this, true, forward_direction);
2445 } 2435 }
2446 2436
2447 void Browser::CloseFrame() { 2437 void Browser::CloseFrame() {
2448 window_->Close(); 2438 window_->Close();
2449 } 2439 }
(...skipping 22 matching lines...) Expand all
2472 2462
2473 // We need to register the window position pref. 2463 // We need to register the window position pref.
2474 std::wstring window_pref(prefs::kBrowserWindowPlacement); 2464 std::wstring window_pref(prefs::kBrowserWindowPlacement);
2475 window_pref.append(L"_"); 2465 window_pref.append(L"_");
2476 window_pref.append(app_name); 2466 window_pref.append(app_name);
2477 PrefService* prefs = g_browser_process->local_state(); 2467 PrefService* prefs = g_browser_process->local_state();
2478 DCHECK(prefs); 2468 DCHECK(prefs);
2479 2469
2480 prefs->RegisterDictionaryPref(window_pref.c_str()); 2470 prefs->RegisterDictionaryPref(window_pref.c_str());
2481 } 2471 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698