| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/automation/testing_automation_provider.h" | 5 #include "chrome/browser/automation/testing_automation_provider.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 #include "base/stringprintf.h" | 22 #include "base/stringprintf.h" |
| 23 #include "base/threading/thread_restrictions.h" | 23 #include "base/threading/thread_restrictions.h" |
| 24 #include "base/time.h" | 24 #include "base/time.h" |
| 25 #include "base/utf_string_conversions.h" | 25 #include "base/utf_string_conversions.h" |
| 26 #include "chrome/app/chrome_command_ids.h" | 26 #include "chrome/app/chrome_command_ids.h" |
| 27 #include "chrome/browser/api/infobars/confirm_infobar_delegate.h" | 27 #include "chrome/browser/api/infobars/confirm_infobar_delegate.h" |
| 28 #include "chrome/browser/api/infobars/link_infobar_delegate.h" | 28 #include "chrome/browser/api/infobars/link_infobar_delegate.h" |
| 29 #include "chrome/browser/autocomplete/autocomplete_controller.h" | 29 #include "chrome/browser/autocomplete/autocomplete_controller.h" |
| 30 #include "chrome/browser/autocomplete/autocomplete_match.h" | 30 #include "chrome/browser/autocomplete/autocomplete_match.h" |
| 31 #include "chrome/browser/autocomplete/autocomplete_result.h" | 31 #include "chrome/browser/autocomplete/autocomplete_result.h" |
| 32 #include "chrome/browser/autofill/autofill_manager.h" | |
| 33 #include "chrome/browser/autofill/credit_card.h" | |
| 34 #include "chrome/browser/autofill/personal_data_manager.h" | |
| 35 #include "chrome/browser/autofill/personal_data_manager_factory.h" | |
| 36 #include "chrome/browser/automation/automation_browser_tracker.h" | 32 #include "chrome/browser/automation/automation_browser_tracker.h" |
| 37 #include "chrome/browser/automation/automation_provider_json.h" | 33 #include "chrome/browser/automation/automation_provider_json.h" |
| 38 #include "chrome/browser/automation/automation_provider_list.h" | 34 #include "chrome/browser/automation/automation_provider_list.h" |
| 39 #include "chrome/browser/automation/automation_provider_observers.h" | 35 #include "chrome/browser/automation/automation_provider_observers.h" |
| 40 #include "chrome/browser/automation/automation_tab_tracker.h" | 36 #include "chrome/browser/automation/automation_tab_tracker.h" |
| 41 #include "chrome/browser/automation/automation_util.h" | 37 #include "chrome/browser/automation/automation_util.h" |
| 42 #include "chrome/browser/automation/automation_window_tracker.h" | 38 #include "chrome/browser/automation/automation_window_tracker.h" |
| 43 #include "chrome/browser/bookmarks/bookmark_model.h" | 39 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 44 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 40 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 45 #include "chrome/browser/bookmarks/bookmark_storage.h" | 41 #include "chrome/browser/bookmarks/bookmark_storage.h" |
| (...skipping 1909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1955 browser_handler_map_["GetThemeInfo"] = | 1951 browser_handler_map_["GetThemeInfo"] = |
| 1956 &TestingAutomationProvider::GetThemeInfo; | 1952 &TestingAutomationProvider::GetThemeInfo; |
| 1957 | 1953 |
| 1958 browser_handler_map_["FindInPage"] = &TestingAutomationProvider::FindInPage; | 1954 browser_handler_map_["FindInPage"] = &TestingAutomationProvider::FindInPage; |
| 1959 | 1955 |
| 1960 browser_handler_map_["SelectTranslateOption"] = | 1956 browser_handler_map_["SelectTranslateOption"] = |
| 1961 &TestingAutomationProvider::SelectTranslateOption; | 1957 &TestingAutomationProvider::SelectTranslateOption; |
| 1962 browser_handler_map_["GetTranslateInfo"] = | 1958 browser_handler_map_["GetTranslateInfo"] = |
| 1963 &TestingAutomationProvider::GetTranslateInfo; | 1959 &TestingAutomationProvider::GetTranslateInfo; |
| 1964 | 1960 |
| 1965 browser_handler_map_["GetAutofillProfile"] = | |
| 1966 &TestingAutomationProvider::GetAutofillProfile; | |
| 1967 browser_handler_map_["FillAutofillProfile"] = | |
| 1968 &TestingAutomationProvider::FillAutofillProfile; | |
| 1969 browser_handler_map_["SubmitAutofillForm"] = | |
| 1970 &TestingAutomationProvider::SubmitAutofillForm; | |
| 1971 browser_handler_map_["AutofillTriggerSuggestions"] = | |
| 1972 &TestingAutomationProvider::AutofillTriggerSuggestions; | |
| 1973 browser_handler_map_["AutofillHighlightSuggestion"] = | |
| 1974 &TestingAutomationProvider::AutofillHighlightSuggestion; | |
| 1975 browser_handler_map_["AutofillAcceptSelection"] = | |
| 1976 &TestingAutomationProvider::AutofillAcceptSelection; | |
| 1977 | |
| 1978 browser_handler_map_["GetAllNotifications"] = | 1961 browser_handler_map_["GetAllNotifications"] = |
| 1979 &TestingAutomationProvider::GetAllNotifications; | 1962 &TestingAutomationProvider::GetAllNotifications; |
| 1980 browser_handler_map_["CloseNotification"] = | 1963 browser_handler_map_["CloseNotification"] = |
| 1981 &TestingAutomationProvider::CloseNotification; | 1964 &TestingAutomationProvider::CloseNotification; |
| 1982 browser_handler_map_["WaitForNotificationCount"] = | 1965 browser_handler_map_["WaitForNotificationCount"] = |
| 1983 &TestingAutomationProvider::WaitForNotificationCount; | 1966 &TestingAutomationProvider::WaitForNotificationCount; |
| 1984 | 1967 |
| 1985 browser_handler_map_["SignInToSync"] = | 1968 browser_handler_map_["SignInToSync"] = |
| 1986 &TestingAutomationProvider::SignInToSync; | 1969 &TestingAutomationProvider::SignInToSync; |
| 1987 browser_handler_map_["GetSyncInfo"] = | 1970 browser_handler_map_["GetSyncInfo"] = |
| (...skipping 2692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4680 if (!args->GetString("switch", &switch_name) || | 4663 if (!args->GetString("switch", &switch_name) || |
| 4681 !args->GetString("value", &switch_value)) { | 4664 !args->GetString("value", &switch_value)) { |
| 4682 reply.SendError("Missing or invalid command line switch"); | 4665 reply.SendError("Missing or invalid command line switch"); |
| 4683 return; | 4666 return; |
| 4684 } | 4667 } |
| 4685 CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_name, | 4668 CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_name, |
| 4686 switch_value); | 4669 switch_value); |
| 4687 reply.SendSuccess(NULL); | 4670 reply.SendSuccess(NULL); |
| 4688 } | 4671 } |
| 4689 | 4672 |
| 4690 // Sample json input: | |
| 4691 // { "command": "GetAutofillProfile" } | |
| 4692 // Refer to GetAutofillProfile() in chrome/test/pyautolib/pyauto.py for sample | |
| 4693 // json output. | |
| 4694 void TestingAutomationProvider::GetAutofillProfile( | |
| 4695 Browser* browser, | |
| 4696 DictionaryValue* args, | |
| 4697 IPC::Message* reply_message) { | |
| 4698 AutomationJSONReply reply(this, reply_message); | |
| 4699 // Get the AutofillProfiles currently in the database. | |
| 4700 int tab_index = 0; | |
| 4701 if (!args->GetInteger("tab_index", &tab_index)) { | |
| 4702 reply.SendError("Invalid or missing tab_index integer value."); | |
| 4703 return; | |
| 4704 } | |
| 4705 | |
| 4706 TabContents* tab_contents = chrome::GetTabContentsAt(browser, tab_index); | |
| 4707 if (tab_contents) { | |
| 4708 PersonalDataManager* pdm = PersonalDataManagerFactory::GetForProfile( | |
| 4709 tab_contents->profile()->GetOriginalProfile()); | |
| 4710 if (pdm) { | |
| 4711 std::vector<AutofillProfile*> autofill_profiles = pdm->profiles(); | |
| 4712 std::vector<CreditCard*> credit_cards = pdm->credit_cards(); | |
| 4713 | |
| 4714 ListValue* profiles = GetListFromAutofillProfiles(autofill_profiles); | |
| 4715 ListValue* cards = GetListFromCreditCards(credit_cards); | |
| 4716 | |
| 4717 scoped_ptr<DictionaryValue> return_value(new DictionaryValue); | |
| 4718 | |
| 4719 return_value->Set("profiles", profiles); | |
| 4720 return_value->Set("credit_cards", cards); | |
| 4721 reply.SendSuccess(return_value.get()); | |
| 4722 } else { | |
| 4723 reply.SendError("No PersonalDataManager."); | |
| 4724 return; | |
| 4725 } | |
| 4726 } else { | |
| 4727 reply.SendError("No tab at that index."); | |
| 4728 return; | |
| 4729 } | |
| 4730 } | |
| 4731 | |
| 4732 // Refer to FillAutofillProfile() in chrome/test/pyautolib/pyauto.py for sample | |
| 4733 // json input. | |
| 4734 // Sample json output: {} | |
| 4735 void TestingAutomationProvider::FillAutofillProfile( | |
| 4736 Browser* browser, | |
| 4737 DictionaryValue* args, | |
| 4738 IPC::Message* reply_message) { | |
| 4739 ListValue* profiles = NULL; | |
| 4740 ListValue* cards = NULL; | |
| 4741 | |
| 4742 // It's ok for profiles/credit_cards elements to be missing. | |
| 4743 args->GetList("profiles", &profiles); | |
| 4744 args->GetList("credit_cards", &cards); | |
| 4745 | |
| 4746 std::string error_mesg; | |
| 4747 | |
| 4748 std::vector<AutofillProfile> autofill_profiles; | |
| 4749 std::vector<CreditCard> credit_cards; | |
| 4750 // Create an AutofillProfile for each of the dictionary profiles. | |
| 4751 if (profiles) { | |
| 4752 autofill_profiles = GetAutofillProfilesFromList(*profiles, &error_mesg); | |
| 4753 } | |
| 4754 // Create a CreditCard for each of the dictionary values. | |
| 4755 if (cards) { | |
| 4756 credit_cards = GetCreditCardsFromList(*cards, &error_mesg); | |
| 4757 } | |
| 4758 if (!error_mesg.empty()) { | |
| 4759 AutomationJSONReply(this, reply_message).SendError(error_mesg); | |
| 4760 return; | |
| 4761 } | |
| 4762 | |
| 4763 // Save the AutofillProfiles. | |
| 4764 int tab_index = 0; | |
| 4765 if (!args->GetInteger("tab_index", &tab_index)) { | |
| 4766 AutomationJSONReply(this, reply_message).SendError( | |
| 4767 "Invalid or missing tab_index integer"); | |
| 4768 return; | |
| 4769 } | |
| 4770 | |
| 4771 TabContents* tab_contents = chrome::GetTabContentsAt(browser, tab_index); | |
| 4772 | |
| 4773 if (tab_contents) { | |
| 4774 PersonalDataManager* pdm = | |
| 4775 PersonalDataManagerFactory::GetForProfile(tab_contents->profile()); | |
| 4776 if (pdm) { | |
| 4777 if (profiles || cards) { | |
| 4778 // This observer will delete itself. | |
| 4779 AutofillChangedObserver* observer = new AutofillChangedObserver( | |
| 4780 this, reply_message, autofill_profiles.size(), credit_cards.size()); | |
| 4781 observer->Init(); | |
| 4782 | |
| 4783 if (profiles) | |
| 4784 pdm->SetProfiles(&autofill_profiles); | |
| 4785 if (cards) | |
| 4786 pdm->SetCreditCards(&credit_cards); | |
| 4787 | |
| 4788 return; | |
| 4789 } | |
| 4790 } else { | |
| 4791 AutomationJSONReply(this, reply_message).SendError( | |
| 4792 "No PersonalDataManager."); | |
| 4793 return; | |
| 4794 } | |
| 4795 } else { | |
| 4796 AutomationJSONReply(this, reply_message).SendError("No tab at that index."); | |
| 4797 return; | |
| 4798 } | |
| 4799 AutomationJSONReply(this, reply_message).SendSuccess(NULL); | |
| 4800 } | |
| 4801 | |
| 4802 void TestingAutomationProvider::SubmitAutofillForm( | |
| 4803 Browser* browser, | |
| 4804 DictionaryValue* args, | |
| 4805 IPC::Message* reply_message) { | |
| 4806 if (SendErrorIfModalDialogActive(this, reply_message)) | |
| 4807 return; | |
| 4808 | |
| 4809 int tab_index; | |
| 4810 if (!args->GetInteger("tab_index", &tab_index)) { | |
| 4811 AutomationJSONReply(this, reply_message) | |
| 4812 .SendError("'tab_index' missing or invalid."); | |
| 4813 return; | |
| 4814 } | |
| 4815 TabContents* tab_contents = chrome::GetTabContentsAt(browser, tab_index); | |
| 4816 if (!tab_contents) { | |
| 4817 AutomationJSONReply(this, reply_message).SendError( | |
| 4818 StringPrintf("No such tab at index %d", tab_index)); | |
| 4819 return; | |
| 4820 } | |
| 4821 | |
| 4822 string16 frame_xpath, javascript; | |
| 4823 if (!args->GetString("frame_xpath", &frame_xpath)) { | |
| 4824 AutomationJSONReply(this, reply_message) | |
| 4825 .SendError("'frame_xpath' missing or invalid."); | |
| 4826 return; | |
| 4827 } | |
| 4828 if (!args->GetString("javascript", &javascript)) { | |
| 4829 AutomationJSONReply(this, reply_message) | |
| 4830 .SendError("'javascript' missing or invalid."); | |
| 4831 return; | |
| 4832 } | |
| 4833 | |
| 4834 PersonalDataManager* pdm = PersonalDataManagerFactory::GetForProfile( | |
| 4835 tab_contents->profile()->GetOriginalProfile()); | |
| 4836 if (!pdm) { | |
| 4837 AutomationJSONReply(this, reply_message) | |
| 4838 .SendError("No PersonalDataManager."); | |
| 4839 return; | |
| 4840 } | |
| 4841 | |
| 4842 // This observer will delete itself. | |
| 4843 new AutofillFormSubmittedObserver(this, reply_message, pdm); | |
| 4844 | |
| 4845 // Set the routing id of this message with the controller. | |
| 4846 // This routing id needs to be remembered for the reverse | |
| 4847 // communication while sending back the response of | |
| 4848 // this javascript execution. | |
| 4849 std::string set_automation_id; | |
| 4850 base::SStringPrintf(&set_automation_id, | |
| 4851 "window.domAutomationController.setAutomationId(%d);", | |
| 4852 reply_message->routing_id()); | |
| 4853 tab_contents->web_contents()->GetRenderViewHost()-> | |
| 4854 ExecuteJavascriptInWebFrame(frame_xpath, UTF8ToUTF16(set_automation_id)); | |
| 4855 tab_contents->web_contents()->GetRenderViewHost()-> | |
| 4856 ExecuteJavascriptInWebFrame(frame_xpath, javascript); | |
| 4857 } | |
| 4858 | |
| 4859 void TestingAutomationProvider::AutofillTriggerSuggestions( | |
| 4860 Browser* browser, | |
| 4861 DictionaryValue* args, | |
| 4862 IPC::Message* reply_message) { | |
| 4863 int tab_index; | |
| 4864 if (!args->GetInteger("tab_index", &tab_index)) { | |
| 4865 AutomationJSONReply(this, reply_message).SendError( | |
| 4866 "Invalid or missing args"); | |
| 4867 return; | |
| 4868 } | |
| 4869 | |
| 4870 WebContents* web_contents = chrome::GetWebContentsAt(browser, tab_index); | |
| 4871 if (!web_contents) { | |
| 4872 AutomationJSONReply(this, reply_message).SendError( | |
| 4873 StringPrintf("No such tab at index %d", tab_index)); | |
| 4874 return; | |
| 4875 } | |
| 4876 | |
| 4877 new AutofillDisplayedObserver( | |
| 4878 chrome::NOTIFICATION_AUTOFILL_DID_SHOW_SUGGESTIONS, | |
| 4879 web_contents->GetRenderViewHost(), this, reply_message); | |
| 4880 SendWebKeyPressEventAsync(ui::VKEY_DOWN, web_contents); | |
| 4881 } | |
| 4882 | |
| 4883 void TestingAutomationProvider::AutofillHighlightSuggestion( | |
| 4884 Browser* browser, | |
| 4885 DictionaryValue* args, | |
| 4886 IPC::Message* reply_message) { | |
| 4887 int tab_index; | |
| 4888 if (!args->GetInteger("tab_index", &tab_index)) { | |
| 4889 AutomationJSONReply(this, reply_message).SendError( | |
| 4890 "Invalid or missing args"); | |
| 4891 return; | |
| 4892 } | |
| 4893 | |
| 4894 WebContents* web_contents = chrome::GetWebContentsAt(browser, tab_index); | |
| 4895 if (!web_contents) { | |
| 4896 AutomationJSONReply(this, reply_message).SendError( | |
| 4897 StringPrintf("No such tab at index %d", tab_index)); | |
| 4898 return; | |
| 4899 } | |
| 4900 | |
| 4901 std::string direction; | |
| 4902 if (!args->GetString("direction", &direction) || (direction != "up" && | |
| 4903 direction != "down")) { | |
| 4904 AutomationJSONReply(this, reply_message).SendError( | |
| 4905 "Must specify a direction of either 'up' or 'down'."); | |
| 4906 return; | |
| 4907 } | |
| 4908 int key_code = (direction == "up") ? ui::VKEY_UP : ui::VKEY_DOWN; | |
| 4909 | |
| 4910 new AutofillDisplayedObserver( | |
| 4911 chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA, | |
| 4912 web_contents->GetRenderViewHost(), this, reply_message); | |
| 4913 SendWebKeyPressEventAsync(key_code, web_contents); | |
| 4914 } | |
| 4915 | |
| 4916 void TestingAutomationProvider::AutofillAcceptSelection( | |
| 4917 Browser* browser, | |
| 4918 DictionaryValue* args, | |
| 4919 IPC::Message* reply_message) { | |
| 4920 int tab_index; | |
| 4921 if (!args->GetInteger("tab_index", &tab_index)) { | |
| 4922 AutomationJSONReply(this, reply_message).SendError( | |
| 4923 "Invalid or missing args"); | |
| 4924 return; | |
| 4925 } | |
| 4926 | |
| 4927 WebContents* web_contents = chrome::GetWebContentsAt(browser, tab_index); | |
| 4928 if (!web_contents) { | |
| 4929 AutomationJSONReply(this, reply_message).SendError( | |
| 4930 StringPrintf("No such tab at index %d", tab_index)); | |
| 4931 return; | |
| 4932 } | |
| 4933 | |
| 4934 new AutofillDisplayedObserver( | |
| 4935 chrome::NOTIFICATION_AUTOFILL_DID_FILL_FORM_DATA, | |
| 4936 web_contents->GetRenderViewHost(), this, reply_message); | |
| 4937 SendWebKeyPressEventAsync(ui::VKEY_RETURN, web_contents); | |
| 4938 } | |
| 4939 | |
| 4940 // Sample json output: { "success": true } | 4673 // Sample json output: { "success": true } |
| 4941 void TestingAutomationProvider::SignInToSync(Browser* browser, | 4674 void TestingAutomationProvider::SignInToSync(Browser* browser, |
| 4942 DictionaryValue* args, | 4675 DictionaryValue* args, |
| 4943 IPC::Message* reply_message) { | 4676 IPC::Message* reply_message) { |
| 4944 AutomationJSONReply reply(this, reply_message); | 4677 AutomationJSONReply reply(this, reply_message); |
| 4945 std::string username; | 4678 std::string username; |
| 4946 std::string password; | 4679 std::string password; |
| 4947 if (!args->GetString("username", &username) || | 4680 if (!args->GetString("username", &username) || |
| 4948 !args->GetString("password", &password)) { | 4681 !args->GetString("password", &password)) { |
| 4949 reply.SendError("Invalid or missing args"); | 4682 reply.SendError("Invalid or missing args"); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5161 sync_waiter_->DisableSyncForDatatype(datatype); | 4894 sync_waiter_->DisableSyncForDatatype(datatype); |
| 5162 sync_waiter_->AwaitFullSyncCompletion(StringPrintf( | 4895 sync_waiter_->AwaitFullSyncCompletion(StringPrintf( |
| 5163 "Disabling datatype: %s", datatype_string.c_str())); | 4896 "Disabling datatype: %s", datatype_string.c_str())); |
| 5164 } | 4897 } |
| 5165 scoped_ptr<DictionaryValue> return_value(new DictionaryValue); | 4898 scoped_ptr<DictionaryValue> return_value(new DictionaryValue); |
| 5166 return_value->SetBoolean("success", true); | 4899 return_value->SetBoolean("success", true); |
| 5167 reply.SendSuccess(return_value.get()); | 4900 reply.SendSuccess(return_value.get()); |
| 5168 } | 4901 } |
| 5169 } | 4902 } |
| 5170 | 4903 |
| 5171 /* static */ | |
| 5172 ListValue* TestingAutomationProvider::GetListFromAutofillProfiles( | |
| 5173 const std::vector<AutofillProfile*>& autofill_profiles) { | |
| 5174 ListValue* profiles = new ListValue; | |
| 5175 | |
| 5176 std::map<AutofillFieldType, std::string> autofill_type_to_string | |
| 5177 = GetAutofillFieldToStringMap(); | |
| 5178 | |
| 5179 // For each AutofillProfile, transform it to a dictionary object to return. | |
| 5180 for (std::vector<AutofillProfile*>::const_iterator it = | |
| 5181 autofill_profiles.begin(); | |
| 5182 it != autofill_profiles.end(); ++it) { | |
| 5183 AutofillProfile* profile = *it; | |
| 5184 DictionaryValue* profile_info = new DictionaryValue; | |
| 5185 // For each of the types, if it has one or more values, add those values | |
| 5186 // to the dictionary. | |
| 5187 for (std::map<AutofillFieldType, std::string>::iterator | |
| 5188 type_it = autofill_type_to_string.begin(); | |
| 5189 type_it != autofill_type_to_string.end(); ++type_it) { | |
| 5190 std::vector<string16> value_list; | |
| 5191 profile->GetMultiInfo(type_it->first, &value_list); | |
| 5192 ListValue* values_to_return = new ListValue; | |
| 5193 for (std::vector<string16>::iterator value_it = value_list.begin(); | |
| 5194 value_it != value_list.end(); ++value_it) { | |
| 5195 string16 value = *value_it; | |
| 5196 if (value.length()) // If there was something stored for that value. | |
| 5197 values_to_return->Append(new StringValue(value)); | |
| 5198 } | |
| 5199 if (!values_to_return->empty()) | |
| 5200 profile_info->Set(type_it->second, values_to_return); | |
| 5201 } | |
| 5202 profiles->Append(profile_info); | |
| 5203 } | |
| 5204 return profiles; | |
| 5205 } | |
| 5206 | |
| 5207 /* static */ | |
| 5208 ListValue* TestingAutomationProvider::GetListFromCreditCards( | |
| 5209 const std::vector<CreditCard*>& credit_cards) { | |
| 5210 ListValue* cards = new ListValue; | |
| 5211 | |
| 5212 std::map<AutofillFieldType, std::string> credit_card_type_to_string = | |
| 5213 GetCreditCardFieldToStringMap(); | |
| 5214 | |
| 5215 // For each AutofillProfile, transform it to a dictionary object to return. | |
| 5216 for (std::vector<CreditCard*>::const_iterator it = | |
| 5217 credit_cards.begin(); | |
| 5218 it != credit_cards.end(); ++it) { | |
| 5219 CreditCard* card = *it; | |
| 5220 DictionaryValue* card_info = new DictionaryValue; | |
| 5221 // For each of the types, if it has a value, add it to the dictionary. | |
| 5222 for (std::map<AutofillFieldType, std::string>::iterator type_it = | |
| 5223 credit_card_type_to_string.begin(); | |
| 5224 type_it != credit_card_type_to_string.end(); ++type_it) { | |
| 5225 string16 value = card->GetInfo(type_it->first); | |
| 5226 // If there was something stored for that value. | |
| 5227 if (value.length()) { | |
| 5228 card_info->SetString(type_it->second, value); | |
| 5229 } | |
| 5230 } | |
| 5231 cards->Append(card_info); | |
| 5232 } | |
| 5233 return cards; | |
| 5234 } | |
| 5235 | |
| 5236 /* static */ | |
| 5237 std::vector<AutofillProfile> | |
| 5238 TestingAutomationProvider::GetAutofillProfilesFromList( | |
| 5239 const ListValue& profiles, std::string* error_message) { | |
| 5240 std::vector<AutofillProfile> autofill_profiles; | |
| 5241 const DictionaryValue* profile_info = NULL; | |
| 5242 const ListValue* current_value = NULL; | |
| 5243 | |
| 5244 std::map<AutofillFieldType, std::string> autofill_type_to_string = | |
| 5245 GetAutofillFieldToStringMap(); | |
| 5246 | |
| 5247 int num_profiles = profiles.GetSize(); | |
| 5248 for (int i = 0; i < num_profiles; i++) { | |
| 5249 profiles.GetDictionary(i, &profile_info); | |
| 5250 AutofillProfile profile; | |
| 5251 // Loop through the possible profile types and add those provided. | |
| 5252 for (std::map<AutofillFieldType, std::string>::iterator type_it = | |
| 5253 autofill_type_to_string.begin(); | |
| 5254 type_it != autofill_type_to_string.end(); ++type_it) { | |
| 5255 if (profile_info->HasKey(type_it->second)) { | |
| 5256 if (profile_info->GetList(type_it->second, ¤t_value)) { | |
| 5257 std::vector<string16> value_list; | |
| 5258 for (ListValue::const_iterator list_it = current_value->begin(); | |
| 5259 list_it != current_value->end(); ++list_it) { | |
| 5260 string16 value; | |
| 5261 if ((*list_it)->GetAsString(&value)) { | |
| 5262 value_list.insert(value_list.end(), value); | |
| 5263 } else { | |
| 5264 *error_message = "All list values must be strings"; | |
| 5265 return autofill_profiles; | |
| 5266 } | |
| 5267 } | |
| 5268 profile.SetMultiInfo(type_it->first, value_list); | |
| 5269 } else { | |
| 5270 *error_message= "All values must be lists"; | |
| 5271 return autofill_profiles; | |
| 5272 } | |
| 5273 } | |
| 5274 } | |
| 5275 autofill_profiles.push_back(profile); | |
| 5276 } | |
| 5277 return autofill_profiles; | |
| 5278 } | |
| 5279 | |
| 5280 /* static */ | |
| 5281 std::vector<CreditCard> TestingAutomationProvider::GetCreditCardsFromList( | |
| 5282 const ListValue& cards, std::string* error_message) { | |
| 5283 std::vector<CreditCard> credit_cards; | |
| 5284 const DictionaryValue* card_info = NULL; | |
| 5285 string16 current_value; | |
| 5286 | |
| 5287 std::map<AutofillFieldType, std::string> credit_card_type_to_string = | |
| 5288 GetCreditCardFieldToStringMap(); | |
| 5289 | |
| 5290 int num_credit_cards = cards.GetSize(); | |
| 5291 for (int i = 0; i < num_credit_cards; i++) { | |
| 5292 if (!cards.GetDictionary(i, &card_info)) | |
| 5293 continue; | |
| 5294 CreditCard card; | |
| 5295 // Loop through the possible credit card fields and add those provided. | |
| 5296 for (std::map<AutofillFieldType, std::string>::iterator type_it = | |
| 5297 credit_card_type_to_string.begin(); | |
| 5298 type_it != credit_card_type_to_string.end(); ++type_it) { | |
| 5299 if (card_info->HasKey(type_it->second)) { | |
| 5300 if (card_info->GetString(type_it->second, ¤t_value)) { | |
| 5301 card.SetInfo(type_it->first, current_value); | |
| 5302 } else { | |
| 5303 *error_message= "All values must be strings"; | |
| 5304 break; | |
| 5305 } | |
| 5306 } | |
| 5307 } | |
| 5308 credit_cards.push_back(card); | |
| 5309 } | |
| 5310 return credit_cards; | |
| 5311 } | |
| 5312 | |
| 5313 /* static */ | |
| 5314 std::map<AutofillFieldType, std::string> | |
| 5315 TestingAutomationProvider::GetAutofillFieldToStringMap() { | |
| 5316 std::map<AutofillFieldType, std::string> autofill_type_to_string; | |
| 5317 // Strings ordered by order of fields when adding a profile in Autofill prefs. | |
| 5318 autofill_type_to_string[NAME_FIRST] = "NAME_FIRST"; | |
| 5319 autofill_type_to_string[NAME_MIDDLE] = "NAME_MIDDLE"; | |
| 5320 autofill_type_to_string[NAME_LAST] = "NAME_LAST"; | |
| 5321 autofill_type_to_string[COMPANY_NAME] = "COMPANY_NAME"; | |
| 5322 autofill_type_to_string[EMAIL_ADDRESS] = "EMAIL_ADDRESS"; | |
| 5323 autofill_type_to_string[ADDRESS_HOME_LINE1] = "ADDRESS_HOME_LINE1"; | |
| 5324 autofill_type_to_string[ADDRESS_HOME_LINE2] = "ADDRESS_HOME_LINE2"; | |
| 5325 autofill_type_to_string[ADDRESS_HOME_CITY] = "ADDRESS_HOME_CITY"; | |
| 5326 autofill_type_to_string[ADDRESS_HOME_STATE] = "ADDRESS_HOME_STATE"; | |
| 5327 autofill_type_to_string[ADDRESS_HOME_ZIP] = "ADDRESS_HOME_ZIP"; | |
| 5328 autofill_type_to_string[ADDRESS_HOME_COUNTRY] = "ADDRESS_HOME_COUNTRY"; | |
| 5329 autofill_type_to_string[PHONE_HOME_COUNTRY_CODE] = | |
| 5330 "PHONE_HOME_COUNTRY_CODE"; | |
| 5331 autofill_type_to_string[PHONE_HOME_CITY_CODE] = "PHONE_HOME_CITY_CODE"; | |
| 5332 autofill_type_to_string[PHONE_HOME_WHOLE_NUMBER] = | |
| 5333 "PHONE_HOME_WHOLE_NUMBER"; | |
| 5334 return autofill_type_to_string; | |
| 5335 } | |
| 5336 | |
| 5337 /* static */ | |
| 5338 std::map<AutofillFieldType, std::string> | |
| 5339 TestingAutomationProvider::GetCreditCardFieldToStringMap() { | |
| 5340 std::map<AutofillFieldType, std::string> credit_card_type_to_string; | |
| 5341 credit_card_type_to_string[CREDIT_CARD_NAME] = "CREDIT_CARD_NAME"; | |
| 5342 credit_card_type_to_string[CREDIT_CARD_NUMBER] = "CREDIT_CARD_NUMBER"; | |
| 5343 credit_card_type_to_string[CREDIT_CARD_EXP_MONTH] = "CREDIT_CARD_EXP_MONTH"; | |
| 5344 credit_card_type_to_string[CREDIT_CARD_EXP_4_DIGIT_YEAR] = | |
| 5345 "CREDIT_CARD_EXP_4_DIGIT_YEAR"; | |
| 5346 return credit_card_type_to_string; | |
| 5347 } | |
| 5348 | |
| 5349 // Refer to GetAllNotifications() in chrome/test/pyautolib/pyauto.py for | 4904 // Refer to GetAllNotifications() in chrome/test/pyautolib/pyauto.py for |
| 5350 // sample json input/output. | 4905 // sample json input/output. |
| 5351 void TestingAutomationProvider::GetAllNotifications( | 4906 void TestingAutomationProvider::GetAllNotifications( |
| 5352 Browser* browser, | 4907 Browser* browser, |
| 5353 DictionaryValue* args, | 4908 DictionaryValue* args, |
| 5354 IPC::Message* reply_message) { | 4909 IPC::Message* reply_message) { |
| 5355 new GetAllNotificationsObserver(this, reply_message); | 4910 new GetAllNotificationsObserver(this, reply_message); |
| 5356 } | 4911 } |
| 5357 | 4912 |
| 5358 // Refer to CloseNotification() in chrome/test/pyautolib/pyauto.py for | 4913 // Refer to CloseNotification() in chrome/test/pyautolib/pyauto.py for |
| (...skipping 1888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7247 void TestingAutomationProvider::OnRemoveProvider() { | 6802 void TestingAutomationProvider::OnRemoveProvider() { |
| 7248 if (g_browser_process) | 6803 if (g_browser_process) |
| 7249 g_browser_process->GetAutomationProviderList()->RemoveProvider(this); | 6804 g_browser_process->GetAutomationProviderList()->RemoveProvider(this); |
| 7250 } | 6805 } |
| 7251 | 6806 |
| 7252 void TestingAutomationProvider::EnsureTabSelected(Browser* browser, | 6807 void TestingAutomationProvider::EnsureTabSelected(Browser* browser, |
| 7253 WebContents* tab) { | 6808 WebContents* tab) { |
| 7254 if (chrome::GetActiveWebContents(browser) != tab) | 6809 if (chrome::GetActiveWebContents(browser) != tab) |
| 7255 chrome::ActivateTabAt(browser, chrome::GetIndexOfTab(browser, tab), true); | 6810 chrome::ActivateTabAt(browser, chrome::GetIndexOfTab(browser, tab), true); |
| 7256 } | 6811 } |
| OLD | NEW |