Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(343)

Unified Diff: trunk/src/components/nacl/renderer/ppb_nacl_private_impl.cc

Issue 406323003: Revert 284684 "Pepper: Delete FileDownloader in trusted plugin." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | trunk/src/ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: trunk/src/components/nacl/renderer/ppb_nacl_private_impl.cc
===================================================================
--- trunk/src/components/nacl/renderer/ppb_nacl_private_impl.cc (revision 284790)
+++ trunk/src/components/nacl/renderer/ppb_nacl_private_impl.cc (working copy)
@@ -17,8 +17,6 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/rand_util.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
#include "components/nacl/common/nacl_host_messages.h"
#include "components/nacl/common/nacl_messages.h"
#include "components/nacl/common/nacl_nonsfi_util.h"
@@ -54,7 +52,6 @@
#include "ppapi/shared_impl/var_tracker.h"
#include "ppapi/thunk/enter.h"
#include "third_party/WebKit/public/platform/WebURLLoader.h"
-#include "third_party/WebKit/public/platform/WebURLResponse.h"
#include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebElement.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"
@@ -590,40 +587,80 @@
return PP_FromBool(IsNonSFIModeEnabled());
}
-void GetNexeFd(PP_Instance instance,
- const std::string& pexe_url,
- uint32_t opt_level,
- const base::Time& last_modified_time,
- const std::string& etag,
- bool has_no_store_header,
- base::Callback<void(int32_t, bool, PP_FileHandle)> callback) {
- if (!InitializePnaclResourceHost()) {
- ppapi::PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostTask(
- FROM_HERE,
- base::Bind(callback,
- static_cast<int32_t>(PP_ERROR_FAILED),
- false,
- PP_kInvalidFileHandle));
- return;
+void GetNexeFdContinuation(scoped_refptr<ppapi::TrackedCallback> callback,
+ PP_Bool* out_is_hit,
+ PP_FileHandle* out_handle,
+ int32_t pp_error,
+ bool is_hit,
+ PP_FileHandle handle) {
+ if (pp_error == PP_OK) {
+ *out_is_hit = PP_FromBool(is_hit);
+ *out_handle = handle;
}
+ callback->PostRun(pp_error);
+}
+int32_t GetNexeFd(PP_Instance instance,
+ const char* pexe_url,
+ uint32_t abi_version,
+ uint32_t opt_level,
+ const char* http_headers_param,
+ const char* extra_flags,
+ PP_Bool* is_hit,
+ PP_FileHandle* handle,
+ struct PP_CompletionCallback callback) {
+ ppapi::thunk::EnterInstance enter(instance, callback);
+ if (enter.failed())
+ return enter.retval();
+ if (!pexe_url || !is_hit || !handle)
+ return enter.SetResult(PP_ERROR_BADARGUMENT);
+ if (!InitializePnaclResourceHost())
+ return enter.SetResult(PP_ERROR_FAILED);
+
+ std::string http_headers(http_headers_param);
+ net::HttpUtil::HeadersIterator iter(
+ http_headers.begin(), http_headers.end(), "\r\n");
+
+ std::string last_modified;
+ std::string etag;
+ bool has_no_store_header = false;
+ while (iter.GetNext()) {
+ if (StringToLowerASCII(iter.name()) == "last-modified")
+ last_modified = iter.values();
+ if (StringToLowerASCII(iter.name()) == "etag")
+ etag = iter.values();
+ if (StringToLowerASCII(iter.name()) == "cache-control") {
+ net::HttpUtil::ValuesIterator values_iter(
+ iter.values_begin(), iter.values_end(), ',');
+ while (values_iter.GetNext()) {
+ if (StringToLowerASCII(values_iter.value()) == "no-store")
+ has_no_store_header = true;
+ }
+ }
+ }
+
+ base::Time last_modified_time;
+ // If FromString fails, it doesn't touch last_modified_time and we just send
+ // the default-constructed null value.
+ base::Time::FromString(last_modified.c_str(), &last_modified_time);
+
PnaclCacheInfo cache_info;
cache_info.pexe_url = GURL(pexe_url);
- // TODO(dschuff): Get this value from the pnacl json file after it
- // rolls in from NaCl.
- cache_info.abi_version = 1;
+ cache_info.abi_version = abi_version;
cache_info.opt_level = opt_level;
cache_info.last_modified = last_modified_time;
cache_info.etag = etag;
cache_info.has_no_store_header = has_no_store_header;
cache_info.sandbox_isa = GetSandboxArch();
- cache_info.extra_flags = GetCpuFeatures();
+ cache_info.extra_flags = std::string(extra_flags);
g_pnacl_resource_host.Get()->RequestNexeFd(
GetRoutingID(instance),
instance,
cache_info,
- callback);
+ base::Bind(&GetNexeFdContinuation, enter.callback(), is_hit, handle));
+
+ return enter.SetResult(PP_OK_COMPLETIONPENDING);
}
void ReportTranslationFinished(PP_Instance instance,
@@ -1526,160 +1563,6 @@
load_manager->set_pnacl_start_time(base::Time::Now());
}
-class PexeDownloader : public blink::WebURLLoaderClient {
- public:
- PexeDownloader(PP_Instance instance,
- scoped_ptr<blink::WebURLLoader> url_loader,
- const std::string& pexe_url,
- int32_t pexe_opt_level,
- const PPP_PexeStreamHandler* stream_handler,
- void* stream_handler_user_data)
- : instance_(instance),
- url_loader_(url_loader.Pass()),
- pexe_url_(pexe_url),
- pexe_opt_level_(pexe_opt_level),
- stream_handler_(stream_handler),
- stream_handler_user_data_(stream_handler_user_data),
- success_(false),
- expected_content_length_(-1),
- weak_factory_(this) { }
-
- void Load(const blink::WebURLRequest& request) {
- url_loader_->loadAsynchronously(request, this);
- }
-
- private:
- virtual void didReceiveResponse(blink::WebURLLoader* loader,
- const blink::WebURLResponse& response) {
- success_ = (response.httpStatusCode() == 200);
- if (!success_)
- return;
-
- expected_content_length_ = response.expectedContentLength();
-
- // Defer loading after receiving headers. This is because we may already
- // have a cached translated nexe, so check for that now.
- url_loader_->setDefersLoading(true);
-
- std::string etag = response.httpHeaderField("etag").utf8();
- std::string last_modified =
- response.httpHeaderField("last-modified").utf8();
- base::Time last_modified_time;
- base::Time::FromString(last_modified.c_str(), &last_modified_time);
-
- bool has_no_store_header = false;
- std::string cache_control =
- response.httpHeaderField("cache-control").utf8();
-
- std::vector<std::string> values;
- base::SplitString(cache_control, ',', &values);
- for (std::vector<std::string>::const_iterator it = values.begin();
- it != values.end();
- ++it) {
- if (StringToLowerASCII(*it) == "no-store")
- has_no_store_header = true;
- }
-
- GetNexeFd(instance_,
- pexe_url_,
- pexe_opt_level_,
- last_modified_time,
- etag,
- has_no_store_header,
- base::Bind(&PexeDownloader::didGetNexeFd,
- weak_factory_.GetWeakPtr()));
- }
-
- virtual void didGetNexeFd(int32_t pp_error,
- bool cache_hit,
- PP_FileHandle file_handle) {
- if (cache_hit) {
- stream_handler_->DidCacheHit(stream_handler_user_data_, file_handle);
-
- // We delete the PexeDownloader at this point since we successfully got a
- // cached, translated nexe.
- delete this;
- return;
- }
- stream_handler_->DidCacheMiss(stream_handler_user_data_,
- expected_content_length_);
-
- // No translated nexe was found in the cache, so we should download the
- // file to start streaming it.
- url_loader_->setDefersLoading(false);
- }
-
- virtual void didReceiveData(blink::WebURLLoader* loader,
- const char* data,
- int data_length,
- int encoded_data_length) {
- // Stream the data we received to the stream callback.
- stream_handler_->DidStreamData(stream_handler_user_data_,
- data,
- data_length);
- }
-
- virtual void didFinishLoading(blink::WebURLLoader* loader,
- double finish_time,
- int64_t total_encoded_data_length) {
- int32_t result = success_ ? PP_OK : PP_ERROR_FAILED;
- stream_handler_->DidFinishStream(stream_handler_user_data_, result);
- delete this;
- }
-
- virtual void didFail(blink::WebURLLoader* loader,
- const blink::WebURLError& error) {
- success_ = false;
- }
-
- PP_Instance instance_;
- scoped_ptr<blink::WebURLLoader> url_loader_;
- std::string pexe_url_;
- int32_t pexe_opt_level_;
- const PPP_PexeStreamHandler* stream_handler_;
- void* stream_handler_user_data_;
- bool success_;
- int64_t expected_content_length_;
- base::WeakPtrFactory<PexeDownloader> weak_factory_;
-};
-
-void StreamPexe(PP_Instance instance,
- const char* pexe_url,
- int32_t opt_level,
- const PPP_PexeStreamHandler* handler,
- void* handler_user_data) {
- content::PepperPluginInstance* plugin_instance =
- content::PepperPluginInstance::Get(instance);
- if (!plugin_instance) {
- base::MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(handler->DidFinishStream,
- handler_user_data,
- static_cast<int32_t>(PP_ERROR_FAILED)));
- return;
- }
-
- GURL gurl(pexe_url);
- const blink::WebDocument& document =
- plugin_instance->GetContainer()->element().document();
- scoped_ptr<blink::WebURLLoader> url_loader(
- CreateWebURLLoader(document, gurl));
- PexeDownloader* downloader = new PexeDownloader(instance,
- url_loader.Pass(),
- pexe_url,
- opt_level,
- handler,
- handler_user_data);
-
- blink::WebURLRequest url_request = CreateWebURLRequest(document, gurl);
- // Mark the request as requesting a PNaCl bitcode file,
- // so that component updater can detect this user action.
- url_request.addHTTPHeaderField(
- blink::WebString::fromUTF8("Accept"),
- blink::WebString::fromUTF8("application/x-pnacl, */*"));
- downloader->Load(url_request);
-}
-
const PPB_NaCl_Private nacl_interface = {
&LaunchSelLdr,
&StartPpapiProxy,
@@ -1690,6 +1573,7 @@
&CreateTemporaryFile,
&GetNumberOfProcessors,
&PPIsNonSFIModeEnabled,
+ &GetNexeFd,
&ReportTranslationFinished,
&DispatchEvent,
&ReportLoadSuccess,
@@ -1719,8 +1603,7 @@
&ReportSelLdrStatus,
&LogTranslateTime,
&OpenManifestEntry,
- &SetPNaClStartTime,
- &StreamPexe
+ &SetPNaClStartTime
};
} // namespace
« no previous file with comments | « no previous file | trunk/src/ppapi/api/private/ppb_nacl_private.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698