OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2009, 2010 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 m_fileInputElementUnderMouse = 0; | 429 m_fileInputElementUnderMouse = 0; |
430 } | 430 } |
431 | 431 |
432 if (!m_documentUnderMouse) | 432 if (!m_documentUnderMouse) |
433 return false; | 433 return false; |
434 | 434 |
435 IntPoint point = m_documentUnderMouse->view()->windowToContents(dragData->cl
ientPosition()); | 435 IntPoint point = m_documentUnderMouse->view()->windowToContents(dragData->cl
ientPosition()); |
436 Element* element = elementUnderMouse(m_documentUnderMouse.get(), point); | 436 Element* element = elementUnderMouse(m_documentUnderMouse.get(), point); |
437 if (!element) | 437 if (!element) |
438 return false; | 438 return false; |
439 Frame* innerFrame = element->ownerDocument()->frame(); | 439 RefPtr<Frame> innerFrame = element->ownerDocument()->frame(); |
440 ASSERT(innerFrame); | 440 ASSERT(innerFrame); |
441 | 441 |
442 if (m_page->dragCaretController()->hasCaret() && !dispatchTextInputEventFor(
innerFrame, dragData)) | 442 if (m_page->dragCaretController()->hasCaret() && !dispatchTextInputEventFor(
innerFrame.get(), dragData)) |
443 return true; | 443 return true; |
444 | 444 |
445 if (dragData->containsColor()) { | 445 if (dragData->containsColor()) { |
446 Color color = dragData->asColor(); | 446 Color color = dragData->asColor(); |
447 if (!color.isValid()) | 447 if (!color.isValid()) |
448 return false; | 448 return false; |
449 RefPtr<Range> innerRange = innerFrame->selection()->toNormalizedRange(); | 449 RefPtr<Range> innerRange = innerFrame->selection()->toNormalizedRange(); |
450 RefPtr<StylePropertySet> style = StylePropertySet::create(); | 450 RefPtr<StylePropertySet> style = StylePropertySet::create(); |
451 style->setProperty(CSSPropertyColor, color.serialized(), false); | 451 style->setProperty(CSSPropertyColor, color.serialized(), false); |
452 if (!innerFrame->editor()->shouldApplyStyle(style.get(), innerRange.get(
))) | 452 if (!innerFrame->editor()->shouldApplyStyle(style.get(), innerRange.get(
))) |
(...skipping 30 matching lines...) Expand all Loading... |
483 RefPtr<Element> rootEditableElement = innerFrame->selection()->rootEditableE
lement(); | 483 RefPtr<Element> rootEditableElement = innerFrame->selection()->rootEditableE
lement(); |
484 | 484 |
485 // For range to be null a WebKit client must have done something bad while | 485 // For range to be null a WebKit client must have done something bad while |
486 // manually controlling drag behaviour | 486 // manually controlling drag behaviour |
487 if (!range) | 487 if (!range) |
488 return false; | 488 return false; |
489 CachedResourceLoader* cachedResourceLoader = range->ownerDocument()->cachedR
esourceLoader(); | 489 CachedResourceLoader* cachedResourceLoader = range->ownerDocument()->cachedR
esourceLoader(); |
490 ResourceCacheValidationSuppressor validationSuppressor(cachedResourceLoader)
; | 490 ResourceCacheValidationSuppressor validationSuppressor(cachedResourceLoader)
; |
491 if (dragIsMove(innerFrame->selection(), dragData) || dragCaret.isContentRich
lyEditable()) { | 491 if (dragIsMove(innerFrame->selection(), dragData) || dragCaret.isContentRich
lyEditable()) { |
492 bool chosePlainText = false; | 492 bool chosePlainText = false; |
493 RefPtr<DocumentFragment> fragment = documentFragmentFromDragData(dragDat
a, innerFrame, range, true, chosePlainText); | 493 RefPtr<DocumentFragment> fragment = documentFragmentFromDragData(dragDat
a, innerFrame.get(), range, true, chosePlainText); |
494 if (!fragment || !innerFrame->editor()->shouldInsertFragment(fragment, r
ange, EditorInsertActionDropped)) { | 494 if (!fragment || !innerFrame->editor()->shouldInsertFragment(fragment, r
ange, EditorInsertActionDropped)) { |
495 return false; | 495 return false; |
496 } | 496 } |
497 | 497 |
498 m_client->willPerformDragDestinationAction(DragDestinationActionEdit, dr
agData); | 498 m_client->willPerformDragDestinationAction(DragDestinationActionEdit, dr
agData); |
499 if (dragIsMove(innerFrame->selection(), dragData)) { | 499 if (dragIsMove(innerFrame->selection(), dragData)) { |
500 // NSTextView behavior is to always smart delete on moving a selecti
on, | 500 // NSTextView behavior is to always smart delete on moving a selecti
on, |
501 // but only to smart insert if the selection granularity is word gra
nularity. | 501 // but only to smart insert if the selection granularity is word gra
nularity. |
502 bool smartDelete = innerFrame->editor()->smartInsertDeleteEnabled(); | 502 bool smartDelete = innerFrame->editor()->smartInsertDeleteEnabled(); |
503 bool smartInsert = smartDelete && innerFrame->selection()->granulari
ty() == WordGranularity && dragData->canSmartReplace(); | 503 bool smartInsert = smartDelete && innerFrame->selection()->granulari
ty() == WordGranularity && dragData->canSmartReplace(); |
504 applyCommand(MoveSelectionCommand::create(fragment, dragCaret.base()
, smartInsert, smartDelete)); | 504 applyCommand(MoveSelectionCommand::create(fragment, dragCaret.base()
, smartInsert, smartDelete)); |
505 } else { | 505 } else { |
506 if (setSelectionToDragCaret(innerFrame, dragCaret, range, point)) { | 506 if (setSelectionToDragCaret(innerFrame.get(), dragCaret, range, poin
t)) { |
507 ReplaceSelectionCommand::CommandOptions options = ReplaceSelecti
onCommand::SelectReplacement | ReplaceSelectionCommand::PreventNesting; | 507 ReplaceSelectionCommand::CommandOptions options = ReplaceSelecti
onCommand::SelectReplacement | ReplaceSelectionCommand::PreventNesting; |
508 if (dragData->canSmartReplace()) | 508 if (dragData->canSmartReplace()) |
509 options |= ReplaceSelectionCommand::SmartReplace; | 509 options |= ReplaceSelectionCommand::SmartReplace; |
510 if (chosePlainText) | 510 if (chosePlainText) |
511 options |= ReplaceSelectionCommand::MatchStyle; | 511 options |= ReplaceSelectionCommand::MatchStyle; |
512 applyCommand(ReplaceSelectionCommand::create(m_documentUnderMous
e.get(), fragment, options)); | 512 applyCommand(ReplaceSelectionCommand::create(m_documentUnderMous
e.get(), fragment, options)); |
513 } | 513 } |
514 } | 514 } |
515 } else { | 515 } else { |
516 String text = dragData->asPlainText(innerFrame); | 516 String text = dragData->asPlainText(innerFrame.get()); |
517 if (text.isEmpty() || !innerFrame->editor()->shouldInsertText(text, rang
e.get(), EditorInsertActionDropped)) { | 517 if (text.isEmpty() || !innerFrame->editor()->shouldInsertText(text, rang
e.get(), EditorInsertActionDropped)) { |
518 return false; | 518 return false; |
519 } | 519 } |
520 | 520 |
521 m_client->willPerformDragDestinationAction(DragDestinationActionEdit, dr
agData); | 521 m_client->willPerformDragDestinationAction(DragDestinationActionEdit, dr
agData); |
522 if (setSelectionToDragCaret(innerFrame, dragCaret, range, point)) | 522 if (setSelectionToDragCaret(innerFrame.get(), dragCaret, range, point)) |
523 applyCommand(ReplaceSelectionCommand::create(m_documentUnderMouse.ge
t(), createFragmentFromText(range.get(), text), ReplaceSelectionCommand::Select
Replacement | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::Pre
ventNesting)); | 523 applyCommand(ReplaceSelectionCommand::create(m_documentUnderMouse.ge
t(), createFragmentFromText(range.get(), text), ReplaceSelectionCommand::Select
Replacement | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::Pre
ventNesting)); |
524 } | 524 } |
525 | 525 |
526 if (rootEditableElement) { | 526 if (rootEditableElement) { |
527 if (Frame* frame = rootEditableElement->document()->frame()) | 527 if (Frame* frame = rootEditableElement->document()->frame()) |
528 frame->eventHandler()->updateDragStateAfterEditDragIfNeeded(rootEdit
ableElement.get()); | 528 frame->eventHandler()->updateDragStateAfterEditDragIfNeeded(rootEdit
ableElement.get()); |
529 } | 529 } |
530 | 530 |
531 return true; | 531 return true; |
532 } | 532 } |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 if (!frameView) | 906 if (!frameView) |
907 return; | 907 return; |
908 IntPoint framePoint = frameView->windowToContents(windowPoint); | 908 IntPoint framePoint = frameView->windowToContents(windowPoint); |
909 | 909 |
910 m_page->dragCaretController()->setCaretPosition(frame->visiblePositionForPoi
nt(framePoint)); | 910 m_page->dragCaretController()->setCaretPosition(frame->visiblePositionForPoi
nt(framePoint)); |
911 } | 911 } |
912 | 912 |
913 } // namespace WebCore | 913 } // namespace WebCore |
914 | 914 |
915 #endif // ENABLE(DRAG_SUPPORT) | 915 #endif // ENABLE(DRAG_SUPPORT) |
OLD | NEW |