Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / components / password_manager / core / browser / password_manager.cc
index e05dab3..aa5744e 100644 (file)
@@ -69,6 +69,22 @@ bool ShouldDropSyncCredential() {
   return group_name != "Disabled";
 }
 
+bool URLsEqualUpToScheme(const GURL& a, const GURL& b) {
+  return (a.GetContent() == b.GetContent());
+}
+
+bool URLsEqualUpToHttpHttpsSubstitution(const GURL& a, const GURL& b) {
+  if (a == b)
+    return true;
+
+  // The first-time and retry login forms action URLs sometimes differ in
+  // switching from HTTP to HTTPS, see http://crbug.com/400769.
+  if (a.SchemeIsHTTPOrHTTPS() && b.SchemeIsHTTPOrHTTPS())
+    return URLsEqualUpToScheme(a, b);
+
+  return false;
+}
+
 }  // namespace
 
 const char PasswordManager::kOtherPossibleUsernamesExperiment[] =
@@ -157,7 +173,8 @@ void PasswordManager::ProvisionallySavePassword(const PasswordForm& form) {
   }
 
   // No password to save? Then don't.
-  if (form.password_value.empty() && form.new_password_value.empty()) {
+  if ((form.new_password_element.empty() && form.password_value.empty()) ||
+      (!form.new_password_element.empty() && form.new_password_value.empty())) {
     RecordFailure(EMPTY_PASSWORD, form.origin.host(), logger.get());
     return;
   }
@@ -437,12 +454,14 @@ void PasswordManager::OnPasswordFormsRendered(
   // If we see the login form again, then the login failed.
   if (did_stop_loading) {
     for (size_t i = 0; i < all_visible_forms_.size(); ++i) {
-      // TODO(vabr): The similarity check is just action equality for now. If it
-      // becomes more complex, it may make sense to consider modifying and using
+      // TODO(vabr): The similarity check is just action equality up to
+      // HTTP<->HTTPS substitution for now. If it becomes more complex, it may
+      // make sense to consider modifying and using
       // PasswordFormManager::DoesManage for it.
       if (all_visible_forms_[i].action.is_valid() &&
-          provisional_save_manager_->pending_credentials().action ==
-              all_visible_forms_[i].action) {
+          URLsEqualUpToHttpHttpsSubstitution(
+              provisional_save_manager_->pending_credentials().action,
+              all_visible_forms_[i].action)) {
         if (logger) {
           logger->LogPasswordForm(Logger::STRING_PASSWORD_FORM_REAPPEARED,
                                   visible_forms[i]);
@@ -468,7 +487,10 @@ void PasswordManager::OnPasswordFormsRendered(
     if (ShouldPromptUserToSavePassword()) {
       if (logger)
         logger->LogMessage(Logger::STRING_DECISION_ASK);
-      client_->PromptUserToSavePassword(provisional_save_manager_.Pass());
+      if (client_->PromptUserToSavePassword(provisional_save_manager_.Pass())) {
+        if (logger)
+          logger->LogMessage(Logger::STRING_SHOW_PASSWORD_PROMPT);
+      }
     } else {
       if (logger)
         logger->LogMessage(Logger::STRING_DECISION_SAVE);