OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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/automation_provider.h" | 5 #include "chrome/browser/automation/automation_provider.h" |
6 | 6 |
7 #include "base/path_service.h" | 7 #include "base/path_service.h" |
8 #include "chrome/app/chrome_dll_resource.h" | 8 #include "chrome/app/chrome_dll_resource.h" |
9 #include "chrome/browser/automation/automation_provider_list.h" | 9 #include "chrome/browser/automation/automation_provider_list.h" |
10 #include "chrome/browser/automation/ui_controls.h" | 10 #include "chrome/browser/automation/ui_controls.h" |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 int32 routing_id_; | 403 int32 routing_id_; |
404 }; | 404 }; |
405 | 405 |
406 class FindInPageNotificationObserver : public NotificationObserver { | 406 class FindInPageNotificationObserver : public NotificationObserver { |
407 public: | 407 public: |
408 FindInPageNotificationObserver(AutomationProvider* automation, | 408 FindInPageNotificationObserver(AutomationProvider* automation, |
409 TabContents* parent_tab, | 409 TabContents* parent_tab, |
410 int32 routing_id) | 410 int32 routing_id) |
411 : automation_(automation), | 411 : automation_(automation), |
412 parent_tab_(parent_tab), | 412 parent_tab_(parent_tab), |
413 routing_id_(routing_id) { | 413 routing_id_(routing_id), |
| 414 active_match_ordinal_(-1) { |
414 NotificationService::current()-> | 415 NotificationService::current()-> |
415 AddObserver(this, NOTIFY_FIND_RESULT_AVAILABLE, | 416 AddObserver(this, NOTIFY_FIND_RESULT_AVAILABLE, |
416 Source<TabContents>(parent_tab_)); | 417 Source<TabContents>(parent_tab_)); |
417 } | 418 } |
418 | 419 |
419 ~FindInPageNotificationObserver() { | 420 ~FindInPageNotificationObserver() { |
420 Unregister(); | 421 Unregister(); |
421 } | 422 } |
422 | 423 |
423 void Unregister() { | 424 void Unregister() { |
424 NotificationService::current()-> | 425 NotificationService::current()-> |
425 RemoveObserver(this, NOTIFY_FIND_RESULT_AVAILABLE, | 426 RemoveObserver(this, NOTIFY_FIND_RESULT_AVAILABLE, |
426 Source<TabContents>(parent_tab_)); | 427 Source<TabContents>(parent_tab_)); |
427 } | 428 } |
428 | 429 |
429 virtual void Observe(NotificationType type, const NotificationSource& source, | 430 virtual void Observe(NotificationType type, const NotificationSource& source, |
430 const NotificationDetails& details) { | 431 const NotificationDetails& details) { |
431 if (type == NOTIFY_FIND_RESULT_AVAILABLE) { | 432 if (type == NOTIFY_FIND_RESULT_AVAILABLE) { |
432 Details<FindNotificationDetails> find_details(details); | 433 Details<FindNotificationDetails> find_details(details); |
433 if (find_details->request_id() == kFindInPageRequestId) { | 434 if (find_details->request_id() == kFindInPageRequestId) { |
| 435 // We get multiple responses and one of those will contain the ordinal. |
| 436 // This message comes to us before the final update is sent. |
| 437 if (find_details->active_match_ordinal() > -1) |
| 438 active_match_ordinal_ = find_details->active_match_ordinal(); |
434 if (find_details->final_update()) { | 439 if (find_details->final_update()) { |
435 automation_->Send(new AutomationMsg_FindInPageResponse(routing_id_, | 440 automation_->Send(new AutomationMsg_FindInPageResponse2(routing_id_, |
| 441 active_match_ordinal_, |
436 find_details->number_of_matches())); | 442 find_details->number_of_matches())); |
437 } else { | 443 } else { |
438 DLOG(INFO) << "Ignoring, since we only care about the final message"; | 444 DLOG(INFO) << "Ignoring, since we only care about the final message"; |
439 } | 445 } |
440 } | 446 } |
441 } else { | 447 } else { |
442 NOTREACHED(); | 448 NOTREACHED(); |
443 } | 449 } |
444 } | 450 } |
445 | 451 |
446 // The Find mechanism is over asynchronous IPC, so a search is kicked off and | 452 // The Find mechanism is over asynchronous IPC, so a search is kicked off and |
447 // we wait for notification to find out what the results are. As the user is | 453 // we wait for notification to find out what the results are. As the user is |
448 // typing, new search requests can be issued and the Request ID helps us make | 454 // typing, new search requests can be issued and the Request ID helps us make |
449 // sense of whether this is the current request or an old one. The unit tests, | 455 // sense of whether this is the current request or an old one. The unit tests, |
450 // however, which uses this constant issues only one search at a time, so we | 456 // however, which uses this constant issues only one search at a time, so we |
451 // don't need a rolling id to identify each search. But, we still need to | 457 // don't need a rolling id to identify each search. But, we still need to |
452 // specify one, so we just use a fixed one - its value does not matter. | 458 // specify one, so we just use a fixed one - its value does not matter. |
453 static const int kFindInPageRequestId; | 459 static const int kFindInPageRequestId; |
454 private: | 460 private: |
455 AutomationProvider* automation_; | 461 AutomationProvider* automation_; |
456 TabContents* parent_tab_; | 462 TabContents* parent_tab_; |
457 int32 routing_id_; | 463 int32 routing_id_; |
| 464 // We will at some point (before final update) be notified of the ordinal and |
| 465 // we need to preserve it so we can send it later. |
| 466 int active_match_ordinal_; |
458 }; | 467 }; |
459 | 468 |
460 const int FindInPageNotificationObserver::kFindInPageRequestId = -1; | 469 const int FindInPageNotificationObserver::kFindInPageRequestId = -1; |
461 | 470 |
462 class DomOperationNotificationObserver : public NotificationObserver { | 471 class DomOperationNotificationObserver : public NotificationObserver { |
463 public: | 472 public: |
464 explicit DomOperationNotificationObserver(AutomationProvider* automation) | 473 explicit DomOperationNotificationObserver(AutomationProvider* automation) |
465 : automation_(automation) { | 474 : automation_(automation) { |
466 NotificationService::current()-> | 475 NotificationService::current()-> |
467 AddObserver(this, NOTIFY_DOM_OPERATION_RESPONSE, | 476 AddObserver(this, NOTIFY_DOM_OPERATION_RESPONSE, |
(...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1705 | 1714 |
1706 Send(new AutomationMsg_ConstrainedWindowBoundsResponse(message.routing_id(), | 1715 Send(new AutomationMsg_ConstrainedWindowBoundsResponse(message.routing_id(), |
1707 exists, rect)); | 1716 exists, rect)); |
1708 } | 1717 } |
1709 | 1718 |
1710 void AutomationProvider::HandleFindInPageRequest( | 1719 void AutomationProvider::HandleFindInPageRequest( |
1711 const IPC::Message& message, int handle, const std::wstring& find_request, | 1720 const IPC::Message& message, int handle, const std::wstring& find_request, |
1712 int forward, int match_case) { | 1721 int forward, int match_case) { |
1713 NOTREACHED() << "This function has been deprecated." | 1722 NOTREACHED() << "This function has been deprecated." |
1714 << "Please use HandleFindRequest instead."; | 1723 << "Please use HandleFindRequest instead."; |
1715 Send(new AutomationMsg_FindInPageResponse(message.routing_id(), -1)); | 1724 Send(new AutomationMsg_FindInPageResponse2(message.routing_id(), -1, -1)); |
1716 return; | 1725 return; |
1717 } | 1726 } |
1718 | 1727 |
1719 void AutomationProvider::HandleFindRequest(const IPC::Message& message, | 1728 void AutomationProvider::HandleFindRequest(const IPC::Message& message, |
1720 int handle, const FindInPageRequest& request) { | 1729 int handle, const FindInPageRequest& request) { |
1721 if (!tab_tracker_->ContainsHandle(handle)) { | 1730 if (!tab_tracker_->ContainsHandle(handle)) { |
1722 Send(new AutomationMsg_FindInPageResponse(message.routing_id(), -1)); | 1731 Send(new AutomationMsg_FindInPageResponse2(message.routing_id(), -1, -1)); |
1723 return; | 1732 return; |
1724 } | 1733 } |
1725 | 1734 |
1726 NavigationController* nav = tab_tracker_->GetResource(handle); | 1735 NavigationController* nav = tab_tracker_->GetResource(handle); |
1727 TabContents* tab_contents = nav->active_contents(); | 1736 TabContents* tab_contents = nav->active_contents(); |
1728 | 1737 |
1729 find_in_page_observer_.reset(new | 1738 find_in_page_observer_.reset(new |
1730 FindInPageNotificationObserver(this, tab_contents, message.routing_id())); | 1739 FindInPageNotificationObserver(this, tab_contents, message.routing_id())); |
1731 | 1740 |
1732 // The find in page dialog must be up for us to get the notification that the | 1741 // The find in page dialog must be up for us to get the notification that the |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2438 int value) { | 2447 int value) { |
2439 bool success = false; | 2448 bool success = false; |
2440 if (browser_tracker_->ContainsHandle(handle)) { | 2449 if (browser_tracker_->ContainsHandle(handle)) { |
2441 Browser* browser = browser_tracker_->GetResource(handle); | 2450 Browser* browser = browser_tracker_->GetResource(handle); |
2442 browser->profile()->GetPrefs()->SetInteger(name.c_str(), value); | 2451 browser->profile()->GetPrefs()->SetInteger(name.c_str(), value); |
2443 success = true; | 2452 success = true; |
2444 } | 2453 } |
2445 Send(new AutomationMsg_SetIntPreferenceResponse(message.routing_id(), | 2454 Send(new AutomationMsg_SetIntPreferenceResponse(message.routing_id(), |
2446 success)); | 2455 success)); |
2447 } | 2456 } |
OLD | NEW |