Changeset 44758 in webkit


Ignore:
Timestamp:
Jun 17, 2009 7:52:28 AM (15 years ago)
Author:
Adam Roben
Message:

2009-06-16 Kenneth Rohde Christiansen <kenneth.christiansen@openbossa.org>

Reviewed by Dave Hyatt and Adam Roben.

https://bugs.webkit.org/show_bug.cgi?id=26278
Patch that make WebCore have a RenderTheme per page

Create a different RenderTheme per page, so that RenderTheme has
access to page specific theming. This is needed for the Qt port, as Qt
supports setting the theme (style) per widget.

This change was suggested and discussed with Dave Hyatt.

More detailed:

1) Create a theme per page or one global one, depending on the needs

of the platform.

2) Add an accesser to the theme from RenderObject.
3) Change all uses of the theming to access the theme through

RenderObject, using the global default theme as fallback, when the
document of RenderObject has no page.
When we don't have access to a RenderObject, use the default theme.

4) Modify all RenderTheme platform implementations to work with the

above changes, still creating only one global theme.

Location:
trunk
Files:
39 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r44757 r44758  
     12009-06-16  Kenneth Rohde Christiansen  <kenneth.christiansen@openbossa.org>
     2
     3        Reviewed by Dave Hyatt and Adam Roben.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=26278
     6        Patch that make WebCore have a RenderTheme per page
     7
     8
     9        Create a different RenderTheme per page, so that RenderTheme has
     10        access to page specific theming. This is needed for the Qt port, as Qt
     11        supports setting the theme (style) per widget.
     12
     13        This change was suggested and discussed with Dave Hyatt.
     14
     15        More detailed:
     16
     17        1) Create a theme per page or one global one, depending on the needs
     18           of the platform.
     19        2) Add an accesser to the theme from RenderObject.
     20        3) Change all uses of the theming to access the theme through
     21           RenderObject, using the global default theme as fallback, when the
     22           document of RenderObject has no page.
     23           When we don't have access to a RenderObject, use the default theme.
     24        4) Modify all RenderTheme platform implementations to work with the
     25           above changes, still creating only one global theme.
     26
     27
     28        * accessibility/AccessibilityRenderObject.cpp:
     29        (WebCore::AccessibilityRenderObject::boundingBoxRect):
     30        * css/CSSStyleSelector.cpp:
     31        (WebCore::loadFullDefaultStyle):
     32        (WebCore::CSSStyleSelector::styleForElement):
     33        (WebCore::CSSStyleSelector::adjustRenderStyle):
     34        (WebCore::CSSStyleSelector::applyProperty):
     35        * dom/ContainerNode.cpp:
     36        (WebCore::ContainerNode::setActive):
     37        (WebCore::ContainerNode::setHovered):
     38        * editing/SelectionController.cpp:
     39        (WebCore::SelectionController::focusedOrActiveStateChanged):
     40        * html/HTMLFormControlElement.cpp:
     41        (WebCore::HTMLFormControlElement::parseMappedAttribute):
     42        * html/HTMLInputElement.cpp:
     43        (WebCore::HTMLInputElement::setChecked):
     44        (WebCore::HTMLInputElement::setIndeterminate):
     45        * page/Frame.cpp:
     46        (WebCore::Frame::selectionLayoutChanged):
     47        * page/FrameView.cpp:
     48        (WebCore::FrameView::updateControlTints):
     49        * page/Page.cpp:
     50        (WebCore::Page::Page):
     51        * page/Page.h:
     52        (WebCore::Page::theme):
     53        * platform/chromium/PopupMenuChromium.cpp:
     54        (WebCore::PopupListBox::paintRow):
     55        * platform/gtk/RenderThemeGtk.cpp:
     56        (WebCore::RenderThemeGtk::create):
     57        (WebCore::RenderTheme::themeForPage):
     58        (WebCore::RenderThemeGtk::RenderThemeGtk):
     59        (WebCore::RenderThemeGtk::~RenderThemeGtk):
     60        (WebCore::RenderThemeGtk::gtkEntry):
     61        (WebCore::RenderThemeGtk::gtkTreeView):
     62        * platform/gtk/RenderThemeGtk.h:
     63        * platform/qt/RenderThemeQt.cpp:
     64        (WebCore::RenderThemeQt::create):
     65        (WebCore::RenderTheme::themeForPage):
     66        * platform/qt/RenderThemeQt.h:
     67        * platform/win/PopupMenuWin.cpp:
     68        (WebCore::PopupMenu::paint):
     69        * rendering/RenderMediaControls.cpp:
     70        (WebCore::determineState):
     71        * platform/wx/RenderThemeWx.cpp:
     72        (WebCore::RenderThemeWx::create):
     73        (WebCore::RenderTheme::themeForPage):
     74        * rendering/InlineTextBox.cpp:
     75        (WebCore::InlineTextBox::paintTextMatchMarker):
     76        * rendering/MediaControlElements.cpp:
     77        (WebCore::MediaControlInputElement::hitTest):
     78        * rendering/RenderObject.cpp:
     79        (WebCore::RenderObject::theme):
     80        * rendering/RenderObject.h:
     81        * rendering/RenderTheme.cpp:
     82        (WebCore::RenderTheme::adjustStyle):
     83        * rendering/RenderTheme.h:
     84        (WebCore::RenderTheme::defaultTheme):
     85        * rendering/RenderThemeChromiumLinux.cpp:
     86        (WebCore::RenderThemeChromiumLinux::create):
     87        (WebCore::RenderTheme::themeForPage):
     88        * rendering/RenderThemeChromiumLinux.h:
     89        (WebCore::RenderThemeChromiumLinux::~RenderThemeChromiumLinux):
     90        * rendering/RenderThemeChromiumMac.h:
     91        * rendering/RenderThemeChromiumMac.mm:
     92        (WebCore::RenderThemeChromiumMac::create):
     93        (WebCore::RenderTheme::themeForPage):
     94        * rendering/RenderThemeChromiumWin.cpp:
     95        (WebCore::RenderThemeChromiumWin::create):
     96        (WebCore::RenderTheme::themeForPage):
     97        * rendering/RenderThemeChromiumWin.h:
     98        (WebCore::RenderThemeChromiumWin::RenderThemeChromiumWin):
     99        (WebCore::RenderThemeChromiumWin::~RenderThemeChromiumWin):
     100        * rendering/RenderThemeMac.h:
     101        * rendering/RenderThemeMac.mm:
     102        (WebCore::RenderTheme::themeForPage):
     103        * rendering/RenderThemeSafari.cpp:
     104        (WebCore::RenderThemeSafari::create):
     105        (WebCore::RenderTheme::themeForPage):
     106        * rendering/RenderThemeSafari.h:
     107        * rendering/RenderThemeWin.cpp:
     108        (WebCore::RenderThemeWin::create):
     109        (WebCore::RenderTheme::themeForPage):
     110        * rendering/RenderThemeWin.h:
     111
    11122009-06-17  Gavin Barraclough  <barraclough@apple.com>
    2113
  • trunk/WebCore/accessibility/AccessibilityRenderObject.cpp

    r44678 r44758  
    10091009        if (!r.isEmpty()) {
    10101010            if (obj->style()->hasAppearance())
    1011                 theme()->adjustRepaintRect(obj, r);
     1011                obj->theme()->adjustRepaintRect(obj, r);
    10121012            result.unite(r);
    10131013        }
  • trunk/WebCore/css/CSSStyleSelector.cpp

    r44449 r44758  
    527527
    528528    // Strict-mode rules.
    529     String defaultRules = String(html4UserAgentStyleSheet, sizeof(html4UserAgentStyleSheet)) + theme()->extraDefaultStyleSheet();
     529    String defaultRules = String(html4UserAgentStyleSheet, sizeof(html4UserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraDefaultStyleSheet();
    530530    CSSStyleSheet* defaultSheet = parseUASheet(defaultRules);
    531531    defaultStyle->addRulesFromSheet(defaultSheet, screenEval());
     
    533533
    534534    // Quirks-mode rules.
    535     String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + theme()->extraQuirksStyleSheet();
     535    String quirksRules = String(quirksUserAgentStyleSheet, sizeof(quirksUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraQuirksStyleSheet();
    536536    CSSStyleSheet* quirksSheet = parseUASheet(quirksRules);
    537537    defaultQuirksStyle->addRulesFromSheet(quirksSheet, screenEval());
     
    11391139    if (!loadedMediaStyleSheet && (e->hasTagName(videoTag) || e->hasTagName(audioTag))) {
    11401140        loadedMediaStyleSheet = true;
    1141         String mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + theme()->extraMediaControlsStyleSheet();
     1141        String mediaRules = String(mediaControlsUserAgentStyleSheet, sizeof(mediaControlsUserAgentStyleSheet)) + RenderTheme::defaultTheme()->extraMediaControlsStyleSheet();
    11421142        CSSStyleSheet* mediaControlsSheet = parseUASheet(mediaRules);
    11431143        defaultStyle->addRulesFromSheet(mediaControlsSheet, screenEval());
     
    15901590    // Let the theme also have a crack at adjusting the style.
    15911591    if (style->hasAppearance())
    1592         theme()->adjustStyle(this, style, e, m_hasUAAppearance, m_borderData, m_backgroundData, m_backgroundColor);
     1592        RenderTheme::defaultTheme()->adjustStyle(this, style, e, m_hasUAAppearance, m_borderData, m_backgroundData, m_backgroundColor);
    15931593
    15941594#if ENABLE(SVG)
     
    42934293           
    42944294            FontDescription fontDescription;
    4295             theme()->systemFont(primitiveValue->getIdent(), fontDescription);
     4295            RenderTheme::defaultTheme()->systemFont(primitiveValue->getIdent(), fontDescription);
    42964296 
    42974297            // Double-check and see if the theme did anything.  If not, don't bother updating the font.
     
    56965696            return col->color;
    56975697    }
    5698     return theme()->systemColor(cssValueId);
     5698    return RenderTheme::defaultTheme()->systemColor(cssValueId);
    56995699}
    57005700
  • trunk/WebCore/dom/ContainerNode.cpp

    r43152 r44758  
    799799            setNeedsStyleRecalc();
    800800        if (renderer() && renderer()->style()->hasAppearance()) {
    801             if (theme()->stateChanged(renderer(), PressedState))
     801            if (renderer()->theme()->stateChanged(renderer(), PressedState))
    802802                reactsToPress = true;
    803803        }
     
    841841            setNeedsStyleRecalc();
    842842        if (renderer() && renderer()->style()->hasAppearance())
    843             theme()->stateChanged(renderer(), HoverState);
     843            renderer()->theme()->stateChanged(renderer(), HoverState);
    844844    }
    845845}
  • trunk/WebCore/editing/SelectionController.cpp

    r44429 r44758  
    4646#include "Page.h"
    4747#include "Range.h"
    48 #include "RenderTheme.h"
    4948#include "RenderView.h"
    5049#include "TextIterator.h"
     
    12681267        if (RenderObject* renderer = node->renderer())
    12691268            if (renderer && renderer->style()->hasAppearance())
    1270                 theme()->stateChanged(renderer, FocusState);
     1269                renderer->theme()->stateChanged(renderer, FocusState);
    12711270    }
    12721271
  • trunk/WebCore/html/HTMLFormControlElement.cpp

    r44100 r44758  
    7272            setNeedsStyleRecalc();
    7373            if (renderer() && renderer()->style()->hasAppearance())
    74                 theme()->stateChanged(renderer(), EnabledState);
     74                renderer()->theme()->stateChanged(renderer(), EnabledState);
    7575        }
    7676    } else if (attr->name() == readonlyAttr) {
     
    8080            setNeedsStyleRecalc();
    8181            if (renderer() && renderer()->style()->hasAppearance())
    82                 theme()->stateChanged(renderer(), ReadOnlyState);
     82                renderer()->theme()->stateChanged(renderer(), ReadOnlyState);
    8383        }
    8484    } else
  • trunk/WebCore/html/HTMLInputElement.cpp

    r44218 r44758  
    882882
    883883    checkedRadioButtons(this).addButton(this);
    884    
     884
    885885    if (renderer() && renderer()->style()->hasAppearance())
    886         theme()->stateChanged(renderer(), CheckedState);
     886        renderer()->theme()->stateChanged(renderer(), CheckedState);
    887887
    888888    // Only send a change event for items in the document (avoid firing during
     
    906906
    907907    if (renderer() && renderer()->style()->hasAppearance())
    908         theme()->stateChanged(renderer(), CheckedState);
     908        renderer()->theme()->stateChanged(renderer(), CheckedState);
    909909}
    910910
  • trunk/WebCore/page/Frame.cpp

    r44416 r44758  
    623623    // already blinking in the right location.
    624624    if (shouldBlink && !m_caretBlinkTimer.isActive()) {
    625         if (double blinkInterval = theme()->caretBlinkInterval())
     625        if (double blinkInterval = page()->theme()->caretBlinkInterval())
    626626            m_caretBlinkTimer.startRepeating(blinkInterval);
    627627
  • trunk/WebCore/page/FrameView.cpp

    r44755 r44758  
    12971297   
    12981298    // Optimize the common case where we bring a window to the front while it's still empty.
    1299     if (!m_frame || m_frame->loader()->url().isEmpty()) 
    1300         return;
    1301    
    1302     if (theme()->supportsControlTints() && m_frame->contentRenderer()) {
     1299    if (!m_frame || m_frame->loader()->url().isEmpty())
     1300        return;
     1301
     1302    if (m_frame->contentRenderer() && m_frame->contentRenderer()->theme()->supportsControlTints()) {
    13031303        if (needsLayout())
    13041304            layout();
  • trunk/WebCore/page/Page.cpp

    r44468 r44758  
    4747#include "ProgressTracker.h"
    4848#include "RenderWidget.h"
     49#include "RenderTheme.h"
    4950#include "ScriptController.h"
    5051#include "SelectionController.h"
     
    121122    , m_customHTMLTokenizerTimeDelay(-1)
    122123    , m_customHTMLTokenizerChunkSize(-1)
     124    , m_theme(RenderTheme::themeForPage(this))
    123125{
    124126    if (!allPages) {
  • trunk/WebCore/page/Page.h

    r42725 r44758  
    2828#include "LinkHash.h"
    2929#include "PlatformString.h"
     30#include "RenderTheme.h"
    3031#include <wtf/HashSet.h>
    3132#include <wtf/OwnPtr.h>
     
    7980        Page(ChromeClient*, ContextMenuClient*, EditorClient*, DragClient*, InspectorClient*);
    8081        ~Page();
    81        
     82
     83        RenderTheme* theme() const { return m_theme.get(); };
     84
    8285        static void refreshPlugins(bool reload);
    8386        PluginData* pluginData() const;
     
    218221        mutable RefPtr<PluginData> m_pluginData;
    219222
     223        RefPtr<RenderTheme> m_theme;
     224
    220225        EditorClient* m_editorClient;
    221226
  • trunk/WebCore/platform/chromium/PopupMenuChromium.cpp

    r44500 r44758  
    774774    Color backColor, textColor;
    775775    if (rowIndex == m_selectedIndex) {
    776         backColor = theme()->activeListBoxSelectionBackgroundColor();
    777         textColor = theme()->activeListBoxSelectionForegroundColor();
     776        backColor = RenderTheme::defaultTheme()->activeListBoxSelectionBackgroundColor();
     777        textColor = RenderTheme::defaultTheme()->activeListBoxSelectionForegroundColor();
    778778    } else {
    779779        backColor = style.backgroundColor();
  • trunk/WebCore/platform/gtk/RenderThemeGtk.cpp

    r43250 r44758  
    33 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
    44 * Copyright (C) 2008 Collabora Ltd.
     5 * Copyright (C) 2009 Kenneth Rohde Christiansen
    56 *
    67 * This library is free software; you can redistribute it and/or
     
    3536namespace WebCore {
    3637
    37 RenderTheme* theme()
    38 {
    39     static RenderThemeGtk gtkTheme;
    40     return &gtkTheme;
    41 }
    42 
    43 static bool mozGtkInitialized = false;
     38PassRefPtr<RenderTheme> RenderThemeGtk::create()
     39{
     40    return adoptRef(new RenderThemeGtk());
     41}
     42
     43PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     44{
     45    static RenderTheme* rt = RenderThemeGtk::create().releaseRef();
     46    return rt;
     47}
     48
     49static int mozGtkRefCount = 0;
    4450
    4551RenderThemeGtk::RenderThemeGtk()
     
    4955    , m_gtkTreeView(0)
    5056{
    51     if (!mozGtkInitialized) {
    52         mozGtkInitialized = true;
     57    if (!mozGtkRefCount)
    5358        moz_gtk_init();
    54     }
     59
     60    ++mozGtkRefCount;
    5561}
    5662
    5763RenderThemeGtk::~RenderThemeGtk()
    5864{
    59     if (mozGtkInitialized) {
     65    --mozGtkRefCount;
     66
     67    if (!mozGtkRefCount)
    6068        moz_gtk_shutdown();
    61         mozGtkInitialized = false;
    62     }
    6369}
    6470
     
    471477
    472478    m_gtkEntry = gtk_entry_new();
    473     g_signal_connect(m_gtkEntry, "style-set", G_CALLBACK(gtkStyleSetCallback), theme());
     479    g_signal_connect(m_gtkEntry, "style-set", G_CALLBACK(gtkStyleSetCallback), const_cast<RenderThemeGtk*>(this));
    474480    gtk_container_add(gtkContainer(), m_gtkEntry);
    475481    gtk_widget_realize(m_gtkEntry);
     
    484490
    485491    m_gtkTreeView = gtk_tree_view_new();
    486     g_signal_connect(m_gtkTreeView, "style-set", G_CALLBACK(gtkStyleSetCallback), theme());
     492    g_signal_connect(m_gtkTreeView, "style-set", G_CALLBACK(gtkStyleSetCallback), const_cast<RenderThemeGtk*>(this));
    487493    gtk_container_add(gtkContainer(), m_gtkTreeView);
    488494    gtk_widget_realize(m_gtkTreeView);
  • trunk/WebCore/platform/gtk/RenderThemeGtk.h

    r43250 r44758  
    66 * Copyright (C) 2007 Holger Hans Peter Freyther
    77 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
     8 * Copyright (C) 2009 Kenneth Rohde Christiansen
    89 * All rights reserved.
    910 *
     
    3536
    3637class RenderThemeGtk : public RenderTheme {
    37 public:
     38private:
    3839    RenderThemeGtk();
    3940    virtual ~RenderThemeGtk();
     41
     42public:
     43    static PassRefPtr<RenderTheme> create();
    4044
    4145    // A method asking if the theme's controls actually care about redrawing when hovered.
  • trunk/WebCore/platform/qt/RenderThemeQt.cpp

    r42887 r44758  
    107107}
    108108
    109 RenderTheme* theme()
    110 {
    111     static RenderThemeQt rt;
    112     return &rt;
     109PassRefPtr<RenderTheme> RenderThemeQt::create(Page* page)
     110{
     111    return adoptRef(new RenderThemeQt(page));
     112}
     113
     114PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     115{
     116    if (page)
     117        return RenderThemeQt::create(page);
     118
     119    static RenderTheme* fallback = RenderThemeQt::create(0).releaseRef();
     120    return fallback;
    113121}
    114122
  • trunk/WebCore/platform/qt/RenderThemeQt.h

    r42038 r44758  
    3939class RenderThemeQt : public RenderTheme
    4040{
    41 public:
     41private:
    4242    RenderThemeQt();
    4343    virtual ~RenderThemeQt();
     44
     45public:
     46    static PassRefPtr<RenderTheme> create(Page*);
    4447
    4548    virtual bool supportsHover(const RenderStyle*) const;
  • trunk/WebCore/platform/win/PopupMenuWin.cpp

    r42401 r44758  
    487487        PopupMenuStyle itemStyle = client()->itemStyle(index);
    488488        if (index == focusedIndex()) {
    489             optionBackgroundColor = theme()->activeListBoxSelectionBackgroundColor();
    490             optionTextColor = theme()->activeListBoxSelectionForegroundColor();
     489            optionBackgroundColor = RenderTheme::defaultTheme()->activeListBoxSelectionBackgroundColor();
     490            optionTextColor = RenderTheme::defaultTheme()->activeListBoxSelectionForegroundColor();
    491491        } else {
    492492            optionBackgroundColor = itemStyle.backgroundColor();
     
    526526        if (itemStyle.isVisible()) {
    527527            int textX = max(0, client()->clientPaddingLeft() - client()->clientInsetLeft());
    528             if (theme()->popupOptionSupportsTextIndent() && itemStyle.textDirection() == LTR)
     528            if (RenderTheme::defaultTheme()->popupOptionSupportsTextIndent() && itemStyle.textDirection() == LTR)
    529529                textX += itemStyle.textIndent().calcMinValue(itemRect.width());
    530530            int textY = itemRect.y() + itemFont.ascent() + (itemRect.height() - itemFont.height()) / 2;
  • trunk/WebCore/platform/wx/RenderThemeWx.cpp

    r43330 r44758  
    4545
    4646class RenderThemeWx : public RenderTheme {
     47private:
     48    RenderThemeWx() : RenderTheme() { }
     49    virtual ~RenderThemeWx();
     50
    4751public:
    48     RenderThemeWx() : RenderTheme() { }
     52    static PassRefPtr<RenderTheme> create();
    4953
    5054    // A method asking if the theme's controls actually care about redrawing when hovered.
     
    120124#endif
    121125
    122 RenderTheme* theme()
    123 {
    124     static RenderThemeWx rt;
    125     return &rt;
     126PassRefPtr<RenderTheme> RenderThemeWx::create()
     127{
     128    return adoptRef(new RenderThemeWx());
     129}
     130
     131PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     132{
     133    static RenderTheme* rt = RenderThemeWx().create().releaseRef();
     134    return rt;
    126135}
    127136
  • trunk/WebCore/rendering/InlineTextBox.cpp

    r43664 r44758  
    3333#include "RenderArena.h"
    3434#include "RenderBlock.h"
    35 #include "RenderTheme.h"
    3635#include "Text.h"
    3736#include "break_lines.h"
     
    771770    if (renderer()->document()->frame()->markedTextMatchesAreHighlighted()) {
    772771        Color color = marker.activeMatch ?
    773             theme()->platformActiveTextSearchHighlightColor() :
    774             theme()->platformInactiveTextSearchHighlightColor();
     772            renderer()->theme()->platformActiveTextSearchHighlightColor() :
     773            renderer()->theme()->platformInactiveTextSearchHighlightColor();
    775774        pt->save();
    776775        updateGraphicsContext(pt, color, color, 0);  // Don't draw text at all!
  • trunk/WebCore/rendering/MediaControlElements.cpp

    r43747 r44758  
    160160{
    161161    if (renderer() && renderer()->style()->hasAppearance())
    162         return theme()->hitTestMediaControlPart(renderer(), absPoint);
     162        return renderer()->theme()->hitTestMediaControlPart(renderer(), absPoint);
    163163
    164164    return false;
  • trunk/WebCore/rendering/RenderMediaControls.cpp

    r44738 r44758  
    5252{
    5353    ThemeControlState result = 0;
    54     if (theme()->isActive(o))
     54    RenderTheme* theme = o->theme();
     55    if (theme->isActive(o))
    5556        result |= SafariTheme::ActiveState;
    56     if (theme()->isEnabled(o) && !theme()->isReadOnlyControl(o))
     57    if (theme->isEnabled(o) && !theme->isReadOnlyControl(o))
    5758        result |= SafariTheme::EnabledState;
    58     if (theme()->isPressed(o))
     59    if (theme->isPressed(o))
    5960        result |= SafariTheme::PressedState;
    60     if (theme()->isChecked(o))
     61    if (theme->isChecked(o))
    6162        result |= SafariTheme::CheckedState;
    62     if (theme()->isIndeterminate(o))
     63    if (theme->isIndeterminate(o))
    6364        result |= SafariTheme::IndeterminateCheckedState;
    64     if (theme()->isFocused(o))
     65    if (theme->isFocused(o))
    6566        result |= SafariTheme::FocusedState;
    66     if (theme()->isDefault(o))
     67    if (theme->isDefault(o))
    6768        result |= SafariTheme::DefaultState;
    6869    return result;
  • trunk/WebCore/rendering/RenderObject.cpp

    r44755 r44758  
    4444#include "RenderTableCol.h"
    4545#include "RenderTableRow.h"
    46 #include "RenderTheme.h"
    4746#include "RenderView.h"
    4847#include "TransformState.h"
     
    213212    renderObjectCounter.decrement();
    214213#endif
     214}
     215
     216RenderTheme* RenderObject::theme() const
     217{
     218    ASSERT(document()->page());
     219
     220    return document()->page()->theme();
    215221}
    216222
  • trunk/WebCore/rendering/RenderObject.h

    r43922 r44758  
    4949class RenderFlow;
    5050class RenderLayer;
     51class RenderTheme;
    5152class TransformState;
    5253class VisiblePosition;
     
    137138    RenderObject(Node*);
    138139    virtual ~RenderObject();
     140
     141    RenderTheme* theme() const;
    139142
    140143    virtual const char* renderName() const = 0;
  • trunk/WebCore/rendering/RenderTheme.cpp

    r43367 r44758  
    6363        style->setDisplay(BLOCK);
    6464
    65     if (UAHasAppearance && theme()->isControlStyled(style, border, background, backgroundColor)) {
     65    if (UAHasAppearance && isControlStyled(style, border, background, backgroundColor)) {
    6666        if (part == MenulistPart) {
    6767            style->setAppearance(MenulistButtonPart);
  • trunk/WebCore/rendering/RenderTheme.h

    r42393 r44758  
    2424#define RenderTheme_h
    2525
    26 #include "RenderObject.h"
    2726#if USE(NEW_THEME)
    2827#include "Theme.h"
     
    3029#include "ThemeTypes.h"
    3130#endif
     31#include "RenderObject.h"
     32#include "RenderTheme.h"
    3233#include "ScrollTypes.h"
     34#include <wtf/PassRefPtr.h>
     35#include <wtf/RefCounted.h>
    3336
    3437namespace WebCore {
     
    3942class CSSStyleSheet;
    4043
    41 class RenderTheme {
     44class RenderTheme : public RefCounted<RenderTheme> {
     45protected:
     46    RenderTheme();
     47
    4248public:
    43     RenderTheme();
    4449    virtual ~RenderTheme() { }
     50
     51    // This function is to be implemented in your platform-specific theme implementation to hand back the
     52    // appropriate platform theme. When the theme is needed in non-page dependent code, a default theme is
     53    // used as fallback, which is returned for a nulled page, so the platform code needs to account for this.
     54    static PassRefPtr<RenderTheme> themeForPage(Page* page);
     55
     56    // When the theme is needed in non-page dependent code, the defaultTheme() is used as fallback.
     57    static inline PassRefPtr<RenderTheme> defaultTheme()
     58    {
     59        return themeForPage(0);
     60    };
    4561
    4662    // This method is called whenever style has been computed for an element and the appearance
     
    258274};
    259275
    260 // Function to obtain the theme.  This is implemented in your platform-specific theme implementation to hand
    261 // back the appropriate platform theme.
    262 RenderTheme* theme();
    263 
    264276} // namespace WebCore
    265277
  • trunk/WebCore/rendering/RenderThemeChromiumLinux.cpp

    r44503 r44758  
    44 * Copyright (C) 2008 Collabora Ltd.
    55 * Copyright (C) 2008, 2009 Google Inc.
     6 * Copyright (C) 2009 Kenneth Rohde Christiansen
    67 *
    78 * This library is free software; you can redistribute it and/or
     
    114115#endif
    115116
    116 RenderTheme* theme()
    117 {
    118     static RenderThemeChromiumLinux theme;
    119     return &theme;
     117PassRefPtr<RenderTheme> RenderThemeChromiumLinux::create()
     118{
     119    return adoptRef(new RenderThemeChromiumLinux());
     120}
     121
     122PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     123{
     124    static RenderTheme* rt = RenderThemeChromiumLinux::create().releaseRef();
     125    return rt;
    120126}
    121127
  • trunk/WebCore/rendering/RenderThemeChromiumLinux.h

    r44503 r44758  
    88 * Copyright (C) 2008, 2009 Google, Inc.
    99 * All rights reserved.
     10 * Copyright (C) 2009 Kenneth Rohde Christiansen
    1011 *
    1112 * This library is free software; you can redistribute it and/or
     
    3536    class RenderThemeChromiumLinux : public RenderTheme {
    3637    public:
    37         RenderThemeChromiumLinux();
    38         ~RenderThemeChromiumLinux() { }
     38        static PassRefPtr<RenderTheme> create();
    3939
    4040        virtual String extraDefaultStyleSheet();
     
    131131
    132132    private:
     133        RenderThemeChromiumLinux();
     134        ~RenderThemeChromiumLinux() { }
     135
    133136        int menuListInternalPadding(RenderStyle*, int paddingType) const;
    134137        bool paintMediaButtonInternal(GraphicsContext*, const IntRect&, Image*);
  • trunk/WebCore/rendering/RenderThemeChromiumMac.h

    r42508 r44758  
    44 * Copyright (C) 2005 Apple Computer, Inc.
    55 * Copyright (C) 2008, 2009 Google, Inc.
     6 * Copyright (C) 2009 Kenneth Rohde Christiansen
    67 *
    78 * This library is free software; you can redistribute it and/or
     
    4243    class RenderThemeChromiumMac : public RenderTheme {
    4344    public:
    44         RenderThemeChromiumMac();
    45         virtual ~RenderThemeChromiumMac();
     45        static PassRefPtr<RenderTheme> create();
    4646
    4747        // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
     
    141141
    142142    private:
     143        RenderThemeChromiumMac();
     144        virtual ~RenderThemeChromiumMac();
     145
    143146        IntRect inflateRect(const IntRect&, const IntSize&, const int* margins, float zoomLevel = 1.0f) const;
    144147
  • trunk/WebCore/rendering/RenderThemeChromiumMac.mm

    r43367 r44758  
    22 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
    33 * Copyright (C) 2008, 2009 Google, Inc.
     4 * Copyright (C) 2009 Kenneth Rohde Christiansen
    45 *
    56 * This library is free software; you can redistribute it and/or
     
    125126}
    126127
    127 RenderTheme* theme()
    128 {
    129     static RenderThemeChromiumMac* macTheme = new RenderThemeChromiumMac;
    130     return macTheme;
     128PassRefPtr<RenderTheme> RenderThemeChromiumMac::create()
     129{
     130    return adoptRef(new RenderThemeChromiumMac);
     131}
     132
     133PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     134{
     135    static RenderTheme* rt = RenderThemeChromiumMac::create().releaseRef();
     136    return rt;
    131137}
    132138
  • trunk/WebCore/rendering/RenderThemeChromiumWin.cpp

    r44029 r44758  
    44 * Copyright (C) 2006 Apple Computer, Inc.
    55 * Copyright (C) 2008, 2009 Google, Inc.
     6 * Copyright (C) 2009 Kenneth Rohde Christiansen
    67 *
    78 * This library is free software; you can redistribute it and/or
     
    266267#endif
    267268
    268 // Implement WebCore::theme() for getting the global RenderTheme.
    269 RenderTheme* theme()
    270 {
    271     static RenderThemeChromiumWin winTheme;
    272     return &winTheme;
     269PassRefPtr<RenderTheme> RenderThemeChromiumWin::create()
     270{
     271    return adoptRef(new RenderThemeChromiumWin);
     272}
     273
     274PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     275{
     276    static RenderTheme* rt = RenderThemeChromiumWin::create().releaseRef();
     277    return rt;
    273278}
    274279
  • trunk/WebCore/rendering/RenderThemeChromiumWin.h

    r44029 r44758  
    4545    class RenderThemeChromiumWin : public RenderTheme {
    4646    public:
    47         RenderThemeChromiumWin() { }
    48         ~RenderThemeChromiumWin() { }
     47        static PassRefPtr<RenderTheme> create();
    4948
    5049        virtual String extraDefaultStyleSheet();
     
    142141
    143142    private:
     143        RenderThemeChromiumWin() { }
     144        ~RenderThemeChromiumWin() { }
     145
    144146        unsigned determineState(RenderObject*);
    145147        unsigned determineSliderThumbState(RenderObject*);
  • trunk/WebCore/rendering/RenderThemeMac.h

    r41233 r44758  
    4040class RenderThemeMac : public RenderTheme {
    4141public:
    42     RenderThemeMac();
    43     virtual ~RenderThemeMac();
     42    static PassRefPtr<RenderTheme> create();
    4443
    4544    // A method asking if the control changes its tint when the window has focus or not.
     
    135134
    136135private:
     136    RenderThemeMac();
     137    virtual ~RenderThemeMac();
     138
    137139    IntRect inflateRect(const IntRect&, const IntSize&, const int* margins, float zoomLevel = 1.0f) const;
    138140
  • trunk/WebCore/rendering/RenderThemeMac.mm

    r44738 r44758  
    102102};
    103103
    104 RenderTheme* theme()
    105 {
    106     static RenderThemeMac* macTheme = new RenderThemeMac;
    107     return macTheme;
     104PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     105{
     106    static RenderTheme* rt = RenderThemeMac::create().releaseRef();
     107    return rt;
    108108}
    109109
  • trunk/WebCore/rendering/RenderThemeSafari.cpp

    r43367 r44758  
    11/*
    22 * Copyright (C) 2007, 2008 Apple Inc.
     3 * Copyright (C) 2009 Kenneth Rohde Christiansen
    34 *
    45 * This library is free software; you can redistribute it and/or
     
    6667};
    6768
    68 RenderTheme* theme()
    69 {
    70     static RenderThemeSafari safariTheme;
    71     static RenderThemeWin windowsTheme;
     69PassRefPtr<RenderTheme> RenderThemeSafari::create()
     70{
     71    return adoptRef(new RenderThemeSafari);
     72}
     73
     74PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     75{
     76    static RenderTheme* safariTheme = RenderThemeSafari::create().releaseRef();
     77    static RenderTheme* windowsTheme = RenderThemeWin::create().releaseRef();
    7278    if (Settings::shouldPaintNativeControls())
    73         return &windowsTheme;
    74     return &safariTheme;
     79        return windowsTheme; // keep the reference of one.
     80    return safariTheme; // keep the reference of one.
    7581}
    7682
  • trunk/WebCore/rendering/RenderThemeSafari.h

    r34693 r44758  
    11/*
    22 * Copyright (C) 2007, 2008 Apple Inc.
     3 * Copyright (C) 2009 Kenneth Rohde Christiansen
    34 *
    45 * This library is free software; you can redistribute it and/or
     
    4748class RenderThemeSafari : public RenderTheme {
    4849public:
    49     RenderThemeSafari();
    50     virtual ~RenderThemeSafari();
     50    static PassRefPtr<RenderTheme> create();
    5151
    5252    // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
     
    138138
    139139private:
     140    RenderThemeSafari();
     141    virtual ~RenderThemeSafari();
     142
    140143    IntRect inflateRect(const IntRect&, const IntSize&, const int* margins) const;
    141144
  • trunk/WebCore/rendering/RenderThemeWin.cpp

    r44364 r44758  
    11/*
    22 * Copyright (C) 2006, 2007 Apple Inc.
     3 * Copyright (C) 2009 Kenneth Rohde Christiansen
    34 *
    45 * This library is free software; you can redistribute it and/or
     
    135136}
    136137
     138PassRefPtr<RenderTheme> RenderThemeWin::create()
     139{
     140    return adoptRef(new RenderThemeWin);
     141}
     142
    137143#if !USE(SAFARI_THEME)
    138 RenderTheme* theme()
    139 {
    140     static RenderThemeWin winTheme;
    141     return &winTheme;
     144PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
     145{
     146    static RenderThemeWin* winTheme = RenderThemeWin::create().releaseRef();
     147    return winTheme;
    142148}
    143149#endif
  • trunk/WebCore/rendering/RenderThemeWin.h

    r43522 r44758  
    33 *
    44 * Copyright (C) 2006, 2008 Apple Computer, Inc.
     5 * Copyright (C) 2009 Kenneth Rohde Christiansen
    56 *
    67 * This library is free software; you can redistribute it and/or
     
    4950class RenderThemeWin : public RenderTheme {
    5051public:
    51     RenderThemeWin();
    52     ~RenderThemeWin();
     52    static PassRefPtr<RenderTheme> create();
    5353
    5454    virtual String extraDefaultStyleSheet();
     
    136136
    137137private:
     138    RenderThemeWin();
     139    ~RenderThemeWin();
     140
    138141    void addIntrinsicMargins(RenderStyle*) const;
    139142    void close();
  • trunk/WebKit/win/ChangeLog

    r44739 r44758  
     12009-06-16  Kenneth Rohde Christiansen  <kenneth.christiansen@openbossa.org>
     2
     3        Reviewed by Adam Roben.
     4
     5        Create a different RenderTheme per page, so that RenderTheme has
     6        access to page specific theming. This is needed for the Qt port, as Qt
     7        supports setting the theme (style) per widget.
     8
     9        This change was suggested and discussed with Dave Hyatt.
     10
     11        More detailed:
     12
     13        1) Create a theme per page or one global one, depending on the needs
     14           of the platform.
     15        2) Add an accesser to the theme from RenderObject.
     16        3) Change all uses of the theming to access the theme through
     17           RenderObject, using the global default theme as fallback, when the
     18           document of RenderObject has no page.
     19           When we don't have access to a RenderObject, use the default theme.
     20        4) Modify all RenderTheme platform implementations to work with the
     21           above changes, still creating only one global theme.
     22
     23        * WebView.cpp:
     24        (WebViewWndProc): Get the theme from the associated page.
     25
    1262009-06-16  Brian Weinstein  <bweinstein@apple.com>
    227
  • trunk/WebKit/win/WebView.cpp

    r44739 r44758  
    18561856            if (Frame* coreFrame = core(mainFrameImpl)) {
    18571857                webView->deleteBackingStore();
    1858                 theme()->themeChanged();
     1858                coreFrame->page()->theme()->themeChanged();
    18591859                ScrollbarTheme::nativeTheme()->themeChanged();
    18601860                RECT windowRect;
Note: See TracChangeset for help on using the changeset viewer.