Add action menu support for images
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Oct 2014 23:48:38 +0000 (23:48 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Oct 2014 23:48:38 +0000 (23:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=137987
<rdar://problem/18717767>

Reviewed by Anders Carlsson, Sam Weinig, and Beth Dakin.

* Resources/AddImageToPhotos.pdf: Added.
* Resources/CopyImage.pdf: Added.
* Resources/SaveImageToDownloads.pdf: Added.
* Resources/ShareImage.pdf: Added.
Add some temporary artwork.

* Scripts/webkit/messages.py:
(struct_or_class):
ActionMenuHitTestResult is a struct.

* Shared/API/c/WKActionMenuItemTypes.h:
Add new items for image menus.

* Shared/mac/ActionMenuHitTestResult.cpp:
(WebKit::ActionMenuHitTestResult::encode):
(WebKit::ActionMenuHitTestResult::decode):
For now, pass the hit image data across to the UI process as a ShareableBitmap.

* Shared/mac/ActionMenuHitTestResult.h:

* UIProcess/API/mac/WKView.mm:
(-[WKView _createActionMenuItemForTag:]):
Refactor action menu item creation into a single function, so that
callers can share code and be much simpler.

(webKitBundleImageNamed):
Add a helper to acquire an image from the WebKit2 bundle.

(-[WKView _copyImage:]):
(-[WKView _saveImageToDownloads:]):
(temporaryPhotosDirectoryPath):
(pathToPhotoOnDisk):
(-[WKView _addImageToPhotos:]):
Add rudimentary implementations of image actions.

(-[WKView _defaultMenuItemsForImage]):
Support the image menu, plus a submenu acquired from NSSharingServicePicker
for the Share menu.

(-[WKView _defaultMenuItems]):
Call _defaultMenuItemsForImage if needed.

(-[WKView _updateActionMenu]):
Refactor _updateActionMenu out of prepareForMenu:withEvent:.

(-[WKView prepareForMenu:withEvent:]):
Ask the Web process to re-hit-test under the location that the menu
will appear. Mark the menu as pending.

(-[WKView _didPerformActionMenuHitTest:]):
When we get the hit test reply, record the result for future use.

(-[WKView willOpenMenu:withEvent:]):
If we got a hit test reply, rebuild the menu immediately. If not, wait
up to 500ms for the reply to come in. This eventually needs to be
cancellable if the menu is rejected in the interim.

(-[WKView didCloseMenu:withEvent:]):
Clear all state when the menu closes.

* UIProcess/API/mac/WKViewInternal.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::performActionMenuHitTestAtLocation):
(WebKit::WebPageProxy::didPerformActionMenuHitTest):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/mac/PageClientImpl.h:
* UIProcess/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::didPerformActionMenuHitTest):
* UIProcess/ios/PageClientImplIOS.h:
* UIProcess/ios/PageClientImplIOS.mm:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:
Plumb didPerformActionMenuHitTest back from WebPageProxy to WKView.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::performActionMenuHitTestAtLocation):
Hit test at the given location, recording the image data if there is any,
and return the result to the UI process.

* WebKit2.xcodeproj/project.pbxproj:
Add the PDFs.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@175075 268f45cc-cd09-0410-ab3c-d52691b4dbfc

23 files changed:
Source/WebKit2/ChangeLog
Source/WebKit2/Resources/AddImageToPhotosTemplate.pdf [new file with mode: 0644]
Source/WebKit2/Resources/CopyImageTemplate.pdf [new file with mode: 0644]
Source/WebKit2/Resources/SaveImageToDownloadsTemplate.pdf [new file with mode: 0644]
Source/WebKit2/Resources/ShareImageTemplate.pdf [new file with mode: 0644]
Source/WebKit2/Scripts/webkit/messages.py
Source/WebKit2/Shared/API/c/WKActionMenuItemTypes.h
Source/WebKit2/Shared/mac/ActionMenuHitTestResult.cpp [new file with mode: 0644]
Source/WebKit2/Shared/mac/ActionMenuHitTestResult.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/mac/WKView.mm
Source/WebKit2/UIProcess/API/mac/WKViewInternal.h
Source/WebKit2/UIProcess/PageClient.h
Source/WebKit2/UIProcess/WebPageProxy.cpp
Source/WebKit2/UIProcess/WebPageProxy.h
Source/WebKit2/UIProcess/WebPageProxy.messages.in
Source/WebKit2/UIProcess/ios/PageClientImplIOS.h
Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm
Source/WebKit2/UIProcess/mac/PageClientImpl.h
Source/WebKit2/UIProcess/mac/PageClientImpl.mm
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
Source/WebKit2/WebProcess/WebPage/WebPage.cpp
Source/WebKit2/WebProcess/WebPage/WebPage.h
Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

index eaebf04..6747e18 100644 (file)
@@ -1,3 +1,95 @@
+2014-10-22  Tim Horton  <timothy_horton@apple.com>
+
+        Add action menu support for images
+        https://bugs.webkit.org/show_bug.cgi?id=137987
+        <rdar://problem/18717767>
+
+        Reviewed by Anders Carlsson, Sam Weinig, and Beth Dakin.
+
+        * Resources/AddImageToPhotos.pdf: Added.
+        * Resources/CopyImage.pdf: Added.
+        * Resources/SaveImageToDownloads.pdf: Added.
+        * Resources/ShareImage.pdf: Added.
+        Add some temporary artwork.
+
+        * Scripts/webkit/messages.py:
+        (struct_or_class):
+        ActionMenuHitTestResult is a struct.
+
+        * Shared/API/c/WKActionMenuItemTypes.h:
+        Add new items for image menus.
+
+        * Shared/mac/ActionMenuHitTestResult.cpp:
+        (WebKit::ActionMenuHitTestResult::encode):
+        (WebKit::ActionMenuHitTestResult::decode):
+        For now, pass the hit image data across to the UI process as a ShareableBitmap.
+
+        * Shared/mac/ActionMenuHitTestResult.h:
+
+        * UIProcess/API/mac/WKView.mm:
+        (-[WKView _createActionMenuItemForTag:]):
+        Refactor action menu item creation into a single function, so that
+        callers can share code and be much simpler.
+
+        (webKitBundleImageNamed):
+        Add a helper to acquire an image from the WebKit2 bundle.
+
+        (-[WKView _copyImage:]):
+        (-[WKView _saveImageToDownloads:]):
+        (temporaryPhotosDirectoryPath):
+        (pathToPhotoOnDisk):
+        (-[WKView _addImageToPhotos:]):
+        Add rudimentary implementations of image actions.
+
+        (-[WKView _defaultMenuItemsForImage]):
+        Support the image menu, plus a submenu acquired from NSSharingServicePicker
+        for the Share menu.
+
+        (-[WKView _defaultMenuItems]):
+        Call _defaultMenuItemsForImage if needed.
+
+        (-[WKView _updateActionMenu]):
+        Refactor _updateActionMenu out of prepareForMenu:withEvent:.
+
+        (-[WKView prepareForMenu:withEvent:]):
+        Ask the Web process to re-hit-test under the location that the menu
+        will appear. Mark the menu as pending.
+
+        (-[WKView _didPerformActionMenuHitTest:]):
+        When we get the hit test reply, record the result for future use.
+
+        (-[WKView willOpenMenu:withEvent:]):
+        If we got a hit test reply, rebuild the menu immediately. If not, wait
+        up to 500ms for the reply to come in. This eventually needs to be
+        cancellable if the menu is rejected in the interim.
+
+        (-[WKView didCloseMenu:withEvent:]):
+        Clear all state when the menu closes.
+
+        * UIProcess/API/mac/WKViewInternal.h:
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::performActionMenuHitTestAtLocation):
+        (WebKit::WebPageProxy::didPerformActionMenuHitTest):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/mac/PageClientImpl.h:
+        * UIProcess/mac/PageClientImpl.mm:
+        (WebKit::PageClientImpl::didPerformActionMenuHitTest):
+        * UIProcess/ios/PageClientImplIOS.h:
+        * UIProcess/ios/PageClientImplIOS.mm:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+        Plumb didPerformActionMenuHitTest back from WebPageProxy to WKView.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::performActionMenuHitTestAtLocation):
+        Hit test at the given location, recording the image data if there is any,
+        and return the result to the UI process.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+        Add the PDFs.
+
 2014-10-22  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
 
         Remove WidgetBackingStoreCairo::create() factory function
diff --git a/Source/WebKit2/Resources/AddImageToPhotosTemplate.pdf b/Source/WebKit2/Resources/AddImageToPhotosTemplate.pdf
new file mode 100644 (file)
index 0000000..7216d35
--- /dev/null
@@ -0,0 +1,155 @@
+%PDF-1.5\r%âãÏÓ\r
+1 0 obj\r<</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 16948/Subtype/XML/Type/Metadata>>stream\r
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c014 79.151739, 2013/04/03-12:12:15        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <xmp:CreatorTool>Adobe Illustrator CC (Macintosh)</xmp:CreatorTool>
+         <xmp:CreateDate>2014-10-21T13:16:05-07:00</xmp:CreateDate>
+         <xmp:MetadataDate>2014-10-21T13:16:05-07:00</xmp:MetadataDate>
+         <xmp:ModifyDate>2014-10-21T13:16:05-07:00</xmp:ModifyDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>244</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA9AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq/Ov8/v/JyebP8AmOb/AIiuKvP8VfpV+U//AJKzyb/2w9N/6g48VZVirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir86/z+/wDJyebP&#xA;+Y5v+Irirz/FX6VflP8A+Ss8m/8AbD03/qDjxVlWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;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</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>17.000000</stDim:w>
+            <stDim:h>16.000000</stDim:h>
+            <stDim:unit>Points</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">add to photos (edited)</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DocumentID>xmp.did:4007e621-9c7d-4ade-bdfa-2f9dc7c9b390</xmpMM:DocumentID>
+         <xmpMM:InstanceID>uuid:87caf6f1-ce3c-9d45-a07d-358e43ce26da</xmpMM:InstanceID>
+         <xmpMM:OriginalDocumentID>xmp.did:0335b8c8-558b-4706-8ecb-4aa27ac8cb55</xmpMM:OriginalDocumentID>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>xmp.iid:66917f51-66b2-4e40-b10d-2f774931aa68</stRef:instanceID>
+            <stRef:documentID>xmp.did:66917f51-66b2-4e40-b10d-2f774931aa68</stRef:documentID>
+            <stRef:originalDocumentID>xmp.did:0335b8c8-558b-4706-8ecb-4aa27ac8cb55</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:0335b8c8-558b-4706-8ecb-4aa27ac8cb55</stEvt:instanceID>
+                  <stEvt:when>2014-10-21T13:11:55-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CC (Macintosh)</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:4007e621-9c7d-4ade-bdfa-2f9dc7c9b390</stEvt:instanceID>
+                  <stEvt:when>2014-10-21T13:16-07:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CC (Macintosh)</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+         <pdf:Producer>Adobe PDF library 11.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\rendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[0.0 0.0 17.0 16.0]/BleedBox[0.0 0.0 17.0 16.0]/Contents 6 0 R/Group 7 0 R/MediaBox[0.0 0.0 17.0 16.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 8 0 R/GS1 9 0 R>>/Properties<</MC0 10 0 R>>/XObject<</Fm0 11 0 R>>>>/TrimBox[0.0 0.0 17.0 16.0]/Type/Page>>\rendobj\r6 0 obj\r<</Filter/FlateDecode/Length 258>>stream\r
+H\89l\91±RÃ0\f\86w?\85\8ed˲¼¶\ 5\16\18\98¹\éÒÀ5L¼=\92\9bÀÂy°>é?ý²5>¿}\9f\17\18\8f{\84Ýa\ fá\16\10H\80*\fv-çð
+\1f\96ò³\Âøô\82
+7 \9e\8c*\89 FU\11\98æ.\9eÃ\801\ 1F\12\ 6\vY«C*\ eÂ=\87Ê0\85!Ee\ 2»JIpÝXMÌ\8eù?tµ\92³DÌmëÖ\99²9aV°8Iq[L\ e\8c´Âä:ní¯V: 4\aQkq\17©\85Ãú
+\89\8dº\15Û;\8dªô\9aTqm\8eÕ«\1cIõ>háâÌÉ\1c²µh¿\94bkeÓNÁ\87ß:]\8dR\96ÍÆ?qõÇ>Ó{8õ\15õU\90¯b|\9c\11\ e\9f\96\7f8ÚþNáG\80\ 1\03ªZÝ\rendstream\rendobj\r7 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency>>\rendobj\r11 0 obj\r<</BBox[0.0 12.9895 17.0 -0.010498]/Group 12 0 R/Length 222/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 8 0 R>>>>/Subtype/Form>>stream\r
+0 0 0 rg
+/GS0 gs
+q 1 0 0 1 9.0171 12.9895 cm
+0 0 m
+0 -3 l
+4.983 -3 l
+4.983 -12 l
+-8.017 -12 l
+-8.017 -3 l
+-3 -3 l
+-3 0 l
+-7.017 0 l
+-7.017 -2 l
+-9.017 -2 l
+-9.017 -13 l
+5.983 -13 l
+5.983 -11 l
+7.983 -11 l
+7.983 0 l
+h
+f*
+Q
+\rendstream\rendobj\r12 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r8 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r10 0 obj\r<</Color[20224 32768 65535]/Dimmed false/Editable true/Preview true/Printed true/Title(Layer 1)/Visible true>>\rendobj\r9 0 obj\r<</AIS false/BM/Normal/CA 0.850006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.850006/op false>>\rendobj\r13 0 obj\r<</CreationDate(D:20141021131605-07'00')/Creator(Adobe Illustrator CC \(Macintosh\))/ModDate(D:20141021131605-07'00')/Producer(Adobe PDF library 11.00)/Title(add to photos \(edited\))>>\rendobj\rxref\r0 14\r0000000000 65535 f\r
+0000000016 00000 n\r
+0000000076 00000 n\r
+0000017101 00000 n\r
+0000000000 00000 f\r
+0000017152 00000 n\r
+0000017428 00000 n\r
+0000017754 00000 n\r
+0000018282 00000 n\r
+0000018521 00000 n\r
+0000018394 00000 n\r
+0000017818 00000 n\r
+0000018219 00000 n\r
+0000018643 00000 n\r
+trailer\r<</Size 14/Root 1 0 R/Info 13 0 R/ID[<E2D69684B34C45FEB09C4F193E6EF111><C1B05E620DF14586A358D34222A98938>]>>\rstartxref\r18845\r%%EOF\r
\ No newline at end of file
diff --git a/Source/WebKit2/Resources/CopyImageTemplate.pdf b/Source/WebKit2/Resources/CopyImageTemplate.pdf
new file mode 100644 (file)
index 0000000..a4e1470
--- /dev/null
@@ -0,0 +1,153 @@
+%PDF-1.5\r%âãÏÓ\r
+1 0 obj\r<</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 12806/Subtype/XML/Type/Metadata>>stream\r
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c014 79.151739, 2013/04/03-12:12:15        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <xmp:CreatorTool>Adobe Illustrator CC (Macintosh)</xmp:CreatorTool>
+         <xmp:CreateDate>2014-10-21T13:01:37-07:00</xmp:CreateDate>
+         <xmp:ModifyDate>2014-10-21T13:01:37-07:00</xmp:ModifyDate>
+         <xmp:MetadataDate>2014-10-21T13:01:37-07:00</xmp:MetadataDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>256</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq8&#xA;i/O389bfyQP0Loyx3fmWVAz894rVHFVeQD7TsN1Tw3O1Ayr5W8yedfNnmW4efXNVuL5nNfTkc+ku&#xA;9aJEtI0HsqjFUkxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVlHlP8AM3zz&#xA;5Unjk0bVp44UIJspGMtsw7hoXqu/iKHwOKvrj8ofze0v8wdLk/diz1uzC/XrHlUEHb1Yq7mMnbfd&#xA;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&#xA;nYbM/hsNqllXruKuxV2KuxV2KuxV2Kv/2Q==</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>16.000000</stDim:w>
+            <stDim:h>16.000000</stDim:h>
+            <stDim:unit>Points</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">copy</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DocumentID>uuid:0e2273b0-3d45-fc45-a7a2-95f229b83686</xmpMM:DocumentID>
+         <xmpMM:InstanceID>uuid:e711f8ac-ac9c-4b48-9451-813e4e11f555</xmpMM:InstanceID>
+         <pdf:Producer>Adobe PDF library 11.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\rendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[1.0 1.0 15.0 15.0]/BleedBox[0.0 0.0 16.0 16.0]/Contents 6 0 R/Group 7 0 R/MediaBox[0.0 0.0 16.0 16.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 8 0 R/GS1 9 0 R>>/Properties<</MC0 10 0 R>>/XObject<</Fm0 11 0 R/Fm1 12 0 R>>>>/TrimBox[0.0 0.0 16.0 16.0]/Type/Page>>\rendobj\r6 0 obj\r<</Filter/FlateDecode/Length 107>>stream\r
+H\89Ò÷I¬L-RÐ÷u6PprqVà*ä2P04\ 3!] .Jå
+WÈ\ 3
+ê»\a\e\17sé»å\1a(¸äs\ 5¢\8a\19\f\14@°(\1d$e\b\92*T0\ 4\v\19*\98è\99*\18\1a($ç\82\15år¥i\ 1Õ»ú\ 2m\fä\ 2\b0\0\0Ï\1dM\rendstream\rendobj\r7 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency>>\rendobj\r11 0 obj\r<</BBox[4.0 15.0 15.0 4.0]/Group 13 0 R/Length 281/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 9 0 R>>>>/Subtype/Form>>stream\r
+0 0 0 rg
+/GS0 gs
+q 1 0 0 1 14 4 cm
+0 0 m
+-1 0 l
+-1 1 l
+-0.5 1 l
+-0.224 1 0 1.224 0 1.5 c
+0 9.5 l
+0 9.776 -0.224 10 -0.5 10 c
+-8.5 10 l
+-8.776 10 -9 9.776 -9 9.5 c
+-9 9 l
+-10 9 l
+-10 10 l
+-10 10.552 -9.552 11 -9 11 c
+0 11 l
+0.552 11 1 10.552 1 10 c
+1 1 l
+1 0.448 0.552 0 0 0 c
+f*
+Q
+\rendstream\rendobj\r12 0 obj\r<</BBox[1.0 12.0 12.0 1.0]/Group 14 0 R/Length 210/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 9 0 R>>>>/Subtype/Form>>stream\r
+0 0 0 rg
+/GS0 gs
+q 1 0 0 1 9 9 cm
+0 0 m
+3 0 l
+3 0.05 l
+0 3 l
+h
+f*
+Q
+q 1 0 0 1 8 8 cm
+0 0 m
+0 4 l
+-6 4 l
+-6.552 4 -7 3.552 -7 3 c
+-7 -6 l
+-7 -6.552 -6.552 -7 -6 -7 c
+3 -7 l
+3.552 -7 4 -6.552 4 -6 c
+4 0 l
+h
+f*
+Q
+\rendstream\rendobj\r14 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r9 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r13 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r10 0 obj\r<</Color[20224 32768 65535]/Dimmed false/Editable true/Preview true/Printed true/Title(Layer 1)/Visible true>>\rendobj\r8 0 obj\r<</AIS false/BM/Normal/CA 0.850006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.850006/op false>>\rendobj\r15 0 obj\r<</CreationDate(D:20141021130137-07'00')/Creator(Adobe Illustrator CC \(Macintosh\))/ModDate(D:20141021130137-07'00')/Producer(Adobe PDF library 11.00)/Title(copy)>>\rendobj\rxref\r0 16\r0000000000 65535 f\r
+0000000016 00000 n\r
+0000000076 00000 n\r
+0000012959 00000 n\r
+0000000000 00000 f\r
+0000013010 00000 n\r
+0000013297 00000 n\r
+0000013472 00000 n\r
+0000014732 00000 n\r
+0000014430 00000 n\r
+0000014605 00000 n\r
+0000013536 00000 n\r
+0000013987 00000 n\r
+0000014542 00000 n\r
+0000014367 00000 n\r
+0000014854 00000 n\r
+trailer\r<</Size 16/Root 1 0 R/Info 15 0 R/ID[<C077BE5010DF4E929DC46952A2AEFB7B><2CCABCCA8F1C4885A81B634350A83CD5>]>>\rstartxref\r15036\r%%EOF\r
\ No newline at end of file
diff --git a/Source/WebKit2/Resources/SaveImageToDownloadsTemplate.pdf b/Source/WebKit2/Resources/SaveImageToDownloadsTemplate.pdf
new file mode 100644 (file)
index 0000000..45904e0
--- /dev/null
@@ -0,0 +1,99 @@
+%PDF-1.5\r%âãÏÓ\r
+1 0 obj\r<</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 19798/Subtype/XML/Type/Metadata>>stream\r
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c014 79.151739, 2013/04/03-12:12:15        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <xmp:CreatorTool>Adobe Illustrator CC (Macintosh)</xmp:CreatorTool>
+         <xmp:CreateDate>2014-10-21T13:06:20-07:00</xmp:CreateDate>
+         <xmp:ModifyDate>2014-10-21T13:06:20-07:00</xmp:ModifyDate>
+         <xmp:MetadataDate>2014-10-21T13:06:20-07:00</xmp:MetadataDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>256</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FUm8y+cvKnle1F15h1a10uEglPrMqoz06iNCebn2UHFXjHmr/nMz8u9NLxaBY3mvTLXjJQW&#xA;du3+zlDS/wDJLFXlHmH/AJzM/M2/Zk0iz0/R4T9hlja5mHzeVvTP/IvFXn+r/nz+cWqkm682agnL&#xA;qLSQWY616WwhxVit75n8y3zcr3Vr26Y9TNcSyHpT9pj2xVLMVdiqZ2XmfzLYtystWvbVh0MNxLGe&#xA;lP2WHbFWVaR+fP5xaUQbXzZqD8egu5BeDrXpcibFXoHl7/nMz8zbBlTV7PT9YhH22aNraY/J4m9M&#xA;f8i8Ver+Vf8AnMz8u9SKRa/Y3mgzNTlJQXluv+ziCy/8ksVez+WvOXlTzRam68vata6pCAC/1aVX&#xA;ZK9BIgPND7MBiqc4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWC/mN+dX5f+QIGGt6&#xA;gJNRpWLSbWkt21RUVSoEYP8ANIVGKvl/8wP+cvfP2utJa+Wo08t6cagSR0mvHXp8UzDinj8Cgj+Y&#xA;4q8O1DUtR1K8kvdRupr28mNZbm4kaWVz4s7lmP0nFUNirsVdirsVXxxSSuI4kZ5G+yigkn5AYq6S&#xA;KSJzHKjJIv2kYEEfMHFVmKuxV2KuxVE6fqWo6beR3unXU1leQmsVzbyNFKh8VdCrD6Dir3H8v/8A&#xA;nL3z9oTR2vmWNPMmnCgMklIbxF6fDMo4v4/GpJ/mGKvqD8ufzq/L/wA/wKNE1AR6jSsuk3VIrtaC&#xA;polSJAP5oywxVnWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVL9f8w6J5e0qfVtbvYrDTrZeU1zM&#xA;3FR4Ad2Y9Ao3J2GKvkr82v8AnLzW9WabSfIavpOm7o+ryAfXJR0rEu4gU+O79/hO2KvnS4uLi5nk&#xA;uLiV5p5WLyyyMXdmO5ZmNSScVU8VVILee4mSC3jaaeVgscUalnZjsAqipJOKvWfJv/OLf5t+ZFjn&#xA;m09NCsn3E+qMYXp/xgUPOD/rIPnir2Xy1/zhN5VtgknmPXrvUZBQtDZolpFX+Ul/Xdh7jjir0vRf&#xA;+cdPyY0gL6Hli2uXWlZL1pLvkR3Kzs6fctMVZhp/k/ylpyhNP0Sws1AoFt7WGIUoB0RR4DFU3AAF&#xA;BsB0GKuIBFDuD1GKpRqHk/ylqKlNQ0SwvFIoVuLWGUUoR0dT4nFWH61/zjp+TGrhvX8sW1s7VpJZ&#xA;NJacSe4WBkT71pirzTzL/wA4TeVbkPJ5c16706Q1Kw3iJdxV/lBT0HUe55Yq8a85f84t/m35bWSe&#xA;HT012yTcz6Wxmen/ABgYJOT/AKqH54q8mnt57eZ4LiNoZ4mKyRSKVdWGxDKaEEYqp4qqW9xcW08d&#xA;xbyvDPEweKWNijqw3DKwoQRir6L/ACl/5y81vSWh0nz4r6tpuyJq8YH1yIdKyrsJ1Hjs/f4jtir6&#xA;10DzDonmHSoNW0S9iv8ATrleUNzC3JT4g91YdCp3B2OKphirsVdirsVdirsVdirsVdirsVdirCPz&#xA;U/N3yr+XGjfXdXk9a/nDfo7SomHr3DD7+EYP2nIoPc0GKvhX8zPzY83fmHq5vtcuONrGx+paZCSL&#xA;a3Xp8Kk7tTq7bn5bYqwzFVa0s7u9uorSzgkubqdgkMEKtJI7HoqqoJJPgMVfQ/5Zf84d+YtWEWoe&#xA;d7ltEsWow02Di966nf42PKOH6QzeIGKvp3yR+V3kPyTbiLy5pENpLx4yXhHqXMn+vO/Jz8q08Bir&#xA;KsVdirsVdirsVdirsVdirsVdirFfO/5XeQ/O1uYvMekQ3cvHjHeAencx/wCpOnFx8q08Rir5i/M3&#xA;/nDzzDpCy6j5IuW1uxWrHTZ+KXqKN/gYcY5voCt2AOKvni7s7uyupbS8gktrqBik0EytHIjDqrKw&#xA;BBHgcVUcVZn+Wf5sebvy81cX2h3HK1kYfXdMmJNtcL0+JQdmp0ddx8tsVfdX5V/m75V/MfRvrukS&#xA;ejfwBf0jpUrD17dj93OMn7LgUPsajFWb4q7FXYq7FXYq7FXYq7FXYq82/Oz87NF/LPRUd0W+8wXy&#xA;t+jNM5UrTYzTEbrEp+ljsO5VV8F+avNeveatcudc127e81G6aryN0Vf2UReiIvRVGwxVKMVZ5+Vf&#xA;5NecPzH1Iw6TD9X0uFgt9rE4It4u5UU/vJKdEX6aDfFX2z+V35J+SPy7s1/RVsLnV2Xjc6zcANcP&#xA;X7QQ9IkP8qfTU74qz/FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwD80fyT8kfmJZt+lbYW2rqvG&#xA;21m3AW4Sn2Q56SoP5X+ih3xV8Tfmp+TXnD8uNSEOrQ/WNLmYrY6xACbeXuFNf7uSnVG+io3xVgeK&#xA;pv5V81695V1y21zQrt7PUbVqpIvRl/aR16OjdGU7HFX3p+Sf52aL+Zmiu6Itj5gsVX9J6ZyrSuwm&#xA;hJ3aJj9KnY9iyr0nFXYq7FXYq7FXYq7FWEfm7+amjflx5Vk1e9pPfzcotK07lRrien3iNKgu3Ye5&#xA;AxV+fPmvzVrnmrXrvXdcuWutRvH5SOfsqP2URf2UQbKo6DFUoxV7R+Qn/OPGpfmBcLrWtepY+UYH&#xA;oZAOMt4yneOAnog6PJ9A3rxVfb2iaHpGhaXb6Vo9pHY6darwgtoV4oo6/SSdyTuT1xVHYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUDreh6Rrul3GlaxaR32nXS8J7aZeSMOv0EHcEbg9MVfEP&#xA;59/848al+X9w2taL6l95RnegkI5S2bMdo5yOqHokn0HenJV4viqb+VPNWueVdetNd0O5a11GzflG&#xA;4+yw/aR1/aRxsynqMVfoN+UX5qaN+Y/lWPV7KkF/Dxi1XTuVWt56feY3oSjdx7gjFWb4q7FXYq7F&#xA;XYql/mHX9K8vaJe63q0622nWETTXMzdlXsB3ZjsoG5OwxV+d35sfmZq/5h+brjXL4tHarWHTLKvw&#xA;29sCSq7bcj9pz3PtTFWGYq9o/wCcePyEuPzA1L9Na0rweUbGQCQiqteSruYIz2Qf7scfIb7qq+57&#xA;W1trS2itbWJILaBFjggjUIiIgoqqooAABQAYqq4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FVK6tba7tpbW6iSe2nRo54JFDo6OKMrKaggg0IOKvhj/nIf8hLj8v8AUv01oqvP5RvpCIya&#xA;s1nK24gkPdD/ALrc/I77sq8XxVmf5T/mZq/5eebrfXLEtJatSHU7Kvw3FsSCy77ch9pD2PtXFX6I&#xA;+Xtf0rzDollrekzrc6dfxLNbTL3VuxHZlOzA7g7HFUwxV2KuxV2Kvjr/AJy8/NptW1tfIekzf7jd&#xA;JcSau6HaW8p8MRp1WAHf/LO+6jFXzhirPPya/KvUvzH84Q6TCWh0u3pPrF8o/urcGlFJ29ST7KD6&#xA;egOKv0K0PRNL0LSLTR9Kt1tdOsY1htoE6Ki/Pck9STuTviqOxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KoHXNE0vXdIu9H1W3W606+jaG5gfoyN8twR1BG4O+Kvz1/OX8q9S/Ljz&#xA;hNpMxabS7is+j3zD+9tyaUYjb1I/suPp6EYqwPFX0f8A84h/m02k623kPVpv9xurOZNIdztFeU+K&#xA;IV6LOBt/ljbdjir7FxV2KuxVgv51fmNB5A/L/UNbDD9IyD6rpMRoeV3KDwND1EYBkb2XFX503FxP&#xA;c3EtxcSNLPM7SSyuaszuaszE9SScVXWdpdXt3BZ2kTT3VzIsMEKCrPJIwVVUdySaDFX6H/kn+V1n&#xA;+Xfki20riravcgXGs3K787hhugbukQ+Bfv6k4qz/ABV2KuxV2KuxV2KuxV2KuxV+VeKuxV2KuxV+&#xA;qmKuxV2KuxV2KuxV2KuxV2KsA/Oz8rrP8xPJFzpXFV1e2BuNGuW24XCjZC3ZJR8Dff1AxV+eF5aX&#xA;Vldz2d3E0F1bSNDPC4oySRsVZWHYgihxVbb3E9tcRXFvI0U8LrJFKhoyuhqrKR0IIxV+i35K/mNB&#xA;5/8Ay/0/Wyw/SMY+q6tEKDjdxAczQdBICJF9mxVnWKuxV8S/85e/mA2u+fo/LVrJXTvLaenIAfhe&#xA;8mAaZtv5F4pv0IbxxV4Lir6N/wCcO/yyGreYrnzvqEXKx0RvQ00MKq9661Z9/wDfMbA/6zA9sVfY&#xA;+KuxV2KuxV2KuxV2KuxV2KuxV+VeKuxV2KuxV+qmKuxV2KuxV2KuxV2KuxV2KuxV8cf85iflkNJ8&#xA;xW3nfT4uNjrbehqQUUVL1Fqr7f7+jUn/AFlJ74q+csVe9f8AOIX5gNoXn6Ty1dSU07zInpxgn4Uv&#xA;IQWhbf8AnXkm3UlfDFX21iqTecvMtr5X8qat5hugDDpdrLc8Cac2RSUjB8Xeij54q/M3UtQvNS1G&#xA;61G9kM15ezSXFzKeryysXdj82YnFVK3gmuJ47eBGlnmZY4o1FWZ2NFUAdSScVfpN+V3ki38k+Q9I&#xA;8uRBfVtIQbyRf92XMnxzv9Lsae1BirKsVdirsVdirsVdirsVdirsVdir8q8VdirsVdir9VMVdirs&#xA;VdirsVdirsVdirsVdirFfzR8kW/nbyHq/lyUL6t3CTZyN/uu5j+OB/odRX2qMVfmzcQTW88lvOjR&#xA;Tws0csbCjK6mjKQehBGKqum6heabqNrqNlIYbyymjuLaUdUliYOjD5MoOKv0y8m+ZbXzR5U0nzDa&#xA;gCHVLWK54A14M6gvGT4o9VPyxV4x/wA5meajpv5d2OgRPxm168HqLX7VvZgSv/yVaLFXxXir13/n&#xA;FvyavmT829Pmnj52WhI2qTg9OcJCwfSJ3RvoOKvvfFXYq7FXYq7FXYq7FXYq7FXYq7FX5V4q7FXY&#xA;q7FX6qYq7FXYq7FXYq7FXYq7FXYq7FXYq+CP+cpPJq+W/wA29Qmgj4WWuouqQAdOcxKz/SZ0dvpG&#xA;KvIsVfan/OGfmo6l+Xd9oEr8ptBvD6a1+zb3gMqf8lVlxV5R/wA5meYWv/zNs9IRqw6Pp8asnhNc&#xA;s0rn6Y/TxV4Fir7C/wCcJvLQtvKuveY5EpJqN2lnCxG/pWicyV9meeh/1cVfSWKuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KvyrxV2KuxV2Kv1UxV2KuxV2KuxV2KuxV2KuxV2KuxV82/wDObPloXPlXQfMcaVk0&#xA;67ezmYDf0rtOYLeyvBQf62Kvj3FXvv8Azhn5haw/M280h2pDrGnyKqeM1syyofoj9TFXn/586udV&#xA;/OLzZdE8uGoSWgO/SzAth1/4w4qwLFX6G/8AOOmijSPyY8sQceL3Ns17IaULfW5GnUn/AGDqPlir&#xA;0fFXYq7FXYq7FXYq7FXYq7FXYq7FX5V4q7FXYq7FX6qYq7FXYq7FXYq7FXYq7FXYq7FXYq84/wCc&#xA;i9FGr/kx5ng48ntrZb2M0qV+qSLOxH+wRh8sVfnlirPfyG1c6V+cXlO6B489QjtCd+l4DbHp/wAZ&#xA;sVYr5nvWvvMurXrbtdXtxMTt1klZu23fFUsxV+nvk/T107ylomnoAFs7C1t1ApSkUKoOgHh4Yqm+&#xA;KuxV2KuxV2KuxV2KuxV2KuxV2KvyrxV2KuxV2Kv1UxV2KuxV2KuxV2KuxV2KuxV2KuxVKPOGnrqP&#xA;lLW9PcAreWF1bsDSlJYWQ9QfHwxV+YWKpn5YvWsfMuk3q7Na3tvMDt1jlVu+3bFUsxVfFG8siRRj&#xA;lI7BUXxJNAMVfqiAAKDYDoMVdirsVdirsVdirsVdirsVdirsVdir8q8VdirsVdir9VMVdirsVdir&#xA;sVdirsVdirsVdirsVcQCKHcHqMVfldLG8UjxSDjIjFXXwINCMVWYq7FV8UjxSJLGeMiMGRvAg1Bx&#xA;V+qIIIqNwehxV2KuxV2KuxV2KuxV8Tf85P8A5HHyhq7ea9At6eWdTl/0mCMfDZ3TmvGg+zFJ1TsD&#xA;8O3w1VeCYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXvf/OMH5HHzfq6+a9ft6+WdMl/0aCQfDeXSGvGh&#xA;+1FH1fsT8O/xUVfbOKuxV2KuxV2KuxVxIAqdgOpxV+V0sjyyPLIeUjsWdvEk1JxVZiqZ+Z7JrHzL&#xA;q1k2zWt7cQkbdY5WXtt2xVLMVfp75P1BdR8paJqCEFbywtbhSKUpLCrjoT4+OKpvirsVdirsVdir&#xA;sVQOuaJpeu6Rd6Pqtut1p19G0NzA/Rkb5bgjqCNwd8Vfnt+cv5U6p+W/m2XS5+U+lXPKbR78jaaC&#xA;v2Wpt6kdeLj6ehGKsCxV2KuxV2KuxV2KuxV2KuxV2Ks9/Jr8qdU/MjzbFpcHKDSrbjNrF+BtDBX7&#xA;K129SSnFB9PQHFX6E6Homl6FpFpo+lW62unWMaw20CdFRfnuSepJ3J3xVHYq7FXYq7FXYq7FUo84&#xA;aguneUtb1ByAtnYXVwxNKUihZz1I8PHFX5hYqmfliya+8y6TZLu11e28IG3WSVV77d8VZV+fOkHS&#xA;vzi82WpHHnqEl2Bv0vALkdf+M2KsCxV+hv8AzjprQ1f8mPLE/Lk9tbNZSCtSv1SRoFB/2CKflir0&#xA;fFXYq7FXYq7FXYq7FWHfmt+Wmj/mH5RuNCv6RXArLpt7SrW9yoIRx4qa0de496HFX54+Z/LOs+WN&#xA;fvdB1mA22o2EhinjPQ03V0P7SOtGVu4OKpVirsVdirsVdirsVdirsVTXyx5Z1nzPr9loOjQG51G/&#xA;kEUEY6Cu7O5/ZRFqzN2AxV+h35U/lpo/5eeUbfQrCktwaS6le0o1xcsAHc+CilEXsPepxVmOKuxV&#xA;2KuxV2KuxV2KvOP+ci9aGkfkx5nn5cXubZbKMVoW+tyLAwH+wdj8sVfnlirPfyG0g6r+cXlO1A5c&#xA;NQjuyN+lmDcnp/xhxV6B/wA5meXmsPzNs9XRaQ6xp8bM/jNbM0Tj6I/TxV4Fir7C/wCcJvMoufKu&#xA;veXJHrJp12l5CpO/pXacCF9leCp/1sVfSWKuxV2KuxV2KuxV2KuxV4r/AM5J/kivnvQf03o0I/xZ&#xA;pMZ9FVABu7cfEbcn+YbtH71H7VQq+F3R0dkdSrqSGUihBHUEYqtxV2KuxV2KuxV2KrkR3dURSzsQ&#xA;FUCpJPQAYq+6P+cbPyRXyJoP6b1mEf4s1aMesrAE2lufiFuD/Mdmk96D9mpVe1Yq7FXYq7FXYq7F&#xA;XYq7FXzb/wA5s+ZRbeVdB8uRvSTUbt7yZQd/StE4AN7M89R/q4q+PcVe+/8AOGfl5r/8zbzV3WsO&#xA;j6fIyv4TXLLEg+mP1MVer/8AOZnlU6l+Xdjr8ScptBvB6jU+zb3gET/8lVixV8V4q9d/5xb85L5b&#xA;/NvT4Z5OFlrqNpc5PTnMQ0H0mdEX6Tir73xV2KuxV2KuxV2KuxV2KuxV8l/85X/kd9Vmm/MLy7b/&#xA;AOjTNXzDaRj7EjGn1tVH7LnaT3+LuxCr5fxV2KuxV2KuxV2KvqD/AJxQ/I761ND+YXmK3/0aFq+X&#xA;rSQfbkU0+tsp/ZQ7R+/xdlJVfWmKuxV2KuxV2KuxV2KuxV2Kvgj/AJyk85L5k/NvUIYJOdloSLpc&#xA;BHTnCS0/0id3X6BiryLFX2p/zhn5VOm/l3fa/KnGbXrw+m1PtW9mDEn/ACVaXFXs/nLy1a+aPKmr&#xA;eXrogQ6pay23MivBnUhJAPFHow+WKvzN1LT7zTdRutOvYzDeWU0lvcxHqksTFHU/JlIxVSt55ree&#xA;O4gdop4WWSKRTRldTVWBHQgjFX6Tfld53t/O3kPSPMcRX1buEC8jX/ddzH8E6fQ6mntQ4qyrFXYq&#xA;7FXYq7FXYq7FXYqp3Ntb3VvLbXMSzW86NHNDIAyOjjiysp2IINCMVfBH/OQv5L3H5d+ZvrFhGz+V&#xA;tVdn0yY1b0X+01q7eKfsE/aXxIbFXk2KuxV2KuxV6z/zj1+S9x+Ynmb6xfxsnlbSnV9TmFV9Z/tL&#xA;ao3i/wC2R9lfAlcVfe9tbW9rbxW1tEsNvAixwwxgKiIg4qqqNgABQDFVTFXYq7FXYq7FXYq7FXYq&#xA;xX80fO9v5J8h6v5jlK+raQkWcbf7suZPggT6XYV9qnFX5s3E81xPJcTu0s8zNJLIxqzOxqzEnqST&#xA;iqrpun3mpaja6dZRma8vZo7e2iHV5ZWCIo+bMBir9MvJvlq18r+VNJ8vWpBh0u1ituYFObIoDyEe&#xA;LvVj88VTnFXxL/zl7+X7aF5+j8y2sdNO8yJ6khA+FLyEBZl2/nXi+/UlvDFXguKvo3/nDv8AM0aT&#xA;5iufJGoS8bHW29fTSxoqXqLRk3/39GoH+soHfFX2PirsVdirsVdirsVdirsVdiqR+dvJuh+cvLN7&#xA;5e1qL1bK8SnIUDxSDdJYz2dG3H3HauKvzt/MTyDrfkTzXd+XtXWssB5W1yARHcQMT6c0dezU6djU&#xA;dRirGcVdirJvy78g6357812nl7SFpLOeVzckEx28CkepNJTstenc0HU4q/RLyT5N0Pyb5ZsvL2ix&#xA;elZWaU5GheWQ7vLIe7u25+4bUxVPMVdirsVdirsVdirsVdirsVfHH/OYf5mrq/mG28kadLysdEb1&#xA;9SKmqveutFTb/fMbEf6zEHpir5yxV71/ziF+X7a75+k8y3UddO8tp6kZI+F7yYFYV3/kXk+3QhfH&#xA;FX21irsVYL+dX5cwef8A8v8AUNECj9Ixj61pMpoON3EDwFT0EgJjb2bFX503FvPbXEtvcRtFPC7R&#xA;yxOKMroaMrA9CCMVXWd3dWV3BeWkrQXVtIs0EyGjJJGwZWU9iCKjFX6H/kn+aNn+Ynki21Xkq6vb&#xA;AW+s2y7cLhRu4Xsko+Nfu6g4qz/FXYq7FXYq7FXYq7FXYq7FXmv57fk9Y/mR5VaCIJD5i08NLo94&#xA;2w5kfFBIf99y03/lNG7UKr8/dQ0+906+uLC+he2vbWRobm3kHF0kQ8WVh4gjFXafp97qN9b2FjC9&#xA;ze3Uiw21vGOTvI54qqjxJOKv0C/In8nrH8t/KqwShJvMWoBZdYvF3HMD4YIz/vuKu38xq3egVelY&#xA;q7FXYq7FXYq7FXYq7FXYqwD87PzRs/y78kXOq8lbV7kG30a2bfncMNnK90iHxt93UjFX54Xl3dXt&#xA;3PeXcrT3VzI008zmrPJIxZmY9ySanFVtvbz3NxFb28bSzzOscUSCrM7miqoHUknFX6Lfkr+XMHkD&#xA;8v8AT9EKj9IyD61q0ooeV3KBzFR1EYAjX2XFWdYq7FXYq+Ov+cvPylbSdbXz5pMP+43VnEerog2i&#xA;vKfDKadFnA3/AMsb7sMVfOGKs8/Jr81NS/LjzhDq0IabS7ikGsWKn+9tya1UHb1I/tIfo6E4q/Qr&#xA;Q9b0vXdItNY0q4W606+jWa2nToyN89wR0IO4O2Ko7FXYq7FXYq7FXYq7FXYq7FXzj/zlV+R36csZ&#xA;fPfl63rrNjHXWbWMb3NvGP75QOskKjf+ZPdQCq7/AJxV/I79B2MXnvzDb01m+jro1rIN7a3kH98w&#xA;PSSZTt/KnuxAVfR2KuxV2KuxV2KuxV2KuxV2KoHXNb0vQtIu9Y1W4W106xjaa5nfoqL8tyT0AG5O&#xA;2Kvz1/OX81NS/MfzhNq0waHS7esGj2LH+6twa1YDb1JPtOfo6AYqwPFX0f8A84h/lK2ra23nzVof&#xA;9xukuY9IRxtLeU+KUV6rADt/lnbdTir7FxV2KuxV2Kpf5h0DSvMOiXuiatAtzp1/E0NzC3dW7g9m&#xA;U7qRuDuMVfnd+bH5Z6v+Xnm640O+DSWrVm0y9p8NxbEkK223IfZcdj7UxVhmKvaP+cePz7uPy/1L&#xA;9C60zz+Ub6QGQCrNZytsZ4x3Q/7sQfMb7Mq+57W6tru2iurWVJ7adFkgnjYOjo4qrKwqCCDUEYqq&#xA;4q7FXYq7FXYq7FXYq7FXEAih3B6jFXAACg2A6DFXYq7FXYq7FXYq7FXYq7FVK6ura0tpbq6lSC2g&#xA;RpJ55GCIiIKszMaAAAVJOKvhj/nIf8+7j8wNS/Quis8HlGxkJjBqrXkq7CeQdkH+60PzO+yqvF8V&#xA;Zn+U/wCWer/mH5ut9DsQ0dqtJtTvafDb2wIDNvtyP2UHc+1cVfoj5e0DSvL2iWWiaTAttp1hEsNt&#xA;CvZV7k92Y7sTuTucVTDFXYq7FXYq7FWEfm7+VejfmP5Vk0i9pBfw8pdK1HjVreen3mN6AOvce4Bx&#xA;V+fPmvyrrnlXXrvQtctmtdRs34yIfssP2XRv2kcbqw6jFUoxV7R+Qn/OQ+pfl/cLoutepfeUZ3qY&#xA;weUtmzHeSAHqh6vH9I3ryVfb2ia5pGu6Xb6ro93HfaddLzguYW5Iw6fQQdiDuD1xVHYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FUDreuaRoWl3Gq6xdx2OnWq857mZuKKOn0knYAbk9MVfEP59&#xA;/wDOQ+pfmBcNoui+pY+UYHqIyeMt4ynaScDog6pH9J3pxVeL4qm/lTyrrnmrXrTQtDtmutRvH4xo&#xA;PsqP2ndv2UQbsx6DFX6DflF+Vejflx5Vj0iypPfzcZdV1HjRrien3iNKkIvYe5JxVm+KuxV2KuxV&#xA;2KuxV2KvNvzs/JPRfzM0VEd1sfMFirfozU+NaV3MMwG7RMfpU7juGVfBfmrypr3lXXLnQ9dtHs9R&#xA;tWo8bdGX9l0bo6N1VhscVSjFWeflX+cvnD8uNSM2kzfWNLmYNfaPOSbeXsWFP7uSnR1+mo2xV9s/&#xA;ld+dnkj8xLNf0Vci21dV5XOjXBC3CU+0UHSVB/Mn00O2Ks/xV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KsA/NH87PJH5d2bfpW5Fzq7LyttGtyGuHr9kuOkSH+Z/oqdsVfE35qfnL5w/MfUhNq031fS4&#xA;WLWOjwEi3i7BjX+8kp1dvooNsVYHiqb+VfKmveatcttD0K0e81G6aiRr0Vf2nduiIvVmOwxV96fk&#xA;n+Sei/lnorojrfeYL5V/Sep8aVpuIYQd1iU/Sx3PYKq9JxV2KuxV2KuxV2KuxV2KuxVhH5qflF5V&#xA;/MfRvqWrx+jfwBv0dqsSj17dj93OMn7SE0PsaHFXwr+Zn5T+bvy81c2OuW/K1kY/UtThBNtcL1+F&#xA;iNmp1Rtx8t8VYZiqtaXl3ZXUV3ZzyW11AweGeFmjkRh0ZWUggjxGKvof8sv+cw/MOkLFp3ne2bW7&#xA;FaKNSg4peoo2+NTxjm+kq3ck4q+nfJH5o+Q/O1uJfLmrw3cvHlJZk+ncx/68D8XHzpTwOKsqxV2K&#xA;uxV2KuxV2KuxV2KuxV2KsV87/mj5D8k25l8x6vDaS8eUdmD6lzJ/qQJyc/OlPE4q+YvzN/5zD8w6&#xA;usuneSLZtEsWqp1Kfi966nb4FHKOH6CzdwRir54u7y7vbqW7vJ5Lm6nYvNPMzSSOx6szMSST4nFV&#xA;HFWZ/ln+U/m78w9XFjodvxtY2H13U5gRbW69fiYDdqdEXc/LfFX3V+Vf5ReVfy40b6lpEfrX84X9&#xA;I6rKo9e4YffwjB+ygNB7mpxVm+KuxV2KuxV2KuxV2KuxV2KuxV2Kpfr/AJe0TzDpU+k63ZRX+nXK&#xA;8ZraZeSnwI7qw6hhuDuMVfJX5tf84h63pLTat5DZ9W03d30iQj65EOtIm2E6jw2ft8R3xV86XFvc&#xA;W08lvcRPDPExSWKRSjqw2KspoQRiqniqpBcT28yT28jQzxMGjljYq6sNwVYUIIxV6z5N/wCcpPzb&#xA;8trHBNqCa7ZJsINUUzPT/jOpScn/AFnPyxV7L5a/5zZ8q3ISPzHoN3p0hoGms3S7ir/MQ/oOo9hy&#xA;xV6Xov8AzkX+TGrhfQ8z21s7UrHerJacSexadUT7mpirMNP84eUtRUPp+t2F4pFQ1vdQyilAeqMf&#xA;EYqm4IIqNwehxVxIAqdgOpxVKNQ84eUtOUvqGt2FmoFS1xdQxClCersPA4qw/Wv+ci/yY0gN6/me&#xA;2uXWtI7JZLvkR2DQK6fe1MVeaeZf+c2fKtsHj8uaDd6jIKhZrx0tIq/zAJ67sPY8cVeNecv+cpPz&#xA;b8yLJBDqCaFZPsYNLUwvT/jOxecH/VcfLFXk09xPcTPPcSNNPKxaSWRizsx3JZjUknFVPFVS3t7i&#xA;5njt7eJ5p5WCRRRqXdmOwVVFSScVfRf5S/8AOIet6s0OrefGfSdN2dNIjI+uSjrSVtxAp8N37fCd&#xA;8VfWugeXtE8vaVBpOiWUVhp1svGG2hXio8Se7MepY7k7nFUwxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KsF/Mb8lfy/8/wMdb08R6jSkWrWtIrtaCgq9CJAP5ZAwxV8v/mB/wA4heftCaS68tSJ5k04&#xA;VIjjpDeIvX4oWPF/D4GJP8oxV4dqGm6jpt5JZajazWV5CaS21xG0UqHwZHCsPpGKobFXYq7FXYqv&#xA;jlkicSROySL9l1JBHyIxV0kskrmSV2eRvtOxJJ+ZOKrMVdirsVdiqJ0/TdR1K8jstOtZr28mNIra&#xA;3jaWVz4KiBmP0DFXuP5f/wDOIXn7XWjuvMsieW9ONCY5KTXjr1+GFTxTw+NgR/KcVfUH5c/kr+X/&#xA;AJAgU6Jp4k1GlJdWuqS3bVFDR6ARg/yxhRirOsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdiqTeZfJvlTzRai18w6Ta6pCAQn1mJXZK9TG5HND7qRirxjzV/wA4Z/l3qReXQL680GZq8Y6i&#xA;8t1/2EpWX/kriryjzD/zhn+ZtgzPpF5p+sQj7CrI1tMfmkq+mP8AkZirz/V/yG/OLSiRdeU9Qfj1&#xA;NpGLwdadbYzYqxW98seZbFuN7pN7asOomt5Yz0r+0o7YqlmKuxVM7Lyx5lvm42Wk3t0x6CG3lkPS&#xA;v7KntirKtI/Ib84tVIFr5T1BOXQ3cYsx1p1uTDir0Dy9/wA4Z/mbfsr6veafo8J+2rSNczD5JEvp&#xA;n/kZir1fyr/zhn+XemlJdfvrzXplpyjqLO3b/YRFpf8Akrir2fy15N8qeV7U2vl7SbXS4SAH+rRK&#xA;jPToZHA5ufdicVTnFXYq7FXYq7FXYq7FXYq7FXYq/wD/2Q==</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>16.000000</stDim:w>
+            <stDim:h>16.000000</stDim:h>
+            <stDim:unit>Points</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">save to downloads</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DocumentID>uuid:9136618f-5953-6248-ba3d-5f8c0fda7220</xmpMM:DocumentID>
+         <xmpMM:InstanceID>uuid:45b75117-5981-534c-a785-ff7840262c69</xmpMM:InstanceID>
+         <pdf:Producer>Adobe PDF library 11.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\rendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[0.0 0.0 16.0 16.0]/BleedBox[0.0 0.0 16.0 16.0]/Contents 6 0 R/MediaBox[0.0 0.0 16.0 16.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 7 0 R>>/Properties<</MC0 8 0 R>>>>/TrimBox[0.0 0.0 16.0 16.0]/Type/Page>>\rendobj\r6 0 obj\r<</Filter/FlateDecode/Length 223>>stream\r
+H\89TQ=o\ 3!\fÝý+<GÂg\1fÐãÖ&U\97f\882d®P>\86¤R.Sþ}\f\1c× ¾\9e\1fö³\rÝÏïó8a·]3~nÖ\bw`\94\8f4\8d®é\b\aüS*\8dé\fÝ÷\9eñü\80;J¦\ 4\ 32\8dÁz\8c·ìv\ 3c)\f\19\88e@Kâ¤\1ae\8f0\9bÂ\14Æ\1eç\10qÄÖ&Ù\ 2"4|\13ÒʽgªéÓ\88©\e\9f/µ0GNBµ\8d"!§\95+ZÊ
\93\1f\ 3ξ&7\97z) BÃWï\7f\81E´Éµ\14\11á´\82ÝÛó\8d\1a»¼\1c£Ã+\98¾\1e\9c\ e\0Á\8c¯ÐÏÌ¥\88}mõÛvð\12`\0\89%WÐ\rendstream\rendobj\r8 0 obj\r<</Color[20224 32768 65535]/Dimmed false/Editable true/Preview true/Printed true/Title(Layer 1)/Visible true>>\rendobj\r7 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r9 0 obj\r<</CreationDate(D:20141021130620-07'00')/Creator(Adobe Illustrator CC \(Macintosh\))/ModDate(D:20141021130620-07'00')/Producer(Adobe PDF library 11.00)/Title(save to downloads)>>\rendobj\rxref\r0 10\r0000000000 65535 f\r
+0000000016 00000 n\r
+0000000076 00000 n\r
+0000019951 00000 n\r
+0000000000 00000 f\r
+0000020002 00000 n\r
+0000020232 00000 n\r
+0000020649 00000 n\r
+0000020523 00000 n\r
+0000020761 00000 n\r
+trailer\r<</Size 10/Root 1 0 R/Info 9 0 R/ID[<D37224960EED4540861D3932BC44E457><56658A77C5754A34BFB896834B48AC10>]>>\rstartxref\r20955\r%%EOF\r
\ No newline at end of file
diff --git a/Source/WebKit2/Resources/ShareImageTemplate.pdf b/Source/WebKit2/Resources/ShareImageTemplate.pdf
new file mode 100644 (file)
index 0000000..daab21a
--- /dev/null
@@ -0,0 +1,100 @@
+%PDF-1.5\r%âãÏÓ\r
+1 0 obj\r<</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 11864/Subtype/XML/Type/Metadata>>stream\r
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.5-c014 79.151739, 2013/04/03-12:12:15        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <xmp:CreatorTool>Adobe Illustrator CC (Macintosh)</xmp:CreatorTool>
+         <xmp:CreateDate>2014-10-21T13:04:02-07:00</xmp:CreateDate>
+         <xmp:ModifyDate>2014-10-21T13:04:02-07:00</xmp:ModifyDate>
+         <xmp:MetadataDate>2014-10-21T13:04:02-07:00</xmp:MetadataDate>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>176</xmpGImg:width>
+                  <xmpGImg:height>256</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACwAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYqgdc1vStC0i71jVrlLTTbKMy3NxJ9lVHy3JPQAbk7DFXwN+dX536/+YuuzBJZrPyxA3HTtKDE&#xA;KVX/AHdOF2eRuu/2eg8SqlX5V/m35o/LvXob/TZ3m01mA1DSXc+hPGT8Xw9FkA+y4FQfEVBVfoF5&#xA;N84aF5w8uWfmDRJ/XsbxOQBoHjcfbikUE8XQ7MPu23xVOsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVU7i4gtreW5uJFht4UaSaZyFREQVZmY7AACpOKvhf/AJyK/Pefz/q50bRpGj8o6fIf&#xA;RG6m8mWo+sODQhf99qfmdzQKvF8Vdir0/wDIn86NR/LbzFWYvc+WtQZV1WxBqR2FxED0kT/hhsex&#xA;Cr770nVdO1fTLXU9NuEurC9jWa1uIzVXjcVUjFUVirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVfHP8Azk9+f/6euJ/JHla5rodu/HV7+M7XcqEfuYz/AL6jYbn9s/5I+JV844q7FXYq7FXuf/ON&#xA;v58yeSNTXy3r8xbynfyfDK2/1Gd/92j/AIqc/wB4O32h3DKvt+OSOWNZI2DxuAyOpBVlIqCCOoOK&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdir5k/5yi/P/wDR8dz5C8q3P+nyAxa9qER/uUYENaxn&#xA;/fjD+8YfZHw/aJ4qvkbFUbo+japrOpQaZpds93fXLcYYIxUmgqT7BQCWJ2A3OKoLFXYqnnnPybr3&#xA;k7zFd6BrkBgvrRqVFfTlQ/YliYgckcbg/wAcVSPFX09/zi5+f31J7byD5quaWTkR6DqMrUETHpay&#xA;Mx+wekR7H4elKKvrbFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXhn/ADkj+fkfkjTn8t+Xpg3m2+j+&#xA;OZSD9QhcCkjf8Wup/dr2+0f2Qyr4gkkklkaSRi8jks7sSWLE1JJPUnFVSzs7u9u4LOzhe4u7mRYr&#xA;eCMFneRzxVVUbkkmgxV9x/kj+RVp+XnlG81PVUSbzdqFpJ9bl2YWsTJX6tGwJHUfGw+0fYDFXwti&#xA;rsVfoT+eX5MaX+ZPlwogS28yWKs2k6gRTfc+hMQCTE5/4E7juCq+A9Z0bVNF1W60nVbZ7TUbKQxX&#xA;NvIKMrr/AA7gjYjcYqgwSDUbEYq+y/8AnGL8/v8AElrD5L80XNfMFsnHS72U73kKL/dux6zoB1/b&#xA;XfqCSq+iMVdirsVdirsVdirsVdirsVdirsVeXfnz+den/lt5e4WxS480agjDS7I7hBuDczD/AH2h&#xA;6D9pthtyIVfA2qapqGq6jc6lqVw91f3kjTXNxKeTu7mpYnFUMqszBVBZmNFUbkk4q+0v+caPyAXy&#xA;paReb/M1v/zst1HWxtJBvZQuOrKRtO4+1/KNupbFXu+rf8cq9/4wS/8AEDir8tcVdir9VMVeK/8A&#xA;ORn5DQ+fdKOuaHEsfm+wjpGNlF7Cu/oyMdg6/wC62P8AqnY1VV8MzwTW80kE8bRTxMUlicFXV1NG&#xA;VlO4IOxBxVdaXd1Z3UN3aSvBdW7rLBPGSro6HkrKw3BBFRir7u/5x6/PO2/MPRP0bqrpF5u06MfX&#xA;IhRRcxCgFzGAABUmjqOh9iMVewYq7FXYq7FXYq7FXYq7FXYqwr82fzT0P8ufK0mr6gRNey1j0vTg&#xA;1JLmenQeCJWrt2HuQCq/Pjzb5s1zzZ5gu9e1y4NzqF4/KRuiqo2WONd+KINlGKpPir6v/wCcXv8A&#xA;nH70ha+f/Ndt+9PGby/p0o+yNmS8kHj/AL6B6fa/loq+pcVQurf8cq9/4wS/8QOKvy1xV2Kv1UxV&#xA;2Kvm/wD5ye/ID9OQXHnjytb/AO5qBOesWEY/3qjQbzoP9+oo+ID7Y/yh8Sr47xVMvLvmHWPLutWm&#xA;t6NctaalYyCS3nTqD0IIOzKwJDA7EbHFX6B/k1+bujfmT5YW/t+NvrFrxj1fTQd4pSNnSu5ikpVD&#xA;9HUHFWf4q7FXYq7FXYq7FXYqtllSKJ5ZDxjjUs7eAAqTir83PzS/MjWvzA83XWuajIwg5NHptpX4&#xA;Le2DH041HjTdz3bfFWIYq+iv+cZf+cfz5juYfOnmm2/51+2flpdhKCPrkqEESOpHxQIe37bbfZBB&#xA;VfZQAAoNgOgxV2KoXVv+OVe/8YJf+IHFX5a4q7FX6qYq7FXYq+Rv+cofyA/R0lz598q23+gSMZde&#xA;0+Mf3LsSWuox/vtifjUfZPxfZrxVfMmKsm/Lvz/rvkTzTaeYNHkIkhIW6tiSI7iAkGSGQfytT6DQ&#xA;jcYq/SewvIb6xt72Cvo3USTRchQ8ZFDLUfI4qr4q7FXYq7FXYq7FWnRJEaNwGRwVZT0IOxBxV+fH&#xA;5p/kT528leYrq3h0y61DQ3lY6bqVtE8yNETVFkKBuEgGxDUqQaVGKsp/In/nG3X/ADVrUOq+bdPu&#xA;NN8rWpErRXCNDLesCCIUVuLrGf23p02Xc1VV9t2trbWltFa2sSQW1uixQQRqFRI0HFUVRsAoFABi&#xA;qpirsVQurf8AHKvf+MEv/EDir8tcVdir9VMVdirsVWyRxyxtHIoeNwVdGAKspFCCD1BxV8Xfn/8A&#xA;842ax5e1eXXvJmnzX/ly7YvJY2yNLLZSHdl4KCzQnqrD7PQ9iVWBflt+R3nrzr5gt7FdMurDSw6n&#xA;UNUuYniiiiB+PiXA5yU+yg79aCpxV+hdnawWdpBaQLxgt41iiWtaIihVFT7DFVXFXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYqhdW/45V7/wAYJf8AiBxV+WuKuxV+qmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KoXVv+OVe/wDGCX/iBxV+WuKuxV+qmKuxV2KuxV2KuxV2KuxV2KuxV2KrJp4I&#xA;E9SaRYk6cnIUVPucVUP0tpX/AC2wf8jU/rirv0tpX/LbB/yNT+uKu/S2lf8ALbB/yNT+uKu/S2lf&#xA;8tsH/I1P64q79LaV/wAtsH/I1P64q79LaV/y2wf8jU/riqKxVC6t/wAcq9/4wS/8QOKvy1xV2Kv1&#xA;UxV2KuxV2KuxV2KuxV2KuxV2KvB/+ci/+ciH8isPLPlr05fNE0Ye5uXAdLKNwCh4H4WldTyUNsBQ&#xA;kGoxV8ba95m8w+Yb1r7XNRuNSu2JJluZGkIr2XkaKPYbYqlmKuxV2KuxV2KuxV+qmKoXVv8AjlXv&#xA;/GCX/iBxV+WuKuxV+qmKoXVv+OVe/wDGCX/iBxV+WuKuxV2KuxV2KuxVPPLXnjzh5XuVuPL+sXem&#xA;yKa8YJWWNvZ46mNx7MpxV9l/849/85CRfmDE2g68sdr5rtYzIDGOMV5Ev2pI1/ZkX9tP9ku1Qqr4&#xA;v82+YrvzJ5n1TXrtma41O6luW5dVEjEqnyRaKB2AxVKMVdirsVdirsVdirsVfqpiqF1b/jlXv/GC&#xA;X/iBxV+WuKuxV+qmKoXVv+OVe/8AGCX/AIgcVflrirsVdirsVdirsVdiqd+SvMt15Y826R5gtWKy&#xA;6bdRTmn7SK37xD7OlVPscVSTFXYq/Qr8k/yd8t+RPK1gy2UUvmO5hjm1PUpFDTes68mjjY14RpXi&#xA;AtK0qd8VelYq7FXYq7FXYq7FULq3/HKvf+MEv/EDir8tcVdir9VMVcQCKHcHqMVQv6J0r/lig/5F&#xA;J/TFXfonSv8Alig/5FJ/TFXfonSv+WKD/kUn9MVd+idK/wCWKD/kUn9MVd+idK/5YoP+RSf0xV5f&#xA;+eH5G+U/OPlXULuz0+Cy8zWcMlxY39uixNI8alvRn4gc0elN91O47gqvgXFXYq7FXYq/VTFXYq7F&#xA;XYq7FXYq7FULq3/HKvf+MEv/ABA4q/LXFXYq/VTFXYq7FXYq7FXYq7FULq3/AByr3/jBL/xA4q/L&#xA;XFXYq7FXYq/VTFXYq7FXYq7FXYq7FULq3/HKvf8AjBL/AMQOKvy1xV2Kv1UxV2KuxV2KuxV2KuxV&#xA;C6t/xyr3/jBL/wAQOKvy1xV2KuxV2Kv1UxV2KuxV2KuxV2KuxVC6t/xyr3/jBL/xA4q/LXFXYq/V&#xA;TFXYq7FXYq7FXYq7FULq3/HKvf8AjBL/AMQOKvy1xV2KuxV2Kv1UxV2KuxV2KuxV2KuxVC6t/wAc&#xA;q9/4wS/8QOKvy1xV2Kv1UxV2KuxV2KuxV2KuxVC6t/xyr3/jBL/xA4q/LXFXYq7FXYq/VTFXYq7F&#xA;XYq7FXYq7FULq3/HKvf+MEv/ABA4q/LXFXYq/VTFXYq7FXYq7FXYq7FULq3/AByr3/jBL/xA4q/L&#xA;XFXYq7FXYq/VTFXYq7FXYq7FXYq7FULqoJ0u8A3JgkoP9gcVfmB+idV/5Y5/+Rb/ANMVd+idV/5Y&#xA;5/8AkW/9MVfqTirsVdirsVdirsVdiqF1b/jlXv8Axgl/4gcVflrirsVdirsVfqpirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdiqF1b/jlXv/GCX/iBxV+WuKuxV2KuxV+qmKuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KuxV2KoXVv8AjlXv/GCX/iBxV+WuKuxV2KuxV+qmKuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KoXVv+OVe/8AGCX/AIgcVflrirsVdirsVfqpirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdiqF1b/jlXv8Axgl/4gcVflrirsVdirsVfqpirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdiqF1b/jlXv/GCX/iBxV+WuKuxV2KuxV+qmKuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KoXVv8AjlXv/GCX/iBxV+WuKuxV2KuxV+qmKuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KoXVv+OVe/8AGCX/AIgcVflrirsVdirsVfqpirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdiqF1b/jlXv8Axgl/4gcVflrirsVdirsVfoF+Sn52+VfOvlWwin1CC18y&#xA;WsCRalp0zrHI0kahWliViOcb05fDXjWhxV6lirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVe&#xA;U/nd+d3lXyZ5Uv7e2v4LzzJeQvBp+nwSLI6PIpUTTBeXBEry+L7XQeyr4BxV2Kpx5v8ALl35a806&#xA;roF2CJ9MupbYltuSoxCv8nWjD2OKpPirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVTnyZ5au/M/mvSfL9opabU7qK3qorxRm+Nz7IlWPsMVfZH/OQ//OPA8/AeYvLpjt/NNvGI5YpC&#xA;EjvY0Hwqzfsyr0VjsRsdqEKvjbzH5Q80+Wrs2mv6VdaZODxAuYmRWp/IxHFx7qSMVSfFXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqnPlryd5p8z3i2fl/SrnUp2biRbxsyqT/O/wBhB7sQ&#xA;MVfZP/OPH/OPC+QVPmHzCY7jzVcRmOKKM847KN/tqr9HlcbMw2A+Fdqkqv8A/9k=</xmpGImg:image>
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>15.000000</stDim:w>
+            <stDim:h>16.000000</stDim:h>
+            <stDim:unit>Points</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">share</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DocumentID>uuid:42c140d4-f642-884f-b34a-56e3afadf921</xmpMM:DocumentID>
+         <xmpMM:InstanceID>uuid:5f7017f2-83e4-ac46-9ee9-dceaa24ec9fa</xmpMM:InstanceID>
+         <pdf:Producer>Adobe PDF library 11.00</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>\rendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[2.0 0.0 13.0 15.9964]/BleedBox[0.0 0.0 15.0 16.0]/Contents 6 0 R/MediaBox[0.0 0.0 15.0 16.0]/Parent 3 0 R/Resources<</ExtGState<</GS0 7 0 R>>/Properties<</MC0 8 0 R>>>>/TrimBox[0.0 0.0 15.0 16.0]/Type/Page>>\rendobj\r6 0 obj\r<</Filter/FlateDecode/Length 395>>stream\r
+H\89lS»\8e\e1\fìõ\15ü\81¥I\8a\Im.A\9a\qH\91:X\®ñ\ 58§Êß\87¢¤µ\8bÀ\805CqøÔ^¾ýüûz\83Ëó\13Á§ÏO\90>\12\ 1ïÀ\ 6\9b\1f·×ô\ 3~»©ÿnoéòõ;ÁÛ\9fô\ 1\1c&\ 6\16hØjip¼\87ß{Ú²\1f×~lÜOBmõÄ"a'ÿ\v\1c ;\1c.ߪÃÝ\1d\ 3\96"\10
+í¬ù\853[øH\ e\8còâ×\14\92zú¶\11#O¤­uM\8b|^ïub!\83¥$o%\ 2\1aéb®Ù\17¾vLH\\86ü\ eÑL&Ý\98º¿f^p\86az¨µ\13Wi\85)öc\95Ýf\83´ \ fäÑ\87\97\94ïÃà1a\8eÔ~5\ 4csGú\95^\1e\96¦XY\v0ca\9fñ¹9A®\ 6\82jæ¡\ 6Ûv䨠ÿ\8f
+\1a÷´\86¹Y¬ÝPkÌ\8bEÀp\97¨\88ÝfX¬,r¸cõ4ç]\9bÄ2ìH¹uBUÝqGÉ1êê7R<\ræ*\8e\99»Ù\9awàå\90ß(²/®\97Þ¨·\99sí%\8a\9d8\eO¯£¿Æâok\84\88ÇYë\fÞ±êHêxW½×\13\ 3\ e.ZGÍÑ\96P{\98ö\97gÿ\9a^Ò?\ 1\ 6\0V+¤©\rendstream\rendobj\r8 0 obj\r<</Color[20224 32768 65535]/Dimmed false/Editable true/Preview true/Printed true/Title(Layer 1)/Visible true>>\rendobj\r7 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r9 0 obj\r<</CreationDate(D:20141021130402-07'00')/Creator(Adobe Illustrator CC \(Macintosh\))/ModDate(D:20141021130402-07'00')/Producer(Adobe PDF library 11.00)/Title(share)>>\rendobj\rxref\r0 10\r0000000000 65535 f\r
+0000000016 00000 n\r
+0000000076 00000 n\r
+0000012017 00000 n\r
+0000000000 00000 f\r
+0000012068 00000 n\r
+0000012301 00000 n\r
+0000012890 00000 n\r
+0000012764 00000 n\r
+0000013002 00000 n\r
+trailer\r<</Size 10/Root 1 0 R/Info 9 0 R/ID[<10653919F0F842C9B46E02AC68A34D9E><EE98C966F3AD4F9286B1727CFEE75677>]>>\rstartxref\r13184\r%%EOF\r
\ No newline at end of file
index 1936a6e..b65ecf1 100644 (file)
@@ -191,6 +191,7 @@ def struct_or_class(namespace, type):
         'WebCore::ViewportArguments',
         'WebCore::ViewportAttributes',
         'WebCore::WindowFeatures',
+        'WebKit::ActionMenuHitTestResult',
         'WebKit::AssistedNodeInformation',
         'WebKit::AttributedString',
         'WebKit::BackForwardListItemState',
index 77cb370..5ad1ad0 100644 (file)
@@ -36,7 +36,11 @@ enum {
     kWKContextActionItemTagNoAction = 0,
     kWKContextActionItemTagOpenLinkInDefaultBrowser,
     kWKContextActionItemTagPreviewLink,
-    kWKContextActionItemTagAddLinkToSafariReadingList
+    kWKContextActionItemTagAddLinkToSafariReadingList,
+    kWKContextActionItemTagCopyImage,
+    kWKContextActionItemTagAddImageToPhotos,
+    kWKContextActionItemTagSaveImageToDownloads,
+    kWKContextActionItemTagShareImage
 };
 
 #ifdef __cplusplus
diff --git a/Source/WebKit2/Shared/mac/ActionMenuHitTestResult.cpp b/Source/WebKit2/Shared/mac/ActionMenuHitTestResult.cpp
new file mode 100644 (file)
index 0000000..081a1d5
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "ActionMenuHitTestResult.h"
+
+#include "ArgumentDecoder.h"
+#include "ArgumentEncoder.h"
+
+namespace WebKit {
+
+void ActionMenuHitTestResult::encode(IPC::ArgumentEncoder& encoder) const
+{
+    ShareableBitmap::Handle handle;
+
+    // FIXME: We should consider sharing the raw original resource data so that metadata and whatnot are preserved.
+    if (image)
+        image->createHandle(handle, SharedMemory::ReadOnly);
+
+    encoder << handle;
+}
+
+bool ActionMenuHitTestResult::decode(IPC::ArgumentDecoder& decoder, ActionMenuHitTestResult& actionMenuHitTestResult)
+{
+    ShareableBitmap::Handle handle;
+    if (!decoder.decode(handle))
+        return false;
+
+    if (!handle.isNull())
+        actionMenuHitTestResult.image = ShareableBitmap::create(handle, SharedMemory::ReadOnly);
+
+    return true;
+}
+    
+} // namespace WebKit
diff --git a/Source/WebKit2/Shared/mac/ActionMenuHitTestResult.h b/Source/WebKit2/Shared/mac/ActionMenuHitTestResult.h
new file mode 100644 (file)
index 0000000..2dca549
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ActionMenuHitTestResult_h
+#define ActionMenuHitTestResult_h
+
+#include "ShareableBitmap.h"
+
+namespace IPC {
+class ArgumentDecoder;
+class ArgumentEncoder;
+}
+
+namespace WebKit {
+
+struct ActionMenuHitTestResult {
+    void encode(IPC::ArgumentEncoder&) const;
+    static bool decode(IPC::ArgumentDecoder&, ActionMenuHitTestResult&);
+
+    RefPtr<ShareableBitmap> image;
+};
+
+} // namespace WebKit
+
+#endif // ActionMenuHitTestResult_h
index f367d86..bb9b193 100644 (file)
@@ -34,6 +34,7 @@
 #endif
 
 #import "APIHistoryClient.h"
+#import "ActionMenuHitTestResult.h"
 #import "AttributedString.h"
 #import "ColorSpaceData.h"
 #import "DataReference.h"
@@ -75,6 +76,9 @@
 #import "WebProcessProxy.h"
 #import "WebSystemInterface.h"
 #import "_WKThumbnailViewInternal.h"
+#import <AppKit/NSSharingService.h>
+#import <ImageIO/ImageIO.h>
+#import <ImageKit/ImageKit.h>
 #import <QuartzCore/QuartzCore.h>
 #import <WebCore/AXObjectCache.h>
 #import <WebCore/ColorMac.h>
@@ -91,6 +95,7 @@
 #import <WebCore/PlatformScreen.h>
 #import <WebCore/Region.h>
 #import <WebCore/SharedBuffer.h>
+#import <WebCore/SoftLinking.h>
 #import <WebCore/TextAlternativeWithRange.h>
 #import <WebCore/TextUndoInsertionMarkupMac.h>
 #import <WebCore/WebActionDisablingCALayerDelegate.h>
@@ -148,6 +153,14 @@ CGSConnectionID CGSMainConnectionID(void);
 CGError CGSGetScreenRectForWindow(CGSConnectionID cid, CGSWindowID wid, CGRect *rect);
 };
 
+// FIXME: This needs to be in an SPI header.
+@interface NSSharingServicePicker (WKNSSharingServicePickerDetails)
+- (NSMenu *)menu;
+@end
+
+SOFT_LINK_FRAMEWORK(ImageKit)
+SOFT_LINK_CLASS(ImageKit, IKSlideshow)
+
 using namespace WebKit;
 using namespace WebCore;
 
@@ -168,6 +181,13 @@ struct WKViewInterpretKeyEventsParameters {
 };
 #endif
 
+// FIXME: This and all action menu related code should move to its own file.
+enum class ActionMenuState {
+    None = 0,
+    Pending,
+    Ready
+};
+
 @interface WKViewData : NSObject {
 @public
     std::unique_ptr<PageClientImpl> _pageClient;
@@ -263,6 +283,10 @@ struct WKViewInterpretKeyEventsParameters {
 #if WK_API_ENABLED
     _WKThumbnailView *_thumbnailView;
 #endif
+
+    ActionMenuState _actionMenuState;
+    ActionMenuHitTestResult _actionMenuHitTestResult;
+    RetainPtr<NSSharingServicePicker> _actionMenuSharingServicePicker;
 }
 
 @end
@@ -3682,56 +3706,226 @@ static NSString *pathWithUniqueFilenameForPath(NSString *path)
     [bubble showPreviewItem:[NSURL URLWithString:hitTestResult->absoluteLinkURL()] itemFrame:itemFrame];
 }
 
-- (NSArray *)_defaultMenuItemsForLink
+- (RetainPtr<NSMenuItem>)_createActionMenuItemForTag:(uint32_t)tag
+{
+    SEL selector = nil;
+    NSString *title = nil;
+    NSImage *image = nil;
+
+    switch (tag) {
+    case kWKContextActionItemTagOpenLinkInDefaultBrowser:
+        selector = @selector(_openURLFromActionMenu:);
+        title = @"Open";
+        image = webKitBundleImageNamed(@"OpenInNewWindowTemplate");
+        break;
+
+    case kWKContextActionItemTagPreviewLink:
+        selector = @selector(_quickLookURLFromActionMenu:);
+        title = @"Preview";
+        image = [NSImage imageNamed:NSImageNameQuickLookTemplate];
+        break;
+
+    case kWKContextActionItemTagAddLinkToSafariReadingList:
+        selector = @selector(_addToReadingListFromActionMenu:);
+        title = @"Add to Safari Reading List";
+        image = [NSImage imageNamed:NSImageNameBookmarksTemplate];
+        break;
+
+    case kWKContextActionItemTagCopyImage:
+        selector = @selector(_copyImage:);
+        title = @"Copy";
+        image = webKitBundleImageNamed(@"CopyImageTemplate");
+        break;
+
+    case kWKContextActionItemTagAddImageToPhotos:
+        selector = @selector(_addImageToPhotos:);
+        title = @"Add to Photos";
+        image = webKitBundleImageNamed(@"AddImageToPhotosTemplate");
+        break;
+
+    case kWKContextActionItemTagSaveImageToDownloads:
+        selector = @selector(_saveImageToDownloads:);
+        title = @"Save to Downloads";
+        image = webKitBundleImageNamed(@"SaveImageToDownloadsTemplate");
+        break;
+
+    case kWKContextActionItemTagShareImage:
+        title = @"Share";
+        image = webKitBundleImageNamed(@"ShareImageTemplate");
+        break;
+
+    default:
+        ASSERT_NOT_REACHED();
+        return nil;
+    }
+
+    RetainPtr<NSMenuItem> item = adoptNS([[NSMenuItem alloc] initWithTitle:title action:selector keyEquivalent:@""]);
+    [item setImage:image];
+    [item setTarget:self];
+    [item setTag:tag];
+    return item;
+}
+
+static NSImage *webKitBundleImageNamed(NSString *name)
 {
-    NSMutableArray *menuItems = [NSMutableArray array];
+    return [[NSBundle bundleForClass:[WKView class]] imageForResource:name];
+}
 
+- (NSArray *)_defaultMenuItemsForLink
+{
     WebHitTestResult* hitTestResult = _data->_page->activeActionMenuHitTestResult();
     if (!hitTestResult)
-        return menuItems;
+        return @[ ];
 
     if (!WebCore::protocolIsInHTTPFamily(hitTestResult->absoluteLinkURL()))
-        return menuItems;
+        return @[ ];
 
-    RetainPtr<NSMenuItem> openLinkItem = adoptNS([[NSMenuItem alloc] initWithTitle:@"Open" action:@selector(_openURLFromActionMenu:) keyEquivalent:@""]);
-    [openLinkItem setImage:[[NSBundle bundleForClass:[WKView class]] imageForResource:@"OpenInNewWindowTemplate"]];
-    [openLinkItem setTarget:self];
-    [openLinkItem setTag:kWKContextActionItemTagOpenLinkInDefaultBrowser];
-    [menuItems addObject:openLinkItem.get()];
+    RetainPtr<NSMenuItem> openLinkItem = [self _createActionMenuItemForTag:kWKContextActionItemTagOpenLinkInDefaultBrowser];
+    RetainPtr<NSMenuItem> previewLinkItem = [self _createActionMenuItemForTag:kWKContextActionItemTagPreviewLink];
+    RetainPtr<NSMenuItem> readingListItem = [self _createActionMenuItemForTag:kWKContextActionItemTagAddLinkToSafariReadingList];
 
-    RetainPtr<NSMenuItem> previewLinkItem = adoptNS([[NSMenuItem alloc] initWithTitle:@"Preview" action:@selector(_quickLookURLFromActionMenu:) keyEquivalent:@""]);
-    [previewLinkItem setImage:[NSImage imageNamed:NSImageNameQuickLookTemplate]];
-    [previewLinkItem setTarget:self];
-    [previewLinkItem setTag:kWKContextActionItemTagPreviewLink];
-    [menuItems addObject:previewLinkItem.get()];
+    // FIXME: The separator item is required to work around <rdar://18684207>.
+    return @[openLinkItem.get(), previewLinkItem.get(), [NSMenuItem separatorItem], readingListItem.get()];
+}
 
-    RetainPtr<NSMenuItem> readingListItem = adoptNS([[NSMenuItem alloc] initWithTitle:@"Add to Safari Reading List" action:@selector(_addToReadingListFromActionMenu:) keyEquivalent:@""]);
-    [readingListItem setImage:[NSImage imageNamed:NSImageNameBookmarksTemplate]];
-    [readingListItem setTarget:self];
-    [readingListItem setTag:kWKContextActionItemTagAddLinkToSafariReadingList];
-    [menuItems addObject:readingListItem.get()];
+- (void)_copyImage:(id)sender
+{
+    WebHitTestResult* hitTestResult = _data->_page->activeActionMenuHitTestResult();
+    if (!hitTestResult)
+        return;
 
-    // FIXME: Required to work around <rdar://18684207>.
-    [menuItems addObject:[NSMenuItem separatorItem]];
+    RefPtr<ShareableBitmap> bitmap = _data->_actionMenuHitTestResult.image;
+    if (!bitmap)
+        return;
 
-    return menuItems;
+    RetainPtr<CGImageRef> image = bitmap->makeCGImage();
+    RetainPtr<NSImage> nsImage = adoptNS([[NSImage alloc] initWithCGImage:image.get() size:NSZeroSize]);
+    [[NSPasteboard generalPasteboard] clearContents];
+    [[NSPasteboard generalPasteboard] writeObjects:@[ nsImage.get() ]];
+}
+
+- (void)_saveImageToDownloads:(id)sender
+{
+    WebHitTestResult* hitTestResult = _data->_page->activeActionMenuHitTestResult();
+    if (!hitTestResult)
+        return;
+
+    _data->_page->process().context().download(_data->_page.get(), URL(URL(), hitTestResult->absoluteImageURL()));
+}
+
+static NSString *temporaryPhotosDirectoryPath()
+{
+    static NSString *temporaryPhotosDirectoryPath;
+
+    if (!temporaryPhotosDirectoryPath) {
+        NSString *temporaryDirectoryTemplate = [NSTemporaryDirectory() stringByAppendingPathComponent:@"WebKitPhotos-XXXXXX"];
+        CString templateRepresentation = [temporaryDirectoryTemplate fileSystemRepresentation];
+
+        if (mkdtemp(templateRepresentation.mutableData()))
+            temporaryPhotosDirectoryPath = [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:templateRepresentation.data() length:templateRepresentation.length()] copy];
+    }
+
+    return temporaryPhotosDirectoryPath;
+}
+
+static NSString *pathToPhotoOnDisk(NSString *suggestedFilename)
+{
+    NSString *photoDirectoryPath = temporaryPhotosDirectoryPath();
+    if (!photoDirectoryPath) {
+        WTFLogAlways("Cannot create temporary photo download directory.");
+        return nil;
+    }
+
+    NSString *path = [photoDirectoryPath stringByAppendingPathComponent:suggestedFilename];
+
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    if ([fileManager fileExistsAtPath:path]) {
+        NSString *pathTemplatePrefix = [photoDirectoryPath stringByAppendingPathComponent:@"XXXXXX-"];
+        NSString *pathTemplate = [pathTemplatePrefix stringByAppendingString:suggestedFilename];
+        CString pathTemplateRepresentation = [pathTemplate fileSystemRepresentation];
+
+        int fd = mkstemps(pathTemplateRepresentation.mutableData(), pathTemplateRepresentation.length() - strlen([pathTemplatePrefix fileSystemRepresentation]) + 1);
+        if (fd < 0) {
+            WTFLogAlways("Cannot create photo file in the temporary directory (%@).", suggestedFilename);
+            return nil;
+        }
+
+        close(fd);
+        path = [fileManager stringWithFileSystemRepresentation:pathTemplateRepresentation.data() length:pathTemplateRepresentation.length()];
+    }
+
+    return path;
+}
+
+- (void)_addImageToPhotos:(id)sender
+{
+    // FIXME: We shouldn't even add the button if this is the case, for now.
+    if (![getIKSlideshowClass() canExportToApplication:(@"com.apple.Photos")])
+        return;
+
+    WebHitTestResult* hitTestResult = _data->_page->activeActionMenuHitTestResult();
+    if (!hitTestResult)
+        return;
+
+    RefPtr<ShareableBitmap> bitmap = _data->_actionMenuHitTestResult.image;
+    if (!bitmap)
+        return;
+    RetainPtr<CGImageRef> image = bitmap->makeCGImage();
+
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+        NSString * const suggestedFilename = @"image.jpg";
+
+        NSString *filePath = pathToPhotoOnDisk(suggestedFilename);
+        if (!filePath)
+            return;
+
+        NSURL *fileURL = [NSURL fileURLWithPath:filePath];
+        auto dest = adoptCF(CGImageDestinationCreateWithURL((CFURLRef)fileURL, kUTTypeJPEG, 1, nullptr));
+        CGImageDestinationAddImage(dest.get(), image.get(), nullptr);
+        CGImageDestinationFinalize(dest.get());
+
+        dispatch_async(dispatch_get_main_queue(), ^{
+            // This API provides no way to report failure, but if 18420778 is fixed so that it does, we should handle this.
+            [getIKSlideshowClass() exportSlideshowItem:filePath toApplication:(@"com.apple.Photos")];
+        });
+    });
+}
+
+- (NSArray *)_defaultMenuItemsForImage
+{
+    WebHitTestResult* hitTestResult = _data->_page->activeActionMenuHitTestResult();
+    if (!hitTestResult)
+        return @[ ];
+
+    RetainPtr<NSMenuItem> copyImageItem = [self _createActionMenuItemForTag:kWKContextActionItemTagCopyImage];
+    RetainPtr<NSMenuItem> addToPhotosItem = [self _createActionMenuItemForTag:kWKContextActionItemTagAddImageToPhotos];
+    RetainPtr<NSMenuItem> saveToDownloadsItem = [self _createActionMenuItemForTag:kWKContextActionItemTagSaveImageToDownloads];
+    RetainPtr<NSMenuItem> shareItem = [self _createActionMenuItemForTag:kWKContextActionItemTagShareImage];
+
+    if (RefPtr<ShareableBitmap> bitmap = _data->_actionMenuHitTestResult.image) {
+        RetainPtr<CGImageRef> image = bitmap->makeCGImage();
+        RetainPtr<NSImage> nsImage = adoptNS([[NSImage alloc] initWithCGImage:image.get() size:NSZeroSize]);
+        _data->_actionMenuSharingServicePicker = adoptNS([[NSSharingServicePicker alloc] initWithItems:@[ nsImage.get() ]]);
+        [shareItem setSubmenu:[_data->_actionMenuSharingServicePicker menu]];
+     }
+
+    return @[copyImageItem.get(), addToPhotosItem.get(), saveToDownloadsItem.get(), shareItem.get()];
 }
 
 - (NSArray *)_defaultMenuItems
 {
     if (WebHitTestResult* hitTestResult = _data->_page->activeActionMenuHitTestResult()) {
+        if (!hitTestResult->absoluteImageURL().isEmpty())
+            return [self _defaultMenuItemsForImage];
         if (!hitTestResult->absoluteLinkURL().isEmpty())
             return [self _defaultMenuItemsForLink];
     }
 
-    return @[];
+    return @[ ];
 }
 
-- (void)prepareForMenu:(NSMenu *)menu withEvent:(NSEvent *)event
+- (void)_updateActionMenu
 {
-    if (menu != self.actionMenu)
-        return;
-
     [[self actionMenu] removeAllItems];
 
     NSArray *menuItems = [self _actionMenuItemsForHitTestResult:toAPI(_data->_page->activeActionMenuHitTestResult()) defaultActionMenuItems:[self _defaultMenuItems]];
@@ -3740,6 +3934,53 @@ static NSString *pathWithUniqueFilenameForPath(NSString *path)
         [[self actionMenu] addItem:item];
 }
 
+- (void)prepareForMenu:(NSMenu *)menu withEvent:(NSEvent *)event
+{
+    if (menu != self.actionMenu)
+        return;
+
+    [self _updateActionMenu];
+
+    _data->_page->performActionMenuHitTestAtLocation([self convertPoint:[event locationInWindow] fromView:nil]);
+
+    _data->_actionMenuState = ActionMenuState::Pending;
+}
+
+- (void)_didPerformActionMenuHitTest:(const ActionMenuHitTestResult&)hitTestResult
+{
+    // FIXME: This needs to use the WebKit2 callback mechanism to avoid out-of-order replies.
+    _data->_actionMenuState = ActionMenuState::Ready;
+    _data->_actionMenuHitTestResult = hitTestResult;
+}
+
+- (void)willOpenMenu:(NSMenu *)menu withEvent:(NSEvent *)event
+{
+    if (menu != self.actionMenu)
+        return;
+
+    ASSERT(_data->_actionMenuState != ActionMenuState::None);
+
+    // FIXME: We need to be able to cancel this if the menu goes away.
+    // FIXME: Connection can be null if the process is closed; we should clean up better in that case.
+    if (_data->_actionMenuState == ActionMenuState::Pending) {
+        if (auto* connection = _data->_page->process().connection())
+            connection->waitForAndDispatchImmediately<Messages::WebPageProxy::DidPerformActionMenuHitTest>(_data->_page->pageID(), std::chrono::milliseconds(500));
+    }
+
+    if (_data->_actionMenuState == ActionMenuState::Ready)
+        [self _updateActionMenu];
+}
+
+- (void)didCloseMenu:(NSMenu *)menu withEvent:(NSEvent *)event
+{
+    if (menu != self.actionMenu)
+        return;
+
+    _data->_actionMenuState = ActionMenuState::None;
+    _data->_actionMenuHitTestResult = ActionMenuHitTestResult();
+    _data->_actionMenuSharingServicePicker = nil;
+}
+
 @end
 
 @implementation WKView (Private)
index da7b613..5f7f6bb 100644 (file)
@@ -50,6 +50,7 @@ class FindIndicator;
 class LayerTreeContext;
 class ViewSnapshot;
 class WebContext;
+struct ActionMenuHitTestResult;
 struct ColorSpaceData;
 struct EditorState;
 struct WebPageConfiguration;
@@ -124,4 +125,6 @@ struct WebPageConfiguration;
 @property (readonly) WKFullScreenWindowController *_fullScreenWindowController;
 - (void)_closeFullScreenWindowController;
 
+- (void)_didPerformActionMenuHitTest:(const WebKit::ActionMenuHitTestResult&)hitTestResult;
+
 @end
index 0691e5e..d3e988a 100644 (file)
@@ -61,6 +61,7 @@ class ViewSnapshot;
 class WebContextMenuProxy;
 class WebEditCommandProxy;
 class WebPopupMenuProxy;
+struct ActionMenuHitTestResult;
 
 #if ENABLE(TOUCH_EVENTS)
 class NativeWebTouchEvent;
@@ -308,6 +309,8 @@ public:
     virtual void didFirstVisuallyNonEmptyLayoutForMainFrame() = 0;
     virtual void didFinishLoadForMainFrame() = 0;
     virtual void didSameDocumentNavigationForMainFrame(SameDocumentNavigationType) = 0;
+
+    virtual void didPerformActionMenuHitTest(const ActionMenuHitTestResult&) = 0;
 };
 
 } // namespace WebKit
index 854807f..30e9109 100644 (file)
@@ -5252,4 +5252,14 @@ void WebPageProxy::removeNavigationGestureSnapshot()
 }
 #endif
 
+void WebPageProxy::performActionMenuHitTestAtLocation(FloatPoint point)
+{
+    m_process->send(Messages::WebPage::PerformActionMenuHitTestAtLocation(point), m_pageID);
+}
+
+void WebPageProxy::didPerformActionMenuHitTest(const ActionMenuHitTestResult& result)
+{
+    m_pageClient.didPerformActionMenuHitTest(result);
+}
+
 } // namespace WebKit
index e2e9985..5ba90d0 100644 (file)
@@ -167,6 +167,7 @@ class WebPageGroup;
 class WebProcessProxy;
 class WebUserContentControllerProxy;
 class WebWheelEvent;
+struct ActionMenuHitTestResult;
 struct AttributedString;
 struct ColorSpaceData;
 struct DictionaryPopupInfo;
@@ -923,6 +924,7 @@ public:
 #endif
 
     WebHitTestResult* activeActionMenuHitTestResult() const { return m_activeActionMenuHitTestResult.get(); }
+    void performActionMenuHitTestAtLocation(WebCore::FloatPoint);
 
 private:
     WebPageProxy(PageClient&, WebProcessProxy&, uint64_t pageID, const WebPageConfiguration&);
@@ -1301,6 +1303,8 @@ private:
     void viewDidLeaveWindow();
     void viewDidEnterWindow();
 
+    void didPerformActionMenuHitTest(const ActionMenuHitTestResult&);
+
     PageClient& m_pageClient;
     std::unique_ptr<API::LoaderClient> m_loaderClient;
     std::unique_ptr<API::PolicyClient> m_policyClient;
index 9ece8d6..7b8ea51 100644 (file)
@@ -408,5 +408,7 @@ messages -> WebPageProxy {
     ContentFilterDidBlockLoadForFrame(WebCore::ContentFilter contentFilter, uint64_t frameID)
 #endif
 
-    IsPlayingAudioDidChange(bool newIsPlayingAudio);
+    IsPlayingAudioDidChange(bool newIsPlayingAudio)
+
+    DidPerformActionMenuHitTest(WebKit::ActionMenuHitTestResult result)
 }
index 136c6f9..ffebedb 100644 (file)
@@ -179,6 +179,8 @@ private:
     virtual void didFinishLoadForMainFrame() override;
     virtual void didSameDocumentNavigationForMainFrame(SameDocumentNavigationType) override;
 
+    virtual void didPerformActionMenuHitTest(const ActionMenuHitTestResult&) override;
+
     WKContentView *m_contentView;
     WKWebView *m_webView;
     RetainPtr<WKEditorUndoTargetObjC> m_undoTarget;
index 42d2961..09f48c3 100644 (file)
@@ -697,6 +697,10 @@ void PageClientImpl::didSameDocumentNavigationForMainFrame(SameDocumentNavigatio
     [m_webView _didSameDocumentNavigationForMainFrame:navigationType];
 }
 
+void PageClientImpl::didPerformActionMenuHitTest(const ActionMenuHitTestResult&)
+{
+}
+
 } // namespace WebKit
 
 #endif // PLATFORM(IOS)
index a7a2e2f..8123600 100644 (file)
@@ -186,6 +186,8 @@ private:
     virtual void didSameDocumentNavigationForMainFrame(SameDocumentNavigationType) override;
     virtual void removeNavigationGestureSnapshot() override;
 
+    virtual void didPerformActionMenuHitTest(const ActionMenuHitTestResult&) override;
+
     WKView *m_wkView;
     WKWebView *m_webView;
     RetainPtr<WKEditorUndoTargetObjC> m_undoTarget;
index dbd8309..85a08d5 100644 (file)
@@ -753,6 +753,11 @@ CGRect PageClientImpl::boundsOfLayerInLayerBackedWindowCoordinates(CALayer *laye
     return [windowContentLayer convertRect:layer.bounds fromLayer:layer];
 }
 
+void PageClientImpl::didPerformActionMenuHitTest(const ActionMenuHitTestResult& result)
+{
+    [m_wkView _didPerformActionMenuHitTest:result];
+}
+
 } // namespace WebKit
 
 #endif // PLATFORM(MAC)
index 25adef1..9ce93e9 100644 (file)
                2D2ADF0916362DD500197E47 /* PDFPluginTextAnnotation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2ADF0616362DC700197E47 /* PDFPluginTextAnnotation.mm */; };
                2D2ADF0B16362DDB00197E47 /* PDFPluginAnnotation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2ADF031636243500197E47 /* PDFPluginAnnotation.mm */; };
                2D2ADF1016364D8200197E47 /* PDFPluginChoiceAnnotation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D2ADF0E16364D8200197E47 /* PDFPluginChoiceAnnotation.mm */; };
+               2D353B1219F8305D000EEACD /* ActionMenuHitTestResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D353B1019F8305D000EEACD /* ActionMenuHitTestResult.cpp */; };
+               2D353B1319F8305D000EEACD /* ActionMenuHitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D353B1119F8305D000EEACD /* ActionMenuHitTestResult.h */; };
                2D3EF4421917646300034184 /* WebMemoryPressureHandlerIOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D3EF4401917646300034184 /* WebMemoryPressureHandlerIOS.mm */; };
                2D3EF4431917646300034184 /* WebMemoryPressureHandlerIOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3EF4411917646300034184 /* WebMemoryPressureHandlerIOS.h */; };
                2D429BFD1721E2C700EC681F /* PDFPluginPasswordField.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2D429BFB1721E2BA00EC681F /* PDFPluginPasswordField.mm */; };
                935EEBA2127761D0003322B8 /* InjectedBundleBackForwardList.h in Headers */ = {isa = PBXBuildFile; fileRef = 935EEB901277615D003322B8 /* InjectedBundleBackForwardList.h */; };
                935EEBA3127761D3003322B8 /* InjectedBundleBackForwardListItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 935EEB911277615D003322B8 /* InjectedBundleBackForwardListItem.cpp */; };
                935EEBA4127761D6003322B8 /* InjectedBundleBackForwardListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 935EEB921277615D003322B8 /* InjectedBundleBackForwardListItem.h */; };
+               9369104219F711810021D470 /* CopyImageTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 9369104119F711810021D470 /* CopyImageTemplate.pdf */; };
+               9369104419F711910021D470 /* AddImageToPhotosTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 9369104319F711910021D470 /* AddImageToPhotosTemplate.pdf */; };
+               9369104619F7119E0021D470 /* SaveImageToDownloadsTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 9369104519F7119E0021D470 /* SaveImageToDownloadsTemplate.pdf */; };
+               9369104819F711A70021D470 /* ShareImageTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 9369104719F711A70021D470 /* ShareImageTemplate.pdf */; };
                9391F2CA121B679A00EBF7E8 /* WebFrameNetworkingContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9391F284121B38F500EBF7E8 /* WebFrameNetworkingContext.mm */; };
                9391F2CB121B67AD00EBF7E8 /* WebFrameNetworkingContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 9391F283121B38F500EBF7E8 /* WebFrameNetworkingContext.h */; };
                939AE7661316E99C00AE06A6 /* WebCoreArgumentCoders.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 939AE7651316E99C00AE06A6 /* WebCoreArgumentCoders.cpp */; };
                2D2ADF0C16363DEC00197E47 /* PDFLayerControllerDetails.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PDFLayerControllerDetails.h; path = PDF/PDFLayerControllerDetails.h; sourceTree = "<group>"; };
                2D2ADF0D16364D8200197E47 /* PDFPluginChoiceAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPluginChoiceAnnotation.h; path = PDF/PDFPluginChoiceAnnotation.h; sourceTree = "<group>"; };
                2D2ADF0E16364D8200197E47 /* PDFPluginChoiceAnnotation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = PDFPluginChoiceAnnotation.mm; path = PDF/PDFPluginChoiceAnnotation.mm; sourceTree = "<group>"; };
+               2D353B1019F8305D000EEACD /* ActionMenuHitTestResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ActionMenuHitTestResult.cpp; sourceTree = "<group>"; };
+               2D353B1119F8305D000EEACD /* ActionMenuHitTestResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActionMenuHitTestResult.h; sourceTree = "<group>"; };
                2D3EF4401917646300034184 /* WebMemoryPressureHandlerIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WebMemoryPressureHandlerIOS.mm; path = ios/WebMemoryPressureHandlerIOS.mm; sourceTree = "<group>"; };
                2D3EF4411917646300034184 /* WebMemoryPressureHandlerIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebMemoryPressureHandlerIOS.h; path = ios/WebMemoryPressureHandlerIOS.h; sourceTree = "<group>"; };
                2D429BFA1721E2BA00EC681F /* PDFPluginPasswordField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PDFPluginPasswordField.h; path = PDF/PDFPluginPasswordField.h; sourceTree = "<group>"; };
                935EEB961277616D003322B8 /* WKBundleBackForwardList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundleBackForwardList.h; sourceTree = "<group>"; };
                935EEB971277616D003322B8 /* WKBundleBackForwardListItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKBundleBackForwardListItem.cpp; sourceTree = "<group>"; };
                935EEB981277616D003322B8 /* WKBundleBackForwardListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundleBackForwardListItem.h; sourceTree = "<group>"; };
+               9369104119F711810021D470 /* CopyImageTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = CopyImageTemplate.pdf; path = Resources/CopyImageTemplate.pdf; sourceTree = "<group>"; };
+               9369104319F711910021D470 /* AddImageToPhotosTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = AddImageToPhotosTemplate.pdf; path = Resources/AddImageToPhotosTemplate.pdf; sourceTree = "<group>"; };
+               9369104519F7119E0021D470 /* SaveImageToDownloadsTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = SaveImageToDownloadsTemplate.pdf; path = Resources/SaveImageToDownloadsTemplate.pdf; sourceTree = "<group>"; };
+               9369104719F711A70021D470 /* ShareImageTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = ShareImageTemplate.pdf; path = Resources/ShareImageTemplate.pdf; sourceTree = "<group>"; };
                9391F283121B38F500EBF7E8 /* WebFrameNetworkingContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebFrameNetworkingContext.h; sourceTree = "<group>"; };
                9391F284121B38F500EBF7E8 /* WebFrameNetworkingContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebFrameNetworkingContext.mm; sourceTree = "<group>"; };
                939AE7651316E99C00AE06A6 /* WebCoreArgumentCoders.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebCoreArgumentCoders.cpp; sourceTree = "<group>"; };
                                A78CCDD5193AC9E3005ECC25 /* SandboxProfiles */,
                                7CB16FE11724B9B5007A0A95 /* PlugInSandboxProfiles */,
                                6D8A91A511F0EFD100DD01FE /* com.apple.WebProcess.sb.in */,
+                               9369104319F711910021D470 /* AddImageToPhotosTemplate.pdf */,
+                               9369104119F711810021D470 /* CopyImageTemplate.pdf */,
                                1CBC945D16515ED200D68AAE /* DockBottom.pdf */,
                                1CB75C931701E880009F809F /* DockRight.pdf */,
                                1C8AE75F1992F62F00ABF6EC /* DockBottomLegacy.pdf */,
                                8DC2EF5A0486A6940098B216 /* Info.plist */,
                                089C1666FE841158C02AAC07 /* InfoPlist.strings */,
                                9348427C19F19BD00009D5AE /* OpenInNewWindowTemplate.pdf */,
+                               9369104519F7119E0021D470 /* SaveImageToDownloadsTemplate.pdf */,
+                               9369104719F711A70021D470 /* ShareImageTemplate.pdf */,
                                E1D26A4C1759634E0095BFD1 /* WebContentProcess.xib */,
                                E133FD891423DD7F00FC7BFB /* WebKit.icns */,
                        );
                BC111B5A112F628200337BAB /* mac */ = {
                        isa = PBXGroup;
                        children = (
+                               2D353B1019F8305D000EEACD /* ActionMenuHitTestResult.cpp */,
+                               2D353B1119F8305D000EEACD /* ActionMenuHitTestResult.h */,
                                E179FD9B134D38060015B883 /* ArgumentCodersMac.h */,
                                E179FD9E134D38250015B883 /* ArgumentCodersMac.mm */,
                                E1A31731134CEA6C007C9A4F /* AttributedString.h */,
                                BC2D021712AC41CB00E732A3 /* SameDocumentNavigationType.h in Headers */,
                                1AAB4A8D1296F0A20023952F /* SandboxExtension.h in Headers */,
                                1AB8A1F218400B6200E9AE69 /* WKPageUIClient.h in Headers */,
+                               2D353B1319F8305D000EEACD /* ActionMenuHitTestResult.h in Headers */,
                                E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */,
                                51D130541382EAC000351EDD /* SecItemRequestData.h in Headers */,
                                51D130561382EAC000351EDD /* SecItemResponseData.h in Headers */,
                        isa = PBXResourcesBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               9369104619F7119E0021D470 /* SaveImageToDownloadsTemplate.pdf in Resources */,
                                E17AE2C316B9C63A001C42F1 /* com.apple.WebKit.NetworkProcess.sb in Resources */,
                                E11D35AE16B63D1B006D23D7 /* com.apple.WebProcess.sb in Resources */,
+                               9369104419F711910021D470 /* AddImageToPhotosTemplate.pdf in Resources */,
                                1CBC945E16515ED200D68AAE /* DockBottom.pdf in Resources */,
                                E115C716190F8A2500ECC516 /* com.apple.WebKit.Databases.sb in Resources */,
                                9348427D19F19BD10009D5AE /* OpenInNewWindowTemplate.pdf in Resources */,
+                               9369104219F711810021D470 /* CopyImageTemplate.pdf in Resources */,
+                               9369104819F711A70021D470 /* ShareImageTemplate.pdf in Resources */,
                                1CB75C941701E880009F809F /* DockRight.pdf in Resources */,
                                1C8AE7611992F63A00ABF6EC /* DockBottomLegacy.pdf in Resources */,
                                8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */,
                                1AE00D5C182DADE100087DD7 /* KeyedEncoder.cpp in Sources */,
                                1AC8702E130B49A2002C1257 /* WebPluginSiteDataManager.cpp in Sources */,
                                BC5744EF12638FB3006F0F12 /* WebPopupItem.cpp in Sources */,
+                               2D353B1219F8305D000EEACD /* ActionMenuHitTestResult.cpp in Sources */,
                                0F931C1D18C5711900DBA7C3 /* ScrollingTreeOverflowScrollingNodeIOS.mm in Sources */,
                                D3B9484611FF4B6500032B39 /* WebPopupMenu.cpp in Sources */,
                                1AAF08A1192681D100B6390C /* WebUserContentControllerProxy.cpp in Sources */,
index eff7d05..3367c06 100644 (file)
@@ -28,6 +28,7 @@
 #include "config.h"
 #include "WebPage.h"
 
+#include "ActionMenuHitTestResult.h"
 #include "Arguments.h"
 #include "DataReference.h"
 #include "DragControllerAction.h"
@@ -4795,4 +4796,31 @@ void WebPage::willChangeCurrentHistoryItemForMainFrame()
     send(Messages::WebPageProxy::WillChangeCurrentHistoryItemForMainFrame());
 }
 
+void WebPage::performActionMenuHitTestAtLocation(WebCore::FloatPoint locationInViewCooordinates)
+{
+    layoutIfNeeded();
+
+    MainFrame& mainFrame = corePage()->mainFrame();
+    if (!mainFrame.view() || !mainFrame.view()->renderView()) {
+        send(Messages::WebPageProxy::DidPerformActionMenuHitTest(ActionMenuHitTestResult()));
+        return;
+    }
+
+    RenderView& mainRenderView = *mainFrame.view()->renderView();
+
+    HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::AllowChildFrameContent | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowShadowContent);
+
+    HitTestResult hitTestResult(mainFrame.view()->rootViewToContents(roundedIntPoint(locationInViewCooordinates)));
+    mainRenderView.hitTest(request, hitTestResult);
+
+    ActionMenuHitTestResult actionMenuResult;
+
+    if (Image* image = hitTestResult.image()) {
+        actionMenuResult.image = ShareableBitmap::createShareable(IntSize(image->size()), ShareableBitmap::SupportsAlpha);
+        actionMenuResult.image->createGraphicsContext()->drawImage(image, ColorSpaceDeviceRGB, IntPoint());
+    }
+
+    send(Messages::WebPageProxy::DidPerformActionMenuHitTest(actionMenuResult));
+}
+
 } // namespace WebKit
index 82fe475..fe23aeb 100644 (file)
@@ -1044,6 +1044,8 @@ private:
 
     void reportUsedFeatures();
 
+    void performActionMenuHitTestAtLocation(WebCore::FloatPoint);
+
     uint64_t m_pageID;
 
     std::unique_ptr<WebCore::Page> m_page;
index 3fcb226..f36bd50 100644 (file)
@@ -387,4 +387,5 @@ messages -> WebPage LegacyReceiver {
     GetBytecodeProfile(uint64_t callbackID)
     
     TakeSnapshot(WebCore::IntRect snapshotRect, WebCore::IntSize bitmapSize, uint32_t options, uint64_t callbackID)
+    PerformActionMenuHitTestAtLocation(WebCore::FloatPoint location)
 }