Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 1 | # Testing Chrome browser UI with TestBrowserUi |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 2 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 3 | \#include "[chrome/browser/ui/test/test_browser_ui.h]" |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 4 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 5 | `TestBrowserUi` (and convenience class `TestBrowserDialog`) provide ways to |
| 6 | register an `InProcessBrowserTest` testing harness with a framework that invokes |
| 7 | Chrome browser UI in a consistent way. They optionally provide a way to invoke |
| 8 | UI "interactively". This allows screenshots to be generated easily, with the |
| 9 | same test data, to assist with UI review. `TestBrowserUi` also provides a UI |
| 10 | registry so pieces of UI can be systematically checked for subtle changes and |
| 11 | regressions. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 12 | |
| 13 | [TOC] |
| 14 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 15 | ## How to register UI |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 16 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 17 | If registering existing UI, there's a chance it already has a test harness |
| 18 | inheriting, using, or with `typedef InProcessBrowserTest` (or a descendant of |
| 19 | it). If so, using `TestBrowserDialog` (for a dialog) is straightforward, and |
| 20 | `TestBrowserUi` (for other types of UI) relatively so. Assume the existing |
| 21 | `InProcessBrowserTest` is in `foo_browsertest.cc`: |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 22 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 23 | class FooUiTest : public InProcessBrowserTest { ... |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 24 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 25 | Change this to inherit from `DialogBrowserTest` (for dialogs) or `UiBrowserTest` |
| 26 | (for non-dialogs), and override `ShowUi(std::string)`. For non-dialogs, also |
| 27 | override `VerifyUi()` and `WaitForUserDismissal()`. See |
| 28 | [Advanced Usage](#Advanced-Usage) for details. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 29 | |
| 30 | ```cpp |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 31 | class FooUiTest : public UiBrowserTest { |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 32 | public: |
| 33 | .. |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 34 | // UiBrowserTest: |
| 35 | void ShowUi(const std::string& name) override { |
| 36 | /* Show Ui attached to browser() and leave it open. */ |
| 37 | } |
| 38 | // These next two are not necessary if subclassing DialogBrowserTest. |
| 39 | bool VerifyUi() override { |
| 40 | /* Return true if the UI was successfully shown. */ |
| 41 | } |
| 42 | void WaitForUserDismissal() override { |
| 43 | /* Block until the UI has been dismissed. */ |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 44 | } |
| 45 | .. |
| 46 | }; |
| 47 | ``` |
| 48 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 49 | Finally, add test invocations using the usual GTest macros, in |
| 50 | `foo_browsertest.cc`: |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 51 | |
| 52 | ```cpp |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 53 | IN_PROC_BROWSER_TEST_F(FooUiTest, InvokeUi_default) { |
| 54 | ShowAndVerifyUi(); |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 55 | } |
| 56 | ``` |
| 57 | |
| 58 | Notes: |
| 59 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 60 | * The body of the test is always just "`ShowAndVerifyUi();`". |
| 61 | * "`default`" is the `std::string` passed to `ShowUi()` and can be |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 62 | customized. See |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 63 | [Testing additional UI "styles"](#Testing-additional-ui-styles). |
| 64 | * The text before `default` (in this case) must always be "`InvokeUi_`". |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 65 | |
| 66 | ### Concrete examples |
| 67 | |
| 68 | * [chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc] |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 69 | * [chrome/browser/infobars/infobars_browsertest.cc] |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 70 | |
| 71 | ## Running the tests |
| 72 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 73 | List the available pieces of UI with |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 74 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 75 | $ ./browser_tests --gtest_filter=BrowserUiTest.Invoke |
Keren Zhu | 1f7b99da | 2023-10-04 23:47:32 | [diff] [blame] | 76 | $ ./interactive_ui_tests --gtest_filter=BrowserInteractiveUiTest.Invoke |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 77 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 78 | E.g. `FooUiTest.InvokeUi_default` should be listed. To show the UI |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 79 | interactively, run |
| 80 | |
Keren Zhu | 1f7b99da | 2023-10-04 23:47:32 | [diff] [blame] | 81 | # If FooUiTest is a browser test. |
Peter Boström | e2732ef | 2018-02-21 21:53:24 | [diff] [blame] | 82 | $ ./browser_tests --gtest_filter=BrowserUiTest.Invoke \ |
| 83 | --test-launcher-interactive --ui=FooUiTest.InvokeUi_default |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 84 | |
Keren Zhu | 1f7b99da | 2023-10-04 23:47:32 | [diff] [blame] | 85 | # If FooUiTest is an interactive UI test. |
| 86 | $ ./interactive_ui_tests --gtest_filter=BrowserInteractiveUiTest.Invoke \ |
| 87 | --test-launcher-interactive --ui=FooUiTest.InvokeUi_default |
| 88 | |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 89 | ### Implementation |
| 90 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 91 | `BrowserUiTest.Invoke` searches for gtests that have "`InvokeUi_`" in their |
| 92 | names, so they can be collected in a list. Providing a `--ui` argument will |
Peter Boström | e2732ef | 2018-02-21 21:53:24 | [diff] [blame] | 93 | invoke that test case in a subprocess. Including `--test-launcher-interactive` |
| 94 | will set up an environment for that subprocess that allows interactivity, e.g., |
| 95 | to take screenshots. The test ends once the UI is dismissed. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 96 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 97 | The `FooUiTest.InvokeUi_default` test case **will still be run in the usual |
| 98 | browser_tests test suite**. Ensure it passes, and isn’t flaky. This will |
| 99 | give your UI some regression test coverage. `ShowAndVerifyUi()` checks to ensure |
| 100 | UI is actually created when it invokes `ShowUi("default")`. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 101 | |
Keren Zhu | 1f7b99da | 2023-10-04 23:47:32 | [diff] [blame] | 102 | `BrowserInteractiveUiTest` is the equivalent of `BrowserUiTest` for |
| 103 | interactive_ui_tests. |
| 104 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 105 | ### BrowserUiTest.Invoke |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 106 | |
| 107 | This is also run in browser_tests but, when run that way, the test case just |
| 108 | lists the registered test harnesses (it does *not* iterate over them). A |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 109 | subprocess is never created unless --ui is passed on the command line. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 110 | |
| 111 | ## Advanced Usage |
| 112 | |
| 113 | If your test harness inherits from a descendant of `InProcessBrowserTest` (one |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 114 | example: [ExtensionBrowserTest]) then the `SupportsTestUi<>` and |
| 115 | `SupportsTestDialog` templates are provided. E.g. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 116 | |
| 117 | ```cpp |
| 118 | class ExtensionInstallDialogViewTestBase : public ExtensionBrowserTest { ... |
| 119 | ``` |
| 120 | |
| 121 | becomes |
| 122 | |
| 123 | ```cpp |
| 124 | class ExtensionInstallDialogViewTestBase : |
| 125 | public SupportsTestDialog<ExtensionBrowserTest> { ... |
| 126 | ``` |
| 127 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 128 | If you need to do any setup before `ShowUi()` is called, or any teardown in the |
| 129 | non-interactive case, you can override the `PreShow()` and `DismissUi() |
| 130 | methods. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 131 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 132 | ### Testing additional UI "styles" |
| 133 | |
| 134 | Add additional test cases, with a different string after "`InvokeUi_`". |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 135 | Example: |
| 136 | |
| 137 | ```cpp |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 138 | IN_PROC_BROWSER_TEST_F(CardUnmaskViewBrowserTest, InvokeUi_expired) { |
| 139 | ShowAndVerifyUi(); |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 140 | } |
| 141 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 142 | IN_PROC_BROWSER_TEST_F(CardUnmaskViewBrowserTest, InvokeUi_valid) { |
| 143 | ShowAndVerifyUi(); |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 144 | } |
| 145 | ``` |
| 146 | |
| 147 | The strings "`expired`" or “`valid`” will be given as arguments to |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 148 | `ShowUi(std::string)`. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 149 | |
| 150 | ## Rationale |
| 151 | |
| 152 | Bug reference: [Issue 654151](http://crbug.com/654151). |
| 153 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 154 | Chrome has a lot of browser UI; often for obscure use-cases and often hard to |
| 155 | invoke. It has traditionally been difficult to be systematic while checking UI |
| 156 | for possible regressions. For example, to investigate changes to shared layout |
| 157 | parameters which are testable only with visual inspection. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 158 | |
| 159 | For Chrome UI review, screenshots need to be taken. Iterating over all the |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 160 | "styles" that UI may appear with is fiddly. E.g. a login or particular web |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 161 | server setup may be required. It’s important to provide a consistent “look” for |
| 162 | UI review (e.g. same test data, same browser size, anchoring position, etc.). |
| 163 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 164 | Some UI lacks tests. Some UI has zero coverage on the bots. UI elements can have |
| 165 | tricky lifetimes and common mistakes are repeated. TestBrowserUi runs simple |
| 166 | "Show UI" regression tests and can be extended to do more. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 167 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 168 | Even discovering the full set of UI present for each platform in Chrome is |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 169 | [difficult](http://crbug.com/686239). |
| 170 | |
| 171 | ### Why browser_tests? |
| 172 | |
| 173 | * `browser_tests` already provides a `browser()->window()` of a consistent |
| 174 | size that can be used as a dialog anchor and to take screenshots for UI |
| 175 | review. |
| 176 | * UI review have requested that screenshots be provided with the entire |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 177 | browser window so that the relative size of the UI element/change under |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 178 | review can be assessed. |
| 179 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 180 | * Some UI already has a test harness with appropriate setup (e.g. test data) |
| 181 | running in browser_tests. |
| 182 | * Supporting `BrowserUiTest` should require minimal setup and minimal |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 183 | ongoing maintenance. |
| 184 | |
| 185 | * An alternative is to maintain a working end-to-end build target executable |
| 186 | to do this, but this has additional costs (and is hard). |
Peter Kasting | c6fd7f2d | 2020-03-10 21:21:08 | [diff] [blame] | 187 | * E.g. setup/teardown of low-level functions |
| 188 | (`InitializeGLOneOffPlatform()`, etc.). |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 189 | |
| 190 | * Why not chrome.exe? |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 191 | * E.g. a scrappy chrome:// page with links to invoke UI would be great! |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 192 | * But... |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 193 | * UI may have test data (e.g. credit card info) which shouldn’t be in |
| 194 | the release build. |
| 195 | * UI may use EmbeddedTestServer. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 196 | * Higher maintenance cost - can’t leverage existing test harnesses. |
| 197 | |
| 198 | ## Future Work |
| 199 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 200 | * Opt in more UI! |
| 201 | * Eventually, all of it. |
| 202 | * A `DialogBrowserTest` for every descendant of `views::DialogDelegate`. |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 203 | |
| 204 | * Automatically generate screenshots (for each platform, in various languages) |
| 205 | * Build upon [CL 2008283002](https://codereview.chromium.org/2008283002/) |
| 206 | |
| 207 | * (maybe) Try removing the subprocess |
| 208 | * Probably requires altering the browser_test suite code directly rather |
| 209 | than just adding a test case as in the current approach |
| 210 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 211 | * An automated test suite for UI |
| 212 | * Test various ways to dismiss or hide UI, especially dialogs |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 213 | * e.g. native close (via taskbar?) |
| 214 | * close parent window (possibly via task bar) |
| 215 | * close parent tab |
| 216 | * switch tabs |
| 217 | * close via `DialogClientView::AcceptWindow` (and `CancelWindow`) |
| 218 | * close via `Widget::Close` |
| 219 | * close via `Widget::CloseNow` |
| 220 | * Drag tab off browser into a new window |
| 221 | * Fullscreen that may create a new window/parent |
| 222 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 223 | * Find obscure workflows for invoking UI that has no test coverage and causes |
| 224 | crashes (e.g. [http://crrev.com/426302](http://crrev.com/426302)) |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 225 | * Supporting window-modal dialogs with a null parent window. |
| 226 | |
| 227 | * Find memory leaks, e.g. [http://crrev.com/432320](http://crrev.com/432320) |
| 228 | * "Fix memory leak for extension uninstall dialog". |
| 229 | |
| 230 | ## Appendix: Sample output |
| 231 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 232 | **$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke** |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 233 | ``` |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 234 | Note: Google Test filter = BrowserUiTest.Invoke |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 235 | [==========] Running 1 test from 1 test case. |
| 236 | [----------] Global test environment set-up. |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 237 | [----------] 1 test from BrowserUiTest |
| 238 | [ RUN ] BrowserUiTest.Invoke |
| 239 | [26879:775:0207/134949.118352:30434675...:INFO:browser_ui_browsertest.cc(46) |
| 240 | Pass one of the following after --ui= |
| 241 | AppInfoDialogBrowserTest.InvokeUi_default |
| 242 | AskGoogleForSuggestionsDialogTest.DISABLED_InvokeUi_default |
| 243 | BluetoothChooserBrowserTest.InvokeUi_ConnectedBubble |
| 244 | BluetoothChooserBrowserTest.InvokeUi_ConnectedModal |
| 245 | /* and many more */ |
| 246 | [ OK ] BrowserUiTest.Invoke (0 ms) |
| 247 | [----------] 1 test from BrowserUiTest (0 ms total) |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 248 | [----------] Global test environment tear-down |
| 249 | [==========] 1 test from 1 test case ran. (1 ms total) |
| 250 | [ PASSED ] 1 test. |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 251 | [1/1] BrowserUiTest.Invoke (334 ms) |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 252 | SUCCESS: all tests passed. |
| 253 | ``` |
| 254 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 255 | **$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke |
| 256 | --ui=CardUnmaskPromptViewBrowserTest.InvokeUi_expired** |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 257 | |
| 258 | ``` |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 259 | Note: Google Test filter = BrowserUiTest.Invoke |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 260 | [==========] Running 1 test from 1 test case. |
| 261 | [----------] Global test environment set-up. |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 262 | [----------] 1 test from BrowserUiTest |
| 263 | [ RUN ] BrowserUiTest.Invoke |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 264 | Note: Google Test filter = CardUnmaskPromptViewBrowserTest.InvokeDefault |
| 265 | [==========] Running 1 test from 1 test case. |
| 266 | [----------] Global test environment set-up. |
| 267 | [----------] 1 test from CardUnmaskPromptViewBrowserTest, where TypeParam = |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 268 | [ RUN ] CardUnmaskPromptViewBrowserTest.InvokeUi_expired |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 269 | /* 7 lines of uninteresting log spam */ |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 270 | [ OK ] CardUnmaskPromptViewBrowserTest.InvokeUi_expired (1324 ms) |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 271 | [----------] 1 test from CardUnmaskPromptViewBrowserTest (1324 ms total) |
| 272 | [----------] Global test environment tear-down |
| 273 | [==========] 1 test from 1 test case ran. (1325 ms total) |
| 274 | [ PASSED ] 1 test. |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 275 | [ OK ] BrowserUiTest.Invoke (1642 ms) |
| 276 | [----------] 1 test from BrowserUiTest (1642 ms total) |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 277 | [----------] Global test environment tear-down |
| 278 | [==========] 1 test from 1 test case ran. (1642 ms total) |
| 279 | [ PASSED ] 1 test. |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 280 | [1/1] BrowserUiTest.Invoke (2111 ms) |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 281 | SUCCESS: all tests passed. |
| 282 | ``` |
| 283 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 284 | **$ ./out/gn_Debug/browser_tests --gtest_filter=BrowserUiTest.Invoke |
Peter Boström | e2732ef | 2018-02-21 21:53:24 | [diff] [blame] | 285 | --ui=CardUnmaskPromptViewBrowserTest.InvokeUi_expired |
| 286 | --test-launcher-interactive** |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 287 | ``` |
| 288 | /* |
| 289 | * Output as above, except the test are not interleaved, and the browser window |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 290 | * should remain open until the UI is dismissed |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 291 | */ |
| 292 | ``` |
| 293 | |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 294 | [chrome/browser/ui/test/test_browser_ui.h]: https://cs.chromium.org/chromium/src/chrome/browser/ui/test/test_browser_ui.h |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 295 | [chrome/browser/ui/test/test_browser_dialog.h]: https://cs.chromium.org/chromium/src/chrome/browser/ui/test/test_browser_dialog.h |
Peter Kasting | cf49b7b79 | 2017-12-18 23:27:45 | [diff] [blame] | 296 | [chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/ui/ask_google_for_suggestions_dialog_browsertest.cc?l=18&q=ShowUi |
| 297 | [chrome/browser/infobars/infobars_browsertest.cc]: https://cs.chromium.org/chromium/src/chrome/browser/infobars/infobars_browsertest.cc?l=134&q=UiBrowserTest |
tapted | f38739a | 2017-02-09 04:34:52 | [diff] [blame] | 298 | [ExtensionBrowserTest]: https://cs.chromium.org/chromium/src/chrome/browser/extensions/extension_browsertest.h?q=extensionbrowsertest&l=40 |