| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef IOS_WEB_PUBLIC_URL_DATA_SOURCE_IOS_H_ |
| #define IOS_WEB_PUBLIC_URL_DATA_SOURCE_IOS_H_ |
| |
| #include <string> |
| |
| #include "base/callback.h" |
| #include "base/memory/ref_counted.h" |
| |
| class GURL; |
| |
| namespace base { |
| class RefCountedMemory; |
| } |
| |
| namespace web { |
| class BrowserState; |
| |
| // A URLDataSourceIOS is an object that can answer requests for WebUI data |
| // asynchronously. An implementation of URLDataSourceIOS should handle calls to |
| // StartDataRequest() by starting its (implementation-specific) asynchronous |
| // request for the data, then running the callback given in that method to |
| // notify. |
| class URLDataSourceIOS { |
| public: |
| // Adds a URL data source to |browser_state|. |
| static void Add(BrowserState* browser_state, URLDataSourceIOS* source); |
| |
| virtual ~URLDataSourceIOS() {} |
| |
| // The name of this source. |
| // E.g., for favicons, this could be "favicon", which results in paths for |
| // specific resources like "favicon/34" getting sent to this source. For |
| // sources where a scheme is used instead of the hostname as the unique |
| // identifier, the suffix "://" must be added to the return value, eg. for a |
| // URLDataSourceIOS which would display resources with URLs on the form |
| // your-scheme://anything , GetSource() must return "your-scheme://". |
| virtual std::string GetSource() const = 0; |
| |
| // Used by StartDataRequest so that the child class can return the data when |
| // it's available. |
| typedef base::Callback<void(scoped_refptr<base::RefCountedMemory>)> |
| GotDataCallback; |
| |
| // Called by URLDataSourceIOS to request data at |path|. The string parameter |
| // is the path of the request. The child class should run |callback| when the |
| // data is available or if the request could not be satisfied. This can be |
| // called either in this callback or asynchronously with the response. |
| virtual void StartDataRequest(const std::string& path, |
| const GotDataCallback& callback) = 0; |
| |
| // Return the mimetype that should be sent with this response, or empty |
| // string to specify no mime type. |
| virtual std::string GetMimeType(const std::string& path) const = 0; |
| |
| // The following methods are all called on the IO thread. |
| |
| // Returns true if the URLDataSourceIOS should replace an existing |
| // URLDataSourceIOS with the same name that has already been registered. The |
| // default is true. |
| // |
| // WARNING: this is invoked on the IO thread. |
| // |
| // TODO: nuke this and convert all callers to not replace. |
| virtual bool ShouldReplaceExistingSource() const; |
| |
| // Returns true if responses from this URLDataSourceIOS can be cached. |
| virtual bool AllowCaching() const; |
| |
| // By default, "object-src 'none';" is added to CSP. Override to change this. |
| virtual std::string GetContentSecurityPolicyObjectSrc() const; |
| |
| // By default, the "X-Frame-Options: DENY" header is sent. To stop this from |
| // happening, return false. It is OK to return false as needed. |
| virtual bool ShouldDenyXFrameOptions() const; |
| |
| // Whether |path| is gzipped (and should be transmitted gzipped). |
| virtual bool IsGzipped(const std::string& path) const; |
| |
| // By default, only chrome: requests are allowed. Override in specific WebUI |
| // data sources to enable for additional schemes or to implement fancier |
| // access control. Typically used in concert with |
| // WebClient::GetAdditionalWebUISchemes() to permit additional WebUI scheme |
| // support for an embedder. |
| virtual bool ShouldServiceRequest(const GURL& url) const; |
| }; |
| |
| } // namespace web |
| |
| #endif // IOS_WEB_PUBLIC_URL_DATA_SOURCE_IOS_H_ |