]> git.decadent.org.uk Git - videolink.git/commitdiff
Changed style-sheet application in Mozila/XULRunner 1.8 to override built-in preferen...
authorBen Hutchings <ben@decadent.org.uk>
Sat, 14 Oct 2006 00:52:28 +0000 (00:52 +0000)
committerBen Hutchings <ben@decadent.org.uk>
Sun, 2 Nov 2008 23:57:29 +0000 (23:57 +0000)
style_sheets.cpp
style_sheets.hpp
videolink.cpp

index 9c599826e921abace5045c2d8cbe0659b1bbfd88..1f66810771976c7d89beae43017bfae0247c8831 100644 (file)
@@ -4,12 +4,13 @@
 #include "style_sheets.hpp"
 
 #include <nsContentCID.h>
-#include <nsICSSLoader.h>
-#include <nsICSSStyleSheet.h>
-#include <nsIPresShell.h>
 #if MOZ_VERSION_MAJOR > 1 || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8)
+#   include <nsIStyleSheetService.h>
 #   include <nsServiceManagerUtils.h>
 #else
+#   include <nsICSSLoader.h>
+#   include <nsICSSStyleSheet.h>
+#   include <nsIPresShell.h>
 #   include <nsIServiceManagerUtils.h>
 #endif
 #include <nsIURI.h>
 
 using xpcom_support::check;
 
-// Load a CSS from an (absolute) URI.
-// TODO: Support loading from an absolute, or better, relative filename.
-already_AddRefed<nsIStyleSheet> load_css(const char * uri)
+#if MOZ_VERSION_MAJOR > 1 || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8)
+
+// We just have to load and register a style-sheet as a user
+// style-sheet.  There is no need to do anything for each page.
+
+agent_style_sheet_holder init_agent_style_sheet(const char * uri)
+{
+    nsCOMPtr<nsIURI> style_sheet_uri;
+    check(NS_NewURI(getter_AddRefs(style_sheet_uri), nsCString(uri)));
+
+    nsCOMPtr<nsIStyleSheetService> style_sheet_service;
+    static const nsCID style_sheet_service_cid = {
+       // NS_STYLESHEETSERVICE_CID copied from
+       // layout/base/nsStyleSheetService.cpp
+       0xfcca6f83, 0x9f7d, 0x44e4,
+       {0xa7, 0x4b, 0xb5, 0x94, 0x33, 0xe6, 0xc8, 0xc3}
+    };
+    check(CallGetService<nsIStyleSheetService>(
+             style_sheet_service_cid, getter_AddRefs(style_sheet_service)));
+    check(style_sheet_service->LoadAndRegisterSheet(
+             style_sheet_uri, nsIStyleSheetService::USER_SHEET));
+
+    return agent_style_sheet_holder();
+}
+
+#else // Mozilla version < 1.8
+
+already_AddRefed<nsIStyleSheet> init_agent_style_sheet(const char * uri)
 {
     nsCOMPtr<nsICSSLoader> css_loader;
     static const nsCID css_loader_cid = NS_CSS_LOADER_CID;
@@ -38,25 +64,19 @@ already_AddRefed<nsIStyleSheet> load_css(const char * uri)
 
 // Apply a style-sheet to a given presentation shell as the top-priority
 // agent style-sheet and disable the preferences-derived style rules.
-void apply_style_sheet(nsIStyleSheet * style_sheet, nsIPresShell * pres_shell)
+void apply_agent_style_sheet(nsIStyleSheet * style_sheet,
+                            nsIPresShell * pres_shell)
 {
     nsCOMArray<nsIStyleSheet> style_sheets;
     check(pres_shell->GetAgentStyleSheets(style_sheets));
-    check(style_sheets.AppendObject(style_sheet));
+    check(style_sheets.InsertObjectAt(style_sheet, 0));
     check(pres_shell->SetAgentStyleSheets(style_sheets));
 
-    // FIXME: We need to find an alternative that works in Mozilla 1.8.
-#   if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR < 8
-       check(pres_shell->EnablePrefStyleRules(false));
-#   endif
+    check(pres_shell->EnablePrefStyleRules(false));
 
     // Update the display
-#   if MOZ_VERSION_MAJOR > 1                              \
-    || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8)
-       pres_shell->ReconstructStyleData();
-       check(pres_shell->FlushPendingNotifications(Flush_Display));
-#   else
-       check(pres_shell->ReconstructStyleData());
-       check(pres_shell->FlushPendingNotifications(true));
-#   endif
+    check(pres_shell->ReconstructStyleData());
+    check(pres_shell->FlushPendingNotifications(true));
 }
+
+#endif // Mozilla version >=/< 1.8
index bb39b2286f03b98d369ebc4107917ee9f670ab69..ef4aef34b7852a49292f2bd9ae70627763e289fe 100644 (file)
@@ -9,12 +9,29 @@
 
 class nsIPresShell;
 
-// Load a CSS from an (absolute) URI.
-// TODO: Support loading from an absolute, or better, relative filename.
-already_AddRefed<nsIStyleSheet> load_css(const char * uri);
+// These functions load and apply a style-sheet as necessary,
+// overriding the built-in "preferences".
+
+// init_agent_style_sheet() must be called once during startup
+// apply_agent_style_sheet() must be called for each page
+
+#if MOZ_VERSION_MAJOR > 1 || (MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR >= 8)
+
+struct agent_style_sheet_holder {};
+
+// Load agent style sheet from an (absolute) URI, and register it if
+// possible.
+agent_style_sheet_holder init_agent_style_sheet(const char * uri);
+inline void apply_agent_style_sheet(agent_style_sheet_holder, nsIPresShell *)
+{}
+
+#else
+
+typedef nsCOMPtr<nsIStyleSheet> agent_style_sheet_holder;
+already_AddRefed<nsIStyleSheet> init_agent_style_sheet(const char * uri);
+void apply_agent_style_sheet(nsIStyleSheet *, nsIPresShell *);
+
+#endif
 
-// Apply a style-sheet to a given presentation shell as the top-priority
-// agent style-sheet and disable the preferences-derived style rules.
-void apply_style_sheet(nsIStyleSheet *, nsIPresShell *);
 
 #endif // !INC_STYLESHEETS_HPP
index 59956c744eb673a36ce7234669f9fc51798a543c..8ab52660ec2b3d347692a499af9cb4194c20d1fa 100644 (file)
@@ -194,7 +194,7 @@ namespace
        std::string output_dir_;
        mpeg_encoder encoder_;
        browser_widget browser_widget_;
-       nsCOMPtr<nsIStyleSheet> stylesheet_;
+       agent_style_sheet_holder style_sheet_;
 
        dvd_contents contents_;
        typedef std::map<std::string, dvd_contents::pgc_ref> resource_map_type;
@@ -219,7 +219,8 @@ namespace
            : frame_params_(frame_params),
              output_dir_(output_dir),
              encoder_(encoder),
-             stylesheet_(load_css("file://" VIDEOLINK_SHARE_DIR "/videolink.css")),
+             style_sheet_(init_agent_style_sheet(
+                              "file://"VIDEOLINK_SHARE_DIR"/videolink.css")),
              pending_window_update_(false),
              pending_req_count_(0),
              have_tweaked_page_(false),
@@ -440,7 +441,7 @@ namespace
        // disable scrollbars.
        if (!have_tweaked_page_)
        {
-           apply_style_sheet(stylesheet_, pres_shell);
+           apply_agent_style_sheet(style_sheet_, pres_shell);
 
            // This actually only needs to be done once.
            nsCOMPtr<nsIDOMBarProp> dom_bar_prop;
@@ -874,12 +875,6 @@ namespace
            check(pref_branch->SetBoolPref(
                      "layout.fire_onload_after_image_background_loads",
                      true));
-
-           // Turn off link underlining.  This is also set in the agent
-           // stylesheet, but seems to be overridden by preferences in
-           // Mozilla 1.8.
-           check(pref_branch->SetBoolPref("browser.underline_anchors",
-                                          false));
 #      endif
 
        // Set display resolution.  With standard-definition video we