Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: Source/core/dom/Document.cpp

Issue 19555002: Translate viewport related meta tags into @viewport descriptors as suggested by the CSS Device Adap… (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Land patch upload resulted in python error Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 String Document::compatMode() const 659 String Document::compatMode() const
660 { 660 {
661 return inQuirksMode() ? "BackCompat" : "CSS1Compat"; 661 return inQuirksMode() ? "BackCompat" : "CSS1Compat";
662 } 662 }
663 663
664 void Document::setDocType(PassRefPtr<DocumentType> docType) 664 void Document::setDocType(PassRefPtr<DocumentType> docType)
665 { 665 {
666 // This should never be called more than once. 666 // This should never be called more than once.
667 ASSERT(!m_docType || !docType); 667 ASSERT(!m_docType || !docType);
668 m_docType = docType; 668 m_docType = docType;
669 if (m_docType) { 669 if (m_docType)
670 this->adoptIfNeeded(m_docType.get()); 670 this->adoptIfNeeded(m_docType.get());
671 if (m_docType->publicId().startsWith("-//wapforum//dtd xhtml mobile 1.", /* caseSensitive */ false)) 671
672 processViewport("width=device-width, height=device-height", Viewport Arguments::XHTMLMobileProfile);
673 }
674 // Doctype affects the interpretation of the stylesheets. 672 // Doctype affects the interpretation of the stylesheets.
675 clearStyleResolver(); 673 clearStyleResolver();
676 } 674 }
677 675
678 DOMImplementation* Document::implementation() 676 DOMImplementation* Document::implementation()
679 { 677 {
680 if (!m_implementation) 678 if (!m_implementation)
681 m_implementation = DOMImplementation::create(this); 679 m_implementation = DOMImplementation::create(this);
682 return m_implementation.get(); 680 return m_implementation.get();
683 } 681 }
(...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after
2015 PassRefPtr<DocumentParser> Document::createParser() 2013 PassRefPtr<DocumentParser> Document::createParser()
2016 { 2014 {
2017 if (isHTMLDocument() || (RuntimeEnabledFeatures::parseSVGAsHTMLEnabled() && isSVGDocument())) { 2015 if (isHTMLDocument() || (RuntimeEnabledFeatures::parseSVGAsHTMLEnabled() && isSVGDocument())) {
2018 bool reportErrors = InspectorInstrumentation::collectingHTMLParseErrors( this->page()); 2016 bool reportErrors = InspectorInstrumentation::collectingHTMLParseErrors( this->page());
2019 return HTMLDocumentParser::create(this, reportErrors); 2017 return HTMLDocumentParser::create(this, reportErrors);
2020 } 2018 }
2021 // FIXME: this should probably pass the frame instead 2019 // FIXME: this should probably pass the frame instead
2022 return XMLDocumentParser::create(this, view()); 2020 return XMLDocumentParser::create(this, view());
2023 } 2021 }
2024 2022
2023 bool Document::isXHTMLMobileProfile() const
2024 {
2025 return m_docType && m_docType->publicId().startsWith("-//WAPFORUM//DTD XHTML MOBILE 1.", /* caseSensitive */ false);
2026 }
2027
2025 bool Document::isFrameSet() const 2028 bool Document::isFrameSet() const
2026 { 2029 {
2027 if (!isHTMLDocument()) 2030 if (!isHTMLDocument())
2028 return false; 2031 return false;
2029 HTMLElement* bodyElement = body(); 2032 HTMLElement* bodyElement = body();
2030 return bodyElement && bodyElement->hasTagName(framesetTag); 2033 return bodyElement && bodyElement->hasTagName(framesetTag);
2031 } 2034 }
2032 2035
2033 ScriptableDocumentParser* Document::scriptableDocumentParser() const 2036 ScriptableDocumentParser* Document::scriptableDocumentParser() const
2034 { 2037 {
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
2709 String message = "Refused to display '" + url().elidedString() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'."; 2712 String message = "Refused to display '" + url().elidedString() + "' in a frame because it set 'X-Frame-Options' to '" + content + "'.";
2710 frameLoader->stopAllLoaders(); 2713 frameLoader->stopAllLoaders();
2711 // Stopping the loader isn't enough, as we're already parsing the docume nt; to honor the header's 2714 // Stopping the loader isn't enough, as we're already parsing the docume nt; to honor the header's
2712 // intent, we must navigate away from the possibly partially-rendered do cument to a location that 2715 // intent, we must navigate away from the possibly partially-rendered do cument to a location that
2713 // doesn't inherit the parent's SecurityOrigin. 2716 // doesn't inherit the parent's SecurityOrigin.
2714 frame->navigationScheduler()->scheduleLocationChange(securityOrigin(), S ecurityOrigin::urlWithUniqueSecurityOrigin(), String()); 2717 frame->navigationScheduler()->scheduleLocationChange(securityOrigin(), S ecurityOrigin::urlWithUniqueSecurityOrigin(), String());
2715 addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, message, req uestIdentifier); 2718 addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, message, req uestIdentifier);
2716 } 2719 }
2717 } 2720 }
2718 2721
2719 // Though isspace() considers \t and \v to be whitespace, Win IE doesn't.
2720 static bool isSeparator(UChar c)
2721 {
2722 return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '=' || c == ' ,' || c == '\0';
2723 }
2724
2725 void Document::processArguments(const String& features, void* data, ArgumentsCal lback callback)
2726 {
2727 // Tread lightly in this code -- it was specifically designed to mimic Win I E's parsing behavior.
2728 int keyBegin, keyEnd;
2729 int valueBegin, valueEnd;
2730
2731 int i = 0;
2732 int length = features.length();
2733 String buffer = features.lower();
2734 while (i < length) {
2735 // skip to first non-separator, but don't skip past the end of the strin g
2736 while (isSeparator(buffer[i])) {
2737 if (i >= length)
2738 break;
2739 i++;
2740 }
2741 keyBegin = i;
2742
2743 // skip to first separator
2744 while (!isSeparator(buffer[i]))
2745 i++;
2746 keyEnd = i;
2747
2748 // skip to first '=', but don't skip past a ',' or the end of the string
2749 while (buffer[i] != '=') {
2750 if (buffer[i] == ',' || i >= length)
2751 break;
2752 i++;
2753 }
2754
2755 // skip to first non-separator, but don't skip past a ',' or the end of the string
2756 while (isSeparator(buffer[i])) {
2757 if (buffer[i] == ',' || i >= length)
2758 break;
2759 i++;
2760 }
2761 valueBegin = i;
2762
2763 // skip to first separator
2764 while (!isSeparator(buffer[i]))
2765 i++;
2766 valueEnd = i;
2767
2768 ASSERT_WITH_SECURITY_IMPLICATION(i <= length);
2769
2770 String keyString = buffer.substring(keyBegin, keyEnd - keyBegin);
2771 String valueString = buffer.substring(valueBegin, valueEnd - valueBegin) ;
2772 callback(keyString, valueString, this, data);
2773 }
2774 }
2775
2776 void Document::processViewport(const String& features, ViewportArguments::Type o rigin)
2777 {
2778 ASSERT(!features.isNull());
2779
2780 if (origin < m_viewportArguments.type)
2781 return;
2782
2783 m_viewportArguments = ViewportArguments(origin);
2784 processArguments(features, (void*)&m_viewportArguments, &setViewportFeature) ;
2785
2786 updateViewportArguments();
2787 }
2788
2789 void Document::updateViewportArguments() 2722 void Document::updateViewportArguments()
2790 { 2723 {
2791 if (page() && page()->mainFrame() == frame()) { 2724 if (page() && page()->mainFrame() == frame()) {
2792 #ifndef NDEBUG 2725 #ifndef NDEBUG
2793 m_didDispatchViewportPropertiesChanged = true; 2726 m_didDispatchViewportPropertiesChanged = true;
2794 #endif 2727 #endif
2795 page()->chrome().dispatchViewportPropertiesDidChange(m_viewportArguments ); 2728 page()->chrome().dispatchViewportPropertiesDidChange(m_viewportArguments );
2796 } 2729 }
2797 } 2730 }
2798 2731
(...skipping 2279 matching lines...) Expand 10 before | Expand all | Expand 10 after
5078 { 5011 {
5079 return DocumentLifecycleNotifier::create(this); 5012 return DocumentLifecycleNotifier::create(this);
5080 } 5013 }
5081 5014
5082 DocumentLifecycleNotifier* Document::lifecycleNotifier() 5015 DocumentLifecycleNotifier* Document::lifecycleNotifier()
5083 { 5016 {
5084 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier()); 5017 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier());
5085 } 5018 }
5086 5019
5087 } // namespace WebCore 5020 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698