Chromium Code Reviews| Index: content/browser/browser_context.cc |
| diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc |
| index 1b72aec2ba83165c923b9828515c071735b30201..9458bd53eeba4578aca8e3f8114a155acdac2586 100644 |
| --- a/content/browser/browser_context.cc |
| +++ b/content/browser/browser_context.cc |
| @@ -23,6 +23,7 @@ |
| #include "net/cookies/cookie_store.h" |
| #include "net/url_request/url_request_context.h" |
| #include "net/url_request/url_request_context_getter.h" |
| +#include "ui/base/clipboard/clipboard.h" |
| #include "webkit/database/database_tracker.h" |
| #include "webkit/fileapi/external_mount_points.h" |
| #endif // !OS_IOS |
| @@ -36,6 +37,7 @@ namespace content { |
| namespace { |
| // Key names on BrowserContext. |
| +const char kClipboardDestroyerKey[] = "clipboard_destroyer"; |
| const char kDownloadManagerKeyName[] = "download_manager"; |
| const char kMountPointsKey[] = "mount_points"; |
| const char kStorageParitionMapKeyName[] = "content_storage_partition_map"; |
| @@ -92,6 +94,37 @@ void PurgeMemoryOnIOThread(appcache::AppCacheService* appcache_service) { |
| appcache_service->PurgeMemory(); |
| } |
| +// OffTheRecordClipboardDestroyer is supposed to clear the clipboard in |
| +// destructor if current clipboard content came from corresponding OffTheRecord |
| +// browser context. |
| +class OffTheRecordClipboardDestroyer : public base::SupportsUserData::Data { |
| + public: |
| + virtual ~OffTheRecordClipboardDestroyer() { |
| + ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread(); |
| + ExamineClipboard(clipboard, ui::Clipboard::BUFFER_STANDARD); |
| + if (ui::Clipboard::IsValidBuffer(ui::Clipboard::BUFFER_SELECTION)) |
| + ExamineClipboard(clipboard, ui::Clipboard::BUFFER_SELECTION); |
| + } |
|
battre
2013/02/12 12:50:59
nit: new lien before private:
vasilii
2013/02/12 15:58:32
Done.
|
| + private: |
| + void ExamineClipboard(ui::Clipboard* clipboard, |
| + ui::Clipboard::Buffer buffer) { |
|
battre
2013/02/12 12:50:59
nit: indentation
vasilii
2013/02/12 15:58:32
Done.
|
| + ui::Clipboard::SourceTag source_tag = clipboard->ReadSourceTag(buffer); |
| + if (source_tag == ui::Clipboard::SourceTag(this)) |
| + clipboard->Clear(buffer); |
| + } |
| +}; |
| + |
| +// Returns existing OffTheRecordClipboardDestroyer or creates one. |
| +OffTheRecordClipboardDestroyer* GetClipboardDestroyerForBrowserContext( |
| + BrowserContext* context) { |
| + if (base::SupportsUserData::Data* data = context->GetUserData( |
| + kClipboardDestroyerKey)) |
|
battre
2013/02/12 12:50:59
nit: +4 spaces indentation
vasilii
2013/02/12 15:58:32
Done.
|
| + return static_cast<OffTheRecordClipboardDestroyer*>(data); |
| + OffTheRecordClipboardDestroyer* data = new OffTheRecordClipboardDestroyer; |
| + context->SetUserData(kClipboardDestroyerKey, data); |
| + return data; |
| +} |
| + |
| } // namespace |
| // static |
| @@ -273,6 +306,17 @@ void BrowserContext::PurgeMemory(BrowserContext* browser_context) { |
| ForEachStoragePartition(browser_context, |
| base::Bind(&PurgeDOMStorageContextInPartition)); |
| } |
| + |
| +ui::Clipboard::SourceTag BrowserContext::GetMarkerForOffTheRecordContext( |
| + BrowserContext* context) { |
| + if (context && context->IsOffTheRecord()) { |
| + OffTheRecordClipboardDestroyer* clipboard_destroyer = |
| + GetClipboardDestroyerForBrowserContext(context); |
| + |
| + return ui::Clipboard::SourceTag(clipboard_destroyer); |
|
battre
2013/02/12 12:50:59
How about adding a function
ui::Clipboard::Source
vasilii
2013/02/12 15:58:32
Done.
|
| + } |
| + return ui::Clipboard::SourceTag(); |
| +} |
| #endif // !OS_IOS |
| BrowserContext::~BrowserContext() { |