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