Changeset 30466 in webkit


Ignore:
Timestamp:
Feb 21, 2008 4:14:47 PM (16 years ago)
Author:
hyatt@apple.com
Message:

Fix for bug 17301. CSS media queries need to use the correct viewport
when contained in documents inside iframes (rather than always using the
top-level document's viewport). CSS media queries based on the viewport
also needed to be dynamic and update as you resize the window (this is
a HOT feature). :)

This patch gets Acid3 up to 86/100 with 3 colored boxes filled in.

Reviewed by olliej

Added fast/media/viewport-media-query.html

  • css/CSSStyleSelector.cpp: (WebCore::CSSStyleSelector::CSSStyleSelector): (WebCore::CSSStyleSelector::addViewportDependentMediaQueryResult): (WebCore::CSSStyleSelector::affectedByViewportChange):
  • css/CSSStyleSelector.h: (WebCore::MediaQueryResult::MediaQueryResult):
  • css/MediaQueryEvaluator.cpp: (WebCore::MediaQueryEvaluator::MediaQueryEvaluator): (WebCore::MediaQueryEvaluator): (WebCore::MediaQueryEvaluator::eval): (WebCore::colorMediaFeatureEval): (WebCore::monochromeMediaFeatureEval): (WebCore::device_aspect_ratioMediaFeatureEval): (WebCore::device_pixel_ratioMediaFeatureEval): (WebCore::gridMediaFeatureEval): (WebCore::device_heightMediaFeatureEval): (WebCore::device_widthMediaFeatureEval): (WebCore::heightMediaFeatureEval): (WebCore::widthMediaFeatureEval): (WebCore::min_colorMediaFeatureEval): (WebCore::max_colorMediaFeatureEval): (WebCore::min_monochromeMediaFeatureEval): (WebCore::max_monochromeMediaFeatureEval): (WebCore::min_device_aspect_ratioMediaFeatureEval): (WebCore::max_device_aspect_ratioMediaFeatureEval): (WebCore::min_device_pixel_ratioMediaFeatureEval): (WebCore::max_device_pixel_ratioMediaFeatureEval): (WebCore::min_heightMediaFeatureEval): (WebCore::max_heightMediaFeatureEval): (WebCore::min_widthMediaFeatureEval): (WebCore::max_widthMediaFeatureEval): (WebCore::min_device_heightMediaFeatureEval): (WebCore::max_device_heightMediaFeatureEval): (WebCore::min_device_widthMediaFeatureEval): (WebCore::max_device_widthMediaFeatureEval):
  • css/MediaQueryEvaluator.h:
  • css/MediaQueryExp.cpp: (WebCore::MediaQueryExp::~MediaQueryExp):
  • css/MediaQueryExp.h: (WebCore::MediaQueryExp::value): (WebCore::MediaQueryExp::isViewportDependent):
  • html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::pickMedia):
  • page/FrameView.cpp: (WebCore::FrameView::layout):
Location:
trunk/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r30465 r30466  
     12008-02-21  David Hyatt  <hyatt@apple.com>
     2
     3        Fix for bug 17301.  CSS media queries need to use the correct viewport
     4        when contained in documents inside iframes (rather than always using the
     5        top-level document's viewport).  CSS media queries based on the viewport
     6        also needed to be dynamic and update as you resize the window (this is
     7        a HOT feature). :)
     8
     9        This patch gets Acid3 up to 86/100 with 3 colored boxes filled in.
     10
     11        Reviewed by olliej
     12
     13        Added fast/media/viewport-media-query.html
     14
     15        * css/CSSStyleSelector.cpp:
     16        (WebCore::CSSStyleSelector::CSSStyleSelector):
     17        (WebCore::CSSStyleSelector::addViewportDependentMediaQueryResult):
     18        (WebCore::CSSStyleSelector::affectedByViewportChange):
     19        * css/CSSStyleSelector.h:
     20        (WebCore::MediaQueryResult::MediaQueryResult):
     21        * css/MediaQueryEvaluator.cpp:
     22        (WebCore::MediaQueryEvaluator::MediaQueryEvaluator):
     23        (WebCore::MediaQueryEvaluator):
     24        (WebCore::MediaQueryEvaluator::eval):
     25        (WebCore::colorMediaFeatureEval):
     26        (WebCore::monochromeMediaFeatureEval):
     27        (WebCore::device_aspect_ratioMediaFeatureEval):
     28        (WebCore::device_pixel_ratioMediaFeatureEval):
     29        (WebCore::gridMediaFeatureEval):
     30        (WebCore::device_heightMediaFeatureEval):
     31        (WebCore::device_widthMediaFeatureEval):
     32        (WebCore::heightMediaFeatureEval):
     33        (WebCore::widthMediaFeatureEval):
     34        (WebCore::min_colorMediaFeatureEval):
     35        (WebCore::max_colorMediaFeatureEval):
     36        (WebCore::min_monochromeMediaFeatureEval):
     37        (WebCore::max_monochromeMediaFeatureEval):
     38        (WebCore::min_device_aspect_ratioMediaFeatureEval):
     39        (WebCore::max_device_aspect_ratioMediaFeatureEval):
     40        (WebCore::min_device_pixel_ratioMediaFeatureEval):
     41        (WebCore::max_device_pixel_ratioMediaFeatureEval):
     42        (WebCore::min_heightMediaFeatureEval):
     43        (WebCore::max_heightMediaFeatureEval):
     44        (WebCore::min_widthMediaFeatureEval):
     45        (WebCore::max_widthMediaFeatureEval):
     46        (WebCore::min_device_heightMediaFeatureEval):
     47        (WebCore::max_device_heightMediaFeatureEval):
     48        (WebCore::min_device_widthMediaFeatureEval):
     49        (WebCore::max_device_widthMediaFeatureEval):
     50        * css/MediaQueryEvaluator.h:
     51        * css/MediaQueryExp.cpp:
     52        (WebCore::MediaQueryExp::~MediaQueryExp):
     53        * css/MediaQueryExp.h:
     54        (WebCore::MediaQueryExp::value):
     55        (WebCore::MediaQueryExp::isViewportDependent):
     56        * html/HTMLMediaElement.cpp:
     57        (WebCore::HTMLMediaElement::pickMedia):
     58        * page/FrameView.cpp:
     59        (WebCore::FrameView::layout):
     60
    1612008-02-21  Anders Carlsson  <andersca@apple.com>
    262
  • trunk/WebCore/css/CSSStyleSelector.cpp

    r30421 r30466  
    282282    if (m_rootDefaultStyle && view) {
    283283        delete m_medium;
    284         m_medium = new MediaQueryEvaluator(view->mediaType(), view->frame()->page(), m_rootDefaultStyle);
     284        m_medium = new MediaQueryEvaluator(view->mediaType(), view->frame(), m_rootDefaultStyle);
    285285    }
    286286
     
    51815181}
    51825182
     5183void CSSStyleSelector::addViewportDependentMediaQueryResult(const MediaQueryExp* expr, bool result)
     5184{
     5185    m_viewportDependentMediaQueryResults.append(new MediaQueryResult(*expr, result));
     5186}
     5187
     5188bool CSSStyleSelector::affectedByViewportChange() const
     5189{
     5190    unsigned s = m_viewportDependentMediaQueryResults.size();
     5191    for (unsigned i = 0; i < s; i++) {
     5192        if (m_medium->eval(&m_viewportDependentMediaQueryResults[i]->m_expression) != m_viewportDependentMediaQueryResults[i]->m_result)
     5193            return true;
     5194    }
     5195    return false;
     5196}
     5197
    51835198} // namespace WebCore
  • trunk/WebCore/css/CSSStyleSelector.h

    r30293 r30466  
    2424
    2525#include "CSSFontSelector.h"
     26#include "MediaQueryExp.h"
    2627#include "RenderStyle.h"
    2728#include <wtf/HashSet.h>
     
    5657class StyledElement;
    5758
     59class MediaQueryResult
     60{
     61public:
     62    MediaQueryResult(const MediaQueryExp& expr, bool result)
     63    : m_expression(expr)
     64    , m_result(result)
     65    {}
     66
     67    MediaQueryExp m_expression;
     68    bool m_result;
     69};
     70
    5871    /**
    5972     * this class selects a RenderStyle for a given Element based on the
     
    130143        bool checkSelector(CSSSelector*);
    131144
     145        void addViewportDependentMediaQueryResult(const MediaQueryExp*, bool result);
     146        bool affectedByViewportChange() const;
     147       
    132148    protected:
    133149        enum SelectorMatch {
     
    240256        Vector<CSSMutableStyleDeclaration*> m_additionalAttributeStyleDecls;
    241257       
     258        Vector<MediaQueryResult*> m_viewportDependentMediaQueryResults;
     259
    242260        void applyProperty(int id, CSSValue*);
    243261
  • trunk/WebCore/css/MediaQueryEvaluator.cpp

    r29805 r30466  
    3131#include "Chrome.h"
    3232#include "CSSPrimitiveValue.h"
     33#include "CSSStyleSelector.h"
    3334#include "CSSValueList.h"
    3435#include "FloatRect.h"
     
    5152enum MediaFeaturePrefix { MinPrefix, MaxPrefix, NoPrefix };
    5253
    53 typedef bool (*EvalFunc)(CSSValue*, RenderStyle*, Page*,  MediaFeaturePrefix);
     54typedef bool (*EvalFunc)(CSSValue*, RenderStyle*, Frame*,  MediaFeaturePrefix);
    5455typedef HashMap<AtomicStringImpl*, EvalFunc> FunctionMap;
    5556static FunctionMap* gFunctionMap;
     
    6869
    6970MediaQueryEvaluator::MediaQueryEvaluator(bool mediaFeatureResult)
    70     : m_page(0)
     71    : m_frame(0)
    7172    , m_style(0)
    7273    , m_expResult(mediaFeatureResult)
     
    7677MediaQueryEvaluator:: MediaQueryEvaluator(const String& acceptedMediaType, bool mediaFeatureResult)
    7778    : m_mediaType(acceptedMediaType)
    78     , m_page(0)
     79    , m_frame(0)
    7980    , m_style(0)
    8081    , m_expResult(mediaFeatureResult)
     
    8485MediaQueryEvaluator:: MediaQueryEvaluator(const char* acceptedMediaType, bool mediaFeatureResult)
    8586    : m_mediaType(acceptedMediaType)
    86     , m_page(0)
     87    , m_frame(0)
    8788    , m_style(0)
    8889    , m_expResult(mediaFeatureResult)
     
    9091}
    9192
    92 MediaQueryEvaluator:: MediaQueryEvaluator(const String& acceptedMediaType, Page* page, RenderStyle* style)
     93MediaQueryEvaluator:: MediaQueryEvaluator(const String& acceptedMediaType, Frame* frame, RenderStyle* style)
    9394    : m_mediaType(acceptedMediaType.lower())
    94     , m_page(page)
     95    , m_frame(frame)
    9596    , m_style(style)
    96     , m_expResult(false) // doesn't matter when we have m_page and m_style
     97    , m_expResult(false) // doesn't matter when we have m_frame and m_style
    9798{
    9899}
     
    142143            // (AND semantics)
    143144            size_t j = 0;
    144             for (; j < exps->size() && eval(exps->at(j)); ++j) /* empty*/;
     145            for (; j < exps->size(); ++j) {
     146                bool exprResult = eval(exps->at(j));
     147                if (exps->at(j)->isViewportDependent())
     148                    m_frame->document()->styleSelector()->addViewportDependentMediaQueryResult(exps->at(j), exprResult);
     149                if (!exprResult)
     150                    break;
     151            }
    145152
    146153            // assume true if we are at the end of the list,
     
    201208}
    202209
    203 static bool colorMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
    204 {
    205     int bitsPerComponent = screenDepthPerComponent(page->mainFrame()->view());
     210static bool colorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
     211{
     212    int bitsPerComponent = screenDepthPerComponent(frame->page()->mainFrame()->view());
    206213    float number;
    207214    if (value)
     
    211218}
    212219
    213 static bool monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
    214 {
    215     if (!screenIsMonochrome(page->mainFrame()->view()))
     220static bool monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
     221{
     222    if (!screenIsMonochrome(frame->page()->mainFrame()->view()))
    216223        return false;
    217224
    218     return colorMediaFeatureEval(value, style, page, op);
    219 }
    220 
    221 static bool device_aspect_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
     225    return colorMediaFeatureEval(value, style, frame, op);
     226}
     227
     228static bool device_aspect_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
    222229{
    223230    if (value) {
    224         FloatRect sg = screenRect(page->mainFrame()->view());
     231        FloatRect sg = screenRect(frame->page()->mainFrame()->view());
    225232        int h = 0;
    226233        int v = 0;
     
    235242}
    236243
    237 static bool device_pixel_ratioMediaFeatureEval(CSSValue *value, RenderStyle* style, Page* page, MediaFeaturePrefix op)
     244static bool device_pixel_ratioMediaFeatureEval(CSSValue *value, RenderStyle* style, Frame* frame, MediaFeaturePrefix op)
    238245{
    239246    if (value)
    240         return value->isPrimitiveValue() && compareValue(page->chrome()->scaleFactor(), static_cast<CSSPrimitiveValue*>(value)->getFloatValue(), op);
    241 
    242     return page->chrome()->scaleFactor() != 0;
    243 }
    244 
    245 static bool gridMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
     247        return value->isPrimitiveValue() && compareValue(frame->page()->chrome()->scaleFactor(), static_cast<CSSPrimitiveValue*>(value)->getFloatValue(), op);
     248
     249    return frame->page()->chrome()->scaleFactor() != 0;
     250}
     251
     252static bool gridMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
    246253{
    247254    // if output device is bitmap, grid: 0 == true
     
    253260}
    254261
    255 static bool device_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
     262static bool device_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
    256263{
    257264    if (value) {
    258         FloatRect sg = screenRect(page->mainFrame()->view());
     265        FloatRect sg = screenRect(frame->page()->mainFrame()->view());
    259266        return value->isPrimitiveValue() && compareValue(static_cast<int>(sg.height()), static_cast<CSSPrimitiveValue*>(value)->computeLengthInt(style), op);
    260267    }
     
    264271}
    265272
    266 static bool device_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
     273static bool device_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
    267274{
    268275    if (value) {
    269         FloatRect sg = screenRect(page->mainFrame()->view());
     276        FloatRect sg = screenRect(frame->page()->mainFrame()->view());
    270277        return value->isPrimitiveValue() && compareValue(static_cast<int>(sg.width()), static_cast<CSSPrimitiveValue*>(value)->computeLengthInt(style), op);
    271278    }
     
    275282}
    276283
    277 static bool heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
    278 {
    279     FrameView* view = page->mainFrame()->view();
     284static bool heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
     285{
     286    FrameView* view = frame->view();
    280287   
    281288    if (value)
     
    285292}
    286293
    287 static bool widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix op)
    288 {
    289     FrameView* view = page->mainFrame()->view();
     294static bool widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix op)
     295{
     296    FrameView* view = frame->view();
    290297   
    291298    if (value)
     
    297304// rest of the functions are trampolines which set the prefix according to the media feature expression used
    298305
    299 static bool min_colorMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    300 {
    301     return colorMediaFeatureEval(value, style, page, MinPrefix);
    302 }
    303 
    304 static bool max_colorMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    305 {
    306     return colorMediaFeatureEval(value, style, page, MaxPrefix);
    307 }
    308 
    309 static bool min_monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    310 {
    311     return monochromeMediaFeatureEval(value, style, page, MinPrefix);
    312 }
    313 
    314 static bool max_monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    315 {
    316     return monochromeMediaFeatureEval(value, style, page, MaxPrefix);
    317 }
    318 
    319 static bool min_device_aspect_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    320 {
    321     return device_aspect_ratioMediaFeatureEval(value, style, page, MinPrefix);
    322 }
    323 
    324 static bool max_device_aspect_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    325 {
    326     return device_aspect_ratioMediaFeatureEval(value, style, page, MaxPrefix);
    327 }
    328 
    329 static bool min_device_pixel_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    330 {
    331     return device_pixel_ratioMediaFeatureEval(value, style, page, MinPrefix);
    332 }
    333 
    334 static bool max_device_pixel_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    335 {
    336     return device_pixel_ratioMediaFeatureEval(value, style, page, MaxPrefix);
    337 }
    338 
    339 static bool min_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    340 {
    341     return heightMediaFeatureEval(value, style, page, MinPrefix);
    342 }
    343 
    344 static bool max_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    345 {
    346     return heightMediaFeatureEval(value, style, page, MaxPrefix);
    347 }
    348 
    349 static bool min_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    350 {
    351     return widthMediaFeatureEval(value, style, page, MinPrefix);
    352 }
    353 
    354 static bool max_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    355 {
    356     return widthMediaFeatureEval(value, style, page, MaxPrefix);
    357 }
    358 
    359 static bool min_device_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    360 {
    361     return device_heightMediaFeatureEval(value, style, page, MinPrefix);
    362 }
    363 
    364 static bool max_device_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    365 {
    366     return device_heightMediaFeatureEval(value, style, page, MaxPrefix);
    367 }
    368 
    369 static bool min_device_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    370 {
    371     return device_widthMediaFeatureEval(value, style, page, MinPrefix);
    372 }
    373 
    374 static bool max_device_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Page* page,  MediaFeaturePrefix /*op*/)
    375 {
    376     return device_widthMediaFeatureEval(value, style, page, MaxPrefix);
     306static bool min_colorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     307{
     308    return colorMediaFeatureEval(value, style, frame, MinPrefix);
     309}
     310
     311static bool max_colorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     312{
     313    return colorMediaFeatureEval(value, style, frame, MaxPrefix);
     314}
     315
     316static bool min_monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     317{
     318    return monochromeMediaFeatureEval(value, style, frame, MinPrefix);
     319}
     320
     321static bool max_monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     322{
     323    return monochromeMediaFeatureEval(value, style, frame, MaxPrefix);
     324}
     325
     326static bool min_device_aspect_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     327{
     328    return device_aspect_ratioMediaFeatureEval(value, style, frame, MinPrefix);
     329}
     330
     331static bool max_device_aspect_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     332{
     333    return device_aspect_ratioMediaFeatureEval(value, style, frame, MaxPrefix);
     334}
     335
     336static bool min_device_pixel_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     337{
     338    return device_pixel_ratioMediaFeatureEval(value, style, frame, MinPrefix);
     339}
     340
     341static bool max_device_pixel_ratioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     342{
     343    return device_pixel_ratioMediaFeatureEval(value, style, frame, MaxPrefix);
     344}
     345
     346static bool min_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     347{
     348    return heightMediaFeatureEval(value, style, frame, MinPrefix);
     349}
     350
     351static bool max_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     352{
     353    return heightMediaFeatureEval(value, style, frame, MaxPrefix);
     354}
     355
     356static bool min_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     357{
     358    return widthMediaFeatureEval(value, style, frame, MinPrefix);
     359}
     360
     361static bool max_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     362{
     363    return widthMediaFeatureEval(value, style, frame, MaxPrefix);
     364}
     365
     366static bool min_device_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     367{
     368    return device_heightMediaFeatureEval(value, style, frame, MinPrefix);
     369}
     370
     371static bool max_device_heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     372{
     373    return device_heightMediaFeatureEval(value, style, frame, MaxPrefix);
     374}
     375
     376static bool min_device_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     377{
     378    return device_widthMediaFeatureEval(value, style, frame, MinPrefix);
     379}
     380
     381static bool max_device_widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame,  MediaFeaturePrefix /*op*/)
     382{
     383    return device_widthMediaFeatureEval(value, style, frame, MaxPrefix);
    377384}
    378385
     
    389396bool MediaQueryEvaluator::eval(const MediaQueryExp* expr) const
    390397{
    391     if (!m_page || !m_style)
     398    if (!m_frame || !m_style)
    392399        return m_expResult;
    393400
     
    400407    EvalFunc func = gFunctionMap->get(expr->mediaFeature().impl());
    401408    if (func)
    402         return func(expr->value(), m_style, m_page, NoPrefix);
     409        return func(expr->value(), m_style, m_frame, NoPrefix);
    403410
    404411    return false;
  • trunk/WebCore/css/MediaQueryEvaluator.h

    r29663 r30466  
    3232
    3333namespace WebCore {
    34 class Page;
     34class Frame;
    3535class RenderStyle;
    3636class MediaList;
     
    6767    /** Creates evaluator which evaluates full media queries
    6868     */
    69     MediaQueryEvaluator(const String& acceptedMediaType, Page* page, RenderStyle* style);
     69    MediaQueryEvaluator(const String& acceptedMediaType, Frame*, RenderStyle*);
    7070
    7171    ~MediaQueryEvaluator();
     
    8282private:
    8383    String m_mediaType;
    84     Page* m_page; // not owned
     84    Frame* m_frame; // not owned
    8585    RenderStyle* m_style; // not owned
    8686    bool m_expResult;
  • trunk/WebCore/css/MediaQueryExp.cpp

    r30429 r30466  
    8181MediaQueryExp::~MediaQueryExp()
    8282{
    83     delete m_value;
    8483}
    8584
  • trunk/WebCore/css/MediaQueryExp.h

    r29663 r30466  
    3131#include "AtomicString.h"
    3232#include "CSSValue.h"
     33#include "MediaFeatureNames.h"
     34#include <wtf/RefPtr.h>
    3335
    3436namespace WebCore {
     
    4345    AtomicString mediaFeature() const { return m_mediaFeature; }
    4446
    45     CSSValue* value() const { return m_value; }
     47    CSSValue* value() const { return m_value.get(); }
    4648
    4749    bool operator==(const MediaQueryExp& other) const  {
     
    5153    }
    5254
     55    bool isViewportDependent() const { return m_mediaFeature == MediaFeatureNames::widthMediaFeature ||
     56                                              m_mediaFeature == MediaFeatureNames::heightMediaFeature ||
     57                                              m_mediaFeature == MediaFeatureNames::min_widthMediaFeature ||
     58                                              m_mediaFeature == MediaFeatureNames::min_heightMediaFeature ||
     59                                              m_mediaFeature == MediaFeatureNames::max_widthMediaFeature ||
     60                                              m_mediaFeature == MediaFeatureNames::max_heightMediaFeature; }
    5361private:
    5462    AtomicString m_mediaFeature;
    55     CSSValue* m_value;
     63    RefPtr<CSSValue> m_value;
    5664};
    5765
  • trunk/WebCore/html/HTMLMediaElement.cpp

    r30243 r30466  
    810810                    continue;
    811811                if (source->hasAttribute(mediaAttr)) {
    812                     MediaQueryEvaluator screenEval("screen", document()->page(), renderer() ? renderer()->style() : 0);
     812                    MediaQueryEvaluator screenEval("screen", document()->frame(), renderer() ? renderer()->style() : 0);
    813813                    RefPtr<MediaList> media = new MediaList((CSSStyleSheet*)0, source->media(), true);
    814814                    if (!screenEval.eval(media.get()))
  • trunk/WebCore/page/FrameView.cpp

    r29878 r30466  
    2828
    2929#include "AXObjectCache.h"
     30#include "CSSStyleSelector.h"
    3031#include "EventHandler.h"
    3132#include "FloatRect.h"
     
    364365        performPostLayoutTasks();
    365366    }
     367
     368    // Viewport-dependent media queries may cause us to need completely different style information.
     369    // Check that here.
     370    if (document->styleSelector()->affectedByViewportChange())
     371        document->updateStyleSelector();
    366372
    367373    // Always ensure our style info is up-to-date.  This can happen in situations where
Note: See TracChangeset for help on using the changeset viewer.