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/extensions/api/web_request/web_request_api.h" | 5 #include "chrome/browser/extensions/api/web_request/web_request_api.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/json/json_writer.h" | 11 #include "base/json/json_writer.h" |
12 #include "base/lazy_instance.h" | 12 #include "base/lazy_instance.h" |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/strings/utf_string_conversions.h" | 16 #include "base/strings/utf_string_conversions.h" |
17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
18 #include "base/values.h" | 18 #include "base/values.h" |
19 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" | 19 #include "chrome/browser/extensions/api/web_request/upload_data_presenter.h" |
20 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" | 20 #include "chrome/browser/extensions/api/web_request/web_request_time_tracker.h" |
21 #include "chrome/common/extensions/api/web_request.h" | 21 #include "chrome/common/extensions/api/web_request.h" |
22 #include "content/public/browser/browser_message_filter.h" | 22 #include "content/public/browser/browser_message_filter.h" |
23 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
24 #include "content/public/browser/render_frame_host.h" | 24 #include "content/public/browser/render_frame_host.h" |
25 #include "content/public/browser/render_process_host.h" | 25 #include "content/public/browser/render_process_host.h" |
26 #include "content/public/browser/resource_request_info.h" | 26 #include "content/public/browser/resource_request_info.h" |
27 #include "content/public/browser/user_metrics.h" | 27 #include "content/public/browser/user_metrics.h" |
| 28 #include "extensions/browser/api/activity_log/web_request_constants.h" |
28 #include "extensions/browser/api/declarative_webrequest/request_stage.h" | 29 #include "extensions/browser/api/declarative_webrequest/request_stage.h" |
29 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" | 30 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
30 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr
y.h" | 31 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr
y.h" |
31 #include "extensions/browser/api/extensions_api_client.h" | 32 #include "extensions/browser/api/extensions_api_client.h" |
32 #include "extensions/browser/api/web_request/web_request_api_constants.h" | 33 #include "extensions/browser/api/web_request/web_request_api_constants.h" |
33 #include "extensions/browser/api/web_request/web_request_api_helpers.h" | 34 #include "extensions/browser/api/web_request/web_request_api_helpers.h" |
34 #include "extensions/browser/api/web_request/web_request_api_utils.h" | 35 #include "extensions/browser/api/web_request/web_request_api_utils.h" |
35 #include "extensions/browser/api/web_request/web_request_api_utils.h" | 36 #include "extensions/browser/api/web_request/web_request_api_utils.h" |
36 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h
" | 37 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h
" |
37 #include "extensions/browser/event_router.h" | 38 #include "extensions/browser/event_router.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 using content::ResourceType; | 72 using content::ResourceType; |
72 using extensions::ErrorUtils; | 73 using extensions::ErrorUtils; |
73 using extensions::Extension; | 74 using extensions::Extension; |
74 using extensions::InfoMap; | 75 using extensions::InfoMap; |
75 using extensions::Feature; | 76 using extensions::Feature; |
76 using extensions::RulesRegistryService; | 77 using extensions::RulesRegistryService; |
77 using extensions::Warning; | 78 using extensions::Warning; |
78 using extensions::WarningService; | 79 using extensions::WarningService; |
79 using extensions::WarningSet; | 80 using extensions::WarningSet; |
80 | 81 |
| 82 namespace activitylog = activity_log_web_request_constants; |
81 namespace helpers = extension_web_request_api_helpers; | 83 namespace helpers = extension_web_request_api_helpers; |
82 namespace utils = extension_web_request_api_utils; | 84 namespace utils = extension_web_request_api_utils; |
83 namespace keys = extension_web_request_api_constants; | 85 namespace keys = extension_web_request_api_constants; |
84 namespace web_request = extensions::api::web_request; | 86 namespace web_request = extensions::api::web_request; |
85 namespace declarative_keys = extensions::declarative_webrequest_constants; | 87 namespace declarative_keys = extensions::declarative_webrequest_constants; |
86 | 88 |
87 namespace { | 89 namespace { |
88 | 90 |
89 const char kWebRequestEventPrefix[] = "webRequest."; | 91 const char kWebRequestEventPrefix[] = "webRequest."; |
90 | 92 |
(...skipping 1518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1609 return helpers::CalculateOnAuthRequiredDelta( | 1611 return helpers::CalculateOnAuthRequiredDelta( |
1610 response->extension_id, response->extension_install_time, | 1612 response->extension_id, response->extension_install_time, |
1611 response->cancel, &response->auth_credentials); | 1613 response->cancel, &response->auth_credentials); |
1612 default: | 1614 default: |
1613 NOTREACHED(); | 1615 NOTREACHED(); |
1614 break; | 1616 break; |
1615 } | 1617 } |
1616 return NULL; | 1618 return NULL; |
1617 } | 1619 } |
1618 | 1620 |
| 1621 base::Value* SerializeResponseHeaders(const helpers::ResponseHeaders& headers) { |
| 1622 scoped_ptr<base::ListValue> serialized_headers(new base::ListValue()); |
| 1623 for (helpers::ResponseHeaders::const_iterator i = headers.begin(); |
| 1624 i != headers.end(); ++i) { |
| 1625 serialized_headers->Append( |
| 1626 helpers::CreateHeaderDictionary(i->first, i->second)); |
| 1627 } |
| 1628 return serialized_headers.release(); |
| 1629 } |
| 1630 |
| 1631 // Convert a RequestCookieModifications/ResponseCookieModifications object to a |
| 1632 // base::ListValue which summarizes the changes made. This is templated since |
| 1633 // the two types (request/response) are different but contain essentially the |
| 1634 // same fields. |
| 1635 template<typename CookieType> |
| 1636 base::ListValue* SummarizeCookieModifications( |
| 1637 const std::vector<linked_ptr<CookieType> >& modifications) { |
| 1638 scoped_ptr<base::ListValue> cookie_modifications(new base::ListValue()); |
| 1639 for (typename std::vector<linked_ptr<CookieType> >::const_iterator i = |
| 1640 modifications.begin(); |
| 1641 i != modifications.end(); ++i) { |
| 1642 scoped_ptr<base::DictionaryValue> summary(new base::DictionaryValue()); |
| 1643 const CookieType& mod = *i->get(); |
| 1644 switch (mod.type) { |
| 1645 case helpers::ADD: |
| 1646 summary->SetString(activitylog::kCookieModificationTypeKey, |
| 1647 activitylog::kCookieModificationAdd); |
| 1648 break; |
| 1649 case helpers::EDIT: |
| 1650 summary->SetString(activitylog::kCookieModificationTypeKey, |
| 1651 activitylog::kCookieModificationEdit); |
| 1652 break; |
| 1653 case helpers::REMOVE: |
| 1654 summary->SetString(activitylog::kCookieModificationTypeKey, |
| 1655 activitylog::kCookieModificationRemove); |
| 1656 break; |
| 1657 } |
| 1658 if (mod.filter) { |
| 1659 if (mod.filter->name) |
| 1660 summary->SetString(activitylog::kCookieFilterNameKey, |
| 1661 *mod.modification->name); |
| 1662 if (mod.filter->domain) |
| 1663 summary->SetString(activitylog::kCookieFilterDomainKey, |
| 1664 *mod.modification->name); |
| 1665 } |
| 1666 if (mod.modification) { |
| 1667 if (mod.modification->name) |
| 1668 summary->SetString(activitylog::kCookieModDomainKey, |
| 1669 *mod.modification->name); |
| 1670 if (mod.modification->domain) |
| 1671 summary->SetString(activitylog::kCookieModDomainKey, |
| 1672 *mod.modification->name); |
| 1673 } |
| 1674 cookie_modifications->Append(summary.release()); |
| 1675 } |
| 1676 return cookie_modifications.release(); |
| 1677 } |
| 1678 |
| 1679 // Converts an EventResponseDelta object to a dictionary value suitable for the |
| 1680 // activity log. |
| 1681 scoped_ptr<base::DictionaryValue> SummarizeResponseDelta( |
| 1682 const std::string& event_name, |
| 1683 const helpers::EventResponseDelta& delta) { |
| 1684 scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue()); |
| 1685 if (delta.cancel) { |
| 1686 details->SetBoolean(activitylog::kCancelKey, true); |
| 1687 } |
| 1688 if (!delta.new_url.is_empty()) { |
| 1689 details->SetString(activitylog::kNewUrlKey, delta.new_url.spec()); |
| 1690 } |
| 1691 |
| 1692 scoped_ptr<base::ListValue> modified_headers(new base::ListValue()); |
| 1693 net::HttpRequestHeaders::Iterator iter(delta.modified_request_headers); |
| 1694 while (iter.GetNext()) { |
| 1695 modified_headers->Append( |
| 1696 helpers::CreateHeaderDictionary(iter.name(), iter.value())); |
| 1697 } |
| 1698 if (!modified_headers->empty()) { |
| 1699 details->Set(activitylog::kModifiedRequestHeadersKey, |
| 1700 modified_headers.release()); |
| 1701 } |
| 1702 |
| 1703 scoped_ptr<base::ListValue> deleted_headers(new base::ListValue()); |
| 1704 deleted_headers->AppendStrings(delta.deleted_request_headers); |
| 1705 if (!deleted_headers->empty()) { |
| 1706 details->Set(activitylog::kDeletedRequestHeadersKey, |
| 1707 deleted_headers.release()); |
| 1708 } |
| 1709 |
| 1710 if (!delta.added_response_headers.empty()) { |
| 1711 details->Set(activitylog::kAddedRequestHeadersKey, |
| 1712 SerializeResponseHeaders(delta.added_response_headers)); |
| 1713 } |
| 1714 if (!delta.deleted_response_headers.empty()) { |
| 1715 details->Set(activitylog::kDeletedResponseHeadersKey, |
| 1716 SerializeResponseHeaders(delta.deleted_response_headers)); |
| 1717 } |
| 1718 if (delta.auth_credentials) { |
| 1719 details->SetString(activitylog::kAuthCredentialsKey, |
| 1720 base::UTF16ToUTF8( |
| 1721 delta.auth_credentials->username()) + ":*"); |
| 1722 } |
| 1723 |
| 1724 if (!delta.response_cookie_modifications.empty()) { |
| 1725 details->Set( |
| 1726 activitylog::kResponseCookieModificationsKey, |
| 1727 SummarizeCookieModifications(delta.response_cookie_modifications)); |
| 1728 } |
| 1729 |
| 1730 return details.Pass(); |
| 1731 } |
| 1732 |
1619 } // namespace | 1733 } // namespace |
1620 | 1734 |
| 1735 void ExtensionWebRequestEventRouter::LogExtensionActivity( |
| 1736 void* browser_context_id, |
| 1737 bool is_incognito, |
| 1738 const std::string& extension_id, |
| 1739 const GURL& url, |
| 1740 const std::string& api_call, |
| 1741 scoped_ptr<base::DictionaryValue> details) { |
| 1742 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 1743 BrowserThread::PostTask( |
| 1744 BrowserThread::UI, |
| 1745 FROM_HERE, |
| 1746 base::Bind(&ExtensionWebRequestEventRouter::LogExtensionActivity, |
| 1747 base::Unretained(this), |
| 1748 browser_context_id, |
| 1749 is_incognito, |
| 1750 extension_id, |
| 1751 url, |
| 1752 api_call, |
| 1753 base::Passed(&details))); |
| 1754 } else { |
| 1755 if (web_request_event_router_delegate_) { |
| 1756 web_request_event_router_delegate_->LogExtensionActivity( |
| 1757 reinterpret_cast<content::BrowserContext*>(browser_context_id), |
| 1758 is_incognito, extension_id, url, api_call, details.Pass()); |
| 1759 } |
| 1760 } |
| 1761 } |
| 1762 |
1621 void ExtensionWebRequestEventRouter::DecrementBlockCount( | 1763 void ExtensionWebRequestEventRouter::DecrementBlockCount( |
1622 void* browser_context, | 1764 void* browser_context, |
1623 const std::string& extension_id, | 1765 const std::string& extension_id, |
1624 const std::string& event_name, | 1766 const std::string& event_name, |
1625 uint64 request_id, | 1767 uint64 request_id, |
1626 EventResponse* response) { | 1768 EventResponse* response) { |
1627 scoped_ptr<EventResponse> response_scoped(response); | 1769 scoped_ptr<EventResponse> response_scoped(response); |
1628 | 1770 |
1629 // It's possible that this request was deleted, or cancelled by a previous | 1771 // It's possible that this request was deleted, or cancelled by a previous |
1630 // event handler. If so, ignore this response. | 1772 // event handler. If so, ignore this response. |
1631 if (blocked_requests_.find(request_id) == blocked_requests_.end()) | 1773 if (blocked_requests_.find(request_id) == blocked_requests_.end()) |
1632 return; | 1774 return; |
1633 | 1775 |
1634 BlockedRequest& blocked_request = blocked_requests_[request_id]; | 1776 BlockedRequest& blocked_request = blocked_requests_[request_id]; |
1635 int num_handlers_blocking = --blocked_request.num_handlers_blocking; | 1777 int num_handlers_blocking = --blocked_request.num_handlers_blocking; |
1636 CHECK_GE(num_handlers_blocking, 0); | 1778 CHECK_GE(num_handlers_blocking, 0); |
1637 | 1779 |
1638 if (response) { | 1780 if (response) { |
1639 helpers::EventResponseDelta* delta = | 1781 helpers::EventResponseDelta* delta = |
1640 CalculateDelta(&blocked_request, response); | 1782 CalculateDelta(&blocked_request, response); |
1641 | 1783 |
1642 if (web_request_event_router_delegate_) { | 1784 LogExtensionActivity(browser_context, |
1643 web_request_event_router_delegate_->LogExtensionActivity( | 1785 blocked_request.is_incognito, |
1644 browser_context, | 1786 extension_id, |
1645 blocked_request.is_incognito, | 1787 blocked_request.request->url(), |
1646 extension_id, | 1788 event_name, |
1647 blocked_request.request->url(), | 1789 SummarizeResponseDelta(event_name, *delta)); |
1648 event_name, | |
1649 *delta); | |
1650 } | |
1651 | 1790 |
1652 blocked_request.response_deltas.push_back( | 1791 blocked_request.response_deltas.push_back( |
1653 linked_ptr<helpers::EventResponseDelta>(delta)); | 1792 linked_ptr<helpers::EventResponseDelta>(delta)); |
1654 } | 1793 } |
1655 | 1794 |
1656 base::TimeDelta block_time = | 1795 base::TimeDelta block_time = |
1657 base::Time::Now() - blocked_request.blocking_time; | 1796 base::Time::Now() - blocked_request.blocking_time; |
1658 if (!extension_id.empty()) { | 1797 if (!extension_id.empty()) { |
1659 request_time_tracker_->IncrementExtensionBlockTime( | 1798 request_time_tracker_->IncrementExtensionBlockTime( |
1660 extension_id, request_id, block_time); | 1799 extension_id, request_id, block_time); |
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2315 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); | 2454 base::Bind(&WarningService::NotifyWarningsOnUI, profile_id(), warnings)); |
2316 | 2455 |
2317 // Continue gracefully. | 2456 // Continue gracefully. |
2318 RunSync(); | 2457 RunSync(); |
2319 } | 2458 } |
2320 | 2459 |
2321 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { | 2460 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { |
2322 helpers::ClearCacheOnNavigation(); | 2461 helpers::ClearCacheOnNavigation(); |
2323 return true; | 2462 return true; |
2324 } | 2463 } |
OLD | NEW |