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

Side by Side Diff: chrome/browser/automation/testing_automation_provider.cc

Issue 6614023: Convert ChromeDriver to use only the JSON automation interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years, 9 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 163
164 TabContents* GetTabContentsAt(int browser_index, int tab_index) { 164 TabContents* GetTabContentsAt(int browser_index, int tab_index) {
165 if (tab_index < 0) 165 if (tab_index < 0)
166 return NULL; 166 return NULL;
167 Browser* browser = GetBrowserAt(browser_index); 167 Browser* browser = GetBrowserAt(browser_index);
168 if (!browser || tab_index >= browser->tab_count()) 168 if (!browser || tab_index >= browser->tab_count())
169 return NULL; 169 return NULL;
170 return browser->GetTabContentsAt(tab_index); 170 return browser->GetTabContentsAt(tab_index);
171 } 171 }
172 172
173 bool GetBrowserFromJSONArgs(
Paweł Hajdan Jr. 2011/03/05 11:44:56 Could you move those helpers to automation_provide
kkania 2011/03/07 04:31:51 Done.
174 DictionaryValue* args,
175 Browser** browser,
176 std::string* error) {
177 int browser_index = 0;
178 if (!args->GetInteger("windex", &browser_index)) {
179 *error = "'windex' missing or invalid";
Paweł Hajdan Jr. 2011/03/05 11:44:56 It seems that we should be appending to |error| ra
kkania 2011/03/07 04:31:51 The error is only set if the func returns false, i
180 return false;
181 }
182 *browser = GetBrowserAt(browser_index);
183 if (!*browser) {
184 *error = "Cannot locate browser from given index";
185 return false;
186 }
187 return true;
188 }
189
190 bool GetTabFromJSONArgs(
191 DictionaryValue* args,
192 TabContents** tab,
193 std::string* error) {
194 int browser_index = 0, tab_index = 0;
195 if (!args->GetInteger("windex", &browser_index)) {
196 *error = "'windex' missing or invalid";
197 return false;
198 }
199 if (!args->GetInteger("tab_index", &tab_index)) {
200 *error = "'tab_index' missing or invalid";
201 return false;
202 }
203 *tab = GetTabContentsAt(browser_index, tab_index);
204 if (!*tab) {
205 *error = "Cannot locate tab from given indices";
206 return false;
207 }
208 return true;
209 }
210
211 bool GetBrowserAndTabFromJSONArgs(
212 DictionaryValue* args,
213 Browser** browser,
214 TabContents** tab,
215 std::string* error) {
216 return GetBrowserFromJSONArgs(args, browser, error) &&
217 GetTabFromJSONArgs(args, tab, error);
218 }
219
173 } // namespace 220 } // namespace
174 221
175 TestingAutomationProvider::TestingAutomationProvider(Profile* profile) 222 TestingAutomationProvider::TestingAutomationProvider(Profile* profile)
176 : AutomationProvider(profile), 223 : AutomationProvider(profile),
177 #if defined(TOOLKIT_VIEWS) 224 #if defined(TOOLKIT_VIEWS)
178 popup_menu_waiter_(NULL), 225 popup_menu_waiter_(NULL),
179 #endif 226 #endif
180 redirect_query_(0) { 227 redirect_query_(0) {
181 BrowserList::AddObserver(this); 228 BrowserList::AddObserver(this);
182 registrar_.Add(this, NotificationType::SESSION_END, 229 registrar_.Add(this, NotificationType::SESSION_END,
(...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 ((flags & ui::EF_CONTROL_DOWN) == 953 ((flags & ui::EF_CONTROL_DOWN) ==
907 ui::EF_CONTROL_DOWN), 954 ui::EF_CONTROL_DOWN),
908 ((flags & ui::EF_SHIFT_DOWN) == 955 ((flags & ui::EF_SHIFT_DOWN) ==
909 ui::EF_SHIFT_DOWN), 956 ui::EF_SHIFT_DOWN),
910 ((flags & ui::EF_ALT_DOWN) == 957 ((flags & ui::EF_ALT_DOWN) ==
911 ui::EF_ALT_DOWN), 958 ui::EF_ALT_DOWN),
912 ((flags & ui::EF_COMMAND_DOWN) == 959 ((flags & ui::EF_COMMAND_DOWN) ==
913 ui::EF_COMMAND_DOWN)); 960 ui::EF_COMMAND_DOWN));
914 } 961 }
915 962
916 void TestingAutomationProvider::WebkitMouseClick(Browser* browser, 963 void TestingAutomationProvider::WebkitMouseClick(DictionaryValue* args,
917 DictionaryValue* args,
918 IPC::Message* reply_message) { 964 IPC::Message* reply_message) {
965 TabContents* tab_contents;
966 std::string error;
967 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
968 AutomationJSONReply(this, reply_message).SendError(error);
969 return;
970 }
971
919 WebKit::WebMouseEvent mouse_event; 972 WebKit::WebMouseEvent mouse_event;
920
921 if (!args->GetInteger("x", &mouse_event.x) || 973 if (!args->GetInteger("x", &mouse_event.x) ||
922 !args->GetInteger("y", &mouse_event.y)) { 974 !args->GetInteger("y", &mouse_event.y)) {
923 AutomationJSONReply(this, reply_message) 975 AutomationJSONReply(this, reply_message)
924 .SendError("(X,Y) coordinates missing or invalid"); 976 .SendError("(X,Y) coordinates missing or invalid");
925 return; 977 return;
926 } 978 }
927 979
928 int button_flags; 980 int button;
929 if (!args->GetInteger("button_flags", &button_flags)) { 981 if (!args->GetInteger("button", &button)) {
930 AutomationJSONReply(this, reply_message) 982 AutomationJSONReply(this, reply_message)
931 .SendError("Mouse button missing or invalid"); 983 .SendError("Mouse button missing or invalid");
932 return; 984 return;
933 } 985 }
934 986 if (button == automation::kLeftButton) {
935 if (button_flags == ui::EF_LEFT_BUTTON_DOWN) {
936 mouse_event.button = WebKit::WebMouseEvent::ButtonLeft; 987 mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
937 } else if (button_flags == ui::EF_RIGHT_BUTTON_DOWN) { 988 } else if (button == automation::kRightButton) {
938 mouse_event.button = WebKit::WebMouseEvent::ButtonRight; 989 mouse_event.button = WebKit::WebMouseEvent::ButtonRight;
939 } else if (button_flags == ui::EF_MIDDLE_BUTTON_DOWN) { 990 } else if (button == automation::kMiddleButton) {
940 mouse_event.button = WebKit::WebMouseEvent::ButtonMiddle; 991 mouse_event.button = WebKit::WebMouseEvent::ButtonMiddle;
941 } else { 992 } else {
942 AutomationJSONReply(this, reply_message) 993 AutomationJSONReply(this, reply_message)
943 .SendError("Invalid button press requested"); 994 .SendError("Invalid button press requested");
944 return; 995 return;
945 } 996 }
946 997
947 TabContents* tab_contents = browser->GetSelectedTabContents();
948 mouse_event.type = WebKit::WebInputEvent::MouseDown; 998 mouse_event.type = WebKit::WebInputEvent::MouseDown;
949 mouse_event.clickCount = 1; 999 mouse_event.clickCount = 1;
950 1000
951 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event); 1001 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
952 1002
953 mouse_event.type = WebKit::WebInputEvent::MouseUp; 1003 mouse_event.type = WebKit::WebInputEvent::MouseUp;
954 new InputEventAckNotificationObserver(this, reply_message, mouse_event.type); 1004 new InputEventAckNotificationObserver(this, reply_message, mouse_event.type);
955 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event); 1005 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
956 } 1006 }
957 1007
958 void TestingAutomationProvider::WebkitMouseMove(Browser* browser, 1008 void TestingAutomationProvider::WebkitMouseMove(
959 DictionaryValue* args, 1009 DictionaryValue* args, IPC::Message* reply_message) {
960 IPC::Message* reply_message) { 1010 TabContents* tab_contents;
1011 std::string error;
1012 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
1013 AutomationJSONReply(this, reply_message).SendError(error);
1014 return;
1015 }
1016
961 WebKit::WebMouseEvent mouse_event; 1017 WebKit::WebMouseEvent mouse_event;
962
963 if (!args->GetInteger("x", &mouse_event.x) || 1018 if (!args->GetInteger("x", &mouse_event.x) ||
964 !args->GetInteger("y", &mouse_event.y)) { 1019 !args->GetInteger("y", &mouse_event.y)) {
965 AutomationJSONReply(this, reply_message) 1020 AutomationJSONReply(this, reply_message)
966 .SendError("(X,Y) coordinates missing or invalid"); 1021 .SendError("(X,Y) coordinates missing or invalid");
967 return; 1022 return;
968 } 1023 }
969 1024
970 TabContents* tab_contents = browser->GetSelectedTabContents();
971 mouse_event.type = WebKit::WebInputEvent::MouseMove; 1025 mouse_event.type = WebKit::WebInputEvent::MouseMove;
972 new InputEventAckNotificationObserver(this, reply_message, mouse_event.type); 1026 new InputEventAckNotificationObserver(this, reply_message, mouse_event.type);
973 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event); 1027 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
974 } 1028 }
975 1029
976 void TestingAutomationProvider::WebkitMouseDrag(Browser* browser, 1030 void TestingAutomationProvider::WebkitMouseDrag(DictionaryValue* args,
977 DictionaryValue* args,
978 IPC::Message* reply_message) { 1031 IPC::Message* reply_message) {
1032 TabContents* tab_contents;
1033 std::string error;
1034 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
1035 AutomationJSONReply(this, reply_message).SendError(error);
1036 return;
1037 }
1038
979 WebKit::WebMouseEvent mouse_event; 1039 WebKit::WebMouseEvent mouse_event;
980 int start_x, start_y, end_x, end_y; 1040 int start_x, start_y, end_x, end_y;
981
982 if (!args->GetInteger("start_x", &start_x) || 1041 if (!args->GetInteger("start_x", &start_x) ||
983 !args->GetInteger("start_y", &start_y) || 1042 !args->GetInteger("start_y", &start_y) ||
984 !args->GetInteger("end_x", &end_x) || 1043 !args->GetInteger("end_x", &end_x) ||
985 !args->GetInteger("end_y", &end_y)) { 1044 !args->GetInteger("end_y", &end_y)) {
986 AutomationJSONReply(this, reply_message) 1045 AutomationJSONReply(this, reply_message)
987 .SendError("Invalid start/end positions"); 1046 .SendError("Invalid start/end positions");
988 return; 1047 return;
989 } 1048 }
990 1049
991 mouse_event.type = WebKit::WebInputEvent::MouseMove; 1050 mouse_event.type = WebKit::WebInputEvent::MouseMove;
992 TabContents* tab_contents = browser->GetSelectedTabContents();
993 // Step 1- Move the mouse to the start position. 1051 // Step 1- Move the mouse to the start position.
994 mouse_event.x = start_x; 1052 mouse_event.x = start_x;
995 mouse_event.y = start_y; 1053 mouse_event.y = start_y;
996 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event); 1054 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
997 1055
998 // Step 2- Left click mouse down, the mouse button is fixed. 1056 // Step 2- Left click mouse down, the mouse button is fixed.
999 mouse_event.type = WebKit::WebInputEvent::MouseDown; 1057 mouse_event.type = WebKit::WebInputEvent::MouseDown;
1000 mouse_event.button = WebKit::WebMouseEvent::ButtonLeft; 1058 mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
1001 mouse_event.clickCount = 1; 1059 mouse_event.clickCount = 1;
1002 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event); 1060 tab_contents->render_view_host()->ForwardMouseEvent(mouse_event);
(...skipping 1108 matching lines...) Expand 10 before | Expand all | Expand 10 after
2111 } 2169 }
2112 2170
2113 // Map json commands to their handlers. 2171 // Map json commands to their handlers.
2114 std::map<std::string, JsonHandler> handler_map; 2172 std::map<std::string, JsonHandler> handler_map;
2115 handler_map["WaitForAllTabsToStopLoading"] = 2173 handler_map["WaitForAllTabsToStopLoading"] =
2116 &TestingAutomationProvider::WaitForAllTabsToStopLoading; 2174 &TestingAutomationProvider::WaitForAllTabsToStopLoading;
2117 handler_map["GetIndicesFromTab"] = 2175 handler_map["GetIndicesFromTab"] =
2118 &TestingAutomationProvider::GetIndicesFromTab; 2176 &TestingAutomationProvider::GetIndicesFromTab;
2119 handler_map["NavigateToURL"] = 2177 handler_map["NavigateToURL"] =
2120 &TestingAutomationProvider::NavigateToURL; 2178 &TestingAutomationProvider::NavigateToURL;
2179 handler_map["ExecuteJavascript"] =
2180 &TestingAutomationProvider::ExecuteJavascriptJSON;
2181 handler_map["GoForward"] =
2182 &TestingAutomationProvider::GoForward;
2183 handler_map["GoBack"] =
2184 &TestingAutomationProvider::GoBack;
2185 handler_map["Reload"] =
2186 &TestingAutomationProvider::ReloadJSON;
2187 handler_map["GetTabURL"] =
2188 &TestingAutomationProvider::GetTabURLJSON;
2189 handler_map["GetTabTitle"] =
2190 &TestingAutomationProvider::GetTabTitleJSON;
2191 handler_map["GetCookies"] =
2192 &TestingAutomationProvider::GetCookiesJSON;
2193 handler_map["DeleteCookie"] =
2194 &TestingAutomationProvider::DeleteCookieJSON;
2195 handler_map["SetCookie"] =
2196 &TestingAutomationProvider::SetCookieJSON;
2197 handler_map["GetTabIds"] =
2198 &TestingAutomationProvider::GetTabIds;
2199 handler_map["IsTabIdValid"] =
2200 &TestingAutomationProvider::IsTabIdValid;
2201 handler_map["CloseTab"] =
2202 &TestingAutomationProvider::CloseTabJSON;
2203 handler_map["WebkitMouseMove"] =
2204 &TestingAutomationProvider::WebkitMouseMove;
2205 handler_map["WebkitMouseClick"] =
2206 &TestingAutomationProvider::WebkitMouseClick;
2207 handler_map["WebkitMouseDrag"] =
2208 &TestingAutomationProvider::WebkitMouseDrag;
2209 handler_map["SendWebkitKeyEvent"] =
2210 &TestingAutomationProvider::SendWebkitKeyEvent;
2211 handler_map["ActivateTab"] =
2212 &TestingAutomationProvider::ActivateTabJSON;
2121 #if defined(OS_CHROMEOS) 2213 #if defined(OS_CHROMEOS)
2122 handler_map["LoginAsGuest"] = &TestingAutomationProvider::LoginAsGuest; 2214 handler_map["LoginAsGuest"] = &TestingAutomationProvider::LoginAsGuest;
2123 handler_map["Login"] = &TestingAutomationProvider::Login; 2215 handler_map["Login"] = &TestingAutomationProvider::Login;
2124 handler_map["Logout"] = &TestingAutomationProvider::Logout; 2216 handler_map["Logout"] = &TestingAutomationProvider::Logout;
2125 handler_map["ScreenLock"] = &TestingAutomationProvider::ScreenLock; 2217 handler_map["ScreenLock"] = &TestingAutomationProvider::ScreenLock;
2126 handler_map["ScreenUnlock"] = &TestingAutomationProvider::ScreenUnlock; 2218 handler_map["ScreenUnlock"] = &TestingAutomationProvider::ScreenUnlock;
2127 #endif // defined(OS_CHROMEOS) 2219 #endif // defined(OS_CHROMEOS)
2128 2220
2129 std::map<std::string, BrowserJsonHandler> browser_handler_map; 2221 std::map<std::string, BrowserJsonHandler> browser_handler_map;
2130 browser_handler_map["DisablePlugin"] = 2222 browser_handler_map["DisablePlugin"] =
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2253 browser_handler_map["RemoveNTPMostVisitedThumbnail"] = 2345 browser_handler_map["RemoveNTPMostVisitedThumbnail"] =
2254 &TestingAutomationProvider::RemoveNTPMostVisitedThumbnail; 2346 &TestingAutomationProvider::RemoveNTPMostVisitedThumbnail;
2255 browser_handler_map["UnpinNTPMostVisitedThumbnail"] = 2347 browser_handler_map["UnpinNTPMostVisitedThumbnail"] =
2256 &TestingAutomationProvider::UnpinNTPMostVisitedThumbnail; 2348 &TestingAutomationProvider::UnpinNTPMostVisitedThumbnail;
2257 browser_handler_map["RestoreAllNTPMostVisitedThumbnails"] = 2349 browser_handler_map["RestoreAllNTPMostVisitedThumbnails"] =
2258 &TestingAutomationProvider::RestoreAllNTPMostVisitedThumbnails; 2350 &TestingAutomationProvider::RestoreAllNTPMostVisitedThumbnails;
2259 2351
2260 browser_handler_map["KillRendererProcess"] = 2352 browser_handler_map["KillRendererProcess"] =
2261 &TestingAutomationProvider::KillRendererProcess; 2353 &TestingAutomationProvider::KillRendererProcess;
2262 2354
2263 browser_handler_map["SendKeyEventToActiveTab"] =
2264 &TestingAutomationProvider::SendKeyEventToActiveTab;
2265
2266 browser_handler_map["GetNTPThumbnailMode"] = 2355 browser_handler_map["GetNTPThumbnailMode"] =
2267 &TestingAutomationProvider::GetNTPThumbnailMode; 2356 &TestingAutomationProvider::GetNTPThumbnailMode;
2268 browser_handler_map["SetNTPThumbnailMode"] = 2357 browser_handler_map["SetNTPThumbnailMode"] =
2269 &TestingAutomationProvider::SetNTPThumbnailMode; 2358 &TestingAutomationProvider::SetNTPThumbnailMode;
2270 browser_handler_map["GetNTPMenuMode"] = 2359 browser_handler_map["GetNTPMenuMode"] =
2271 &TestingAutomationProvider::GetNTPMenuMode; 2360 &TestingAutomationProvider::GetNTPMenuMode;
2272 browser_handler_map["SetNTPMenuMode"] = 2361 browser_handler_map["SetNTPMenuMode"] =
2273 &TestingAutomationProvider::SetNTPMenuMode; 2362 &TestingAutomationProvider::SetNTPMenuMode;
2274 2363
2275 browser_handler_map["WebkitMouseMove"] =
2276 &TestingAutomationProvider::WebkitMouseMove;
2277 browser_handler_map["WebkitMouseClick"] =
2278 &TestingAutomationProvider::WebkitMouseClick;
2279 browser_handler_map["WebkitMouseDrag"] =
2280 &TestingAutomationProvider::WebkitMouseDrag;
2281
2282 if (handler_map.find(std::string(command)) != handler_map.end()) { 2364 if (handler_map.find(std::string(command)) != handler_map.end()) {
2283 (this->*handler_map[command])(dict_value, reply_message); 2365 (this->*handler_map[command])(dict_value, reply_message);
2284 } else if (browser_handler_map.find(std::string(command)) != 2366 } else if (browser_handler_map.find(std::string(command)) !=
2285 browser_handler_map.end()) { 2367 browser_handler_map.end()) {
2286 Browser* browser = NULL; 2368 Browser* browser = NULL;
2287 if (!browser_tracker_->ContainsHandle(handle) || 2369 if (!browser_tracker_->ContainsHandle(handle) ||
2288 !(browser = browser_tracker_->GetResource(handle))) { 2370 !(browser = browser_tracker_->GetResource(handle))) {
2289 AutomationJSONReply(this, reply_message).SendError("No browser object."); 2371 AutomationJSONReply(this, reply_message).SendError("No browser object.");
2290 return; 2372 return;
2291 } 2373 }
(...skipping 2268 matching lines...) Expand 10 before | Expand all | Expand 10 after
4560 if (!base::OpenProcessHandle(static_cast<base::ProcessId>(pid), &process)) { 4642 if (!base::OpenProcessHandle(static_cast<base::ProcessId>(pid), &process)) {
4561 AutomationJSONReply(this, reply_message).SendError(base::StringPrintf( 4643 AutomationJSONReply(this, reply_message).SendError(base::StringPrintf(
4562 "Failed to open process handle for pid %d", pid)); 4644 "Failed to open process handle for pid %d", pid));
4563 return; 4645 return;
4564 } 4646 }
4565 new RendererProcessClosedObserver(this, reply_message); 4647 new RendererProcessClosedObserver(this, reply_message);
4566 base::KillProcess(process, 0, false); 4648 base::KillProcess(process, 0, false);
4567 base::CloseProcessHandle(process); 4649 base::CloseProcessHandle(process);
4568 } 4650 }
4569 4651
4570 void TestingAutomationProvider::SendKeyEventToActiveTab( 4652 void TestingAutomationProvider::SendWebkitKeyEvent(
4571 Browser* browser,
4572 DictionaryValue* args, 4653 DictionaryValue* args,
4573 IPC::Message* reply_message) { 4654 IPC::Message* reply_message) {
4655 TabContents* tab_contents;
4656 std::string error;
4657 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
4658 AutomationJSONReply(this, reply_message).SendError(error);
4659 return;
4660 }
4661
4574 int type, modifiers; 4662 int type, modifiers;
4575 bool is_system_key; 4663 bool is_system_key;
4576 string16 unmodified_text, text; 4664 string16 unmodified_text, text;
4577 std::string key_identifier; 4665 std::string key_identifier;
4578 NativeWebKeyboardEvent event; 4666 NativeWebKeyboardEvent event;
4579 if (!args->GetInteger("type", &type)) { 4667 if (!args->GetInteger("type", &type)) {
4580 AutomationJSONReply reply(this, reply_message); 4668 AutomationJSONReply reply(this, reply_message);
4581 reply.SendError("'type' missing or invalid."); 4669 reply.SendError("'type' missing or invalid.");
4582 return; 4670 return;
4583 } 4671 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4649 event.modifiers |= WebKit::WebInputEvent::ControlKey; 4737 event.modifiers |= WebKit::WebInputEvent::ControlKey;
4650 if (modifiers & automation::kAltKeyMask) 4738 if (modifiers & automation::kAltKeyMask)
4651 event.modifiers |= WebKit::WebInputEvent::AltKey; 4739 event.modifiers |= WebKit::WebInputEvent::AltKey;
4652 if (modifiers & automation::kMetaKeyMask) 4740 if (modifiers & automation::kMetaKeyMask)
4653 event.modifiers |= WebKit::WebInputEvent::MetaKey; 4741 event.modifiers |= WebKit::WebInputEvent::MetaKey;
4654 4742
4655 event.isSystemKey = is_system_key; 4743 event.isSystemKey = is_system_key;
4656 event.timeStampSeconds = base::Time::Now().ToDoubleT(); 4744 event.timeStampSeconds = base::Time::Now().ToDoubleT();
4657 event.skip_in_browser = true; 4745 event.skip_in_browser = true;
4658 new InputEventAckNotificationObserver(this, reply_message, event.type); 4746 new InputEventAckNotificationObserver(this, reply_message, event.type);
4659 browser->GetSelectedTabContents()->render_view_host()-> 4747 tab_contents->render_view_host()->ForwardKeyboardEvent(event);
4660 ForwardKeyboardEvent(event);
4661 } 4748 }
4662 4749
4663 // Sample JSON input: { "command": "GetNTPThumbnailMode" } 4750 // Sample JSON input: { "command": "GetNTPThumbnailMode" }
4664 // For output, refer to GetNTPThumbnailMode() in 4751 // For output, refer to GetNTPThumbnailMode() in
4665 // chrome/test/pyautolib/pyauto.py. 4752 // chrome/test/pyautolib/pyauto.py.
4666 void TestingAutomationProvider::GetNTPThumbnailMode( 4753 void TestingAutomationProvider::GetNTPThumbnailMode(
4667 Browser* browser, 4754 Browser* browser,
4668 DictionaryValue* args, 4755 DictionaryValue* args,
4669 IPC::Message* reply_message) { 4756 IPC::Message* reply_message) {
4670 const int shown_sections = ShownSectionsHandler::GetShownSections( 4757 const int shown_sections = ShownSectionsHandler::GetShownSections(
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
4795 void TestingAutomationProvider::WaitForAllTabsToStopLoading( 4882 void TestingAutomationProvider::WaitForAllTabsToStopLoading(
4796 DictionaryValue* args, 4883 DictionaryValue* args,
4797 IPC::Message* reply_message) { 4884 IPC::Message* reply_message) {
4798 new AllTabsStoppedLoadingObserver(this, reply_message); 4885 new AllTabsStoppedLoadingObserver(this, reply_message);
4799 } 4886 }
4800 4887
4801 void TestingAutomationProvider::GetIndicesFromTab( 4888 void TestingAutomationProvider::GetIndicesFromTab(
4802 DictionaryValue* args, 4889 DictionaryValue* args,
4803 IPC::Message* reply_message) { 4890 IPC::Message* reply_message) {
4804 AutomationJSONReply reply(this, reply_message); 4891 AutomationJSONReply reply(this, reply_message);
4805 int tab_handle = 0; 4892 int id_or_handle = 0;
4806 if (!args->GetInteger("tab_handle", &tab_handle) || 4893 bool has_id = args->HasKey("tab_id");
4807 !tab_tracker_->ContainsHandle(tab_handle)) { 4894 bool has_handle = args->HasKey("tab_handle");
4808 reply.SendError("'tab_handle' missing or invalid"); 4895 if (!(has_id ^ has_handle)) {
Paweł Hajdan Jr. 2011/03/05 11:44:56 Oh, that looks complicated. Why is it needed (the
kkania 2011/03/07 04:31:51 ok, i wrote it in simpler language
4896 reply.SendError("Either 'tab_id' or 'tab_handle' must be supplied");
4809 return; 4897 return;
4810 } 4898 }
4811 NavigationController* controller = tab_tracker_->GetResource(tab_handle); 4899 if (has_id && !args->GetInteger("tab_id", &id_or_handle)) {
4900 reply.SendError("'tab_id' is invalid");
4901 }
4902 if (has_handle && (!args->GetInteger("tab_handle", &id_or_handle) ||
4903 !tab_tracker_->ContainsHandle(id_or_handle))) {
4904 reply.SendError("'tab_handle' is invalid");
4905 return;
4906 }
4907 int id = id_or_handle;
4908 if (has_handle)
4909 id = tab_tracker_->GetResource(id_or_handle)->session_id().id();
4812 BrowserList::const_iterator iter = BrowserList::begin(); 4910 BrowserList::const_iterator iter = BrowserList::begin();
4813 int browser_index = 0; 4911 int browser_index = 0;
4814 for (; iter != BrowserList::end(); ++iter, ++browser_index) { 4912 for (; iter != BrowserList::end(); ++iter, ++browser_index) {
4815 Browser* browser = *iter; 4913 Browser* browser = *iter;
4816 for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) { 4914 for (int tab_index = 0; tab_index < browser->tab_count(); ++tab_index) {
4817 if (browser->GetTabContentsAt(tab_index) == controller->tab_contents()) { 4915 TabContents* tab = browser->GetTabContentsAt(tab_index);
4916 if (tab->controller().session_id().id() == id) {
4818 DictionaryValue dict; 4917 DictionaryValue dict;
4819 dict.SetInteger("windex", browser_index); 4918 dict.SetInteger("windex", browser_index);
4820 dict.SetInteger("tab_index", tab_index); 4919 dict.SetInteger("tab_index", tab_index);
4821 reply.SendSuccess(&dict); 4920 reply.SendSuccess(&dict);
4822 return; 4921 return;
4823 } 4922 }
4824 } 4923 }
4825 } 4924 }
4826 reply.SendError("Could not find tab among current browser windows"); 4925 reply.SendError("Could not find tab among current browser windows");
4827 } 4926 }
(...skipping 30 matching lines...) Expand all
4858 .SendError("Cannot locate tab or browser to navigate"); 4957 .SendError("Cannot locate tab or browser to navigate");
4859 return; 4958 return;
4860 } 4959 }
4861 new NavigationNotificationObserver( 4960 new NavigationNotificationObserver(
4862 &tab_contents->controller(), this, reply_message, 4961 &tab_contents->controller(), this, reply_message,
4863 navigation_count, false, true); 4962 navigation_count, false, true);
4864 browser->OpenURLFromTab( 4963 browser->OpenURLFromTab(
4865 tab_contents, GURL(url), GURL(), CURRENT_TAB, PageTransition::TYPED); 4964 tab_contents, GURL(url), GURL(), CURRENT_TAB, PageTransition::TYPED);
4866 } 4965 }
4867 4966
4967 void TestingAutomationProvider::ExecuteJavascriptJSON(
4968 DictionaryValue* args,
4969 IPC::Message* reply_message) {
4970 int browser_index = 0, tab_index = 0;
4971 string16 frame_xpath, javascript;
4972 if (!args->GetInteger("windex", &browser_index)) {
4973 AutomationJSONReply(this, reply_message)
4974 .SendError("'windex' missing or invalid");
4975 return;
4976 }
4977 if (!args->GetInteger("tab_index", &tab_index)) {
4978 AutomationJSONReply(this, reply_message)
4979 .SendError("'tab_index' missing or invalid");
4980 return;
4981 }
4982 if (!args->GetString("frame_xpath", &frame_xpath)) {
4983 AutomationJSONReply(this, reply_message)
4984 .SendError("'frame_xpath' missing or invalid");
4985 return;
4986 }
4987 if (!args->GetString("javascript", &javascript)) {
4988 AutomationJSONReply(this, reply_message)
4989 .SendError("'javascript' missing or invalid");
4990 return;
4991 }
4992 Browser* browser = GetBrowserAt(browser_index);
4993 TabContents* tab_contents = GetTabContentsAt(browser_index, tab_index);
4994 if (!browser || !tab_contents) {
4995 AutomationJSONReply(this, reply_message)
4996 .SendError("Cannot locate tab or browser to navigate");
4997 return;
4998 }
4999
5000 // Set the routing id of this message with the controller.
5001 // This routing id needs to be remembered for the reverse
5002 // communication while sending back the response of
5003 // this javascript execution.
5004 std::string set_automation_id;
5005 base::SStringPrintf(&set_automation_id,
5006 "window.domAutomationController.setAutomationId(%d);",
5007 reply_message->routing_id());
5008
5009 new ExecuteJavascriptObserver(this, reply_message);
5010 tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(
5011 frame_xpath, UTF8ToUTF16(set_automation_id));
5012 tab_contents->render_view_host()->ExecuteJavascriptInWebFrame(
5013 frame_xpath, javascript);
5014 }
5015
5016 void TestingAutomationProvider::GoForward(
5017 DictionaryValue* args,
5018 IPC::Message* reply_message) {
5019 TabContents* tab_contents;
5020 std::string error;
5021 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5022 AutomationJSONReply(this, reply_message).SendError(error);
5023 return;
5024 }
5025 NavigationController& controller = tab_contents->controller();
5026 if (!controller.CanGoForward()) {
5027 DictionaryValue dict;
5028 dict.SetBoolean("did_go_forward", false);
5029 AutomationJSONReply(this, reply_message).SendSuccess(&dict);
5030 return;
5031 }
5032 new NavigationNotificationObserver(&controller, this, reply_message,
5033 1, false, true);
5034 controller.GoForward();
5035 }
5036
5037 void TestingAutomationProvider::GoBack(
5038 DictionaryValue* args,
5039 IPC::Message* reply_message) {
5040 TabContents* tab_contents;
5041 std::string error;
5042 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5043 AutomationJSONReply(this, reply_message).SendError(error);
5044 return;
5045 }
5046 NavigationController& controller = tab_contents->controller();
5047 if (!controller.CanGoBack()) {
5048 DictionaryValue dict;
5049 dict.SetBoolean("did_go_back", false);
5050 AutomationJSONReply(this, reply_message).SendSuccess(&dict);
5051 return;
5052 }
5053 new NavigationNotificationObserver(&controller, this, reply_message,
5054 1, false, true);
5055 controller.GoBack();
5056 }
5057
5058 void TestingAutomationProvider::ReloadJSON(
5059 DictionaryValue* args,
5060 IPC::Message* reply_message) {
5061 TabContents* tab_contents;
5062 std::string error;
5063 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5064 AutomationJSONReply(this, reply_message).SendError(error);
5065 return;
5066 }
5067 NavigationController& controller = tab_contents->controller();
5068 new NavigationNotificationObserver(&controller, this, reply_message,
5069 1, false, true);
5070 controller.Reload(false);
5071 }
5072
5073 void TestingAutomationProvider::GetTabURLJSON(
5074 DictionaryValue* args,
5075 IPC::Message* reply_message) {
5076 AutomationJSONReply reply(this, reply_message);
5077 TabContents* tab_contents;
5078 std::string error;
5079 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5080 reply.SendError(error);
5081 return;
5082 }
5083 DictionaryValue dict;
5084 dict.SetString("url", tab_contents->GetURL().possibly_invalid_spec());
5085 reply.SendSuccess(&dict);
5086 }
5087
5088 void TestingAutomationProvider::GetTabTitleJSON(
5089 DictionaryValue* args,
5090 IPC::Message* reply_message) {
5091 AutomationJSONReply reply(this, reply_message);
5092 TabContents* tab_contents;
5093 std::string error;
5094 if (!GetTabFromJSONArgs(args, &tab_contents, &error)) {
5095 reply.SendError(error);
5096 return;
5097 }
5098 DictionaryValue dict;
5099 dict.SetString("title", tab_contents->GetTitle());
5100 reply.SendSuccess(&dict);
5101 }
5102
5103 void TestingAutomationProvider::GetCookiesJSON(
Paweł Hajdan Jr. 2011/03/05 11:44:56 I'm pretty sure this JSON cookie code duplicates s
kkania 2011/03/07 04:31:51 Yes, it does. Although really the only thing that
Paweł Hajdan Jr. 2011/03/07 21:03:39 The migration may be non-trivial, and I may have m
5104 DictionaryValue* args, IPC::Message* reply_message) {
5105 AutomationJSONReply reply(this, reply_message);
5106 Browser* browser;
5107 std::string error;
5108 if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
5109 reply.SendError(error);
5110 return;
5111 }
5112 std::string url;
5113 if (!args->GetString("url", &url)) {
5114 AutomationJSONReply(this, reply_message)
5115 .SendError("'url' missing or invalid");
5116 return;
5117 }
5118
5119 // Since we are running on the UI thread don't call GetURLRequestContext().
5120 scoped_refptr<URLRequestContextGetter> context_getter =
5121 browser->profile()->GetRequestContext();
5122
5123 std::string cookies;
5124 base::WaitableEvent event(true /* manual reset */,
5125 false /* not initially signaled */);
5126 Task* task = NewRunnableFunction(
5127 &GetCookiesOnIOThread,
5128 GURL(url), context_getter, &event, &cookies);
5129 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) {
5130 reply.SendError("Couldn't post task to get the cookies");
5131 return;
5132 }
5133 event.Wait();
5134
5135 DictionaryValue dict;
5136 dict.SetString("cookies", cookies);
5137 reply.SendSuccess(&dict);
5138 }
5139
5140 void TestingAutomationProvider::DeleteCookieJSON(
5141 DictionaryValue* args, IPC::Message* reply_message) {
5142 AutomationJSONReply reply(this, reply_message);
5143 Browser* browser;
5144 std::string error;
5145 if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
5146 reply.SendError(error);
5147 return;
5148 }
5149 std::string url, name;
5150 if (!args->GetString("url", &url)) {
5151 AutomationJSONReply(this, reply_message)
5152 .SendError("'url' missing or invalid");
5153 return;
5154 }
5155 if (!args->GetString("name", &name)) {
5156 AutomationJSONReply(this, reply_message)
5157 .SendError("'name' missing or invalid");
5158 return;
5159 }
5160
5161 // Since we are running on the UI thread don't call GetURLRequestContext().
5162 scoped_refptr<URLRequestContextGetter> context_getter =
5163 browser->profile()->GetRequestContext();
5164
5165 base::WaitableEvent event(true /* manual reset */,
5166 false /* not initially signaled */);
5167 Task* task = NewRunnableFunction(
5168 &DeleteCookieOnIOThread,
5169 GURL(url), name, context_getter, &event);
5170 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) {
5171 reply.SendError("Couldn't post task to delete the cookie");
5172 return;
5173 }
5174 event.Wait();
5175 reply.SendSuccess(NULL);
5176 }
5177
5178 void TestingAutomationProvider::SetCookieJSON(
5179 DictionaryValue* args, IPC::Message* reply_message) {
5180 AutomationJSONReply reply(this, reply_message);
5181 Browser* browser;
5182 std::string error;
5183 if (!GetBrowserFromJSONArgs(args, &browser, &error)) {
5184 reply.SendError(error);
5185 return;
5186 }
5187 std::string url, cookie;
5188 if (!args->GetString("url", &url)) {
5189 AutomationJSONReply(this, reply_message)
5190 .SendError("'url' missing or invalid");
5191 return;
5192 }
5193 if (!args->GetString("cookie", &cookie)) {
5194 AutomationJSONReply(this, reply_message)
5195 .SendError("'cookie' missing or invalid");
5196 return;
5197 }
5198
5199 // Since we are running on the UI thread don't call GetURLRequestContext().
5200 scoped_refptr<URLRequestContextGetter> context_getter =
5201 browser->profile()->GetRequestContext();
5202
5203 base::WaitableEvent event(true /* manual reset */,
5204 false /* not initially signaled */);
5205 bool success = false;
5206 Task* task = NewRunnableFunction(
5207 &SetCookieOnIOThread,
5208 GURL(url), cookie, context_getter, &event, &success);
5209 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) {
5210 reply.SendError("Couldn't post task to set the cookie");
5211 return;
5212 }
5213 event.Wait();
5214
5215 if (!success) {
5216 reply.SendError("Could not set the cookie");
5217 return;
5218 }
5219 reply.SendSuccess(NULL);
5220 }
5221
5222 void TestingAutomationProvider::GetTabIds(
5223 DictionaryValue* args, IPC::Message* reply_message) {
5224 ListValue* id_list = new ListValue();
5225 BrowserList::const_iterator iter = BrowserList::begin();
5226 for (; iter != BrowserList::end(); ++iter) {
5227 Browser* browser = *iter;
5228 for (int i = 0; i < browser->tab_count(); ++i) {
5229 int id = browser->GetTabContentsAt(i)->controller().session_id().id();
5230 id_list->Append(Value::CreateIntegerValue(id));
5231 }
5232 }
5233 DictionaryValue dict;
5234 dict.Set("ids", id_list);
5235 AutomationJSONReply(this, reply_message).SendSuccess(&dict);
5236 }
5237
5238 void TestingAutomationProvider::IsTabIdValid(
5239 DictionaryValue* args, IPC::Message* reply_message) {
5240 AutomationJSONReply reply(this, reply_message);
5241 int id;
5242 if (!args->GetInteger("id", &id)) {
5243 reply.SendError("'id' missing or invalid");
5244 return;
5245 }
5246 bool is_valid = false;
5247 BrowserList::const_iterator iter = BrowserList::begin();
5248 for (; iter != BrowserList::end(); ++iter) {
5249 Browser* browser = *iter;
5250 for (int i = 0; i < browser->tab_count(); ++i) {
5251 TabContents* tab = browser->GetTabContentsAt(i);
5252 if (tab->controller().session_id().id() == id) {
5253 is_valid = true;
5254 break;
5255 }
5256 }
5257 }
5258 DictionaryValue dict;
5259 dict.SetBoolean("is_valid", is_valid);
5260 reply.SendSuccess(&dict);
5261 }
5262
5263 void TestingAutomationProvider::CloseTabJSON(
5264 DictionaryValue* args, IPC::Message* reply_message) {
5265 AutomationJSONReply reply(this, reply_message);
5266 Browser* browser;
5267 TabContents* tab_contents;
5268 std::string error;
5269 if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab_contents, &error)) {
5270 reply.SendError(error);
5271 return;
5272 }
5273 browser->CloseTabContents(tab_contents);
5274 reply.SendSuccess(NULL);
5275 }
5276
5277 void TestingAutomationProvider::ActivateTabJSON(
5278 DictionaryValue* args,
5279 IPC::Message* reply_message) {
5280 AutomationJSONReply reply(this, reply_message);
5281 Browser* browser;
5282 TabContents* tab_contents;
5283 std::string error;
5284 if (!GetBrowserAndTabFromJSONArgs(args, &browser, &tab_contents, &error)) {
5285 reply.SendError(error);
5286 return;
5287 }
5288 browser->SelectTabContentsAt(
5289 browser->GetIndexOfController(&tab_contents->controller()), true);
5290 reply.SendSuccess(NULL);
5291 }
5292
4868 void TestingAutomationProvider::WaitForTabCountToBecome( 5293 void TestingAutomationProvider::WaitForTabCountToBecome(
4869 int browser_handle, 5294 int browser_handle,
4870 int target_tab_count, 5295 int target_tab_count,
4871 IPC::Message* reply_message) { 5296 IPC::Message* reply_message) {
4872 if (!browser_tracker_->ContainsHandle(browser_handle)) { 5297 if (!browser_tracker_->ContainsHandle(browser_handle)) {
4873 AutomationMsg_WaitForTabCountToBecome::WriteReplyParams(reply_message, 5298 AutomationMsg_WaitForTabCountToBecome::WriteReplyParams(reply_message,
4874 false); 5299 false);
4875 Send(reply_message); 5300 Send(reply_message);
4876 return; 5301 return;
4877 } 5302 }
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
5023 // If you change this, update Observer for NotificationType::SESSION_END 5448 // If you change this, update Observer for NotificationType::SESSION_END
5024 // below. 5449 // below.
5025 MessageLoop::current()->PostTask(FROM_HERE, 5450 MessageLoop::current()->PostTask(FROM_HERE,
5026 NewRunnableMethod(this, &TestingAutomationProvider::OnRemoveProvider)); 5451 NewRunnableMethod(this, &TestingAutomationProvider::OnRemoveProvider));
5027 } 5452 }
5028 } 5453 }
5029 5454
5030 void TestingAutomationProvider::OnRemoveProvider() { 5455 void TestingAutomationProvider::OnRemoveProvider() {
5031 AutomationProviderList::GetInstance()->RemoveProvider(this); 5456 AutomationProviderList::GetInstance()->RemoveProvider(this);
5032 } 5457 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698