1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_RENDERER_PEPPER_PEPPER_URL_LOADER_HOST_H_ 6 #define CONTENT_RENDERER_PEPPER_PEPPER_URL_LOADER_HOST_H_ 7 8 #include <vector> 9 10 #include "base/memory/scoped_vector.h" 11 #include "base/memory/weak_ptr.h" 12 #include "content/common/content_export.h" 13 #include "ppapi/host/resource_host.h" 14 #include "ppapi/proxy/resource_message_params.h" 15 #include "ppapi/shared_impl/url_request_info_data.h" 16 #include "ppapi/shared_impl/url_response_info_data.h" 17 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 18 19 namespace blink { 20 class WebLocalFrame; 21 class WebURLLoader; 22 } 23 24 namespace content { 25 26 class RendererPpapiHostImpl; 27 28 class PepperURLLoaderHost : public ppapi::host::ResourceHost, 29 public blink::WebURLLoaderClient { 30 public: 31 // If main_document_loader is true, PP_Resource must be 0 since it will be 32 // pending until the plugin resource attaches to it. 33 PepperURLLoaderHost(RendererPpapiHostImpl* host, 34 bool main_document_loader, 35 PP_Instance instance, 36 PP_Resource resource); 37 virtual ~PepperURLLoaderHost(); 38 39 // ResourceHost implementation. 40 virtual int32_t OnResourceMessageReceived( 41 const IPC::Message& msg, 42 ppapi::host::HostMessageContext* context) OVERRIDE; 43 44 // blink::WebURLLoaderClient implementation. 45 virtual void willSendRequest(blink::WebURLLoader* loader, 46 blink::WebURLRequest& new_request, 47 const blink::WebURLResponse& redir_response); 48 virtual void didSendData(blink::WebURLLoader* loader, 49 unsigned long long bytes_sent, 50 unsigned long long total_bytes_to_be_sent); 51 virtual void didReceiveResponse(blink::WebURLLoader* loader, 52 const blink::WebURLResponse& response); 53 virtual void didDownloadData(blink::WebURLLoader* loader, 54 int data_length, 55 int encoded_data_length); 56 virtual void didReceiveData(blink::WebURLLoader* loader, 57 const char* data, 58 int data_length, 59 int encoded_data_length); 60 virtual void didFinishLoading(blink::WebURLLoader* loader, 61 double finish_time, 62 int64_t total_encoded_data_length); 63 virtual void didFail(blink::WebURLLoader* loader, 64 const blink::WebURLError& error); 65 66 private: 67 // ResourceHost protected overrides. 68 virtual void DidConnectPendingHostToResource() OVERRIDE; 69 70 // IPC messages 71 int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context, 72 const ppapi::URLRequestInfoData& request_data); 73 int32_t InternalOnHostMsgOpen(ppapi::host::HostMessageContext* context, 74 const ppapi::URLRequestInfoData& request_data); 75 int32_t OnHostMsgSetDeferLoading(ppapi::host::HostMessageContext* context, 76 bool defers_loading); 77 int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context); 78 int32_t OnHostMsgGrantUniversalAccess( 79 ppapi::host::HostMessageContext* context); 80 81 // Sends or queues an unsolicited message to the plugin resource. This 82 // handles cases where messages must be reordered for the plugin and 83 // the case where we have created a pending host resource and the 84 // plugin has not connected to us yet. 85 // 86 // Takes ownership of the given pointer. 87 void SendUpdateToPlugin(IPC::Message* msg); 88 89 // Sends or queues an unsolicited message to the plugin resource. This is 90 // used inside SendUpdateToPlugin for messages that are already ordered 91 // properly. 92 // 93 // Takes ownership of the given pointer. 94 void SendOrderedUpdateToPlugin(IPC::Message* msg); 95 96 void Close(); 97 98 // Returns the frame for the current request. 99 blink::WebLocalFrame* GetFrame(); 100 101 // Calls SetDefersLoading on the current load. This encapsulates the logic 102 // differences between document loads and regular ones. 103 void SetDefersLoading(bool defers_loading); 104 105 // Converts a WebURLResponse to a URLResponseInfo and saves it. 106 void SaveResponse(const blink::WebURLResponse& response); 107 void DidDataFromWebURLResponse(const ppapi::URLResponseInfoData& data); 108 109 // Sends the UpdateProgress message (if necessary) to the plugin. 110 void UpdateProgress(); 111 112 // Non-owning pointer. 113 RendererPpapiHostImpl* renderer_ppapi_host_; 114 115 // If true, then the plugin instance is a full-frame plugin and we're just 116 // wrapping the main document's loader (i.e. loader_ is null). 117 bool main_document_loader_; 118 119 // The data that generated the request. 120 ppapi::URLRequestInfoData request_data_; 121 122 // Set to true when this loader can ignore same originl policy. 123 bool has_universal_access_; 124 125 // The loader associated with this request. MAY BE NULL. 126 // 127 // This will be NULL if the load hasn't been opened yet, or if this is a main 128 // document loader (when registered as a mime type). Therefore, you should 129 // always NULL check this value before using it. In the case of a main 130 // document load, you would call the functions on the document to cancel the 131 // load, etc. since there is no loader. 132 scoped_ptr<blink::WebURLLoader> loader_; 133 134 int64_t bytes_sent_; 135 int64_t total_bytes_to_be_sent_; 136 int64_t bytes_received_; 137 int64_t total_bytes_to_be_received_; 138 139 // Messages sent while the resource host is pending. These will be forwarded 140 // to the plugin when the plugin side connects. The pointers are owned by 141 // this object and must be deleted. 142 ScopedVector<IPC::Message> pending_replies_; 143 ScopedVector<IPC::Message> out_of_order_replies_; 144 145 // True when there's a pending DataFromURLResponse call which will send a 146 // PpapiPluginMsg_URLLoader_ReceivedResponse to the plugin, which introduces 147 // ordering constraints on following messages to the plugin. 148 bool pending_response_; 149 150 base::WeakPtrFactory<PepperURLLoaderHost> weak_factory_; 151 152 DISALLOW_COPY_AND_ASSIGN(PepperURLLoaderHost); 153 }; 154 155 } // namespace content 156 157 #endif // CONTENT_RENDERER_PEPPER_PEPPER_URL_LOADER_HOST_H_ 158