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