| Index: chrome/browser/ssl/ssl_error_handler.cc
 | 
| ===================================================================
 | 
| --- chrome/browser/ssl/ssl_error_handler.cc	(revision 87796)
 | 
| +++ chrome/browser/ssl/ssl_error_handler.cc	(working copy)
 | 
| @@ -1,185 +0,0 @@
 | 
| -// Copyright (c) 2010 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 "chrome/browser/ssl/ssl_error_handler.h"
 | 
| -
 | 
| -#include "chrome/browser/ssl/ssl_cert_error_handler.h"
 | 
| -#include "chrome/browser/tab_contents/tab_util.h"
 | 
| -#include "content/browser/browser_thread.h"
 | 
| -#include "content/browser/renderer_host/resource_dispatcher_host.h"
 | 
| -#include "content/browser/renderer_host/resource_dispatcher_host_request_info.h"
 | 
| -#include "content/browser/tab_contents/tab_contents.h"
 | 
| -#include "net/base/net_errors.h"
 | 
| -#include "net/url_request/url_request.h"
 | 
| -
 | 
| -SSLErrorHandler::SSLErrorHandler(ResourceDispatcherHost* rdh,
 | 
| -                                 net::URLRequest* request,
 | 
| -                                 ResourceType::Type resource_type)
 | 
| -    : manager_(NULL),
 | 
| -      request_id_(0, 0),
 | 
| -      resource_dispatcher_host_(rdh),
 | 
| -      request_url_(request->url()),
 | 
| -      resource_type_(resource_type),
 | 
| -      request_has_been_notified_(false) {
 | 
| -  DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| -
 | 
| -  ResourceDispatcherHostRequestInfo* info =
 | 
| -      ResourceDispatcherHost::InfoForRequest(request);
 | 
| -  request_id_.child_id = info->child_id();
 | 
| -  request_id_.request_id = info->request_id();
 | 
| -
 | 
| -  if (!ResourceDispatcherHost::RenderViewForRequest(request,
 | 
| -                                                    &render_process_host_id_,
 | 
| -                                                    &tab_contents_id_))
 | 
| -    NOTREACHED();
 | 
| -
 | 
| -  // This makes sure we don't disappear on the IO thread until we've given an
 | 
| -  // answer to the net::URLRequest.
 | 
| -  //
 | 
| -  // Release in CompleteCancelRequest, CompleteContinueRequest, or
 | 
| -  // CompleteTakeNoAction.
 | 
| -  AddRef();
 | 
| -}
 | 
| -
 | 
| -SSLErrorHandler::~SSLErrorHandler() {}
 | 
| -
 | 
| -void SSLErrorHandler::OnDispatchFailed() {
 | 
| -  TakeNoAction();
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::OnDispatched() {
 | 
| -  TakeNoAction();
 | 
| -}
 | 
| -
 | 
| -SSLCertErrorHandler* SSLErrorHandler::AsSSLCertErrorHandler() {
 | 
| -  return NULL;
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::Dispatch() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| -
 | 
| -  TabContents* tab_contents = GetTabContents();
 | 
| -  if (!tab_contents) {
 | 
| -    // We arrived on the UI thread, but the tab we're looking for is no longer
 | 
| -    // here.
 | 
| -    OnDispatchFailed();
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // Hand ourselves off to the SSLManager.
 | 
| -  manager_ = tab_contents->controller().ssl_manager();
 | 
| -  OnDispatched();
 | 
| -}
 | 
| -
 | 
| -TabContents* SSLErrorHandler::GetTabContents() {
 | 
| -  return tab_util::GetTabContentsByID(render_process_host_id_,
 | 
| -                                      tab_contents_id_);
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::CancelRequest() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| -
 | 
| -  // We need to complete this task on the IO thread.
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::IO, FROM_HERE,
 | 
| -      NewRunnableMethod(
 | 
| -          this, &SSLErrorHandler::CompleteCancelRequest, net::ERR_ABORTED));
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::DenyRequest() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| -
 | 
| -  // We need to complete this task on the IO thread.
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::IO, FROM_HERE,
 | 
| -      NewRunnableMethod(
 | 
| -          this, &SSLErrorHandler::CompleteCancelRequest,
 | 
| -          net::ERR_INSECURE_RESPONSE));
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::ContinueRequest() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| -
 | 
| -  // We need to complete this task on the IO thread.
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::IO, FROM_HERE,
 | 
| -      NewRunnableMethod(this, &SSLErrorHandler::CompleteContinueRequest));
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::TakeNoAction() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 | 
| -
 | 
| -  // We need to complete this task on the IO thread.
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::IO, FROM_HERE,
 | 
| -      NewRunnableMethod(this, &SSLErrorHandler::CompleteTakeNoAction));
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::CompleteCancelRequest(int error) {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 | 
| -
 | 
| -  // It is important that we notify the net::URLRequest only once.  If we try
 | 
| -  // to notify the request twice, it may no longer exist and |this| might have
 | 
| -  // already have been deleted.
 | 
| -  DCHECK(!request_has_been_notified_);
 | 
| -  if (request_has_been_notified_)
 | 
| -    return;
 | 
| -
 | 
| -  net::URLRequest* request =
 | 
| -      resource_dispatcher_host_->GetURLRequest(request_id_);
 | 
| -  if (request) {
 | 
| -    // The request can be NULL if it was cancelled by the renderer (as the
 | 
| -    // result of the user navigating to a new page from the location bar).
 | 
| -    DVLOG(1) << "CompleteCancelRequest() url: " << request->url().spec();
 | 
| -    SSLCertErrorHandler* cert_error = AsSSLCertErrorHandler();
 | 
| -    if (cert_error)
 | 
| -      request->SimulateSSLError(error, cert_error->ssl_info());
 | 
| -    else
 | 
| -      request->SimulateError(error);
 | 
| -  }
 | 
| -  request_has_been_notified_ = true;
 | 
| -
 | 
| -  // We're done with this object on the IO thread.
 | 
| -  Release();
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::CompleteContinueRequest() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 | 
| -
 | 
| -  // It is important that we notify the net::URLRequest only once. If we try to
 | 
| -  // notify the request twice, it may no longer exist and |this| might have
 | 
| -  // already have been deleted.
 | 
| -  DCHECK(!request_has_been_notified_);
 | 
| -  if (request_has_been_notified_)
 | 
| -    return;
 | 
| -
 | 
| -  net::URLRequest* request =
 | 
| -      resource_dispatcher_host_->GetURLRequest(request_id_);
 | 
| -  if (request) {
 | 
| -    // The request can be NULL if it was cancelled by the renderer (as the
 | 
| -    // result of the user navigating to a new page from the location bar).
 | 
| -    DVLOG(1) << "CompleteContinueRequest() url: " << request->url().spec();
 | 
| -    request->ContinueDespiteLastError();
 | 
| -  }
 | 
| -  request_has_been_notified_ = true;
 | 
| -
 | 
| -  // We're done with this object on the IO thread.
 | 
| -  Release();
 | 
| -}
 | 
| -
 | 
| -void SSLErrorHandler::CompleteTakeNoAction() {
 | 
| -  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 | 
| -
 | 
| -  // It is important that we notify the net::URLRequest only once. If we try to
 | 
| -  // notify the request twice, it may no longer exist and |this| might have
 | 
| -  // already have been deleted.
 | 
| -  DCHECK(!request_has_been_notified_);
 | 
| -  if (request_has_been_notified_)
 | 
| -    return;
 | 
| -
 | 
| -  request_has_been_notified_ = true;
 | 
| -
 | 
| -  // We're done with this object on the IO thread.
 | 
| -  Release();
 | 
| -}
 | 
| 
 |