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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_LOADER_BUFFERED_RESOURCE_HANDLER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_LOADER_BUFFERED_RESOURCE_HANDLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/layered_resource_handler.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_controller.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequest;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceDispatcherHostImpl;
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstruct WebPluginInfo;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to buffer a request until enough data has been received.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BufferedResourceHandler
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public LayeredResourceHandler,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ResourceController {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BufferedResourceHandler(scoped_ptr<ResourceHandler> next_handler,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          ResourceDispatcherHostImpl* host,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          net::URLRequest* request);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BufferedResourceHandler();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceHandler implementation:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetController(ResourceController* controller) OVERRIDE;
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool OnResponseStarted(ResourceResponse* response,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool* defer) OVERRIDE;
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int* buf_size,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int min_size) OVERRIDE;
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool OnReadCompleted(int bytes_read, bool* defer) OVERRIDE;
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnResponseCompleted(const net::URLRequestStatus& status,
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   const std::string& security_info,
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   bool* defer) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ResourceController implementation:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Resume() OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Cancel() OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelAndIgnore() OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelWithError(int error_code) OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ProcessResponse(bool* defer);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldSniffContent();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DetermineMimeType();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SelectNextHandler(bool* defer);
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool UseAlternateNextHandler(scoped_ptr<ResourceHandler> handler,
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               const std::string& payload_for_old_handler);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ReplayReadCompleted(bool* defer);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CallReplayReadCompleted();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MustDownload();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasSupportingPlugin(bool* is_stale);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Copies data from |read_buffer_| to |next_handler_|.
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool CopyReadBufferToNextHandler();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on the IO thread once the list of plugins has been loaded.
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void OnPluginsLoaded(const std::vector<WebPluginInfo>& plugins);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_STARTING,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In this state, we are filling read_buffer_ with data for the purpose
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of sniffing the mime type of the response.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_BUFFERING,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In this state, we are select an appropriate downstream ResourceHandler
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // based on the mime type of the response.  We are also potentially waiting
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // for plugins to load so that we can determine if a plugin is available to
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // handle the mime type.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_PROCESSING,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In this state, we are replaying buffered events (OnResponseStarted and
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // OnReadCompleted) to the downstream ResourceHandler.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_REPLAYING,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // In this state, we are just a blind pass-through ResourceHandler.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_STREAMING
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ResourceResponse> response_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceDispatcherHostImpl* host_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> read_buffer_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int read_buffer_size_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bytes_read_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool must_download_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool must_download_is_set_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<BufferedResourceHandler> weak_ptr_factory_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BufferedResourceHandler);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CONTENT_BROWSER_LOADER_BUFFERED_RESOURCE_HANDLER_H_
111