diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-20 13:21:09 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-20 13:21:09 +0000 |
commit | 4ca9bf65c4137fd59a7b1ca0bb0501fc6b3c8949 (patch) | |
tree | e7cb002745726cc8dcec6c6697621cadd9686423 | |
parent | 743fa02d9cbdfd5c590844964d54aa23be10d14f (diff) | |
download | chromium_src-4ca9bf65c4137fd59a7b1ca0bb0501fc6b3c8949.zip chromium_src-4ca9bf65c4137fd59a7b1ca0bb0501fc6b3c8949.tar.gz chromium_src-4ca9bf65c4137fd59a7b1ca0bb0501fc6b3c8949.tar.bz2 |
DevTools: implement Save As binding.
Review URL: http://codereview.chromium.org/6883084
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82286 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/debugger/devtools_file_util.cc | 107 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_file_util.h | 29 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_handler.cc | 16 | ||||
-rw-r--r-- | chrome/browser/debugger/devtools_handler.h | 2 | ||||
-rw-r--r-- | chrome/chrome.gyp | 2 | ||||
-rw-r--r-- | chrome/common/devtools_messages.h | 5 | ||||
-rw-r--r-- | chrome/renderer/devtools_client.cc | 7 | ||||
-rw-r--r-- | chrome/renderer/devtools_client.h | 2 |
8 files changed, 170 insertions, 0 deletions
diff --git a/chrome/browser/debugger/devtools_file_util.cc b/chrome/browser/debugger/devtools_file_util.cc new file mode 100644 index 0000000..1e4217d --- /dev/null +++ b/chrome/browser/debugger/devtools_file_util.cc @@ -0,0 +1,107 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/debugger/devtools_file_util.h" + +#include "base/file_util.h" +#include "base/memory/ref_counted.h" + +#include "chrome/browser/browser_process.h" +#include "chrome/browser/download/download_prefs.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/shell_dialogs.h" + +namespace { + +class SaveAsDialog : public SelectFileDialog::Listener, + public base::RefCounted<SaveAsDialog> { + public: + SaveAsDialog() { + select_file_dialog_ = SelectFileDialog::Create(this); + } + + void Show(Profile* profile, + const std::string& suggested_file_name, + const std::string& content) { + AddRef(); // Balanced in the three listener outcomes. + + content_ = content; + + FilePath default_path; + + std::string file_name; + if (suggested_file_name.length() > 20) + file_name = suggested_file_name.substr(0, 20); + else + file_name = suggested_file_name; + + if (!last_save_path_.empty()) { + default_path = last_save_path_.DirName().AppendASCII(suggested_file_name); + } else { + DownloadPrefs prefs(profile->GetPrefs()); + default_path = prefs.download_path().AppendASCII(suggested_file_name); + } + + select_file_dialog_->SelectFile(SelectFileDialog::SELECT_SAVEAS_FILE, + string16(), + default_path, + NULL, + 0, + FILE_PATH_LITERAL(""), + NULL, + NULL, + NULL); + } + + // SelectFileDialog::Listener implementation. + virtual void FileSelected(const FilePath& path, + int index, void* params) { + last_save_path_ = path; + + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, + NewRunnableFunction( + &SaveAsDialog::WriteFile, + path, + content_)); + Release(); // Balanced in ::Show. + } + + virtual void MultiFilesSelected( + const std::vector<FilePath>& files, void* params) { + Release(); // Balanced in ::Show. + NOTREACHED() << "Should not be able to select multiple files"; + } + + virtual void FileSelectionCanceled(void* params) { + Release(); // Balanced in ::Show. + } + + private: + friend class base::RefCounted<SaveAsDialog>; + virtual ~SaveAsDialog() {} + + static void WriteFile(FilePath path, const std::string& content) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); + DCHECK(!path.empty()); + + file_util::WriteFile(path, content.c_str(), content.length()); + } + scoped_refptr<SelectFileDialog> select_file_dialog_; + static FilePath last_save_path_; + std::string content_; +}; + +// static +FilePath SaveAsDialog::last_save_path_; + +} // namespace + +// static +void DevToolsFileUtil::SaveAs(Profile* profile, + const std::string& suggested_file_name, + const std::string& content) { + scoped_refptr<SaveAsDialog> dialog = new SaveAsDialog(); + dialog->Show(profile, suggested_file_name, content); +} diff --git a/chrome/browser/debugger/devtools_file_util.h b/chrome/browser/debugger/devtools_file_util.h new file mode 100644 index 0000000..a70c8af --- /dev/null +++ b/chrome/browser/debugger/devtools_file_util.h @@ -0,0 +1,29 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_FILE_UTIL_H_ +#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_FILE_UTIL_H_ +#pragma once + +#include <string> + +#include "base/basictypes.h" + +class Profile; + +class DevToolsFileUtil { + public: + + // Shows Save As dialog using default save location from the |profile| prefs, + // |suggested_file_name| as the default name and saves |content| to the given + // location. + static void SaveAs(Profile* profile, + const std::string& suggested_file_name, + const std::string& content); + + private: + DISALLOW_COPY_AND_ASSIGN(DevToolsFileUtil); +}; + +#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_FILE_UTIL_H_ diff --git a/chrome/browser/debugger/devtools_handler.cc b/chrome/browser/debugger/devtools_handler.cc index dd6e7fc..9e60a11 100644 --- a/chrome/browser/debugger/devtools_handler.cc +++ b/chrome/browser/debugger/devtools_handler.cc @@ -4,8 +4,11 @@ #include "chrome/browser/debugger/devtools_handler.h" +#include "chrome/browser/debugger/devtools_file_util.h" #include "chrome/browser/debugger/devtools_manager.h" #include "chrome/common/devtools_messages.h" +#include "content/browser/renderer_host/render_view_host.h" +#include "content/browser/tab_contents/tab_contents.h" DevToolsHandler::DevToolsHandler(RenderViewHost* render_view_host) : RenderViewHostObserver(render_view_host) { @@ -24,6 +27,8 @@ bool DevToolsHandler::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(DevToolsHostMsg_RequestDockWindow, OnRequestDockWindow) IPC_MESSAGE_HANDLER(DevToolsHostMsg_RequestUndockWindow, OnRequestUndockWindow) + IPC_MESSAGE_HANDLER(DevToolsHostMsg_SaveAs, + OnSaveAs) IPC_MESSAGE_HANDLER(DevToolsHostMsg_RuntimePropertyChanged, OnRuntimePropertyChanged) IPC_MESSAGE_UNHANDLED(handled = false) @@ -57,6 +62,17 @@ void DevToolsHandler::OnRequestUndockWindow() { DevToolsManager::GetInstance()->RequestUndockWindow(render_view_host()); } +void DevToolsHandler::OnSaveAs(const std::string& file_name, + const std::string& content) { + TabContents* tab_contents = render_view_host()->delegate() ? + render_view_host()->delegate()->GetAsTabContents() : NULL; + DCHECK(tab_contents); + if (!tab_contents) + return; + + DevToolsFileUtil::SaveAs(tab_contents->profile(), file_name, content); +} + void DevToolsHandler::OnRuntimePropertyChanged(const std::string& name, const std::string& value) { DevToolsManager::GetInstance()->RuntimePropertyChanged( diff --git a/chrome/browser/debugger/devtools_handler.h b/chrome/browser/debugger/devtools_handler.h index 3212928..fbc93ec 100644 --- a/chrome/browser/debugger/devtools_handler.h +++ b/chrome/browser/debugger/devtools_handler.h @@ -23,6 +23,8 @@ class DevToolsHandler : public RenderViewHostObserver { void OnCloseWindow(); void OnRequestDockWindow(); void OnRequestUndockWindow(); + void OnSaveAs(const std::string& file_name, + const std::string& content); void OnRuntimePropertyChanged(const std::string& name, const std::string& value); diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index e2a370a..e460f69 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -398,6 +398,8 @@ 'browser/debugger/debugger_remote_service.h', 'browser/debugger/devtools_client_host.cc', 'browser/debugger/devtools_client_host.h', + 'browser/debugger/devtools_file_util.cc', + 'browser/debugger/devtools_file_util.h', 'browser/debugger/devtools_http_protocol_handler.cc', 'browser/debugger/devtools_http_protocol_handler.h', 'browser/debugger/devtools_manager.cc', diff --git a/chrome/common/devtools_messages.h b/chrome/common/devtools_messages.h index a20b598..e3275766 100644 --- a/chrome/common/devtools_messages.h +++ b/chrome/common/devtools_messages.h @@ -130,6 +130,11 @@ IPC_MESSAGE_ROUTED0(DevToolsHostMsg_RequestDockWindow) // Detaches dev tools window that is inspecting current render_view_host. IPC_MESSAGE_ROUTED0(DevToolsHostMsg_RequestUndockWindow) +// Shows Save As dialog for content. +IPC_MESSAGE_ROUTED2(DevToolsHostMsg_SaveAs, + std::string /* file_name */, + std::string /* content */) + // Updates runtime features store in devtools manager in order to support // cross-navigation instrumentation. IPC_MESSAGE_ROUTED2(DevToolsHostMsg_RuntimePropertyChanged, diff --git a/chrome/renderer/devtools_client.cc b/chrome/renderer/devtools_client.cc index 32f101a..ac6c090 100644 --- a/chrome/renderer/devtools_client.cc +++ b/chrome/renderer/devtools_client.cc @@ -76,6 +76,13 @@ void DevToolsClient::requestUndockWindow() { Send(new DevToolsHostMsg_RequestUndockWindow(routing_id())); } +void DevToolsClient::saveAs(const WebKit::WebString& file_name, + const WebKit::WebString& content) { + Send(new DevToolsHostMsg_SaveAs(routing_id(), + file_name.utf8(), + content.utf8())); +} + void DevToolsClient::OnDispatchOnInspectorFrontend(const std::string& message) { web_tools_frontend_->dispatchOnInspectorFrontend( WebString::fromUTF8(message)); diff --git a/chrome/renderer/devtools_client.h b/chrome/renderer/devtools_client.h index e305a46..c4687fc 100644 --- a/chrome/renderer/devtools_client.h +++ b/chrome/renderer/devtools_client.h @@ -47,6 +47,8 @@ class DevToolsClient : public RenderViewObserver, virtual void closeWindow(); virtual void requestDockWindow(); virtual void requestUndockWindow(); + virtual void saveAs(const WebKit::WebString& file_name, + const WebKit::WebString& content); virtual bool shouldHideScriptsPanel(); |