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

Side by Side Diff: ui/base/clipboard/clipboard_aurax11.cc

Issue 658963003: Change Clipboard to use virtual methods for testing purposes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: One more typo... Created 6 years, 2 months 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/base/clipboard/clipboard.h" 5 #include "ui/base/clipboard/clipboard_aurax11.h"
6 6
7 #include <X11/extensions/Xfixes.h> 7 #include <X11/extensions/Xfixes.h>
8 #include <X11/Xatom.h> 8 #include <X11/Xatom.h>
9 #include <list> 9 #include <list>
10 #include <set> 10 #include <set>
11 11
12 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/files/file_path.h" 13 #include "base/files/file_path.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/memory/ref_counted_memory.h" 15 #include "base/memory/ref_counted_memory.h"
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 215
216 bool Clipboard::FormatType::operator<(const FormatType& other) const { 216 bool Clipboard::FormatType::operator<(const FormatType& other) const {
217 return data_ < other.data_; 217 return data_ < other.data_;
218 } 218 }
219 219
220 bool Clipboard::FormatType::Equals(const FormatType& other) const { 220 bool Clipboard::FormatType::Equals(const FormatType& other) const {
221 return data_ == other.data_; 221 return data_ == other.data_;
222 } 222 }
223 223
224 /////////////////////////////////////////////////////////////////////////////// 224 ///////////////////////////////////////////////////////////////////////////////
225 // Clipboard::AuraX11Details 225 // ClipboardAuraX11::AuraX11Details
226 226
227 // Private implementation of our X11 integration. Keeps X11 headers out of the 227 // Private implementation of our X11 integration. Keeps X11 headers out of the
228 // majority of chrome, which break badly. 228 // majority of chrome, which break badly.
229 class Clipboard::AuraX11Details : public PlatformEventDispatcher { 229 class ClipboardAuraX11::AuraX11Details : public PlatformEventDispatcher {
230 public: 230 public:
231 AuraX11Details(); 231 AuraX11Details();
232 virtual ~AuraX11Details(); 232 virtual ~AuraX11Details();
233 233
234 X11AtomCache* atom_cache() { return &atom_cache_; } 234 X11AtomCache* atom_cache() { return &atom_cache_; }
235 235
236 // Returns the X11 type that we pass to various XSelection functions for the 236 // Returns the X11 type that we pass to various XSelection functions for the
237 // given type. 237 // given type.
238 ::Atom LookupSelectionForClipboardType(ClipboardType type) const; 238 ::Atom LookupSelectionForClipboardType(ClipboardType type) const;
239 239
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 // Temporary target map that we write to during DispatchObects. 308 // Temporary target map that we write to during DispatchObects.
309 SelectionFormatMap clipboard_data_; 309 SelectionFormatMap clipboard_data_;
310 310
311 // Objects which offer selection data to other windows. 311 // Objects which offer selection data to other windows.
312 SelectionOwner clipboard_owner_; 312 SelectionOwner clipboard_owner_;
313 SelectionOwner primary_owner_; 313 SelectionOwner primary_owner_;
314 314
315 DISALLOW_COPY_AND_ASSIGN(AuraX11Details); 315 DISALLOW_COPY_AND_ASSIGN(AuraX11Details);
316 }; 316 };
317 317
318 Clipboard::AuraX11Details::AuraX11Details() 318 ClipboardAuraX11::AuraX11Details::AuraX11Details()
319 : x_display_(gfx::GetXDisplay()), 319 : x_display_(gfx::GetXDisplay()),
320 x_root_window_(DefaultRootWindow(x_display_)), 320 x_root_window_(DefaultRootWindow(x_display_)),
321 x_window_(XCreateWindow( 321 x_window_(XCreateWindow(x_display_,
322 x_display_, x_root_window_, 322 x_root_window_,
323 -100, -100, 10, 10, // x, y, width, height 323 -100,
324 0, // border width 324 -100,
325 CopyFromParent, // depth 325 10,
326 InputOnly, 326 10, // x, y, width, height
327 CopyFromParent, // visual 327 0, // border width
328 0, 328 CopyFromParent, // depth
329 NULL)), 329 InputOnly,
330 CopyFromParent, // visual
331 0,
332 NULL)),
330 atom_cache_(x_display_, kAtomsToCache), 333 atom_cache_(x_display_, kAtomsToCache),
331 selection_requestor_(x_display_, x_window_, this), 334 selection_requestor_(x_display_, x_window_, this),
332 clipboard_owner_(x_display_, x_window_, atom_cache_.GetAtom(kClipboard)), 335 clipboard_owner_(x_display_, x_window_, atom_cache_.GetAtom(kClipboard)),
333 primary_owner_(x_display_, x_window_, XA_PRIMARY) { 336 primary_owner_(x_display_, x_window_, XA_PRIMARY) {
334 // We don't know all possible MIME types at compile time. 337 // We don't know all possible MIME types at compile time.
335 atom_cache_.allow_uncached_atoms(); 338 atom_cache_.allow_uncached_atoms();
336 339
337 XStoreName(x_display_, x_window_, "Chromium clipboard"); 340 XStoreName(x_display_, x_window_, "Chromium clipboard");
338 XSelectInput(x_display_, x_window_, PropertyChangeMask); 341 XSelectInput(x_display_, x_window_, PropertyChangeMask);
339 342
340 if (PlatformEventSource::GetInstance()) 343 if (PlatformEventSource::GetInstance())
341 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); 344 PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
342 } 345 }
343 346
344 Clipboard::AuraX11Details::~AuraX11Details() { 347 ClipboardAuraX11::AuraX11Details::~AuraX11Details() {
345 if (PlatformEventSource::GetInstance()) 348 if (PlatformEventSource::GetInstance())
346 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); 349 PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
347 350
348 XDestroyWindow(x_display_, x_window_); 351 XDestroyWindow(x_display_, x_window_);
349 } 352 }
350 353
351 ::Atom Clipboard::AuraX11Details::LookupSelectionForClipboardType( 354 ::Atom ClipboardAuraX11::AuraX11Details::LookupSelectionForClipboardType(
352 ClipboardType type) const { 355 ClipboardType type) const {
353 if (type == CLIPBOARD_TYPE_COPY_PASTE) 356 if (type == CLIPBOARD_TYPE_COPY_PASTE)
354 return GetCopyPasteSelection(); 357 return GetCopyPasteSelection();
355 358
356 return XA_PRIMARY; 359 return XA_PRIMARY;
357 } 360 }
358 361
359 ::Atom Clipboard::AuraX11Details::GetCopyPasteSelection() const { 362 ::Atom ClipboardAuraX11::AuraX11Details::GetCopyPasteSelection() const {
360 return atom_cache_.GetAtom(kClipboard); 363 return atom_cache_.GetAtom(kClipboard);
361 } 364 }
362 365
363 const SelectionFormatMap& Clipboard::AuraX11Details::LookupStorageForAtom( 366 const SelectionFormatMap&
364 ::Atom atom) { 367 ClipboardAuraX11::AuraX11Details::LookupStorageForAtom(::Atom atom) {
365 if (atom == XA_PRIMARY) 368 if (atom == XA_PRIMARY)
366 return primary_owner_.selection_format_map(); 369 return primary_owner_.selection_format_map();
367 370
368 DCHECK_EQ(GetCopyPasteSelection(), atom); 371 DCHECK_EQ(GetCopyPasteSelection(), atom);
369 return clipboard_owner_.selection_format_map(); 372 return clipboard_owner_.selection_format_map();
370 } 373 }
371 374
372 void Clipboard::AuraX11Details::CreateNewClipboardData() { 375 void ClipboardAuraX11::AuraX11Details::CreateNewClipboardData() {
373 clipboard_data_ = SelectionFormatMap(); 376 clipboard_data_ = SelectionFormatMap();
374 } 377 }
375 378
376 void Clipboard::AuraX11Details::InsertMapping( 379 void ClipboardAuraX11::AuraX11Details::InsertMapping(
377 const std::string& key, 380 const std::string& key,
378 const scoped_refptr<base::RefCountedMemory>& memory) { 381 const scoped_refptr<base::RefCountedMemory>& memory) {
379 ::Atom atom_key = atom_cache_.GetAtom(key.c_str()); 382 ::Atom atom_key = atom_cache_.GetAtom(key.c_str());
380 clipboard_data_.Insert(atom_key, memory); 383 clipboard_data_.Insert(atom_key, memory);
381 } 384 }
382 385
383 void Clipboard::AuraX11Details::TakeOwnershipOfSelection(ClipboardType type) { 386 void ClipboardAuraX11::AuraX11Details::TakeOwnershipOfSelection(
387 ClipboardType type) {
384 if (type == CLIPBOARD_TYPE_COPY_PASTE) 388 if (type == CLIPBOARD_TYPE_COPY_PASTE)
385 return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_); 389 return clipboard_owner_.TakeOwnershipOfSelection(clipboard_data_);
386 else 390 else
387 return primary_owner_.TakeOwnershipOfSelection(clipboard_data_); 391 return primary_owner_.TakeOwnershipOfSelection(clipboard_data_);
388 } 392 }
389 393
390 SelectionData Clipboard::AuraX11Details::RequestAndWaitForTypes( 394 SelectionData ClipboardAuraX11::AuraX11Details::RequestAndWaitForTypes(
391 ClipboardType type, 395 ClipboardType type,
392 const std::vector< ::Atom>& types) { 396 const std::vector<::Atom>& types) {
393 ::Atom selection_name = LookupSelectionForClipboardType(type); 397 ::Atom selection_name = LookupSelectionForClipboardType(type);
394 if (XGetSelectionOwner(x_display_, selection_name) == x_window_) { 398 if (XGetSelectionOwner(x_display_, selection_name) == x_window_) {
395 // We can local fastpath instead of playing the nested message loop game 399 // We can local fastpath instead of playing the nested message loop game
396 // with the X server. 400 // with the X server.
397 const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name); 401 const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name);
398 402
399 for (std::vector< ::Atom>::const_iterator it = types.begin(); 403 for (std::vector< ::Atom>::const_iterator it = types.begin();
400 it != types.end(); ++it) { 404 it != types.end(); ++it) {
401 SelectionFormatMap::const_iterator format_map_it = format_map.find(*it); 405 SelectionFormatMap::const_iterator format_map_it = format_map.find(*it);
402 if (format_map_it != format_map.end()) 406 if (format_map_it != format_map.end())
403 return SelectionData(format_map_it->first, format_map_it->second); 407 return SelectionData(format_map_it->first, format_map_it->second);
404 } 408 }
405 } else { 409 } else {
406 TargetList targets = WaitAndGetTargetsList(type); 410 TargetList targets = WaitAndGetTargetsList(type);
407 411
408 ::Atom selection_name = LookupSelectionForClipboardType(type); 412 ::Atom selection_name = LookupSelectionForClipboardType(type);
409 std::vector< ::Atom> intersection; 413 std::vector< ::Atom> intersection;
410 ui::GetAtomIntersection(types, targets.target_list(), &intersection); 414 ui::GetAtomIntersection(types, targets.target_list(), &intersection);
411 return selection_requestor_.RequestAndWaitForTypes(selection_name, 415 return selection_requestor_.RequestAndWaitForTypes(selection_name,
412 intersection); 416 intersection);
413 } 417 }
414 418
415 return SelectionData(); 419 return SelectionData();
416 } 420 }
417 421
418 TargetList Clipboard::AuraX11Details::WaitAndGetTargetsList( 422 TargetList ClipboardAuraX11::AuraX11Details::WaitAndGetTargetsList(
419 ClipboardType type) { 423 ClipboardType type) {
420 ::Atom selection_name = LookupSelectionForClipboardType(type); 424 ::Atom selection_name = LookupSelectionForClipboardType(type);
421 std::vector< ::Atom> out; 425 std::vector< ::Atom> out;
422 if (XGetSelectionOwner(x_display_, selection_name) == x_window_) { 426 if (XGetSelectionOwner(x_display_, selection_name) == x_window_) {
423 // We can local fastpath and return the list of local targets. 427 // We can local fastpath and return the list of local targets.
424 const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name); 428 const SelectionFormatMap& format_map = LookupStorageForAtom(selection_name);
425 429
426 for (SelectionFormatMap::const_iterator it = format_map.begin(); 430 for (SelectionFormatMap::const_iterator it = format_map.begin();
427 it != format_map.end(); ++it) { 431 it != format_map.end(); ++it) {
428 out.push_back(it->first); 432 out.push_back(it->first);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 type == *it) { 468 type == *it) {
465 out.push_back(*it); 469 out.push_back(*it);
466 } 470 }
467 } 471 }
468 } 472 }
469 } 473 }
470 474
471 return TargetList(out, &atom_cache_); 475 return TargetList(out, &atom_cache_);
472 } 476 }
473 477
474 std::vector< ::Atom> Clipboard::AuraX11Details::GetTextAtoms() const { 478 std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetTextAtoms() const {
475 return GetTextAtomsFrom(&atom_cache_); 479 return GetTextAtomsFrom(&atom_cache_);
476 } 480 }
477 481
478 std::vector< ::Atom> Clipboard::AuraX11Details::GetAtomsForFormat( 482 std::vector<::Atom> ClipboardAuraX11::AuraX11Details::GetAtomsForFormat(
479 const Clipboard::FormatType& format) { 483 const Clipboard::FormatType& format) {
480 std::vector< ::Atom> atoms; 484 std::vector< ::Atom> atoms;
481 atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str())); 485 atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str()));
482 return atoms; 486 return atoms;
483 } 487 }
484 488
485 void Clipboard::AuraX11Details::Clear(ClipboardType type) { 489 void ClipboardAuraX11::AuraX11Details::Clear(ClipboardType type) {
486 if (type == CLIPBOARD_TYPE_COPY_PASTE) 490 if (type == CLIPBOARD_TYPE_COPY_PASTE)
487 clipboard_owner_.ClearSelectionOwner(); 491 clipboard_owner_.ClearSelectionOwner();
488 else 492 else
489 primary_owner_.ClearSelectionOwner(); 493 primary_owner_.ClearSelectionOwner();
490 } 494 }
491 495
492 void Clipboard::AuraX11Details::StoreCopyPasteDataAndWait() { 496 void ClipboardAuraX11::AuraX11Details::StoreCopyPasteDataAndWait() {
493 ::Atom selection = GetCopyPasteSelection(); 497 ::Atom selection = GetCopyPasteSelection();
494 if (XGetSelectionOwner(x_display_, selection) != x_window_) 498 if (XGetSelectionOwner(x_display_, selection) != x_window_)
495 return; 499 return;
496 500
497 ::Atom clipboard_manager_atom = atom_cache_.GetAtom(kClipboardManager); 501 ::Atom clipboard_manager_atom = atom_cache_.GetAtom(kClipboardManager);
498 if (XGetSelectionOwner(x_display_, clipboard_manager_atom) == None) 502 if (XGetSelectionOwner(x_display_, clipboard_manager_atom) == None)
499 return; 503 return;
500 504
501 const SelectionFormatMap& format_map = LookupStorageForAtom(selection); 505 const SelectionFormatMap& format_map = LookupStorageForAtom(selection);
502 if (format_map.size() == 0) 506 if (format_map.size() == 0)
503 return; 507 return;
504 std::vector<Atom> targets = format_map.GetTypes(); 508 std::vector<Atom> targets = format_map.GetTypes();
505 509
506 base::TimeTicks start = base::TimeTicks::Now(); 510 base::TimeTicks start = base::TimeTicks::Now();
507 selection_requestor_.PerformBlockingConvertSelectionWithParameter( 511 selection_requestor_.PerformBlockingConvertSelectionWithParameter(
508 atom_cache_.GetAtom(kClipboardManager), 512 atom_cache_.GetAtom(kClipboardManager),
509 atom_cache_.GetAtom(kSaveTargets), 513 atom_cache_.GetAtom(kSaveTargets),
510 targets); 514 targets);
511 UMA_HISTOGRAM_TIMES("Clipboard.X11StoreCopyPasteDuration", 515 UMA_HISTOGRAM_TIMES("Clipboard.X11StoreCopyPasteDuration",
512 base::TimeTicks::Now() - start); 516 base::TimeTicks::Now() - start);
513 } 517 }
514 518
515 bool Clipboard::AuraX11Details::CanDispatchEvent(const PlatformEvent& event) { 519 bool ClipboardAuraX11::AuraX11Details::CanDispatchEvent(
520 const PlatformEvent& event) {
516 if (event->xany.window == x_window_) 521 if (event->xany.window == x_window_)
517 return true; 522 return true;
518 523
519 if (event->type == PropertyNotify) { 524 if (event->type == PropertyNotify) {
520 return primary_owner_.CanDispatchPropertyEvent(*event) || 525 return primary_owner_.CanDispatchPropertyEvent(*event) ||
521 clipboard_owner_.CanDispatchPropertyEvent(*event) || 526 clipboard_owner_.CanDispatchPropertyEvent(*event) ||
522 selection_requestor_.CanDispatchPropertyEvent(*event); 527 selection_requestor_.CanDispatchPropertyEvent(*event);
523 } 528 }
524 return false; 529 return false;
525 } 530 }
526 531
527 uint32_t Clipboard::AuraX11Details::DispatchEvent(const PlatformEvent& xev) { 532 uint32_t ClipboardAuraX11::AuraX11Details::DispatchEvent(
533 const PlatformEvent& xev) {
528 switch (xev->type) { 534 switch (xev->type) {
529 case SelectionRequest: { 535 case SelectionRequest: {
530 if (xev->xselectionrequest.selection == XA_PRIMARY) { 536 if (xev->xselectionrequest.selection == XA_PRIMARY) {
531 primary_owner_.OnSelectionRequest(*xev); 537 primary_owner_.OnSelectionRequest(*xev);
532 } else { 538 } else {
533 // We should not get requests for the CLIPBOARD_MANAGER selection 539 // We should not get requests for the CLIPBOARD_MANAGER selection
534 // because we never take ownership of it. 540 // because we never take ownership of it.
535 DCHECK_EQ(GetCopyPasteSelection(), xev->xselectionrequest.selection); 541 DCHECK_EQ(GetCopyPasteSelection(), xev->xselectionrequest.selection);
536 clipboard_owner_.OnSelectionRequest(*xev); 542 clipboard_owner_.OnSelectionRequest(*xev);
537 } 543 }
(...skipping 25 matching lines...) Expand all
563 } 569 }
564 default: 570 default:
565 break; 571 break;
566 } 572 }
567 573
568 return POST_DISPATCH_NONE; 574 return POST_DISPATCH_NONE;
569 } 575 }
570 576
571 /////////////////////////////////////////////////////////////////////////////// 577 ///////////////////////////////////////////////////////////////////////////////
572 // Clipboard 578 // Clipboard
579 // static
580 Clipboard::FormatType Clipboard::GetFormatType(
581 const std::string& format_string) {
582 return FormatType::Deserialize(format_string);
583 }
573 584
574 Clipboard::Clipboard() 585 // static
575 : aurax11_details_(new AuraX11Details) { 586 const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
587 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList));
588 return type;
589 }
590
591 // static
592 const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
593 return GetUrlFormatType();
594 }
595
596 // static
597 const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
598 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText));
599 return type;
600 }
601
602 // static
603 const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
604 return GetPlainTextFormatType();
605 }
606
607 // static
608 const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
609 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeFilename));
610 return type;
611 }
612
613 // static
614 const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
615 return Clipboard::GetFilenameFormatType();
616 }
617
618 // static
619 const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
620 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML));
621 return type;
622 }
623
624 // static
625 const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
626 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
627 return type;
628 }
629
630 // static
631 const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
632 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePNG));
633 return type;
634 }
635
636 // static
637 const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
638 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste));
639 return type;
640 }
641
642 // static
643 const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
644 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData));
645 return type;
646 }
647
648 // static
649 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
650 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData));
651 return type;
652 }
653
654 // static
655 Clipboard* Clipboard::Create() {
656 return new ClipboardAuraX11;
657 }
658
659 ///////////////////////////////////////////////////////////////////////////////
660 // ClipboardAuraX11
661
662 ClipboardAuraX11::ClipboardAuraX11() : aurax11_details_(new AuraX11Details) {
576 DCHECK(CalledOnValidThread()); 663 DCHECK(CalledOnValidThread());
577 } 664 }
578 665
579 Clipboard::~Clipboard() { 666 ClipboardAuraX11::~ClipboardAuraX11() {
580 DCHECK(CalledOnValidThread()); 667 DCHECK(CalledOnValidThread());
581 668
582 aurax11_details_->StoreCopyPasteDataAndWait(); 669 aurax11_details_->StoreCopyPasteDataAndWait();
583 } 670 }
584 671
585 void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) { 672 uint64 ClipboardAuraX11::GetSequenceNumber(ClipboardType type) {
673 DCHECK(CalledOnValidThread());
674 if (type == CLIPBOARD_TYPE_COPY_PASTE)
675 return SelectionChangeObserver::GetInstance()->clipboard_sequence_number();
676 else
677 return SelectionChangeObserver::GetInstance()->primary_sequence_number();
678 }
679
680 bool ClipboardAuraX11::IsFormatAvailable(const FormatType& format,
681 ClipboardType type) const {
586 DCHECK(CalledOnValidThread()); 682 DCHECK(CalledOnValidThread());
587 DCHECK(IsSupportedClipboardType(type)); 683 DCHECK(IsSupportedClipboardType(type));
588 684
589 aurax11_details_->CreateNewClipboardData();
590 for (ObjectMap::const_iterator iter = objects.begin();
591 iter != objects.end(); ++iter) {
592 DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
593 }
594 aurax11_details_->TakeOwnershipOfSelection(type);
595
596 if (type == CLIPBOARD_TYPE_COPY_PASTE) {
597 ObjectMap::const_iterator text_iter = objects.find(CBF_TEXT);
598 if (text_iter != objects.end()) {
599 aurax11_details_->CreateNewClipboardData();
600 const ObjectMapParams& params_vector = text_iter->second;
601 if (params_vector.size()) {
602 const ObjectMapParam& char_vector = params_vector[0];
603 if (char_vector.size())
604 WriteText(&char_vector.front(), char_vector.size());
605 }
606 aurax11_details_->TakeOwnershipOfSelection(CLIPBOARD_TYPE_SELECTION);
607 }
608 }
609 }
610
611 bool Clipboard::IsFormatAvailable(const FormatType& format,
612 ClipboardType type) const {
613 DCHECK(CalledOnValidThread());
614 DCHECK(IsSupportedClipboardType(type));
615
616 TargetList target_list = aurax11_details_->WaitAndGetTargetsList(type); 685 TargetList target_list = aurax11_details_->WaitAndGetTargetsList(type);
617 if (format.Equals(GetPlainTextFormatType()) || 686 if (format.Equals(GetPlainTextFormatType()) ||
618 format.Equals(GetUrlFormatType())) { 687 format.Equals(GetUrlFormatType())) {
619 return target_list.ContainsText(); 688 return target_list.ContainsText();
620 } 689 }
621 return target_list.ContainsFormat(format); 690 return target_list.ContainsFormat(format);
622 } 691 }
623 692
624 void Clipboard::Clear(ClipboardType type) { 693 void ClipboardAuraX11::Clear(ClipboardType type) {
625 DCHECK(CalledOnValidThread()); 694 DCHECK(CalledOnValidThread());
626 DCHECK(IsSupportedClipboardType(type)); 695 DCHECK(IsSupportedClipboardType(type));
627 aurax11_details_->Clear(type); 696 aurax11_details_->Clear(type);
628 } 697 }
629 698
630 void Clipboard::ReadAvailableTypes(ClipboardType type, 699 void ClipboardAuraX11::ReadAvailableTypes(ClipboardType type,
631 std::vector<base::string16>* types, 700 std::vector<base::string16>* types,
632 bool* contains_filenames) const { 701 bool* contains_filenames) const {
633 DCHECK(CalledOnValidThread()); 702 DCHECK(CalledOnValidThread());
634 if (!types || !contains_filenames) { 703 if (!types || !contains_filenames) {
635 NOTREACHED(); 704 NOTREACHED();
636 return; 705 return;
637 } 706 }
638 707
639 TargetList target_list = aurax11_details_->WaitAndGetTargetsList(type); 708 TargetList target_list = aurax11_details_->WaitAndGetTargetsList(type);
640 709
641 types->clear(); 710 types->clear();
642 711
643 if (target_list.ContainsText()) 712 if (target_list.ContainsText())
644 types->push_back(base::UTF8ToUTF16(kMimeTypeText)); 713 types->push_back(base::UTF8ToUTF16(kMimeTypeText));
645 if (target_list.ContainsFormat(GetHtmlFormatType())) 714 if (target_list.ContainsFormat(GetHtmlFormatType()))
646 types->push_back(base::UTF8ToUTF16(kMimeTypeHTML)); 715 types->push_back(base::UTF8ToUTF16(kMimeTypeHTML));
647 if (target_list.ContainsFormat(GetRtfFormatType())) 716 if (target_list.ContainsFormat(GetRtfFormatType()))
648 types->push_back(base::UTF8ToUTF16(kMimeTypeRTF)); 717 types->push_back(base::UTF8ToUTF16(kMimeTypeRTF));
649 if (target_list.ContainsFormat(GetBitmapFormatType())) 718 if (target_list.ContainsFormat(GetBitmapFormatType()))
650 types->push_back(base::UTF8ToUTF16(kMimeTypePNG)); 719 types->push_back(base::UTF8ToUTF16(kMimeTypePNG));
651 *contains_filenames = false; 720 *contains_filenames = false;
652 721
653 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 722 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
654 type, aurax11_details_->GetAtomsForFormat(GetWebCustomDataFormatType()))); 723 type, aurax11_details_->GetAtomsForFormat(GetWebCustomDataFormatType())));
655 if (data.IsValid()) 724 if (data.IsValid())
656 ReadCustomDataTypes(data.GetData(), data.GetSize(), types); 725 ReadCustomDataTypes(data.GetData(), data.GetSize(), types);
657 } 726 }
658 727
659 void Clipboard::ReadText(ClipboardType type, base::string16* result) const { 728 void ClipboardAuraX11::ReadText(ClipboardType type,
729 base::string16* result) const {
660 DCHECK(CalledOnValidThread()); 730 DCHECK(CalledOnValidThread());
661 731
662 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 732 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
663 type, aurax11_details_->GetTextAtoms())); 733 type, aurax11_details_->GetTextAtoms()));
664 if (data.IsValid()) { 734 if (data.IsValid()) {
665 std::string text = data.GetText(); 735 std::string text = data.GetText();
666 *result = base::UTF8ToUTF16(text); 736 *result = base::UTF8ToUTF16(text);
667 } 737 }
668 } 738 }
669 739
670 void Clipboard::ReadAsciiText(ClipboardType type, std::string* result) const { 740 void ClipboardAuraX11::ReadAsciiText(ClipboardType type,
741 std::string* result) const {
671 DCHECK(CalledOnValidThread()); 742 DCHECK(CalledOnValidThread());
672 743
673 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 744 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
674 type, aurax11_details_->GetTextAtoms())); 745 type, aurax11_details_->GetTextAtoms()));
675 if (data.IsValid()) 746 if (data.IsValid())
676 result->assign(data.GetText()); 747 result->assign(data.GetText());
677 } 748 }
678 749
679 // TODO(estade): handle different charsets. 750 // TODO(estade): handle different charsets.
680 // TODO(port): set *src_url. 751 // TODO(port): set *src_url.
681 void Clipboard::ReadHTML(ClipboardType type, 752 void ClipboardAuraX11::ReadHTML(ClipboardType type,
682 base::string16* markup, 753 base::string16* markup,
683 std::string* src_url, 754 std::string* src_url,
684 uint32* fragment_start, 755 uint32* fragment_start,
685 uint32* fragment_end) const { 756 uint32* fragment_end) const {
686 DCHECK(CalledOnValidThread()); 757 DCHECK(CalledOnValidThread());
687 markup->clear(); 758 markup->clear();
688 if (src_url) 759 if (src_url)
689 src_url->clear(); 760 src_url->clear();
690 *fragment_start = 0; 761 *fragment_start = 0;
691 *fragment_end = 0; 762 *fragment_end = 0;
692 763
693 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 764 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
694 type, aurax11_details_->GetAtomsForFormat(GetHtmlFormatType()))); 765 type, aurax11_details_->GetAtomsForFormat(GetHtmlFormatType())));
695 if (data.IsValid()) { 766 if (data.IsValid()) {
696 *markup = data.GetHtml(); 767 *markup = data.GetHtml();
697 768
698 *fragment_start = 0; 769 *fragment_start = 0;
699 DCHECK(markup->length() <= kuint32max); 770 DCHECK(markup->length() <= kuint32max);
700 *fragment_end = static_cast<uint32>(markup->length()); 771 *fragment_end = static_cast<uint32>(markup->length());
701 } 772 }
702 } 773 }
703 774
704 void Clipboard::ReadRTF(ClipboardType type, std::string* result) const { 775 void ClipboardAuraX11::ReadRTF(ClipboardType type, std::string* result) const {
705 DCHECK(CalledOnValidThread()); 776 DCHECK(CalledOnValidThread());
706 777
707 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 778 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
708 type, aurax11_details_->GetAtomsForFormat(GetRtfFormatType()))); 779 type, aurax11_details_->GetAtomsForFormat(GetRtfFormatType())));
709 if (data.IsValid()) 780 if (data.IsValid())
710 data.AssignTo(result); 781 data.AssignTo(result);
711 } 782 }
712 783
713 SkBitmap Clipboard::ReadImage(ClipboardType type) const { 784 SkBitmap ClipboardAuraX11::ReadImage(ClipboardType type) const {
714 DCHECK(CalledOnValidThread()); 785 DCHECK(CalledOnValidThread());
715 786
716 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 787 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
717 type, aurax11_details_->GetAtomsForFormat(GetBitmapFormatType()))); 788 type, aurax11_details_->GetAtomsForFormat(GetBitmapFormatType())));
718 if (data.IsValid()) { 789 if (data.IsValid()) {
719 SkBitmap bitmap; 790 SkBitmap bitmap;
720 if (gfx::PNGCodec::Decode(data.GetData(), data.GetSize(), &bitmap)) 791 if (gfx::PNGCodec::Decode(data.GetData(), data.GetSize(), &bitmap))
721 return SkBitmap(bitmap); 792 return SkBitmap(bitmap);
722 } 793 }
723 794
724 return SkBitmap(); 795 return SkBitmap();
725 } 796 }
726 797
727 void Clipboard::ReadCustomData(ClipboardType clipboard_type, 798 void ClipboardAuraX11::ReadCustomData(ClipboardType clipboard_type,
728 const base::string16& type, 799 const base::string16& type,
729 base::string16* result) const { 800 base::string16* result) const {
730 DCHECK(CalledOnValidThread()); 801 DCHECK(CalledOnValidThread());
731 802
732 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 803 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
733 clipboard_type, 804 clipboard_type,
734 aurax11_details_->GetAtomsForFormat(GetWebCustomDataFormatType()))); 805 aurax11_details_->GetAtomsForFormat(GetWebCustomDataFormatType())));
735 if (data.IsValid()) 806 if (data.IsValid())
736 ReadCustomDataForType(data.GetData(), data.GetSize(), type, result); 807 ReadCustomDataForType(data.GetData(), data.GetSize(), type, result);
737 } 808 }
738 809
739 void Clipboard::ReadBookmark(base::string16* title, std::string* url) const { 810 void ClipboardAuraX11::ReadBookmark(base::string16* title,
811 std::string* url) const {
740 DCHECK(CalledOnValidThread()); 812 DCHECK(CalledOnValidThread());
741 // TODO(erg): This was left NOTIMPLEMENTED() in the gtk port too. 813 // TODO(erg): This was left NOTIMPLEMENTED() in the gtk port too.
742 NOTIMPLEMENTED(); 814 NOTIMPLEMENTED();
743 } 815 }
744 816
745 void Clipboard::ReadData(const FormatType& format, std::string* result) const { 817 void ClipboardAuraX11::ReadData(const FormatType& format,
818 std::string* result) const {
746 DCHECK(CalledOnValidThread()); 819 DCHECK(CalledOnValidThread());
747 820
748 SelectionData data(aurax11_details_->RequestAndWaitForTypes( 821 SelectionData data(aurax11_details_->RequestAndWaitForTypes(
749 CLIPBOARD_TYPE_COPY_PASTE, aurax11_details_->GetAtomsForFormat(format))); 822 CLIPBOARD_TYPE_COPY_PASTE, aurax11_details_->GetAtomsForFormat(format)));
750 if (data.IsValid()) 823 if (data.IsValid())
751 data.AssignTo(result); 824 data.AssignTo(result);
752 } 825 }
753 826
754 uint64 Clipboard::GetSequenceNumber(ClipboardType type) { 827 void ClipboardAuraX11::WriteObjects(ClipboardType type,
828 const ObjectMap& objects) {
755 DCHECK(CalledOnValidThread()); 829 DCHECK(CalledOnValidThread());
756 if (type == CLIPBOARD_TYPE_COPY_PASTE) 830 DCHECK(IsSupportedClipboardType(type));
757 return SelectionChangeObserver::GetInstance()->clipboard_sequence_number(); 831
758 else 832 aurax11_details_->CreateNewClipboardData();
759 return SelectionChangeObserver::GetInstance()->primary_sequence_number(); 833 for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
834 ++iter) {
835 DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
836 }
837 aurax11_details_->TakeOwnershipOfSelection(type);
838
839 if (type == CLIPBOARD_TYPE_COPY_PASTE) {
840 ObjectMap::const_iterator text_iter = objects.find(CBF_TEXT);
841 if (text_iter != objects.end()) {
842 aurax11_details_->CreateNewClipboardData();
843 const ObjectMapParams& params_vector = text_iter->second;
844 if (params_vector.size()) {
845 const ObjectMapParam& char_vector = params_vector[0];
846 if (char_vector.size())
847 WriteText(&char_vector.front(), char_vector.size());
848 }
849 aurax11_details_->TakeOwnershipOfSelection(CLIPBOARD_TYPE_SELECTION);
850 }
851 }
760 } 852 }
761 853
762 void Clipboard::WriteText(const char* text_data, size_t text_len) { 854 void ClipboardAuraX11::WriteText(const char* text_data, size_t text_len) {
763 std::string str(text_data, text_len); 855 std::string str(text_data, text_len);
764 scoped_refptr<base::RefCountedMemory> mem( 856 scoped_refptr<base::RefCountedMemory> mem(
765 base::RefCountedString::TakeString(&str)); 857 base::RefCountedString::TakeString(&str));
766 858
767 aurax11_details_->InsertMapping(kMimeTypeText, mem); 859 aurax11_details_->InsertMapping(kMimeTypeText, mem);
768 aurax11_details_->InsertMapping(kText, mem); 860 aurax11_details_->InsertMapping(kText, mem);
769 aurax11_details_->InsertMapping(kString, mem); 861 aurax11_details_->InsertMapping(kString, mem);
770 aurax11_details_->InsertMapping(kUtf8String, mem); 862 aurax11_details_->InsertMapping(kUtf8String, mem);
771 } 863 }
772 864
773 void Clipboard::WriteHTML(const char* markup_data, 865 void ClipboardAuraX11::WriteHTML(const char* markup_data,
774 size_t markup_len, 866 size_t markup_len,
775 const char* url_data, 867 const char* url_data,
776 size_t url_len) { 868 size_t url_len) {
777 // TODO(estade): We need to expand relative links with |url_data|. 869 // TODO(estade): We need to expand relative links with |url_data|.
778 static const char* html_prefix = "<meta http-equiv=\"content-type\" " 870 static const char* html_prefix = "<meta http-equiv=\"content-type\" "
779 "content=\"text/html; charset=utf-8\">"; 871 "content=\"text/html; charset=utf-8\">";
780 std::string data = html_prefix; 872 std::string data = html_prefix;
781 data += std::string(markup_data, markup_len); 873 data += std::string(markup_data, markup_len);
782 // Some programs expect NULL-terminated data. See http://crbug.com/42624 874 // Some programs expect NULL-terminated data. See http://crbug.com/42624
783 data += '\0'; 875 data += '\0';
784 876
785 scoped_refptr<base::RefCountedMemory> mem( 877 scoped_refptr<base::RefCountedMemory> mem(
786 base::RefCountedString::TakeString(&data)); 878 base::RefCountedString::TakeString(&data));
787 aurax11_details_->InsertMapping(kMimeTypeHTML, mem); 879 aurax11_details_->InsertMapping(kMimeTypeHTML, mem);
788 } 880 }
789 881
790 void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) { 882 void ClipboardAuraX11::WriteRTF(const char* rtf_data, size_t data_len) {
791 WriteData(GetRtfFormatType(), rtf_data, data_len); 883 WriteData(GetRtfFormatType(), rtf_data, data_len);
792 } 884 }
793 885
794 void Clipboard::WriteBookmark(const char* title_data, 886 void ClipboardAuraX11::WriteBookmark(const char* title_data,
795 size_t title_len, 887 size_t title_len,
796 const char* url_data, 888 const char* url_data,
797 size_t url_len) { 889 size_t url_len) {
798 // Write as a mozilla url (UTF16: URL, newline, title). 890 // Write as a mozilla url (UTF16: URL, newline, title).
799 base::string16 url = base::UTF8ToUTF16(std::string(url_data, url_len) + "\n"); 891 base::string16 url = base::UTF8ToUTF16(std::string(url_data, url_len) + "\n");
800 base::string16 title = base::UTF8ToUTF16(std::string(title_data, title_len)); 892 base::string16 title = base::UTF8ToUTF16(std::string(title_data, title_len));
801 893
802 std::vector<unsigned char> data; 894 std::vector<unsigned char> data;
803 ui::AddString16ToVector(url, &data); 895 ui::AddString16ToVector(url, &data);
804 ui::AddString16ToVector(title, &data); 896 ui::AddString16ToVector(title, &data);
805 scoped_refptr<base::RefCountedMemory> mem( 897 scoped_refptr<base::RefCountedMemory> mem(
806 base::RefCountedBytes::TakeVector(&data)); 898 base::RefCountedBytes::TakeVector(&data));
807 899
808 aurax11_details_->InsertMapping(kMimeTypeMozillaURL, mem); 900 aurax11_details_->InsertMapping(kMimeTypeMozillaURL, mem);
809 } 901 }
810 902
811 // Write an extra flavor that signifies WebKit was the last to modify the 903 // Write an extra flavor that signifies WebKit was the last to modify the
812 // pasteboard. This flavor has no data. 904 // pasteboard. This flavor has no data.
813 void Clipboard::WriteWebSmartPaste() { 905 void ClipboardAuraX11::WriteWebSmartPaste() {
814 std::string empty; 906 std::string empty;
815 aurax11_details_->InsertMapping( 907 aurax11_details_->InsertMapping(
816 kMimeTypeWebkitSmartPaste, 908 kMimeTypeWebkitSmartPaste,
817 scoped_refptr<base::RefCountedMemory>( 909 scoped_refptr<base::RefCountedMemory>(
818 base::RefCountedString::TakeString(&empty))); 910 base::RefCountedString::TakeString(&empty)));
819 } 911 }
820 912
821 void Clipboard::WriteBitmap(const SkBitmap& bitmap) { 913 void ClipboardAuraX11::WriteBitmap(const SkBitmap& bitmap) {
822 // Encode the bitmap as a PNG for transport. 914 // Encode the bitmap as a PNG for transport.
823 std::vector<unsigned char> output; 915 std::vector<unsigned char> output;
824 if (gfx::PNGCodec::FastEncodeBGRASkBitmap(bitmap, false, &output)) { 916 if (gfx::PNGCodec::FastEncodeBGRASkBitmap(bitmap, false, &output)) {
825 aurax11_details_->InsertMapping(kMimeTypePNG, 917 aurax11_details_->InsertMapping(kMimeTypePNG,
826 base::RefCountedBytes::TakeVector( 918 base::RefCountedBytes::TakeVector(
827 &output)); 919 &output));
828 } 920 }
829 } 921 }
830 922
831 void Clipboard::WriteData(const FormatType& format, 923 void ClipboardAuraX11::WriteData(const FormatType& format,
832 const char* data_data, 924 const char* data_data,
833 size_t data_len) { 925 size_t data_len) {
834 // We assume that certain mapping types are only written by trusted code. 926 // We assume that certain mapping types are only written by trusted code.
835 // Therefore we must upkeep their integrity. 927 // Therefore we must upkeep their integrity.
836 if (format.Equals(GetBitmapFormatType())) 928 if (format.Equals(GetBitmapFormatType()))
837 return; 929 return;
838 930
839 std::vector<unsigned char> bytes(data_data, data_data + data_len); 931 std::vector<unsigned char> bytes(data_data, data_data + data_len);
840 scoped_refptr<base::RefCountedMemory> mem( 932 scoped_refptr<base::RefCountedMemory> mem(
841 base::RefCountedBytes::TakeVector(&bytes)); 933 base::RefCountedBytes::TakeVector(&bytes));
842 aurax11_details_->InsertMapping(format.ToString(), mem); 934 aurax11_details_->InsertMapping(format.ToString(), mem);
843 } 935 }
844 936
845 // static
846 Clipboard::FormatType Clipboard::GetFormatType(
847 const std::string& format_string) {
848 return FormatType::Deserialize(format_string);
849 }
850
851 // static
852 const Clipboard::FormatType& Clipboard::GetUrlFormatType() {
853 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeURIList));
854 return type;
855 }
856
857 // static
858 const Clipboard::FormatType& Clipboard::GetUrlWFormatType() {
859 return GetUrlFormatType();
860 }
861
862 // static
863 const Clipboard::FormatType& Clipboard::GetPlainTextFormatType() {
864 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeText));
865 return type;
866 }
867
868 // static
869 const Clipboard::FormatType& Clipboard::GetPlainTextWFormatType() {
870 return GetPlainTextFormatType();
871 }
872
873 // static
874 const Clipboard::FormatType& Clipboard::GetFilenameFormatType() {
875 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeFilename));
876 return type;
877 }
878
879 // static
880 const Clipboard::FormatType& Clipboard::GetFilenameWFormatType() {
881 return Clipboard::GetFilenameFormatType();
882 }
883
884 // static
885 const Clipboard::FormatType& Clipboard::GetHtmlFormatType() {
886 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeHTML));
887 return type;
888 }
889
890 // static
891 const Clipboard::FormatType& Clipboard::GetRtfFormatType() {
892 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeRTF));
893 return type;
894 }
895
896 // static
897 const Clipboard::FormatType& Clipboard::GetBitmapFormatType() {
898 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePNG));
899 return type;
900 }
901
902 // static
903 const Clipboard::FormatType& Clipboard::GetWebKitSmartPasteFormatType() {
904 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebkitSmartPaste));
905 return type;
906 }
907
908 // static
909 const Clipboard::FormatType& Clipboard::GetWebCustomDataFormatType() {
910 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypeWebCustomData));
911 return type;
912 }
913
914 // static
915 const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
916 CR_DEFINE_STATIC_LOCAL(FormatType, type, (kMimeTypePepperCustomData));
917 return type;
918 }
919
920 } // namespace ui 937 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698