Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Unified Diff: chrome/browser/net/net_log_temp_file.cc

Issue 11635023: First cut at UI for saving net_logs data into a temporary file on (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/net/net_log_temp_file.h ('k') | chrome/browser/resources/net_export/net_export.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/net/net_log_temp_file.cc
===================================================================
--- chrome/browser/net/net_log_temp_file.cc (revision 0)
+++ chrome/browser/net/net_log_temp_file.cc (revision 0)
@@ -0,0 +1,208 @@
+// Copyright (c) 2013 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/net/net_log_temp_file.h"
+
+#include <stdio.h>
+
+#include "base/bind.h"
+#include "base/file_util.h"
+#include "base/json/json_writer.h"
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "base/string_number_conversions.h"
+#include "base/string_util.h"
+#include "base/threading/platform_thread.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/net/chrome_net_log.h"
+#include "chrome/browser/net/net_log_logger.h"
+#include "chrome/browser/ui/webui/net_internals/net_internals_ui.h"
+#include "content/public/browser/browser_thread.h"
+
+#if defined(OS_ANDROID)
+#include "chrome/browser/android/intent_helper.h"
+#endif
+
+using content::BrowserThread;
+
+NetLogTempFile::NetLogTempFile() : state_(UNINITIALIZED) {
+ BrowserThread::PostTask(
+ BrowserThread::FILE_USER_BLOCKING,
+ FROM_HERE,
+ base::Bind(&NetLogTempFile::Init, base::Unretained(this)));
+}
+
+NetLogTempFile::~NetLogTempFile() {
+}
+
+void NetLogTempFile::ProcessCommand(Command command) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
+ switch (command) {
+ case DO_START:
+ StartNetLog();
+ break;
+ case DO_STOP:
+ StopNetLog();
+ break;
+ case DO_SEND:
+ SendNetLog();
+ break;
+ default:
+ break;
+ }
+}
+
+Value* NetLogTempFile::NetLogTempFileToValue() {
+ base::DictionaryValue* dict = new base::DictionaryValue;
+
+#ifndef NDEBUG
+ dict->SetString("file", log_path_.MaybeAsASCII());
+#endif // NDEBUG
+
+ base::AutoLock lock(lock_);
+ switch (state_) {
+ case ALLOW_STOP:
+ dict->SetString("state", "ALLOW_STOP");
+ break;
+ case ALLOW_START_SEND:
+ dict->SetString("state", "ALLOW_START_SEND");
+ break;
+ default:
+ dict->SetString("state", "ALLOW_START");
+ break;
+ }
+ return dict;
+}
+
+bool GetTempNetLogDir(FilePath* path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
+
+ FilePath temp_dir;
+ if (!file_util::GetTempDir(&temp_dir))
+ return false;
+
+ FilePath net_log_dir = temp_dir.Append(FILE_PATH_LITERAL("NetLog"));
+ if (file_util::PathExists(net_log_dir)) {
+ *path = net_log_dir;
+ return true;
+ }
+
+ if (!file_util::CreateDirectory(net_log_dir))
+ return false;
+
+ *path = net_log_dir;
+ return true;
+}
+
+void NetLogTempFile::Init() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
+
+ FilePath net_log_dir;
+
+ base::AutoLock lock(lock_);
+ if (!GetTempNetLogDir(&net_log_dir)) {
+ state_ = ALLOW_START;
+ return;
+ }
+ if (file_util::IsDirectoryEmpty(net_log_dir))
+ state_ = ALLOW_START;
+ else
+ state_ = ALLOW_START_SEND;
+}
+
+void NetLogTempFile::StartNetLog() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
+
+ if (!g_browser_process->net_log())
+ return;
+
+ base::AutoLock lock(lock_);
+ if (state_ == ALLOW_STOP)
+ return;
+
+ FilePath net_log_dir;
+ if (!GetTempNetLogDir(&net_log_dir))
+ return;
+
+ file_util::FileEnumerator file_iter(
+ net_log_dir, false, file_util::FileEnumerator::FILES);
+ for (FilePath current = file_iter.Next(); !current.empty();
+ current = file_iter.Next()) {
+ file_util::Delete(current, false);
+ }
+
+ if (!file_util::CreateTemporaryFileInDir(net_log_dir, &log_path_))
+ return;
+
+ net_log_logger_.reset(new NetLogLogger(log_path_));
+ net_log_logger_->StartObserving(g_browser_process->net_log());
+ state_ = ALLOW_STOP;
+}
+
+void NetLogTempFile::StopNetLog() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
+
+ if (!g_browser_process->net_log())
+ return;
+
+ base::AutoLock lock(lock_);
+ if (state_ != ALLOW_STOP)
+ return;
+
+ net_log_logger_->StopObserving();
+ net_log_logger_.reset();
+ state_ = ALLOW_START_SEND;
+}
+
+void NetLogTempFile::SendNetLog() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE_USER_BLOCKING));
+
+ base::AutoLock lock(lock_);
+ if (state_ != ALLOW_START_SEND)
+ return;
+
+ FilePath net_log_dir;
+ if (!GetTempNetLogDir(&net_log_dir))
+ return;
+
+ FilePath file_to_send;
+ file_util::FileEnumerator file_iter(
+ net_log_dir, false, file_util::FileEnumerator::FILES);
+ for (FilePath current = file_iter.Next(); !current.empty();
+ current = file_iter.Next()) {
+ file_to_send = current;
+ break;
+ }
+ if (file_to_send.empty())
+ return;
+
+#if defined(OS_POSIX)
+ // Users, group and others can read, write and traverse.
+ int mode = file_util::FILE_PERMISSION_MASK;
+ file_util::SetPosixFilePermissions(file_to_send, mode);
+#endif // defined(OS_POSIX)
+
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&NetLogTempFile::SendEmail, file_to_send));
+}
+
+// static
+void NetLogTempFile::SendEmail(const FilePath& file_to_send) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+#if defined(OS_ANDROID)
+ std::string email;
+ std::string subject = "net_internals_log";
+ std::string title = "test_title";
+ std::string body = "Net Internals log data";
+ FilePath::StringType file_to_attach(file_to_send.value());
+ chrome::android::SendEmail(
+ UTF8ToUTF16(email), UTF8ToUTF16(subject),
+ UTF8ToUTF16(body), UTF8ToUTF16(title), UTF8ToUTF16(file_to_attach));
+#endif
+}
« no previous file with comments | « chrome/browser/net/net_log_temp_file.h ('k') | chrome/browser/resources/net_export/net_export.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698