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

Unified Diff: chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc

Issue 2934163002: Delete the logPrivate APIs (Closed)
Patch Set: Roll back docs changes Created 3 years, 6 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
Index: chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc
diff --git a/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc b/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc
deleted file mode 100644
index a9562480b15277477e32af8fa08feb6f901061e5..0000000000000000000000000000000000000000
--- a/chrome/browser/extensions/api/log_private/log_private_api_chromeos.cc
+++ /dev/null
@@ -1,567 +0,0 @@
-// Copyright 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/extensions/api/log_private/log_private_api.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/json/json_writer.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/sequenced_task_runner.h"
-#include "base/values.h"
-#include "build/build_config.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/download/download_prefs.h"
-#include "chrome/browser/extensions/api/log_private/filter_handler.h"
-#include "chrome/browser/extensions/api/log_private/log_parser.h"
-#include "chrome/browser/extensions/api/log_private/syslog_parser.h"
-#include "chrome/browser/feedback/system_logs/about_system_logs_fetcher.h"
-#include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h"
-#include "chrome/browser/io_thread.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/common/extensions/api/log_private.h"
-#include "chrome/common/logging_chrome.h"
-#include "components/net_log/chrome_net_log.h"
-#include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/render_process_host.h"
-#include "extensions/browser/api/file_handlers/app_file_handler_util.h"
-#include "extensions/browser/event_router.h"
-#include "extensions/browser/extension_function.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/granted_file_entry.h"
-#include "net/log/net_log_entry.h"
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/file_manager/filesystem_api_util.h"
-#include "chrome/browser/chromeos/system_logs/debug_log_writer.h"
-#endif
-
-using content::BrowserThread;
-
-namespace events {
-const char kOnCapturedEvents[] = "logPrivate.onCapturedEvents";
-} // namespace events
-
-namespace extensions {
-namespace {
-
-const char kAppLogsSubdir[] = "apps";
-const char kLogDumpsSubdir[] = "log_dumps";
-const char kLogFileNameBase[] = "net-internals";
-const int kNetLogEventDelayMilliseconds = 100;
-
-// Gets sequenced task runner for file specific calls within this API.
-scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner() {
- base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
- return pool->GetSequencedTaskRunnerWithShutdownBehavior(
- pool->GetNamedSequenceToken(FileResource::kSequenceToken),
- base::SequencedWorkerPool::BLOCK_SHUTDOWN);
-}
-
-#if DCHECK_IS_ON()
-base::LazyInstance<base::SequenceChecker>::Leaky
- g_file_resource_sequence_checker = LAZY_INSTANCE_INITIALIZER;
-#endif
-
-// Checks if we are running on sequenced task runner thread.
-void AssertCurrentlyOnFileResourceSequence() {
-#if DCHECK_IS_ON()
- DCHECK(g_file_resource_sequence_checker.Get().CalledOnValidSequence());
-#endif
-}
-
-std::unique_ptr<LogParser> CreateLogParser(const std::string& log_type) {
- if (log_type == "syslog")
- return std::unique_ptr<LogParser>(new SyslogParser());
- // TODO(shinfan): Add more parser here
-
- NOTREACHED() << "Invalid log type: " << log_type;
- return std::unique_ptr<LogParser>();
-}
-
-void CollectLogInfo(FilterHandler* filter_handler,
- system_logs::SystemLogsResponse* logs,
- std::vector<api::log_private::LogEntry>* output) {
- for (system_logs::SystemLogsResponse::const_iterator
- request_it = logs->begin(); request_it != logs->end(); ++request_it) {
- if (!filter_handler->IsValidSource(request_it->first)) {
- continue;
- }
- std::unique_ptr<LogParser> parser(CreateLogParser(request_it->first));
- if (parser) {
- parser->Parse(request_it->second, output, filter_handler);
- }
- }
-}
-
-// Returns directory location of app-specific logs that are initiated with
-// logPrivate.startEventRecorder() calls - /home/chronos/user/log/apps
-base::FilePath GetAppLogDirectory() {
- return logging::GetSessionLogDir(*base::CommandLine::ForCurrentProcess())
- .Append(kAppLogsSubdir);
-}
-
-// Returns directory location where logs dumps initiated with chrome.dumpLogs
-// will be stored - /home/chronos/<user_profile_dir>/Downloads/log_dumps
-base::FilePath GetLogDumpDirectory(content::BrowserContext* context) {
- const DownloadPrefs* const prefs = DownloadPrefs::FromBrowserContext(context);
- base::FilePath path = prefs->DownloadPath();
-
-#if defined(OS_CHROMEOS)
- Profile* profile = Profile::FromBrowserContext(context);
- if (file_manager::util::IsUnderNonNativeLocalPath(profile, path))
- path = prefs->GetDefaultDownloadDirectoryForProfile();
-#endif
-
- return path.Append(kLogDumpsSubdir);
-}
-
-// Removes direcotry content of |logs_dumps| and |app_logs_dir| (only for the
-// primary profile).
-void CleanUpLeftoverLogs(bool is_primary_profile,
- const base::FilePath& app_logs_dir,
- const base::FilePath& logs_dumps) {
- LOG(WARNING) << "Deleting " << app_logs_dir.value();
- LOG(WARNING) << "Deleting " << logs_dumps.value();
-
- AssertCurrentlyOnFileResourceSequence();
- base::DeleteFile(logs_dumps, true);
-
- // App-specific logs are stored in /home/chronos/user/log/apps directory that
- // is shared between all profiles in multi-profile case. We should not
- // nuke it for non-primary profiles.
- if (!is_primary_profile)
- return;
-
- base::DeleteFile(app_logs_dir, true);
-}
-
-} // namespace
-
-const char FileResource::kSequenceToken[] = "log_api_files";
-
-FileResource::FileResource(const std::string& owner_extension_id,
- const base::FilePath& path)
- : ApiResource(owner_extension_id), path_(path) {
-}
-
-FileResource::~FileResource() {
- base::DeleteFile(path_, true);
-}
-
-bool FileResource::IsPersistent() const {
- return false;
-}
-
-// static
-LogPrivateAPI* LogPrivateAPI::Get(content::BrowserContext* context) {
- LogPrivateAPI* api = GetFactoryInstance()->Get(context);
- api->Initialize();
- return api;
-}
-
-LogPrivateAPI::LogPrivateAPI(content::BrowserContext* context)
- : browser_context_(context),
- logging_net_internals_(false),
- event_sink_(api::log_private::EVENT_SINK_CAPTURE),
- extension_registry_observer_(this),
- log_file_resources_(context),
- initialized_(false) {
-}
-
-LogPrivateAPI::~LogPrivateAPI() {
-}
-
-void LogPrivateAPI::StartNetInternalsWatch(
- const std::string& extension_id,
- api::log_private::EventSink event_sink,
- const base::Closure& closure) {
- net_internal_watches_.insert(extension_id);
-
- // Nuke any leftover app-specific or dumped log files from previous sessions.
- BrowserThread::PostTaskAndReply(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&LogPrivateAPI::MaybeStartNetInternalLogging,
- base::Unretained(this),
- extension_id,
- g_browser_process->io_thread(),
- event_sink),
- closure);
-}
-
-void LogPrivateAPI::StopNetInternalsWatch(const std::string& extension_id,
- const base::Closure& closure) {
- net_internal_watches_.erase(extension_id);
- MaybeStopNetInternalLogging(closure);
-}
-
-void LogPrivateAPI::StopAllWatches(const std::string& extension_id,
- const base::Closure& closure) {
- StopNetInternalsWatch(extension_id, closure);
-}
-
-void LogPrivateAPI::RegisterTempFile(const std::string& owner_extension_id,
- const base::FilePath& file_path) {
- GetSequencedTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&LogPrivateAPI::RegisterTempFileOnFileResourceSequence,
- base::Unretained(this), owner_extension_id, file_path));
-}
-
-static base::LazyInstance<
- BrowserContextKeyedAPIFactory<LogPrivateAPI>>::DestructorAtExit g_factory =
- LAZY_INSTANCE_INITIALIZER;
-
-// static
-BrowserContextKeyedAPIFactory<LogPrivateAPI>*
-LogPrivateAPI::GetFactoryInstance() {
- return g_factory.Pointer();
-}
-
-void LogPrivateAPI::OnAddEntry(const net::NetLogEntry& entry) {
- // We could receive events on whatever thread they happen to be generated,
- // since we are only interested in network events, we should ignore any
- // other thread than BrowserThread::IO.
- if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
- return;
- }
-
- if (!pending_entries_.get()) {
- pending_entries_.reset(new base::ListValue());
- BrowserThread::PostDelayedTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&LogPrivateAPI::PostPendingEntries, base::Unretained(this)),
- base::TimeDelta::FromMilliseconds(kNetLogEventDelayMilliseconds));
- }
- pending_entries_->Append(entry.ToValue());
-}
-
-void LogPrivateAPI::PostPendingEntries() {
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&LogPrivateAPI:: AddEntriesOnUI,
- base::Unretained(this),
- base::Passed(&pending_entries_)));
-}
-
-void LogPrivateAPI::AddEntriesOnUI(std::unique_ptr<base::ListValue> value) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
- for (const std::string& extension_id : net_internal_watches_) {
- // Create the event's arguments value.
- std::unique_ptr<base::ListValue> event_args(new base::ListValue());
- event_args->Append(value->CreateDeepCopy());
- std::unique_ptr<Event> event(
- new Event(::extensions::events::LOG_PRIVATE_ON_CAPTURED_EVENTS,
- ::events::kOnCapturedEvents, std::move(event_args)));
- EventRouter::Get(browser_context_)
- ->DispatchEventToExtension(extension_id, std::move(event));
- }
-}
-
-void LogPrivateAPI::CreateTempNetLogFile(const std::string& owner_extension_id,
- base::ScopedFILE* file) {
- AssertCurrentlyOnFileResourceSequence();
-
- // Create app-specific subdirectory in session logs folder.
- base::FilePath app_log_dir = GetAppLogDirectory().Append(owner_extension_id);
- if (!base::DirectoryExists(app_log_dir)) {
- if (!base::CreateDirectory(app_log_dir)) {
- LOG(ERROR) << "Could not create dir " << app_log_dir.value();
- return;
- }
- }
-
- base::FilePath file_path = app_log_dir.Append(kLogFileNameBase);
- file_path = logging::GenerateTimestampedName(file_path, base::Time::Now());
- FILE* file_ptr = fopen(file_path.value().c_str(), "w");
- if (file_ptr == nullptr) {
- LOG(ERROR) << "Could not open " << file_path.value();
- return;
- }
-
- RegisterTempFileOnFileResourceSequence(owner_extension_id, file_path);
- return file->reset(file_ptr);
-}
-
-void LogPrivateAPI::StartObservingNetEvents(
- IOThread* io_thread,
- base::ScopedFILE* file) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (!file->get())
- return;
-
- write_to_file_observer_.reset(new net::WriteToFileNetLogObserver());
- write_to_file_observer_->set_capture_mode(
- net::NetLogCaptureMode::IncludeCookiesAndCredentials());
- write_to_file_observer_->StartObserving(io_thread->net_log(),
- std::move(*file), nullptr, nullptr);
-}
-
-void LogPrivateAPI::MaybeStartNetInternalLogging(
- const std::string& caller_extension_id,
- IOThread* io_thread,
- api::log_private::EventSink event_sink) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (!logging_net_internals_) {
- logging_net_internals_ = true;
- event_sink_ = event_sink;
- switch (event_sink_) {
- case api::log_private::EVENT_SINK_CAPTURE: {
- io_thread->net_log()->DeprecatedAddObserver(
- this, net::NetLogCaptureMode::IncludeCookiesAndCredentials());
- break;
- }
- case api::log_private::EVENT_SINK_FILE: {
- base::ScopedFILE* file = new base::ScopedFILE();
- // Initialize a FILE on the blocking pool and start observing event
- // on IO thread.
- GetSequencedTaskRunner()->PostTaskAndReply(
- FROM_HERE,
- base::Bind(&LogPrivateAPI::CreateTempNetLogFile,
- base::Unretained(this),
- caller_extension_id,
- file),
- base::Bind(&LogPrivateAPI::StartObservingNetEvents,
- base::Unretained(this),
- io_thread,
- base::Owned(file)));
- break;
- }
- case api::log_private::EVENT_SINK_NONE: {
- NOTREACHED();
- break;
- }
- }
- }
-}
-
-void LogPrivateAPI::MaybeStopNetInternalLogging(const base::Closure& closure) {
- if (net_internal_watches_.empty()) {
- if (closure.is_null()) {
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&LogPrivateAPI::StopNetInternalLogging,
- base::Unretained(this)));
- } else {
- BrowserThread::PostTaskAndReply(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(&LogPrivateAPI::StopNetInternalLogging,
- base::Unretained(this)),
- closure);
- }
- }
-}
-
-void LogPrivateAPI::StopNetInternalLogging() {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- if (net_log() && logging_net_internals_) {
- logging_net_internals_ = false;
- switch (event_sink_) {
- case api::log_private::EVENT_SINK_CAPTURE:
- net_log()->DeprecatedRemoveObserver(this);
- break;
- case api::log_private::EVENT_SINK_FILE:
- write_to_file_observer_->StopObserving(nullptr);
- write_to_file_observer_.reset();
- break;
- case api::log_private::EVENT_SINK_NONE:
- NOTREACHED();
- break;
- }
- }
-}
-
-void LogPrivateAPI::Initialize() {
- if (initialized_)
- return;
-
- // Clean up temp files and folders from the previous sessions.
- initialized_ = true;
- extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
- GetSequencedTaskRunner()->PostTask(
- FROM_HERE,
- base::Bind(&CleanUpLeftoverLogs,
- Profile::FromBrowserContext(browser_context_) ==
- ProfileManager::GetPrimaryUserProfile(),
- GetAppLogDirectory(),
- GetLogDumpDirectory(browser_context_)));
-}
-
-void LogPrivateAPI::RegisterTempFileOnFileResourceSequence(
- const std::string& owner_extension_id,
- const base::FilePath& file_path) {
- AssertCurrentlyOnFileResourceSequence();
- log_file_resources_.Add(new FileResource(owner_extension_id, file_path));
-}
-
-void LogPrivateAPI::OnExtensionUnloaded(
- content::BrowserContext* browser_context,
- const Extension* extension,
- UnloadedExtensionReason reason) {
- StopNetInternalsWatch(extension->id(), base::Closure());
-}
-
-LogPrivateGetHistoricalFunction::LogPrivateGetHistoricalFunction() {
-}
-
-LogPrivateGetHistoricalFunction::~LogPrivateGetHistoricalFunction() {
-}
-
-bool LogPrivateGetHistoricalFunction::RunAsync() {
- // Get parameters
- std::unique_ptr<api::log_private::GetHistorical::Params> params(
- api::log_private::GetHistorical::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
- filter_handler_.reset(new FilterHandler(params->filter));
-
- // Self-deleting object.
- system_logs::SystemLogsFetcher* fetcher = nullptr;
- if ((params->filter).scrub) {
- fetcher = system_logs::BuildChromeSystemLogsFetcher();
- } else {
- fetcher = system_logs::BuildAboutSystemLogsFetcher();
- }
- fetcher->Fetch(
- base::Bind(&LogPrivateGetHistoricalFunction::OnSystemLogsLoaded, this));
-
- return true;
-}
-
-void LogPrivateGetHistoricalFunction::OnSystemLogsLoaded(
- std::unique_ptr<system_logs::SystemLogsResponse> sys_info) {
- // Prepare result
- api::log_private::Result result;
- CollectLogInfo(filter_handler_.get(), sys_info.get(), &result.data);
- api::log_private::Filter::Populate(
- *((filter_handler_->GetFilter())->ToValue()), &result.filter);
- SetResult(result.ToValue());
- SendResponse(true);
-}
-
-LogPrivateStartEventRecorderFunction::LogPrivateStartEventRecorderFunction() {
-}
-
-LogPrivateStartEventRecorderFunction::~LogPrivateStartEventRecorderFunction() {
-}
-
-bool LogPrivateStartEventRecorderFunction::RunAsync() {
- std::unique_ptr<api::log_private::StartEventRecorder::Params> params(
- api::log_private::StartEventRecorder::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
- switch (params->event_type) {
- case api::log_private::EVENT_TYPE_NETWORK:
- LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context()))
- ->StartNetInternalsWatch(
- extension_id(),
- params->sink,
- base::Bind(
- &LogPrivateStartEventRecorderFunction::OnEventRecorderStarted,
- this));
- break;
- case api::log_private::EVENT_TYPE_NONE:
- NOTREACHED();
- return false;
- }
-
- return true;
-}
-
-void LogPrivateStartEventRecorderFunction::OnEventRecorderStarted() {
- SendResponse(true);
-}
-
-LogPrivateStopEventRecorderFunction::LogPrivateStopEventRecorderFunction() {
-}
-
-LogPrivateStopEventRecorderFunction::~LogPrivateStopEventRecorderFunction() {
-}
-
-bool LogPrivateStopEventRecorderFunction::RunAsync() {
- std::unique_ptr<api::log_private::StopEventRecorder::Params> params(
- api::log_private::StopEventRecorder::Params::Create(*args_));
- EXTENSION_FUNCTION_VALIDATE(params.get());
- switch (params->event_type) {
- case api::log_private::EVENT_TYPE_NETWORK:
- LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context()))
- ->StopNetInternalsWatch(
- extension_id(),
- base::Bind(
- &LogPrivateStopEventRecorderFunction::OnEventRecorderStopped,
- this));
- break;
- case api::log_private::EVENT_TYPE_NONE:
- NOTREACHED();
- return false;
- }
- return true;
-}
-
-void LogPrivateStopEventRecorderFunction::OnEventRecorderStopped() {
- SendResponse(true);
-}
-
-LogPrivateDumpLogsFunction::LogPrivateDumpLogsFunction() {
-}
-
-LogPrivateDumpLogsFunction::~LogPrivateDumpLogsFunction() {
-}
-
-bool LogPrivateDumpLogsFunction::RunAsync() {
- LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context()))
- ->StopAllWatches(
- extension_id(),
- base::Bind(&LogPrivateDumpLogsFunction::OnStopAllWatches, this));
- return true;
-}
-
-void LogPrivateDumpLogsFunction::OnStopAllWatches() {
- chromeos::DebugLogWriter::StoreCombinedLogs(
- GetLogDumpDirectory(browser_context()).Append(extension_id()),
- FileResource::kSequenceToken,
- base::Bind(&LogPrivateDumpLogsFunction::OnStoreLogsCompleted, this));
-}
-
-void LogPrivateDumpLogsFunction::OnStoreLogsCompleted(
- const base::FilePath& log_path,
- bool succeeded) {
- if (succeeded) {
- LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context()))
- ->RegisterTempFile(extension_id(), log_path);
- }
-
- std::unique_ptr<base::DictionaryValue> response(new base::DictionaryValue());
- extensions::GrantedFileEntry file_entry =
- extensions::app_file_handler_util::CreateFileEntry(
- Profile::FromBrowserContext(browser_context()),
- extension(),
- render_frame_host()->GetProcess()->GetID(),
- log_path,
- false);
-
- auto entry = base::MakeUnique<base::DictionaryValue>();
- entry->SetString("fileSystemId", file_entry.filesystem_id);
- entry->SetString("baseName", file_entry.registered_name);
- entry->SetString("id", file_entry.id);
- entry->SetBoolean("isDirectory", false);
- auto entry_list = base::MakeUnique<base::ListValue>();
- entry_list->Append(std::move(entry));
- response->Set("entries", std::move(entry_list));
- response->SetBoolean("multiple", false);
- SetResult(std::move(response));
- SendResponse(succeeded);
-}
-
-} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698