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