[Chromium] Add better WebKit API for chrome.tabs.insertCSS extension API
authormihaip@chromium.org <mihaip@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jul 2011 18:34:07 +0000 (18:34 +0000)
committermihaip@chromium.org <mihaip@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jul 2011 18:34:07 +0000 (18:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=65158

Reviewed by David Hyatt.

Source/WebCore:

Add per-Document instance user stylesheets (as opposed to the page
group user styles and the global page stylesheet).

* css/CSSStyleSelector.cpp:
(WebCore::CSSStyleSelector::CSSStyleSelector):
* css/CSSStyleSelector.h:
* dom/Document.cpp:
(WebCore::Document::~Document):
(WebCore::Document::createStyleSelector):
(WebCore::Document::addUserSheet):
* dom/Document.h:

Source/WebKit/chromium:

Add WebDocument::insertUserStyleSheet which inserts a user stylesheet,
instead of forcing extensions to use insertStyleText which manipulates
the DOM of the page and results in compatibility issues (see
http://crbug.com/82220).

* public/WebDocument.h:
* src/WebDocument.cpp:
(WebKit::WebDocument::insertUserStyleSheet):

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

Source/WebCore/ChangeLog
Source/WebCore/css/CSSStyleSelector.cpp
Source/WebCore/css/CSSStyleSelector.h
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/public/WebDocument.h
Source/WebKit/chromium/src/WebDocument.cpp

index 3d4d9a7..19624f7 100644 (file)
@@ -1,3 +1,22 @@
+2011-07-25  Mihai Parparita  <mihaip@chromium.org>
+
+        [Chromium] Add better WebKit API for chrome.tabs.insertCSS extension API
+        https://bugs.webkit.org/show_bug.cgi?id=65158
+
+        Reviewed by David Hyatt.
+
+        Add per-Document instance user stylesheets (as opposed to the page 
+        group user styles and the global page stylesheet).
+
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::CSSStyleSelector):
+        * css/CSSStyleSelector.h:
+        * dom/Document.cpp:
+        (WebCore::Document::~Document):
+        (WebCore::Document::createStyleSelector):
+        (WebCore::Document::addUserSheet):
+        * dom/Document.h:
+
 2011-07-27  Vsevolod Vlasov  <vsevik@chromium.org>
 
         Web Inspector: Disable cache option should only clear memory cache, not disable it.
index 1a404d5..131f8ab 100644 (file)
@@ -429,7 +429,7 @@ static CSSMutableStyleDeclaration* rightToLeftDeclaration()
 }
 
 CSSStyleSelector::CSSStyleSelector(Document* document, StyleSheetList* styleSheets, CSSStyleSheet* mappedElementSheet,
-                                   CSSStyleSheet* pageUserSheet, const Vector<RefPtr<CSSStyleSheet> >* pageGroupUserSheets,
+                                   CSSStyleSheet* pageUserSheet, const Vector<RefPtr<CSSStyleSheet> >* pageGroupUserSheets, const Vector<RefPtr<CSSStyleSheet> >* documentUserSheets,
                                    bool strictParsing, bool matchAuthorAndUserStyles)
     : m_backgroundData(BackgroundFillLayer)
     , m_checker(document, strictParsing)
@@ -486,6 +486,15 @@ CSSStyleSelector::CSSStyleSelector(Document* document, StyleSheetList* styleShee
                 m_authorStyle->addRulesFromSheet(pageGroupUserSheets->at(i).get(), *m_medium, this);
         }
     }
+    if (documentUserSheets) {
+        unsigned length = documentUserSheets->size();
+        for (unsigned i = 0; i < length; i++) {
+            if (documentUserSheets->at(i)->isUserStyleSheet())
+                tempUserStyle->addRulesFromSheet(documentUserSheets->at(i).get(), *m_medium, this);
+            else
+                m_authorStyle->addRulesFromSheet(documentUserSheets->at(i).get(), *m_medium, this);
+        }
+    }
 
     if (tempUserStyle->m_ruleCount > 0 || tempUserStyle->m_pageRules.size() > 0)
         m_userStyle = tempUserStyle.release();
index 37d6d3c..03c9159 100644 (file)
@@ -90,7 +90,7 @@ public:
         WTF_MAKE_NONCOPYABLE(CSSStyleSelector); WTF_MAKE_FAST_ALLOCATED;
     public:
         CSSStyleSelector(Document*, StyleSheetList* authorSheets, CSSStyleSheet* mappedElementSheet,
-                         CSSStyleSheet* pageUserSheet, const Vector<RefPtr<CSSStyleSheet> >* pageGroupUserSheets,
+                         CSSStyleSheet* pageUserSheet, const Vector<RefPtr<CSSStyleSheet> >* pageGroupUserSheets, const Vector<RefPtr<CSSStyleSheet> >* documentUserSheets,
                          bool strictParsing, bool matchAuthorAndUserStyles);
         ~CSSStyleSelector();
         
index d2e0944..34a3481 100644 (file)
@@ -545,6 +545,10 @@ Document::~Document()
         for (size_t i = 0; i < m_pageGroupUserSheets->size(); ++i)
             (*m_pageGroupUserSheets)[i]->clearOwnerNode();
     }
+    if (m_userSheets) {
+        for (size_t i = 0; i < m_userSheets->size(); ++i)
+            (*m_userSheets)[i]->clearOwnerNode();
+    }
 
     m_weakReference->clear();
 
@@ -1729,7 +1733,7 @@ void Document::createStyleSelector()
     bool matchAuthorAndUserStyles = true;
     if (Settings* docSettings = settings())
         matchAuthorAndUserStyles = docSettings->authorAndUserStylesEnabled();
-    m_styleSelector = adoptPtr(new CSSStyleSelector(this, m_styleSheets.get(), m_mappedElementSheet.get(), pageUserSheet(), pageGroupUserSheets(), 
+    m_styleSelector = adoptPtr(new CSSStyleSelector(this, m_styleSheets.get(), m_mappedElementSheet.get(), pageUserSheet(), pageGroupUserSheets(), m_userSheets.get(),
                                                     !inQuirksMode(), matchAuthorAndUserStyles));
     // Delay resetting the flags until after next style recalc since unapplying the style may not work without these set (this is true at least with before/after).
     m_usesSiblingRules = m_usesSiblingRules || m_styleSelector->usesSiblingRules();
@@ -2466,6 +2470,14 @@ void Document::updatePageGroupUserSheets()
         styleSelectorChanged(RecalcStyleImmediately);
 }
 
+void Document::addUserSheet(PassRefPtr<CSSStyleSheet> userSheet)
+{
+    if (!m_userSheets)
+        m_userSheets = adoptPtr(new Vector<RefPtr<CSSStyleSheet> >);
+    m_userSheets->append(userSheet);
+    styleSelectorChanged(RecalcStyleImmediately);
+}
+
 CSSStyleSheet* Document::elementSheet()
 {
     if (!m_elemSheet)
index 10751b5..e00b869 100644 (file)
@@ -615,6 +615,8 @@ public:
     void clearPageGroupUserSheets();
     void updatePageGroupUserSheets();
 
+    void addUserSheet(PassRefPtr<CSSStyleSheet> userSheet);
+
     CSSStyleSheet* elementSheet();
     CSSStyleSheet* mappedElementSheet();
     
@@ -1199,6 +1201,7 @@ private:
     RefPtr<CSSStyleSheet> m_mappedElementSheet;
     RefPtr<CSSStyleSheet> m_pageUserSheet;
     mutable OwnPtr<Vector<RefPtr<CSSStyleSheet> > > m_pageGroupUserSheets;
+    OwnPtr<Vector<RefPtr<CSSStyleSheet> > > m_userSheets;
     mutable bool m_pageGroupUserSheetCacheValid;
 
     bool m_printing;
index 2b51a87..cfe44c0 100644 (file)
@@ -1,3 +1,19 @@
+2011-07-25  Mihai Parparita  <mihaip@chromium.org>
+
+        [Chromium] Add better WebKit API for chrome.tabs.insertCSS extension API
+        https://bugs.webkit.org/show_bug.cgi?id=65158
+
+        Reviewed by David Hyatt.
+
+        Add WebDocument::insertUserStyleSheet which inserts a user stylesheet,
+        instead of forcing extensions to use insertStyleText which manipulates
+        the DOM of the page and results in compatibility issues (see
+        http://crbug.com/82220).
+
+        * public/WebDocument.h:
+        * src/WebDocument.cpp:
+        (WebKit::WebDocument::insertUserStyleSheet):
+
 2011-07-27  Vsevolod Vlasov  <vsevik@chromium.org>
 
         Web Inspector: Disable cache option should only clear memory cache, not disable it.
index 8b7bc55..762f3d3 100644 (file)
@@ -56,6 +56,11 @@ class WebURL;
 // Provides readonly access to some properties of a DOM document.
 class WebDocument : public WebNode {
 public:
+    enum UserStyleLevel {
+        UserStyleUserLevel,
+        UserStyleAuthorLevel
+    };
+
     WebDocument() { }
     WebDocument(const WebDocument& e) : WebNode(e) { }
 
@@ -98,9 +103,17 @@ public:
     // document. |elementId| can be empty, but if specified then it is used
     // as the id for the newly inserted element (replacing an existing one
     // with the same id, if any).
+    // FIXME: Remove this once Chromium callers have been updated to call
+    // insertUserStyleSheet instead.
     WEBKIT_API bool insertStyleText(const WebString& styleText,
                                     const WebString& elementId);
 
+    // Inserts the given CSS source code as a user stylesheet in the document.
+    // Meant for programatic/one-off injection, as opposed to
+    // WebView::addUserStyleSheet which inserts styles for the lifetime of the
+    // WebView.
+    WEBKIT_API void insertUserStyleSheet(const WebString& sourceCode, UserStyleLevel);
+
 #if WEBKIT_IMPLEMENTATION
     WebDocument(const WTF::PassRefPtr<WebCore::Document>&);
     WebDocument& operator=(const WTF::PassRefPtr<WebCore::Document>&);
index a8ad5b6..0380563 100644 (file)
@@ -32,6 +32,7 @@
 #include "WebDocument.h"
 
 #include "AXObjectCache.h"
+#include "CSSStyleSheet.h"
 #include "Document.h"
 #include "DocumentLoader.h"
 #include "DocumentType.h"
@@ -207,6 +208,16 @@ bool WebDocument::insertStyleText(const WebString& styleText, const WebString& e
     return success;
 }
 
+void WebDocument::insertUserStyleSheet(const WebString& sourceCode, UserStyleLevel level)
+{
+    RefPtr<Document> document = unwrap<Document>();
+
+    RefPtr<CSSStyleSheet> parsedSheet = CSSStyleSheet::create(document.get());
+    parsedSheet->setIsUserStyleSheet(level == UserStyleUserLevel);
+    parsedSheet->parseString(sourceCode, !document->inQuirksMode());
+    document->addUserSheet(parsedSheet.release());
+}
+
 WebDocument::WebDocument(const PassRefPtr<Document>& elem)
     : WebNode(elem)
 {