blob: 6ddd45128ffe9202177d7b616876855391517c2a [file] [log] [blame]
// 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.
#include <string>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
namespace base {
class MessageLoop;
class RefCountedMemory;
namespace net {
class URLRequest;
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 {
// 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>)>
// 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;
// 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 net::URLRequest* request) const;
// Called to inform the source that StartDataRequest() will be called soon.
// Gives the source an opportunity to rewrite |path| to incorporate extra
// information from the URLRequest prior to serving.
virtual void WillServiceRequest(const net::URLRequest* request,
std::string* path) const {}
} // namespace web