| 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/location.h" | 10 #include "base/location.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/linked_ptr.h" | 12 #include "base/memory/linked_ptr.h" |
| 13 #include "base/metrics/user_metrics_action.h" | 13 #include "base/metrics/user_metrics_action.h" |
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
| 18 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
| 19 #include "build/build_config.h" |
| 19 #include "cc/blink/web_layer_impl.h" | 20 #include "cc/blink/web_layer_impl.h" |
| 20 #include "cc/layers/io_surface_layer.h" | 21 #include "cc/layers/io_surface_layer.h" |
| 21 #include "content/child/appcache/web_application_cache_host_impl.h" | 22 #include "content/child/appcache/web_application_cache_host_impl.h" |
| 22 #include "content/child/multipart_response_delegate.h" | 23 #include "content/child/multipart_response_delegate.h" |
| 23 #include "content/child/npapi/plugin_host.h" | 24 #include "content/child/npapi/plugin_host.h" |
| 24 #include "content/child/npapi/plugin_instance.h" | 25 #include "content/child/npapi/plugin_instance.h" |
| 25 #include "content/child/npapi/webplugin_delegate_impl.h" | 26 #include "content/child/npapi/webplugin_delegate_impl.h" |
| 26 #include "content/child/npapi/webplugin_resource_client.h" | 27 #include "content/child/npapi/webplugin_resource_client.h" |
| 27 #include "content/common/view_messages.h" | 28 #include "content/common/view_messages.h" |
| 28 #include "content/public/common/content_constants.h" | 29 #include "content/public/common/content_constants.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 WebURLRequest&, | 107 WebURLRequest&, |
| 107 const WebURLResponse&) override {} | 108 const WebURLResponse&) override {} |
| 108 void didSendData(WebURLLoader*, | 109 void didSendData(WebURLLoader*, |
| 109 unsigned long long, | 110 unsigned long long, |
| 110 unsigned long long) override {} | 111 unsigned long long) override {} |
| 111 | 112 |
| 112 // Called when the multipart parser encounters an embedded multipart | 113 // Called when the multipart parser encounters an embedded multipart |
| 113 // response. | 114 // response. |
| 114 void didReceiveResponse(WebURLLoader*, | 115 void didReceiveResponse(WebURLLoader*, |
| 115 const WebURLResponse& response) override { | 116 const WebURLResponse& response) override { |
| 116 int64 byte_range_upper_bound, instance_size; | 117 int64_t byte_range_upper_bound, instance_size; |
| 117 if (!MultipartResponseDelegate::ReadContentRanges( | 118 if (!MultipartResponseDelegate::ReadContentRanges( |
| 118 response, | 119 response, |
| 119 &byte_range_lower_bound_, | 120 &byte_range_lower_bound_, |
| 120 &byte_range_upper_bound, | 121 &byte_range_upper_bound, |
| 121 &instance_size)) { | 122 &instance_size)) { |
| 122 NOTREACHED(); | 123 NOTREACHED(); |
| 123 } | 124 } |
| 124 } | 125 } |
| 125 | 126 |
| 126 // Receives individual part data from a multipart response. | 127 // Receives individual part data from a multipart response. |
| 127 void didReceiveData(WebURLLoader*, | 128 void didReceiveData(WebURLLoader*, |
| 128 const char* data, | 129 const char* data, |
| 129 int data_length, | 130 int data_length, |
| 130 int encoded_data_length) override { | 131 int encoded_data_length) override { |
| 131 // TODO(ananta) | 132 // TODO(ananta) |
| 132 // We should defer further loads on multipart resources on the same lines | 133 // We should defer further loads on multipart resources on the same lines |
| 133 // as regular resources requested by plugins to prevent reentrancy. | 134 // as regular resources requested by plugins to prevent reentrancy. |
| 134 resource_client_->DidReceiveData( | 135 resource_client_->DidReceiveData( |
| 135 data, data_length, byte_range_lower_bound_); | 136 data, data_length, byte_range_lower_bound_); |
| 136 byte_range_lower_bound_ += data_length; | 137 byte_range_lower_bound_ += data_length; |
| 137 } | 138 } |
| 138 | 139 |
| 139 void didFinishLoading(WebURLLoader*, | 140 void didFinishLoading(WebURLLoader*, |
| 140 double finishTime, | 141 double finishTime, |
| 141 int64_t total_encoded_data_length) override {} | 142 int64_t total_encoded_data_length) override {} |
| 142 void didFail(WebURLLoader*, const WebURLError&) override {} | 143 void didFail(WebURLLoader*, const WebURLError&) override {} |
| 143 | 144 |
| 144 private: | 145 private: |
| 145 // The lower bound of the byte range. | 146 // The lower bound of the byte range. |
| 146 int64 byte_range_lower_bound_; | 147 int64_t byte_range_lower_bound_; |
| 147 // The handler for the data. | 148 // The handler for the data. |
| 148 WebPluginResourceClient* resource_client_; | 149 WebPluginResourceClient* resource_client_; |
| 149 }; | 150 }; |
| 150 | 151 |
| 151 class HeaderFlattener : public WebHTTPHeaderVisitor { | 152 class HeaderFlattener : public WebHTTPHeaderVisitor { |
| 152 public: | 153 public: |
| 153 explicit HeaderFlattener(std::string* buf) : buf_(buf) { | 154 explicit HeaderFlattener(std::string* buf) : buf_(buf) { |
| 154 } | 155 } |
| 155 | 156 |
| 156 void visitHeader(const WebString& name, const WebString& value) override { | 157 void visitHeader(const WebString& name, const WebString& value) override { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 182 | 183 |
| 183 HeaderFlattener flattener(&result); | 184 HeaderFlattener flattener(&result); |
| 184 response.visitHTTPHeaderFields(&flattener); | 185 response.visitHTTPHeaderFields(&flattener); |
| 185 | 186 |
| 186 return result; | 187 return result; |
| 187 } | 188 } |
| 188 | 189 |
| 189 struct ResponseInfo { | 190 struct ResponseInfo { |
| 190 GURL url; | 191 GURL url; |
| 191 std::string mime_type; | 192 std::string mime_type; |
| 192 uint32 last_modified; | 193 uint32_t last_modified; |
| 193 uint32 expected_length; | 194 uint32_t expected_length; |
| 194 }; | 195 }; |
| 195 | 196 |
| 196 void GetResponseInfo(const WebURLResponse& response, | 197 void GetResponseInfo(const WebURLResponse& response, |
| 197 ResponseInfo* response_info) { | 198 ResponseInfo* response_info) { |
| 198 response_info->url = response.url(); | 199 response_info->url = response.url(); |
| 199 response_info->mime_type = response.mimeType().utf8(); | 200 response_info->mime_type = response.mimeType().utf8(); |
| 200 | 201 |
| 201 // Measured in seconds since 12:00 midnight GMT, January 1, 1970. | 202 // Measured in seconds since 12:00 midnight GMT, January 1, 1970. |
| 202 response_info->last_modified = | 203 response_info->last_modified = |
| 203 static_cast<uint32>(response.lastModifiedDate()); | 204 static_cast<uint32_t>(response.lastModifiedDate()); |
| 204 | 205 |
| 205 // If the length comes in as -1, then it indicates that it was not | 206 // If the length comes in as -1, then it indicates that it was not |
| 206 // read off the HTTP headers. We replicate Safari webkit behavior here, | 207 // read off the HTTP headers. We replicate Safari webkit behavior here, |
| 207 // which is to set it to 0. | 208 // which is to set it to 0. |
| 208 response_info->expected_length = | 209 response_info->expected_length = |
| 209 static_cast<uint32>(std::max(response.expectedContentLength(), 0LL)); | 210 static_cast<uint32_t>(std::max(response.expectedContentLength(), 0LL)); |
| 210 | 211 |
| 211 WebString content_encoding = | 212 WebString content_encoding = |
| 212 response.httpHeaderField(WebString::fromUTF8("Content-Encoding")); | 213 response.httpHeaderField(WebString::fromUTF8("Content-Encoding")); |
| 213 if (!content_encoding.isNull() && | 214 if (!content_encoding.isNull() && |
| 214 !base::EqualsASCII(base::StringPiece16(content_encoding), "identity")) { | 215 !base::EqualsASCII(base::StringPiece16(content_encoding), "identity")) { |
| 215 // Don't send the compressed content length to the plugin, which only | 216 // Don't send the compressed content length to the plugin, which only |
| 216 // cares about the decoded length. | 217 // cares about the decoded length. |
| 217 response_info->expected_length = 0; | 218 response_info->expected_length = 0; |
| 218 } | 219 } |
| 219 } | 220 } |
| 220 | 221 |
| 221 } // namespace | 222 } // namespace |
| 222 | 223 |
| 223 // blink::WebPlugin ---------------------------------------------------------- | 224 // blink::WebPlugin ---------------------------------------------------------- |
| 224 | 225 |
| 225 struct WebPluginImpl::ClientInfo { | 226 struct WebPluginImpl::ClientInfo { |
| 226 unsigned long id; | 227 unsigned long id; |
| 227 WebPluginResourceClient* client; | 228 WebPluginResourceClient* client; |
| 228 blink::WebURLRequest request; | 229 blink::WebURLRequest request; |
| 229 bool pending_failure_notification; | 230 bool pending_failure_notification; |
| 230 linked_ptr<blink::WebURLLoader> loader; | 231 linked_ptr<blink::WebURLLoader> loader; |
| 231 bool notify_redirects; | 232 bool notify_redirects; |
| 232 bool is_plugin_src_load; | 233 bool is_plugin_src_load; |
| 233 int64 data_offset; | 234 int64_t data_offset; |
| 234 }; | 235 }; |
| 235 | 236 |
| 236 bool WebPluginImpl::initialize(WebPluginContainer* container) { | 237 bool WebPluginImpl::initialize(WebPluginContainer* container) { |
| 237 if (!render_view_.get()) { | 238 if (!render_view_.get()) { |
| 238 LOG(ERROR) << "No RenderView"; | 239 LOG(ERROR) << "No RenderView"; |
| 239 return false; | 240 return false; |
| 240 } | 241 } |
| 241 | 242 |
| 242 WebPluginDelegateProxy* plugin_delegate = new WebPluginDelegateProxy( | 243 WebPluginDelegateProxy* plugin_delegate = new WebPluginDelegateProxy( |
| 243 this, mime_type_, render_view_, render_frame_); | 244 this, mime_type_, render_view_, render_frame_); |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 clients_[i].loader->setDefersLoading(false); | 562 clients_[i].loader->setDefersLoading(false); |
| 562 clients_[i].loader->cancel(); | 563 clients_[i].loader->cancel(); |
| 563 RemoveClient(i); | 564 RemoveClient(i); |
| 564 } | 565 } |
| 565 return; | 566 return; |
| 566 } | 567 } |
| 567 } | 568 } |
| 568 } | 569 } |
| 569 | 570 |
| 570 bool WebPluginImpl::SetPostData(WebURLRequest* request, | 571 bool WebPluginImpl::SetPostData(WebURLRequest* request, |
| 571 const char *buf, | 572 const char* buf, |
| 572 uint32 length) { | 573 uint32_t length) { |
| 573 std::vector<std::string> names; | 574 std::vector<std::string> names; |
| 574 std::vector<std::string> values; | 575 std::vector<std::string> values; |
| 575 std::vector<char> body; | 576 std::vector<char> body; |
| 576 bool rv = PluginHost::SetPostData(buf, length, &names, &values, &body); | 577 bool rv = PluginHost::SetPostData(buf, length, &names, &values, &body); |
| 577 | 578 |
| 578 for (size_t i = 0; i < names.size(); ++i) { | 579 for (size_t i = 0; i < names.size(); ++i) { |
| 579 request->addHTTPHeaderField(WebString::fromUTF8(names[i]), | 580 request->addHTTPHeaderField(WebString::fromUTF8(names[i]), |
| 580 WebString::fromUTF8(values[i])); | 581 WebString::fromUTF8(values[i])); |
| 581 } | 582 } |
| 582 | 583 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 | 772 |
| 772 #if defined(OS_MACOSX) | 773 #if defined(OS_MACOSX) |
| 773 WebPluginAcceleratedSurface* WebPluginImpl::GetAcceleratedSurface( | 774 WebPluginAcceleratedSurface* WebPluginImpl::GetAcceleratedSurface( |
| 774 gfx::GpuPreference gpu_preference) { | 775 gfx::GpuPreference gpu_preference) { |
| 775 return NULL; | 776 return NULL; |
| 776 } | 777 } |
| 777 | 778 |
| 778 void WebPluginImpl::AcceleratedPluginEnabledRendering() { | 779 void WebPluginImpl::AcceleratedPluginEnabledRendering() { |
| 779 } | 780 } |
| 780 | 781 |
| 781 void WebPluginImpl::AcceleratedPluginAllocatedIOSurface(int32 width, | 782 void WebPluginImpl::AcceleratedPluginAllocatedIOSurface(int32_t width, |
| 782 int32 height, | 783 int32_t height, |
| 783 uint32 surface_id) { | 784 uint32_t surface_id) { |
| 784 next_io_surface_allocated_ = true; | 785 next_io_surface_allocated_ = true; |
| 785 next_io_surface_width_ = width; | 786 next_io_surface_width_ = width; |
| 786 next_io_surface_height_ = height; | 787 next_io_surface_height_ = height; |
| 787 next_io_surface_id_ = surface_id; | 788 next_io_surface_id_ = surface_id; |
| 788 } | 789 } |
| 789 | 790 |
| 790 void WebPluginImpl::AcceleratedPluginSwappedIOSurface() { | 791 void WebPluginImpl::AcceleratedPluginSwappedIOSurface() { |
| 791 if (!container_) | 792 if (!container_) |
| 792 return; | 793 return; |
| 793 // Deferring the call to setBackingIOSurfaceId is an attempt to | 794 // Deferring the call to setBackingIOSurfaceId is an attempt to |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1218 case PLUGIN_SRC: | 1219 case PLUGIN_SRC: |
| 1219 webframe_->setReferrerForRequest(*request, plugin_url_); | 1220 webframe_->setReferrerForRequest(*request, plugin_url_); |
| 1220 break; | 1221 break; |
| 1221 | 1222 |
| 1222 default: | 1223 default: |
| 1223 break; | 1224 break; |
| 1224 } | 1225 } |
| 1225 } | 1226 } |
| 1226 | 1227 |
| 1227 } // namespace content | 1228 } // namespace content |
| OLD | NEW |