| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "chrome/browser/extensions/api/log_private/log_private_api.h" | 5 #include "chrome/browser/extensions/api/log_private/log_private_api.h" | 
| 6 | 6 | 
|  | 7 #include <memory> | 
| 7 #include <string> | 8 #include <string> | 
| 8 #include <utility> | 9 #include <utility> | 
| 9 #include <vector> | 10 #include <vector> | 
| 10 | 11 | 
| 11 #include "base/command_line.h" | 12 #include "base/command_line.h" | 
| 12 #include "base/files/file_util.h" | 13 #include "base/files/file_util.h" | 
| 13 #include "base/json/json_writer.h" | 14 #include "base/json/json_writer.h" | 
| 14 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" | 
| 15 #include "base/logging.h" | 16 #include "base/logging.h" | 
| 16 #include "base/memory/scoped_ptr.h" |  | 
| 17 #include "build/build_config.h" | 17 #include "build/build_config.h" | 
| 18 #include "chrome/browser/browser_process.h" | 18 #include "chrome/browser/browser_process.h" | 
| 19 #include "chrome/browser/download/download_prefs.h" | 19 #include "chrome/browser/download/download_prefs.h" | 
| 20 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" | 20 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" | 
| 21 #include "chrome/browser/extensions/api/log_private/filter_handler.h" | 21 #include "chrome/browser/extensions/api/log_private/filter_handler.h" | 
| 22 #include "chrome/browser/extensions/api/log_private/log_parser.h" | 22 #include "chrome/browser/extensions/api/log_private/log_parser.h" | 
| 23 #include "chrome/browser/extensions/api/log_private/syslog_parser.h" | 23 #include "chrome/browser/extensions/api/log_private/syslog_parser.h" | 
| 24 #include "chrome/browser/feedback/system_logs/scrubbed_system_logs_fetcher.h" | 24 #include "chrome/browser/feedback/system_logs/scrubbed_system_logs_fetcher.h" | 
| 25 #include "chrome/browser/io_thread.h" | 25 #include "chrome/browser/io_thread.h" | 
| 26 #include "chrome/browser/profiles/profile.h" | 26 #include "chrome/browser/profiles/profile.h" | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 61       base::SequencedWorkerPool::BLOCK_SHUTDOWN); | 61       base::SequencedWorkerPool::BLOCK_SHUTDOWN); | 
| 62 } | 62 } | 
| 63 | 63 | 
| 64 // Checks if we are running on sequenced task runner thread. | 64 // Checks if we are running on sequenced task runner thread. | 
| 65 bool IsRunningOnSequenceThread() { | 65 bool IsRunningOnSequenceThread() { | 
| 66   base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); | 66   base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); | 
| 67   return pool->IsRunningSequenceOnCurrentThread( | 67   return pool->IsRunningSequenceOnCurrentThread( | 
| 68       pool->GetNamedSequenceToken(FileResource::kSequenceToken)); | 68       pool->GetNamedSequenceToken(FileResource::kSequenceToken)); | 
| 69 } | 69 } | 
| 70 | 70 | 
| 71 scoped_ptr<LogParser> CreateLogParser(const std::string& log_type) { | 71 std::unique_ptr<LogParser> CreateLogParser(const std::string& log_type) { | 
| 72   if (log_type == "syslog") | 72   if (log_type == "syslog") | 
| 73     return scoped_ptr<LogParser>(new SyslogParser()); | 73     return std::unique_ptr<LogParser>(new SyslogParser()); | 
| 74   // TODO(shinfan): Add more parser here | 74   // TODO(shinfan): Add more parser here | 
| 75 | 75 | 
| 76   NOTREACHED() << "Invalid log type: " << log_type; | 76   NOTREACHED() << "Invalid log type: " << log_type; | 
| 77   return  scoped_ptr<LogParser>(); | 77   return std::unique_ptr<LogParser>(); | 
| 78 } | 78 } | 
| 79 | 79 | 
| 80 void CollectLogInfo(FilterHandler* filter_handler, | 80 void CollectLogInfo(FilterHandler* filter_handler, | 
| 81                     system_logs::SystemLogsResponse* logs, | 81                     system_logs::SystemLogsResponse* logs, | 
| 82                     std::vector<api::log_private::LogEntry>* output) { | 82                     std::vector<api::log_private::LogEntry>* output) { | 
| 83   for (system_logs::SystemLogsResponse::const_iterator | 83   for (system_logs::SystemLogsResponse::const_iterator | 
| 84       request_it = logs->begin(); request_it != logs->end(); ++request_it) { | 84       request_it = logs->begin(); request_it != logs->end(); ++request_it) { | 
| 85     if (!filter_handler->IsValidSource(request_it->first)) { | 85     if (!filter_handler->IsValidSource(request_it->first)) { | 
| 86       continue; | 86       continue; | 
| 87     } | 87     } | 
| 88     scoped_ptr<LogParser> parser(CreateLogParser(request_it->first)); | 88     std::unique_ptr<LogParser> parser(CreateLogParser(request_it->first)); | 
| 89     if (parser) { | 89     if (parser) { | 
| 90       parser->Parse(request_it->second, output, filter_handler); | 90       parser->Parse(request_it->second, output, filter_handler); | 
| 91     } | 91     } | 
| 92   } | 92   } | 
| 93 } | 93 } | 
| 94 | 94 | 
| 95 // Returns directory location of app-specific logs that are initiated with | 95 // Returns directory location of app-specific logs that are initiated with | 
| 96 // logPrivate.startEventRecorder() calls - /home/chronos/user/log/apps | 96 // logPrivate.startEventRecorder() calls - /home/chronos/user/log/apps | 
| 97 base::FilePath GetAppLogDirectory() { | 97 base::FilePath GetAppLogDirectory() { | 
| 98   return logging::GetSessionLogDir(*base::CommandLine::ForCurrentProcess()) | 98   return logging::GetSessionLogDir(*base::CommandLine::ForCurrentProcess()) | 
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 234 } | 234 } | 
| 235 | 235 | 
| 236 void LogPrivateAPI::PostPendingEntries() { | 236 void LogPrivateAPI::PostPendingEntries() { | 
| 237   BrowserThread::PostTask( | 237   BrowserThread::PostTask( | 
| 238       BrowserThread::UI, FROM_HERE, | 238       BrowserThread::UI, FROM_HERE, | 
| 239       base::Bind(&LogPrivateAPI:: AddEntriesOnUI, | 239       base::Bind(&LogPrivateAPI:: AddEntriesOnUI, | 
| 240                  base::Unretained(this), | 240                  base::Unretained(this), | 
| 241                  base::Passed(&pending_entries_))); | 241                  base::Passed(&pending_entries_))); | 
| 242 } | 242 } | 
| 243 | 243 | 
| 244 void LogPrivateAPI::AddEntriesOnUI(scoped_ptr<base::ListValue> value) { | 244 void LogPrivateAPI::AddEntriesOnUI(std::unique_ptr<base::ListValue> value) { | 
| 245   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 245   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 246 | 246 | 
| 247   for (std::set<std::string>::iterator ix = net_internal_watches_.begin(); | 247   for (std::set<std::string>::iterator ix = net_internal_watches_.begin(); | 
| 248        ix != net_internal_watches_.end(); ++ix) { | 248        ix != net_internal_watches_.end(); ++ix) { | 
| 249     // Create the event's arguments value. | 249     // Create the event's arguments value. | 
| 250     scoped_ptr<base::ListValue> event_args(new base::ListValue()); | 250     std::unique_ptr<base::ListValue> event_args(new base::ListValue()); | 
| 251     event_args->Append(value->DeepCopy()); | 251     event_args->Append(value->DeepCopy()); | 
| 252     scoped_ptr<Event> event( | 252     std::unique_ptr<Event> event( | 
| 253         new Event(::extensions::events::LOG_PRIVATE_ON_CAPTURED_EVENTS, | 253         new Event(::extensions::events::LOG_PRIVATE_ON_CAPTURED_EVENTS, | 
| 254                   ::events::kOnCapturedEvents, std::move(event_args))); | 254                   ::events::kOnCapturedEvents, std::move(event_args))); | 
| 255     EventRouter::Get(browser_context_) | 255     EventRouter::Get(browser_context_) | 
| 256         ->DispatchEventToExtension(*ix, std::move(event)); | 256         ->DispatchEventToExtension(*ix, std::move(event)); | 
| 257   } | 257   } | 
| 258 } | 258 } | 
| 259 | 259 | 
| 260 void LogPrivateAPI::CreateTempNetLogFile(const std::string& owner_extension_id, | 260 void LogPrivateAPI::CreateTempNetLogFile(const std::string& owner_extension_id, | 
| 261                                          base::ScopedFILE* file) { | 261                                          base::ScopedFILE* file) { | 
| 262   DCHECK(IsRunningOnSequenceThread()); | 262   DCHECK(IsRunningOnSequenceThread()); | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 396 } | 396 } | 
| 397 | 397 | 
| 398 LogPrivateGetHistoricalFunction::LogPrivateGetHistoricalFunction() { | 398 LogPrivateGetHistoricalFunction::LogPrivateGetHistoricalFunction() { | 
| 399 } | 399 } | 
| 400 | 400 | 
| 401 LogPrivateGetHistoricalFunction::~LogPrivateGetHistoricalFunction() { | 401 LogPrivateGetHistoricalFunction::~LogPrivateGetHistoricalFunction() { | 
| 402 } | 402 } | 
| 403 | 403 | 
| 404 bool LogPrivateGetHistoricalFunction::RunAsync() { | 404 bool LogPrivateGetHistoricalFunction::RunAsync() { | 
| 405   // Get parameters | 405   // Get parameters | 
| 406   scoped_ptr<api::log_private::GetHistorical::Params> params( | 406   std::unique_ptr<api::log_private::GetHistorical::Params> params( | 
| 407       api::log_private::GetHistorical::Params::Create(*args_)); | 407       api::log_private::GetHistorical::Params::Create(*args_)); | 
| 408   EXTENSION_FUNCTION_VALIDATE(params.get()); | 408   EXTENSION_FUNCTION_VALIDATE(params.get()); | 
| 409   filter_handler_.reset(new FilterHandler(params->filter)); | 409   filter_handler_.reset(new FilterHandler(params->filter)); | 
| 410 | 410 | 
| 411   system_logs::SystemLogsFetcherBase* fetcher; | 411   system_logs::SystemLogsFetcherBase* fetcher; | 
| 412   if ((params->filter).scrub) { | 412   if ((params->filter).scrub) { | 
| 413     fetcher = new system_logs::ScrubbedSystemLogsFetcher(); | 413     fetcher = new system_logs::ScrubbedSystemLogsFetcher(); | 
| 414   } else { | 414   } else { | 
| 415     fetcher = new system_logs::AboutSystemLogsFetcher(); | 415     fetcher = new system_logs::AboutSystemLogsFetcher(); | 
| 416   } | 416   } | 
| 417   fetcher->Fetch( | 417   fetcher->Fetch( | 
| 418       base::Bind(&LogPrivateGetHistoricalFunction::OnSystemLogsLoaded, this)); | 418       base::Bind(&LogPrivateGetHistoricalFunction::OnSystemLogsLoaded, this)); | 
| 419 | 419 | 
| 420   return true; | 420   return true; | 
| 421 } | 421 } | 
| 422 | 422 | 
| 423 void LogPrivateGetHistoricalFunction::OnSystemLogsLoaded( | 423 void LogPrivateGetHistoricalFunction::OnSystemLogsLoaded( | 
| 424     scoped_ptr<system_logs::SystemLogsResponse> sys_info) { | 424     std::unique_ptr<system_logs::SystemLogsResponse> sys_info) { | 
| 425 |  | 
| 426   // Prepare result | 425   // Prepare result | 
| 427   api::log_private::Result result; | 426   api::log_private::Result result; | 
| 428   CollectLogInfo(filter_handler_.get(), sys_info.get(), &result.data); | 427   CollectLogInfo(filter_handler_.get(), sys_info.get(), &result.data); | 
| 429   api::log_private::Filter::Populate( | 428   api::log_private::Filter::Populate( | 
| 430       *((filter_handler_->GetFilter())->ToValue()), &result.filter); | 429       *((filter_handler_->GetFilter())->ToValue()), &result.filter); | 
| 431   SetResult(result.ToValue().release()); | 430   SetResult(result.ToValue().release()); | 
| 432   SendResponse(true); | 431   SendResponse(true); | 
| 433 } | 432 } | 
| 434 | 433 | 
| 435 LogPrivateStartEventRecorderFunction::LogPrivateStartEventRecorderFunction() { | 434 LogPrivateStartEventRecorderFunction::LogPrivateStartEventRecorderFunction() { | 
| 436 } | 435 } | 
| 437 | 436 | 
| 438 LogPrivateStartEventRecorderFunction::~LogPrivateStartEventRecorderFunction() { | 437 LogPrivateStartEventRecorderFunction::~LogPrivateStartEventRecorderFunction() { | 
| 439 } | 438 } | 
| 440 | 439 | 
| 441 bool LogPrivateStartEventRecorderFunction::RunAsync() { | 440 bool LogPrivateStartEventRecorderFunction::RunAsync() { | 
| 442   scoped_ptr<api::log_private::StartEventRecorder::Params> params( | 441   std::unique_ptr<api::log_private::StartEventRecorder::Params> params( | 
| 443       api::log_private::StartEventRecorder::Params::Create(*args_)); | 442       api::log_private::StartEventRecorder::Params::Create(*args_)); | 
| 444   EXTENSION_FUNCTION_VALIDATE(params.get()); | 443   EXTENSION_FUNCTION_VALIDATE(params.get()); | 
| 445   switch (params->event_type) { | 444   switch (params->event_type) { | 
| 446     case api::log_private::EVENT_TYPE_NETWORK: | 445     case api::log_private::EVENT_TYPE_NETWORK: | 
| 447       LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context())) | 446       LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context())) | 
| 448           ->StartNetInternalsWatch( | 447           ->StartNetInternalsWatch( | 
| 449               extension_id(), | 448               extension_id(), | 
| 450               params->sink, | 449               params->sink, | 
| 451               base::Bind( | 450               base::Bind( | 
| 452                   &LogPrivateStartEventRecorderFunction::OnEventRecorderStarted, | 451                   &LogPrivateStartEventRecorderFunction::OnEventRecorderStarted, | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 464   SendResponse(true); | 463   SendResponse(true); | 
| 465 } | 464 } | 
| 466 | 465 | 
| 467 LogPrivateStopEventRecorderFunction::LogPrivateStopEventRecorderFunction() { | 466 LogPrivateStopEventRecorderFunction::LogPrivateStopEventRecorderFunction() { | 
| 468 } | 467 } | 
| 469 | 468 | 
| 470 LogPrivateStopEventRecorderFunction::~LogPrivateStopEventRecorderFunction() { | 469 LogPrivateStopEventRecorderFunction::~LogPrivateStopEventRecorderFunction() { | 
| 471 } | 470 } | 
| 472 | 471 | 
| 473 bool LogPrivateStopEventRecorderFunction::RunAsync() { | 472 bool LogPrivateStopEventRecorderFunction::RunAsync() { | 
| 474   scoped_ptr<api::log_private::StopEventRecorder::Params> params( | 473   std::unique_ptr<api::log_private::StopEventRecorder::Params> params( | 
| 475       api::log_private::StopEventRecorder::Params::Create(*args_)); | 474       api::log_private::StopEventRecorder::Params::Create(*args_)); | 
| 476   EXTENSION_FUNCTION_VALIDATE(params.get()); | 475   EXTENSION_FUNCTION_VALIDATE(params.get()); | 
| 477   switch (params->event_type) { | 476   switch (params->event_type) { | 
| 478     case api::log_private::EVENT_TYPE_NETWORK: | 477     case api::log_private::EVENT_TYPE_NETWORK: | 
| 479       LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context())) | 478       LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context())) | 
| 480           ->StopNetInternalsWatch( | 479           ->StopNetInternalsWatch( | 
| 481               extension_id(), | 480               extension_id(), | 
| 482               base::Bind( | 481               base::Bind( | 
| 483                   &LogPrivateStopEventRecorderFunction::OnEventRecorderStopped, | 482                   &LogPrivateStopEventRecorderFunction::OnEventRecorderStopped, | 
| 484                   this)); | 483                   this)); | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 516 } | 515 } | 
| 517 | 516 | 
| 518 void LogPrivateDumpLogsFunction::OnStoreLogsCompleted( | 517 void LogPrivateDumpLogsFunction::OnStoreLogsCompleted( | 
| 519     const base::FilePath& log_path, | 518     const base::FilePath& log_path, | 
| 520     bool succeeded) { | 519     bool succeeded) { | 
| 521   if (succeeded) { | 520   if (succeeded) { | 
| 522     LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context())) | 521     LogPrivateAPI::Get(Profile::FromBrowserContext(browser_context())) | 
| 523         ->RegisterTempFile(extension_id(), log_path); | 522         ->RegisterTempFile(extension_id(), log_path); | 
| 524   } | 523   } | 
| 525 | 524 | 
| 526   scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue()); | 525   std::unique_ptr<base::DictionaryValue> response(new base::DictionaryValue()); | 
| 527   extensions::GrantedFileEntry file_entry = | 526   extensions::GrantedFileEntry file_entry = | 
| 528       extensions::app_file_handler_util::CreateFileEntry( | 527       extensions::app_file_handler_util::CreateFileEntry( | 
| 529           Profile::FromBrowserContext(browser_context()), | 528           Profile::FromBrowserContext(browser_context()), | 
| 530           extension(), | 529           extension(), | 
| 531           render_frame_host()->GetProcess()->GetID(), | 530           render_frame_host()->GetProcess()->GetID(), | 
| 532           log_path, | 531           log_path, | 
| 533           false); | 532           false); | 
| 534 | 533 | 
| 535   base::DictionaryValue* entry = new base::DictionaryValue(); | 534   base::DictionaryValue* entry = new base::DictionaryValue(); | 
| 536   entry->SetString("fileSystemId", file_entry.filesystem_id); | 535   entry->SetString("fileSystemId", file_entry.filesystem_id); | 
| 537   entry->SetString("baseName", file_entry.registered_name); | 536   entry->SetString("baseName", file_entry.registered_name); | 
| 538   entry->SetString("id", file_entry.id); | 537   entry->SetString("id", file_entry.id); | 
| 539   entry->SetBoolean("isDirectory", false); | 538   entry->SetBoolean("isDirectory", false); | 
| 540   base::ListValue* entry_list = new base::ListValue(); | 539   base::ListValue* entry_list = new base::ListValue(); | 
| 541   entry_list->Append(entry); | 540   entry_list->Append(entry); | 
| 542   response->Set("entries", entry_list); | 541   response->Set("entries", entry_list); | 
| 543   response->SetBoolean("multiple", false); | 542   response->SetBoolean("multiple", false); | 
| 544   SetResult(response.release()); | 543   SetResult(response.release()); | 
| 545   SendResponse(succeeded); | 544   SendResponse(succeeded); | 
| 546 } | 545 } | 
| 547 | 546 | 
| 548 }  // namespace extensions | 547 }  // namespace extensions | 
| OLD | NEW | 
|---|