1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/download/download_tab_helper.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/download_manager.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/download/download_util.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/profiles/profile.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/render_messages.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/tab_contents/tab_contents.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenDownloadTabHelper::DownloadTabHelper(TabContents* tab_contents)
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : TabContentsObserver(tab_contents) {
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DCHECK(tab_contents);
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenDownloadTabHelper::~DownloadTabHelper() {
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DownloadTabHelper::OnSavePage() {
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If we can not save the page, try to download it.
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!SavePackage::IsSavableContents(tab_contents()->contents_mime_type())) {
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    DownloadManager* dlm = tab_contents()->profile()->GetDownloadManager();
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const GURL& current_page_url = tab_contents()->GetURL();
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (dlm && current_page_url.is_valid()) {
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      dlm->DownloadUrl(current_page_url, GURL(), "", tab_contents());
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      download_util::RecordDownloadCount(
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          download_util::INITIATED_BY_SAVE_PACKAGE_FAILURE_COUNT);
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_contents()->Stop();
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Create the save package and possibly prompt the user for the name to save
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // the page as. The user prompt is an asynchronous operation that runs on
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // another thread.
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  save_package_ = new SavePackage(tab_contents());
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  save_package_->GetSaveInfo();
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid DownloadTabHelper::OnSaveURL(const GURL& url) {
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DownloadManager* dlm = tab_contents()->profile()->GetDownloadManager();
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  dlm->DownloadUrl(url, tab_contents()->GetURL(), "", tab_contents());
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Used in automated testing to bypass prompting the user for file names.
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Instead, the names and paths are hard coded rather than running them through
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// file name sanitation and extension / mime checking.
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool DownloadTabHelper::SavePage(const FilePath& main_file,
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 const FilePath& dir_path,
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 SavePackage::SavePackageType save_type) {
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Stop the page from navigating.
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_contents()->Stop();
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  save_package_ =
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new SavePackage(tab_contents(), save_type, main_file, dir_path);
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return save_package_->Init();
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool DownloadTabHelper::OnMessageReceived(const IPC::Message& message) {
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool handled = true;
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IPC_BEGIN_MESSAGE_MAP(DownloadTabHelper, message)
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC_MESSAGE_HANDLER(ViewHostMsg_SaveURLAs, OnSaveURL)
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    IPC_MESSAGE_UNHANDLED(handled = false)
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IPC_END_MESSAGE_MAP()
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return handled;
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
73