Index: webkit/plugins/ppapi/ppapi_plugin_instance.cc |
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc |
index 565478ce759511d4b169a0fbcb758f3c3c4a8cc1..0bd76f4a3cefc7e6df2cf9e990664d696fdb750b 100644 |
--- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc |
+++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc |
@@ -40,6 +40,7 @@ |
#include "ppapi/shared_impl/resource.h" |
#include "ppapi/shared_impl/scoped_pp_resource.h" |
#include "ppapi/shared_impl/time_conversion.h" |
+#include "ppapi/shared_impl/url_request_info_data.h" |
#include "ppapi/shared_impl/var.h" |
#include "ppapi/thunk/enter.h" |
#include "ppapi/thunk/ppb_buffer_api.h" |
@@ -50,6 +51,7 @@ |
#include "third_party/WebKit/Source/Platform/chromium/public/WebGamepads.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" |
+#include "third_party/WebKit/Source/Platform/chromium/public/WebURLError.h" |
#include "third_party/WebKit/Source/Platform/chromium/public/WebURLRequest.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCompositionUnderline.h" |
@@ -84,7 +86,6 @@ |
#include "webkit/plugins/ppapi/ppb_buffer_impl.h" |
#include "webkit/plugins/ppapi/ppb_graphics_3d_impl.h" |
#include "webkit/plugins/ppapi/ppb_image_data_impl.h" |
-#include "webkit/plugins/ppapi/ppb_url_loader_impl.h" |
#include "webkit/plugins/ppapi/ppp_pdf.h" |
#include "webkit/plugins/ppapi/url_request_info_util.h" |
#include "webkit/plugins/sad_plugin.h" |
@@ -134,7 +135,11 @@ using WebKit::WebPrintParams; |
using WebKit::WebPrintScalingOption; |
using WebKit::WebScopedUserGesture; |
using WebKit::WebString; |
+using WebKit::WebURLError; |
+using WebKit::WebURLLoader; |
+using WebKit::WebURLLoaderClient; |
using WebKit::WebURLRequest; |
+using WebKit::WebURLResponse; |
using WebKit::WebUserGestureIndicator; |
using WebKit::WebUserGestureToken; |
using WebKit::WebView; |
@@ -319,6 +324,51 @@ PluginInstance* PluginInstance::Create(PluginDelegate* delegate, |
plugin_url); |
} |
+PluginInstance::NaClDocumentLoader::NaClDocumentLoader() |
+ : finished_loading_(false) { |
+} |
+ |
+PluginInstance::NaClDocumentLoader::~NaClDocumentLoader(){ |
+} |
+ |
+void PluginInstance::NaClDocumentLoader::ReplayReceivedData( |
+ WebURLLoaderClient* document_loader) { |
+ for (std::list<std::string>::iterator it = data_.begin(); |
+ it != data_.end(); ++it) { |
+ document_loader->didReceiveData(NULL, it->c_str(), it->length(), |
+ 0 /* encoded_data_length */); |
+ } |
+ if (finished_loading_) { |
+ document_loader->didFinishLoading(NULL, |
+ 0 /* finish_time */); |
+ } |
+ if (error_.get()) { |
+ document_loader->didFail(NULL, *error_); |
+ } |
+} |
+ |
+void PluginInstance::NaClDocumentLoader::didReceiveData( |
+ WebURLLoader* loader, |
+ const char* data, |
+ int data_length, |
+ int encoded_data_length) { |
+ data_.push_back(std::string(data, data_length)); |
+} |
+ |
+void PluginInstance::NaClDocumentLoader::didFinishLoading( |
+ WebURLLoader* loader, |
+ double finish_time) { |
+ DCHECK(!finished_loading_); |
+ finished_loading_ = true; |
+} |
+ |
+void PluginInstance::NaClDocumentLoader::didFail( |
+ WebURLLoader* loader, |
+ const WebURLError& error) { |
+ DCHECK(!error_.get()); |
+ error_.reset(new WebURLError(error)); |
+} |
+ |
PluginInstance::GamepadImpl::GamepadImpl(PluginDelegate* delegate) |
: Resource(::ppapi::Resource::Untracked()), |
delegate_(delegate) { |
@@ -385,7 +435,9 @@ PluginInstance::PluginInstance( |
text_input_caret_set_(false), |
selection_caret_(0), |
selection_anchor_(0), |
- pending_user_gesture_(0.0) { |
+ pending_user_gesture_(0.0), |
+ document_loader_(NULL), |
+ nacl_document_load_(false) { |
pp_instance_ = HostGlobals::Get()->AddInstance(this); |
memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
@@ -397,6 +449,12 @@ PluginInstance::PluginInstance( |
view_data_.is_page_visible = delegate->IsPageVisible(); |
resource_creation_ = delegate_->CreateResourceCreationAPI(this); |
+ |
+ // TODO(bbudge) remove this when the trusted NaCl plugin has been removed. |
+ // We must defer certain plugin events for NaCl instances since we switch |
+ // from the in-process to the out-of-process proxy after instantiating them. |
+ if (module->name() == "Native Client") |
+ nacl_document_load_ = true; |
} |
PluginInstance::~PluginInstance() { |
@@ -596,13 +654,27 @@ bool PluginInstance::Initialize(const std::vector<std::string>& arg_names, |
return success; |
} |
-bool PluginInstance::HandleDocumentLoad(PPB_URLLoader_Impl* loader) { |
- if (!document_loader_) |
- document_loader_ = loader; |
- DCHECK(loader == document_loader_.get()); |
- |
- return PP_ToBool(instance_interface_->HandleDocumentLoad( |
- pp_instance(), loader->pp_resource())); |
+bool PluginInstance::HandleDocumentLoad( |
+ const WebKit::WebURLResponse& response) { |
+ DCHECK(!document_loader_); |
+ if (!nacl_document_load_) { |
+ if (module()->is_crashed()) { |
+ // Don't create a resource for a crashed plugin. |
+ container()->element().document().frame()->stopLoading(); |
+ return false; |
+ } |
+ delegate()->HandleDocumentLoad(this, response); |
+ // If the load was not abandoned, document_loader_ will now be set. It's |
+ // possible that the load was canceled by now and document_loader_ was |
+ // already nulled out. |
+ } else { |
+ // The NaCl proxy isn't available, so save the response and record document |
+ // load notifications for later replay. |
+ nacl_document_response_ = response; |
+ nacl_document_loader_.reset(new NaClDocumentLoader()); |
+ document_loader_ = nacl_document_loader_.get(); |
+ } |
+ return true; |
} |
bool PluginInstance::SendCompositionEventToPlugin(PP_InputEvent_Type type, |
@@ -2452,9 +2524,18 @@ PP_NaClResult PluginInstance::ResetAsProxied( |
view_change_weak_ptr_factory_.InvalidateWeakPtrs(); |
SendDidChangeView(); |
- // If we received HandleDocumentLoad, re-send it now via the proxy. |
- if (document_loader_) |
- HandleDocumentLoad(document_loader_.get()); |
+ DCHECK(nacl_document_load_); |
+ nacl_document_load_ = false; |
+ if (!nacl_document_response_.isNull()) { |
+ document_loader_ = NULL; |
+ // Pass the response to the new proxy. |
+ HandleDocumentLoad(nacl_document_response_); |
+ nacl_document_response_ = WebKit::WebURLResponse(); |
+ // Replay any document load events we've received to the real loader. |
+ nacl_document_loader_->ReplayReceivedData(document_loader_); |
+ nacl_document_loader_.reset(NULL); |
+ } |
+ |
return PP_NACL_OK; |
} |