Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5352)

Unified Diff: chrome/renderer/autofill/form_cache.cc

Issue 7983028: Don't cache WebFrame pointers for Autofill, as these can become stale. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/autofill/form_cache.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/autofill/form_cache.cc
diff --git a/chrome/renderer/autofill/form_cache.cc b/chrome/renderer/autofill/form_cache.cc
index 10dde2ce89fb648354ea47272eeed017d0e12a46..a1b3999b48a90600165724dc1182115a6ff6191d 100644
--- a/chrome/renderer/autofill/form_cache.cc
+++ b/chrome/renderer/autofill/form_cache.cc
@@ -22,6 +22,7 @@
#include "webkit/glue/form_field.h"
#include "webkit/glue/form_field_predictions.h"
+using WebKit::WebDocument;
using WebKit::WebFormControlElement;
using WebKit::WebFormElement;
using WebKit::WebFrame;
@@ -59,12 +60,17 @@ FormCache::~FormCache() {
void FormCache::ExtractForms(const WebFrame& frame,
std::vector<FormData>* forms) {
- // Reset the vector of FormElements for this frame.
+ // Reset the cache for this frame.
ResetFrame(frame);
- web_frames_.insert(&frame);
+
+ WebDocument document = frame.document();
+ if (document.isNull())
+ return;
+
+ web_documents_.insert(document);
WebVector<WebFormElement> web_forms;
- frame.document().forms(web_forms);
+ document.forms(web_forms);
size_t num_fields_seen = 0;
for (size_t i = 0; i < web_forms.size(); ++i) {
@@ -105,20 +111,37 @@ void FormCache::ExtractForms(const WebFrame& frame,
}
void FormCache::ResetFrame(const WebFrame& frame) {
- web_frames_.erase(&frame);
+ std::vector<WebDocument> documents_to_delete;
+ for (std::set<WebDocument>::const_iterator it = web_documents_.begin();
+ it != web_documents_.end(); ++it) {
+ const WebFrame* document_frame = it->frame();
+ if (!document_frame || document_frame == &frame)
+ documents_to_delete.push_back(*it);
+ }
- std::vector<WebSelectElement> to_delete;
+ for (std::vector<WebDocument>::const_iterator it =
+ documents_to_delete.begin();
+ it != documents_to_delete.end(); ++it) {
+ web_documents_.erase(*it);
+ }
+
+ std::vector<WebSelectElement> select_values_to_delete;
for (std::map<const WebSelectElement, string16>::const_iterator it =
initial_select_values_.begin();
it != initial_select_values_.end(); ++it) {
WebFormElement form_element = it->first.form();
- if (form_element.isNull() || form_element.document().frame() == &frame)
- to_delete.push_back(it->first);
+ if (form_element.isNull()) {
+ select_values_to_delete.push_back(it->first);
+ } else {
+ const WebFrame* element_frame = form_element.document().frame();
+ if (!element_frame || element_frame == &frame)
+ select_values_to_delete.push_back(it->first);
+ }
}
for (std::vector<WebSelectElement>::const_iterator it =
- to_delete.begin();
- it != to_delete.end(); ++it) {
+ select_values_to_delete.begin();
+ it != select_values_to_delete.end(); ++it) {
initial_select_values_.erase(*it);
}
}
@@ -170,10 +193,10 @@ bool FormCache::ShowPredictions(const FormDataPredictions& form) {
// Find the form.
bool found_form = false;
WebFormElement form_element;
- for (std::set<const WebFrame*>::const_iterator it = web_frames_.begin();
- it != web_frames_.end() && !found_form; ++it) {
+ for (std::set<WebDocument>::const_iterator it = web_documents_.begin();
+ it != web_documents_.end() && !found_form; ++it) {
WebVector<WebFormElement> web_forms;
- (*it)->document().forms(web_forms);
+ it->forms(web_forms);
for (size_t i = 0; i < web_forms.size(); ++i) {
form_element = web_forms[i];
« no previous file with comments | « chrome/renderer/autofill/form_cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698