Index: chrome/browser/net/chrome_network_delegate.cc |
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc |
index 6558ae123a8d01eac386242f1b1d44222e8e392a..1ce96d656e2d04a61aeded7fb843772cde907b65 100644 |
--- a/chrome/browser/net/chrome_network_delegate.cc |
+++ b/chrome/browser/net/chrome_network_delegate.cc |
@@ -17,6 +17,8 @@ |
#include "base/prefs/pref_service.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_split.h" |
+#include "base/strings/string_util.h" |
+#include "base/strings/stringprintf.h" |
#include "base/time/time.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/content_settings/cookie_settings.h" |
@@ -161,6 +163,67 @@ void ForceGoogleSafeSearchCallbackWrapper( |
callback.Run(rv); |
} |
+const char kYoutubePrefCookieName[] = "PREF"; |
battre
2014/07/07 09:00:06
What do you think of moving the youtube and safebr
Marc Treib
2014/07/07 16:06:46
It is grungy :-/
I moved the code into new safe_se
|
+// Youtube pref flags are stored in bit masks of 31 bits each, called "f1", |
+// "f2" etc. The Safety Mode flag is bit 58, so bit 27 in "f2". |
+const char kYoutubePrefCookieSafetyModeFlagsEntryName[] = "f2"; |
+const int kYoutubePrefCookieSafetyModeFlagsEntryValue = (1 << 27); |
+const char kYoutubePrefCookieFlagsValueFormat[] = "%x"; |
+ |
+bool IsYoutubePrefCookie(const std::pair<std::string, std::string>& cookie) { |
+ return cookie.first == kYoutubePrefCookieName; |
+} |
+ |
+bool IsYoutubePrefCookieSafetyModeFlagsEntry( |
+ const std::pair<std::string, std::string>& pref_entry) { |
+ return pref_entry.first == kYoutubePrefCookieSafetyModeFlagsEntryName; |
+} |
+ |
+// If |request| is a request to Youtube, enforces Youtube's Safety Mode by |
+// adding/modifying Youtube's PrefCookie header. |
+void ForceYoutubeSafetyMode(const net::URLRequest* request, |
+ net::HttpRequestHeaders* headers) { |
battre
2014/07/07 09:00:06
Could you add more newlines into this function and
Marc Treib
2014/07/07 16:06:46
Done.
|
+ if (!google_util::IsYoutubeDomainUrl( |
+ request->url(), |
+ google_util::ALLOW_SUBDOMAIN, |
+ google_util::DISALLOW_NON_STANDARD_PORTS)) |
+ return; |
+ |
+ std::string cookie_string; |
+ headers->GetHeader(base::StringPiece(net::HttpRequestHeaders::kCookie), |
+ &cookie_string); |
+ base::StringPairs cookies; |
+ base::SplitStringIntoKeyValuePairs(cookie_string, '=', ';', &cookies); |
+ base::StringPairs::iterator pref_it = |
+ std::find_if(cookies.begin(), cookies.end(), IsYoutubePrefCookie); |
+ if (pref_it == cookies.end()) { |
+ cookies.push_back(std::make_pair(std::string(kYoutubePrefCookieName), |
+ std::string())); |
+ pref_it = cookies.end() - 1; |
+ } |
+ base::StringPairs pref_values; |
+ base::SplitStringIntoKeyValuePairs(pref_it->second, '=', '&', &pref_values); |
+ base::StringPairs::iterator flag_it = |
+ std::find_if(pref_values.begin(), pref_values.end(), |
+ IsYoutubePrefCookieSafetyModeFlagsEntry); |
+ int flag_value = 0; |
+ if (flag_it == pref_values.end()) { |
+ pref_values.push_back( |
+ std::make_pair(std::string(kYoutubePrefCookieSafetyModeFlagsEntryName), |
+ std::string())); |
+ flag_it = pref_values.end() - 1; |
+ } else { |
+ base::HexStringToInt(base::StringPiece(flag_it->second), &flag_value); |
+ } |
+ flag_value |= kYoutubePrefCookieSafetyModeFlagsEntryValue; |
+ flag_it->second = |
+ base::StringPrintf(kYoutubePrefCookieFlagsValueFormat, flag_value); |
+ pref_it->second = JoinStringKeyValuePairs(pref_values, '=', '&'); |
+ cookie_string = JoinStringKeyValuePairs(cookies, '=', ';'); |
+ headers->SetHeader(base::StringPiece(net::HttpRequestHeaders::kCookie), |
+ base::StringPiece(cookie_string)); |
+} |
+ |
void UpdateContentLengthPrefs( |
int received_content_length, |
int original_content_length, |
@@ -478,6 +541,11 @@ int ChromeNetworkDelegate::OnBeforeSendHeaders( |
net::URLRequest* request, |
const net::CompletionCallback& callback, |
net::HttpRequestHeaders* headers) { |
+ bool force_safe_search = force_google_safe_search_ && |
+ force_google_safe_search_->GetValue(); |
+ if (force_safe_search) |
+ ForceYoutubeSafetyMode(request, headers); |
+ |
TRACE_EVENT_ASYNC_STEP_PAST0("net", "URLRequest", request, "SendRequest"); |
return extensions_delegate_->OnBeforeSendHeaders(request, callback, headers); |
} |