Changeset 48181 in webkit


Ignore:
Timestamp:
Sep 8, 2009 1:26:14 PM (15 years ago)
Author:
hyatt@apple.com
Message:

https://bugs.webkit.org/show_bug.cgi?id=28987, make the Document cache the page's user stylesheet in
parsed form. Allows the sheet to survive across destruction/re-creation of the CSSStyleSelector.

Reviewed by Eric Seidel.

  • css/CSSStyleSelector.cpp:

(WebCore::CSSStyleSelector::CSSStyleSelector):

  • css/CSSStyleSelector.h:
  • dom/Document.cpp:

(WebCore::Document::attach):
(WebCore::Document::pageUserSheet):
(WebCore::Document::clearPageUserSheet):
(WebCore::Document::recalcStyleSelector):

  • dom/Document.h:
  • loader/PlaceholderDocument.cpp:

(WebCore::PlaceholderDocument::attach):

  • page/Page.cpp:

(WebCore::Page::userStyleSheetLocationChanged):

  • page/Settings.cpp:

(WebCore::Settings::setUserStyleSheetLocation):

Location:
trunk/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r48180 r48181  
     12009-09-04  Dave Hyatt  <hyatt@apple.com>
     2
     3        Reviewed by Eric Seidel.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=28987, make the Document cache the page's user stylesheet in
     6        parsed form.  Allows the sheet to survive across destruction/re-creation of the CSSStyleSelector.
     7
     8        * css/CSSStyleSelector.cpp:
     9        (WebCore::CSSStyleSelector::CSSStyleSelector):
     10        * css/CSSStyleSelector.h:
     11        * dom/Document.cpp:
     12        (WebCore::Document::attach):
     13        (WebCore::Document::pageUserSheet):
     14        (WebCore::Document::clearPageUserSheet):
     15        (WebCore::Document::recalcStyleSelector):
     16        * dom/Document.h:
     17        * loader/PlaceholderDocument.cpp:
     18        (WebCore::PlaceholderDocument::attach):
     19        * page/Page.cpp:
     20        (WebCore::Page::userStyleSheetLocationChanged):
     21        * page/Settings.cpp:
     22        (WebCore::Settings::setUserStyleSheetLocation):
     23
    1242009-09-08  Kenneth Rohde Christiansen  <kenneth@webkit.org>
    225
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r48167 r48181  
    11831183                65FEA86909833ADE00BED4AB /* Page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FEA86809833ADE00BED4AB /* Page.cpp */; };
    11841184                72626E020EF022FE00A07E20 /* FontFastPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 72626E010EF022FE00A07E20 /* FontFastPath.cpp */; };
    1185                 7284ADDD0E6FEB31002EEFBD /* UserStyleSheetLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7284ADDB0E6FEB31002EEFBD /* UserStyleSheetLoader.cpp */; };
    1186                 7284ADDE0E6FEB31002EEFBD /* UserStyleSheetLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 7284ADDC0E6FEB31002EEFBD /* UserStyleSheetLoader.h */; };
    11871185                75092BFE104B80F9003DD168 /* DOMDispatchTimelineItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 75092BFC104B80F9003DD168 /* DOMDispatchTimelineItem.cpp */; };
    11881186                75092BFF104B80F9003DD168 /* DOMDispatchTimelineItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 75092BFD104B80F9003DD168 /* DOMDispatchTimelineItem.h */; };
     
    64116409                65FEA86809833ADE00BED4AB /* Page.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Page.cpp; sourceTree = "<group>"; };
    64126410                72626E010EF022FE00A07E20 /* FontFastPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontFastPath.cpp; sourceTree = "<group>"; };
    6413                 7284ADDB0E6FEB31002EEFBD /* UserStyleSheetLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserStyleSheetLoader.cpp; sourceTree = "<group>"; };
    6414                 7284ADDC0E6FEB31002EEFBD /* UserStyleSheetLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserStyleSheetLoader.h; sourceTree = "<group>"; };
    64156411                75092BFC104B80F9003DD168 /* DOMDispatchTimelineItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMDispatchTimelineItem.cpp; sourceTree = "<group>"; };
    64166412                75092BFD104B80F9003DD168 /* DOMDispatchTimelineItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMDispatchTimelineItem.h; sourceTree = "<group>"; };
  • trunk/WebCore/css/CSSStyleSelector.cpp

    r47906 r48181  
    409409}
    410410
    411 CSSStyleSelector::CSSStyleSelector(Document* doc, const String& userStyleSheet, StyleSheetList* styleSheets, CSSStyleSheet* mappedElementSheet, bool strictParsing, bool matchAuthorAndUserStyles)
     411CSSStyleSelector::CSSStyleSelector(Document* doc, CSSStyleSheet* userSheet, StyleSheetList* styleSheets, CSSStyleSheet* mappedElementSheet, bool strictParsing, bool matchAuthorAndUserStyles)
    412412    : m_backgroundData(BackgroundFillLayer)
    413413    , m_checker(doc, strictParsing)
     
    450450
    451451    // FIXME: This sucks! The user sheet is reparsed every time!
    452     if (!userStyleSheet.isEmpty()) {
    453         m_userSheet = CSSStyleSheet::create(doc);
    454         m_userSheet->parseString(userStyleSheet, strictParsing);
    455 
     452    if (userSheet) {
    456453        m_userStyle = new CSSRuleSet();
    457         m_userStyle->addRulesFromSheet(m_userSheet.get(), *m_medium, this);
     454        m_userStyle->addRulesFromSheet(userSheet, *m_medium, this);
    458455    }
    459456
  • trunk/WebCore/css/CSSStyleSelector.h

    r47906 r48181  
    8181    class CSSStyleSelector : public Noncopyable {
    8282    public:
    83         CSSStyleSelector(Document*, const String& userStyleSheet, StyleSheetList*, CSSStyleSheet*, bool strictParsing, bool matchAuthorAndUserStyles);
     83        CSSStyleSelector(Document*, CSSStyleSheet* userStyleSheet, StyleSheetList* authorSheets, CSSStyleSheet* mappedElementSheet,
     84                         bool strictParsing, bool matchAuthorAndUserStyles);
    8485        ~CSSStyleSelector();
    8586
     
    176177        CSSRuleSet* m_authorStyle;
    177178        CSSRuleSet* m_userStyle;
    178         RefPtr<CSSStyleSheet> m_userSheet;
    179179
    180180        bool m_hasUAAppearance;
  • trunk/WebCore/dom/Document.cpp

    r48167 r48181  
    13341334        if (Settings* docSettings = settings())
    13351335            matchAuthorAndUserStyles = docSettings->authorAndUserStylesEnabled();
    1336         m_styleSelector = new CSSStyleSelector(this, userStyleSheet(), m_styleSheets.get(), m_mappedElementSheet.get(), !inCompatMode(), matchAuthorAndUserStyles);
     1336        m_styleSelector = new CSSStyleSelector(this, pageUserSheet(), m_styleSheets.get(), m_mappedElementSheet.get(), !inCompatMode(), matchAuthorAndUserStyles);
    13371337    }
    13381338
     
    18741874}
    18751875
    1876 String Document::userStyleSheet() const
    1877 {
    1878     Page* page = this->page();
    1879     if (!page)
    1880         return String();
    1881     return page->userStyleSheet();
     1876CSSStyleSheet* Document::pageUserSheet()
     1877{
     1878    if (m_pageUserSheet)
     1879        return m_pageUserSheet.get();
     1880   
     1881    Page* owningPage = page();
     1882    if (!owningPage)
     1883        return 0;
     1884   
     1885    String userSheetText = owningPage->userStyleSheet();
     1886    if (userSheetText.isEmpty())
     1887        return 0;
     1888   
     1889    // Parse the sheet and cache it.
     1890    m_pageUserSheet = CSSStyleSheet::create(this);
     1891    m_pageUserSheet->parseString(userSheetText, !inCompatMode());
     1892    return m_pageUserSheet.get();
     1893}
     1894
     1895void Document::clearPageUserSheet()
     1896{
     1897    m_pageUserSheet = 0;
     1898    updateStyleSelector();
    18821899}
    18831900
     
    24432460    // Create a new style selector
    24442461    delete m_styleSelector;
    2445     m_styleSelector = new CSSStyleSelector(this, userStyleSheet(), m_styleSheets.get(), m_mappedElementSheet.get(), !inCompatMode(), matchAuthorAndUserStyles);
     2462    m_styleSelector = new CSSStyleSelector(this, pageUserSheet(), m_styleSheets.get(), m_mappedElementSheet.get(), !inCompatMode(), matchAuthorAndUserStyles);
    24462463    m_didCalculateStyleSelector = true;
    24472464}
  • trunk/WebCore/dom/Document.h

    r48167 r48181  
    440440    virtual String userAgent(const KURL&) const;
    441441
    442     String userStyleSheet() const;
     442    CSSStyleSheet* pageUserSheet();
     443    void clearPageUserSheet();
    443444
    444445    CSSStyleSheet* elementSheet();
    445446    CSSStyleSheet* mappedElementSheet();
     447   
    446448    virtual Tokenizer* createTokenizer();
    447449    Tokenizer* tokenizer() { return m_tokenizer; }
     
    930932    RefPtr<CSSStyleSheet> m_elemSheet;
    931933    RefPtr<CSSStyleSheet> m_mappedElementSheet;
    932 
     934    RefPtr<CSSStyleSheet> m_pageUserSheet;
     935   
    933936    bool m_printing;
    934937   
  • trunk/WebCore/loader/PlaceholderDocument.cpp

    r46136 r48181  
    3838    if (!styleSelector()) {
    3939        RefPtr<StyleSheetList> styleSheetList = StyleSheetList::create(this);
    40         setStyleSelector(new CSSStyleSelector(this, userStyleSheet(), styleSheetList.get(), 0, true, false));
     40        setStyleSelector(new CSSStyleSelector(this, pageUserSheet(), styleSheetList.get(), 0, true, false));
    4141    }
    4242
  • trunk/WebCore/page/Page.cpp

    r48167 r48181  
    470470        }
    471471    }
     472   
     473    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
     474        if (frame->document())
     475            frame->document()->clearPageUserSheet();
     476    }
    472477}
    473478
  • trunk/WebCore/page/Settings.cpp

    r46001 r48181  
    274274
    275275    m_page->userStyleSheetLocationChanged();
    276     setNeedsReapplyStylesInAllFrames(m_page);
    277276}
    278277
Note: See TracChangeset for help on using the changeset viewer.