Index: content/renderer/pepper/url_request_info_util.cc |
diff --git a/content/renderer/pepper/url_request_info_util.cc b/content/renderer/pepper/url_request_info_util.cc |
index 0a58bba1f363de27b49bc0870f6c33eed9dea5c5..b2efe05d5c01ddfbcba3366c7a783d7ab72fd163 100644 |
--- a/content/renderer/pepper/url_request_info_util.cc |
+++ b/content/renderer/pepper/url_request_info_util.cc |
@@ -103,6 +103,42 @@ bool ValidateURLRequestData(const URLRequestInfoData& data) { |
return true; |
} |
+std::string FilterStringForXRequestedWithValue(const std::string& s) { |
+ std::string rv; |
+ rv.reserve(s.length()); |
+ for (size_t i = 0; i < s.length(); i++) { |
+ char c = s[i]; |
+ // Allow ASCII digits, letters, periods, commas, and underscores. (Ignore |
+ // all other characters.) |
+ if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || |
+ (c >= 'a' && c <= 'z') || (c == '.') || (c == ',') || (c == '_')) |
+ rv.push_back(c); |
+ } |
+ return rv; |
+} |
+ |
+// Returns an appropriate value for the X-Requested-With header for plugins that |
+// present an X-Requested-With header. Returns a blank string for other plugins. |
+// We produce a user-agent-like string (eating spaces and other undesired |
+// characters) like "ShockwaveFlash/11.5.31.135" from the plugin name and |
+// version. |
+std::string MakeXRequestedWithValue(const std::string& name, |
+ const std::string& version) { |
+ std::string rv = FilterStringForXRequestedWithValue(name); |
+ if (rv.empty()) |
+ return std::string(); |
+ |
+ // Apply to a narrow list of plugins only. |
+ if (rv != "ShockwaveFlash" && rv != "PPAPITests") |
+ return std::string(); |
+ |
+ std::string filtered_version = FilterStringForXRequestedWithValue(version); |
+ if (!filtered_version.empty()) |
+ rv += "/" + filtered_version; |
+ |
+ return rv; |
+} |
+ |
} // namespace |
bool CreateWebURLRequest(PP_Instance instance, |
@@ -115,6 +151,21 @@ bool CreateWebURLRequest(PP_Instance instance, |
if (!ValidateURLRequestData(*data)) |
return false; |
+ std::string name_version; |
+ |
+ // Allow instance to be 0 or -1 for testing purposes. |
+ if (instance && instance != -1) { |
+ PepperPluginInstanceImpl* instance_impl = |
+ HostGlobals::Get()->GetInstance(instance); |
+ if (instance_impl) { |
+ name_version = MakeXRequestedWithValue( |
+ instance_impl->module()->name(), |
+ instance_impl->module()->version()); |
+ } |
+ } else { |
+ name_version = "internal_testing_only"; |
+ } |
+ |
dest->initialize(); |
dest->setURL(frame->document().completeURL(WebString::fromUTF8(data->url))); |
dest->setDownloadToFile(data->stream_to_file); |
@@ -171,10 +222,15 @@ bool CreateWebURLRequest(PP_Instance instance, |
WebString::fromUTF8(data->custom_content_transfer_encoding)); |
} |
- if (data->has_custom_user_agent) { |
+ if (data->has_custom_user_agent || !name_version.empty()) { |
RequestExtraData* extra_data = new RequestExtraData(); |
- extra_data->set_custom_user_agent( |
- WebString::fromUTF8(data->custom_user_agent)); |
+ if (data->has_custom_user_agent) { |
+ extra_data->set_custom_user_agent( |
+ WebString::fromUTF8(data->custom_user_agent)); |
+ } |
+ if (!name_version.empty()) { |
+ extra_data->set_requested_with(WebString::fromUTF8(name_version)); |
+ } |
dest->setExtraData(extra_data); |
} |