| 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. | 
|  |