Changeset 153689 in webkit


Ignore:
Timestamp:
Aug 3, 2013 6:43:24 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

PreloadScanner preloads external CSS with non-matching media attribute
https://bugs.webkit.org/show_bug.cgi?id=106198

Patch by Yoav Weiss <yoav@yoav.ws> on 2013-08-03
Reviewed by Dean Jackson.

Source/WebCore:

Test: http/tests/loading/preload-css-test.html

  • html/parser/HTMLPreloadScanner.cpp:

Remove m_linkMediaAttributeIsScreen
Remove MediaQueryEvaluator calls
Add m_mediaAttribute that gets the value of the "media" attribute
Pass m_mediaAttribute to PreloadRequest
(WebCore::TokenPreloadScanner::StartTagScanner::StartTagScanner):
(WebCore::TokenPreloadScanner::StartTagScanner::createPreloadRequest):
(WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):
(WebCore::TokenPreloadScanner::StartTagScanner::resourceType):
(WebCore::TokenPreloadScanner::StartTagScanner::shouldPreload):

  • html/parser/HTMLResourcePreloader.cpp:

Add MediaQueryEvaluator calls to see if "media" matches
Perform preload only to resource with a matching media (if media exists)
(WebCore::PreloadRequest::isSafeToSendToAnotherThread):
(WebCore::mediaAttributeMatches):
(WebCore::HTMLResourcePreloader::preload):

  • html/parser/HTMLResourcePreloader.h:

Add a constructor with a mediaAttribute value
Add m_mediaAttribute & its getter.
(WebCore::PreloadRequest::create):
(WebCore::PreloadRequest::media):
(WebCore::PreloadRequest::PreloadRequest):

LayoutTests:

  • http/tests/loading/preload-css-test-expected.txt: Added.
  • http/tests/loading/preload-css-test.html: Added.
  • http/tests/loading/resources/big_mq.css: Added.
  • http/tests/loading/resources/small_mq.css: Added.
  • http/tests/local/link-stylesheet-load-order-preload-expected.txt:
Location:
trunk
Files:
4 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r153685 r153689  
     12013-08-03  Yoav Weiss  <yoav@yoav.ws>
     2
     3        PreloadScanner preloads external CSS with non-matching media attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=106198
     5
     6        Reviewed by Dean Jackson.
     7
     8        * http/tests/loading/preload-css-test-expected.txt: Added.
     9        * http/tests/loading/preload-css-test.html: Added.
     10        * http/tests/loading/resources/big_mq.css: Added.
     11        * http/tests/loading/resources/small_mq.css: Added.
     12        * http/tests/local/link-stylesheet-load-order-preload-expected.txt:
     13
    1142013-08-02  Benjamin Poulain  <bpoulain@apple.com>
    215
  • trunk/LayoutTests/http/tests/local/link-stylesheet-load-order-preload-expected.txt

    r74476 r153689  
    88media-all.css
    99media-screen.css
     10media-screen-query-success.css
    1011media-braille-screen.css
    1112no-media-2.css
     
    1314media-all-2.css
    1415media-screen-2.css
     16media-screen-query-success-2.css
    1517media-braille-screen-2.css
    16 media-screen-query-success.css
    17 media-screen-query-success-2.css
    1818script-2.js
    1919image.jpg
  • trunk/Source/WebCore/ChangeLog

    r153688 r153689  
     12013-08-03  Yoav Weiss  <yoav@yoav.ws>
     2
     3        PreloadScanner preloads external CSS with non-matching media attribute
     4        https://bugs.webkit.org/show_bug.cgi?id=106198
     5
     6        Reviewed by Dean Jackson.
     7
     8        Test: http/tests/loading/preload-css-test.html
     9
     10        * html/parser/HTMLPreloadScanner.cpp:
     11        Remove m_linkMediaAttributeIsScreen
     12        Remove MediaQueryEvaluator calls
     13        Add m_mediaAttribute that gets the value of the "media" attribute
     14        Pass m_mediaAttribute to PreloadRequest
     15        (WebCore::TokenPreloadScanner::StartTagScanner::StartTagScanner):
     16        (WebCore::TokenPreloadScanner::StartTagScanner::createPreloadRequest):
     17        (WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):
     18        (WebCore::TokenPreloadScanner::StartTagScanner::resourceType):
     19        (WebCore::TokenPreloadScanner::StartTagScanner::shouldPreload):
     20        * html/parser/HTMLResourcePreloader.cpp:
     21        Add MediaQueryEvaluator calls to see if "media" matches
     22        Perform preload only to resource with a matching media (if media exists)
     23        (WebCore::PreloadRequest::isSafeToSendToAnotherThread):
     24        (WebCore::mediaAttributeMatches):
     25        (WebCore::HTMLResourcePreloader::preload):
     26        * html/parser/HTMLResourcePreloader.h:
     27        Add a constructor with a mediaAttribute value
     28        Add m_mediaAttribute & its getter.
     29        (WebCore::PreloadRequest::create):
     30        (WebCore::PreloadRequest::media):
     31        (WebCore::PreloadRequest::PreloadRequest):
     32
    1332013-08-03  Andreas Kling  <akling@apple.com>
    234
  • trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp

    r151947 r153689  
    3535#include "InputTypeNames.h"
    3636#include "LinkRelAttribute.h"
    37 #include "MediaList.h"
    38 #include "MediaQueryEvaluator.h"
    3937#include <wtf/MainThread.h>
    4038
     
    111109        : m_tagId(tagId)
    112110        , m_linkIsStyleSheet(false)
    113         , m_linkMediaAttributeIsScreen(true)
    114111        , m_inputIsImage(false)
    115112    {
     
    143140            return nullptr;
    144141
    145         OwnPtr<PreloadRequest> request = PreloadRequest::create(initiatorFor(m_tagId), m_urlToLoad, predictedBaseURL, resourceType());
     142        OwnPtr<PreloadRequest> request = PreloadRequest::create(initiatorFor(m_tagId), m_urlToLoad, predictedBaseURL, resourceType(), m_mediaAttribute);
    146143        request->setCrossOriginModeAllowsCookies(crossOriginModeAllowsCookies());
    147144        request->setCharset(charset());
     
    180177                m_linkIsStyleSheet = relAttributeIsStyleSheet(attributeValue);
    181178            else if (match(attributeName, mediaAttr))
    182                 m_linkMediaAttributeIsScreen = linkMediaAttributeIsScreen(attributeValue);
     179                m_mediaAttribute = attributeValue;
    183180        } else if (m_tagId == InputTagId) {
    184181            if (match(attributeName, srcAttr))
     
    195192    }
    196193
    197     static bool linkMediaAttributeIsScreen(const String& attributeValue)
    198     {
    199         if (attributeValue.isEmpty())
    200             return true;
    201         RefPtr<MediaQuerySet> mediaQueries = MediaQuerySet::createAllowingDescriptionSyntax(attributeValue);
    202    
    203         // Only preload screen media stylesheets. Used this way, the evaluator evaluates to true for any
    204         // rules containing complex queries (full evaluation is possible but it requires a frame and a style selector which
    205         // may be problematic here).
    206         MediaQueryEvaluator mediaQueryEvaluator("screen");
    207         return mediaQueryEvaluator.eval(mediaQueries.get());
    208     }
    209 
    210194    void setUrlToLoad(const String& attributeValue)
    211195    {
     
    231215        if (m_tagId == ImgTagId || (m_tagId == InputTagId && m_inputIsImage))
    232216            return CachedResource::ImageResource;
    233         if (m_tagId == LinkTagId && m_linkIsStyleSheet && m_linkMediaAttributeIsScreen)
     217        if (m_tagId == LinkTagId && m_linkIsStyleSheet)
    234218            return CachedResource::CSSStyleSheet;
    235219        ASSERT_NOT_REACHED();
     
    242226            return false;
    243227
    244         if (m_tagId == LinkTagId && (!m_linkIsStyleSheet || !m_linkMediaAttributeIsScreen))
     228        if (m_tagId == LinkTagId && !m_linkIsStyleSheet)
    245229            return false;
    246230
     
    261245    String m_crossOriginMode;
    262246    bool m_linkIsStyleSheet;
    263     bool m_linkMediaAttributeIsScreen;
     247    String m_mediaAttribute;
    264248    bool m_inputIsImage;
    265249};
  • trunk/Source/WebCore/html/parser/HTMLResourcePreloader.cpp

    r143051 r153689  
    3030#include "Document.h"
    3131
     32#include "MediaList.h"
     33#include "MediaQueryEvaluator.h"
     34#include "RenderObject.h"
     35
    3236namespace WebCore {
    3337
     
    3741        && m_charset.isSafeToSendToAnotherThread()
    3842        && m_resourceURL.isSafeToSendToAnotherThread()
     43        && m_mediaAttribute.isSafeToSendToAnotherThread()
    3944        && m_baseURL.isSafeToSendToAnotherThread();
    4045}
     
    6671}
    6772
     73static bool mediaAttributeMatches(Frame* frame, RenderStyle* renderStyle, const String& attributeValue)
     74{
     75    RefPtr<MediaQuerySet> mediaQueries = MediaQuerySet::createAllowingDescriptionSyntax(attributeValue);
     76    MediaQueryEvaluator mediaQueryEvaluator("screen", frame, renderStyle);
     77    return mediaQueryEvaluator.eval(mediaQueries.get());
     78}
     79
    6880void HTMLResourcePreloader::preload(PassOwnPtr<PreloadRequest> preload)
    6981{
     82    ASSERT(m_document->frame());
     83    ASSERT(m_document->renderer());
     84    ASSERT(m_document->renderer()->style());
     85    if (!preload->media().isEmpty() && !mediaAttributeMatches(m_document->frame(), m_document->renderer()->style(), preload->media()))
     86        return;
     87
    7088    CachedResourceRequest request = preload->resourceRequest(m_document);
    7189    m_document->cachedResourceLoader()->preload(preload->resourceType(), request, preload->charset());
    7290}
    7391
     92
    7493}
  • trunk/Source/WebCore/html/parser/HTMLResourcePreloader.h

    r143402 r153689  
    3434class PreloadRequest {
    3535public:
     36    static PassOwnPtr<PreloadRequest> create(const String& initiator, const String& resourceURL, const KURL& baseURL, CachedResource::Type resourceType, const String& mediaAttribute)
     37    {
     38        return adoptPtr(new PreloadRequest(initiator, resourceURL, baseURL, resourceType, mediaAttribute));
     39    }
     40
    3641    static PassOwnPtr<PreloadRequest> create(const String& initiator, const String& resourceURL, const KURL& baseURL, CachedResource::Type resourceType)
    3742    {
    38         return adoptPtr(new PreloadRequest(initiator, resourceURL, baseURL, resourceType));
     43        return adoptPtr(new PreloadRequest(initiator, resourceURL, baseURL, resourceType, String()));
    3944    }
    4045
     
    4449
    4550    const String& charset() const { return m_charset; }
     51    const String& media() const { return m_mediaAttribute; }
    4652    void setCharset(const String& charset) { m_charset = charset.isolatedCopy(); }
    4753    void setCrossOriginModeAllowsCookies(bool allowsCookies) { m_crossOriginModeAllowsCookies = allowsCookies; }
     
    4955
    5056private:
    51     PreloadRequest(const String& initiator, const String& resourceURL, const KURL& baseURL, CachedResource::Type resourceType)
     57    PreloadRequest(const String& initiator, const String& resourceURL, const KURL& baseURL, CachedResource::Type resourceType, const String& mediaAttribute)
    5258        : m_initiator(initiator)
    5359        , m_resourceURL(resourceURL.isolatedCopy())
    5460        , m_baseURL(baseURL.copy())
    5561        , m_resourceType(resourceType)
     62        , m_mediaAttribute(mediaAttribute.isolatedCopy())
    5663        , m_crossOriginModeAllowsCookies(false)
    5764    {
     
    6572    String m_charset;
    6673    CachedResource::Type m_resourceType;
     74    String m_mediaAttribute;
    6775    bool m_crossOriginModeAllowsCookies;
    6876};
Note: See TracChangeset for help on using the changeset viewer.