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

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

Issue 2215063002: Fix Print Preview Alt + Left Arrow breakage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Two possible tests to fix mac flakes Created 4 years, 4 months 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
OLDNEW
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/printing/print_preview_dialog_controller.h" 5 #include "chrome/browser/printing/print_preview_dialog_controller.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "chrome/browser/printing/print_preview_test.h" 9 #include "chrome/browser/printing/print_preview_test.h"
10 #include "chrome/browser/printing/print_view_manager.h" 10 #include "chrome/browser/printing/print_view_manager.h"
11 #include "chrome/browser/ui/browser_commands.h" 11 #include "chrome/browser/ui/browser_commands.h"
12 #include "chrome/browser/ui/browser_finder.h" 12 #include "chrome/browser/ui/browser_finder.h"
13 #include "chrome/browser/ui/tabs/tab_strip_model.h" 13 #include "chrome/browser/ui/tabs/tab_strip_model.h"
14 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" 14 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
15 #include "content/public/browser/navigation_controller.h"
15 #include "content/public/browser/navigation_details.h" 16 #include "content/public/browser/navigation_details.h"
17 #include "content/public/browser/navigation_entry.h"
16 #include "content/public/browser/web_contents_delegate.h" 18 #include "content/public/browser/web_contents_delegate.h"
19 #include "content/public/browser/web_contents_observer.h"
17 #include "content/public/common/url_constants.h" 20 #include "content/public/common/url_constants.h"
18 #include "content/public/test/web_contents_tester.h" 21 #include "content/public/test/web_contents_tester.h"
19 22
20 using content::WebContents; 23 using content::WebContents;
24 using content::WebContentsObserver;
21 25
22 namespace { 26 namespace {
23 // content::WebContentsDelegate destructor is protected: subclass for testing. 27 // content::WebContentsDelegate destructor is protected: subclass for testing.
24 class TestWebContentsDelegate : public content::WebContentsDelegate {}; 28 class TestWebContentsDelegate : public content::WebContentsDelegate {};
29
30 class PrintPreviewDialogDestroyedObserver : public WebContentsObserver {
31 public:
32 explicit PrintPreviewDialogDestroyedObserver(WebContents* dialog)
33 : WebContentsObserver(dialog),
34 dialog_destroyed_(false) {
35 }
36 ~PrintPreviewDialogDestroyedObserver() override {}
37
38 bool dialog_destroyed() const { return dialog_destroyed_; }
39
40 private:
41 // content::WebContentsObserver implementation.
42 void WebContentsDestroyed() override { dialog_destroyed_ = true; }
43
44 bool dialog_destroyed_;
45
46 DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogDestroyedObserver);
47 };
48
49 class PrintPreviewDialogControllerForTest :
50 public printing::PrintPreviewDialogController {
51 public:
52 PrintPreviewDialogControllerForTest() {
53 next_dialog_ = 1;
Lei Zhang 2016/08/17 21:27:55 Use the initializer list
54 }
55
56 WebContents* GetOrCreatePreviewDialog(WebContents * initiator) override {
57 DCHECK(initiator);
58
59 // Get the print preview dialog for |initiator|.
60 WebContents* preview_dialog = GetPrintPreviewForContents(initiator);
61 if (!preview_dialog) {
Lei Zhang 2016/08/17 21:27:55 I usually like to write: if (foo) { DoFoo(); } e
62 // Create a fake dialog and put it in the map, then observe initiator
63 preview_dialog = reinterpret_cast<WebContents*>(next_dialog_++);
64 preview_dialog_map_[preview_dialog] = initiator;
65 AddObservers(initiator);
66 } else {
67 // Show the initiator holding the existing preview dialog.
68 initiator->GetDelegate()->ActivateContents(initiator);
69 }
70 return preview_dialog;
71 }
72
73 private:
74 ~PrintPreviewDialogControllerForTest() override {}
75
76 // Override so that the controller doesn't try to close a fake web contents.
77 void RemoveInitiator(WebContents* initiator) override {
78 WebContents* preview_dialog = GetPrintPreviewForContents(initiator);
79 DCHECK(preview_dialog);
80 preview_dialog_map_[preview_dialog] = nullptr;
81 RemoveObservers(initiator);
82 printing::PrintViewManager::FromWebContents(initiator)->PrintPreviewDone();
83 }
84
85 DISALLOW_COPY_AND_ASSIGN(PrintPreviewDialogControllerForTest);
86 int next_dialog_;
87 };
88
89
90
25 } // namespace 91 } // namespace
26 92
27 namespace printing { 93 namespace printing {
28 94
29 using PrintPreviewDialogControllerUnitTest = PrintPreviewTest; 95 using PrintPreviewDialogControllerUnitTest = PrintPreviewTest;
30 96
31 // Create/Get a preview dialog for initiator. 97 // Create/Get a preview dialog for initiator.
32 TEST_F(PrintPreviewDialogControllerUnitTest, GetOrCreatePreviewDialog) { 98 TEST_F(PrintPreviewDialogControllerUnitTest, GetOrCreatePreviewDialog) {
33 // Lets start with one window with one tab. 99 // Lets start with one window with one tab.
34 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 100 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 WebContents* new_preview_dialog = 228 WebContents* new_preview_dialog =
163 dialog_controller->GetOrCreatePreviewDialog(initiator); 229 dialog_controller->GetOrCreatePreviewDialog(initiator);
164 230
165 // New print preview dialog is a constrained window, so the number of tabs is 231 // New print preview dialog is a constrained window, so the number of tabs is
166 // still 1. 232 // still 1.
167 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 233 EXPECT_EQ(1, browser()->tab_strip_model()->count());
168 // Verify a new print preview dialog has been created. 234 // Verify a new print preview dialog has been created.
169 EXPECT_NE(new_preview_dialog, preview_dialog); 235 EXPECT_NE(new_preview_dialog, preview_dialog);
170 } 236 }
171 237
238 // Test that print preview dialogs close on navigation to new pages
239 // and when navigating to old pages via fwd/back, but that auto navigation
240 // (typed + address bar) to an existing page as occurs in gmail does not cause
241 // the dialogs to close.
242 TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigation) {
Lei Zhang 2016/08/17 21:27:55 I prefer this version mainly because we don't have
243 // Two similar URLs (same webpage, different URL fragments)
244 GURL tiger_barb("https://www.google.com/#q=tiger+barb");
245 GURL tiger("https://www.google.com/#q=tiger");
246
247 // Set up by opening a new tab and getting web contents
248 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
249 EXPECT_EQ(0, browser()->tab_strip_model()->count());
250 chrome::NewTab(browser());
251 EXPECT_EQ(1, browser()->tab_strip_model()->count());
252 WebContents* web_contents =
253 browser()->tab_strip_model()->GetActiveWebContents();
254 ASSERT_TRUE(web_contents);
255 content::NavigationController& nav_controller = web_contents->GetController();
256
257 // Navigate to first page
258 nav_controller.LoadURL(tiger, content::Referrer(),
259 ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK),
260 std::string());
261 CommitPendingLoad(&nav_controller);
262 EXPECT_EQ(tiger, web_contents->GetLastCommittedURL());
263
264 // Get the preview dialog
265 PrintPreviewDialogController* dialog_controller =
266 PrintPreviewDialogController::GetInstance();
267 ASSERT_TRUE(dialog_controller);
268 WebContents* tiger_preview_dialog =
269 dialog_controller->GetOrCreatePreviewDialog(web_contents);
270 PrintViewManager* manager = PrintViewManager::FromWebContents(web_contents);
271 manager->PrintPreviewNow(false);
272
273 // New print preview dialog is a constrained window, so the number of tabs is
274 // still 1.
275 EXPECT_EQ(1, browser()->tab_strip_model()->count());
276 EXPECT_NE(web_contents, tiger_preview_dialog);
277 PrintPreviewDialogDestroyedObserver tiger_destroyed(tiger_preview_dialog);
278
279 // Navigate via link to a similar page.
280 nav_controller.LoadURL(tiger_barb, content::Referrer(),
281 ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK),
282 std::string());
283 CommitPendingLoad(&nav_controller);
284
285 // Check navigation was successful
286 EXPECT_EQ(tiger_barb, web_contents->GetLastCommittedURL());
287
288 // Print preview now should return true as the navigation should have closed
289 // |tiger_preview_dialog| and the previous dialog should have closed.
290 EXPECT_TRUE(manager->PrintPreviewNow(false));
291 WebContents* tiger_barb_preview_dialog =
292 dialog_controller->GetOrCreatePreviewDialog(web_contents);
293 ASSERT_TRUE(tiger_barb_preview_dialog);
294
295 // Check a new dialog was created - either the pointers should be different or
296 // the previous web contents must have been destroyed.
297 EXPECT_TRUE(tiger_destroyed.dialog_destroyed() ||
298 tiger_barb_preview_dialog != tiger_preview_dialog);
299 EXPECT_NE(tiger_barb_preview_dialog, web_contents);
300 PrintPreviewDialogDestroyedObserver tiger_barb_destroyed(
301 tiger_barb_preview_dialog);
302
303 // Now this returns false as |tiger_barb_preview_dialog| is open.
304 EXPECT_FALSE(manager->PrintPreviewNow(false));
305
306 // Navigate with back button or ALT+LEFT ARROW to a similar page.
307 nav_controller.GoBack();
308 CommitPendingLoad(&nav_controller);
309 EXPECT_EQ(tiger, web_contents->GetLastCommittedURL());
310 EXPECT_TRUE(manager->PrintPreviewNow(false));
311
312 // Get new dialog
313 WebContents* tiger_preview_dialog_2 =
314 dialog_controller->GetOrCreatePreviewDialog(web_contents);
315 ASSERT_TRUE(tiger_preview_dialog_2);
316
317 // Verify this is a new dialog.
318 EXPECT_TRUE(tiger_barb_destroyed.dialog_destroyed() ||
319 tiger_barb_preview_dialog != tiger_preview_dialog_2);
320 EXPECT_NE(tiger_preview_dialog_2, web_contents);
321 PrintPreviewDialogDestroyedObserver tiger_2_destroyed(
322 tiger_preview_dialog_2);
323
324 // Try to simulate Gmail navigation: Navigate to an existing page (via
325 // Forward) but modify the navigation type while pending to look like an
326 // address bar + typed transition (like Gmail auto navigation)
327 nav_controller.GoForward();
328 nav_controller.GetPendingEntry()->SetTransitionType(ui::PageTransitionFromInt(
329 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR));
330 CommitPendingLoad(&nav_controller);
331
332 // Navigation successful
333 EXPECT_EQ(tiger_barb, web_contents->GetLastCommittedURL());
334
335 // Print preview should not have changed due to this navigation type so print
336 // preview now should return false, dialog is still alive, and the dialog
337 // returned by GetOrCreatePreviewDialog should be the same as the earlier
338 // dialog.
339 EXPECT_FALSE(manager->PrintPreviewNow(false));
340 EXPECT_FALSE(tiger_2_destroyed.dialog_destroyed());
341 WebContents* tiger_preview_dialog_2b =
342 dialog_controller->GetOrCreatePreviewDialog(web_contents);
343 ASSERT_TRUE(tiger_preview_dialog_2b);
344 EXPECT_EQ(tiger_preview_dialog_2b, tiger_preview_dialog_2);
345 EXPECT_NE(tiger_preview_dialog_2b, web_contents);
346 }
347
348 // Test that print preview dialogs close on navigation to new pages
349 // and when navigating to old pages via fwd/back, but that auto navigation
350 // (typed + address bar) to an existing page as occurs in gmail does not cause
351 // the dialogs to close.
352 TEST_F(PrintPreviewDialogControllerUnitTest, CloseDialogOnNavigationV2) {
353 // Two similar URLs (same webpage, different URL fragments)
354 GURL tiger_barb("https://www.google.com/#q=tiger+barb");
355 GURL tiger("https://www.google.com/#q=tiger");
356
357 // Set up by opening a new tab and getting web contents
358 EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
359 EXPECT_EQ(0, browser()->tab_strip_model()->count());
360 chrome::NewTab(browser());
361 EXPECT_EQ(1, browser()->tab_strip_model()->count());
362 WebContents* web_contents =
363 browser()->tab_strip_model()->GetActiveWebContents();
364 ASSERT_TRUE(web_contents);
365 content::NavigationController& nav_controller = web_contents->GetController();
366
367 // Navigate to first page
368 nav_controller.LoadURL(tiger, content::Referrer(),
369 ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK),
370 std::string());
371 CommitPendingLoad(&nav_controller);
372 EXPECT_EQ(tiger, web_contents->GetLastCommittedURL());
373
374 // Get the preview dialog
375 PrintPreviewDialogControllerForTest* dialog_controller =
376 new PrintPreviewDialogControllerForTest;
377 ASSERT_TRUE(dialog_controller);
378 PrintViewManager* manager = PrintViewManager::FromWebContents(web_contents);
379 WebContents* tiger_preview_dialog =
380 dialog_controller->GetOrCreatePreviewDialog(web_contents);
381 manager->PrintPreviewNow(false);
382
383 // New print preview dialog is a constrained window, so the number of tabs is
384 // still 1.
385 EXPECT_EQ(1, browser()->tab_strip_model()->count());
386 EXPECT_NE(web_contents, tiger_preview_dialog);
387
388 // Navigate via link to a similar page.
389 nav_controller.LoadURL(tiger_barb, content::Referrer(),
390 ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK),
391 std::string());
392 CommitPendingLoad(&nav_controller);
393
394 // Check navigation was successful
395 EXPECT_EQ(tiger_barb, web_contents->GetLastCommittedURL());
396
397 // Print preview now should return true as the navigation should have closed
398 // |tiger_preview_dialog|
399 EXPECT_TRUE(manager->PrintPreviewNow(false));
400 WebContents* tiger_barb_preview_dialog =
401 dialog_controller->GetOrCreatePreviewDialog(web_contents);
402 ASSERT_TRUE(tiger_barb_preview_dialog);
403
404 // Check a new dialog was created - pointers should be different.
405 EXPECT_TRUE(tiger_barb_preview_dialog != tiger_preview_dialog);
406 EXPECT_NE(tiger_barb_preview_dialog, web_contents);
407
408 // Now this returns false as |tiger_barb_preview_dialog| is open.
409 EXPECT_FALSE(manager->PrintPreviewNow(false));
410
411 // Navigate with back button or ALT+LEFT ARROW to a similar page.
412 nav_controller.GoBack();
413 CommitPendingLoad(&nav_controller);
414 EXPECT_EQ(tiger, web_contents->GetLastCommittedURL());
415 EXPECT_TRUE(manager->PrintPreviewNow(false));
416
417 // Get new dialog
418 WebContents* tiger_preview_dialog_2 =
419 dialog_controller->GetOrCreatePreviewDialog(web_contents);
420 ASSERT_TRUE(tiger_preview_dialog_2);
421
422 // Verify this is a new dialog.
423 EXPECT_TRUE(tiger_barb_preview_dialog != tiger_preview_dialog_2);
424 EXPECT_NE(tiger_preview_dialog_2, web_contents);
425
426 // Try to simulate Gmail navigation: Navigate to an existing page (via
427 // Forward) but modify the navigation type while pending to look like an
428 // address bar + typed transition (like Gmail auto navigation)
429 nav_controller.GoForward();
430 nav_controller.GetPendingEntry()->SetTransitionType(ui::PageTransitionFromInt(
431 ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR));
432 CommitPendingLoad(&nav_controller);
433
434 // Navigation successful
435 EXPECT_EQ(tiger_barb, web_contents->GetLastCommittedURL());
436
437 // Print preview should not have changed due to this navigation type so print
438 // preview now should return false, and the dialog returned by
439 // GetOrCreatePreviewDialog should be the same as the earlier dialog.
440 EXPECT_FALSE(manager->PrintPreviewNow(false));
441 WebContents* tiger_preview_dialog_2b =
442 dialog_controller->GetOrCreatePreviewDialog(web_contents);
443 ASSERT_TRUE(tiger_preview_dialog_2b);
444 EXPECT_EQ(tiger_preview_dialog_2b, tiger_preview_dialog_2);
445 EXPECT_NE(tiger_preview_dialog_2b, web_contents);
446 }
172 } // namespace printing 447 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698