15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper classes and functions used for the WebRequest API. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_API_HELPERS_H_ 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_API_HELPERS_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/warning_set.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/auth.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_headers.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass RenderProcessHost; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoundNetLog; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequest; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extension_web_request_api_helpers { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::pair<std::string, std::string> ResponseHeader; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<ResponseHeader> ResponseHeaders; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Data container for RequestCookies as defined in the declarative WebRequest 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API definition. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct RequestCookie { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestCookie(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RequestCookie(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> name; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> value; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RequestCookie); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NullableEquals(const RequestCookie* a, const RequestCookie* b); 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Data container for ResponseCookies as defined in the declarative WebRequest 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API definition. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResponseCookie { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCookie(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ResponseCookie(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> name; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> value; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> expires; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<int> max_age; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> domain; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<std::string> path; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<bool> secure; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<bool> http_only; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResponseCookie); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NullableEquals(const ResponseCookie* a, const ResponseCookie* b); 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Data container for FilterResponseCookies as defined in the declarative 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebRequest API definition. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FilterResponseCookie : ResponseCookie { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilterResponseCookie(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~FilterResponseCookie(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<int> age_lower_bound; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<int> age_upper_bound; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<bool> session_cookie; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FilterResponseCookie); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NullableEquals(const FilterResponseCookie* a, 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const FilterResponseCookie* b); 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CookieModificationType { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EDIT, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REMOVE, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct RequestCookieModification { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestCookieModification(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RequestCookieModification(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieModificationType type; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for EDIT and REMOVE. NULL for ADD. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RequestCookie> filter; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for ADD and EDIT. NULL for REMOVE. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RequestCookie> modification; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RequestCookieModification); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NullableEquals(const RequestCookieModification* a, 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const RequestCookieModification* b); 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResponseCookieModification { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCookieModification(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ResponseCookieModification(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieModificationType type; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for EDIT and REMOVE. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<FilterResponseCookie> filter; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for ADD and EDIT. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ResponseCookie> modification; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResponseCookieModification); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool NullableEquals(const ResponseCookieModification* a, 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ResponseCookieModification* b); 13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<linked_ptr<RequestCookieModification> > 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestCookieModifications; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<linked_ptr<ResponseCookieModification> > 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCookieModifications; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains the modification an extension wants to perform on an event. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct EventResponseDelta { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID of the extension that sent this response. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string extension_id; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time that the extension was installed. Used for deciding order of 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // precedence in case multiple extensions respond with conflicting 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // decisions. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time extension_install_time; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Response values. These are mutually exclusive. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL new_url; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Newly introduced or overridden request headers. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders modified_request_headers; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keys of request headers to be deleted. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> deleted_request_headers; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Headers that were added to the response. A modification of a header 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponds to a deletion and subsequent addition of the new header. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseHeaders added_response_headers; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Headers that were deleted from the response. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseHeaders deleted_response_headers; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Authentication Credentials to use. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::AuthCredentials> auth_credentials; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modifications to cookies in request headers. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestCookieModifications request_cookie_modifications; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Modifications to cookies in response headers. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseCookieModifications response_cookie_modifications; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Messages that shall be sent to the background/event/... pages of the 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension. 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<std::string> messages_to_extension; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventResponseDelta(const std::string& extension_id, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& extension_install_time); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~EventResponseDelta(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(EventResponseDelta); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::list<linked_ptr<EventResponseDelta> > EventResponseDeltas; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Comparison operator that returns true if the extension that caused 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |a| was installed after the extension that caused |b|. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InDecreasingExtensionInstallationTimeOrder( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const linked_ptr<EventResponseDelta>& a, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const linked_ptr<EventResponseDelta>& b); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a string to a list of integers, each in 0..255. Ownership 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the created list is passed to the caller. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ListValue* StringToCharList(const std::string& s); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a list of integer values between 0 and 255 into a string |*out|. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the conversion was successful. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CharListToString(const base::ListValue* list, std::string* out); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following functions calculate and return the modifications to requests 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commanded by extension handlers. All functions take the id of the extension 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that commanded a modification, the installation time of this extension (used 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for defining a precedence in conflicting modifications) and whether the 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extension requested to |cancel| the request. Other parameters depend on a 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the signal handler. Ownership of the returned object is passed to the caller. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventResponseDelta* CalculateOnBeforeRequestDelta( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& extension_install_time, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_url); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventResponseDelta* CalculateOnBeforeSendHeadersDelta( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& extension_install_time, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders* old_headers, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders* new_headers); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventResponseDelta* CalculateOnHeadersReceivedDelta( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& extension_install_time, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel, 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& new_url, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* old_response_headers, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseHeaders* new_response_headers); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Destructively moves the auth credentials from |auth_credentials| to the 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returned EventResponseDelta. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EventResponseDelta* CalculateOnAuthRequiredDelta( 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& extension_install_time, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::AuthCredentials>* auth_credentials); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions merge the responses (the |deltas|) of request handlers. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The |deltas| need to be sorted in decreasing order of precedence of 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extensions. In case extensions had |deltas| that could not be honored, their 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDs are reported in |conflicting_extensions|. NetLog events that shall be 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reported will be stored in |event_log_entries|. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores in |canceled| whether any extension wanted to cancel the request. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MergeCancelOfResponses( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* canceled, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores in |*new_url| the redirect request of the extension with highest 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// precedence. Extensions that did not command to redirect the request are 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ignored in this logic. 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid MergeRedirectUrlOfResponses( 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const EventResponseDeltas& deltas, 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL* new_url, 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const net::BoundNetLog* net_log); 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Stores in |*new_url| the redirect request of the extension with highest 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// precedence. Extensions that did not command to redirect the request are 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// ignored in this logic. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MergeOnBeforeRequestResponses( 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL* new_url, 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Modifies the "Cookie" header in |request_headers| according to 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |deltas.request_cookie_modifications|. Conflicts are currently ignored 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// silently. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MergeCookiesInOnBeforeSendHeadersResponses( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders* request_headers, 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Modifies the headers in |request_headers| according to |deltas|. Conflicts 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are tried to be resolved. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MergeOnBeforeSendHeadersResponses( 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpRequestHeaders* request_headers, 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Modifies the "Set-Cookie" headers in |override_response_headers| according to 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |deltas.response_cookie_modifications|. If |override_response_headers| is 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NULL, a copy of |original_response_headers| is created. Conflicts are 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// currently ignored silently. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MergeCookiesInOnHeadersReceivedResponses( 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Stores a copy of |original_response_header| into |override_response_headers| 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that is modified according to |deltas|. If |deltas| does not instruct to 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modify the response headers, |override_response_headers| remains empty. 287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Extension-initiated redirects are written to |override_response_headers| 288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// (to request redirection) and |*allowed_unsafe_redirect_url| (to make sure 289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// that the request is not cancelled with net::ERR_UNSAFE_REDIRECT). 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MergeOnHeadersReceivedResponses( 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::HttpResponseHeaders* original_response_headers, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::HttpResponseHeaders>* override_response_headers, 294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch GURL* allowed_unsafe_redirect_url, 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Merge the responses of blocked onAuthRequired handlers. The first 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// registered listener that supplies authentication credentials in a response, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if any, will have its authentication credentials used. |request| must be 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// non-NULL, and contain |deltas| that are sorted in decreasing order of 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// precedence. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns whether authentication credentials are set. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MergeOnAuthRequiredResponses( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EventResponseDeltas& deltas, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::AuthCredentials* auth_credentials, 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::WarningSet* conflicting_extensions, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::BoundNetLog* net_log); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Triggers clearing each renderer's in-memory cache the next time it navigates. 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ClearCacheOnNavigation(); 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tells renderer processes that the web request or declarative web request 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// API has been used by |extension| in browser_context |browser_context_id| to 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// collect UMA statistics on Page Load Times. Needs to be called on the UI 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// thread. 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid NotifyWebRequestAPIUsed( 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void* browser_context_id, 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<const extensions::Extension> extension); 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Send updates to |host| with information about what webRequest-related 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// extensions are installed. 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SendExtensionWebRequestStatusToHost(content::RenderProcessHost* host); 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Converts the |name|, |value| pair of a http header to a HttpHeaders 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// dictionary. Ownership is passed to the caller. 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::DictionaryValue* CreateHeaderDictionary( 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& name, const std::string& value); 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns whether |type| is a ResourceType that is handled by the web request 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API. 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool IsRelevantResourceType(content::ResourceType type); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a string representation of |type| or |other| if |type| is not handled 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the web request API. 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const char* ResourceTypeToString(content::ResourceType type); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Stores a |content::ResourceType| representation in |type| if |type_str| is 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a resource type handled by the web request API. Returns true in case of 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// success. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParseResourceType(const std::string& type_str, 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::ResourceType* type); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extension_web_request_api_helpers 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_API_HELPERS_H_ 346