OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/ui/browser_navigator.h" | 5 #include "chrome/browser/ui/browser_navigator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 // Returns true if the specified Browser can open tabs. Not all Browsers support | 46 // Returns true if the specified Browser can open tabs. Not all Browsers support |
47 // multiple tabs, such as app frames and popups. This function returns false for | 47 // multiple tabs, such as app frames and popups. This function returns false for |
48 // those types of Browser. | 48 // those types of Browser. |
49 bool WindowCanOpenTabs(Browser* browser) { | 49 bool WindowCanOpenTabs(Browser* browser) { |
50 return browser->CanSupportWindowFeature(Browser::FEATURE_TABSTRIP) || | 50 return browser->CanSupportWindowFeature(Browser::FEATURE_TABSTRIP) || |
51 browser->tab_strip_model()->empty(); | 51 browser->tab_strip_model()->empty(); |
52 } | 52 } |
53 | 53 |
54 // Finds an existing Browser compatible with |profile|, making a new one if no | 54 // Finds an existing Browser compatible with |profile|, making a new one if no |
55 // such Browser is located. | 55 // such Browser is located. |
56 Browser* GetOrCreateBrowser(Profile* profile) { | 56 Browser* GetOrCreateBrowser(Profile* profile, |
57 Browser* browser = browser::FindTabbedBrowser(profile, false); | 57 chrome::HostDesktopType host_desktop_type) { |
| 58 Browser* browser = |
| 59 browser::FindTabbedBrowser(profile, false, host_desktop_type); |
58 return browser ? browser : new Browser(Browser::CreateParams(profile)); | 60 return browser ? browser : new Browser(Browser::CreateParams(profile)); |
59 } | 61 } |
60 | 62 |
61 // Change some of the navigation parameters based on the particular URL. | 63 // Change some of the navigation parameters based on the particular URL. |
62 // Currently this applies to some chrome:// pages which we always want to open | 64 // Currently this applies to some chrome:// pages which we always want to open |
63 // in a non-incognito window. Note that even though a ChromeOS guest session is | 65 // in a non-incognito window. Note that even though a ChromeOS guest session is |
64 // technically an incognito window, these URLs are allowed. | 66 // technically an incognito window, these URLs are allowed. |
65 // Returns true on success. Otherwise, if changing params leads the browser into | 67 // Returns true on success. Otherwise, if changing params leads the browser into |
66 // an erroneous state, returns false. | 68 // an erroneous state, returns false. |
67 bool AdjustNavigateParamsForURL(chrome::NavigateParams* params) { | 69 bool AdjustNavigateParamsForURL(chrome::NavigateParams* params) { |
68 if (params->target_contents != NULL || | 70 if (params->target_contents != NULL || |
69 chrome::IsURLAllowedInIncognito(params->url) || | 71 chrome::IsURLAllowedInIncognito(params->url) || |
70 Profile::IsGuestSession()) { | 72 Profile::IsGuestSession()) { |
71 return true; | 73 return true; |
72 } | 74 } |
73 | 75 |
74 Profile* profile = params->initiating_profile; | 76 Profile* profile = params->initiating_profile; |
75 | 77 |
76 if (profile->IsOffTheRecord() || params->disposition == OFF_THE_RECORD) { | 78 if (profile->IsOffTheRecord() || params->disposition == OFF_THE_RECORD) { |
77 profile = profile->GetOriginalProfile(); | 79 profile = profile->GetOriginalProfile(); |
78 | 80 |
79 // If incognito is forced, we punt. | 81 // If incognito is forced, we punt. |
80 PrefService* prefs = profile->GetPrefs(); | 82 PrefService* prefs = profile->GetPrefs(); |
81 if (prefs && IncognitoModePrefs::GetAvailability(prefs) == | 83 if (prefs && IncognitoModePrefs::GetAvailability(prefs) == |
82 IncognitoModePrefs::FORCED) { | 84 IncognitoModePrefs::FORCED) { |
83 return false; | 85 return false; |
84 } | 86 } |
85 | 87 |
86 params->disposition = SINGLETON_TAB; | 88 params->disposition = SINGLETON_TAB; |
87 params->browser = browser::FindOrCreateTabbedBrowser(profile); | 89 params->browser = |
| 90 browser::FindOrCreateTabbedBrowser(profile, params->host_desktop_type); |
88 params->window_action = chrome::NavigateParams::SHOW_WINDOW; | 91 params->window_action = chrome::NavigateParams::SHOW_WINDOW; |
89 } | 92 } |
90 | 93 |
91 return true; | 94 return true; |
92 } | 95 } |
93 | 96 |
94 // Returns a Browser that can host the navigation or tab addition specified in | 97 // Returns a Browser that can host the navigation or tab addition specified in |
95 // |params|. This might just return the same Browser specified in |params|, or | 98 // |params|. This might just return the same Browser specified in |params|, or |
96 // some other if that Browser is deemed incompatible. | 99 // some other if that Browser is deemed incompatible. |
97 Browser* GetBrowserForDisposition(chrome::NavigateParams* params) { | 100 Browser* GetBrowserForDisposition(chrome::NavigateParams* params) { |
98 // If no source TabContents was specified, we use the selected one from | 101 // If no source TabContents was specified, we use the selected one from |
99 // the target browser. This must happen first, before | 102 // the target browser. This must happen first, before |
100 // GetBrowserForDisposition() has a chance to replace |params->browser| with | 103 // GetBrowserForDisposition() has a chance to replace |params->browser| with |
101 // another one. | 104 // another one. |
102 if (!params->source_contents && params->browser) | 105 if (!params->source_contents && params->browser) |
103 params->source_contents = chrome::GetActiveTabContents(params->browser); | 106 params->source_contents = chrome::GetActiveTabContents(params->browser); |
104 | 107 |
105 Profile* profile = params->initiating_profile; | 108 Profile* profile = params->initiating_profile; |
106 | 109 |
107 switch (params->disposition) { | 110 switch (params->disposition) { |
108 case CURRENT_TAB: | 111 case CURRENT_TAB: |
109 if (params->browser) | 112 if (params->browser) |
110 return params->browser; | 113 return params->browser; |
111 // Find a compatible window and re-execute this command in it. Otherwise | 114 // Find a compatible window and re-execute this command in it. Otherwise |
112 // re-run with NEW_WINDOW. | 115 // re-run with NEW_WINDOW. |
113 return GetOrCreateBrowser(profile); | 116 return GetOrCreateBrowser(profile, params->host_desktop_type); |
114 case SINGLETON_TAB: | 117 case SINGLETON_TAB: |
115 case NEW_FOREGROUND_TAB: | 118 case NEW_FOREGROUND_TAB: |
116 case NEW_BACKGROUND_TAB: | 119 case NEW_BACKGROUND_TAB: |
117 // See if we can open the tab in the window this navigator is bound to. | 120 // See if we can open the tab in the window this navigator is bound to. |
118 if (params->browser && WindowCanOpenTabs(params->browser)) | 121 if (params->browser && WindowCanOpenTabs(params->browser)) |
119 return params->browser; | 122 return params->browser; |
120 // Find a compatible window and re-execute this command in it. Otherwise | 123 // Find a compatible window and re-execute this command in it. Otherwise |
121 // re-run with NEW_WINDOW. | 124 // re-run with NEW_WINDOW. |
122 return GetOrCreateBrowser(profile); | 125 return GetOrCreateBrowser(profile, params->host_desktop_type); |
123 case NEW_POPUP: { | 126 case NEW_POPUP: { |
124 // Make a new popup window. | 127 // Make a new popup window. |
125 // Coerce app-style if |source| represents an app. | 128 // Coerce app-style if |source| represents an app. |
126 std::string app_name; | 129 std::string app_name; |
127 if (!params->extension_app_id.empty()) { | 130 if (!params->extension_app_id.empty()) { |
128 app_name = web_app::GenerateApplicationNameFromExtensionId( | 131 app_name = web_app::GenerateApplicationNameFromExtensionId( |
129 params->extension_app_id); | 132 params->extension_app_id); |
130 } else if (!params->browser->app_name().empty()) { | 133 } else if (!params->browser->app_name().empty()) { |
131 app_name = params->browser->app_name(); | 134 app_name = params->browser->app_name(); |
132 } else if (params->source_contents) { | 135 } else if (params->source_contents) { |
(...skipping 13 matching lines...) Expand all Loading... |
146 | 149 |
147 return new Browser(Browser::CreateParams::CreateForApp( | 150 return new Browser(Browser::CreateParams::CreateForApp( |
148 Browser::TYPE_POPUP, app_name, params->window_bounds, profile)); | 151 Browser::TYPE_POPUP, app_name, params->window_bounds, profile)); |
149 } | 152 } |
150 case NEW_WINDOW: { | 153 case NEW_WINDOW: { |
151 // Make a new normal browser window. | 154 // Make a new normal browser window. |
152 return new Browser(Browser::CreateParams(profile)); | 155 return new Browser(Browser::CreateParams(profile)); |
153 } | 156 } |
154 case OFF_THE_RECORD: | 157 case OFF_THE_RECORD: |
155 // Make or find an incognito window. | 158 // Make or find an incognito window. |
156 return GetOrCreateBrowser(profile->GetOffTheRecordProfile()); | 159 return GetOrCreateBrowser(profile->GetOffTheRecordProfile(), |
| 160 params->host_desktop_type); |
157 // The following types all result in no navigation. | 161 // The following types all result in no navigation. |
158 case SUPPRESS_OPEN: | 162 case SUPPRESS_OPEN: |
159 case SAVE_TO_DISK: | 163 case SAVE_TO_DISK: |
160 case IGNORE_ACTION: | 164 case IGNORE_ACTION: |
161 return NULL; | 165 return NULL; |
162 default: | 166 default: |
163 NOTREACHED(); | 167 NOTREACHED(); |
164 } | 168 } |
165 return NULL; | 169 return NULL; |
166 } | 170 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 disposition(CURRENT_TAB), | 313 disposition(CURRENT_TAB), |
310 transition(a_transition), | 314 transition(a_transition), |
311 is_renderer_initiated(false), | 315 is_renderer_initiated(false), |
312 tabstrip_index(-1), | 316 tabstrip_index(-1), |
313 tabstrip_add_types(TabStripModel::ADD_ACTIVE), | 317 tabstrip_add_types(TabStripModel::ADD_ACTIVE), |
314 window_action(NO_ACTION), | 318 window_action(NO_ACTION), |
315 user_gesture(true), | 319 user_gesture(true), |
316 path_behavior(RESPECT), | 320 path_behavior(RESPECT), |
317 ref_behavior(IGNORE_REF), | 321 ref_behavior(IGNORE_REF), |
318 browser(a_browser), | 322 browser(a_browser), |
319 initiating_profile(NULL) {} | 323 initiating_profile(NULL) { |
| 324 if (a_browser) |
| 325 host_desktop_type = a_browser->host_desktop_type(); |
| 326 else |
| 327 host_desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE; |
| 328 } |
320 | 329 |
321 NavigateParams::NavigateParams(Browser* a_browser, | 330 NavigateParams::NavigateParams(Browser* a_browser, |
322 TabContents* a_target_contents) | 331 TabContents* a_target_contents) |
323 : target_contents(a_target_contents), | 332 : target_contents(a_target_contents), |
324 source_contents(NULL), | 333 source_contents(NULL), |
325 disposition(CURRENT_TAB), | 334 disposition(CURRENT_TAB), |
326 transition(content::PAGE_TRANSITION_LINK), | 335 transition(content::PAGE_TRANSITION_LINK), |
327 is_renderer_initiated(false), | 336 is_renderer_initiated(false), |
328 tabstrip_index(-1), | 337 tabstrip_index(-1), |
329 tabstrip_add_types(TabStripModel::ADD_ACTIVE), | 338 tabstrip_add_types(TabStripModel::ADD_ACTIVE), |
330 window_action(NO_ACTION), | 339 window_action(NO_ACTION), |
331 user_gesture(true), | 340 user_gesture(true), |
332 path_behavior(RESPECT), | 341 path_behavior(RESPECT), |
333 ref_behavior(IGNORE_REF), | 342 ref_behavior(IGNORE_REF), |
334 browser(a_browser), | 343 browser(a_browser), |
335 initiating_profile(NULL) {} | 344 initiating_profile(NULL) { |
| 345 if (a_browser) |
| 346 host_desktop_type = a_browser->host_desktop_type(); |
| 347 else |
| 348 host_desktop_type = chrome::HOST_DESKTOP_TYPE_NATIVE; |
| 349 } |
336 | 350 |
337 NavigateParams::NavigateParams(Profile* a_profile, | 351 NavigateParams::NavigateParams(Profile* a_profile, |
338 const GURL& a_url, | 352 const GURL& a_url, |
339 content::PageTransition a_transition) | 353 content::PageTransition a_transition) |
340 : url(a_url), | 354 : url(a_url), |
341 target_contents(NULL), | 355 target_contents(NULL), |
342 source_contents(NULL), | 356 source_contents(NULL), |
343 disposition(NEW_FOREGROUND_TAB), | 357 disposition(NEW_FOREGROUND_TAB), |
344 transition(a_transition), | 358 transition(a_transition), |
345 is_renderer_initiated(false), | 359 is_renderer_initiated(false), |
346 tabstrip_index(-1), | 360 tabstrip_index(-1), |
347 tabstrip_add_types(TabStripModel::ADD_ACTIVE), | 361 tabstrip_add_types(TabStripModel::ADD_ACTIVE), |
348 window_action(SHOW_WINDOW), | 362 window_action(SHOW_WINDOW), |
349 user_gesture(true), | 363 user_gesture(true), |
350 path_behavior(RESPECT), | 364 path_behavior(RESPECT), |
351 ref_behavior(IGNORE_REF), | 365 ref_behavior(IGNORE_REF), |
352 browser(NULL), | 366 browser(NULL), |
353 initiating_profile(a_profile) {} | 367 initiating_profile(a_profile), |
| 368 host_desktop_type(chrome::HOST_DESKTOP_TYPE_NATIVE) {} |
354 | 369 |
355 NavigateParams::~NavigateParams() {} | 370 NavigateParams::~NavigateParams() {} |
356 | 371 |
357 void Navigate(NavigateParams* params) { | 372 void Navigate(NavigateParams* params) { |
358 Browser* source_browser = params->browser; | 373 Browser* source_browser = params->browser; |
359 if (source_browser) | 374 if (source_browser) |
360 params->initiating_profile = source_browser->profile(); | 375 params->initiating_profile = source_browser->profile(); |
361 DCHECK(params->initiating_profile); | 376 DCHECK(params->initiating_profile); |
362 | 377 |
363 if (!AdjustNavigateParamsForURL(params)) | 378 if (!AdjustNavigateParamsForURL(params)) |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 return !(url.scheme() == chrome::kChromeUIScheme && | 569 return !(url.scheme() == chrome::kChromeUIScheme && |
555 (url.host() == chrome::kChromeUISettingsHost || | 570 (url.host() == chrome::kChromeUISettingsHost || |
556 url.host() == chrome::kChromeUISettingsFrameHost || | 571 url.host() == chrome::kChromeUISettingsFrameHost || |
557 url.host() == chrome::kChromeUIExtensionsHost || | 572 url.host() == chrome::kChromeUIExtensionsHost || |
558 url.host() == chrome::kChromeUIBookmarksHost || | 573 url.host() == chrome::kChromeUIBookmarksHost || |
559 url.host() == chrome::kChromeUISyncPromoHost || | 574 url.host() == chrome::kChromeUISyncPromoHost || |
560 url.host() == chrome::kChromeUIUberHost)); | 575 url.host() == chrome::kChromeUIUberHost)); |
561 } | 576 } |
562 | 577 |
563 } // namespace chrome | 578 } // namespace chrome |
OLD | NEW |