1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_TEST_WEBURL_LOADER_MOCK_FACTORY_H_
6#define CONTENT_TEST_WEBURL_LOADER_MOCK_FACTORY_H_
7
8#include <map>
9
10#include "base/files/file_path.h"
11#include "third_party/WebKit/public/platform/WebURL.h"
12#include "third_party/WebKit/public/platform/WebURLError.h"
13#include "third_party/WebKit/public/platform/WebURLRequest.h"
14#include "third_party/WebKit/public/platform/WebURLResponse.h"
15
16namespace blink {
17class WebData;
18class WebURLLoader;
19}
20
21class WebURLLoaderMock;
22
23// A factory that creates WebURLLoaderMock to simulate resource loading in
24// tests.
25// You register files for specific URLs, the content of the file is then served
26// when these URLs are loaded.
27// In order to serve the asynchronous requests, you need to invoke
28// ServeAsynchronousRequest.
29class WebURLLoaderMockFactory {
30 public:
31  WebURLLoaderMockFactory();
32  virtual ~WebURLLoaderMockFactory();
33
34  // Called by TestWebKitPlatformSupport to create a WebURLLoader.
35  // Non-mocked request are forwarded to |default_loader| which should not be
36  // NULL.
37  virtual blink::WebURLLoader* CreateURLLoader(
38      blink::WebURLLoader* default_loader);
39
40  // Registers a response and the contents to be served when the specified URL
41  // is loaded.
42  void RegisterURL(const blink::WebURL& url,
43                   const blink::WebURLResponse& response,
44                   const blink::WebString& filePath);
45
46  // Registers an error to be served when the specified URL is requested.
47  void RegisterErrorURL(const blink::WebURL& url,
48                        const blink::WebURLResponse& response,
49                        const blink::WebURLError& error);
50
51  // Unregisters |url| so it will no longer be mocked.
52  void UnregisterURL(const blink::WebURL& url);
53
54  // Unregister all URLs so no URL will be mocked anymore.
55  void UnregisterAllURLs();
56
57  // Serves all the pending asynchronous requests.
58  void ServeAsynchronousRequests();
59
60  // Returns the last request handled by |ServeAsynchronousRequests()|.
61  blink::WebURLRequest GetLastHandledAsynchronousRequest();
62
63  // Returns true if |url| was registered for being mocked.
64  bool IsMockedURL(const blink::WebURL& url);
65
66  // Called by the loader to load a resource.
67  void LoadSynchronously(const blink::WebURLRequest& request,
68                         blink::WebURLResponse* response,
69                         blink::WebURLError* error,
70                         blink::WebData* data);
71  void LoadAsynchronouly(const blink::WebURLRequest& request,
72                         WebURLLoaderMock* loader);
73
74  // Removes the loader from the list of pending loaders.
75  void CancelLoad(WebURLLoaderMock* loader);
76
77 private:
78  struct ResponseInfo {
79    blink::WebURLResponse response;
80    base::FilePath file_path;
81  };
82
83
84  // Loads the specified request and populates the response, error and data
85  // accordingly.
86  void LoadRequest(const blink::WebURLRequest& request,
87                   blink::WebURLResponse* response,
88                   blink::WebURLError* error,
89                   blink::WebData* data);
90
91  // Checks if the loader is pending. Otherwise, it may have been deleted.
92  bool IsPending(WebURLLoaderMock* loader);
93
94  // Reads |m_filePath| and puts its content in |data|.
95  // Returns true if it successfully read the file.
96  static bool ReadFile(const base::FilePath& file_path, blink::WebData* data);
97
98  // The loaders that have not being served data yet.
99  typedef std::map<WebURLLoaderMock*, blink::WebURLRequest> LoaderToRequestMap;
100  LoaderToRequestMap pending_loaders_;
101
102  typedef std::map<GURL, blink::WebURLError> URLToErrorMap;
103  URLToErrorMap url_to_error_info_;
104
105  // Table of the registered URLs and the responses that they should receive.
106  typedef std::map<GURL, ResponseInfo> URLToResponseMap;
107  URLToResponseMap url_to_reponse_info_;
108
109  blink::WebURLRequest last_handled_asynchronous_request_;
110
111  DISALLOW_COPY_AND_ASSIGN(WebURLLoaderMockFactory);
112};
113
114#endif  // CONTENT_TEST_WEBURL_LOADER_MOCK_FACTORY_H_
115
116