summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-18 15:57:59 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-18 15:57:59 +0000
commitc7dd2f6792d98f18833eaad7fd75042030cf36fc (patch)
treed97d9b15ba9451efde03be9b1a37d58fc9837f23 /content
parent738f3659678e9b8fe7127a74cdc1ebe42f201a6d (diff)
downloadchromium_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.cc9
-rw-r--r--content/browser/download/save_package.cc29
-rw-r--r--content/browser/download/save_package.h19
-rw-r--r--content/browser/download/save_package_unittest.cc14
-rw-r--r--content/browser/tab_contents/tab_contents.cc42
-rw-r--r--content/browser/tab_contents/tab_contents.h22
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.