Index: chrome/renderer/autofill/password_generation_agent_browsertest.cc |
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc |
index b39c06e96d8c08b254c2a59d05928a908226f8c1..5e24681838981707bb71daa80a6b6ec1ee25aca7 100644 |
--- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc |
+++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc |
@@ -5,11 +5,11 @@ |
#include <string.h> |
#include "base/memory/scoped_ptr.h" |
-#include "base/memory/scoped_vector.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/test/base/chrome_render_view_test.h" |
#include "components/autofill/content/common/autofill_messages.h" |
-#include "components/autofill/content/renderer/password_generation_agent.h" |
+#include "components/autofill/content/renderer/autofill_agent.h" |
+#include "components/autofill/content/renderer/test_password_generation_agent.h" |
#include "components/autofill/core/common/form_data.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
@@ -24,79 +24,21 @@ using blink::WebString; |
namespace autofill { |
-class TestPasswordGenerationAgent : public PasswordGenerationAgent { |
- public: |
- explicit TestPasswordGenerationAgent(content::RenderView* view) |
- : PasswordGenerationAgent(view) {} |
- virtual ~TestPasswordGenerationAgent() {} |
- |
- // Make this public |
- virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
- return PasswordGenerationAgent::OnMessageReceived(message); |
- } |
- |
- const std::vector<IPC::Message*>& messages() { |
- return messages_.get(); |
- } |
- |
- void ClearMessages() { |
- messages_.clear(); |
- } |
- |
- protected: |
- virtual bool ShouldAnalyzeDocument(const blink::WebDocument& document) const |
- OVERRIDE { |
- return true; |
- } |
- |
- virtual bool Send(IPC::Message* message) OVERRIDE { |
- messages_.push_back(message); |
- return true; |
- } |
- |
- private: |
- ScopedVector<IPC::Message> messages_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestPasswordGenerationAgent); |
-}; |
- |
class PasswordGenerationAgentTest : public ChromeRenderViewTest { |
public: |
PasswordGenerationAgentTest() {} |
- virtual void SetUp() { |
- // We don't actually create a PasswordGenerationAgent during |
- // ChromeRenderViewTest::SetUp because it's behind a flag. Since we want |
- // to use a test manager anyway, we just create our own. |
- ChromeRenderViewTest::SetUp(); |
- generation_manager_.reset(new TestPasswordGenerationAgent(view_)); |
- } |
- |
virtual void TearDown() { |
LoadHTML(""); |
- generation_manager_.reset(); |
ChromeRenderViewTest::TearDown(); |
} |
- void SimulateClickOnDecoration(blink::WebInputElement* input_element) { |
- generation_manager_->ClearMessages(); |
- blink::WebElement decoration = |
- input_element->decorationElementFor(generation_manager_.get()); |
- decoration.simulateClick(); |
- } |
- |
- bool DecorationIsVisible(blink::WebInputElement* input_element) { |
- blink::WebElement decoration = |
- input_element->decorationElementFor(generation_manager_.get()); |
- return decoration.hasNonEmptyBoundingBox(); |
- } |
- |
void SetNotBlacklistedMessage(const char* form_str) { |
autofill::PasswordForm form; |
form.origin = |
GURL(base::StringPrintf("data:text/html;charset=utf-8,%s", form_str)); |
AutofillMsg_FormNotBlacklisted msg(0, form); |
- generation_manager_->OnMessageReceived(msg); |
+ password_generation_->OnMessageReceived(msg); |
} |
void SetAccountCreationFormsDetectedMessage(const char* form_str) { |
@@ -106,29 +48,29 @@ class PasswordGenerationAgentTest : public ChromeRenderViewTest { |
std::vector<autofill::FormData> forms; |
forms.push_back(form); |
AutofillMsg_AccountCreationFormsDetected msg(0, forms); |
- generation_manager_->OnMessageReceived(msg); |
+ password_generation_->OnMessageReceived(msg); |
} |
- void ExpectPasswordGenerationIconShown(const char* element_id, bool shown) { |
+ void ExpectPasswordGenerationAvailable(const char* element_id, |
+ bool available) { |
WebDocument document = GetMainFrame()->document(); |
WebElement element = |
document.getElementById(WebString::fromUTF8(element_id)); |
ASSERT_FALSE(element.isNull()); |
WebInputElement target_element = element.to<WebInputElement>(); |
- if (shown) { |
- EXPECT_TRUE(DecorationIsVisible(&target_element)); |
- SimulateClickOnDecoration(&target_element); |
- EXPECT_EQ(1u, generation_manager_->messages().size()); |
+ ExecuteJavaScript( |
+ base::StringPrintf("document.getElementById('%s').focus();", |
+ element_id).c_str()); |
+ if (available) { |
+ ASSERT_EQ(1u, password_generation_->messages().size()); |
EXPECT_EQ(AutofillHostMsg_ShowPasswordGenerationPopup::ID, |
- generation_manager_->messages()[0]->type()); |
+ password_generation_->messages()[0]->type()); |
} else { |
- EXPECT_FALSE(DecorationIsVisible(&target_element)); |
+ EXPECT_EQ(0u, password_generation_->messages().size()); |
} |
+ password_generation_->clear_messages(); |
} |
- protected: |
- scoped_ptr<TestPasswordGenerationAgent> generation_manager_; |
- |
private: |
DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgentTest); |
}; |
@@ -169,11 +111,11 @@ const char kInvalidActionAccountCreationFormHTML[] = |
TEST_F(PasswordGenerationAgentTest, DetectionTest) { |
// Don't shown the icon for non account creation forms. |
LoadHTML(kSigninFormHTML); |
- ExpectPasswordGenerationIconShown("password", false); |
+ ExpectPasswordGenerationAvailable("password", false); |
// We don't show the decoration yet because the feature isn't enabled. |
LoadHTML(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", false); |
+ ExpectPasswordGenerationAvailable("first_password", false); |
// Pretend like We have received message indicating site is not blacklisted, |
// and we have received message indicating the form is classified as |
@@ -181,20 +123,20 @@ TEST_F(PasswordGenerationAgentTest, DetectionTest) { |
LoadHTML(kAccountCreationFormHTML); |
SetNotBlacklistedMessage(kAccountCreationFormHTML); |
SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", true); |
+ ExpectPasswordGenerationAvailable("first_password", true); |
// This doesn't trigger because hidden password fields are ignored. |
LoadHTML(kHiddenPasswordAccountCreationFormHTML); |
SetNotBlacklistedMessage(kHiddenPasswordAccountCreationFormHTML); |
SetAccountCreationFormsDetectedMessage( |
kHiddenPasswordAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", false); |
+ ExpectPasswordGenerationAvailable("first_password", false); |
// This doesn't trigger because the form action is invalid. |
LoadHTML(kInvalidActionAccountCreationFormHTML); |
SetNotBlacklistedMessage(kInvalidActionAccountCreationFormHTML); |
SetAccountCreationFormsDetectedMessage(kInvalidActionAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", false); |
+ ExpectPasswordGenerationAvailable("first_password", false); |
} |
TEST_F(PasswordGenerationAgentTest, FillTest) { |
@@ -216,7 +158,7 @@ TEST_F(PasswordGenerationAgentTest, FillTest) { |
base::string16 password = base::ASCIIToUTF16("random_password"); |
AutofillMsg_GeneratedPasswordAccepted msg(0, password); |
- generation_manager_->OnMessageReceived(msg); |
+ password_generation_->OnMessageReceived(msg); |
// Password fields are filled out and set as being autofilled. |
EXPECT_EQ(password, first_password_element.value()); |
@@ -232,26 +174,62 @@ TEST_F(PasswordGenerationAgentTest, FillTest) { |
EXPECT_EQ(element, document.focusedNode()); |
} |
+TEST_F(PasswordGenerationAgentTest, EditingTest) { |
+ LoadHTML(kAccountCreationFormHTML); |
+ SetNotBlacklistedMessage(kAccountCreationFormHTML); |
+ SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
+ |
+ WebDocument document = GetMainFrame()->document(); |
+ WebElement element = |
+ document.getElementById(WebString::fromUTF8("first_password")); |
+ ASSERT_FALSE(element.isNull()); |
+ WebInputElement first_password_element = element.to<WebInputElement>(); |
+ element = document.getElementById(WebString::fromUTF8("second_password")); |
+ ASSERT_FALSE(element.isNull()); |
+ WebInputElement second_password_element = element.to<WebInputElement>(); |
+ |
+ base::string16 password = base::ASCIIToUTF16("random_password"); |
+ AutofillMsg_GeneratedPasswordAccepted msg(0, password); |
+ password_generation_->OnMessageReceived(msg); |
+ |
+ // Passwords start out the same. |
+ EXPECT_EQ(password, first_password_element.value()); |
+ EXPECT_EQ(password, second_password_element.value()); |
+ |
+ // After editing the first field they are still the same. |
+ base::string16 edited_password = base::ASCIIToUTF16("edited_password"); |
+ first_password_element.setValue(edited_password); |
+ // Cast to WebAutofillClient where textFieldDidChange() is public. |
+ static_cast<blink::WebAutofillClient*>(autofill_agent_)->textFieldDidChange( |
+ first_password_element); |
+ // textFieldDidChange posts a task, so we need to wait until it's been |
+ // processed. |
+ base::MessageLoop::current()->RunUntilIdle(); |
+ |
+ EXPECT_EQ(edited_password, first_password_element.value()); |
+ EXPECT_EQ(edited_password, second_password_element.value()); |
+} |
+ |
TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { |
// Did not receive not blacklisted message. Don't show password generation |
// icon. |
LoadHTML(kAccountCreationFormHTML); |
SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", false); |
+ ExpectPasswordGenerationAvailable("first_password", false); |
// Receive one not blacklisted message for non account creation form. Don't |
// show password generation icon. |
LoadHTML(kAccountCreationFormHTML); |
SetNotBlacklistedMessage(kSigninFormHTML); |
SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", false); |
+ ExpectPasswordGenerationAvailable("first_password", false); |
// Receive one not blackliste message for account creation form. Show password |
// generation icon. |
LoadHTML(kAccountCreationFormHTML); |
SetNotBlacklistedMessage(kAccountCreationFormHTML); |
SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", true); |
+ ExpectPasswordGenerationAvailable("first_password", true); |
// Receive two not blacklisted messages, one is for account creation form and |
// the other is not. Show password generation icon. |
@@ -259,7 +237,7 @@ TEST_F(PasswordGenerationAgentTest, BlacklistedTest) { |
SetNotBlacklistedMessage(kAccountCreationFormHTML); |
SetNotBlacklistedMessage(kSigninFormHTML); |
SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", true); |
+ ExpectPasswordGenerationAvailable("first_password", true); |
} |
TEST_F(PasswordGenerationAgentTest, AccountCreationFormsDetectedTest) { |
@@ -267,14 +245,14 @@ TEST_F(PasswordGenerationAgentTest, AccountCreationFormsDetectedTest) { |
// password generation icon. |
LoadHTML(kAccountCreationFormHTML); |
SetNotBlacklistedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", false); |
+ ExpectPasswordGenerationAvailable("first_password", false); |
// Receive the account creation forms detected message. Show password |
// generation icon. |
LoadHTML(kAccountCreationFormHTML); |
SetNotBlacklistedMessage(kAccountCreationFormHTML); |
SetAccountCreationFormsDetectedMessage(kAccountCreationFormHTML); |
- ExpectPasswordGenerationIconShown("first_password", true); |
+ ExpectPasswordGenerationAvailable("first_password", true); |
} |
} // namespace autofill |