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

Unified Diff: base/clipboard.h

Issue 9154: Rewrote the clipboard API to be more concurrent. Added a helper class to make... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month 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
« no previous file with comments | « base/build/base.vcproj ('k') | base/clipboard.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/clipboard.h
===================================================================
--- base/clipboard.h (revision 4189)
+++ base/clipboard.h (working copy)
@@ -31,59 +31,67 @@
#elif defined(OS_LINUX)
typedef struct _GdkAtom* FormatType;
typedef struct _GtkClipboard GtkClipboard;
- // A mapping from target (format) string to the relevant data (usually a
- // string, but potentially arbitrary data).
- typedef std::map<std::string, std::pair<uint8*, size_t> > TargetMap;
+ typedef std::map<std::string, std::pair<char*, size_t> > TargetMap;
#endif
+ // ObjectType designates the type of data to be stored in the clipboard. This
+ // designation is shared across all OSes. The system-specific designation
+ // is defined by FormatType. A single ObjectType might be represented by
+ // several system-specific FormatTypes. For example, on Linux the CBF_TEXT
+ // ObjectType maps to "text/plain", "STRING", and several other formats. On
+ // windows it maps to CF_UNICODETEXT.
+ enum ObjectType {
+ CBF_TEXT,
+ CBF_HTML,
+ CBF_BOOKMARK,
+ CBF_LINK,
+ CBF_FILES,
+ CBF_WEBKIT,
+ CBF_BITMAP,
+ CBF_SMBITMAP // bitmap from shared memory
+ };
+
+ // ObjectMap is a map from ObjectType to associated data.
+ // The data is organized differently for each ObjectType. The following
+ // table summarizes what kind of data is stored for each key.
+ // * indicates an optional argument.
+ //
+ // Key Arguments Type
+ // -------------------------------------
+ // CBF_TEXT text char array
+ // CBF_HTML html char array
+ // url* char array
+ // CBF_BOOKMARK html char array
+ // url char array
+ // CBF_LINK html char array
+ // url char array
+ // CBF_FILES files char array representing multiple files.
+ // Filenames are separated by null characters and
+ // the final filename is double null terminated.
+ // CBF_WEBKIT none empty vector
+ // CBF_BITMAP pixels byte array
+ // size gfx::Size struct
+ // CBF_SMBITMAP shared_mem shared memory handle
+ // size gfx::Size struct
+ typedef std::vector<char> ObjectMapParam;
+ typedef std::vector<ObjectMapParam> ObjectMapParams;
+ typedef std::map<int /* ObjectType */, ObjectMapParams> ObjectMap;
+
Clipboard();
~Clipboard();
- // Clears the clipboard. It is usually a good idea to clear the clipboard
- // before writing content to the clipboard.
- void Clear();
+ // Write a bunch of objects to the system clipboard. Copies are made of the
+ // contents of |objects|. On Windows they are copied to the system clipboard.
+ // On linux they are copied into a structure owned by the Clipboard object and
+ // kept until the system clipboard is set again.
+ void WriteObjects(const ObjectMap& objects);
- // Adds UNICODE and ASCII text to the clipboard.
- void WriteText(const std::wstring& text);
+ // Behaves as above. If there is some shared memory handle passed as one of
+ // the objects, it came from the process designated by |process|. This will
+ // assist in turning it into a shared memory region that the current process
+ // can use.
+ void WriteObjects(const ObjectMap& objects, ProcessHandle process);
- // Adds HTML to the clipboard. The url parameter is optional, but especially
- // useful if the HTML fragment contains relative links
- void WriteHTML(const std::wstring& markup, const std::string& src_url);
-
- // Adds a bookmark to the clipboard
- void WriteBookmark(const std::wstring& title, const std::string& url);
-
- // Adds both a bookmark and an HTML hyperlink to the clipboard. It is a
- // convenience wrapper around WriteBookmark and WriteHTML.
- void WriteHyperlink(const std::wstring& title, const std::string& url);
-
-#if defined(OS_WIN)
- // Adds a bitmap to the clipboard
- // This is the slowest way to copy a bitmap to the clipboard as we must first
- // memcpy the pixels into GDI and the blit the bitmap to the clipboard.
- // Pixel format is assumed to be 32-bit BI_RGB.
- void WriteBitmap(const void* pixels, const gfx::Size& size);
-
- // Adds a bitmap to the clipboard
- // This function requires read and write access to the bitmap, but does not
- // actually modify the shared memory region.
- // Pixel format is assumed to be 32-bit BI_RGB.
- void WriteBitmapFromSharedMemory(const SharedMemory& bitmap,
- const gfx::Size& size);
-
- // Adds a bitmap to the clipboard
- // This is the fastest way to copy a bitmap to the clipboard. The HBITMAP
- // may either be device-dependent or device-independent.
- void WriteBitmapFromHandle(HBITMAP hbitmap, const gfx::Size& size);
-
- // Used by WebKit to determine whether WebKit wrote the clipboard last
- void WriteWebSmartPaste();
-#endif
-
- // Adds a file or group of files to the clipboard.
- void WriteFile(const std::wstring& file);
- void WriteFiles(const std::vector<std::wstring>& files);
-
// Tests whether the clipboard contains a certain format
bool IsFormatAvailable(FormatType format) const;
@@ -125,8 +133,42 @@
#endif
private:
+ void WriteText(const char* text_data, size_t text_len);
+
+ void WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len);
+
+ void WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len);
+
+ void WriteHyperlink(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len);
+
+ void WriteWebSmartPaste();
+
+ void WriteFiles(const char* file_data, size_t file_len);
+
+ void DispatchObject(ObjectType type, const ObjectMapParams& params);
#if defined(OS_WIN)
- static void MarkupToHTMLClipboardFormat(const std::wstring& markup,
+ void WriteBitmap(const char* pixel_data, const char* size_data);
+
+ void WriteBitmapFromSharedMemory(const char* bitmap_data,
+ const char* size_data,
+ ProcessHandle handle);
+
+ void WriteBitmapFromHandle(HBITMAP source_hbitmap,
+ const gfx::Size& size);
+
+ // Safely write to system clipboard. Free |handle| on failure.
+ void WriteToClipboard(FormatType format, HANDLE handle);
+
+ static void MarkupToHTMLClipboardFormat(const std::string& markup,
const std::string& src_url,
std::string* html_fragment);
@@ -138,25 +180,26 @@
std::wstring* title,
std::string* url);
+ // Free a handle depending on its type (as intuited from format)
+ static void FreeData(FormatType format, HANDLE data);
+
HWND clipboard_owner_;
#elif defined(OS_LINUX)
+ // Data is stored in the |clipboard_data_| map until it is saved to the system
+ // clipboard. The Store* functions save data to the |clipboard_data_| map. The
+ // SetGtkClipboard function replaces whatever is on the system clipboard with
+ // the contents of |clipboard_data_|.
+ // The Write* functions make a deep copy of the data passed to them an store
+ // it in |clipboard_data_|.
+
// Write changes to gtk clipboard.
void SetGtkClipboard();
// Free pointers in clipboard_data_ and clear() the map.
void FreeTargetMap();
- // Insert a mapping into clipboard_data_, or change an existing mapping.
- uint8* InsertOrOverwrite(std::string target, uint8* data, size_t data_len);
+ // Insert a mapping into clipboard_data_.
+ void InsertMapping(const char* key, char* data, size_t data_len);
- // We have to be able to store multiple formats on the clipboard
- // simultaneously. The Chrome Clipboard class accomplishes this by
- // expecting that consecutive calls to Write* (WriteHTML, WriteText, etc.)
- // The GTK clipboard interface does not naturally support consecutive calls
- // building on one another. So we keep all data in a map, and always pass the
- // map when we are setting the gtk clipboard. Consecutive calls to Write*
- // will write to the map and set the GTK clipboard, then add to the same
- // map and set the GTK clipboard again. GTK thinks it is wiping out the
- // clipboard but we are actually keeping the previous data.
- TargetMap clipboard_data_;
+ TargetMap* clipboard_data_;
GtkClipboard* clipboard_;
#endif
« no previous file with comments | « base/build/base.vcproj ('k') | base/clipboard.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698