| Index: chrome/browser/ui/webui/screenshot_source.cc
|
| diff --git a/chrome/browser/ui/webui/screenshot_source.cc b/chrome/browser/ui/webui/screenshot_source.cc
|
| index c99bd870182d149c6f655adf1e173663c8deac15..e9f7ddf8663fcf09bcc7c9a4b8c10fb49e035cd3 100644
|
| --- a/chrome/browser/ui/webui/screenshot_source.cc
|
| +++ b/chrome/browser/ui/webui/screenshot_source.cc
|
| @@ -6,32 +6,62 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| +#include "base/file_path.h"
|
| #include "base/file_util.h"
|
| +#include "base/i18n/time_formatting.h"
|
| #include "base/memory/ref_counted_memory.h"
|
| #include "base/message_loop.h"
|
| #include "base/path_service.h"
|
| #include "base/string16.h"
|
| +#include "base/stringprintf.h"
|
| #include "base/string_util.h"
|
| +#include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/download/download_prefs.h"
|
| +#include "chrome/browser/prefs/pref_service.h"
|
| +#include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/browser/profiles/profile_manager.h"
|
| #include "chrome/common/chrome_paths.h"
|
| +#include "chrome/common/pref_names.h"
|
| #include "chrome/common/url_constants.h"
|
| #include "googleurl/src/url_canon.h"
|
| #include "googleurl/src/url_util.h"
|
|
|
| -#if defined(OS_CHROMEOS)
|
| +#if defined(USE_ASH)
|
| #include "ash/shell.h"
|
| #include "ash/shell_delegate.h"
|
| +#endif
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| #include "chrome/browser/chromeos/gdata/drive_file_system_interface.h"
|
| #include "chrome/browser/chromeos/gdata/drive_file_system_util.h"
|
| #include "chrome/browser/chromeos/gdata/drive_system_service.h"
|
| +#include "chrome/browser/chromeos/login/user_manager.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #endif
|
|
|
| -static const char kCurrentScreenshotFilename[] = "current";
|
| +// static
|
| +const char ScreenshotSource::kScreenshotUrlRoot[] = "chrome://screenshots/";
|
| +// static
|
| +const char ScreenshotSource::kScreenshotCurrent[] = "current";
|
| +// static
|
| +const char ScreenshotSource::kScreenshotSaved[] = "saved/";
|
| #if defined(OS_CHROMEOS)
|
| -static const char kSavedScreenshotsBasePath[] = "saved/";
|
| +// static
|
| +const char ScreenshotSource::kScreenshotPrefix[] = "Screenshot ";
|
| +// static
|
| +const char ScreenshotSource::kScreenshotSuffix[] = ".png";
|
| #endif
|
|
|
| +bool ShouldUse24HourClock() {
|
| +#if defined(OS_CHROMEOS)
|
| + Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
|
| + if (profile) {
|
| + return profile->GetPrefs()->GetBoolean(prefs::kUse24HourClock);
|
| + }
|
| +#endif
|
| + return base::GetHourClockType() == base::k24HourClock;
|
| +}
|
| +
|
| ScreenshotSource::ScreenshotSource(
|
| std::vector<unsigned char>* current_screenshot,
|
| Profile* profile)
|
| @@ -46,6 +76,70 @@ ScreenshotSource::ScreenshotSource(
|
|
|
| ScreenshotSource::~ScreenshotSource() {}
|
|
|
| +// static
|
| +std::string ScreenshotSource::GetScreenshotBaseFilename() {
|
| + base::Time::Exploded now;
|
| + base::Time::Now().LocalExplode(&now);
|
| +
|
| + // We don't use base/i18n/time_formatting.h here because it doesn't
|
| + // support our format. Don't use ICU either to avoid i18n file names
|
| + // for non-English locales.
|
| + // TODO(mukai): integrate this logic somewhere time_formatting.h
|
| + std::string file_name = base::StringPrintf(
|
| + "Screenshot %d-%02d-%02d at ", now.year, now.month, now.day_of_month);
|
| +
|
| + if (ShouldUse24HourClock()) {
|
| + file_name.append(base::StringPrintf(
|
| + "%02d.%02d.%02d", now.hour, now.minute, now.second));
|
| + } else {
|
| + int hour = now.hour;
|
| + if (hour > 12) {
|
| + hour -= 12;
|
| + } else if (hour == 0) {
|
| + hour = 12;
|
| + }
|
| + file_name.append(base::StringPrintf(
|
| + "%d.%02d.%02d ", hour, now.minute, now.second));
|
| + file_name.append((now.hour >= 12) ? "PM" : "AM");
|
| + }
|
| +
|
| + return file_name;
|
| +}
|
| +
|
| +#if defined(USE_ASH)
|
| +
|
| +// static
|
| +bool ScreenshotSource::AreScreenshotsDisabled() {
|
| + return g_browser_process->local_state()->GetBoolean(
|
| + prefs::kDisableScreenshots);
|
| +}
|
| +
|
| +// static
|
| +bool ScreenshotSource::GetScreenshotDirectory(FilePath* directory) {
|
| + if (ScreenshotSource::AreScreenshotsDisabled())
|
| + return false;
|
| +
|
| + bool is_logged_in = true;
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| + is_logged_in = chromeos::UserManager::Get()->IsUserLoggedIn();
|
| +#endif
|
| +
|
| + if (is_logged_in) {
|
| + DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext(
|
| + ash::Shell::GetInstance()->delegate()->GetCurrentBrowserContext());
|
| + *directory = download_prefs->DownloadPath();
|
| + } else {
|
| + if (!file_util::GetTempDir(directory)) {
|
| + LOG(ERROR) << "Failed to find temporary directory.";
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +#endif
|
| +
|
| void ScreenshotSource::StartDataRequest(const std::string& path, bool,
|
| int request_id) {
|
| SendScreenshot(path, request_id);
|
| @@ -75,14 +169,15 @@ void ScreenshotSource::SendScreenshot(const std::string& screenshot_path,
|
| // image gets reloaded instead of being pulled from the browser cache
|
| std::string path = screenshot_path.substr(
|
| 0, screenshot_path.find_first_of("?"));
|
| - if (path == kCurrentScreenshotFilename) {
|
| + if (path == ScreenshotSource::kScreenshotCurrent) {
|
| CacheAndSendScreenshot(path, request_id, current_screenshot_);
|
| #if defined(OS_CHROMEOS)
|
| - } else if (path.compare(0, strlen(kSavedScreenshotsBasePath),
|
| - kSavedScreenshotsBasePath) == 0) {
|
| + } else if (path.compare(0, strlen(ScreenshotSource::kScreenshotSaved),
|
| + ScreenshotSource::kScreenshotSaved) == 0) {
|
| using content::BrowserThread;
|
|
|
| - std::string filename = path.substr(strlen(kSavedScreenshotsBasePath));
|
| + std::string filename =
|
| + path.substr(strlen(ScreenshotSource::kScreenshotSaved));
|
|
|
| url_canon::RawCanonOutputT<char16> decoded;
|
| url_util::DecodeURLEscapeSequences(
|
| @@ -91,9 +186,8 @@ void ScreenshotSource::SendScreenshot(const std::string& screenshot_path,
|
| std::string decoded_filename = UTF16ToASCII(string16(
|
| decoded.data(), decoded.length()));
|
|
|
| - DownloadPrefs* download_prefs = DownloadPrefs::FromBrowserContext(
|
| - ash::Shell::GetInstance()->delegate()->GetCurrentBrowserContext());
|
| - FilePath download_path = download_prefs->DownloadPath();
|
| + FilePath download_path;
|
| + GetScreenshotDirectory(&download_path);
|
| if (gdata::util::IsUnderDriveMountPoint(download_path)) {
|
| gdata::DriveFileSystemInterface* file_system =
|
| gdata::DriveSystemServiceFactory::GetForProfile(
|
|
|