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)#include "ppapi/proxy/url_request_info_resource.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_file_ref_api.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestInfoResource::URLRequestInfoResource(Connection connection,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               PP_Instance instance,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const URLRequestInfoData& data)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : PluginResource(connection, instance),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_(data) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestInfoResource::~URLRequestInfoResource() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)thunk::PPB_URLRequestInfo_API*
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)URLRequestInfoResource::AsPPB_URLRequestInfo_API() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool URLRequestInfoResource::SetProperty(PP_URLRequestProperty property,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            PP_Var var) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: Do not do security validation of parameters at this level
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without also adding them to PPB_URLRequestInfo_Impl::ValidateData. This
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // code is used both in the plugin (which we don't trust) and in the renderer
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (which we trust more). When running out-of-process, the plugin calls this
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function to configure the URLRequestInfoData, which is then sent to
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the renderer and *not* run through SetProperty again.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This means that anything in the PPB_URLRequestInfo_Data needs to be
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // validated at the time the URL is requested (which is what ValidateData
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does). If your feature requires security checks, it should be in the
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation in the renderer when the WebKit request is actually
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // constructed.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It is legal to do some validation here if you want to report failure to
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the plugin as a convenience, as long as you also do it in the renderer
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Bool result = PP_FALSE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (var.type) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VARTYPE_UNDEFINED:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = PP_FromBool(SetUndefinedProperty(property));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VARTYPE_BOOL:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = PP_FromBool(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SetBooleanProperty(property, PP_ToBool(var.value.as_bool)));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VARTYPE_INT32:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result = PP_FromBool(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SetIntegerProperty(property, var.value.as_int));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_VARTYPE_STRING: {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      StringVar* string = StringVar::FromPPVar(var);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (string)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result = PP_FromBool(SetStringProperty(property, string->value()));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool URLRequestInfoResource::AppendDataToBody(const void* data,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint32_t len) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (len > 0) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_.body.push_back(URLRequestInfoData::BodyItem(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string(static_cast<const char*>(data), len)));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_TRUE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool URLRequestInfoResource::AppendFileToBody(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource file_ref,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64_t start_offset,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64_t number_of_bytes,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Time expected_last_modified_time) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  thunk::EnterResourceNoLock<thunk::PPB_FileRef_API> enter(file_ref, true);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ignore a call to append nothing.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (number_of_bytes == 0)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_TRUE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check for bad values.  (-1 means read until end of file.)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (start_offset < 0 || number_of_bytes < -1)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data_.body.push_back(URLRequestInfoData::BodyItem(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enter.resource(),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      start_offset,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number_of_bytes,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_last_modified_time));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_TRUE;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const URLRequestInfoData& URLRequestInfoResource::GetData() const {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return data_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestInfoResource::SetUndefinedProperty(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_URLRequestProperty property) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: Do not do security validation of parameters at this level
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without also adding them to PPB_URLRequestInfo_Impl::ValidateData. See
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetProperty() above for why.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (property) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_CUSTOMREFERRERURL:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.has_custom_referrer_url = false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.custom_referrer_url = std::string();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_CUSTOMCONTENTTRANSFERENCODING:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.has_custom_content_transfer_encoding = false;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.custom_content_transfer_encoding = std::string();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_CUSTOMUSERAGENT:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.has_custom_user_agent = false;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.custom_user_agent = std::string();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestInfoResource::SetBooleanProperty(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_URLRequestProperty property,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool value) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: Do not do security validation of parameters at this level
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without also adding them to PPB_URLRequestInfo_Impl::ValidateData. See
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetProperty() above for why.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (property) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_STREAMTOFILE:
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.stream_to_file = value;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.follow_redirects = value;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.record_download_progress = value;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.record_upload_progress = value;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS:
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.allow_cross_origin_requests = value;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.allow_credentials = value;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestInfoResource::SetIntegerProperty(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_URLRequestProperty property,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t value) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: Do not do security validation of parameters at this level
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without also adding them to PPB_URLRequestInfo_Impl::ValidateData. See
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetProperty() above for why.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (property) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_PREFETCHBUFFERUPPERTHRESHOLD:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.prefetch_buffer_upper_threshold = value;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_PREFETCHBUFFERLOWERTHRESHOLD:
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.prefetch_buffer_lower_threshold = value;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool URLRequestInfoResource::SetStringProperty(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_URLRequestProperty property,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& value) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IMPORTANT: Do not do security validation of parameters at this level
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // without also adding them to PPB_URLRequestInfo_Impl::ValidateData. See
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetProperty() above for why.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (property) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_URL:
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.url = value;  // NOTE: This may be a relative URL.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_METHOD:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.method = value;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_HEADERS:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.headers = value;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_CUSTOMREFERRERURL:
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.has_custom_referrer_url = true;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.custom_referrer_url = value;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_CUSTOMCONTENTTRANSFERENCODING:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.has_custom_content_transfer_encoding = true;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.custom_content_transfer_encoding = value;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_URLREQUESTPROPERTY_CUSTOMUSERAGENT:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.has_custom_user_agent = true;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_.custom_user_agent = value;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
216