Changeset 140875 in webkit


Ignore:
Timestamp:
Jan 25, 2013 4:10:46 PM (11 years ago)
Author:
aestes@apple.com
Message:

Wrap content filtering code in an object
https://bugs.webkit.org/show_bug.cgi?id=107914

Reviewed by Alexey Proskuryakov.

Source/WebCore:

Content filtering code currently requires explicit and somewhat complex
lifetime management of the WebFilterEvaluator object for correct
behavior. Simplify this by wrapping WebFilterEvaluator in an object and
have MainResourceLoader implicitly manage its lifetime by holding it in
an OwnPtr.

This change has benefits other than the simplified lifetime management.
It removes direct calls into WebKitSystemInterface from the loader, and
it allows us to keep a strong reference to the replacement data
returned from wkFilterAddData() and wkFilterDataComplete() rather than
relying on it being autoreleased.

  • WebCore.exp.in: Updated to match changes in WebCoreSystemInterface.
  • WebCore.xcodeproj/project.pbxproj: Added new files.
  • loader/MainResourceLoader.cpp:

(WebCore::MainResourceLoader::MainResourceLoader): Removed unneeded initialization.
(WebCore::MainResourceLoader::~MainResourceLoader): Removed an unneeded ASSERT().
(WebCore::MainResourceLoader::cancel): Removed unneeded wkFilterRelease().
(WebCore::MainResourceLoader::responseReceived): Created a
ContentFilter object rather than calling wkFilterCreateInstance().
(WebCore::MainResourceLoader::dataReceived): Rewrote content filtering
logic in terms of the wrapper object. Removed any explicit lifetime
management.
(WebCore::MainResourceLoader::didFinishLoading): Ditto.
(WebCore::MainResourceLoader::notifyFinished): Removed unneeded wkFilterRelease().

  • loader/MainResourceLoader.h:
  • platform/ContentFilter.h: Added.
  • platform/mac/ContentFilterMac.mm: Added.

(WebCore::ContentFilter::create):
(WebCore::ContentFilter::ContentFilter):
(WebCore::ContentFilter::isEnabled): Returned the result of wkFilterIsManagedSession().
(WebCore::ContentFilter::addData): Called wkFilterAddData() and stored
the resulting NSData in m_replacementData.
(WebCore::ContentFilter::finishedAddingData): Called wkFilterDataComplete()
and stored the resulting NSData in m_replacementData.
(WebCore::ContentFilter::needsMoreData): Returned the result of wkFilterIsBuffering().
(WebCore::ContentFilter::didBlockData): Returned the result of wkFilterWasBlocked().
(WebCore::ContentFilter::getReplacementData): Returned the data stored in m_replacementData.

  • platform/mac/WebCoreSystemInterface.h: Updated to reflect changes in WKSI.
  • platform/mac/WebCoreSystemInterface.mm: Ditto.
  • WebCore.exp.in:
  • WebCore.xcodeproj/project.pbxproj:
  • loader/MainResourceLoader.cpp:

(WebCore::MainResourceLoader::MainResourceLoader):
(WebCore::MainResourceLoader::~MainResourceLoader):
(WebCore::MainResourceLoader::cancel):
(WebCore::MainResourceLoader::responseReceived):
(WebCore::MainResourceLoader::dataReceived):
(WebCore::MainResourceLoader::didFinishLoading):
(WebCore::MainResourceLoader::notifyFinished):

  • loader/MainResourceLoader.h:

(MainResourceLoader):

  • platform/ContentFilter.h: Added.

(WebCore):
(ContentFilter):

  • platform/mac/ContentFilterMac.mm: Added.

(WebCore):
(WebCore::ContentFilter::create):
(WebCore::ContentFilter::ContentFilter):
(WebCore::ContentFilter::isEnabled):
(WebCore::ContentFilter::addData):
(WebCore::ContentFilter::finishedAddingData):
(WebCore::ContentFilter::needsMoreData):
(WebCore::ContentFilter::didBlockData):
(WebCore::ContentFilter::getReplacementData):

  • platform/mac/WebCoreSystemInterface.h:
  • platform/mac/WebCoreSystemInterface.mm:

Source/WebKit/mac:

  • WebCoreSupport/WebSystemInterface.mm:

(InitWebCoreSystemInterface): Updated to reflect changes in WKSI.

Source/WebKit2:

  • WebProcess/WebCoreSupport/mac/WebSystemInterface.mm:

(InitWebCoreSystemInterface): Updated to reflect changes in WKSI.

Location:
trunk/Source
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r140873 r140875  
     12013-01-25  Andy Estes  <aestes@apple.com>
     2
     3        Wrap content filtering code in an object
     4        https://bugs.webkit.org/show_bug.cgi?id=107914
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        Content filtering code currently requires explicit and somewhat complex
     9        lifetime management of the WebFilterEvaluator object for correct
     10        behavior. Simplify this by wrapping WebFilterEvaluator in an object and
     11        have MainResourceLoader implicitly manage its lifetime by holding it in
     12        an OwnPtr.
     13
     14        This change has benefits other than the simplified lifetime management.
     15        It removes direct calls into WebKitSystemInterface from the loader, and
     16        it allows us to keep a strong reference to the replacement data
     17        returned from wkFilterAddData() and wkFilterDataComplete() rather than
     18        relying on it being autoreleased.
     19
     20        * WebCore.exp.in: Updated to match changes in WebCoreSystemInterface.
     21        * WebCore.xcodeproj/project.pbxproj: Added new files.
     22        * loader/MainResourceLoader.cpp:
     23        (WebCore::MainResourceLoader::MainResourceLoader): Removed unneeded initialization.
     24        (WebCore::MainResourceLoader::~MainResourceLoader): Removed an unneeded ASSERT().
     25        (WebCore::MainResourceLoader::cancel): Removed unneeded wkFilterRelease().
     26        (WebCore::MainResourceLoader::responseReceived): Created a
     27        ContentFilter object rather than calling wkFilterCreateInstance().
     28        (WebCore::MainResourceLoader::dataReceived): Rewrote content filtering
     29        logic in terms of the wrapper object. Removed any explicit lifetime
     30        management.
     31        (WebCore::MainResourceLoader::didFinishLoading): Ditto.
     32        (WebCore::MainResourceLoader::notifyFinished): Removed unneeded wkFilterRelease().
     33        * loader/MainResourceLoader.h:
     34        * platform/ContentFilter.h: Added.
     35        * platform/mac/ContentFilterMac.mm: Added.
     36        (WebCore::ContentFilter::create):
     37        (WebCore::ContentFilter::ContentFilter):
     38        (WebCore::ContentFilter::isEnabled): Returned the result of wkFilterIsManagedSession().
     39        (WebCore::ContentFilter::addData): Called wkFilterAddData() and stored
     40        the resulting NSData in m_replacementData.
     41        (WebCore::ContentFilter::finishedAddingData): Called wkFilterDataComplete()
     42        and stored the resulting NSData in m_replacementData.
     43        (WebCore::ContentFilter::needsMoreData): Returned the result of wkFilterIsBuffering().
     44        (WebCore::ContentFilter::didBlockData): Returned the result of wkFilterWasBlocked().
     45        (WebCore::ContentFilter::getReplacementData): Returned the data stored in m_replacementData.
     46        * platform/mac/WebCoreSystemInterface.h: Updated to reflect changes in WKSI.
     47        * platform/mac/WebCoreSystemInterface.mm: Ditto.
     48
     49        * WebCore.exp.in:
     50        * WebCore.xcodeproj/project.pbxproj:
     51        * loader/MainResourceLoader.cpp:
     52        (WebCore::MainResourceLoader::MainResourceLoader):
     53        (WebCore::MainResourceLoader::~MainResourceLoader):
     54        (WebCore::MainResourceLoader::cancel):
     55        (WebCore::MainResourceLoader::responseReceived):
     56        (WebCore::MainResourceLoader::dataReceived):
     57        (WebCore::MainResourceLoader::didFinishLoading):
     58        (WebCore::MainResourceLoader::notifyFinished):
     59        * loader/MainResourceLoader.h:
     60        (MainResourceLoader):
     61        * platform/ContentFilter.h: Added.
     62        (WebCore):
     63        (ContentFilter):
     64        * platform/mac/ContentFilterMac.mm: Added.
     65        (WebCore):
     66        (WebCore::ContentFilter::create):
     67        (WebCore::ContentFilter::ContentFilter):
     68        (WebCore::ContentFilter::isEnabled):
     69        (WebCore::ContentFilter::addData):
     70        (WebCore::ContentFilter::finishedAddingData):
     71        (WebCore::ContentFilter::needsMoreData):
     72        (WebCore::ContentFilter::didBlockData):
     73        (WebCore::ContentFilter::getReplacementData):
     74        * platform/mac/WebCoreSystemInterface.h:
     75        * platform/mac/WebCoreSystemInterface.mm:
     76
    1772013-01-25  Simon Fraser  <simon.fraser@apple.com>
    278
  • trunk/Source/WebCore/WebCore.exp.in

    r140572 r140875  
    21582158_wkFilterCreateInstance
    21592159_wkFilterDataComplete
     2160_wkFilterIsBuffering
    21602161_wkFilterIsManagedSession
    2161 _wkFilterRelease
    21622162_wkFilterWasBlocked
    21632163#endif
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r140863 r140875  
    748748                2917B5631473496C0052C9D0 /* LayerFlushSchedulerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 2917B5601473496C0052C9D0 /* LayerFlushSchedulerClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    749749                2917B566147349950052C9D0 /* LayerFlushSchedulerMac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2917B565147349950052C9D0 /* LayerFlushSchedulerMac.cpp */; };
     750                2919A1E916B3376600787213 /* ContentFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2919A1E816B3376600787213 /* ContentFilter.h */; settings = {ATTRIBUTES = (Private, ); }; };
     751                2919A1EB16B3378900787213 /* ContentFilterMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2919A1EA16B3378900787213 /* ContentFilterMac.mm */; };
    750752                293EAE1F1356B2FE0067ACF9 /* RuntimeApplicationChecks.h in Headers */ = {isa = PBXBuildFile; fileRef = 293EAE1E1356B2FE0067ACF9 /* RuntimeApplicationChecks.h */; settings = {ATTRIBUTES = (Private, ); }; };
    751753                293EAE211356B32E0067ACF9 /* RuntimeApplicationChecks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 293EAE201356B32E0067ACF9 /* RuntimeApplicationChecks.cpp */; };
     
    80068008                2917B5601473496C0052C9D0 /* LayerFlushSchedulerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LayerFlushSchedulerClient.h; path = ca/LayerFlushSchedulerClient.h; sourceTree = "<group>"; };
    80078009                2917B565147349950052C9D0 /* LayerFlushSchedulerMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LayerFlushSchedulerMac.cpp; path = ca/mac/LayerFlushSchedulerMac.cpp; sourceTree = "<group>"; };
     8010                2919A1E816B3376600787213 /* ContentFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContentFilter.h; sourceTree = "<group>"; };
     8011                2919A1EA16B3378900787213 /* ContentFilterMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ContentFilterMac.mm; sourceTree = "<group>"; };
    80088012                293EAE1E1356B2FE0067ACF9 /* RuntimeApplicationChecks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuntimeApplicationChecks.h; sourceTree = "<group>"; };
    80098013                293EAE201356B32E0067ACF9 /* RuntimeApplicationChecks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RuntimeApplicationChecks.cpp; sourceTree = "<group>"; };
     
    1605816062                                2D90660B0665D937006B6F1A /* ClipboardMac.h */,
    1605916063                                2D90660C0665D937006B6F1A /* ClipboardMac.mm */,
     16064                                2919A1EA16B3378900787213 /* ContentFilterMac.mm */,
    1606016065                                06027CB20B1CC03D00884B2D /* ContextMenuItemMac.mm */,
    1606116066                                93B6A0E90B0BCA8400F5027A /* ContextMenuMac.mm */,
     
    2131221317                                C37CDEBC149EF2030042090D /* ColorChooserClient.h */,
    2131321318                                BCC8CFCA0986CD2400140BF2 /* ColorData.gperf */,
     21319                                2919A1E816B3376600787213 /* ContentFilter.h */,
    2131421320                                41D015C90F4B5C71004A662F /* ContentType.cpp */,
    2131521321                                41D015C80F4B5C71004A662F /* ContentType.h */,
     
    2628126287                                FB91392A16AE4FC0001FE682 /* JSDOMPath.h in Headers */,
    2628226288                                2E07753416B1BD4C004D9936 /* MicroDataAttributeTokenList.h in Headers */,
     26289                                2919A1E916B3376600787213 /* ContentFilter.h in Headers */,
    2628326290                        );
    2628426291                        runOnlyForDeploymentPostprocessing = 0;
     
    2943229439                                FB91392B16AE4FC0001FE682 /* JSDOMPath.cpp in Sources */,
    2943329440                                2E07753116B1BD13004D9936 /* MicroDataAttributeTokenList.cpp in Sources */,
     29441                                2919A1EB16B3378900787213 /* ContentFilterMac.mm in Sources */,
    2943429442                        );
    2943529443                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/loader/MainResourceLoader.cpp

    r140366 r140875  
    6363
    6464#if USE(CONTENT_FILTERING)
    65 #include "WebCoreSystemInterface.h"
     65#include "ContentFilter.h"
    6666#endif
    6767
     
    7575    , m_timeOfLastDataReceived(0.0)
    7676    , m_substituteDataLoadIdentifier(0)
    77 #if USE(CONTENT_FILTERING)
    78     , m_filter(0)
    79 #endif
    8077{
    8178}
     
    8481{
    8582    clearResource();
    86 #if USE(CONTENT_FILTERING)
    87     ASSERT(!m_filter);
    88 #endif
    8983}
    9084
     
    136130    clearResource();
    137131    receivedError(resourceError);
    138 
    139 #if USE(CONTENT_FILTERING)
    140     if (m_filter) {
    141         wkFilterRelease(m_filter);
    142         m_filter = 0;
    143     }
    144 #endif
    145132}
    146133
     
    455442
    456443#if USE(CONTENT_FILTERING)
    457     if (r.url().protocolIs("https") && wkFilterIsManagedSession())
    458         m_filter = wkFilterCreateInstance(r.nsURLResponse());
     444    if (r.url().protocolIs("https") && ContentFilter::isEnabled())
     445        m_contentFilter = ContentFilter::create(r);
    459446#endif
    460447
     
    485472
    486473#if USE(CONTENT_FILTERING)
    487     if (m_filter) {
    488         ASSERT(!wkFilterWasBlocked(m_filter));
    489         const char* blockedData = wkFilterAddData(m_filter, data, &length);
    490         // If we don't have blockedData, that means we're still accumulating data
    491         if (!blockedData) {
    492             // Transition to committed state.
     474    bool loadWasBlockedBeforeFinishing = false;
     475    if (m_contentFilter && m_contentFilter->needsMoreData()) {
     476        m_contentFilter->addData(data, length);
     477
     478        if (m_contentFilter->needsMoreData()) {
     479            // Since the filter still needs more data to make a decision,
     480            // transition back to the committed state so that we don't partially
     481            // load content that might later be blocked.
    493482            documentLoader()->receivedData(0, 0);
    494483            return;
    495484        }
    496485
    497         data = blockedData;
     486        data = m_contentFilter->getReplacementData(length);
     487        loadWasBlockedBeforeFinishing = m_contentFilter->didBlockData();
    498488    }
    499489#endif
     
    513503
    514504#if USE(CONTENT_FILTERING)
    515     if (WebFilterEvaluator *filter = m_filter) {
    516         // If we got here, it means we know if we were blocked or not. If we were blocked, we're
    517         // done loading the page altogether. Either way, we don't need the filter anymore.
    518 
    519         // Remove this->m_filter early so didFinishLoading doesn't see it.
    520         m_filter = 0;
    521         if (wkFilterWasBlocked(filter))
    522             cancel();
    523         wkFilterRelease(filter);
    524     }
     505    if (loadWasBlockedBeforeFinishing)
     506        cancel();
    525507#endif
    526508}
     
    545527
    546528#if USE(CONTENT_FILTERING)
    547     if (m_filter) {
     529    if (m_contentFilter && m_contentFilter->needsMoreData()) {
     530        m_contentFilter->finishedAddingData();
     531
    548532        int length;
    549         const char* data = wkFilterDataComplete(m_filter, &length);
    550         WebFilterEvaluator *filter = m_filter;
    551         // Remove this->m_filter early so didReceiveData doesn't see it.
    552         m_filter = 0;
     533        const char* data = m_contentFilter->getReplacementData(length);
    553534        if (data)
    554535            dataReceived(m_resource.get(), data, length);
    555         wkFilterRelease(filter);
    556536    }
    557537#endif
     
    579559        return;
    580560    }
    581 
    582 #if USE(CONTENT_FILTERING)
    583     if (m_filter) {
    584         wkFilterRelease(m_filter);
    585         m_filter = 0;
    586     }
    587 #endif
    588561
    589562    const ResourceError& error = m_resource->resourceError();
  • trunk/Source/WebCore/loader/MainResourceLoader.h

    r140366 r140875  
    3737#include <wtf/Forward.h>
    3838
    39 #if USE(CONTENT_FILTERING)
    40 OBJC_CLASS WebFilterEvaluator;
    41 #endif
    42 
    4339#if HAVE(RUNLOOP_TIMER)
    4440#include "RunLoopTimer.h"
     
    5147class FormState;
    5248class ResourceRequest;
     49   
     50#if USE(CONTENT_FILTERING)
     51class ContentFilter;
     52#endif
    5353
    5454class MainResourceLoader : public RefCounted<MainResourceLoader>, public CachedRawResourceClient {
     
    132132
    133133#if USE(CONTENT_FILTERING)
    134     WebFilterEvaluator *m_filter;
     134    OwnPtr<ContentFilter> m_contentFilter;
    135135#endif
    136136};
  • trunk/Source/WebCore/platform/mac/WebCoreSystemInterface.h

    r140366 r140875  
    340340extern BOOL (*wkFilterIsManagedSession)(void);
    341341extern WebFilterEvaluator *(*wkFilterCreateInstance)(NSURLResponse *);
    342 extern void (*wkFilterRelease)(WebFilterEvaluator *);
    343342extern BOOL (*wkFilterWasBlocked)(WebFilterEvaluator *);
    344 extern const char* (*wkFilterAddData)(WebFilterEvaluator *, const char* data, int* length);
    345 extern const char* (*wkFilterDataComplete)(WebFilterEvaluator *, int* length);
     343extern BOOL (*wkFilterIsBuffering)(WebFilterEvaluator *);
     344extern NSData *(*wkFilterAddData)(WebFilterEvaluator *, NSData *);
     345extern NSData *(*wkFilterDataComplete)(WebFilterEvaluator *);
    346346#endif
    347347
  • trunk/Source/WebCore/platform/mac/WebCoreSystemInterface.mm

    r140366 r140875  
    212212BOOL (*wkFilterIsManagedSession)(void);
    213213WebFilterEvaluator *(*wkFilterCreateInstance)(NSURLResponse *);
    214 void (*wkFilterRelease)(WebFilterEvaluator *);
    215214BOOL (*wkFilterWasBlocked)(WebFilterEvaluator *);
    216 const char* (*wkFilterAddData)(WebFilterEvaluator *, const char* data, int* length);
    217 const char* (*wkFilterDataComplete)(WebFilterEvaluator *, int* length);
     215BOOL (*wkFilterIsBuffering)(WebFilterEvaluator *);
     216NSData *(*wkFilterAddData)(WebFilterEvaluator *, NSData *);
     217NSData *(*wkFilterDataComplete)(WebFilterEvaluator *);
    218218#endif
    219219
  • trunk/Source/WebKit/mac/ChangeLog

    r140793 r140875  
     12013-01-25  Andy Estes  <aestes@apple.com>
     2
     3        Wrap content filtering code in an object
     4        https://bugs.webkit.org/show_bug.cgi?id=107914
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        * WebCoreSupport/WebSystemInterface.mm:
     9        (InitWebCoreSystemInterface): Updated to reflect changes in WKSI.
     10
    1112013-01-24  Dan Bernstein  <mitz@apple.com>
    212
  • trunk/Source/WebKit/mac/WebCoreSupport/WebSystemInterface.mm

    r140366 r140875  
    209209    INIT(FilterIsManagedSession);
    210210    INIT(FilterCreateInstance);
    211     INIT(FilterRelease);
    212211    INIT(FilterWasBlocked);
     212    INIT(FilterIsBuffering);
    213213    INIT(FilterAddData);
    214214    INIT(FilterDataComplete);
  • trunk/Source/WebKit2/ChangeLog

    r140874 r140875  
     12013-01-25  Andy Estes  <aestes@apple.com>
     2
     3        Wrap content filtering code in an object
     4        https://bugs.webkit.org/show_bug.cgi?id=107914
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        * WebProcess/WebCoreSupport/mac/WebSystemInterface.mm:
     9        (InitWebCoreSystemInterface): Updated to reflect changes in WKSI.
     10
    1112013-01-25  Brady Eidson  <beidson@apple.com>
    212
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/mac/WebSystemInterface.mm

    r140366 r140875  
    172172        INIT(FilterIsManagedSession);
    173173        INIT(FilterCreateInstance);
    174         INIT(FilterRelease);
    175174        INIT(FilterWasBlocked);
     175        INIT(FilterIsBuffering);
    176176        INIT(FilterAddData);
    177177        INIT(FilterDataComplete);
Note: See TracChangeset for help on using the changeset viewer.