blob: 87bc1da445eb196725ec757af3f4b0f2b485c686 [file] [log] [blame]
// Copyright (c) 2012 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 CONTENT_BROWSER_SSL_SSL_ERROR_HANDLER_H_
#define CONTENT_BROWSER_SSL_SSL_ERROR_HANDLER_H_
#include <string>
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/global_request_id.h"
#include "url/gurl.h"
#include "webkit/common/resource_type.h"
namespace net {
class SSLInfo;
class URLRequest;
} // namespace net
namespace content {
class ResourceDispatcherHostImpl;
class SSLCertErrorHandler;
class SSLManager;
// An SSLErrorHandler carries information from the IO thread to the UI thread
// and is dispatched to the appropriate SSLManager when it arrives on the
// UI thread. Subclasses should override the OnDispatched/OnDispatchFailed
// methods to implement the actions that should be taken on the UI thread.
// These methods can call the different convenience methods ContinueRequest/
// CancelRequest to perform any required action on the net::URLRequest the
// ErrorHandler was created with.
//
// IMPORTANT NOTE:
//
// If you are not doing anything in OnDispatched/OnDispatchFailed, make sure
// you call TakeNoAction(). This is necessary for ensuring the instance is
// not leaked.
//
class SSLErrorHandler : public base::RefCountedThreadSafe<SSLErrorHandler> {
public:
// Delegate functions must be called from IO thread. All functions accept
// |id| as the first argument. |id| is a copy of the second argument of
// SSLManager::OnSSLCertificateError() and represents the request.
// Finally, CancelSSLRequest() or ContinueSSLRequest() will be called after
// SSLErrorHandler makes a decision on the SSL error.
class CONTENT_EXPORT Delegate {
public:
// Called when SSLErrorHandler decides to cancel the request because of
// the SSL error.
virtual void CancelSSLRequest(const GlobalRequestID& id,
int error,
const net::SSLInfo* ssl_info) = 0;
// Called when SSLErrorHandler decides to continue the request despite the
// SSL error.
virtual void ContinueSSLRequest(const GlobalRequestID& id) = 0;
protected:
virtual ~Delegate() {}
};
virtual SSLCertErrorHandler* AsSSLCertErrorHandler();
// Find the appropriate SSLManager for the net::URLRequest and begin handling
// this error.
//
// Call on UI thread.
void Dispatch();
// Available on either thread.
const GURL& request_url() const { return request_url_; }
// Available on either thread.
ResourceType::Type resource_type() const { return resource_type_; }
// Cancels the associated net::URLRequest.
// This method can be called from OnDispatchFailed and OnDispatched.
CONTENT_EXPORT void CancelRequest();
// Continue the net::URLRequest ignoring any previous errors. Note that some
// errors cannot be ignored, in which case this will result in the request
// being canceled.
// This method can be called from OnDispatchFailed and OnDispatched.
void ContinueRequest();
// Cancels the associated net::URLRequest and mark it as denied. The renderer
// processes such request in a special manner, optionally replacing them
// with alternate content (typically frames content is replaced with a
// warning message).
// This method can be called from OnDispatchFailed and OnDispatched.
void DenyRequest();
// Does nothing on the net::URLRequest but ensures the current instance ref
// count is decremented appropriately. Subclasses that do not want to
// take any specific actions in their OnDispatched/OnDispatchFailed should
// call this.
void TakeNoAction();
int render_process_id() const { return render_process_id_; }
int render_frame_id() const { return render_frame_id_; }
protected:
friend class base::RefCountedThreadSafe<SSLErrorHandler>;
// Construct on the IO thread.
SSLErrorHandler(const base::WeakPtr<Delegate>& delegate,
const GlobalRequestID& id,
ResourceType::Type resource_type,
const GURL& url,
int render_process_id,
int render_frame_id);
virtual ~SSLErrorHandler();
// The following 2 methods are the methods subclasses should implement.
virtual void OnDispatchFailed();
// Can use the manager_ member.
virtual void OnDispatched();
// Should only be accessed on the UI thread.
SSLManager* manager_; // Our manager.
// The id of the request associated with this object.
// Should only be accessed from the IO thread.
GlobalRequestID request_id_;
// The delegate we are associated with.
base::WeakPtr<Delegate> delegate_;
private:
// Completes the CancelRequest operation on the IO thread.
// Call on the IO thread.
void CompleteCancelRequest(int error);
// Completes the ContinueRequest operation on the IO thread.
//
// Call on the IO thread.
void CompleteContinueRequest();
// Derefs this instance.
// Call on the IO thread.
void CompleteTakeNoAction();
// We use these members to find the correct SSLManager when we arrive on
// the UI thread.
int render_process_id_;
int render_frame_id_;
// The URL that we requested.
// This read-only member can be accessed on any thread.
const GURL request_url_;
// What kind of resource is associated with the requested that generated
// that error.
// This read-only member can be accessed on any thread.
const ResourceType::Type resource_type_;
// A flag to make sure we notify the net::URLRequest exactly once.
// Should only be accessed on the IO thread
bool request_has_been_notified_;
DISALLOW_COPY_AND_ASSIGN(SSLErrorHandler);
};
} // namespace content
#endif // CONTENT_BROWSER_SSL_SSL_ERROR_HANDLER_H_