| 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];
|
|
|