⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 106706 in webkit


Ignore:
Timestamp:
Feb 3, 2012, 4:22:32 PM (15 years ago)
Author:
beidson@apple.com
Message:

2012-02-03 Brady Eidson <beidson@apple.com>

<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):

Location:
trunk/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r106705 r106706  
     12012-02-03  Brady Eidson  <beidson@apple.com>
     2
     3        <rdar://problem/10742441> and https://bugs.webkit.org/show_bug.cgi?id=77766
     4        Need a WK2 API to filter which subframes go into WebArchives as they are created.
     5
     6        Reviewed by Darin Adler.
     7
     8        This adds a filter callback object that allows clients to get called back for each
     9        subframe that might be added to a WebArchive.
     10
     11        API only, No new layout tests.
     12
     13        * WebCore.exp.in:
     14        * loader/archive/cf/LegacyWebArchive.cpp:
     15        (WebCore::LegacyWebArchive::create):
     16        (WebCore::LegacyWebArchive::createFromSelection):
     17        * loader/archive/cf/LegacyWebArchive.h:
     18        (FrameFilter):
     19        (WebCore:: FrameFilter::~ FrameFilter):
     20        (LegacyWebArchive):
     21
    1222012-02-03  Joshua Bell  <jsbell@chromium.org>
    223
  • trunk/Source/WebCore/WebCore.exp.in

    r106681 r106706  
    495495__ZN7WebCore16LegacyWebArchive6createEN3WTF10PassRefPtrINS_15ArchiveResourceEEERNS1_6VectorIS4_Lm0EEERNS5_INS2_IS0_EELm0EEE
    496496__ZN7WebCore16LegacyWebArchive6createEPNS_12SharedBufferE
    497 __ZN7WebCore16LegacyWebArchive6createEPNS_4NodeE
     497__ZN7WebCore16LegacyWebArchive6createEPNS_4NodeEPNS_11FrameFilterE
    498498__ZN7WebCore16LegacyWebArchive6createEPNS_5FrameE
    499499__ZN7WebCore16LegacyWebArchive6createEPNS_5RangeE
  • trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp

    r102080 r106706  
    429429#endif
    430430
    431 PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Node* node)
     431PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(Node* node, FrameFilter* filter)
    432432{
    433433    ASSERT(node);
     
    446446        markupString = frame->documentTypeString() + markupString;
    447447
    448     return create(markupString, frame, nodeList);
     448    return create(markupString, frame, nodeList, filter);
    449449}
    450450
     
    495495    String markupString = frame->documentTypeString() + createMarkup(range, &nodeList, AnnotateForInterchange);
    496496
    497     return create(markupString, frame, nodeList);
    498 }
    499 
    500 PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, const Vector<Node*>& nodes)
     497    return create(markupString, frame, nodeList, 0);
     498}
     499
     500PassRefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Frame* frame, const Vector<Node*>& nodes, FrameFilter* frameFilter)
    501501{
    502502    ASSERT(frame);
     
    522522        if ((node->hasTagName(HTMLNames::frameTag) || node->hasTagName(HTMLNames::iframeTag) || node->hasTagName(HTMLNames::objectTag)) &&
    523523             (childFrame = static_cast<HTMLFrameOwnerElement*>(node)->contentFrame())) {
    524             RefPtr<LegacyWebArchive> subframeArchive = create(childFrame->document());
     524            if (frameFilter && !frameFilter->shouldIncludeSubframe(childFrame))
     525                continue;
     526               
     527            RefPtr<LegacyWebArchive> subframeArchive = create(childFrame->document(), frameFilter);
    525528           
    526529            if (subframeArchive)
     
    585588    String markupString = frame->documentTypeString() + createMarkup(selectionRange.get(), &nodeList, AnnotateForInterchange);
    586589   
    587     RefPtr<LegacyWebArchive> archive = create(markupString, frame, nodeList);
     590    RefPtr<LegacyWebArchive> archive = create(markupString, frame, nodeList, 0);
    588591   
    589592    if (!frame->document() || !frame->document()->isFrameSet())
  • trunk/Source/WebCore/loader/archive/cf/LegacyWebArchive.h

    r95901 r106706  
    3838class Range;
    3939
     40class FrameFilter {
     41public:
     42    virtual ~FrameFilter() { }
     43    virtual bool shouldIncludeSubframe(Frame*) const = 0;
     44};
     45
    4046class LegacyWebArchive : public Archive {
    4147public:
     
    4450    static PassRefPtr<LegacyWebArchive> create(const KURL&, SharedBuffer*);
    4551    static PassRefPtr<LegacyWebArchive> create(PassRefPtr<ArchiveResource> mainResource, Vector<PassRefPtr<ArchiveResource> >& subresources, Vector<PassRefPtr<LegacyWebArchive> >& subframeArchives);
    46     static PassRefPtr<LegacyWebArchive> create(Node*);
     52    static PassRefPtr<LegacyWebArchive> create(Node*, FrameFilter* = 0);
    4753    static PassRefPtr<LegacyWebArchive> create(Frame*);
    4854    static PassRefPtr<LegacyWebArchive> createFromSelection(Frame*);
     
    5864    enum MainResourceStatus { Subresource, MainResource };
    5965
    60     static PassRefPtr<LegacyWebArchive> create(const String& markupString, Frame*, const Vector<Node*>& nodes);
     66    static PassRefPtr<LegacyWebArchive> create(const String& markupString, Frame*, const Vector<Node*>& nodes, FrameFilter*);
    6167    static PassRefPtr<ArchiveResource> createResource(CFDictionaryRef);
    6268    static ResourceResponse createResourceResponseFromMacArchivedData(CFDataRef);
  • trunk/Source/WebKit2/ChangeLog

    r106701 r106706  
     12012-02-03  Brady Eidson  <beidson@apple.com>
     2
     3        <rdar://problem/10742441> and https://bugs.webkit.org/show_bug.cgi?id=77766
     4        Need a WK2 API to filter which subframes go into WebArchives as they are created.
     5
     6        Reviewed by Darin Adler.
     7
     8        Add a new WKBundleFrame API that takes a filter callback object to allow or reject
     9        subframes from a WebArchive:
     10        * WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp:
     11        (WKBundleFrameCopyWebArchive):
     12        (WKBundleFrameCopyWebArchiveFilteringSubframes):
     13        * WebProcess/InjectedBundle/API/c/WKBundleFrame.h:
     14
     15        Implement the above API by calling through to WebCore:
     16        * WebProcess/WebPage/WebFrame.cpp:
     17        (WebFrameFilter):
     18        (WebKit::WebFrameFilter::WebFrameFilter):
     19        (WebKit::WebFrameFilter::shouldIncludeSubframe):
     20        (WebKit::WebFrame::webArchiveData):
     21        * WebProcess/WebPage/WebFrame.h:
     22        (WebFrame):
     23
     24        * WebProcess/WebPage/WebPage.cpp:
     25        (WebKit::WebPage::getWebArchiveOfFrame):
     26
    1272012-02-03  Alexey Proskuryakov  <ap@apple.com>
    228
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp

    r106139 r106706  
    250250WKDataRef WKBundleFrameCopyWebArchive(WKBundleFrameRef frameRef)
    251251{
     252    return WKBundleFrameCopyWebArchiveFilteringSubframes(frameRef, 0, 0);
     253}
     254
     255WKDataRef WKBundleFrameCopyWebArchiveFilteringSubframes(WKBundleFrameRef frameRef, WKBundleFrameFrameFilterCallback frameFilterCallback, void* context)
     256{
    252257#if PLATFORM(MAC) || PLATFORM(WIN)
    253     RetainPtr<CFDataRef> data = toImpl(frameRef)->webArchiveData();
     258    RetainPtr<CFDataRef> data = toImpl(frameRef)->webArchiveData(frameFilterCallback, context);
    254259    if (data)
    255260        return WKDataCreate(CFDataGetBytePtr(data.get()), CFDataGetLength(data.get()));
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.h

    r106139 r106706  
    7272WK_EXPORT WKStringRef WKBundleFrameCopySuggestedFilenameForResourceWithURL(WKBundleFrameRef frame, WKURLRef url);
    7373WK_EXPORT WKStringRef WKBundleFrameCopyMIMETypeForResourceWithURL(WKBundleFrameRef frame, WKURLRef url);
    74    
     74
    7575WK_EXPORT WKDataRef WKBundleFrameCopyWebArchive(WKBundleFrameRef frame);
     76
     77typedef bool (*WKBundleFrameFrameFilterCallback)(WKBundleFrameRef frame, WKBundleFrameRef subframe, void* context);
     78WK_EXPORT WKDataRef WKBundleFrameCopyWebArchiveFilteringSubframes(WKBundleFrameRef frame, WKBundleFrameFrameFilterCallback frameFilterCallback, void* context);
    7679
    7780#ifdef __cplusplus
  • trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp

    r106139 r106706  
    3131#include "InjectedBundleRangeHandle.h"
    3232#include "InjectedBundleScriptWorld.h"
     33#include "WKAPICast.h"
     34#include "WKBundleAPICast.h"
    3335#include "WebChromeClient.h"
    3436#include "WebPage.h"
     
    735737
    736738#if PLATFORM(MAC) || PLATFORM(WIN)
    737 RetainPtr<CFDataRef> WebFrame::webArchiveData() const
    738 {
    739     if (RefPtr<LegacyWebArchive> archive = LegacyWebArchive::create(coreFrame()->document()))
     739
     740class WebFrameFilter : public FrameFilter {
     741public:
     742    WebFrameFilter(WebFrame*, WebFrame::FrameFilterFunction, void* context);
     743       
     744private:
     745    virtual bool shouldIncludeSubframe(Frame*) const OVERRIDE;
     746
     747    WebFrame* m_topLevelWebFrame;
     748    WebFrame::FrameFilterFunction m_callback;
     749    void* m_context;
     750};
     751
     752WebFrameFilter::WebFrameFilter(WebFrame* topLevelWebFrame, WebFrame::FrameFilterFunction callback, void* context)
     753    : m_topLevelWebFrame(topLevelWebFrame)
     754    , m_callback(callback)
     755    , m_context(context)
     756{
     757}
     758
     759bool WebFrameFilter::shouldIncludeSubframe(Frame* frame) const
     760{
     761    if (!m_callback)
     762        return true;
     763       
     764    WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame();
     765    return m_callback(toAPI(m_topLevelWebFrame), toAPI(webFrame), m_context);
     766}
     767
     768RetainPtr<CFDataRef> WebFrame::webArchiveData(FrameFilterFunction callback, void* context)
     769{
     770    WebFrameFilter filter(this, callback, context);
     771
     772    if (RefPtr<LegacyWebArchive> archive = LegacyWebArchive::create(coreFrame()->document(), &filter))
    740773        return archive->rawDataRepresentation();
    741774   
  • trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.h

    r106139 r106706  
    2929#include "APIObject.h"
    3030#include "ImmutableArray.h"
     31#include "WKBase.h"
    3132#include "WebFrameLoaderClient.h"
    3233#include <JavaScriptCore/JSBase.h>
     
    138139   
    139140#if PLATFORM(MAC) || PLATFORM(WIN)
    140     RetainPtr<CFDataRef> webArchiveData() const;
     141    typedef bool (*FrameFilterFunction)(WKBundleFrameRef, WKBundleFrameRef subframe, void* context);
     142    RetainPtr<CFDataRef> webArchiveData(FrameFilterFunction, void* context);
    141143#endif
    142144
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r106511 r106706  
    17981798    RetainPtr<CFDataRef> data;
    17991799    if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
    1800         if ((data = frame->webArchiveData()))
     1800        if ((data = frame->webArchiveData(0, 0)))
    18011801            dataReference = CoreIPC::DataReference(CFDataGetBytePtr(data.get()), CFDataGetLength(data.get()));
    18021802    }
Note: See TracChangeset for help on using the changeset viewer.