15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#ifndef CONTENT_CHILD_NPAPI_PLUGIN_STREAM_URL_H_ 6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define CONTENT_CHILD_NPAPI_PLUGIN_STREAM_URL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <vector> 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/child/npapi/plugin_stream.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/child/npapi/webplugin_resource_client.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginInstance; 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PluginURLFetcher; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A NPAPI Stream based on a URL. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginStreamUrl : public PluginStream, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public WebPluginResourceClient { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new stream for sending to the plugin by fetching 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a URL. If notifyNeeded is set, then the plugin will be notified 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the stream has been fully sent to the plugin. Initialize 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must be called before the object is used. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginStreamUrl(unsigned long resource_id, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL &url, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginInstance *instance, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool notify_needed, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *notify_data); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void SetPluginURLFetcher(PluginURLFetcher* fetcher); 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void URLRedirectResponse(bool allow); 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch void FetchRange(const std::string& range); 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stop sending the stream to the client. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides the base Close so we can cancel our fetching the URL if 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is still loading. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Close(NPReason reason) OVERRIDE; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebPluginResourceClient* AsResourceClient() OVERRIDE; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelRequest() OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebPluginResourceClient methods 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WillSendRequest(const GURL& url, int http_status_code) OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidReceiveResponse(const std::string& mime_type, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& headers, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 expected_length, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 last_modified, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool request_is_seekable) OVERRIDE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidReceiveData(const char* buffer, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int length, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_offset) OVERRIDE; 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidFinishLoading(unsigned long resource_id) OVERRIDE; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DidFail(unsigned long resource_id) OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsMultiByteResponseExpected() OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int ResourceId() OVERRIDE; 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void AddRangeRequestResourceId(unsigned long resource_id) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PluginStreamUrl(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetDeferLoading(bool value); 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // In case of a redirect, this can be called to update the url. But it must 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // be called before Open(). 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void UpdateUrl(const char* url); 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long id_; 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Ids of additional resources requested via range requests issued on 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // seekable streams. 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // This is used when we're loading resources through the renderer, i.e. not 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // using plugin_url_fetcher_. 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<unsigned long> range_requests_; 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // This is used when we're using plugin_url_fetcher_. 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<PluginURLFetcher*> range_request_fetchers_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If the plugin participates in HTTP URL redirect handling then this member 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // holds the url being redirected to while we wait for the plugin to make a 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // decision on whether to allow or deny the redirect. 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string pending_redirect_url_; 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<PluginURLFetcher> plugin_url_fetcher_; 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PluginStreamUrl); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace content 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // CONTENT_CHILD_NPAPI_PLUGIN_STREAM_URL_H_ 96