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