blob: 2c60503c8d8b570827ed82da4bc59ad8b1e2a34d [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.h"
#include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
#include "chrome/browser/ui/omnibox/omnibox_edit_controller.h"
#include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
#include "chrome/browser/ui/omnibox/omnibox_popup_view.h"
#include "chrome/browser/ui/toolbar/toolbar_model_delegate.h"
#include "chrome/browser/ui/toolbar/toolbar_model_impl.h"
#include "chrome/test/base/testing_profile.h"
#include "testing/platform_test.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/rect.h"
namespace {
class MockOmniboxEditModel : public OmniboxEditModel {
public:
MockOmniboxEditModel(OmniboxView* view,
OmniboxEditController* controller,
Profile* profile)
: OmniboxEditModel(view, controller, profile),
up_or_down_count_(0) {
}
virtual void OnUpOrDownKeyPressed(int count) OVERRIDE {
up_or_down_count_ = count;
}
int up_or_down_count() const { return up_or_down_count_; }
void set_up_or_down_count(int count) {
up_or_down_count_ = count;
}
private:
int up_or_down_count_;
DISALLOW_COPY_AND_ASSIGN(MockOmniboxEditModel);
};
class MockOmniboxPopupView : public OmniboxPopupView {
public:
MockOmniboxPopupView() : is_open_(false) {}
virtual ~MockOmniboxPopupView() {}
// Overridden from OmniboxPopupView:
virtual bool IsOpen() const OVERRIDE { return is_open_; }
virtual void InvalidateLine(size_t line) OVERRIDE {}
virtual void UpdatePopupAppearance() OVERRIDE {}
virtual gfx::Rect GetTargetBounds() OVERRIDE { return gfx::Rect(); }
virtual void PaintUpdatesNow() OVERRIDE {}
virtual void OnDragCanceled() OVERRIDE {}
void set_is_open(bool is_open) { is_open_ = is_open; }
private:
bool is_open_;
DISALLOW_COPY_AND_ASSIGN(MockOmniboxPopupView);
};
class TestingToolbarModelDelegate : public ToolbarModelDelegate {
public:
TestingToolbarModelDelegate() {}
virtual ~TestingToolbarModelDelegate() {}
// Overridden from ToolbarModelDelegate:
virtual content::WebContents* GetActiveWebContents() const OVERRIDE {
return NULL;
}
private:
DISALLOW_COPY_AND_ASSIGN(TestingToolbarModelDelegate);
};
class TestingOmniboxEditController : public OmniboxEditController {
public:
explicit TestingOmniboxEditController(ToolbarModel* toolbar_model)
: OmniboxEditController(NULL),
toolbar_model_(toolbar_model) {
}
virtual ~TestingOmniboxEditController() {}
// Overridden from OmniboxEditController:
virtual void Update(const content::WebContents* contents) OVERRIDE {}
virtual void OnChanged() OVERRIDE {}
virtual void OnSetFocus() OVERRIDE {}
virtual InstantController* GetInstant() OVERRIDE { return NULL; }
virtual content::WebContents* GetWebContents() OVERRIDE { return NULL; }
virtual ToolbarModel* GetToolbarModel() OVERRIDE { return toolbar_model_; }
virtual const ToolbarModel* GetToolbarModel() const OVERRIDE {
return toolbar_model_;
}
private:
ToolbarModel* toolbar_model_;
DISALLOW_COPY_AND_ASSIGN(TestingOmniboxEditController);
};
} // namespace
class OmniboxViewMacTest : public CocoaProfileTest {
public:
void SetModel(OmniboxViewMac* view, OmniboxEditModel* model) {
view->model_.reset(model);
}
};
TEST_F(OmniboxViewMacTest, GetFieldFont) {
EXPECT_TRUE(OmniboxViewMac::GetFieldFont());
}
TEST_F(OmniboxViewMacTest, TabToAutocomplete) {
OmniboxViewMac view(NULL, profile(), NULL, NULL);
// This is deleted by the omnibox view.
MockOmniboxEditModel* model =
new MockOmniboxEditModel(&view, NULL, profile());
SetModel(&view, model);
MockOmniboxPopupView popup_view;
OmniboxPopupModel popup_model(&popup_view, model);
// With popup closed verify that tab doesn't autocomplete.
popup_view.set_is_open(false);
view.OnDoCommandBySelector(@selector(insertTab:));
EXPECT_EQ(0, model->up_or_down_count());
view.OnDoCommandBySelector(@selector(insertBacktab:));
EXPECT_EQ(0, model->up_or_down_count());
// With popup open verify that tab does autocomplete.
popup_view.set_is_open(true);
view.OnDoCommandBySelector(@selector(insertTab:));
EXPECT_EQ(1, model->up_or_down_count());
view.OnDoCommandBySelector(@selector(insertBacktab:));
EXPECT_EQ(-1, model->up_or_down_count());
}
TEST_F(OmniboxViewMacTest, SetGrayTextAutocompletion) {
const NSRect frame = NSMakeRect(0, 0, 50, 30);
base::scoped_nsobject<AutocompleteTextField> field(
[[AutocompleteTextField alloc] initWithFrame:frame]);
TestingToolbarModelDelegate delegate;
ToolbarModelImpl toolbar_model(&delegate);
TestingOmniboxEditController controller(&toolbar_model);
OmniboxViewMac view(&controller, profile(), NULL, field.get());
// This is deleted by the omnibox view.
MockOmniboxEditModel* model =
new MockOmniboxEditModel(&view, &controller, profile());
SetModel(&view, model);
MockOmniboxPopupView popup_view;
OmniboxPopupModel popup_model(&popup_view, model);
view.SetUserText(ASCIIToUTF16("Alfred"));
EXPECT_EQ("Alfred", UTF16ToUTF8(view.GetText()));
view.SetGrayTextAutocompletion(ASCIIToUTF16(" Hitchcock"));
EXPECT_EQ("Alfred", UTF16ToUTF8(view.GetText()));
EXPECT_EQ(" Hitchcock", UTF16ToUTF8(view.GetGrayTextAutocompletion()));
view.SetUserText(base::string16());
EXPECT_EQ(base::string16(), view.GetText());
EXPECT_EQ(base::string16(), view.GetGrayTextAutocompletion());
}
TEST_F(OmniboxViewMacTest, UpDownArrow) {
OmniboxViewMac view(NULL, profile(), NULL, NULL);
// This is deleted by the omnibox view.
MockOmniboxEditModel* model =
new MockOmniboxEditModel(&view, NULL, profile());
SetModel(&view, model);
MockOmniboxPopupView popup_view;
OmniboxPopupModel popup_model(&popup_view, model);
// With popup closed verify that pressing up and down arrow works.
popup_view.set_is_open(false);
model->set_up_or_down_count(0);
view.OnDoCommandBySelector(@selector(moveDown:));
EXPECT_EQ(1, model->up_or_down_count());
model->set_up_or_down_count(0);
view.OnDoCommandBySelector(@selector(moveUp:));
EXPECT_EQ(-1, model->up_or_down_count());
// With popup open verify that pressing up and down arrow works.
popup_view.set_is_open(true);
model->set_up_or_down_count(0);
view.OnDoCommandBySelector(@selector(moveDown:));
EXPECT_EQ(1, model->up_or_down_count());
model->set_up_or_down_count(0);
view.OnDoCommandBySelector(@selector(moveUp:));
EXPECT_EQ(-1, model->up_or_down_count());
}