diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-18 15:57:59 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-18 15:57:59 +0000 |
commit | c7dd2f6792d98f18833eaad7fd75042030cf36fc (patch) | |
tree | d97d9b15ba9451efde03be9b1a37d58fc9837f23 /content | |
parent | 738f3659678e9b8fe7127a74cdc1ebe42f201a6d (diff) | |
download | chromium_src-c7dd2f6792d98f18833eaad7fd75042030cf36fc.zip chromium_src-c7dd2f6792d98f18833eaad7fd75042030cf36fc.tar.gz chromium_src-c7dd2f6792d98f18833eaad7fd75042030cf36fc.tar.bz2 |
Move save stuff from download helper back to TabContents. This is a revert of r80962.
BUG=82782
Review URL: http://codereview.chromium.org/7398013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92856 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/browser/download/save_file_manager.cc | 9 | ||||
-rw-r--r-- | content/browser/download/save_package.cc | 29 | ||||
-rw-r--r-- | content/browser/download/save_package.h | 19 | ||||
-rw-r--r-- | content/browser/download/save_package_unittest.cc | 14 | ||||
-rw-r--r-- | content/browser/tab_contents/tab_contents.cc | 42 | ||||
-rw-r--r-- | content/browser/tab_contents/tab_contents.h | 22 |
6 files changed, 93 insertions, 42 deletions
diff --git a/content/browser/download/save_file_manager.cc b/content/browser/download/save_file_manager.cc index 76ac4fa..16b900a 100644 --- a/content/browser/download/save_file_manager.cc +++ b/content/browser/download/save_file_manager.cc @@ -14,8 +14,6 @@ #include "base/threading/thread.h" #include "chrome/browser/platform_util.h" #include "chrome/browser/tab_contents/tab_util.h" -#include "chrome/browser/ui/download/download_tab_helper.h" -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/chrome_paths.h" #include "content/browser/browser_thread.h" #include "content/browser/download/save_file.h" @@ -187,11 +185,8 @@ SavePackage* SaveFileManager::GetSavePackageFromRenderIds( int render_process_id, int render_view_id) { TabContents* contents = tab_util::GetTabContentsByID(render_process_id, render_view_id); - if (contents) { - TabContentsWrapper* wrapper = - TabContentsWrapper::GetCurrentWrapperForContents(contents); - return wrapper->download_tab_helper()->save_package(); - } + if (contents) + return contents->save_package(); return NULL; } diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc index 12591462..6420268 100644 --- a/content/browser/download/save_package.cc +++ b/content/browser/download/save_package.cc @@ -29,7 +29,6 @@ #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/tab_contents/tab_util.h" -#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/pref_names.h" @@ -120,25 +119,24 @@ const FilePath::CharType SavePackage::kDefaultHtmlExtension[] = FILE_PATH_LITERAL("html"); #endif -SavePackage::SavePackage(TabContentsWrapper* wrapper, +SavePackage::SavePackage(TabContents* tab_contents, SavePackageType save_type, const FilePath& file_full_path, const FilePath& directory_full_path) - : TabContentsObserver(wrapper->tab_contents()), - wrapper_(wrapper), + : TabContentsObserver(tab_contents), file_manager_(NULL), download_(NULL), page_url_(GetUrlToBeSaved()), saved_main_file_path_(file_full_path), saved_main_directory_path_(directory_full_path), - title_(tab_contents()->GetTitle()), + title_(tab_contents->GetTitle()), finished_(false), user_canceled_(false), disk_error_occurred_(false), save_type_(save_type), all_save_items_count_(0), wait_state_(INITIALIZE), - tab_id_(tab_contents()->GetRenderProcessHost()->id()), + tab_id_(tab_contents->GetRenderProcessHost()->id()), unique_id_(g_save_package_id++), ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { DCHECK(page_url_.is_valid()); @@ -151,20 +149,19 @@ SavePackage::SavePackage(TabContentsWrapper* wrapper, InternalInit(); } -SavePackage::SavePackage(TabContentsWrapper* wrapper) - : TabContentsObserver(wrapper->tab_contents()), - wrapper_(wrapper), +SavePackage::SavePackage(TabContents* tab_contents) + : TabContentsObserver(tab_contents), file_manager_(NULL), download_(NULL), page_url_(GetUrlToBeSaved()), - title_(tab_contents()->GetTitle()), + title_(tab_contents->GetTitle()), finished_(false), user_canceled_(false), disk_error_occurred_(false), save_type_(SAVE_TYPE_UNKNOWN), all_save_items_count_(0), wait_state_(INITIALIZE), - tab_id_(tab_contents()->GetRenderProcessHost()->id()), + tab_id_(tab_contents->GetRenderProcessHost()->id()), unique_id_(g_save_package_id++), ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { DCHECK(page_url_.is_valid()); @@ -174,11 +171,10 @@ SavePackage::SavePackage(TabContentsWrapper* wrapper) // This is for testing use. Set |finished_| as true because we don't want // method Cancel to be be called in destructor in test mode. // We also don't call InternalInit(). -SavePackage::SavePackage(TabContentsWrapper* wrapper, +SavePackage::SavePackage(TabContents* tab_contents, const FilePath& file_full_path, const FilePath& directory_full_path) - : TabContentsObserver(wrapper->tab_contents()), - wrapper_(wrapper), + : TabContentsObserver(tab_contents), file_manager_(NULL), download_(NULL), saved_main_file_path_(file_full_path), @@ -222,7 +218,6 @@ SavePackage::~SavePackage() { file_manager_ = NULL; } -// Retrieves the URL to be saved from tab_contents_ variable. GURL SavePackage::GetUrlToBeSaved() { // Instead of using tab_contents_.GetURL here, we use url() // (which is the "real" url of the page) @@ -234,7 +229,6 @@ GURL SavePackage::GetUrlToBeSaved() { return active_entry->url(); } -// Cancel all in progress request, might be called by user or internal error. void SavePackage::Cancel(bool user_action) { if (!canceled()) { if (user_action) @@ -261,7 +255,6 @@ void SavePackage::InternalInit() { } } -// Initialize the SavePackage. bool SavePackage::Init() { // Set proper running state. if (wait_state_ != INITIALIZE) @@ -553,7 +546,6 @@ void SavePackage::StartSave(const SaveFileCreateInfo* info) { } } -// Look up SaveItem by save id from in progress map. SaveItem* SavePackage::LookupItemInProcessBySaveId(int32 save_id) { if (in_process_count()) { for (SaveUrlItemMap::iterator it = in_progress_items_.begin(); @@ -567,7 +559,6 @@ SaveItem* SavePackage::LookupItemInProcessBySaveId(int32 save_id) { return NULL; } -// Remove SaveItem from in progress map and put it to saved map. void SavePackage::PutInProgressItemToSavedMap(SaveItem* save_item) { SaveUrlItemMap::iterator it = in_progress_items_.find( save_item->url().spec()); diff --git a/content/browser/download/save_package.h b/content/browser/download/save_package.h index 2f30793..e346467 100644 --- a/content/browser/download/save_package.h +++ b/content/browser/download/save_package.h @@ -25,12 +25,12 @@ class GURL; class MessageLoop; class PrefService; class Profile; -struct SaveFileCreateInfo; class SaveFileManager; class SaveItem; class SavePackage; +class TabContents; +struct SaveFileCreateInfo; struct SavePackageParam; -class TabContentsWrapper; namespace base { class Thread; @@ -84,12 +84,12 @@ class SavePackage : public base::RefCountedThreadSafe<SavePackage>, // Constructor for user initiated page saving. This constructor results in a // SavePackage that will generate and sanitize a suggested name for the user // in the "Save As" dialog box. - explicit SavePackage(TabContentsWrapper* wrapper); + explicit SavePackage(TabContents* tab_contents); // This contructor is used only for testing. We can bypass the file and // directory name generation / sanitization by providing well known paths // better suited for tests. - SavePackage(TabContentsWrapper* wrapper, + SavePackage(TabContents* tab_contents, SavePackageType save_type, const FilePath& file_full_path, const FilePath& directory_full_path); @@ -100,6 +100,7 @@ class SavePackage : public base::RefCountedThreadSafe<SavePackage>, // shutdown. bool Init(); + // Cancel all in progress request, might be called by user or internal error. void Cancel(bool user_action); void Finish(); @@ -145,7 +146,7 @@ class SavePackage : public base::RefCountedThreadSafe<SavePackage>, friend class base::RefCountedThreadSafe<SavePackage>; // For testing only. - SavePackage(TabContentsWrapper* wrapper, + SavePackage(TabContents* tab_contents, const FilePath& file_full_path, const FilePath& directory_full_path); @@ -186,10 +187,13 @@ class SavePackage : public base::RefCountedThreadSafe<SavePackage>, // which contain all resource links that have local copy. void GetSerializedHtmlDataForCurrentPageWithLocalLinks(); + // Look up SaveItem by save id from in progress map. SaveItem* LookupItemInProcessBySaveId(int32 save_id); + + // Remove SaveItem from in progress map and put it to saved map. void PutInProgressItemToSavedMap(SaveItem* save_item); - // Retrieves the URL to be saved from tab_contents_ variable. + // Retrieves the URL to be saved from the TabContents. GURL GetUrlToBeSaved(); void CreateDirectoryOnFileThread(const FilePath& website_save_dir, @@ -249,9 +253,6 @@ class SavePackage : public base::RefCountedThreadSafe<SavePackage>, static const FilePath::CharType* ExtensionForMimeType( const std::string& contents_mime_type); - // Owning TabContentsWrapper. - TabContentsWrapper* wrapper_; - typedef std::queue<SaveItem*> SaveItemQueue; // A queue for items we are about to start saving. SaveItemQueue waiting_item_queue_; diff --git a/content/browser/download/save_package_unittest.cc b/content/browser/download/save_package_unittest.cc index 9a8dafb..5b44e28 100644 --- a/content/browser/download/save_package_unittest.cc +++ b/content/browser/download/save_package_unittest.cc @@ -9,10 +9,10 @@ #include "base/scoped_temp_dir.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" -#include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h" #include "content/browser/browser_thread.h" #include "content/browser/download/save_package.h" #include "content/browser/net/url_request_mock_http_job.h" +#include "content/browser/renderer_host/test_render_view_host.h" #include "content/browser/tab_contents/test_tab_contents.h" #include "googleurl/src/gurl.h" #include "testing/gtest/include/gtest/gtest.h" @@ -62,7 +62,7 @@ bool HasOrdinalNumber(const FilePath::StringType& filename) { } // namespace -class SavePackageTest : public TabContentsWrapperTestHarness { +class SavePackageTest : public RenderViewHostTestHarness { public: SavePackageTest() : browser_thread_(BrowserThread::UI, &message_loop_) { } @@ -96,13 +96,13 @@ class SavePackageTest : public TabContentsWrapperTestHarness { protected: virtual void SetUp() { - TabContentsWrapperTestHarness::SetUp(); + RenderViewHostTestHarness::SetUp(); // Do the initialization in SetUp so contents() is initialized by - // TabContentsWrapperTestHarness::SetUp. + // RenderViewHostTestHarness::SetUp. ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - save_package_success_ = new SavePackage(contents_wrapper(), + save_package_success_ = new SavePackage(contents(), temp_dir_.path().AppendASCII("testfile" HTML_EXTENSION), temp_dir_.path().AppendASCII("testfile_files")); @@ -113,7 +113,7 @@ class SavePackageTest : public TabContentsWrapperTestHarness { long_file_name.resize( kMaxFilePathLength - 9 - temp_dir_.path().value().length()); - save_package_fail_ = new SavePackage(contents_wrapper(), + save_package_fail_ = new SavePackage(contents(), temp_dir_.path().AppendASCII(long_file_name + HTML_EXTENSION), temp_dir_.path().AppendASCII(long_file_name + "_files")); } @@ -387,7 +387,7 @@ static const struct SuggestedSaveNameTestCase { TEST_F(SavePackageTest, MAYBE_TestSuggestedSaveNames) { for (size_t i = 0; i < arraysize(kSuggestedSaveNames); ++i) { scoped_refptr<SavePackage> save_package( - new SavePackage(contents_wrapper(), FilePath(), FilePath())); + new SavePackage(contents(), FilePath(), FilePath())); save_package->page_url_ = GURL(kSuggestedSaveNames[i].page_url); save_package->title_ = kSuggestedSaveNames[i].page_title; diff --git a/content/browser/tab_contents/tab_contents.cc b/content/browser/tab_contents/tab_contents.cc index b197f5b..8e3cfa84 100644 --- a/content/browser/tab_contents/tab_contents.cc +++ b/content/browser/tab_contents/tab_contents.cc @@ -13,7 +13,9 @@ #include "base/string_util.h" #include "base/time.h" #include "base/utf_string_conversions.h" +#include "chrome/browser/download/download_manager.h" #include "chrome/browser/download/download_request_limiter.h" +#include "chrome/browser/download/download_util.h" #include "chrome/browser/profiles/profile.h" #include "content/browser/child_process_security_policy.h" #include "content/browser/content_browser_client.h" @@ -289,6 +291,7 @@ bool TabContents::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(ViewHostMsg_GoToEntryAtOffset, OnGoToEntryAtOffset) IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateZoomLimits, OnUpdateZoomLimits) IPC_MESSAGE_HANDLER(ViewHostMsg_FocusedNodeChanged, OnFocusedNodeChanged) + IPC_MESSAGE_HANDLER(ViewHostMsg_SaveURLAs, OnSaveURL) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP_EX() @@ -709,6 +712,45 @@ void TabContents::WillClose(ConstrainedWindow* window) { } } +void TabContents::OnSavePage() { + // If we can not save the page, try to download it. + if (!SavePackage::IsSavableContents(contents_mime_type())) { + DownloadManager* dlm = profile()->GetDownloadManager(); + const GURL& current_page_url = GetURL(); + if (dlm && current_page_url.is_valid()) { + dlm->DownloadUrl(current_page_url, GURL(), "", this); + download_util::RecordDownloadCount( + download_util::INITIATED_BY_SAVE_PACKAGE_FAILURE_COUNT); + return; + } + } + + 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(this); + save_package_->GetSaveInfo(); +} + +// 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 TabContents::SavePage(const FilePath& main_file, const FilePath& dir_path, + SavePackage::SavePackageType save_type) { + // Stop the page from navigating. + Stop(); + + save_package_ = new SavePackage(this, save_type, main_file, dir_path); + return save_package_->Init(); +} + +void TabContents::OnSaveURL(const GURL& url) { + DownloadManager* dlm = profile()->GetDownloadManager(); + dlm->DownloadUrl(url, GetURL(), "", this); +} + bool TabContents::IsActiveEntry(int32 page_id) { NavigationEntry* active_entry = controller_.GetActiveEntry(); return (active_entry != NULL && diff --git a/content/browser/tab_contents/tab_contents.h b/content/browser/tab_contents/tab_contents.h index bad9d20..81f2025 100644 --- a/content/browser/tab_contents/tab_contents.h +++ b/content/browser/tab_contents/tab_contents.h @@ -15,6 +15,7 @@ #include "base/memory/scoped_ptr.h" #include "base/observer_list.h" #include "base/string16.h" +#include "content/browser/download/save_package.h" #include "content/browser/javascript_dialogs.h" #include "content/browser/renderer_host/render_view_host_delegate.h" #include "content/browser/tab_contents/constrained_window.h" @@ -109,6 +110,11 @@ class TabContents : public PageNavigator, // Returns true if contains content rendered by an extension. bool HostsExtension() const; + // Returns the SavePackage which manages the page saving job. May be NULL. + SavePackage* save_package() const { return save_package_.get(); } + + // Returns the SavePackage which manages the page saving job. May be NULL. + // Return the currently active RenderProcessHost and RenderViewHost. Each of // these may change over time. RenderProcessHost* GetRenderProcessHost() const; @@ -381,6 +387,19 @@ class TabContents : public PageNavigator, // Misc state & callbacks ---------------------------------------------------- + // Prepare for saving the current web page to disk. + void OnSavePage(); + + // Save page with the main HTML file path, the directory for saving resources, + // and the save type: HTML only or complete web page. Returns true if the + // saving process has been initiated successfully. + bool SavePage(const FilePath& main_file, const FilePath& dir_path, + SavePackage::SavePackageType save_type); + + // Prepare for saving the URL to disk. + // URL may refer to the iframe on the page. + void OnSaveURL(const GURL& url); + // Returns true if the active NavigationEntry's page_id equals page_id. bool IsActiveEntry(int32 page_id); @@ -722,6 +741,9 @@ class TabContents : public PageNavigator, // Manages creation and swapping of render views. RenderViewHostManager render_manager_; + // SavePackage, lazily created. + scoped_refptr<SavePackage> save_package_; + // Data for loading state ---------------------------------------------------- // Indicates whether we're currently loading a resource. |