1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/utf_string_conversions.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_edit.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_edit_view.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/test/testing_browser_process.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestingAutocompleteEditView : public AutocompleteEditView {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingAutocompleteEditView() {}
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual AutocompleteEditModel* model() { return NULL; }
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual const AutocompleteEditModel* model() const { return NULL; }
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SaveStateToTab(TabContents* tab) {}
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Update(const TabContents* tab_for_state_restoring) {}
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OpenURL(const GURL& url,
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       WindowOpenDisposition disposition,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       PageTransition::Type transition,
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const GURL& alternate_nav_url,
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       size_t selected_line,
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const string16& keyword) {}
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetText() const { return string16(); }
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsEditingOrEmpty() const { return true; }
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int GetIcon() const { return 0; }
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetUserText(const string16& text) {}
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetUserText(const string16& text,
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           const string16& display_text,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           bool update_popup) {}
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetWindowTextAndCaretPos(const string16& text,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        size_t caret_pos) {}
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetForcedQuery() {}
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsSelectAll() { return false; }
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual bool DeleteAtEndPressed() { return false; }
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void GetSelectionBounds(string16::size_type* start,
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  string16::size_type* end) {}
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SelectAll(bool reversed) {}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void RevertAll() {}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void UpdatePopup() {}
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ClosePopup() {}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetFocus() {}
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnTemporaryTextMaybeChanged(const string16& display_text,
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           bool save_original_selection) {}
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnInlineAutocompleteTextMaybeChanged(
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& display_text, size_t user_text_length) {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnRevertTemporaryText() {}
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnBeforePossibleChange() {}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool OnAfterPossibleChange() { return false; }
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual gfx::NativeView GetNativeView() const { return 0; }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual CommandUpdater* GetCommandUpdater() { return NULL; }
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void SetInstantSuggestion(const string16& input,
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    bool animate_to_complete) {}
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual string16 GetInstantSuggestion() const { return string16(); }
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual int TextWidth() const { return 0; }
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool IsImeComposing() const { return false; }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#if defined(TOOLKIT_VIEWS)
663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual views::View* AddToView(views::View* parent) { return NULL; }
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual int OnPerformDrop(const views::DropTargetEvent& event) { return 0; }
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestingAutocompleteEditView);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestingAutocompleteEditController : public AutocompleteEditController {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingAutocompleteEditController() {}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnAutocompleteAccept(const GURL& url,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    WindowOpenDisposition disposition,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    PageTransition::Type transition,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const GURL& alternate_nav_url) OVERRIDE {}
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnChanged() OVERRIDE {}
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnSelectionBoundsChanged() OVERRIDE {}
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnInputInProgress(bool in_progress) OVERRIDE {}
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnKillFocus() OVERRIDE {}
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnSetFocus() OVERRIDE {}
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual SkBitmap GetFavicon() const OVERRIDE { return SkBitmap(); }
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual string16 GetTitle() const OVERRIDE { return string16(); }
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual InstantController* GetInstant() OVERRIDE { return NULL; }
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual TabContentsWrapper* GetTabContentsWrapper() const OVERRIDE {
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return NULL;
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TestingAutocompleteEditController);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef testing::Test AutocompleteEditTest;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests various permutations of AutocompleteModel::AdjustTextForCopy.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(AutocompleteEditTest, AdjustTextForCopy) {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Data {
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* perm_text;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const int sel_start;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const bool is_all_selected;
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* input;
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* expected_output;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const bool write_url;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const char* expected_url;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } input[] = {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Test that http:// is inserted if all text is selected.
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/c", 0, true, "a.b/c", "http://a.b/c", true, "http://a.b/c" },
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Test that http:// is inserted if the host is selected.
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/c", 0, false, "a.b/", "http://a.b/", true, "http://a.b/" },
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that http:// is inserted if the path is modified.
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/c", 0, false, "a.b/d", "http://a.b/d", true, "http://a.b/d" },
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that http:// isn't inserted if the host is modified.
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/c", 0, false, "a.c/", "a.c/", false, "" },
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that http:// isn't inserted if the start of the selection is 1.
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/c", 1, false, "a.b/", "a.b/", false, "" },
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that http:// isn't inserted if a portion of the host is selected.
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.com/", 0, false, "a.co", "a.co", false, "" },
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that http:// isn't inserted for an https url after the user nukes
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // https.
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "https://a.com/", 0, false, "a.com/", "a.com/", false, "" },
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that http:// isn't inserted if the user adds to the host.
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/", 0, false, "a.bc/", "a.bc/", false, "" },
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Tests that we don't get double http if the user manually inserts http.
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    { "a.b/", 0, false, "http://a.b/", "http://a.b/", true, "http://a.b/" },
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ScopedTestingBrowserProcess browser_process;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingAutocompleteEditView view;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingAutocompleteEditController controller;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile profile;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteEditModel model(&view, &controller, &profile);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(input); ++i) {
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    model.UpdatePermanentText(ASCIIToUTF16(input[i].perm_text));
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    string16 result = ASCIIToUTF16(input[i].input);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool write_url;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    model.AdjustTextForCopy(input[i].sel_start, input[i].is_all_selected,
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            &result, &url, &write_url);
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16(input[i].expected_output), result) << "@: " << i;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input[i].write_url, write_url) << " @" << i;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (write_url)
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_EQ(input[i].expected_url, url.spec()) << " @" << i;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
160