Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/npapi/webplugin_impl.h" | 5 #include "content/renderer/npapi/webplugin_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 88 | 88 |
| 89 namespace { | 89 namespace { |
| 90 | 90 |
| 91 // This class handles individual multipart responses. It is instantiated when | 91 // This class handles individual multipart responses. It is instantiated when |
| 92 // we receive HTTP status code 206 in the HTTP response. This indicates | 92 // we receive HTTP status code 206 in the HTTP response. This indicates |
| 93 // that the response could have multiple parts each separated by a boundary | 93 // that the response could have multiple parts each separated by a boundary |
| 94 // specified in the response header. | 94 // specified in the response header. |
| 95 class MultiPartResponseClient : public WebURLLoaderClient { | 95 class MultiPartResponseClient : public WebURLLoaderClient { |
| 96 public: | 96 public: |
| 97 explicit MultiPartResponseClient(WebPluginResourceClient* resource_client) | 97 explicit MultiPartResponseClient(WebPluginResourceClient* resource_client) |
| 98 : resource_client_(resource_client) { | 98 : byte_range_lower_bound_(0), resource_client_(resource_client) {} |
| 99 Clear(); | |
| 100 } | |
| 101 | 99 |
| 102 virtual void willSendRequest( | 100 virtual void willSendRequest( |
| 103 WebURLLoader*, WebURLRequest&, const WebURLResponse&) {} | 101 WebURLLoader*, WebURLRequest&, const WebURLResponse&) {} |
| 104 virtual void didSendData( | 102 virtual void didSendData( |
| 105 WebURLLoader*, unsigned long long, unsigned long long) {} | 103 WebURLLoader*, unsigned long long, unsigned long long) {} |
| 106 | 104 |
| 107 // Called when the multipart parser encounters an embedded multipart | 105 // Called when the multipart parser encounters an embedded multipart |
| 108 // response. | 106 // response. |
| 109 virtual void didReceiveResponse( | 107 virtual void didReceiveResponse( |
| 110 WebURLLoader*, const WebURLResponse& response) { | 108 WebURLLoader*, const WebURLResponse& response) { |
| 111 int64 instance_size; | 109 int64 byte_range_upper_bound, instance_size; |
| 112 if (!MultipartResponseDelegate::ReadContentRanges( | 110 if (!MultipartResponseDelegate::ReadContentRanges( |
| 113 response, | 111 response, |
| 114 &byte_range_lower_bound_, | 112 &byte_range_lower_bound_, |
| 115 &byte_range_upper_bound_, | 113 &byte_range_upper_bound, |
| 116 &instance_size)) { | 114 &instance_size)) { |
| 117 NOTREACHED(); | 115 NOTREACHED(); |
| 118 return; | |
| 119 } | 116 } |
| 120 | |
| 121 resource_response_ = response; | |
| 122 } | 117 } |
| 123 | 118 |
| 124 // Receives individual part data from a multipart response. | 119 // Receives individual part data from a multipart response. |
| 125 virtual void didReceiveData(WebURLLoader*, | 120 virtual void didReceiveData(WebURLLoader*, |
| 126 const char* data, | 121 const char* data, |
| 127 int data_length, | 122 int data_length, |
| 128 int encoded_data_length) { | 123 int encoded_data_length) { |
| 129 // TODO(ananta) | 124 // TODO(ananta) |
| 130 // We should defer further loads on multipart resources on the same lines | 125 // We should defer further loads on multipart resources on the same lines |
| 131 // as regular resources requested by plugins to prevent reentrancy. | 126 // as regular resources requested by plugins to prevent reentrancy. |
| 132 resource_client_->DidReceiveData( | 127 resource_client_->DidReceiveData( |
| 133 data, data_length, byte_range_lower_bound_); | 128 data, data_length, byte_range_lower_bound_); |
| 134 byte_range_lower_bound_ += data_length; | 129 byte_range_lower_bound_ += data_length; |
| 135 } | 130 } |
| 136 | 131 |
| 137 virtual void didFinishLoading(WebURLLoader*, double finishTime) {} | 132 virtual void didFinishLoading(WebURLLoader*, double finishTime) {} |
| 138 virtual void didFail(WebURLLoader*, const WebURLError&) {} | 133 virtual void didFail(WebURLLoader*, const WebURLError&) {} |
| 139 | 134 |
| 140 void Clear() { | |
| 141 resource_response_.reset(); | |
| 142 byte_range_lower_bound_ = 0; | |
| 143 byte_range_upper_bound_ = 0; | |
| 144 } | |
| 145 | |
| 146 private: | 135 private: |
| 147 WebURLResponse resource_response_; | |
| 148 // The lower bound of the byte range. | 136 // The lower bound of the byte range. |
| 149 int64 byte_range_lower_bound_; | 137 int64 byte_range_lower_bound_; |
| 150 // The upper bound of the byte range. | |
| 151 int64 byte_range_upper_bound_; | |
| 152 // The handler for the data. | 138 // The handler for the data. |
| 153 WebPluginResourceClient* resource_client_; | 139 WebPluginResourceClient* resource_client_; |
| 154 }; | 140 }; |
| 155 | 141 |
| 156 class HeaderFlattener : public WebHTTPHeaderVisitor { | 142 class HeaderFlattener : public WebHTTPHeaderVisitor { |
| 157 public: | 143 public: |
| 158 explicit HeaderFlattener(std::string* buf) : buf_(buf) { | 144 explicit HeaderFlattener(std::string* buf) : buf_(buf) { |
| 159 } | 145 } |
| 160 | 146 |
| 161 virtual void visitHeader(const WebString& name, const WebString& value) { | 147 virtual void visitHeader(const WebString& name, const WebString& value) { |
| (...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 939 } | 925 } |
| 940 } | 926 } |
| 941 | 927 |
| 942 void WebPluginImpl::didSendData(WebURLLoader* loader, | 928 void WebPluginImpl::didSendData(WebURLLoader* loader, |
| 943 unsigned long long bytes_sent, | 929 unsigned long long bytes_sent, |
| 944 unsigned long long total_bytes_to_be_sent) { | 930 unsigned long long total_bytes_to_be_sent) { |
| 945 } | 931 } |
| 946 | 932 |
| 947 void WebPluginImpl::didReceiveResponse(WebURLLoader* loader, | 933 void WebPluginImpl::didReceiveResponse(WebURLLoader* loader, |
| 948 const WebURLResponse& response) { | 934 const WebURLResponse& response) { |
| 935 // TODO(jam): THIS LOGIC IS COPIED IN PluginURLFetcher::OnReceivedResponse | |
| 936 // until kDirectNPAPIRequests is the default and we can remove this old path. | |
| 949 static const int kHttpPartialResponseStatusCode = 206; | 937 static const int kHttpPartialResponseStatusCode = 206; |
| 950 static const int kHttpResponseSuccessStatusCode = 200; | 938 static const int kHttpResponseSuccessStatusCode = 200; |
| 951 | 939 |
| 952 WebPluginResourceClient* client = GetClientFromLoader(loader); | 940 WebPluginResourceClient* client = GetClientFromLoader(loader); |
| 953 if (!client) | 941 if (!client) |
| 954 return; | 942 return; |
| 955 | 943 |
| 956 ResponseInfo response_info; | 944 ResponseInfo response_info; |
| 957 GetResponseInfo(response, &response_info); | 945 GetResponseInfo(response, &response_info); |
| 958 ClientInfo* client_info = GetClientInfoFromLoader(loader); | 946 ClientInfo* client_info = GetClientInfoFromLoader(loader); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1072 } | 1060 } |
| 1073 | 1061 |
| 1074 void WebPluginImpl::didFinishLoading(WebURLLoader* loader, double finishTime) { | 1062 void WebPluginImpl::didFinishLoading(WebURLLoader* loader, double finishTime) { |
| 1075 ClientInfo* client_info = GetClientInfoFromLoader(loader); | 1063 ClientInfo* client_info = GetClientInfoFromLoader(loader); |
| 1076 if (client_info && client_info->client) { | 1064 if (client_info && client_info->client) { |
| 1077 MultiPartResponseHandlerMap::iterator index = | 1065 MultiPartResponseHandlerMap::iterator index = |
| 1078 multi_part_response_map_.find(client_info->client); | 1066 multi_part_response_map_.find(client_info->client); |
| 1079 if (index != multi_part_response_map_.end()) { | 1067 if (index != multi_part_response_map_.end()) { |
| 1080 delete (*index).second; | 1068 delete (*index).second; |
| 1081 multi_part_response_map_.erase(index); | 1069 multi_part_response_map_.erase(index); |
| 1082 if (render_view_.get()) { | 1070 DidStopLoading(); |
| 1083 // TODO(darin): Make is_loading_ be a counter! | |
| 1084 render_view_->didStopLoading(); | |
| 1085 } | |
| 1086 } | 1071 } |
| 1087 loader->setDefersLoading(true); | 1072 loader->setDefersLoading(true); |
| 1088 WebPluginResourceClient* resource_client = client_info->client; | 1073 WebPluginResourceClient* resource_client = client_info->client; |
| 1089 // The ClientInfo can get deleted in the call to DidFinishLoading below. | 1074 // The ClientInfo can get deleted in the call to DidFinishLoading below. |
| 1090 // It is not safe to access this structure after that. | 1075 // It is not safe to access this structure after that. |
| 1091 client_info->client = NULL; | 1076 client_info->client = NULL; |
| 1092 resource_client->DidFinishLoading(client_info->id); | 1077 resource_client->DidFinishLoading(client_info->id); |
| 1093 } | 1078 } |
| 1094 } | 1079 } |
| 1095 | 1080 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1219 // TODO(jam): any better way of getting this? Can't find a way to get | 1204 // TODO(jam): any better way of getting this? Can't find a way to get |
| 1220 // frame()->loader()->outgoingReferrer() which | 1205 // frame()->loader()->outgoingReferrer() which |
| 1221 // WebFrameImpl::setReferrerForRequest does. | 1206 // WebFrameImpl::setReferrerForRequest does. |
| 1222 WebURLRequest request(complete_url); | 1207 WebURLRequest request(complete_url); |
| 1223 SetReferrer(&request, referrer_flag); | 1208 SetReferrer(&request, referrer_flag); |
| 1224 GURL referrer( | 1209 GURL referrer( |
| 1225 request.httpHeaderField(WebString::fromUTF8("Referer")).utf8()); | 1210 request.httpHeaderField(WebString::fromUTF8("Referer")).utf8()); |
| 1226 | 1211 |
| 1227 GURL first_party_for_cookies = webframe_->document().firstPartyForCookies(); | 1212 GURL first_party_for_cookies = webframe_->document().firstPartyForCookies(); |
| 1228 delegate_->FetchURL(resource_id, notify_id, complete_url, | 1213 delegate_->FetchURL(resource_id, notify_id, complete_url, |
| 1229 first_party_for_cookies, method, std::string(buf, len), | 1214 first_party_for_cookies, method, buf, len, referrer, |
| 1230 referrer, notify_redirects, is_plugin_src_load, 0, | 1215 notify_redirects, is_plugin_src_load, 0, |
| 1231 render_view_->routing_id()); | 1216 render_view_->routing_id()); |
| 1232 } else { | 1217 } else { |
| 1233 WebPluginResourceClient* resource_client = delegate_->CreateResourceClient( | 1218 WebPluginResourceClient* resource_client = delegate_->CreateResourceClient( |
| 1234 resource_id, complete_url, notify_id); | 1219 resource_id, complete_url, notify_id); |
| 1235 if (!resource_client) | 1220 if (!resource_client) |
| 1236 return; | 1221 return; |
| 1237 InitiateHTTPRequest(resource_id, resource_client, complete_url, method, buf, | 1222 InitiateHTTPRequest(resource_id, resource_client, complete_url, method, buf, |
| 1238 len, NULL, referrer_flag, notify_redirects, | 1223 len, NULL, referrer_flag, notify_redirects, |
| 1239 is_plugin_src_load); | 1224 is_plugin_src_load); |
| 1240 } | 1225 } |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1324 load_manually_ ? NO_REFERRER : PLUGIN_SRC)) | 1309 load_manually_ ? NO_REFERRER : PLUGIN_SRC)) |
| 1325 return; | 1310 return; |
| 1326 | 1311 |
| 1327 WebPluginResourceClient* resource_client = | 1312 WebPluginResourceClient* resource_client = |
| 1328 delegate_->CreateSeekableResourceClient(resource_id, range_request_id); | 1313 delegate_->CreateSeekableResourceClient(resource_id, range_request_id); |
| 1329 InitiateHTTPRequest( | 1314 InitiateHTTPRequest( |
| 1330 resource_id, resource_client, complete_url, "GET", NULL, 0, range_info, | 1315 resource_id, resource_client, complete_url, "GET", NULL, 0, range_info, |
| 1331 load_manually_ ? NO_REFERRER : PLUGIN_SRC, false, false); | 1316 load_manually_ ? NO_REFERRER : PLUGIN_SRC, false, false); |
| 1332 } | 1317 } |
| 1333 | 1318 |
| 1319 void WebPluginImpl::DidStartLoading() { | |
| 1320 if (render_view_.get()) { | |
| 1321 // TODO(darin): Make is_loading_ be a counter! | |
| 1322 render_view_->didStartLoading(); | |
| 1323 } | |
| 1324 } | |
| 1325 | |
| 1326 void WebPluginImpl::DidStopLoading() { | |
| 1327 if (render_view_.get()) { | |
| 1328 // TODO(darin): Make is_loading_ be a counter! | |
| 1329 render_view_->didStopLoading(); | |
| 1330 } | |
| 1331 } | |
| 1332 | |
| 1334 void WebPluginImpl::SetDeferResourceLoading(unsigned long resource_id, | 1333 void WebPluginImpl::SetDeferResourceLoading(unsigned long resource_id, |
| 1335 bool defer) { | 1334 bool defer) { |
| 1336 std::vector<ClientInfo>::iterator client_index = clients_.begin(); | 1335 std::vector<ClientInfo>::iterator client_index = clients_.begin(); |
| 1337 while (client_index != clients_.end()) { | 1336 while (client_index != clients_.end()) { |
| 1338 ClientInfo& client_info = *client_index; | 1337 ClientInfo& client_info = *client_index; |
| 1339 | 1338 |
| 1340 if (client_info.id == resource_id) { | 1339 if (client_info.id == resource_id) { |
| 1341 client_info.loader->setDefersLoading(defer); | 1340 client_info.loader->setDefersLoading(defer); |
| 1342 | 1341 |
| 1343 // If we determined that the request had failed via the HTTP headers | 1342 // If we determined that the request had failed via the HTTP headers |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1359 } | 1358 } |
| 1360 } | 1359 } |
| 1361 | 1360 |
| 1362 bool WebPluginImpl::IsOffTheRecord() { | 1361 bool WebPluginImpl::IsOffTheRecord() { |
| 1363 return false; | 1362 return false; |
| 1364 } | 1363 } |
| 1365 | 1364 |
| 1366 bool WebPluginImpl::HandleHttpMultipartResponse( | 1365 bool WebPluginImpl::HandleHttpMultipartResponse( |
| 1367 const WebURLResponse& response, WebPluginResourceClient* client) { | 1366 const WebURLResponse& response, WebPluginResourceClient* client) { |
| 1368 std::string multipart_boundary; | 1367 std::string multipart_boundary; |
| 1368 std::string content_type = | |
|
ananta
2013/09/16 18:35:41
Remove?
jam
2013/09/16 19:31:34
Done, thanks. that was left over code from another
| |
| 1369 response.httpHeaderField(WebString::fromUTF8("Content-Type")).utf8(); | |
| 1369 if (!MultipartResponseDelegate::ReadMultipartBoundary( | 1370 if (!MultipartResponseDelegate::ReadMultipartBoundary( |
| 1370 response, &multipart_boundary)) { | 1371 response, &multipart_boundary)) { |
| 1371 return false; | 1372 return false; |
| 1372 } | 1373 } |
| 1373 | 1374 |
| 1374 if (render_view_.get()) { | 1375 DidStartLoading(); |
| 1375 // TODO(darin): Make is_loading_ be a counter! | |
| 1376 render_view_->didStartLoading(); | |
| 1377 } | |
| 1378 | 1376 |
| 1379 MultiPartResponseClient* multi_part_response_client = | 1377 MultiPartResponseClient* multi_part_response_client = |
| 1380 new MultiPartResponseClient(client); | 1378 new MultiPartResponseClient(client); |
| 1381 | 1379 |
| 1382 MultipartResponseDelegate* multi_part_response_handler = | 1380 MultipartResponseDelegate* multi_part_response_handler = |
| 1383 new MultipartResponseDelegate(multi_part_response_client, NULL, | 1381 new MultipartResponseDelegate(multi_part_response_client, NULL, |
| 1384 response, | 1382 response, |
| 1385 multipart_boundary); | 1383 multipart_boundary); |
| 1386 multi_part_response_map_[client] = multi_part_response_handler; | 1384 multi_part_response_map_[client] = multi_part_response_handler; |
| 1387 return true; | 1385 return true; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1499 case PLUGIN_SRC: | 1497 case PLUGIN_SRC: |
| 1500 webframe_->setReferrerForRequest(*request, plugin_url_); | 1498 webframe_->setReferrerForRequest(*request, plugin_url_); |
| 1501 break; | 1499 break; |
| 1502 | 1500 |
| 1503 default: | 1501 default: |
| 1504 break; | 1502 break; |
| 1505 } | 1503 } |
| 1506 } | 1504 } |
| 1507 | 1505 |
| 1508 } // namespace content | 1506 } // namespace content |
| OLD | NEW |