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