普通文本  |  73行  |  2.57 KB

// Copyright (c) 2011 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/ui/download/download_tab_helper.h"

#include "chrome/browser/download/download_manager.h"
#include "chrome/browser/download/download_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/render_messages.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "content/common/view_messages.h"

DownloadTabHelper::DownloadTabHelper(TabContents* tab_contents)
    : TabContentsObserver(tab_contents) {
  DCHECK(tab_contents);
}

DownloadTabHelper::~DownloadTabHelper() {
}

void DownloadTabHelper::OnSavePage() {
  // If we can not save the page, try to download it.
  if (!SavePackage::IsSavableContents(tab_contents()->contents_mime_type())) {
    DownloadManager* dlm = tab_contents()->profile()->GetDownloadManager();
    const GURL& current_page_url = tab_contents()->GetURL();
    if (dlm && current_page_url.is_valid()) {
      dlm->DownloadUrl(current_page_url, GURL(), "", tab_contents());
      download_util::RecordDownloadCount(
          download_util::INITIATED_BY_SAVE_PACKAGE_FAILURE_COUNT);
    }
    return;
  }

  tab_contents()->Stop();

  // Create the save package and possibly prompt the user for the name to save
  // the page as. The user prompt is an asynchronous operation that runs on
  // another thread.
  save_package_ = new SavePackage(tab_contents());
  save_package_->GetSaveInfo();
}

void DownloadTabHelper::OnSaveURL(const GURL& url) {
  DownloadManager* dlm = tab_contents()->profile()->GetDownloadManager();
  dlm->DownloadUrl(url, tab_contents()->GetURL(), "", tab_contents());
}

// Used in automated testing to bypass prompting the user for file names.
// Instead, the names and paths are hard coded rather than running them through
// file name sanitation and extension / mime checking.
bool DownloadTabHelper::SavePage(const FilePath& main_file,
                                 const FilePath& dir_path,
                                 SavePackage::SavePackageType save_type) {
  // Stop the page from navigating.
  tab_contents()->Stop();

  save_package_ =
      new SavePackage(tab_contents(), save_type, main_file, dir_path);
  return save_package_->Init();
}

bool DownloadTabHelper::OnMessageReceived(const IPC::Message& message) {
  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP(DownloadTabHelper, message)
    IPC_MESSAGE_HANDLER(ViewHostMsg_SaveURLAs, OnSaveURL)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()

  return handled;
}