| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/startup/startup_browser_creator_impl.h" | 5 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "chrome/browser/ui/startup/startup_tab_provider.h" | 8 #include "chrome/browser/ui/startup/startup_tab_provider.h" |
| 9 #include "chrome/common/url_constants.cc" | 9 #include "chrome/common/url_constants.cc" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 11 |
| 12 using Creator = StartupBrowserCreatorImpl; |
| 13 |
| 12 namespace { | 14 namespace { |
| 13 | 15 |
| 14 // Bits for FakeStartupTabProvider options. | 16 // Bits for FakeStartupTabProvider options. |
| 15 constexpr uint32_t kOnboardingTabs = 1 << 0; | 17 constexpr uint32_t kOnboardingTabs = 1 << 0; |
| 16 constexpr uint32_t kDistributionFirstRunTabs = 1 << 1; | 18 constexpr uint32_t kDistributionFirstRunTabs = 1 << 1; |
| 17 constexpr uint32_t kResetTriggerTabs = 1 << 2; | 19 constexpr uint32_t kResetTriggerTabs = 1 << 2; |
| 18 constexpr uint32_t kPinnedTabs = 1 << 3; | 20 constexpr uint32_t kPinnedTabs = 1 << 3; |
| 19 constexpr uint32_t kPreferencesTabs = 1 << 4; | 21 constexpr uint32_t kPreferencesTabs = 1 << 4; |
| 20 constexpr uint32_t kNewTabPageTabs = 1 << 5; | 22 constexpr uint32_t kNewTabPageTabs = 1 << 5; |
| 21 | 23 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 | 79 |
| 78 } // namespace | 80 } // namespace |
| 79 | 81 |
| 80 // "Standard" case: Tabs specified in onboarding, reset trigger, pinned tabs, or | 82 // "Standard" case: Tabs specified in onboarding, reset trigger, pinned tabs, or |
| 81 // preferences shouldn't interfere with each other. Nothing specified on the | 83 // preferences shouldn't interfere with each other. Nothing specified on the |
| 82 // command line. Reset trigger always appears first. | 84 // command line. Reset trigger always appears first. |
| 83 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs) { | 85 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs) { |
| 84 FakeStartupTabProvider provider(kOnboardingTabs | kResetTriggerTabs | | 86 FakeStartupTabProvider provider(kOnboardingTabs | kResetTriggerTabs | |
| 85 kPinnedTabs | kPreferencesTabs | | 87 kPinnedTabs | kPreferencesTabs | |
| 86 kNewTabPageTabs); | 88 kNewTabPageTabs); |
| 87 StartupBrowserCreatorImpl impl( | 89 Creator impl(base::FilePath(), |
| 88 base::FilePath(), base::CommandLine(base::CommandLine::NO_PROGRAM), | 90 base::CommandLine(base::CommandLine::NO_PROGRAM), |
| 89 chrome::startup::IS_FIRST_RUN); | 91 chrome::startup::IS_FIRST_RUN); |
| 90 | 92 |
| 91 StartupTabs output = | 93 StartupTabs output = |
| 92 impl.DetermineStartupTabs(provider, StartupTabs(), false, false); | 94 impl.DetermineStartupTabs(provider, StartupTabs(), false, false); |
| 93 ASSERT_EQ(4U, output.size()); | 95 ASSERT_EQ(4U, output.size()); |
| 94 EXPECT_EQ("reset-trigger", output[0].url.host()); | 96 EXPECT_EQ("reset-trigger", output[0].url.host()); |
| 95 EXPECT_EQ("onboarding", output[1].url.host()); | 97 EXPECT_EQ("onboarding", output[1].url.host()); |
| 96 EXPECT_EQ("prefs", output[2].url.host()); | 98 EXPECT_EQ("prefs", output[2].url.host()); |
| 97 EXPECT_EQ("pinned", output[3].url.host()); | 99 EXPECT_EQ("pinned", output[3].url.host()); |
| 98 } | 100 } |
| 99 | 101 |
| 100 // All content is blocked in Incognito mode, or when recovering from a crash. | 102 // All content is blocked in Incognito mode, or when recovering from a crash. |
| 101 // Only the New Tab Page should appear in either case. | 103 // Only the New Tab Page should appear in either case. |
| 102 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_IncognitoOrCrash) { | 104 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_IncognitoOrCrash) { |
| 103 FakeStartupTabProvider provider(kOnboardingTabs | kDistributionFirstRunTabs | | 105 FakeStartupTabProvider provider(kOnboardingTabs | kDistributionFirstRunTabs | |
| 104 kResetTriggerTabs | kPinnedTabs | | 106 kResetTriggerTabs | kPinnedTabs | |
| 105 kPreferencesTabs | kNewTabPageTabs); | 107 kPreferencesTabs | kNewTabPageTabs); |
| 106 StartupBrowserCreatorImpl impl( | 108 Creator impl(base::FilePath(), |
| 107 base::FilePath(), base::CommandLine(base::CommandLine::NO_PROGRAM), | 109 base::CommandLine(base::CommandLine::NO_PROGRAM), |
| 108 chrome::startup::IS_FIRST_RUN); | 110 chrome::startup::IS_FIRST_RUN); |
| 109 | 111 |
| 110 // Incognito case: | 112 // Incognito case: |
| 111 StartupTabs output = | 113 StartupTabs output = |
| 112 impl.DetermineStartupTabs(provider, StartupTabs(), true, false); | 114 impl.DetermineStartupTabs(provider, StartupTabs(), true, false); |
| 113 ASSERT_EQ(1U, output.size()); | 115 ASSERT_EQ(1U, output.size()); |
| 114 // Check for the actual NTP URL, rather than the sentinel returned by the | 116 // Check for the actual NTP URL, rather than the sentinel returned by the |
| 115 // fake, because the Provider is ignored entirely when short-circuited by | 117 // fake, because the Provider is ignored entirely when short-circuited by |
| 116 // incognito/crash. | 118 // incognito/crash. |
| 117 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), output[0].url); | 119 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), output[0].url); |
| 118 | 120 |
| 119 // Crash Recovery case: | 121 // Crash Recovery case: |
| 120 output = impl.DetermineStartupTabs(provider, StartupTabs(), false, true); | 122 output = impl.DetermineStartupTabs(provider, StartupTabs(), false, true); |
| 121 ASSERT_EQ(1U, output.size()); | 123 ASSERT_EQ(1U, output.size()); |
| 122 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), output[0].url); | 124 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), output[0].url); |
| 123 } | 125 } |
| 124 | 126 |
| 125 // If Master Preferences specifies content, this should block all other | 127 // If Master Preferences specifies content, this should block all other |
| 126 // policies. The only exception is command line URLs, tested below. | 128 // policies. The only exception is command line URLs, tested below. |
| 127 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_MasterPrefs) { | 129 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_MasterPrefs) { |
| 128 FakeStartupTabProvider provider(kOnboardingTabs | kDistributionFirstRunTabs | | 130 FakeStartupTabProvider provider(kOnboardingTabs | kDistributionFirstRunTabs | |
| 129 kResetTriggerTabs | kPinnedTabs | | 131 kResetTriggerTabs | kPinnedTabs | |
| 130 kPreferencesTabs | kNewTabPageTabs); | 132 kPreferencesTabs | kNewTabPageTabs); |
| 131 StartupBrowserCreatorImpl impl( | 133 Creator impl(base::FilePath(), |
| 132 base::FilePath(), base::CommandLine(base::CommandLine::NO_PROGRAM), | 134 base::CommandLine(base::CommandLine::NO_PROGRAM), |
| 133 chrome::startup::IS_FIRST_RUN); | 135 chrome::startup::IS_FIRST_RUN); |
| 134 | 136 |
| 135 StartupTabs output = | 137 StartupTabs output = |
| 136 impl.DetermineStartupTabs(provider, StartupTabs(), false, false); | 138 impl.DetermineStartupTabs(provider, StartupTabs(), false, false); |
| 137 ASSERT_EQ(1U, output.size()); | 139 ASSERT_EQ(1U, output.size()); |
| 138 EXPECT_EQ("distribution", output[0].url.host()); | 140 EXPECT_EQ("distribution", output[0].url.host()); |
| 139 } | 141 } |
| 140 | 142 |
| 141 // URLs specified on the command line should always appear, and should block | 143 // URLs specified on the command line should always appear, and should block |
| 142 // all other tabs except the Reset Trigger tab. | 144 // all other tabs except the Reset Trigger tab. |
| 143 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_CommandLine) { | 145 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_CommandLine) { |
| 144 FakeStartupTabProvider provider(kOnboardingTabs | kDistributionFirstRunTabs | | 146 FakeStartupTabProvider provider(kOnboardingTabs | kDistributionFirstRunTabs | |
| 145 kResetTriggerTabs | kPinnedTabs | | 147 kResetTriggerTabs | kPinnedTabs | |
| 146 kPreferencesTabs | kNewTabPageTabs); | 148 kPreferencesTabs | kNewTabPageTabs); |
| 147 StartupBrowserCreatorImpl impl( | 149 Creator impl(base::FilePath(), |
| 148 base::FilePath(), base::CommandLine(base::CommandLine::NO_PROGRAM), | 150 base::CommandLine(base::CommandLine::NO_PROGRAM), |
| 149 chrome::startup::IS_FIRST_RUN); | 151 chrome::startup::IS_FIRST_RUN); |
| 150 | 152 |
| 151 StartupTabs cmd_line_tabs = {StartupTab(GURL("https://cmd-line"), false)}; | 153 StartupTabs cmd_line_tabs = {StartupTab(GURL("https://cmd-line"), false)}; |
| 152 | 154 |
| 153 StartupTabs output = | 155 StartupTabs output = |
| 154 impl.DetermineStartupTabs(provider, cmd_line_tabs, false, false); | 156 impl.DetermineStartupTabs(provider, cmd_line_tabs, false, false); |
| 155 ASSERT_EQ(2U, output.size()); | 157 ASSERT_EQ(2U, output.size()); |
| 156 EXPECT_EQ("reset-trigger", output[0].url.host()); | 158 EXPECT_EQ("reset-trigger", output[0].url.host()); |
| 157 EXPECT_EQ("cmd-line", output[1].url.host()); | 159 EXPECT_EQ("cmd-line", output[1].url.host()); |
| 158 | 160 |
| 159 // Also test that both incognito and crash recovery don't interfere with | 161 // Also test that both incognito and crash recovery don't interfere with |
| 160 // command line tabs. | 162 // command line tabs. |
| 161 | 163 |
| 162 // Incognito | 164 // Incognito |
| 163 output = impl.DetermineStartupTabs(provider, cmd_line_tabs, true, false); | 165 output = impl.DetermineStartupTabs(provider, cmd_line_tabs, true, false); |
| 164 ASSERT_EQ(1U, output.size()); | 166 ASSERT_EQ(1U, output.size()); |
| 165 EXPECT_EQ("cmd-line", output[0].url.host()); | 167 EXPECT_EQ("cmd-line", output[0].url.host()); |
| 166 | 168 |
| 167 // Crash Recovery | 169 // Crash Recovery |
| 168 output = impl.DetermineStartupTabs(provider, cmd_line_tabs, false, true); | 170 output = impl.DetermineStartupTabs(provider, cmd_line_tabs, false, true); |
| 169 ASSERT_EQ(1U, output.size()); | 171 ASSERT_EQ(1U, output.size()); |
| 170 EXPECT_EQ("cmd-line", output[0].url.host()); | 172 EXPECT_EQ("cmd-line", output[0].url.host()); |
| 171 } | 173 } |
| 172 | 174 |
| 173 // New Tab Page should appear alongside pinned tabs and the reset trigger, but | 175 // New Tab Page should appear alongside pinned tabs and the reset trigger, but |
| 174 // should be superseded by onboarding tabs and by tabs specified in preferences. | 176 // should be superseded by onboarding tabs and by tabs specified in preferences. |
| 175 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_NewTabPage) { | 177 TEST(StartupBrowserCreatorImplTest, DetermineStartupTabs_NewTabPage) { |
| 176 FakeStartupTabProvider provider_allows_ntp(kPinnedTabs | kResetTriggerTabs | | 178 FakeStartupTabProvider provider_allows_ntp(kPinnedTabs | kResetTriggerTabs | |
| 177 kNewTabPageTabs); | 179 kNewTabPageTabs); |
| 178 StartupBrowserCreatorImpl impl( | 180 Creator impl(base::FilePath(), |
| 179 base::FilePath(), base::CommandLine(base::CommandLine::NO_PROGRAM), | 181 base::CommandLine(base::CommandLine::NO_PROGRAM), |
| 180 chrome::startup::IS_FIRST_RUN); | 182 chrome::startup::IS_FIRST_RUN); |
| 181 | 183 |
| 182 StartupTabs output = impl.DetermineStartupTabs(provider_allows_ntp, | 184 StartupTabs output = impl.DetermineStartupTabs(provider_allows_ntp, |
| 183 StartupTabs(), false, false); | 185 StartupTabs(), false, false); |
| 184 ASSERT_EQ(3U, output.size()); | 186 ASSERT_EQ(3U, output.size()); |
| 185 EXPECT_EQ("reset-trigger", output[0].url.host()); | 187 EXPECT_EQ("reset-trigger", output[0].url.host()); |
| 186 EXPECT_EQ("new-tab", output[1].url.host()); | 188 EXPECT_EQ("new-tab", output[1].url.host()); |
| 187 EXPECT_EQ("pinned", output[2].url.host()); | 189 EXPECT_EQ("pinned", output[2].url.host()); |
| 188 } | 190 } |
| 191 |
| 192 TEST(StartupBrowserCreatorImplTest, DetermineBrowserOpenBehavior_Startup) { |
| 193 SessionStartupPref pref_default(SessionStartupPref::Type::DEFAULT); |
| 194 SessionStartupPref pref_last(SessionStartupPref::Type::LAST); |
| 195 SessionStartupPref pref_urls(SessionStartupPref::Type::URLS); |
| 196 |
| 197 // The most typical case: startup, not recovering from a crash, no switches. |
| 198 // Test each pref with and without command-line tabs. |
| 199 Creator::BrowserOpenBehavior output = Creator::DetermineBrowserOpenBehavior( |
| 200 pref_default, Creator::PROCESS_STARTUP); |
| 201 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 202 |
| 203 output = Creator::DetermineBrowserOpenBehavior( |
| 204 pref_default, Creator::PROCESS_STARTUP | Creator::HAS_CMD_LINE_TABS); |
| 205 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 206 |
| 207 output = Creator::DetermineBrowserOpenBehavior(pref_urls, |
| 208 Creator::PROCESS_STARTUP); |
| 209 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 210 |
| 211 output = Creator::DetermineBrowserOpenBehavior( |
| 212 pref_urls, Creator::PROCESS_STARTUP | Creator::HAS_CMD_LINE_TABS); |
| 213 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 214 |
| 215 output = Creator::DetermineBrowserOpenBehavior(pref_last, |
| 216 Creator::PROCESS_STARTUP); |
| 217 EXPECT_EQ(Creator::BrowserOpenBehavior::SYNCHRONOUS_RESTORE, output); |
| 218 |
| 219 output = Creator::DetermineBrowserOpenBehavior( |
| 220 pref_last, Creator::PROCESS_STARTUP | Creator::HAS_CMD_LINE_TABS); |
| 221 EXPECT_EQ(Creator::BrowserOpenBehavior::SYNCHRONOUS_RESTORE, output); |
| 222 } |
| 223 |
| 224 TEST(StartupBrowserCreatorImplTest, DetermineBrowserOpenBehavior_CmdLineTabs) { |
| 225 SessionStartupPref pref_default(SessionStartupPref::Type::DEFAULT); |
| 226 SessionStartupPref pref_last(SessionStartupPref::Type::LAST); |
| 227 SessionStartupPref pref_urls(SessionStartupPref::Type::URLS); |
| 228 |
| 229 // Command line tabs after startup should prompt use of existing window, |
| 230 // regardless of pref. |
| 231 Creator::BrowserOpenBehavior output = Creator::DetermineBrowserOpenBehavior( |
| 232 pref_default, Creator::HAS_CMD_LINE_TABS); |
| 233 EXPECT_EQ(Creator::BrowserOpenBehavior::USE_EXISTING, output); |
| 234 |
| 235 output = Creator::DetermineBrowserOpenBehavior(pref_urls, |
| 236 Creator::HAS_CMD_LINE_TABS); |
| 237 EXPECT_EQ(Creator::BrowserOpenBehavior::USE_EXISTING, output); |
| 238 |
| 239 output = Creator::DetermineBrowserOpenBehavior(pref_last, |
| 240 Creator::HAS_CMD_LINE_TABS); |
| 241 EXPECT_EQ(Creator::BrowserOpenBehavior::USE_EXISTING, output); |
| 242 |
| 243 // Exception: this can be overridden by passing a switch. |
| 244 output = Creator::DetermineBrowserOpenBehavior( |
| 245 pref_urls, Creator::HAS_NEW_WINDOW_SWITCH | Creator::HAS_CMD_LINE_TABS); |
| 246 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 247 } |
| 248 |
| 249 TEST(StartupBrowserCreatorImplTest, DetermineBrowserOpenBehavior_PostCrash) { |
| 250 SessionStartupPref pref_last(SessionStartupPref::Type::LAST); |
| 251 |
| 252 // Launching after crash should block session restore. |
| 253 Creator::BrowserOpenBehavior output = Creator::DetermineBrowserOpenBehavior( |
| 254 pref_last, Creator::PROCESS_STARTUP | Creator::IS_POST_CRASH_LAUNCH); |
| 255 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 256 |
| 257 // Exception: this can be overridden by passing a switch. |
| 258 output = Creator::DetermineBrowserOpenBehavior( |
| 259 pref_last, Creator::PROCESS_STARTUP | Creator::IS_POST_CRASH_LAUNCH | |
| 260 Creator::HAS_RESTORE_SWITCH); |
| 261 EXPECT_EQ(Creator::BrowserOpenBehavior::SYNCHRONOUS_RESTORE, output); |
| 262 } |
| 263 |
| 264 TEST(StartupBrowserCreatorImplTest, DetermineBrowserOpenBehavior_NotStartup) { |
| 265 SessionStartupPref pref_default(SessionStartupPref::Type::DEFAULT); |
| 266 SessionStartupPref pref_last(SessionStartupPref::Type::LAST); |
| 267 SessionStartupPref pref_urls(SessionStartupPref::Type::URLS); |
| 268 |
| 269 // Launch after startup without command-line tabs should always create a new |
| 270 // window. |
| 271 Creator::BrowserOpenBehavior output = |
| 272 Creator::DetermineBrowserOpenBehavior(pref_default, 0); |
| 273 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 274 |
| 275 output = Creator::DetermineBrowserOpenBehavior(pref_last, 0); |
| 276 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 277 |
| 278 output = Creator::DetermineBrowserOpenBehavior(pref_urls, 0); |
| 279 EXPECT_EQ(Creator::BrowserOpenBehavior::NEW, output); |
| 280 } |
| OLD | NEW |