Home | History | Annotate | Download | only in tab_contents
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/debug/debugger.h"
      6 #include "base/memory/scoped_nsobject.h"
      7 #import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
      8 #import "chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.h"
      9 #import "chrome/browser/ui/cocoa/tab_contents/sad_tab_view.h"
     10 #include "chrome/test/testing_profile.h"
     11 #include "content/browser/renderer_host/test_render_view_host.h"
     12 #include "content/browser/tab_contents/test_tab_contents.h"
     13 
     14 @interface SadTabView (ExposedForTesting)
     15 // Implementation is below.
     16 - (NSButton*)linkButton;
     17 @end
     18 
     19 @implementation SadTabView (ExposedForTesting)
     20 - (NSButton*)linkButton {
     21   return linkButton_;
     22 }
     23 @end
     24 
     25 namespace {
     26 
     27 class SadTabControllerTest : public RenderViewHostTestHarness {
     28  public:
     29   SadTabControllerTest() : test_window_(nil) {
     30     link_clicked_ = false;
     31   }
     32 
     33   virtual void SetUp() {
     34     RenderViewHostTestHarness::SetUp();
     35     // Inherting from RenderViewHostTestHarness means we can't inherit from
     36     // from CocoaTest, so do a bootstrap and create test window.
     37     CocoaTest::BootstrapCocoa();
     38     test_window_ = [[CocoaTestHelperWindow alloc] init];
     39     if (base::debug::BeingDebugged()) {
     40       [test_window_ orderFront:nil];
     41     } else {
     42       [test_window_ orderBack:nil];
     43     }
     44   }
     45 
     46   virtual void TearDown() {
     47     [test_window_ close];
     48     test_window_ = nil;
     49     RenderViewHostTestHarness::TearDown();
     50   }
     51 
     52   // Creates the controller and adds its view to contents, caller has ownership.
     53   SadTabController* CreateController() {
     54     NSView* contentView = [test_window_ contentView];
     55     SadTabController* controller =
     56         [[SadTabController alloc] initWithTabContents:contents()
     57                                             superview:contentView];
     58     EXPECT_TRUE(controller);
     59     NSView* view = [controller view];
     60     EXPECT_TRUE(view);
     61 
     62     return controller;
     63   }
     64 
     65   NSButton* GetLinkButton(SadTabController* controller) {
     66     SadTabView* view = static_cast<SadTabView*>([controller view]);
     67     return ([view linkButton]);
     68   }
     69 
     70   static bool link_clicked_;
     71   CocoaTestHelperWindow* test_window_;
     72 };
     73 
     74 // static
     75 bool SadTabControllerTest::link_clicked_;
     76 
     77 TEST_F(SadTabControllerTest, WithTabContents) {
     78   scoped_nsobject<SadTabController> controller(CreateController());
     79   EXPECT_TRUE(controller);
     80   NSButton* link = GetLinkButton(controller);
     81   EXPECT_TRUE(link);
     82 }
     83 
     84 TEST_F(SadTabControllerTest, WithoutTabContents) {
     85   DeleteContents();
     86   scoped_nsobject<SadTabController> controller(CreateController());
     87   EXPECT_TRUE(controller);
     88   NSButton* link = GetLinkButton(controller);
     89   EXPECT_FALSE(link);
     90 }
     91 
     92 TEST_F(SadTabControllerTest, ClickOnLink) {
     93   scoped_nsobject<SadTabController> controller(CreateController());
     94   NSButton* link = GetLinkButton(controller);
     95   EXPECT_TRUE(link);
     96   EXPECT_FALSE(link_clicked_);
     97   [link performClick:link];
     98   EXPECT_TRUE(link_clicked_);
     99 }
    100 
    101 }  // namespace
    102 
    103 @implementation NSApplication (SadTabControllerUnitTest)
    104 // Add handler for the openLearnMoreAboutCrashLink: action to NSApp for testing
    105 // purposes. Normally this would be sent up the responder tree correctly, but
    106 // since tests run in the background, key window and main window are never set
    107 // on NSApplication. Adding it to NSApplication directly removes the need for
    108 // worrying about what the current window with focus is.
    109 - (void)openLearnMoreAboutCrashLink:(id)sender {
    110   SadTabControllerTest::link_clicked_ = true;
    111 }
    112 
    113 @end
    114