Title: [106706] trunk/Source
Revision
106706
Author
[email protected]
Date
2012-02-03 16:22:32 -0800 (Fri, 03 Feb 2012)

Log Message

2012-02-03  Brady Eidson  <[email protected]>

<rdar://problem/10742441> and https://bugs.webkit.org/show_bug.cgi?id=77766
Need a WK2 API to filter which subframes go into WebArchives as they are created.

Reviewed by Darin Adler.

Source/WebCore:

This adds a filter callback object that allows clients to get called back for each
subframe that might be added to a WebArchive.

API only, No new layout tests.

* WebCore.exp.in:
* loader/archive/cf/LegacyWebArchive.cpp:
(WebCore::LegacyWebArchive::create):
(WebCore::LegacyWebArchive::createFromSelection):
* loader/archive/cf/LegacyWebArchive.h:
(FrameFilter):
(WebCore:: FrameFilter::~ FrameFilter):
(LegacyWebArchive):

Source/WebKit2:

Add a new WKBundleFrame API that takes a filter callback object to allow or reject
subframes from a WebArchive:
* WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp:
(WKBundleFrameCopyWebArchive):
(WKBundleFrameCopyWebArchiveFilteringSubframes):
* WebProcess/InjectedBundle/API/c/WKBundleFrame.h:

Implement the above API by calling through to WebCore:
* WebProcess/WebPage/WebFrame.cpp:
(WebFrameFilter):
(WebKit::WebFrameFilter::WebFrameFilter):
(WebKit::WebFrameFilter::shouldIncludeSubframe):
(WebKit::WebFrame::webArchiveData):
* WebProcess/WebPage/WebFrame.h:
(WebFrame):

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::getWebArchiveOfFrame):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (106705 => 106706)


--- trunk/Source/WebCore/ChangeLog	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebCore/ChangeLog	2012-02-04 00:22:32 UTC (rev 106706)
@@ -1,3 +1,24 @@
+2012-02-03  Brady Eidson  <[email protected]>
+
+        <rdar://problem/10742441> and https://bugs.webkit.org/show_bug.cgi?id=77766
+        Need a WK2 API to filter which subframes go into WebArchives as they are created.
+
+        Reviewed by Darin Adler.
+
+        This adds a filter callback object that allows clients to get called back for each
+        subframe that might be added to a WebArchive.
+
+        API only, No new layout tests.
+
+        * WebCore.exp.in:
+        * loader/archive/cf/LegacyWebArchive.cpp:
+        (WebCore::LegacyWebArchive::create):
+        (WebCore::LegacyWebArchive::createFromSelection):
+        * loader/archive/cf/LegacyWebArchive.h:
+        (FrameFilter):
+        (WebCore:: FrameFilter::~ FrameFilter):
+        (LegacyWebArchive):
+
 2012-02-03  Joshua Bell  <[email protected]>
 
         IndexedDB: Key generators not rolled back if insertion fails or is aborted

Modified: trunk/Source/WebCore/WebCore.exp.in (106705 => 106706)


--- trunk/Source/WebCore/WebCore.exp.in	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebCore/WebCore.exp.in	2012-02-04 00:22:32 UTC (rev 106706)
@@ -494,7 +494,7 @@
 __ZN7WebCore16LegacyWebArchive21rawDataRepresentationEv
 __ZN7WebCore16LegacyWebArchive6createEN3WTF10PassRefPtrINS_15ArchiveResourceEEERNS1_6VectorIS4_Lm0EEERNS5_INS2_IS0_EELm0EEE
 __ZN7WebCore16LegacyWebArchive6createEPNS_12SharedBufferE
-__ZN7WebCore16LegacyWebArchive6createEPNS_4NodeE
+__ZN7WebCore16LegacyWebArchive6createEPNS_4NodeEPNS_11FrameFilterE
 __ZN7WebCore16LegacyWebArchive6createEPNS_5FrameE
 __ZN7WebCore16LegacyWebArchive6createEPNS_5RangeE
 __ZN7WebCore16LegacyWebArchive6createEv

Modified: trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp (106705 => 106706)


--- trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp	2012-02-04 00:22:32 UTC (rev 106706)
@@ -428,7 +428,7 @@
 
 #endif
 
-PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Node* node)
+PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Node* node, FrameFilter* filter)
 {
     ASSERT(node);
     if (!node)
@@ -445,7 +445,7 @@
     if (nodeType != Node::DOCUMENT_NODE && nodeType != Node::DOCUMENT_TYPE_NODE)
         markupString = frame->documentTypeString() + markupString;
 
-    return create(markupString, frame, nodeList);
+    return create(markupString, frame, nodeList, filter);
 }
 
 PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Frame* frame)
@@ -494,10 +494,10 @@
     // FIXME: This is always "for interchange". Is that right? See the previous method.
     String markupString = frame->documentTypeString() + createMarkup(range, &nodeList, AnnotateForInterchange);
 
-    return create(markupString, frame, nodeList);
+    return create(markupString, frame, nodeList, 0);
 }
 
-PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, const Vector<Node*>& nodes)
+PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, const Vector<Node*>& nodes, FrameFilter* frameFilter)
 {
     ASSERT(frame);
     
@@ -521,7 +521,10 @@
         Frame* childFrame;
         if ((node->hasTagName(HTMLNames::frameTag) || node->hasTagName(HTMLNames::iframeTag) || node->hasTagName(HTMLNames::objectTag)) &&
              (childFrame = static_cast<HTMLFrameOwnerElement*>(node)->contentFrame())) {
-            RefPtr<LegacyWebArchive> subframeArchive = create(childFrame->document());
+            if (frameFilter && !frameFilter->shouldIncludeSubframe(childFrame))
+                continue;
+                
+            RefPtr<LegacyWebArchive> subframeArchive = create(childFrame->document(), frameFilter);
             
             if (subframeArchive)
                 subframeArchives.append(subframeArchive);
@@ -584,7 +587,7 @@
     Vector<Node*> nodeList;
     String markupString = frame->documentTypeString() + createMarkup(selectionRange.get(), &nodeList, AnnotateForInterchange);
     
-    RefPtr<LegacyWebArchive> archive = create(markupString, frame, nodeList);
+    RefPtr<LegacyWebArchive> archive = create(markupString, frame, nodeList, 0);
     
     if (!frame->document() || !frame->document()->isFrameSet())
         return archive.release();

Modified: trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.h (106705 => 106706)


--- trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.h	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.h	2012-02-04 00:22:32 UTC (rev 106706)
@@ -37,13 +37,19 @@
 class Node;
 class Range;
 
+class FrameFilter {
+public:
+    virtual ~FrameFilter() { }
+    virtual bool shouldIncludeSubframe(Frame*) const = 0;
+};
+
 class LegacyWebArchive : public Archive {
 public:
     static PassRefPtr<LegacyWebArchive> create();
     static PassRefPtr<LegacyWebArchive> create(SharedBuffer*);
     static PassRefPtr<LegacyWebArchive> create(const KURL&, SharedBuffer*);
     static PassRefPtr<LegacyWebArchive> create(PassRefPtr<ArchiveResource> mainResource, Vector<PassRefPtr<ArchiveResource> >& subresources, Vector<PassRefPtr<LegacyWebArchive> >& subframeArchives);
-    static PassRefPtr<LegacyWebArchive> create(Node*);
+    static PassRefPtr<LegacyWebArchive> create(Node*, FrameFilter* = 0);
     static PassRefPtr<LegacyWebArchive> create(Frame*);
     static PassRefPtr<LegacyWebArchive> createFromSelection(Frame*);
     static PassRefPtr<LegacyWebArchive> create(Range*);
@@ -57,7 +63,7 @@
 
     enum MainResourceStatus { Subresource, MainResource };
 
-    static PassRefPtr<LegacyWebArchive> create(const String& markupString, Frame*, const Vector<Node*>& nodes);
+    static PassRefPtr<LegacyWebArchive> create(const String& markupString, Frame*, const Vector<Node*>& nodes, FrameFilter*);
     static PassRefPtr<ArchiveResource> createResource(CFDictionaryRef);
     static ResourceResponse createResourceResponseFromMacArchivedData(CFDataRef);
     static ResourceResponse createResourceResponseFromPropertyListData(CFDataRef, CFStringRef responseDataType);

Modified: trunk/Source/WebKit2/ChangeLog (106705 => 106706)


--- trunk/Source/WebKit2/ChangeLog	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebKit2/ChangeLog	2012-02-04 00:22:32 UTC (rev 106706)
@@ -1,3 +1,29 @@
+2012-02-03  Brady Eidson  <[email protected]>
+
+        <rdar://problem/10742441> and https://bugs.webkit.org/show_bug.cgi?id=77766
+        Need a WK2 API to filter which subframes go into WebArchives as they are created.
+
+        Reviewed by Darin Adler.
+
+        Add a new WKBundleFrame API that takes a filter callback object to allow or reject
+        subframes from a WebArchive:
+        * WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp:
+        (WKBundleFrameCopyWebArchive):
+        (WKBundleFrameCopyWebArchiveFilteringSubframes):
+        * WebProcess/InjectedBundle/API/c/WKBundleFrame.h:
+
+        Implement the above API by calling through to WebCore:
+        * WebProcess/WebPage/WebFrame.cpp:
+        (WebFrameFilter):
+        (WebKit::WebFrameFilter::WebFrameFilter):
+        (WebKit::WebFrameFilter::shouldIncludeSubframe):
+        (WebKit::WebFrame::webArchiveData):
+        * WebProcess/WebPage/WebFrame.h:
+        (WebFrame):
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::getWebArchiveOfFrame):
+
 2012-02-03  Alexey Proskuryakov  <[email protected]>
 
         [Mac WK2] Use a minimally invasive way to fake plug-in process name

Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp (106705 => 106706)


--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp	2012-02-04 00:22:32 UTC (rev 106706)
@@ -249,8 +249,13 @@
 
 WKDataRef WKBundleFrameCopyWebArchive(WKBundleFrameRef frameRef)
 {
+    return WKBundleFrameCopyWebArchiveFilteringSubframes(frameRef, 0, 0);
+}
+
+WKDataRef WKBundleFrameCopyWebArchiveFilteringSubframes(WKBundleFrameRef frameRef, WKBundleFrameFrameFilterCallback frameFilterCallback, void* context)
+{
 #if PLATFORM(MAC) || PLATFORM(WIN)
-    RetainPtr<CFDataRef> data = ""
+    RetainPtr<CFDataRef> data = "" context);
     if (data)
         return WKDataCreate(CFDataGetBytePtr(data.get()), CFDataGetLength(data.get()));
 #endif

Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.h (106705 => 106706)


--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.h	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.h	2012-02-04 00:22:32 UTC (rev 106706)
@@ -71,9 +71,12 @@
 
 WK_EXPORT WKStringRef WKBundleFrameCopySuggestedFilenameForResourceWithURL(WKBundleFrameRef frame, WKURLRef url);
 WK_EXPORT WKStringRef WKBundleFrameCopyMIMETypeForResourceWithURL(WKBundleFrameRef frame, WKURLRef url);
-    
+
 WK_EXPORT WKDataRef WKBundleFrameCopyWebArchive(WKBundleFrameRef frame);
 
+typedef bool (*WKBundleFrameFrameFilterCallback)(WKBundleFrameRef frame, WKBundleFrameRef subframe, void* context);
+WK_EXPORT WKDataRef WKBundleFrameCopyWebArchiveFilteringSubframes(WKBundleFrameRef frame, WKBundleFrameFrameFilterCallback frameFilterCallback, void* context);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp (106705 => 106706)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp	2012-02-04 00:22:32 UTC (rev 106706)
@@ -30,6 +30,8 @@
 #include "InjectedBundleNodeHandle.h"
 #include "InjectedBundleRangeHandle.h"
 #include "InjectedBundleScriptWorld.h"
+#include "WKAPICast.h"
+#include "WKBundleAPICast.h"
 #include "WebChromeClient.h"
 #include "WebPage.h"
 #include "WebPageProxyMessages.h"
@@ -734,9 +736,40 @@
 }
 
 #if PLATFORM(MAC) || PLATFORM(WIN)
-RetainPtr<CFDataRef> WebFrame::webArchiveData() const
+
+class WebFrameFilter : public FrameFilter {
+public:
+    WebFrameFilter(WebFrame*, WebFrame::FrameFilterFunction, void* context);
+        
+private:
+    virtual bool shouldIncludeSubframe(Frame*) const OVERRIDE;
+
+    WebFrame* m_topLevelWebFrame;
+    WebFrame::FrameFilterFunction m_callback;
+    void* m_context;
+};
+
+WebFrameFilter::WebFrameFilter(WebFrame* topLevelWebFrame, WebFrame::FrameFilterFunction callback, void* context)
+    : m_topLevelWebFrame(topLevelWebFrame)
+    , m_callback(callback)
+    , m_context(context)
 {
-    if (RefPtr<LegacyWebArchive> archive = LegacyWebArchive::create(coreFrame()->document()))
+}
+
+bool WebFrameFilter::shouldIncludeSubframe(Frame* frame) const
+{
+    if (!m_callback)
+        return true;
+        
+    WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
+    return m_callback(toAPI(m_topLevelWebFrame), toAPI(webFrame), m_context);
+}
+
+RetainPtr<CFDataRef> WebFrame::webArchiveData(FrameFilterFunction callback, void* context)
+{
+    WebFrameFilter filter(this, callback, context);
+
+    if (RefPtr<LegacyWebArchive> archive = LegacyWebArchive::create(coreFrame()->document(), &filter))
         return archive->rawDataRepresentation();
     
     return 0;

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.h (106705 => 106706)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.h	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.h	2012-02-04 00:22:32 UTC (rev 106706)
@@ -28,6 +28,7 @@
 
 #include "APIObject.h"
 #include "ImmutableArray.h"
+#include "WKBase.h"
 #include "WebFrameLoaderClient.h"
 #include <_javascript_Core/JSBase.h>
 #include <WebCore/FrameLoaderClient.h>
@@ -137,7 +138,8 @@
     LoadListener* loadListener() const { return m_loadListener; }
     
 #if PLATFORM(MAC) || PLATFORM(WIN)
-    RetainPtr<CFDataRef> webArchiveData() const;
+    typedef bool (*FrameFilterFunction)(WKBundleFrameRef, WKBundleFrameRef subframe, void* context);
+    RetainPtr<CFDataRef> webArchiveData(FrameFilterFunction, void* context);
 #endif
 
 private:

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (106705 => 106706)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2012-02-04 00:16:45 UTC (rev 106705)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2012-02-04 00:22:32 UTC (rev 106706)
@@ -1797,7 +1797,7 @@
 #if PLATFORM(MAC) || PLATFORM(WIN)
     RetainPtr<CFDataRef> data;
     if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
-        if ((data = ""
+        if ((data = "" 0)))
             dataReference = CoreIPC::DataReference(CFDataGetBytePtr(data.get()), CFDataGetLength(data.get()));
     }
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to