15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file declares the ScopedClipboardWriter class, a wrapper around
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Clipboard class which simplifies writing data to the system clipboard.
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Upon deletion the class atomically writes all data to the clipboard,
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// avoiding any potential race condition with other processes that are also
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// writing to the system clipboard.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_CLIPBOARD_SCOPED_CLIPBOARD_WRITER_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_CLIPBOARD_SCOPED_CLIPBOARD_WRITER_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pickle;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is a wrapper for |Clipboard| that handles packing data
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into a Clipboard::ObjectMap.
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT ScopedClipboardWriter {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Create an instance that is a simple wrapper around the clipboard of the
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // given type.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  explicit ScopedClipboardWriter(ClipboardType type);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedClipboardWriter();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts |text| to UTF-8 and adds it to the clipboard.
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void WriteText(const base::string16& text);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts the text of the URL to UTF-8 and adds it to the clipboard, then
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifies the Clipboard that we just wrote a URL.
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void WriteURL(const base::string16& text);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds HTML to the clipboard.  The url parameter is optional, but especially
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // useful if the HTML fragment contains relative links.
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void WriteHTML(const base::string16& markup, const std::string& source_url);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds RTF to the clipboard.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteRTF(const std::string& rtf_data);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a bookmark to the clipboard.
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void WriteBookmark(const base::string16& bookmark_title,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& url);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Adds an html hyperlink (<a href>) to the clipboard. |anchor_text| and
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // |url| will be escaped as needed.
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void WriteHyperlink(const base::string16& anchor_text,
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      const std::string& url);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used by WebKit to determine whether WebKit wrote the clipboard last
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteWebSmartPaste();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds arbitrary pickled data to clipboard.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WritePickledData(const Pickle& pickle,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const Clipboard::FormatType& format);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes all objects that would be written to the clipboard.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Reset();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts |text| to UTF-8 and adds it to the clipboard.  If it's a URL, we
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // also notify the clipboard of that fact.
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void WriteTextOrURL(const base::string16& text, bool is_url);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We accumulate the data passed to the various targets in the |objects_|
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vector, and pass it to Clipboard::WriteObjects() during object destruction.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Clipboard::ObjectMap objects_;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const ClipboardType type_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We keep around the UTF-8 text of the URL in order to pass it to
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clipboard::DidWriteURL().
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_text_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedClipboardWriter);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_CLIPBOARD_SCOPED_CLIPBOARD_WRITER_H_
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89