summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-20 13:21:09 +0000
committerpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-04-20 13:21:09 +0000
commit4ca9bf65c4137fd59a7b1ca0bb0501fc6b3c8949 (patch)
treee7cb002745726cc8dcec6c6697621cadd9686423
parent743fa02d9cbdfd5c590844964d54aa23be10d14f (diff)
downloadchromium_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.cc107
-rw-r--r--chrome/browser/debugger/devtools_file_util.h29
-rw-r--r--chrome/browser/debugger/devtools_handler.cc16
-rw-r--r--chrome/browser/debugger/devtools_handler.h2
-rw-r--r--chrome/chrome.gyp2
-rw-r--r--chrome/common/devtools_messages.h5
-rw-r--r--chrome/renderer/devtools_client.cc7
-rw-r--r--chrome/renderer/devtools_client.h2
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();