OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "app/message_box_flags.h" | 7 #include "app/message_box_flags.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 CloseBrowserAsync) | 210 CloseBrowserAsync) |
211 IPC_MESSAGE_HANDLER(AutomationMsg_ActivateTab, ActivateTab) | 211 IPC_MESSAGE_HANDLER(AutomationMsg_ActivateTab, ActivateTab) |
212 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_AppendTab, AppendTab) | 212 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_AppendTab, AppendTab) |
213 IPC_MESSAGE_HANDLER(AutomationMsg_ActiveTabIndex, GetActiveTabIndex) | 213 IPC_MESSAGE_HANDLER(AutomationMsg_ActiveTabIndex, GetActiveTabIndex) |
214 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CloseTab, CloseTab) | 214 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CloseTab, CloseTab) |
215 IPC_MESSAGE_HANDLER(AutomationMsg_GetCookies, GetCookies) | 215 IPC_MESSAGE_HANDLER(AutomationMsg_GetCookies, GetCookies) |
216 IPC_MESSAGE_HANDLER(AutomationMsg_SetCookie, SetCookie) | 216 IPC_MESSAGE_HANDLER(AutomationMsg_SetCookie, SetCookie) |
217 IPC_MESSAGE_HANDLER(AutomationMsg_DeleteCookie, DeleteCookie) | 217 IPC_MESSAGE_HANDLER(AutomationMsg_DeleteCookie, DeleteCookie) |
218 IPC_MESSAGE_HANDLER(AutomationMsg_ShowCollectedCookiesDialog, | 218 IPC_MESSAGE_HANDLER(AutomationMsg_ShowCollectedCookiesDialog, |
219 ShowCollectedCookiesDialog) | 219 ShowCollectedCookiesDialog) |
220 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_NavigateToURL, NavigateToURL) | |
221 IPC_MESSAGE_HANDLER_DELAY_REPLY( | 220 IPC_MESSAGE_HANDLER_DELAY_REPLY( |
222 AutomationMsg_NavigateToURLBlockUntilNavigationsComplete, | 221 AutomationMsg_NavigateToURLBlockUntilNavigationsComplete, |
223 NavigateToURLBlockUntilNavigationsComplete) | 222 NavigateToURLBlockUntilNavigationsComplete) |
224 IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsync, NavigationAsync) | 223 IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsync, NavigationAsync) |
225 IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsyncWithDisposition, | 224 IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsyncWithDisposition, |
226 NavigationAsyncWithDisposition) | 225 NavigationAsyncWithDisposition) |
227 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_GoBack, GoBack) | |
228 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_GoForward, GoForward) | |
229 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Reload, Reload) | 226 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Reload, Reload) |
230 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_SetAuth, SetAuth) | 227 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_SetAuth, SetAuth) |
231 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CancelAuth, CancelAuth) | 228 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CancelAuth, CancelAuth) |
232 IPC_MESSAGE_HANDLER(AutomationMsg_NeedsAuth, NeedsAuth) | 229 IPC_MESSAGE_HANDLER(AutomationMsg_NeedsAuth, NeedsAuth) |
233 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_RedirectsFrom, | 230 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_RedirectsFrom, |
234 GetRedirectsFrom) | 231 GetRedirectsFrom) |
235 IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindowCount, GetBrowserWindowCount) | 232 IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindowCount, GetBrowserWindowCount) |
236 IPC_MESSAGE_HANDLER(AutomationMsg_NormalBrowserWindowCount, | 233 IPC_MESSAGE_HANDLER(AutomationMsg_NormalBrowserWindowCount, |
237 GetNormalBrowserWindowCount) | 234 GetNormalBrowserWindowCount) |
238 IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindow, GetBrowserWindow) | 235 IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindow, GetBrowserWindow) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditGetText, | 270 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditGetText, |
274 GetAutocompleteEditText) | 271 GetAutocompleteEditText) |
275 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditSetText, | 272 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditSetText, |
276 SetAutocompleteEditText) | 273 SetAutocompleteEditText) |
277 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditIsQueryInProgress, | 274 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditIsQueryInProgress, |
278 AutocompleteEditIsQueryInProgress) | 275 AutocompleteEditIsQueryInProgress) |
279 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditGetMatches, | 276 IPC_MESSAGE_HANDLER(AutomationMsg_AutocompleteEditGetMatches, |
280 AutocompleteEditGetMatches) | 277 AutocompleteEditGetMatches) |
281 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForAutocompleteEditFocus, | 278 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForAutocompleteEditFocus, |
282 WaitForAutocompleteEditFocus) | 279 WaitForAutocompleteEditFocus) |
283 IPC_MESSAGE_HANDLER(AutomationMsg_ApplyAccelerator, ApplyAccelerator) | |
284 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_DomOperation, | 280 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_DomOperation, |
285 ExecuteJavascript) | 281 ExecuteJavascript) |
286 IPC_MESSAGE_HANDLER(AutomationMsg_ConstrainedWindowCount, | 282 IPC_MESSAGE_HANDLER(AutomationMsg_ConstrainedWindowCount, |
287 GetConstrainedWindowCount) | 283 GetConstrainedWindowCount) |
288 #if defined(TOOLKIT_VIEWS) | 284 #if defined(TOOLKIT_VIEWS) |
289 IPC_MESSAGE_HANDLER(AutomationMsg_GetFocusedViewID, GetFocusedViewID) | 285 IPC_MESSAGE_HANDLER(AutomationMsg_GetFocusedViewID, GetFocusedViewID) |
290 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForFocusedViewIDToChange, | 286 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForFocusedViewIDToChange, |
291 WaitForFocusedViewIDToChange) | 287 WaitForFocusedViewIDToChange) |
292 IPC_MESSAGE_HANDLER(AutomationMsg_StartTrackingPopupMenus, | 288 IPC_MESSAGE_HANDLER(AutomationMsg_StartTrackingPopupMenus, |
293 StartTrackingPopupMenus) | 289 StartTrackingPopupMenus) |
294 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForPopupMenuToOpen, | 290 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForPopupMenuToOpen, |
295 WaitForPopupMenuToOpen) | 291 WaitForPopupMenuToOpen) |
296 #endif // defined(TOOLKIT_VIEWS) | 292 #endif // defined(TOOLKIT_VIEWS) |
297 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_InspectElement, | 293 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_InspectElement, |
298 HandleInspectElementRequest) | 294 HandleInspectElementRequest) |
299 IPC_MESSAGE_HANDLER(AutomationMsg_DownloadDirectory, GetDownloadDirectory) | 295 IPC_MESSAGE_HANDLER(AutomationMsg_DownloadDirectory, GetDownloadDirectory) |
300 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_OpenNewBrowserWindow, | |
301 OpenNewBrowserWindow) | |
302 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_OpenNewBrowserWindowOfType, | 296 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_OpenNewBrowserWindowOfType, |
303 OpenNewBrowserWindowOfType) | 297 OpenNewBrowserWindowOfType) |
304 IPC_MESSAGE_HANDLER(AutomationMsg_WindowForBrowser, GetWindowForBrowser) | 298 IPC_MESSAGE_HANDLER(AutomationMsg_WindowForBrowser, GetWindowForBrowser) |
305 IPC_MESSAGE_HANDLER(AutomationMsg_BrowserForWindow, GetBrowserForWindow) | 299 IPC_MESSAGE_HANDLER(AutomationMsg_BrowserForWindow, GetBrowserForWindow) |
306 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_ShowInterstitialPage, | 300 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_ShowInterstitialPage, |
307 ShowInterstitialPage) | 301 ShowInterstitialPage) |
308 IPC_MESSAGE_HANDLER(AutomationMsg_HideInterstitialPage, | 302 IPC_MESSAGE_HANDLER(AutomationMsg_HideInterstitialPage, |
309 HideInterstitialPage) | 303 HideInterstitialPage) |
310 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForTabToBeRestored, | 304 IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForTabToBeRestored, |
311 WaitForTabToBeRestored) | 305 WaitForTabToBeRestored) |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 int handle, bool* success) { | 555 int handle, bool* success) { |
562 *success = false; | 556 *success = false; |
563 if (tab_tracker_->ContainsHandle(handle)) { | 557 if (tab_tracker_->ContainsHandle(handle)) { |
564 TabContents* tab_contents = | 558 TabContents* tab_contents = |
565 tab_tracker_->GetResource(handle)->tab_contents(); | 559 tab_tracker_->GetResource(handle)->tab_contents(); |
566 tab_contents->delegate()->ShowCollectedCookiesDialog(tab_contents); | 560 tab_contents->delegate()->ShowCollectedCookiesDialog(tab_contents); |
567 *success = true; | 561 *success = true; |
568 } | 562 } |
569 } | 563 } |
570 | 564 |
571 void TestingAutomationProvider::NavigateToURL(int handle, | |
572 const GURL& url, | |
573 IPC::Message* reply_message) { | |
574 NavigateToURLBlockUntilNavigationsComplete(handle, url, 1, reply_message); | |
575 } | |
576 | |
577 void TestingAutomationProvider::NavigateToURLBlockUntilNavigationsComplete( | 565 void TestingAutomationProvider::NavigateToURLBlockUntilNavigationsComplete( |
578 int handle, const GURL& url, int number_of_navigations, | 566 int handle, const GURL& url, int number_of_navigations, |
579 IPC::Message* reply_message) { | 567 IPC::Message* reply_message) { |
580 if (tab_tracker_->ContainsHandle(handle)) { | 568 if (tab_tracker_->ContainsHandle(handle)) { |
581 NavigationController* tab = tab_tracker_->GetResource(handle); | 569 NavigationController* tab = tab_tracker_->GetResource(handle); |
582 | 570 |
583 // Simulate what a user would do. Activate the tab and then navigate. | 571 // Simulate what a user would do. Activate the tab and then navigate. |
584 // We could allow navigating in a background tab in future. | 572 // We could allow navigating in a background tab in future. |
585 Browser* browser = FindAndActivateTab(tab); | 573 Browser* browser = FindAndActivateTab(tab); |
586 | 574 |
587 if (browser) { | 575 if (browser) { |
588 AddNavigationStatusListener(tab, reply_message, number_of_navigations, | 576 AddNavigationStatusListener(tab, reply_message, number_of_navigations, |
589 false); | 577 false); |
590 | 578 |
591 // TODO(darin): avoid conversion to GURL. | 579 // TODO(darin): avoid conversion to GURL. |
592 browser->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::TYPED); | 580 browser->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
593 return; | 581 return; |
594 } | 582 } |
595 } | 583 } |
596 | 584 |
597 AutomationMsg_NavigateToURL::WriteReplyParams( | 585 AutomationMsg_NavigateToURLBlockUntilNavigationsComplete::WriteReplyParams( |
598 reply_message, AUTOMATION_MSG_NAVIGATION_ERROR); | 586 reply_message, AUTOMATION_MSG_NAVIGATION_ERROR); |
599 Send(reply_message); | 587 Send(reply_message); |
600 } | 588 } |
601 | 589 |
602 void TestingAutomationProvider::NavigationAsync(int handle, | 590 void TestingAutomationProvider::NavigationAsync(int handle, |
603 const GURL& url, | 591 const GURL& url, |
604 bool* status) { | 592 bool* status) { |
605 NavigationAsyncWithDisposition(handle, url, CURRENT_TAB, status); | 593 NavigationAsyncWithDisposition(handle, url, CURRENT_TAB, status); |
606 } | 594 } |
607 | 595 |
(...skipping 13 matching lines...) Expand all Loading... |
621 | 609 |
622 if (browser) { | 610 if (browser) { |
623 // Don't add any listener unless a callback mechanism is desired. | 611 // Don't add any listener unless a callback mechanism is desired. |
624 // TODO(vibhor): Do this if such a requirement arises in future. | 612 // TODO(vibhor): Do this if such a requirement arises in future. |
625 browser->OpenURL(url, GURL(), disposition, PageTransition::TYPED); | 613 browser->OpenURL(url, GURL(), disposition, PageTransition::TYPED); |
626 *status = true; | 614 *status = true; |
627 } | 615 } |
628 } | 616 } |
629 } | 617 } |
630 | 618 |
631 void TestingAutomationProvider::GoBack(int handle, | |
632 IPC::Message* reply_message) { | |
633 if (tab_tracker_->ContainsHandle(handle)) { | |
634 NavigationController* tab = tab_tracker_->GetResource(handle); | |
635 Browser* browser = FindAndActivateTab(tab); | |
636 if (browser && browser->command_updater()->IsCommandEnabled(IDC_BACK)) { | |
637 AddNavigationStatusListener(tab, reply_message, 1, false); | |
638 browser->GoBack(CURRENT_TAB); | |
639 return; | |
640 } | |
641 } | |
642 | |
643 AutomationMsg_GoBack::WriteReplyParams( | |
644 reply_message, AUTOMATION_MSG_NAVIGATION_ERROR); | |
645 Send(reply_message); | |
646 } | |
647 | |
648 void TestingAutomationProvider::GoForward(int handle, | |
649 IPC::Message* reply_message) { | |
650 if (tab_tracker_->ContainsHandle(handle)) { | |
651 NavigationController* tab = tab_tracker_->GetResource(handle); | |
652 Browser* browser = FindAndActivateTab(tab); | |
653 if (browser && browser->command_updater()->IsCommandEnabled(IDC_FORWARD)) { | |
654 AddNavigationStatusListener(tab, reply_message, 1, false); | |
655 browser->GoForward(CURRENT_TAB); | |
656 return; | |
657 } | |
658 } | |
659 | |
660 AutomationMsg_GoForward::WriteReplyParams( | |
661 reply_message, AUTOMATION_MSG_NAVIGATION_ERROR); | |
662 Send(reply_message); | |
663 } | |
664 | |
665 void TestingAutomationProvider::Reload(int handle, | 619 void TestingAutomationProvider::Reload(int handle, |
666 IPC::Message* reply_message) { | 620 IPC::Message* reply_message) { |
667 if (tab_tracker_->ContainsHandle(handle)) { | 621 if (tab_tracker_->ContainsHandle(handle)) { |
668 NavigationController* tab = tab_tracker_->GetResource(handle); | 622 NavigationController* tab = tab_tracker_->GetResource(handle); |
669 Browser* browser = FindAndActivateTab(tab); | 623 Browser* browser = FindAndActivateTab(tab); |
670 if (browser && browser->command_updater()->IsCommandEnabled(IDC_RELOAD)) { | 624 if (browser && browser->command_updater()->IsCommandEnabled(IDC_RELOAD)) { |
671 AddNavigationStatusListener(tab, reply_message, 1, false); | 625 AddNavigationStatusListener(tab, reply_message, 1, false); |
672 browser->Reload(CURRENT_TAB); | 626 browser->Reload(CURRENT_TAB); |
673 return; | 627 return; |
674 } | 628 } |
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 bool* query_in_progress) { | 1094 bool* query_in_progress) { |
1141 *success = false; | 1095 *success = false; |
1142 *query_in_progress = false; | 1096 *query_in_progress = false; |
1143 if (autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) { | 1097 if (autocomplete_edit_tracker_->ContainsHandle(autocomplete_edit_handle)) { |
1144 *query_in_progress = autocomplete_edit_tracker_-> | 1098 *query_in_progress = autocomplete_edit_tracker_-> |
1145 GetResource(autocomplete_edit_handle)->model()->query_in_progress(); | 1099 GetResource(autocomplete_edit_handle)->model()->query_in_progress(); |
1146 *success = true; | 1100 *success = true; |
1147 } | 1101 } |
1148 } | 1102 } |
1149 | 1103 |
1150 void TestingAutomationProvider::ApplyAccelerator(int handle, int id) { | |
1151 LOG(ERROR) << "ApplyAccelerator has been deprecated. " | |
1152 << "Please use ExecuteBrowserCommandAsync instead."; | |
1153 } | |
1154 | |
1155 void TestingAutomationProvider::ExecuteJavascript( | 1104 void TestingAutomationProvider::ExecuteJavascript( |
1156 int handle, | 1105 int handle, |
1157 const std::wstring& frame_xpath, | 1106 const std::wstring& frame_xpath, |
1158 const std::wstring& script, | 1107 const std::wstring& script, |
1159 IPC::Message* reply_message) { | 1108 IPC::Message* reply_message) { |
1160 TabContents* tab_contents = GetTabContentsForHandle(handle, NULL); | 1109 TabContents* tab_contents = GetTabContentsForHandle(handle, NULL); |
1161 if (!tab_contents) { | 1110 if (!tab_contents) { |
1162 AutomationMsg_DomOperation::WriteReplyParams(reply_message, std::string()); | 1111 AutomationMsg_DomOperation::WriteReplyParams(reply_message, std::string()); |
1163 Send(reply_message); | 1112 Send(reply_message); |
1164 return; | 1113 return; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 | 1159 |
1211 void TestingAutomationProvider::GetDownloadDirectory( | 1160 void TestingAutomationProvider::GetDownloadDirectory( |
1212 int handle, FilePath* download_directory) { | 1161 int handle, FilePath* download_directory) { |
1213 if (tab_tracker_->ContainsHandle(handle)) { | 1162 if (tab_tracker_->ContainsHandle(handle)) { |
1214 NavigationController* tab = tab_tracker_->GetResource(handle); | 1163 NavigationController* tab = tab_tracker_->GetResource(handle); |
1215 DownloadManager* dlm = tab->profile()->GetDownloadManager(); | 1164 DownloadManager* dlm = tab->profile()->GetDownloadManager(); |
1216 *download_directory = dlm->download_prefs()->download_path(); | 1165 *download_directory = dlm->download_prefs()->download_path(); |
1217 } | 1166 } |
1218 } | 1167 } |
1219 | 1168 |
1220 void TestingAutomationProvider::OpenNewBrowserWindow( | |
1221 bool show, IPC::Message* reply_message) { | |
1222 OpenNewBrowserWindowOfType(static_cast<int>(Browser::TYPE_NORMAL), show, | |
1223 reply_message); | |
1224 } | |
1225 | |
1226 void TestingAutomationProvider::OpenNewBrowserWindowOfType( | 1169 void TestingAutomationProvider::OpenNewBrowserWindowOfType( |
1227 int type, bool show, IPC::Message* reply_message) { | 1170 int type, bool show, IPC::Message* reply_message) { |
1228 new BrowserOpenedNotificationObserver(this, reply_message); | 1171 new BrowserOpenedNotificationObserver(this, reply_message); |
1229 // We may have no current browser windows open so don't rely on | 1172 // We may have no current browser windows open so don't rely on |
1230 // asking an existing browser to execute the IDC_NEWWINDOW command | 1173 // asking an existing browser to execute the IDC_NEWWINDOW command |
1231 Browser* browser = new Browser(static_cast<Browser::Type>(type), profile_); | 1174 Browser* browser = new Browser(static_cast<Browser::Type>(type), profile_); |
1232 browser->CreateBrowserWindow(); | 1175 browser->CreateBrowserWindow(); |
1233 browser->AddBlankTab(true); | 1176 browser->AddBlankTab(true); |
1234 if (show) | 1177 if (show) |
1235 browser->window()->Show(); | 1178 browser->window()->Show(); |
(...skipping 3287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4523 // If you change this, update Observer for NotificationType::SESSION_END | 4466 // If you change this, update Observer for NotificationType::SESSION_END |
4524 // below. | 4467 // below. |
4525 MessageLoop::current()->PostTask(FROM_HERE, | 4468 MessageLoop::current()->PostTask(FROM_HERE, |
4526 NewRunnableMethod(this, &TestingAutomationProvider::OnRemoveProvider)); | 4469 NewRunnableMethod(this, &TestingAutomationProvider::OnRemoveProvider)); |
4527 } | 4470 } |
4528 } | 4471 } |
4529 | 4472 |
4530 void TestingAutomationProvider::OnRemoveProvider() { | 4473 void TestingAutomationProvider::OnRemoveProvider() { |
4531 AutomationProviderList::GetInstance()->RemoveProvider(this); | 4474 AutomationProviderList::GetInstance()->RemoveProvider(this); |
4532 } | 4475 } |
OLD | NEW |