Changeset 168378 in webkit


Ignore:
Timestamp:
May 6, 2014 2:08:14 PM (10 years ago)
Author:
beidson@apple.com
Message:

Don't select an image that is about to have its menu shown.
<rdar://problem/16807845> and https://bugs.webkit.org/show_bug.cgi?id=132579

Reviewed by Tim Horton.

Source/WebCore:

  • WebCore.exp.in:
  • editing/Editor.h:
  • editing/mac/EditorMac.mm:

(WebCore::Editor::replaceNodeFromPasteboard): New method that first selects

the Node and then immediately pastes over it. Since it’s synchronous the
selection never has a chance to paint.

  • html/shadow/mac/ImageControlsButtonElementMac.cpp:

(WebCore::ImageControlsButtonElementMac::defaultEventHandler): Don’t select the image.

Source/WebKit/mac:

  • Misc/WebSharingServicePickerController.mm:

(-[WebSharingServicePickerController didShareImageData:confirmDataIsValidTIFFData:]):

Call the new replaceNodeFromPasteboard API instead of readSelectionFromPasteboard.

Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r168377 r168378  
     12014-05-06  Brady Eidson  <beidson@apple.com>
     2
     3        Don't select an image that is about to have its menu shown.
     4        <rdar://problem/16807845> and https://bugs.webkit.org/show_bug.cgi?id=132579
     5
     6        Reviewed by Tim Horton.
     7
     8        * WebCore.exp.in:
     9
     10        * editing/Editor.h:
     11        * editing/mac/EditorMac.mm:
     12        (WebCore::Editor::replaceNodeFromPasteboard): New method that first selects
     13          the Node and then immediately pastes over it. Since it’s synchronous the
     14          selection never has a chance to paint.
     15
     16        * html/shadow/mac/ImageControlsButtonElementMac.cpp:
     17        (WebCore::ImageControlsButtonElementMac::defaultEventHandler): Don’t select the image.
     18
    1192014-05-06  Eric Carlson  <eric.carlson@apple.com>
    220
  • trunk/Source/WebCore/WebCore.exp.in

    r168341 r168378  
    11611161__ZN7WebCore6Editor24isSelectionUngrammaticalEv
    11621162__ZN7WebCore6Editor24replaceSelectionWithTextERKN3WTF6StringEbb
     1163__ZN7WebCore6Editor25replaceNodeFromPasteboardEPNS_4NodeERKN3WTF6StringE
    11631164__ZN7WebCore6Editor26decreaseSelectionListLevelEv
    11641165__ZN7WebCore6Editor26increaseSelectionListLevelEv
  • trunk/Source/WebCore/editing/Editor.h

    r167542 r168378  
    433433    void takeFindStringFromSelection();
    434434    void readSelectionFromPasteboard(const String& pasteboardName);
     435    void replaceNodeFromPasteboard(Node*, const String& pasteboardName);
    435436    PassRefPtr<SharedBuffer> dataSelectionForPasteboard(const String& pasteboardName);
    436437#endif // !PLATFORM(IOS)
  • trunk/Source/WebCore/editing/mac/EditorMac.mm

    r168376 r168378  
    266266}
    267267
     268void Editor::replaceNodeFromPasteboard(Node* node, const String& pasteboardName)
     269{
     270    ASSERT(node);
     271
     272    if (&node->document() != m_frame.document())
     273        return;
     274
     275    RefPtr<Range> range = Range::create(node->document(), Position(node, Position::PositionIsBeforeAnchor), Position(node, Position::PositionIsAfterAnchor));
     276    m_frame.selection().setSelection(VisibleSelection(range.get()), FrameSelection::DoNotSetFocus);
     277
     278    readSelectionFromPasteboard(pasteboardName);
     279}
     280
    268281// FIXME: Makes no sense that selectedTextForDataTransfer always includes alt text, but stringSelectionForPasteboard does not.
    269282// This was left in a bad state when selectedTextForDataTransfer was added. Need to look over clients and fix this.
  • trunk/Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp

    r167956 r168378  
    112112            return;
    113113
    114         ContainerNode* parent = parentNode();
    115         Element* hostElement = nullptr;
    116         while (parent) {
    117             if (parent->isShadowRoot()) {
    118                 hostElement = static_cast<ShadowRoot*>(parent)->hostElement();
    119                 break;
    120             }
    121             parent = parent->parentNode();
    122         }
    123 
    124         if (!hostElement)
    125             return;
    126         ASSERT(isHTMLImageElement(hostElement));
    127 
    128         RefPtr<Range> range = Range::create(document(), Position(hostElement, Position::PositionIsBeforeAnchor), Position(hostElement, Position::PositionIsAfterAnchor));
    129         frame->selection().setSelection(VisibleSelection(range.get()));
    130 
    131114        page->contextMenuController().showImageControlsMenu(event);
    132115        event->setDefaultHandled();
  • trunk/Source/WebKit/mac/ChangeLog

    r168372 r168378  
     12014-05-06  Brady Eidson  <beidson@apple.com>
     2
     3        Don't select an image that is about to have its menu shown.
     4        <rdar://problem/16807845> and https://bugs.webkit.org/show_bug.cgi?id=132579
     5
     6        Reviewed by Tim Horton.
     7
     8        * Misc/WebSharingServicePickerController.mm:
     9        (-[WebSharingServicePickerController didShareImageData:confirmDataIsValidTIFFData:]):
     10          Call the new replaceNodeFromPasteboard API instead of readSelectionFromPasteboard.
     11
    1122014-05-06  Anders Carlsson  <andersca@apple.com>
    213
  • trunk/Source/WebKit/mac/Misc/WebSharingServicePickerController.mm

    r168193 r168378  
    3232#import <AppKit/NSSharingService.h>
    3333#import <WebCore/BitmapImage.h>
     34#import <WebCore/Document.h>
    3435#import <WebCore/Editor.h>
    3536#import <WebCore/FocusController.h>
     
    121122    [pasteboard setData:data forType:NSPasteboardTypeTIFF];
    122123
    123     Frame& frame = page->focusController().focusedOrMainFrame();
    124     if (!frame.selection().isNone())
    125         frame.editor().readSelectionFromPasteboard(serviceControlsPasteboardName);
     124    if (Node* node = page->contextMenuController().context().hitTestResult().innerNode()) {
     125        if (Frame* frame = node->document().frame())
     126            frame->editor().replaceNodeFromPasteboard(node, serviceControlsPasteboardName);
     127    }
    126128
    127129    [self clear];
Note: See TracChangeset for help on using the changeset viewer.