// Copyright (c) 2012 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. #ifndef CONTENT_CHILD_NPAPI_PLUGIN_STREAM_URL_H_ #define CONTENT_CHILD_NPAPI_PLUGIN_STREAM_URL_H_ #include #include "base/memory/scoped_ptr.h" #include "content/child/npapi/plugin_stream.h" #include "content/child/npapi/webplugin_resource_client.h" #include "url/gurl.h" namespace content { class PluginInstance; class PluginURLFetcher; // A NPAPI Stream based on a URL. class PluginStreamUrl : public PluginStream, public WebPluginResourceClient { public: // Create a new stream for sending to the plugin by fetching // a URL. If notifyNeeded is set, then the plugin will be notified // when the stream has been fully sent to the plugin. Initialize // must be called before the object is used. PluginStreamUrl(unsigned long resource_id, const GURL &url, PluginInstance *instance, bool notify_needed, void *notify_data); void SetPluginURLFetcher(PluginURLFetcher* fetcher); void URLRedirectResponse(bool allow); void FetchRange(const std::string& range); // Stop sending the stream to the client. // Overrides the base Close so we can cancel our fetching the URL if // it is still loading. bool Close(NPReason reason) override; WebPluginResourceClient* AsResourceClient() override; void CancelRequest() override; // WebPluginResourceClient methods void WillSendRequest(const GURL& url, int http_status_code) override; void DidReceiveResponse(const std::string& mime_type, const std::string& headers, uint32 expected_length, uint32 last_modified, bool request_is_seekable) override; void DidReceiveData(const char* buffer, int length, int data_offset) override; void DidFinishLoading(unsigned long resource_id) override; void DidFail(unsigned long resource_id) override; bool IsMultiByteResponseExpected() override; int ResourceId() override; void AddRangeRequestResourceId(unsigned long resource_id) override; protected: ~PluginStreamUrl() override; private: void SetDeferLoading(bool value); // In case of a redirect, this can be called to update the url. But it must // be called before Open(). void UpdateUrl(const char* url); GURL url_; unsigned long id_; // Ids of additional resources requested via range requests issued on // seekable streams. // This is used when we're loading resources through the renderer, i.e. not // using plugin_url_fetcher_. std::vector range_requests_; // This is used when we're using plugin_url_fetcher_. std::vector range_request_fetchers_; // If the plugin participates in HTTP URL redirect handling then this member // holds the url being redirected to while we wait for the plugin to make a // decision on whether to allow or deny the redirect. std::string pending_redirect_url_; scoped_ptr plugin_url_fetcher_; DISALLOW_COPY_AND_ASSIGN(PluginStreamUrl); }; } // namespace content #endif // CONTENT_CHILD_NPAPI_PLUGIN_STREAM_URL_H_