From 11c596f7a06dbda123c077440f9275905f89e869 Mon Sep 17 00:00:00 2001 From: Matthew Horan Date: Tue, 1 Jan 2013 12:43:41 -0500 Subject: [PATCH] Ignore custom fonts applied to pseudo elements WebPage::setUserStylesheet prevents Web Fonts from loading when styles are applied directly to elements, however if the styles are applied to pseudo elements, the override does not apply. This leads to crashes on Mac OS X, likely due to https://bugs.webkit.org/show_bug.cgi?id=61031. --- spec/driver_spec.rb | 38 ++++++++++++++++++++++++++++++++++++++ src/WebPage.cpp | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/spec/driver_spec.rb b/spec/driver_spec.rb index 1f571ce..05a7ba1 100644 --- a/spec/driver_spec.rb +++ b/spec/driver_spec.rb @@ -1308,10 +1308,16 @@ describe Capybara::Webkit::Driver do

Hello

+

Hello first line.

+

Hello first letter.

HTML @@ -1326,6 +1332,38 @@ describe Capybara::Webkit::Driver do SCRIPT font_family.should == "Arial" end + + it "ignores custom fonts before an element" do + font_family = driver.evaluate_script(<<-SCRIPT) + var element = document.getElementById("text"); + element.ownerDocument.defaultView.getComputedStyle(element, 'before').getPropertyValue("font-family"); + SCRIPT + font_family.should == "Arial" + end + + it "ignores custom fonts after an element" do + font_family = driver.evaluate_script(<<-SCRIPT) + var element = document.getElementById("text"); + element.ownerDocument.defaultView.getComputedStyle(element, 'after').getPropertyValue("font-family"); + SCRIPT + font_family.should == "Arial" + end + + it "ignores custom fonts applied to the first-line pseudo element" do + font_family = driver.evaluate_script(<<-SCRIPT) + var element = document.getElementById("first-line-div"); + element.ownerDocument.defaultView.getComputedStyle(element, 'first-line').getPropertyValue("font-family"); + SCRIPT + font_family.should == "Arial" + end + + it "ignores custom fonts applied to the first-letter pseudo element" do + font_family = driver.evaluate_script(<<-SCRIPT) + var element = document.getElementById("first-letter-div"); + element.ownerDocument.defaultView.getComputedStyle(element, 'first-letter').getPropertyValue("font-family"); + SCRIPT + font_family.should == "Arial" + end end context "cookie-based app" do diff --git a/src/WebPage.cpp b/src/WebPage.cpp index 5cb967a..57e7212 100644 --- a/src/WebPage.cpp +++ b/src/WebPage.cpp @@ -70,7 +70,7 @@ void WebPage::loadJavascript() { } void WebPage::setUserStylesheet() { - QString data = QString("* { font-family: 'Arial' ! important; }").toUtf8().toBase64(); + QString data = QString("*, :first-line, :first-letter, :before, :after { font-family: 'Arial' ! important; }").toUtf8().toBase64(); QUrl url = QUrl(QString("data:text/css;charset=utf-8;base64,") + data); settings()->setUserStyleSheetUrl(url); }