| Index: content/child/npapi/plugin_url_fetcher.cc
|
| ===================================================================
|
| --- content/child/npapi/plugin_url_fetcher.cc (revision 0)
|
| +++ content/child/npapi/plugin_url_fetcher.cc (revision 0)
|
| @@ -0,0 +1,188 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/child/npapi/plugin_url_fetcher.h"
|
| +
|
| +#include "content/child/child_thread.h"
|
| +#include "content/child/npapi/webplugin.h"
|
| +#include "content/child/npapi/plugin_host.h"
|
| +#include "content/child/npapi/plugin_instance.h"
|
| +#include "content/child/npapi/plugin_stream_url.h"
|
| +#include "content/child/npapi/webplugin_resource_client.h"
|
| +#include "content/child/plugin_messages.h"
|
| +#include "content/child/resource_dispatcher.h"
|
| +#include "net/base/load_flags.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/http/http_response_headers.h"
|
| +#include "webkit/common/resource_request_body.h"
|
| +
|
| +namespace content {
|
| +
|
| +PluginURLFetcher::PluginURLFetcher(PluginStreamUrl* plugin_stream,
|
| + const GURL& url,
|
| + const GURL& first_party_for_cookies,
|
| + const std::string& method,
|
| + const std::string& post_data,
|
| + const GURL& referrer,
|
| + bool notify_redirects,
|
| + bool is_plugin_src_load,
|
| + int origin_pid,
|
| + int render_view_id,
|
| + unsigned long resource_id)
|
| + : plugin_stream_(plugin_stream),
|
| + url_(url),
|
| + first_party_for_cookies_(first_party_for_cookies),
|
| + method_(method),
|
| + post_data_(post_data),
|
| + referrer_(referrer),
|
| + notify_redirects_(notify_redirects),
|
| + is_plugin_src_load_(is_plugin_src_load),
|
| + resource_id_(resource_id),
|
| + data_offset_(0) {
|
| + webkit_glue::ResourceLoaderBridge::RequestInfo request_info;
|
| + request_info.method = method;
|
| + request_info.url = url;
|
| + request_info.first_party_for_cookies = first_party_for_cookies;
|
| + request_info.referrer = referrer;
|
| + request_info.load_flags = net::LOAD_NORMAL;
|
| + request_info.requestor_pid = origin_pid;
|
| + request_info.request_type = ResourceType::OBJECT;
|
| + request_info.routing_id = render_view_id;
|
| +
|
| + std::vector<char> body;
|
| + if (method == "POST") {
|
| + std::vector<std::string> names;
|
| + std::vector<std::string> values;
|
| + PluginHost::SetPostData(
|
| + post_data.c_str(), post_data.size(), &names, &values, &body);
|
| + for (size_t i = 0; i < names.size(); ++i) {
|
| + if (!request_info.headers.empty())
|
| + request_info.headers += "\r\n";
|
| +
|
| + request_info.headers += names[i] + ": " + values[i];
|
| + }
|
| + }
|
| +
|
| + bridge_.reset(ChildThread::current()->resource_dispatcher()->CreateBridge(
|
| + request_info));
|
| + if (!body.empty()) {
|
| + scoped_refptr<webkit_glue::ResourceRequestBody> request_body =
|
| + new webkit_glue::ResourceRequestBody;
|
| + request_body->AppendBytes(&body[0], body.size());
|
| + bridge_->SetRequestBody(request_body.get());
|
| + }
|
| +
|
| + bridge_->Start(this);
|
| +
|
| + // TODO(jam): range requests
|
| +}
|
| +
|
| +PluginURLFetcher::~PluginURLFetcher() {
|
| +}
|
| +
|
| +void PluginURLFetcher::Cancel() {
|
| + bridge_->Cancel();
|
| +}
|
| +
|
| +void PluginURLFetcher::URLRedirectResponse(bool allow) {
|
| + if (allow) {
|
| + bridge_->SetDefersLoading(true);
|
| + } else {
|
| + bridge_->Cancel();
|
| + plugin_stream_->DidFail(resource_id_); // That will delete |this|.
|
| + }
|
| +}
|
| +
|
| +void PluginURLFetcher::OnUploadProgress(uint64 position, uint64 size) {
|
| +}
|
| +
|
| +bool PluginURLFetcher::OnReceivedRedirect(
|
| + const GURL& new_url,
|
| + const webkit_glue::ResourceResponseInfo& info,
|
| + bool* has_new_first_party_for_cookies,
|
| + GURL* new_first_party_for_cookies) {
|
| + // TODO(jam): THIS LOGIC IS COPIED FROM WebPluginImpl::willSendRequest until
|
| + // kDirectNPAPIRequests is the default and we can remove the old path there.
|
| +
|
| + // Currently this check is just to catch an https -> http redirect when
|
| + // loading the main plugin src URL. Longer term, we could investigate
|
| + // firing mixed diplay or scripting issues for subresource loads
|
| + // initiated by plug-ins.
|
| + if (is_plugin_src_load_ &&
|
| + !plugin_stream_->instance()->webplugin()->CheckIfRunInsecureContent(
|
| + new_url)) {
|
| + plugin_stream_->DidFail(resource_id_); // That will delete |this|.
|
| + return false;
|
| + }
|
| +
|
| + // It's unfortunate that this logic of when a redirect's method changes is
|
| + // in url_request.cc, but weburlloader_impl.cc and this file have to duplicate
|
| + // it instead of passing that information.
|
| + if (info.headers->response_code() != 307)
|
| + method_ = "GET";
|
| + GURL old_url = url_;
|
| + url_ = new_url;
|
| + *has_new_first_party_for_cookies = true;
|
| + *new_first_party_for_cookies = first_party_for_cookies_;
|
| +
|
| + // If the plugin does not participate in url redirect notifications then just
|
| + // block cross origin 307 POST redirects.
|
| + if (!notify_redirects_) {
|
| + if (info.headers->response_code() == 307 && method_ == "POST" &&
|
| + old_url.GetOrigin() != new_url.GetOrigin()) {
|
| + plugin_stream_->DidFail(resource_id_); // That will delete |this|.
|
| + return false;
|
| + }
|
| + } else {
|
| + // Pause the request while we ask the plugin what to do about the redirect.
|
| + bridge_->SetDefersLoading(true);
|
| + plugin_stream_->WillSendRequest(url_, info.headers->response_code());
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void PluginURLFetcher::OnReceivedResponse(
|
| + const webkit_glue::ResourceResponseInfo& info) {
|
| + // TODO(jam): see WebPluginImpl::didReceiveResponse for request_is_seekable
|
| + bool request_is_seekable = false;
|
| + uint32 last_modified = 0;
|
| +
|
| + base::Time temp;
|
| + if (info.headers->GetLastModifiedValue(&temp))
|
| + last_modified = static_cast<uint32>(temp.ToDoubleT());
|
| +
|
| + std::string headers = info.headers->raw_headers();
|
| +
|
| + plugin_stream_->DidReceiveResponse(info.mime_type,
|
| + headers,
|
| + info.content_length,
|
| + last_modified,
|
| + request_is_seekable);
|
| +}
|
| +
|
| +void PluginURLFetcher::OnDownloadedData(int len,
|
| + int encoded_data_length) {
|
| +}
|
| +
|
| +void PluginURLFetcher::OnReceivedData(const char* data,
|
| + int data_length,
|
| + int encoded_data_length) {
|
| + plugin_stream_->DidReceiveData(data, data_length, data_offset_);
|
| + data_offset_ += data_length;
|
| +}
|
| +
|
| +void PluginURLFetcher::OnCompletedRequest(
|
| + int error_code,
|
| + bool was_ignored_by_handler,
|
| + const std::string& security_info,
|
| + const base::TimeTicks& completion_time) {
|
| + if (error_code == net::OK) {
|
| + plugin_stream_->DidFinishLoading(resource_id_);
|
| + } else {
|
| + plugin_stream_->DidFail(resource_id_);
|
| + }
|
| +}
|
| +
|
| +} // namespace content
|
|
|
| Property changes on: content\child\npapi\plugin_url_fetcher.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|