Chromium Code Reviews| Index: content/public/browser/incognito_marker.cc |
| diff --git a/content/public/browser/incognito_marker.cc b/content/public/browser/incognito_marker.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c5f631c678dbf2e9b24e813b80f4a58a4e9ba032 |
| --- /dev/null |
| +++ b/content/public/browser/incognito_marker.cc |
| @@ -0,0 +1,80 @@ |
| +// 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 "content/public/browser/incognito_marker.h" |
| +#include <cstddef> |
|
jam
2013/02/04 16:01:59
nit: per style guide, should be a blank line befor
|
| +#include <cstring> |
| +#include <vector> |
| +#include "content/public/browser/browser_context.h" |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +const std::size_t kPointerSize = sizeof(void*); |
| + |
| +union Pointer2BinaryHelper { |
| + void* ptr; |
| + char bytes[kPointerSize]; |
| +}; |
| + |
| +// IncognitoMarker is to be stored in the clipboard whenever |
| +// current clipboard data is from incognito window. |
| +// Such data must be erased upon exit from incognito mode. |
|
jam
2013/02/04 16:01:59
nit: in this file refer to "off the record" instea
|
| +class IncognitoMarker { |
| + public: |
| + explicit IncognitoMarker(void* profile_ptr) : profile_ptr_(profile_ptr) {} |
| + |
| + void* profile_ptr() const { return profile_ptr_; } |
| + std::vector<char> Serialize() const; |
| + static void* Deserialize(const std::string& serialization); |
| + |
| + private: |
| + // Pointer to OffTheRecordProfileImpl |
| + void* profile_ptr_; |
| +}; |
| + |
| +std::vector<char> IncognitoMarker::Serialize() const { |
| + Pointer2BinaryHelper helper; |
| + helper.ptr = profile_ptr_; |
| + return std::vector<char>(helper.bytes, helper.bytes + kPointerSize); |
| +} |
| + |
| +void* IncognitoMarker::Deserialize(const std::string& serialization) { |
| + if (serialization.size() != kPointerSize) |
| + return NULL; |
| + Pointer2BinaryHelper helper; |
| + memcpy(helper.bytes, serialization.c_str(), kPointerSize); |
| + return helper.ptr; |
| +} |
| +} // anonymous namespace |
| + |
| +void AddIncognitoMarkerForOffTheRecordProfile( |
| + BrowserContext* profile, |
| + ui::Clipboard::ObjectMap* objects) { |
| + if (profile && profile->IsOffTheRecord()) { |
| + IncognitoMarker marker(profile); |
| + ui::Clipboard::ObjectMapParams incognito_marker_params; |
| + incognito_marker_params.push_back(marker.Serialize()); |
| + (*objects)[ui::Clipboard::CBF_INCOGNITO_MARKER].swap( |
| + incognito_marker_params); |
| + } |
| +} |
| + |
| +bool IsThisIncognitoMarkerInClipboard(BrowserContext* profile) { |
| + if (profile) { |
| +#if defined(TOOLKIT_GTK) |
| + // Only linux for now, other platforms don't implement |
| + // Clipboard::GetIncognitoMarkerFormatType(). |
| + // TODO(vasilii): support other platforms. |
| + std::string result; |
| + ui::Clipboard::GetForCurrentThread()->ReadData( |
| + ui::Clipboard::GetIncognitoMarkerFormatType(), &result); |
| + return profile == IncognitoMarker::Deserialize(result); |
| +#endif |
| + } |
| + return false; |
| +} |
| + |
| +} // namespace content |