Changeset 222956 in webkit
- Timestamp:
- Oct 5, 2017 8:51:35 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r222949 r222956 1 2017-10-05 Ryosuke Niwa <rniwa@webkit.org> 2 3 DataTransfer shouldn't contain text/html when performing Paste and Match Style 4 https://bugs.webkit.org/show_bug.cgi?id=174165 5 <rdar://problem/33138027> 6 7 Reviewed by Wenson Hsieh. 8 9 Added regression tests for pasting as plain text. 10 11 * editing/pasteboard/data-transfer-get-data-on-paste-as-plain-text-expected.txt: Added. 12 * editing/pasteboard/data-transfer-get-data-on-paste-as-plain-text-when-custom-pasteboard-data-disabled-expected.txt: Added. 13 * editing/pasteboard/data-transfer-get-data-on-paste-as-plain-text-when-custom-pasteboard-data-disabled.html: Added. 14 * editing/pasteboard/data-transfer-get-data-on-paste-as-plain-text.html: Added. 15 1 16 2017-10-05 Myles C. Maxfield <mmaxfield@apple.com> 2 17 -
trunk/Source/WebCore/ChangeLog
r222953 r222956 1 2017-10-05 Ryosuke Niwa <rniwa@webkit.org> 2 3 DataTransfer shouldn't contain text/html when performing Paste and Match Style 4 https://bugs.webkit.org/show_bug.cgi?id=174165 5 <rdar://problem/33138027> 6 7 Reviewed by Wenson Hsieh. 8 9 When performing Paste and Match Style, only expose the plain text by creating a StaticPasteboard with plain text content. 10 11 This patch introduces ClipboardEventKind enum class to differentiate regular paste and paste and match style (internally 12 called as pasteAsPlainText) since both operations use "paste" event. 13 14 Tests: editing/pasteboard/data-transfer-get-data-on-paste-as-plain-text-when-custom-pasteboard-data-disabled.html 15 editing/pasteboard/data-transfer-get-data-on-paste-as-plain-text.html 16 17 * dom/DataTransfer.cpp: 18 (WebCore::DataTransfer::createForCopyAndPaste): Made this function take Pasteboard as an argument. 19 * dom/DataTransfer.h: 20 * editing/Editor.cpp: 21 (WebCore::ClipboardEventKind): Added. 22 (WebCore::eventNameForClipboardEvent): Added. 23 (WebCore::createDataTransferForClipboardEvent): Added. 24 (WebCore::dispatchClipboardEvent): 25 (WebCore::Editor::canDHTMLCut): 26 (WebCore::Editor::canDHTMLCopy): 27 (WebCore::Editor::canDHTMLPaste): 28 (WebCore::Editor::tryDHTMLCopy): 29 (WebCore::Editor::tryDHTMLCut): 30 (WebCore::Editor::tryDHTMLPaste): Deleted. 31 (WebCore::Editor::paste): 32 (WebCore::Editor::pasteAsPlainText): 33 * platform/ios/PasteboardIOS.mm: 34 (WebCore::Pasteboard::addHTMLClipboardTypesForCocoaType): Add "text/html" when public.html UTI is in the pasteboard 35 even when the custom pasteboard data is disabled. We continue to add public.html in the case some app dependent on 36 seeing "public.html" in dataTransfer.types. 37 1 38 2017-10-05 Zalan Bujtas <zalan@apple.com> 2 39 -
trunk/Source/WebCore/dom/DataTransfer.cpp
r222904 r222956 77 77 } 78 78 79 Ref<DataTransfer> DataTransfer::createForCopyAndPaste(StoreMode mode)80 { 81 return adoptRef(*new DataTransfer( mode, mode == StoreMode::ReadWrite ? std::make_unique<StaticPasteboard>() : Pasteboard::createForCopyAndPaste()));79 Ref<DataTransfer> DataTransfer::createForCopyAndPaste(StoreMode storeMode, std::unique_ptr<Pasteboard>&& pasteboard) 80 { 81 return adoptRef(*new DataTransfer(storeMode, WTFMove(pasteboard))); 82 82 } 83 83 -
trunk/Source/WebCore/dom/DataTransfer.h
r222885 r222956 45 45 enum class StoreMode { Invalid, ReadWrite, Readonly, Protected }; 46 46 47 static Ref<DataTransfer> createForCopyAndPaste(StoreMode );47 static Ref<DataTransfer> createForCopyAndPaste(StoreMode, std::unique_ptr<Pasteboard>&&); 48 48 static Ref<DataTransfer> createForInputEvent(const String& plainText, const String& htmlText); 49 49 -
trunk/Source/WebCore/editing/Editor.cpp
r222642 r222956 315 315 } 316 316 317 enum class ClipboardEventKind { 318 Copy, 319 Cut, 320 Paste, 321 PasteAsPlainText, 322 BeforeCopy, 323 BeforeCut, 324 BeforePaste, 325 }; 326 327 static AtomicString eventNameForClipboardEvent(ClipboardEventKind kind) 328 { 329 switch (kind) { 330 case ClipboardEventKind::Copy: 331 return eventNames().copyEvent; 332 case ClipboardEventKind::Cut: 333 return eventNames().cutEvent; 334 case ClipboardEventKind::Paste: 335 case ClipboardEventKind::PasteAsPlainText: 336 return eventNames().pasteEvent; 337 case ClipboardEventKind::BeforeCopy: 338 return eventNames().beforecopyEvent; 339 case ClipboardEventKind::BeforeCut: 340 return eventNames().beforecutEvent; 341 case ClipboardEventKind::BeforePaste: 342 return eventNames().beforepasteEvent; 343 } 344 ASSERT_NOT_REACHED(); 345 return { }; 346 } 347 348 static Ref<DataTransfer> createDataTransferForClipboardEvent(ClipboardEventKind kind) 349 { 350 switch (kind) { 351 case ClipboardEventKind::Copy: 352 case ClipboardEventKind::Cut: 353 return DataTransfer::createForCopyAndPaste(DataTransfer::StoreMode::ReadWrite, std::make_unique<StaticPasteboard>()); 354 case ClipboardEventKind::PasteAsPlainText: 355 if (Settings::customPasteboardDataEnabled()) { 356 auto plainTextType = ASCIILiteral("text/plain"); 357 auto plainText = Pasteboard::createForCopyAndPaste()->readString(plainTextType); 358 auto pasteboard = std::make_unique<StaticPasteboard>(); 359 pasteboard->writeString(plainTextType, plainText); 360 return DataTransfer::createForCopyAndPaste(DataTransfer::StoreMode::Readonly, WTFMove(pasteboard)); 361 } 362 FALLTHROUGH; 363 case ClipboardEventKind::Paste: 364 return DataTransfer::createForCopyAndPaste(DataTransfer::StoreMode::Readonly, Pasteboard::createForCopyAndPaste()); 365 case ClipboardEventKind::BeforeCopy: 366 case ClipboardEventKind::BeforeCut: 367 case ClipboardEventKind::BeforePaste: 368 return DataTransfer::createForCopyAndPaste(DataTransfer::StoreMode::Invalid, std::make_unique<StaticPasteboard>()); 369 } 370 ASSERT_NOT_REACHED(); 371 return DataTransfer::createForCopyAndPaste(DataTransfer::StoreMode::Invalid, std::make_unique<StaticPasteboard>()); 372 } 373 317 374 // Returns whether caller should continue with "the default processing", which is the same as 318 375 // the event handler NOT setting the return value to false 319 376 // https://w3c.github.io/clipboard-apis/#fire-a-clipboard-event 320 static bool dispatchClipboardEvent(RefPtr<Element>&& target, const AtomicString& eventType)377 static bool dispatchClipboardEvent(RefPtr<Element>&& target, ClipboardEventKind kind) 321 378 { 322 379 // FIXME: Move the target selection code here. … … 324 381 return true; 325 382 326 DataTransfer::StoreMode storeMode; 327 if (eventType == eventNames().pasteEvent) 328 storeMode = DataTransfer::StoreMode::Readonly; 329 else if (eventType == eventNames().copyEvent || eventType == eventNames().cutEvent) 330 storeMode = DataTransfer::StoreMode::ReadWrite; 331 else { 332 ASSERT(eventType == eventNames().beforecutEvent || eventType == eventNames().beforecopyEvent || eventType == eventNames().beforepasteEvent); 333 storeMode = DataTransfer::StoreMode::Invalid; 334 } 335 336 auto dataTransfer = DataTransfer::createForCopyAndPaste(storeMode); 383 auto dataTransfer = createDataTransferForClipboardEvent(kind); 337 384 338 385 ClipboardEvent::Init init; … … 340 387 init.cancelable = true; 341 388 init.clipboardData = dataTransfer.ptr(); 342 auto event = ClipboardEvent::create(event Type, init, Event::IsTrusted::Yes);389 auto event = ClipboardEvent::create(eventNameForClipboardEvent(kind), init, Event::IsTrusted::Yes); 343 390 344 391 target->dispatchEvent(event); 345 392 bool noDefaultProcessing = event->defaultPrevented(); 346 if (noDefaultProcessing && storeMode == DataTransfer::StoreMode::ReadWrite) {393 if (noDefaultProcessing && (kind == ClipboardEventKind::Copy || kind == ClipboardEventKind::Cut)) { 347 394 auto pasteboard = Pasteboard::createForCopyAndPaste(); 348 395 pasteboard->clear(); … … 365 412 return false; 366 413 367 return !dispatchClipboardEvent(findEventTargetFromSelection(), eventNames().beforecutEvent);414 return !dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::BeforeCut); 368 415 } 369 416 … … 372 419 if (m_frame.selection().selection().isInPasswordField()) 373 420 return false; 374 return !dispatchClipboardEvent(findEventTargetFromSelection(), eventNames().beforecopyEvent);421 return !dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::BeforeCopy); 375 422 } 376 423 377 424 bool Editor::canDHTMLPaste() 378 425 { 379 return !dispatchClipboardEvent(findEventTargetFromSelection(), eventNames().beforepasteEvent);426 return !dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::BeforePaste); 380 427 } 381 428 … … 645 692 return false; 646 693 647 return !dispatchClipboardEvent(findEventTargetFromSelection(), eventNames().copyEvent);694 return !dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::Copy); 648 695 } 649 696 … … 653 700 return false; 654 701 655 return !dispatchClipboardEvent(findEventTargetFromSelection(), eventNames().cutEvent); 656 } 657 658 bool Editor::tryDHTMLPaste() 659 { 660 return !dispatchClipboardEvent(findEventTargetFromSelection(), eventNames().pasteEvent); 702 return !dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::Cut); 661 703 } 662 704 … … 1337 1379 void Editor::paste(Pasteboard& pasteboard) 1338 1380 { 1339 if ( tryDHTMLPaste())1381 if (!dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::Paste)) 1340 1382 return; // DHTML did the whole operation 1341 1383 if (!canPaste()) … … 1351 1393 void Editor::pasteAsPlainText() 1352 1394 { 1353 if ( tryDHTMLPaste())1395 if (!dispatchClipboardEvent(findEventTargetFromSelection(), ClipboardEventKind::PasteAsPlainText)) 1354 1396 return; 1355 1397 if (!canPaste()) -
trunk/Source/WebCore/editing/Editor.h
r222642 r222956 147 147 bool tryDHTMLCopy(); 148 148 bool tryDHTMLCut(); 149 WEBCORE_EXPORT bool tryDHTMLPaste();150 149 151 150 WEBCORE_EXPORT bool canCut() const; -
trunk/Source/WebCore/platform/ios/PasteboardIOS.mm
r222702 r222956 359 359 return; 360 360 } 361 if ([cocoaType isEqualToString:(NSString *)kUTTypeHTML]) { 362 resultTypes.add(ASCIILiteral("text/html")); 363 // We don't return here for App compatibility. 364 } 361 365 if (Pasteboard::shouldTreatCocoaTypeAsFile(cocoaType)) 362 366 return;
Note: See TracChangeset
for help on using the changeset viewer.