Index: content/browser/browsing_data/clear_site_data_throttle.h |
diff --git a/content/browser/browsing_data/clear_site_data_throttle.h b/content/browser/browsing_data/clear_site_data_throttle.h |
index ec26b7a7578d1359f17f132caad7f2d7944aad60..31d26541c9fc9d7ea4b9de1f9c45db00e21b2d82 100644 |
--- a/content/browser/browsing_data/clear_site_data_throttle.h |
+++ b/content/browser/browsing_data/clear_site_data_throttle.h |
@@ -6,77 +6,145 @@ |
#define CONTENT_BROWSER_BROWSING_DATA_CLEAR_SITE_DATA_THROTTLE_H_ |
#include <memory> |
+#include <string> |
#include <vector> |
+#include "base/callback.h" |
#include "base/gtest_prod_util.h" |
#include "base/macros.h" |
#include "base/memory/weak_ptr.h" |
-#include "base/values.h" |
-#include "content/public/browser/navigation_throttle.h" |
+#include "base/time/time.h" |
#include "content/public/browser/resource_request_info.h" |
+#include "content/public/browser/resource_throttle.h" |
#include "content/public/common/console_message_level.h" |
+#include "net/http/http_response_headers.h" |
#include "url/gurl.h" |
+namespace net { |
+class HttpResponseHeaders; |
+struct RedirectInfo; |
+class URLRequest; |
+} |
+ |
+namespace url { |
+class Origin; |
+} |
+ |
namespace content { |
-class NavigationHandle; |
+class WebContents; |
// This throttle parses the Clear-Site-Data header and executes the clearing |
-// of browsing data. The navigation is delayed until the header is parsed and, |
-// if valid, until the browsing data are deleted. See the W3C working draft at |
-// https://www.w3.org/TR/clear-site-data/. |
-class CONTENT_EXPORT ClearSiteDataThrottle : public NavigationThrottle { |
+// of browsing data. The resource load is delayed until the header is parsed |
+// and, if valid, until the browsing data are deleted. See the W3C working draft |
+// at https://w3c.github.io/webappsec-clear-site-data/. |
+class CONTENT_EXPORT ClearSiteDataThrottle : public ResourceThrottle { |
public: |
- struct ConsoleMessage { |
- GURL url; |
- std::string text; |
- ConsoleMessageLevel level; |
+ // Stores and outputs console messages. |
+ class CONTENT_EXPORT ConsoleMessagesDelegate { |
+ public: |
+ struct Message { |
+ GURL url; |
+ std::string text; |
+ ConsoleMessageLevel level; |
+ }; |
+ |
+ typedef base::Callback< |
+ void(WebContents*, ConsoleMessageLevel, const std::string&)> |
+ OutputFormattedMessageFunction; |
+ |
+ ConsoleMessagesDelegate(); |
+ virtual ~ConsoleMessagesDelegate(); |
+ |
+ // Logs a |text| message from |url| with |level|. |
+ virtual void AddMessage(const GURL& url, |
+ const std::string& text, |
+ ConsoleMessageLevel level); |
+ |
+ // Outputs stored messages to the console of WebContents identified by |
+ // |web_contents_getter|. |
+ virtual void OutputMessages( |
+ const ResourceRequestInfo::WebContentsGetter& web_contents_getter); |
+ |
+ const std::vector<Message>& messages() const { return messages_; } |
+ |
+ protected: |
+ void SetOutputFormattedMessageFunctionForTesting( |
+ const OutputFormattedMessageFunction& function); |
+ |
+ private: |
+ std::vector<Message> messages_; |
+ OutputFormattedMessageFunction output_formatted_message_function_; |
}; |
- static std::unique_ptr<NavigationThrottle> CreateThrottleForNavigation( |
- NavigationHandle* handle); |
+ // Instantiates a throttle for the given if it's supported for the given |
+ // |request|. The caller must guarantee that |request| outlives the throttle. |
+ static std::unique_ptr<ResourceThrottle> MaybeCreateThrottleForRequest( |
+ net::URLRequest* request); |
~ClearSiteDataThrottle() override; |
- // NavigationThrottle implementation: |
- ThrottleCheckResult WillStartRequest() override; |
- ThrottleCheckResult WillRedirectRequest() override; |
- ThrottleCheckResult WillProcessResponse() override; |
- const char* GetNameForLogging() override; |
+ // ResourceThrottle implementation: |
+ const char* GetNameForLogging() const override; |
+ void WillRedirectRequest(const net::RedirectInfo& redirect_info, |
+ bool* defer) override; |
+ void WillProcessResponse(bool* defer) override; |
- private: |
- friend class ClearSiteDataFuzzerTest; |
- friend class ClearSiteDataThrottleTest; |
- FRIEND_TEST_ALL_PREFIXES(ClearSiteDataThrottleTest, ParseHeader); |
- FRIEND_TEST_ALL_PREFIXES(ClearSiteDataThrottleTest, InvalidHeader); |
+ // Exposes ParseHeader() publicly for testing. |
+ static bool ParseHeaderForTesting(const std::string& header, |
+ bool* clear_cookies, |
+ bool* clear_storage, |
+ bool* clear_cache, |
+ ConsoleMessagesDelegate* delegate, |
+ const GURL& current_url); |
+ |
+ protected: |
+ ClearSiteDataThrottle(net::URLRequest* request, |
+ std::unique_ptr<ConsoleMessagesDelegate> delegate); |
- explicit ClearSiteDataThrottle(NavigationHandle* navigation_handle); |
+ virtual const GURL& GetCurrentURL() const; |
+ |
+ private: |
+ // Returns HTTP response headers of the underlying URLRequest. |
+ // Can be overriden for testing. |
+ virtual const net::HttpResponseHeaders* GetResponseHeaders() const; |
// Scans for the first occurrence of the 'Clear-Site-Data' header, calls |
- // ParseHeader() to parse it, and requests the actual data clearing. This is |
- // the common logic of WillRedirectRequest() and WillProcessResponse(). |
- void HandleHeader(); |
+ // ParseHeader() to parse it, and then ExecuteClearingTask() if applicable. |
+ // This is the common logic of WillRedirectRequest() |
+ // and WillProcessResponse(). Returns true if a valid header was found and |
+ // the clearing was executed. |
+ bool HandleHeader(); |
// Parses the value of the 'Clear-Site-Data' header and outputs whether |
// the header requests to |clear_cookies|, |clear_storage|, and |clear_cache|. |
- // The |messages| vector will be filled with messages to be output in the |
- // console. Returns true if parsing was successful. |
- bool ParseHeader(const std::string& header, |
- bool* clear_cookies, |
- bool* clear_storage, |
- bool* clear_cache, |
- std::vector<ConsoleMessage>* messages); |
+ // The |delegate| will be filled with messages to be output in the console, |
+ // prepended by the |current_url|. Returns true if parsing was successful. |
+ static bool ParseHeader(const std::string& header, |
+ bool* clear_cookies, |
+ bool* clear_storage, |
+ bool* clear_cache, |
+ ConsoleMessagesDelegate* delegate, |
+ const GURL& current_url); |
+ |
+ // Executes the clearing task. Can be overriden for testing. |
+ virtual void ExecuteClearingTask(const url::Origin& origin, |
+ bool clear_cookies, |
+ bool clear_storage, |
+ bool clear_cache, |
+ base::OnceClosure callback); |
// Signals that a parsing and deletion task was finished. |
void TaskFinished(); |
- // Cached console messages to be output when the RenderFrameHost is ready. |
- std::vector<ConsoleMessage> messages_; |
- GURL current_url_; |
+ // Outputs the console messages in the |delegate_|. |
+ void OutputConsoleMessages(); |
+ |
+ // The request this throttle is observing. |
+ net::URLRequest* request_; |
- // Whether we are currently waiting for a callback that data clearing has |
- // been completed; |
- bool clearing_in_progress_; |
+ // The delegate that stores and outputs console messages. |
+ std::unique_ptr<ConsoleMessagesDelegate> delegate_; |
// The time when the last clearing operation started. Used when clearing |
// finishes to compute the duration. |