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