Warn in the inspector console when using dpi and dpcm units outside of media="print"
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Nov 2012 13:11:53 +0000 (13:11 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Nov 2012 13:11:53 +0000 (13:11 +0000)
https://bugs.webkit.org/show_bug.cgi?id=100865

Patch by Alexander Shalamov <alexander.shalamov@intel.com> on 2012-11-08
Reviewed by Kenneth Rohde Christiansen.

Source/WebCore:

Added function that prints warning to inspector console whenever dpi or dpcm CSS units
are used for screen media.

Test: fast/media/mq-resolution-dpi-dpcm-warning.html

* css/CSSStyleSheet.cpp:
(WebCore::CSSStyleSheet::setMediaQueries):
* css/MediaList.cpp:
(WebCore):
(WebCore::addResolutionWarningMessageToConsole):
(WebCore::reportMediaQueryWarningIfNeeded):
* css/MediaList.h:
(WebCore):
* css/MediaQueryMatcher.cpp:
(WebCore::MediaQueryMatcher::matchMedia):
* css/StyleSheetContents.cpp:
(WebCore::StyleSheetContents::parserAppendRule):

LayoutTests:

Added layout test that checks if warning is printed to console when dpi or dpcm CSS
units are used for resolution media feature.

* fast/media/mq-resolution-dpi-dpcm-warning-expected.txt: Added.
* fast/media/mq-resolution-dpi-dpcm-warning.html: Added.

Skip tests for platforms that doesn't support resolution media feature.

* platform/chromium/TestExpectations:
* platform/gtk/TestExpectations:
* platform/mac/TestExpectations:
* platform/win/TestExpectations:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@133884 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/media/mq-resolution-dpi-dpcm-warning-expected.txt [new file with mode: 0644]
LayoutTests/fast/media/mq-resolution-dpi-dpcm-warning.html [new file with mode: 0644]
LayoutTests/platform/chromium/TestExpectations
LayoutTests/platform/gtk/TestExpectations
LayoutTests/platform/mac/TestExpectations
LayoutTests/platform/win/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/css/CSSStyleSheet.cpp
Source/WebCore/css/MediaList.cpp
Source/WebCore/css/MediaList.h
Source/WebCore/css/MediaQueryMatcher.cpp
Source/WebCore/css/StyleSheetContents.cpp

index a412717..6ab914c 100644 (file)
@@ -1,3 +1,23 @@
+2012-11-08  Alexander Shalamov  <alexander.shalamov@intel.com>
+
+        Warn in the inspector console when using dpi and dpcm units outside of media="print"
+        https://bugs.webkit.org/show_bug.cgi?id=100865
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Added layout test that checks if warning is printed to console when dpi or dpcm CSS
+        units are used for resolution media feature.
+
+        * fast/media/mq-resolution-dpi-dpcm-warning-expected.txt: Added.
+        * fast/media/mq-resolution-dpi-dpcm-warning.html: Added.
+
+        Skip tests for platforms that doesn't support resolution media feature.
+
+        * platform/chromium/TestExpectations:
+        * platform/gtk/TestExpectations:
+        * platform/mac/TestExpectations:
+        * platform/win/TestExpectations:
+
 2012-11-08  Zan Dobersek  <zandobersek@gmail.com>
 
         Unreviewed GTK gardening.
diff --git a/LayoutTests/fast/media/mq-resolution-dpi-dpcm-warning-expected.txt b/LayoutTests/fast/media/mq-resolution-dpi-dpcm-warning-expected.txt
new file mode 100644 (file)
index 0000000..4342e99
--- /dev/null
@@ -0,0 +1,16 @@
+CONSOLE MESSAGE: line 9: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: screen and (min-resolution: 96dpi)
+CONSOLE MESSAGE: line 9: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: (min-resolution: 160dpcm)
+CONSOLE MESSAGE: line 9: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: (resolution: 96dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: (min-resolution: 2dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: (min-resolution: 2dpcm)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: screen and (min-resolution: 5dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: screen and (min-resolution: 5dpcm)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: (min-resolution: 10dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: (min-resolution: 10dpcm)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: screen and (max-resolution: 300dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: screen and (max-resolution: 300dpcm)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: (resolution: 96dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: (resolution: 96dpcm)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpi', as in CSS 'dpi' means dots-per-CSS-inch, not dots-per-physical-inch, so does not correspond to the actual 'dpi' of a screen. In media query expression: (resolution: 96dpi)
+CONSOLE MESSAGE: line 36: Consider using 'dppx' units instead of 'dpcm', as in CSS 'dpcm' means dots-per-CSS-centimeter, not dots-per-physical-centimeter, so does not correspond to the actual 'dpcm' of a screen. In media query expression: (resolution: 96dpcm)
+Test verifies that warning is added to console when dpi or dpcm CSS values are used for resolution media feature
diff --git a/LayoutTests/fast/media/mq-resolution-dpi-dpcm-warning.html b/LayoutTests/fast/media/mq-resolution-dpi-dpcm-warning.html
new file mode 100644 (file)
index 0000000..3ed6ce1
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <style type="text/css">
+        /* Verify that warning is added to console when stylesheet is parsed */
+        @media screen and (min-resolution: 96dpi) { }
+        @media all and (min-resolution: 160dpcm) { }
+        @media (resolution: 96dpi) { }
+    </style>
+    <style type="text/css" id="styleElement" media="all and (color)">
+    </style>
+</head>
+  <body>
+    <p>Test verifies that warning is added to console when dpi or dpcm CSS values are used for resolution media feature</p>
+
+    <script type="text/javascript">
+      if (window.testRunner)
+        testRunner.dumpAsText();
+
+      var styleElement = document.getElementById("styleElement");
+      // Verify that warning is added to console when HTMLStyleElement is updated.
+      styleElement.setAttribute("media", "(min-resolution: 2dpi)");
+      styleElement.setAttribute("media", "(min-resolution: 2dpcm)");
+      styleElement.setAttribute("media", "screen and (min-resolution: 5dpi)");
+      styleElement.setAttribute("media", "screen and (min-resolution: 5dpcm)");
+      styleElement.setAttribute("media", "all and (min-resolution: 10dpi)");
+      styleElement.setAttribute("media", "all and (min-resolution: 10dpcm)");
+
+      // Verify that warning is added to console when media listeners interface is used.
+      window.matchMedia("screen and (max-resolution: 300dpi)");
+      window.matchMedia("screen and (max-resolution: 300dpcm)");
+      window.matchMedia("(resolution: 96dpi)");
+      window.matchMedia("(resolution: 96dpcm)");
+      window.matchMedia("all and (resolution: 96dpi)");
+      window.matchMedia("all and (resolution: 96dpcm)");
+    </script>
+  </body>
+</html>
index 3aeda34..35ea49b 100644 (file)
@@ -194,6 +194,7 @@ webkit.org/b/100985 media/progress-events-generated-correctly.html
 
 # Resolution media query is not yet enabled.
 webkit.org/b/85262 fast/media/mq-resolution.html [ Skip ]
+webkit.org/b/85262 fast/media/mq-resolution-dpi-dpcm-warning.html [ Skip ]
 
 # CSS image-orientation is not yet enabled.
 webkit.org/b/89052 fast/css/image-orientation
index 8ee7847..e413326 100644 (file)
@@ -389,6 +389,7 @@ webkit.org/b/86146 css3/supports.html
 
 # Requires Resolution Media Query support
 webkit.org/b/100137 fast/media/mq-resolution.html [ Failure ]
+webkit.org/b/100137 fast/media/mq-resolution-dpi-dpcm-warning.html [ Failure ]
 
 # CSS Device Adaptation is not enabled.
 webkit.org/b/95959 css3/device-adapt [ Skip ]
index 1b6e55e..465b6f9 100644 (file)
@@ -978,6 +978,7 @@ webkit.org/b/85262 fast/css/image-resolution
 
 # Resolution media query is not yet enabled.
 webkit.org/b/85262 fast/media/mq-resolution.html [ Skip ]
+webkit.org/b/85262 fast/media/mq-resolution-dpi-dpcm-warning.html [ Skip ]
 
 # CSS image-orientation is not yet enabled.
 webkit.org/b/89052 fast/css/image-orientation
index e442c44..5d4a595 100644 (file)
@@ -1037,6 +1037,7 @@ fast/media/media-query-list-05.html
 fast/media/media-query-list-06.html
 fast/media/media-query-list-07.html
 fast/media/mq-resolution.html
+fast/media/mq-resolution-dpi-dpcm-warning.html
 
 # Need expectations. See https://bugs.webkit.org/show_bug.cgi?id=36461
 fast/repaint/overflow-scroll-body-appear.html
@@ -1996,7 +1997,6 @@ fast/css/word-space-extra.html
 fast/forms/date-multiple-fields
 fast/forms/month-multiple-fields
 fast/forms/time-multiple-fields
-fast/forms/week-multiple-fields
 
 # Require rebaseline after https://bugs.webkit.org/show_bug.cgi?id=84286
 fast/block/float/avoidance-rtl.html
index d65d705..93a0662 100644 (file)
@@ -1,3 +1,28 @@
+2012-11-08  Alexander Shalamov  <alexander.shalamov@intel.com>
+
+        Warn in the inspector console when using dpi and dpcm units outside of media="print"
+        https://bugs.webkit.org/show_bug.cgi?id=100865
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Added function that prints warning to inspector console whenever dpi or dpcm CSS units
+        are used for screen media.
+
+        Test: fast/media/mq-resolution-dpi-dpcm-warning.html
+
+        * css/CSSStyleSheet.cpp:
+        (WebCore::CSSStyleSheet::setMediaQueries):
+        * css/MediaList.cpp:
+        (WebCore):
+        (WebCore::addResolutionWarningMessageToConsole):
+        (WebCore::reportMediaQueryWarningIfNeeded):
+        * css/MediaList.h:
+        (WebCore):
+        * css/MediaQueryMatcher.cpp:
+        (WebCore::MediaQueryMatcher::matchMedia):
+        * css/StyleSheetContents.cpp:
+        (WebCore::StyleSheetContents::parserAppendRule):
+
 2012-11-08  Eugene Klyuchnikov  <eustas.bug@gmail.com>
 
         Web Inspector: Console: "time" and "timeEnd" should have same number of required arguments
index 13fd9a4..97b1918 100644 (file)
@@ -205,6 +205,11 @@ void CSSStyleSheet::setMediaQueries(PassRefPtr<MediaQuerySet> mediaQueries)
     m_mediaQueries = mediaQueries;
     if (m_mediaCSSOMWrapper && m_mediaQueries)
         m_mediaCSSOMWrapper->reattach(m_mediaQueries.get());
+
+#if ENABLE(RESOLUTION_MEDIA_QUERY)
+    // Add warning message to inspector whenever dpi/dpcm values are used for "screen" media.
+    reportMediaQueryWarningIfNeeded(ownerDocument(), m_mediaQueries.get());
+#endif
 }
 
 unsigned CSSStyleSheet::length() const
index bdbc571..268cb67 100644 (file)
 #include "CSSImportRule.h"
 #include "CSSParser.h"
 #include "CSSStyleSheet.h"
+#include "Console.h"
+#include "DOMWindow.h"
+#include "Document.h"
 #include "ExceptionCode.h"
+#include "MediaFeatureNames.h"
 #include "MediaQuery.h"
 #include "MediaQueryExp.h"
+#include "ScriptableDocumentParser.h"
 #include "WebCoreMemoryInstrumentation.h"
 #include <wtf/MemoryInstrumentationVector.h>
 #include <wtf/text/StringBuilder.h>
@@ -297,4 +302,66 @@ void MediaList::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
     info.addMember(m_mediaQueries);
 }
 
+#if ENABLE(RESOLUTION_MEDIA_QUERY)
+static void addResolutionWarningMessageToConsole(Document* document, const String& serializedExpression, const CSSPrimitiveValue* value)
+{
+    ASSERT(document);
+    ASSERT(value);
+
+    DEFINE_STATIC_LOCAL(String, mediaQueryMessage, (ASCIILiteral("Consider using 'dppx' units instead of '%replacementUnits%', as in CSS '%replacementUnits%' means dots-per-CSS-%lengthUnit%, not dots-per-physical-%lengthUnit%, so does not correspond to the actual '%replacementUnits%' of a screen. In media query expression: ")));
+    DEFINE_STATIC_LOCAL(String, mediaValueDPI, (ASCIILiteral("dpi")));
+    DEFINE_STATIC_LOCAL(String, mediaValueDPCM, (ASCIILiteral("dpcm")));
+    DEFINE_STATIC_LOCAL(String, lengthUnitInch, (ASCIILiteral("inch")));
+    DEFINE_STATIC_LOCAL(String, lengthUnitCentimeter, (ASCIILiteral("centimeter")));
+
+    String message;
+    if (value->isDotsPerInch())
+        message = String(mediaQueryMessage).replace("%replacementUnits%", mediaValueDPI).replace("%lengthUnit%", lengthUnitInch);
+    else if (value->isDotsPerCentimeter())
+        message = String(mediaQueryMessage).replace("%replacementUnits%", mediaValueDPCM).replace("%lengthUnit%", lengthUnitCentimeter);
+    else
+        ASSERT_NOT_REACHED();
+
+    message.append(serializedExpression);
+
+    int lineNumber = 1;
+    ScriptableDocumentParser* parser = document->scriptableDocumentParser();
+    if (parser)
+        lineNumber = parser->lineNumber().oneBasedInt();
+
+    document->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, TipMessageLevel, message, document->url().string(), lineNumber);
+}
+
+void reportMediaQueryWarningIfNeeded(Document* document, const MediaQuerySet* mediaQuerySet)
+{
+    if (!mediaQuerySet || !document)
+        return;
+
+    const Vector<OwnPtr<MediaQuery> >& mediaQueries = mediaQuerySet->queryVector();
+    const size_t queryCount = mediaQueries.size();
+
+    if (!queryCount)
+        return;
+
+    for (size_t i = 0; i < queryCount; ++i) {
+        const MediaQuery* query = mediaQueries[i].get();
+        String mediaType = query->mediaType();
+        if (!query->ignored() && !equalIgnoringCase(mediaType, "print")) {
+            const Vector<OwnPtr<MediaQueryExp> >* exps = query->expressions();
+            for (size_t j = 0; j < exps->size(); ++j) {
+                const MediaQueryExp* exp = exps->at(j).get();
+                if (exp->mediaFeature() == MediaFeatureNames::resolutionMediaFeature || exp->mediaFeature() == MediaFeatureNames::max_resolutionMediaFeature || exp->mediaFeature() == MediaFeatureNames::min_resolutionMediaFeature) {
+                    CSSValue* cssValue =  exp->value();
+                    if (cssValue && cssValue->isPrimitiveValue()) {
+                        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(cssValue);
+                        if (primitiveValue->isDotsPerInch() || primitiveValue->isDotsPerCentimeter())
+                            addResolutionWarningMessageToConsole(document, mediaQuerySet->mediaText(), primitiveValue);
+                    }
+                }
+            }
+        }
+    }
+}
+#endif
+
 }
index d247622..f200170 100644 (file)
@@ -32,6 +32,7 @@ namespace WebCore {
 
 class CSSRule;
 class CSSStyleSheet;
+class Document;
 class MediaList;
 class MediaQuery;
 
@@ -120,6 +121,11 @@ private:
     CSSRule* m_parentRule;
 };
 
+#if ENABLE(RESOLUTION_MEDIA_QUERY)
+// Adds message to inspector console whenever dpi or dpcm values are used for "screen" media.
+void reportMediaQueryWarningIfNeeded(Document*, const MediaQuerySet*);
+#endif
+
 } // namespace
 
 #endif
index efd5ded..689f658 100644 (file)
@@ -108,6 +108,10 @@ PassRefPtr<MediaQueryList> MediaQueryMatcher::matchMedia(const String& query)
         return 0;
 
     RefPtr<MediaQuerySet> media = MediaQuerySet::create(query);
+#if ENABLE(RESOLUTION_MEDIA_QUERY)
+    // Add warning message to inspector whenever dpi/dpcm values are used for "screen" media.
+    reportMediaQueryWarningIfNeeded(m_document, media.get());
+#endif
     return MediaQueryList::create(this, media, evaluate(media.get()));
 }
 
index 2f07fce..b5e7d55 100644 (file)
@@ -26,6 +26,7 @@
 #include "CSSStyleSheet.h"
 #include "CachedCSSStyleSheet.h"
 #include "Document.h"
+#include "MediaList.h"
 #include "Node.h"
 #include "SecurityOrigin.h"
 #include "StylePropertySet.h"
@@ -135,6 +136,13 @@ void StyleSheetContents::parserAppendRule(PassRefPtr<StyleRuleBase> rule)
         m_importRules.last()->requestStyleSheet();
         return;
     }
+
+#if ENABLE(RESOLUTION_MEDIA_QUERY)
+    // Add warning message to inspector if dpi/dpcm values are used for screen media.
+    if (rule->isMediaRule())
+        reportMediaQueryWarningIfNeeded(singleOwnerDocument(), static_cast<StyleRuleMedia*>(rule.get())->mediaQueries());
+#endif
+
     m_childRules.append(rule);
 }