blob: 41185ec34ecb8868afb57b9d05b63dda1c8924db [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.
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/string16.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/autocomplete_history_manager.h"
#include "chrome/browser/autofill/test_autofill_external_delegate.h"
#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
#include "chrome/browser/webdata/web_data_service.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "content/test/test_browser_thread.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/rect.h"
#include "webkit/forms/form_data.h"
using content::BrowserThread;
using content::WebContents;
using testing::_;
using webkit::forms::FormData;
class MockWebDataService : public WebDataService {
public:
MOCK_METHOD1(AddFormFields,
void(const std::vector<webkit::forms::FormField>&)); // NOLINT
protected:
virtual ~MockWebDataService() {}
};
class AutocompleteHistoryManagerTest : public ChromeRenderViewHostTestHarness {
protected:
AutocompleteHistoryManagerTest()
: ui_thread_(BrowserThread::UI, MessageLoopForUI::current()),
db_thread_(BrowserThread::DB) {
}
virtual void SetUp() {
ChromeRenderViewHostTestHarness::SetUp();
web_data_service_ = new MockWebDataService();
autocomplete_manager_.reset(new AutocompleteHistoryManager(
contents(), &profile_, web_data_service_));
}
content::TestBrowserThread ui_thread_;
content::TestBrowserThread db_thread_;
TestingProfile profile_;
scoped_refptr<MockWebDataService> web_data_service_;
scoped_ptr<AutocompleteHistoryManager> autocomplete_manager_;
};
// Tests that credit card numbers are not sent to the WebDatabase to be saved.
TEST_F(AutocompleteHistoryManagerTest, CreditCardNumberValue) {
FormData form;
form.name = ASCIIToUTF16("MyForm");
form.method = ASCIIToUTF16("POST");
form.origin = GURL("http://myform.com/form.html");
form.action = GURL("http://myform.com/submit.html");
form.user_submitted = true;
// Valid Visa credit card number pulled from the paypal help site.
webkit::forms::FormField valid_cc;
valid_cc.label = ASCIIToUTF16("Credit Card");
valid_cc.name = ASCIIToUTF16("ccnum");
valid_cc.value = ASCIIToUTF16("4012888888881881");
valid_cc.form_control_type = ASCIIToUTF16("text");
form.fields.push_back(valid_cc);
EXPECT_CALL(*web_data_service_, AddFormFields(_)).Times(0);
autocomplete_manager_->OnFormSubmitted(form);
}
// Contrary test to AutocompleteHistoryManagerTest.CreditCardNumberValue. The
// value being submitted is not a valid credit card number, so it will be sent
// to the WebDatabase to be saved.
TEST_F(AutocompleteHistoryManagerTest, NonCreditCardNumberValue) {
FormData form;
form.name = ASCIIToUTF16("MyForm");
form.method = ASCIIToUTF16("POST");
form.origin = GURL("http://myform.com/form.html");
form.action = GURL("http://myform.com/submit.html");
form.user_submitted = true;
// Invalid credit card number.
webkit::forms::FormField invalid_cc;
invalid_cc.label = ASCIIToUTF16("Credit Card");
invalid_cc.name = ASCIIToUTF16("ccnum");
invalid_cc.value = ASCIIToUTF16("4580123456789012");
invalid_cc.form_control_type = ASCIIToUTF16("text");
form.fields.push_back(invalid_cc);
EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)).Times(1);
autocomplete_manager_->OnFormSubmitted(form);
}
// Tests that SSNs are not sent to the WebDatabase to be saved.
TEST_F(AutocompleteHistoryManagerTest, SSNValue) {
FormData form;
form.name = ASCIIToUTF16("MyForm");
form.method = ASCIIToUTF16("POST");
form.origin = GURL("http://myform.com/form.html");
form.action = GURL("http://myform.com/submit.html");
form.user_submitted = true;
webkit::forms::FormField ssn;
ssn.label = ASCIIToUTF16("Social Security Number");
ssn.name = ASCIIToUTF16("ssn");
ssn.value = ASCIIToUTF16("078-05-1120");
ssn.form_control_type = ASCIIToUTF16("text");
form.fields.push_back(ssn);
EXPECT_CALL(*web_data_service_, AddFormFields(_)).Times(0);
autocomplete_manager_->OnFormSubmitted(form);
}
// Verify that autocomplete text is saved for search fields.
TEST_F(AutocompleteHistoryManagerTest, SearchField) {
FormData form;
form.name = ASCIIToUTF16("MyForm");
form.method = ASCIIToUTF16("POST");
form.origin = GURL("http://myform.com/form.html");
form.action = GURL("http://myform.com/submit.html");
form.user_submitted = true;
// Search field.
webkit::forms::FormField search_field;
search_field.label = ASCIIToUTF16("Search");
search_field.name = ASCIIToUTF16("search");
search_field.value = ASCIIToUTF16("my favorite query");
search_field.form_control_type = ASCIIToUTF16("search");
form.fields.push_back(search_field);
EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)).Times(1);
autocomplete_manager_->OnFormSubmitted(form);
}
namespace {
class MockAutofillExternalDelegate : public TestAutofillExternalDelegate {
public:
explicit MockAutofillExternalDelegate(TabContentsWrapper* wrapper)
: TestAutofillExternalDelegate(wrapper, NULL) {}
virtual ~MockAutofillExternalDelegate() {}
virtual void ApplyAutofillSuggestions(
const std::vector<string16>& autofill_values,
const std::vector<string16>& autofill_labels,
const std::vector<string16>& autofill_icons,
const std::vector<int>& autofill_unique_ids) OVERRIDE {};
MOCK_METHOD5(OnSuggestionsReturned,
void(int query_id,
const std::vector<string16>& autofill_values,
const std::vector<string16>& autofill_labels,
const std::vector<string16>& autofill_icons,
const std::vector<int>& autofill_unique_ids));
private:
DISALLOW_COPY_AND_ASSIGN(MockAutofillExternalDelegate);
};
class AutocompleteHistoryManagerStubSend : public AutocompleteHistoryManager {
public:
explicit AutocompleteHistoryManagerStubSend(WebContents* web_contents,
Profile* profile,
WebDataService* wds)
: AutocompleteHistoryManager(web_contents, profile, wds) {}
// Intentionally swallow the message.
virtual bool Send(IPC::Message* message) { delete message; return true; }
};
} // namespace
// Make sure our external delegate is called at the right time.
TEST_F(AutocompleteHistoryManagerTest, ExternalDelegate) {
// Local version with a stubbed out Send()
AutocompleteHistoryManagerStubSend autocomplete_history_manager(
contents(),
&profile_, web_data_service_);
MockAutofillExternalDelegate external_delegate(
TabContentsWrapper::GetCurrentWrapperForContents(contents()));
EXPECT_CALL(external_delegate, OnSuggestionsReturned(_, _, _, _, _));
autocomplete_history_manager.SetExternalDelegate(&external_delegate);
// Should trigger a call to OnSuggestionsReturned, verified by the mock.
autocomplete_history_manager.SendSuggestions(NULL);
}