RESOLVED FIXED 130062
Hook up image controls for WebKit1
https://bugs.webkit.org/show_bug.cgi?id=130062
Summary Hook up image controls for WebKit1
Tim Horton
Reported 2014-03-10 19:14:29 PDT
Attachments
patch (59.52 KB, patch)
2014-03-10 19:38 PDT, Tim Horton
no flags
patch (59.60 KB, patch)
2014-03-11 15:35 PDT, Tim Horton
beidson: review-
patch (65.41 KB, patch)
2014-03-11 19:18 PDT, Tim Horton
beidson: review+
Tim Horton
Comment 1 2014-03-10 19:38:02 PDT
WebKit Commit Bot
Comment 2 2014-03-10 19:40:37 PDT
Attachment 226373 [details] did not pass style-queue: ERROR: Source/WebKit/mac/WebCoreSupport/WebContextMenuClient.h:59: The parameter name "event" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/WebKit/mac/WebCoreSupport/WebContextMenuClient.h:59: The parameter name "view" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.h:45: The parameter name "style" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/WebCore/html/shadow/mac/ImageControlsRootElementMac.h:43: The parameter name "style" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/WebCore/rendering/RenderThemeMac.h:229: The parameter name "paintInfo" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/WebCore/html/shadow/mac/ImageControlsRootElementMac.cpp:31: Alphabetical sorting problem. [build/include_order] [4] Total errors found: 6 in 30 files If any of these errors are false positives, please file a bug against check-webkit-style.
Tim Horton
Comment 3 2014-03-11 15:35:37 PDT
Darin Adler
Comment 4 2014-03-11 16:27:19 PDT
Comment on attachment 226436 [details] patch View in context: https://bugs.webkit.org/attachment.cgi?id=226436&action=review > Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp:91 > + if (!document.page()) > + return nullptr; Seems a little strange here. > Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp:105 > + if (Page* page = document().page()) > + page->contextMenuController().showImageControlsMenu(event); > + > + return; Shouldn’t we be calling event->setDefaultHandled() here (not sure I got the function name right). Also, I suggest deleting that blank line. > Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.h:37 > + ~ImageControlsButtonElementMac(); Should say virtual here. > Source/WebCore/html/shadow/mac/ImageControlsRootElementMac.cpp:92 > + RefPtr<ImageControlsButtonElementMac> button = ImageControlsButtonElementMac::maybeCreate(document); > + controls->appendChild(button.release()); Not sure we need this local variable. > Source/WebCore/page/ContextMenuController.cpp:140 > + CachedImage* image = toRenderImage(renderer)->cachedImage(); Compiler probably ends up optimizing this anyway, but I would write: toRenderImage(*renderer)->cachedImage() to be explicit that toRenderImage doesn’t have to bother handling null. > Source/WebCore/page/ContextMenuController.cpp:1470 > + CachedResourceHandle<CachedImage> replacedImage = new CachedImage(newImage.get(), frame->page()->sessionID()); Is this right? we don’t need to call any adopt or anything to do this correctly? > Source/WebCore/rendering/RenderThemeMac.mm:1981 > +bool RenderThemeMac::paintImageControlsButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect) Do we really need to name the renderer "o"? > Source/WebCore/rendering/RenderThemeMac.mm:2004 > + NSServicesRolloverButtonCell *cell = servicesRolloverButtonCell(); > + return IntSize([cell cellSize]); Not sure we need the local variable here. > Source/WebKit/mac/WebCoreSupport/WebContextMenuClient.h:33 > +#if ENABLE(IMAGE_CONTROLS) > +@class WebSharingServicePickerController; > +#endif Not sure we really need to put an #if around a forward declaration. > Source/WebKit2/Shared/ContextMenuContextData.cpp:49 > + , m_isImageControl(!!context.controlledImage()) Why the !!? Is that really needed?
Brady Eidson
Comment 5 2014-03-11 16:35:53 PDT
Comment on attachment 226436 [details] patch View in context: https://bugs.webkit.org/attachment.cgi?id=226436&action=review > Source/WebCore/page/ContextMenuController.cpp:1471 > + CachedResourceHandle<CachedImage> replacedImage = new CachedImage(newImage.get(), frame->page()->sessionID()); > + toRenderImage(renderer)->imageResource().setCachedImage(replacedImage.get()); I think it's important that the replaced image have a URL. We may discover later that it is or isn't important what that URL is, but we need something. I think we should use webkit-fake URL like the pasteboard code uses. EditorMac.mm and EditorIOS.mm both generate webkit-fake URLs. I'd like to see this patch factor that out into a utility method and use it here. > Source/WebKit/mac/Misc/WebSharingServicePickerController.mm:50 > +@implementation WebSharingServicePickerController { > + WebContextMenuClient* _menuClient; > + RetainPtr<NSSharingServicePicker> _picker; > +} ...and... > Source/WebKit/mac/Misc/WebSharingServicePickerController.mm:61 > + _menuClient = menuClient; ...I'm concerned about some path to a use-after-free with the menu client. Should we explicitly clear out the back pointer?
Tim Horton
Comment 6 2014-03-11 16:46:32 PDT
(In reply to comment #4) > (From update of attachment 226436 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=226436&action=review > > > Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp:91 > > + if (!document.page()) > > + return nullptr; > > Seems a little strange here. Agreed, I'll try to figure out what is going on there. > > Source/WebCore/html/shadow/mac/ImageControlsButtonElementMac.cpp:105 > > + if (Page* page = document().page()) > > + page->contextMenuController().showImageControlsMenu(event); > > + > > + return; > > Shouldn’t we be calling event->setDefaultHandled() here (not sure I got the function name right). > Also, I suggest deleting that blank line. I think so. > > Source/WebCore/page/ContextMenuController.cpp:1470 > > + CachedResourceHandle<CachedImage> replacedImage = new CachedImage(newImage.get(), frame->page()->sessionID()); > > Is this right? we don’t need to call any adopt or anything to do this correctly? Sadly, yes (and I double-checked with Brady). > > Source/WebCore/rendering/RenderThemeMac.mm:1981 > > +bool RenderThemeMac::paintImageControlsButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& rect) > > Do we really need to name the renderer "o"? Not even sort of. (In reply to comment #5) > (From update of attachment 226436 [details]) > View in context: https://bugs.webkit.org/attachment.cgi?id=226436&action=review > > > Source/WebCore/page/ContextMenuController.cpp:1471 > > + CachedResourceHandle<CachedImage> replacedImage = new CachedImage(newImage.get(), frame->page()->sessionID()); > > + toRenderImage(renderer)->imageResource().setCachedImage(replacedImage.get()); > > I think it's important that the replaced image have a URL. > > We may discover later that it is or isn't important what that URL is, but we need something. > > I think we should use webkit-fake URL like the pasteboard code uses. > > EditorMac.mm and EditorIOS.mm both generate webkit-fake URLs. I'd like to see this patch factor that out into a utility method and use it here. Okay, that sounds like a good plan! > > Source/WebKit/mac/Misc/WebSharingServicePickerController.mm:50 > > +@implementation WebSharingServicePickerController { > > + WebContextMenuClient* _menuClient; > > + RetainPtr<NSSharingServicePicker> _picker; > > +} > > ...and... > > > Source/WebKit/mac/Misc/WebSharingServicePickerController.mm:61 > > + _menuClient = menuClient; > > ...I'm concerned about some path to a use-after-free with the menu client. Should we explicitly clear out the back pointer? A valid point. Sure.
Tim Horton
Comment 7 2014-03-11 18:52:16 PDT
Hmm, I just noticed that Editor::writeImageToPasteboard assumes that CachedImages have a valid ResourceBuffer, which a CachedImage created from an image like I'm doing here does not, so we crash trying to copy a modified image. It's not clear to me if this should change the approach here, or if we should adjust writeImageToPasteboard.
Tim Horton
Comment 8 2014-03-11 19:18:40 PDT
Created attachment 226465 [details] patch Addressing most of the review comments. The bit about copying above still stands.
Brady Eidson
Comment 9 2014-03-11 20:09:57 PDT
Comment on attachment 226465 [details] patch I'm fine with this assuming EWS, etc etc!
Tim Horton
Comment 10 2014-03-12 00:52:02 PDT
So! I think I'm going to land this, with an added null check to prevent us from crashing when copying. This does mean that copying a replaced image won't work, but we can fix that next (there's so much more to this patch that it will be much easier to work on things like that if it's landed). Sam thinks we should use the standard paste mechanism to replace the image, but I'm somewhat afraid to do that for two reasons: 1. We currently just get back a data blob and have to assume it's an image, so it doesn't buy us much. This will get resolved with API changes, but not yet. 2. Pasting "over" the image will lose things that the page has done to the image (event listeners, inline style, etc.) that aren't persisted in the image itself. So we can consider that, but it will require some thought.
Tim Horton
Comment 11 2014-03-12 10:57:53 PDT
Brady Eidson
Comment 12 2014-03-12 13:21:09 PDT
(In reply to comment #10) >Sam thinks we should use the standard paste mechanism to replace the image, but I'm somewhat afraid to do that for two reasons: ... > 2. Pasting "over" the image will lose things that the page has done to the image (event listeners, inline style, etc.) that aren't persisted in the image itself. Will also cause DOM mutation, which would generate unexpected events and potentially break javascript that has already cached existing elements, for example. I think this idea is unworkable.
Tim Horton
Comment 13 2014-03-12 16:35:48 PDT
Note You need to log in before you can comment on or make changes to this bug.