Changeset 35627 in webkit


Ignore:
Timestamp:
Aug 7, 2008 2:55:37 PM (16 years ago)
Author:
Simon Fraser
Message:

2008-08-07 Simon Fraser <Simon Fraser>

Reviewed by Sam Weinig

Rename Marquee to RenderMarquee and move to its own file.
https://bugs.webkit.org/show_bug.cgi?id=20319

  • GNUmakefile.am:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • WebCoreSources.bkl:
  • html/HTMLMarqueeElement.cpp:
  • rendering/RenderBlock.cpp:
  • rendering/RenderLayer.cpp: (WebCore::RenderLayer::styleChanged):
  • rendering/RenderLayer.h:
  • rendering/RenderMarquee.cpp: Added. (WebCore::RenderMarquee::RenderMarquee): (WebCore::RenderMarquee::marqueeSpeed): (WebCore::RenderMarquee::direction): (WebCore::RenderMarquee::isHorizontal): (WebCore::RenderMarquee::computePosition): (WebCore::RenderMarquee::start): (WebCore::RenderMarquee::suspend): (WebCore::RenderMarquee::stop): (WebCore::RenderMarquee::updateMarqueePosition): (WebCore::RenderMarquee::updateMarqueeStyle): (WebCore::RenderMarquee::timerFired):
  • rendering/RenderMarquee.h: Added. (WebCore::RenderMarquee::speed): (WebCore::RenderMarquee::reverseDirection): (WebCore::RenderMarquee::setEnd):
Location:
trunk/WebCore
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r35626 r35627  
     12008-08-07  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Reviewed by Sam Weinig
     4
     5        Rename Marquee to RenderMarquee and move to its own file.
     6        https://bugs.webkit.org/show_bug.cgi?id=20319
     7
     8        * GNUmakefile.am:
     9        * WebCore.pro:
     10        * WebCore.vcproj/WebCore.vcproj:
     11        * WebCore.xcodeproj/project.pbxproj:
     12        * WebCoreSources.bkl:
     13        * html/HTMLMarqueeElement.cpp:
     14        * rendering/RenderBlock.cpp:
     15        * rendering/RenderLayer.cpp:
     16        (WebCore::RenderLayer::styleChanged):
     17        * rendering/RenderLayer.h:
     18        * rendering/RenderMarquee.cpp: Added.
     19        (WebCore::RenderMarquee::RenderMarquee):
     20        (WebCore::RenderMarquee::marqueeSpeed):
     21        (WebCore::RenderMarquee::direction):
     22        (WebCore::RenderMarquee::isHorizontal):
     23        (WebCore::RenderMarquee::computePosition):
     24        (WebCore::RenderMarquee::start):
     25        (WebCore::RenderMarquee::suspend):
     26        (WebCore::RenderMarquee::stop):
     27        (WebCore::RenderMarquee::updateMarqueePosition):
     28        (WebCore::RenderMarquee::updateMarqueeStyle):
     29        (WebCore::RenderMarquee::timerFired):
     30        * rendering/RenderMarquee.h: Added.
     31        (WebCore::RenderMarquee::speed):
     32        (WebCore::RenderMarquee::reverseDirection):
     33        (WebCore::RenderMarquee::setEnd):
     34
    1352008-08-07  Dan Bernstein  <mitz@apple.com>
    236
  • trunk/WebCore/GNUmakefile.am

    r35610 r35627  
    10241024        WebCore/rendering/RenderListItem.cpp \
    10251025        WebCore/rendering/RenderListMarker.cpp \
     1026        WebCore/rendering/RenderMarquee.cpp \
    10261027        WebCore/rendering/RenderMenuList.cpp \
    10271028        WebCore/rendering/RenderObject.cpp \
  • trunk/WebCore/WebCore.pro

    r35610 r35627  
    861861    rendering/RenderListItem.cpp \
    862862    rendering/RenderListMarker.cpp \
     863    rendering/RenderMarquee.cpp \
    863864    rendering/RenderMenuList.cpp \
    864865    rendering/RenderObject.cpp \
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r35609 r35627  
    96399639                        </File>
    96409640                        <File
     9641                                RelativePath="..\rendering\RenderMarquee.h"
     9642                                >
     9643                        </File>
     9644                        <File
     9645                                RelativePath="..\rendering\RenderMarquee.cpp"
     9646                                >
     9647                                <FileConfiguration
     9648                                        Name="Release_PGO|Win32"
     9649                                        >
     9650                                        <Tool
     9651                                                Name="VCCLCompilerTool"
     9652                                                WholeProgramOptimization="true"
     9653                                        />
     9654                                </FileConfiguration>
     9655                        </File>
     9656                        <File
    96419657                                RelativePath="..\rendering\RenderMedia.h"
    96429658                                >
     
    96549670                                </FileConfiguration>
    96559671                        </File>
     9672
    96569673                        <File
    96579674                                RelativePath="..\rendering\RenderMenuList.h"
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r35606 r35627  
    4242                08E4FE460E2BD41400F4CAE0 /* JSSVGLengthCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08E4FE450E2BD41400F4CAE0 /* JSSVGLengthCustom.cpp */; };
    4343                0A4844990CA44CB200B7BD48 /* SoftLinking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A4844980CA44CB200B7BD48 /* SoftLinking.h */; settings = {ATTRIBUTES = (Private, ); }; };
     44                0F56028F0E4B76580065B038 /* RenderMarquee.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F56028D0E4B76580065B038 /* RenderMarquee.h */; };
     45                0F5602900E4B76580065B038 /* RenderMarquee.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F56028E0E4B76580065B038 /* RenderMarquee.cpp */; };
    4446                1402645E0AFDC19B005919E2 /* LoggingMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1402645D0AFDC19B005919E2 /* LoggingMac.mm */; };
    4547                1403B99709EB13AF00797C7F /* DOMWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 1403B99509EB13AF00797C7F /* DOMWindow.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    45264528                08E4FE450E2BD41400F4CAE0 /* JSSVGLengthCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSSVGLengthCustom.cpp; sourceTree = "<group>"; };
    45274529                0A4844980CA44CB200B7BD48 /* SoftLinking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoftLinking.h; sourceTree = "<group>"; };
     4530                0F56028D0E4B76580065B038 /* RenderMarquee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderMarquee.h; sourceTree = "<group>"; };
     4531                0F56028E0E4B76580065B038 /* RenderMarquee.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderMarquee.cpp; sourceTree = "<group>"; };
    45284532                1402645D0AFDC19B005919E2 /* LoggingMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = LoggingMac.mm; sourceTree = "<group>"; };
    45294533                1403B90C09EB124500797C7F /* DOMWindow.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DOMWindow.idl; sourceTree = "<group>"; };
     
    1302813032                                A8EA7A4B0A191A5200A8EF5F /* RenderListMarker.cpp */,
    1302913033                                A8EA7A4A0A191A5200A8EF5F /* RenderListMarker.h */,
     13034                                0F56028E0E4B76580065B038 /* RenderMarquee.cpp */,
     13035                                0F56028D0E4B76580065B038 /* RenderMarquee.h */,
    1303013036                                E4C279560CF9741900E97B98 /* RenderMedia.cpp */,
    1303113037                                E4C279570CF9741900E97B98 /* RenderMedia.h */,
     
    1532715333                                31288E750E3005D6003619AE /* WebKitCSSKeyframesRule.h in Headers */,
    1532815334                                4415292E0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h in Headers */,
     15335                                0F56028F0E4B76580065B038 /* RenderMarquee.h in Headers */,
    1532915336                        );
    1533015337                        runOnlyForDeploymentPostprocessing = 0;
     
    1710117108                                A83E1C740E49042C00140B9C /* ScriptControllerMac.mm in Sources */,
    1710217109                                4415292F0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.cpp in Sources */,
     17110                                0F5602900E4B76580065B038 /* RenderMarquee.cpp in Sources */,
    1710317111                        );
    1710417112                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/WebCore/WebCoreSources.bkl

    r35610 r35627  
    813813        rendering/RenderListItem.cpp
    814814        rendering/RenderListMarker.cpp
     815        rendering/RenderMarquee.cpp
    815816        rendering/RenderMenuList.cpp
    816817        rendering/RenderObject.cpp
  • trunk/WebCore/html/HTMLMarqueeElement.cpp

    r31178 r35627  
    2929#include "HTMLNames.h"
    3030#include "RenderLayer.h"
     31#include "RenderMarquee.h"
    3132
    3233namespace WebCore {
  • trunk/WebCore/rendering/RenderBlock.cpp

    r35515 r35627  
    3333#include "InlineTextBox.h"
    3434#include "RenderImage.h"
     35#include "RenderMarquee.h"
    3536#include "RenderReplica.h"
    3637#include "RenderTableCell.h"
  • trunk/WebCore/rendering/RenderLayer.cpp

    r35496 r35627  
    5656#include "Gradient.h"
    5757#include "GraphicsContext.h"
    58 #include "HTMLMarqueeElement.h"
    5958#include "HTMLNames.h"
    6059#include "HitTestRequest.h"
     
    6665#include "RenderArena.h"
    6766#include "RenderInline.h"
     67#include "RenderMarquee.h"
    6868#include "RenderReplica.h"
    6969#include "RenderTheme.h"
     
    23602360    if (m_object->style()->overflowX() == OMARQUEE && m_object->style()->marqueeBehavior() != MNONE) {
    23612361        if (!m_marquee)
    2362             m_marquee = new Marquee(this);
     2362            m_marquee = new RenderMarquee(this);
    23632363        m_marquee->updateMarqueeStyle();
    23642364    }
     
    24362436}
    24372437
    2438 // --------------------------------------------------------------------------
    2439 // Marquee implementation
    2440 
    2441 Marquee::Marquee(RenderLayer* l)
    2442     : m_layer(l), m_currentLoop(0)
    2443     , m_totalLoops(0)
    2444     , m_timer(this, &Marquee::timerFired)
    2445     , m_start(0), m_end(0), m_speed(0), m_reset(false)
    2446     , m_suspended(false), m_stopped(false), m_direction(MAUTO)
    2447 {
    2448 }
    2449 
    2450 int Marquee::marqueeSpeed() const
    2451 {
    2452     int result = m_layer->renderer()->style()->marqueeSpeed();
    2453     Node* elt = m_layer->renderer()->element();
    2454     if (elt && elt->hasTagName(marqueeTag)) {
    2455         HTMLMarqueeElement* marqueeElt = static_cast<HTMLMarqueeElement*>(elt);
    2456         result = max(result, marqueeElt->minimumDelay());
    2457     }
    2458     return result;
    2459 }
    2460 
    2461 EMarqueeDirection Marquee::direction() const
    2462 {
    2463     // FIXME: Support the CSS3 "auto" value for determining the direction of the marquee.
    2464     // For now just map MAUTO to MBACKWARD
    2465     EMarqueeDirection result = m_layer->renderer()->style()->marqueeDirection();
    2466     TextDirection dir = m_layer->renderer()->style()->direction();
    2467     if (result == MAUTO)
    2468         result = MBACKWARD;
    2469     if (result == MFORWARD)
    2470         result = (dir == LTR) ? MRIGHT : MLEFT;
    2471     if (result == MBACKWARD)
    2472         result = (dir == LTR) ? MLEFT : MRIGHT;
    2473    
    2474     // Now we have the real direction.  Next we check to see if the increment is negative.
    2475     // If so, then we reverse the direction.
    2476     Length increment = m_layer->renderer()->style()->marqueeIncrement();
    2477     if (increment.isNegative())
    2478         result = static_cast<EMarqueeDirection>(-result);
    2479    
    2480     return result;
    2481 }
    2482 
    2483 bool Marquee::isHorizontal() const
    2484 {
    2485     return direction() == MLEFT || direction() == MRIGHT;
    2486 }
    2487 
    2488 int Marquee::computePosition(EMarqueeDirection dir, bool stopAtContentEdge)
    2489 {
    2490     RenderObject* o = m_layer->renderer();
    2491     RenderStyle* s = o->style();
    2492     if (isHorizontal()) {
    2493         bool ltr = s->direction() == LTR;
    2494         int clientWidth = o->clientWidth();
    2495         int contentWidth = ltr ? o->rightmostPosition(true, false) : o->leftmostPosition(true, false);
    2496         if (ltr)
    2497             contentWidth += (o->paddingRight() - o->borderLeft());
    2498         else {
    2499             contentWidth = o->width() - contentWidth;
    2500             contentWidth += (o->paddingLeft() - o->borderRight());
    2501         }
    2502         if (dir == MRIGHT) {
    2503             if (stopAtContentEdge)
    2504                 return max(0, ltr ? (contentWidth - clientWidth) : (clientWidth - contentWidth));
    2505             else
    2506                 return ltr ? contentWidth : clientWidth;
    2507         }
    2508         else {
    2509             if (stopAtContentEdge)
    2510                 return min(0, ltr ? (contentWidth - clientWidth) : (clientWidth - contentWidth));
    2511             else
    2512                 return ltr ? -clientWidth : -contentWidth;
    2513         }
    2514     }
    2515     else {
    2516         int contentHeight = m_layer->renderer()->lowestPosition(true, false) -
    2517                             m_layer->renderer()->borderTop() + m_layer->renderer()->paddingBottom();
    2518         int clientHeight = m_layer->renderer()->clientHeight();
    2519         if (dir == MUP) {
    2520             if (stopAtContentEdge)
    2521                  return min(contentHeight - clientHeight, 0);
    2522             else
    2523                 return -clientHeight;
    2524         }
    2525         else {
    2526             if (stopAtContentEdge)
    2527                 return max(contentHeight - clientHeight, 0);
    2528             else
    2529                 return contentHeight;
    2530         }
    2531     }   
    2532 }
    2533 
    2534 void Marquee::start()
    2535 {
    2536     if (m_timer.isActive() || m_layer->renderer()->style()->marqueeIncrement().isZero())
    2537         return;
    2538 
    2539     // We may end up propagating a scroll event. It is important that we suspend events until
    2540     // the end of the function since they could delete the layer, including the marquee.
    2541     FrameView* frameView = m_layer->renderer()->document()->view();
    2542     if (frameView)
    2543         frameView->pauseScheduledEvents();
    2544 
    2545     if (!m_suspended && !m_stopped) {
    2546         if (isHorizontal())
    2547             m_layer->scrollToOffset(m_start, 0, false, false);
    2548         else
    2549             m_layer->scrollToOffset(0, m_start, false, false);
    2550     }
    2551     else {
    2552         m_suspended = false;
    2553         m_stopped = false;
    2554     }
    2555 
    2556     m_timer.startRepeating(speed() * 0.001);
    2557 
    2558     if (frameView)
    2559         frameView->resumeScheduledEvents();
    2560 }
    2561 
    2562 void Marquee::suspend()
    2563 {
    2564     m_timer.stop();
    2565     m_suspended = true;
    2566 }
    2567 
    2568 void Marquee::stop()
    2569 {
    2570     m_timer.stop();
    2571     m_stopped = true;
    2572 }
    2573 
    2574 void Marquee::updateMarqueePosition()
    2575 {
    2576     bool activate = (m_totalLoops <= 0 || m_currentLoop < m_totalLoops);
    2577     if (activate) {
    2578         EMarqueeBehavior behavior = m_layer->renderer()->style()->marqueeBehavior();
    2579         m_start = computePosition(direction(), behavior == MALTERNATE);
    2580         m_end = computePosition(reverseDirection(), behavior == MALTERNATE || behavior == MSLIDE);
    2581         if (!m_stopped)
    2582             start();
    2583     }
    2584 }
    2585 
    2586 void Marquee::updateMarqueeStyle()
    2587 {
    2588     RenderStyle* s = m_layer->renderer()->style();
    2589    
    2590     if (m_direction != s->marqueeDirection() || (m_totalLoops != s->marqueeLoopCount() && m_currentLoop >= m_totalLoops))
    2591         m_currentLoop = 0; // When direction changes or our loopCount is a smaller number than our current loop, reset our loop.
    2592    
    2593     m_totalLoops = s->marqueeLoopCount();
    2594     m_direction = s->marqueeDirection();
    2595    
    2596     if (m_layer->renderer()->isHTMLMarquee()) {
    2597         // Hack for WinIE.  In WinIE, a value of 0 or lower for the loop count for SLIDE means to only do
    2598         // one loop.
    2599         if (m_totalLoops <= 0 && s->marqueeBehavior() == MSLIDE)
    2600             m_totalLoops = 1;
    2601        
    2602         // Hack alert: Set the white-space value to nowrap for horizontal marquees with inline children, thus ensuring
    2603         // all the text ends up on one line by default.  Limit this hack to the <marquee> element to emulate
    2604         // WinIE's behavior.  Someone using CSS3 can use white-space: nowrap on their own to get this effect.
    2605         // Second hack alert: Set the text-align back to auto.  WinIE completely ignores text-align on the
    2606         // marquee element.
    2607         // FIXME: Bring these up with the CSS WG.
    2608         if (isHorizontal() && m_layer->renderer()->childrenInline()) {
    2609             s->setWhiteSpace(NOWRAP);
    2610             s->setTextAlign(TAAUTO);
    2611         }
    2612     }
    2613    
    2614     // Marquee height hack!! Make sure that, if it is a horizontal marquee, the height attribute is overridden
    2615     // if it is smaller than the font size. If it is a vertical marquee and height is not specified, we default
    2616     // to a marquee of 200px.
    2617     if (isHorizontal()) {
    2618         if (s->height().isFixed() && s->height().value() < s->fontSize())
    2619             s->setHeight(Length(s->fontSize(),Fixed));
    2620     } else if (s->height().isAuto())  //vertical marquee with no specified height
    2621         s->setHeight(Length(200, Fixed));
    2622    
    2623     if (speed() != marqueeSpeed()) {
    2624         m_speed = marqueeSpeed();
    2625         if (m_timer.isActive())
    2626             m_timer.startRepeating(speed() * 0.001);
    2627     }
    2628    
    2629     // Check the loop count to see if we should now stop.
    2630     bool activate = (m_totalLoops <= 0 || m_currentLoop < m_totalLoops);
    2631     if (activate && !m_timer.isActive())
    2632         m_layer->renderer()->setNeedsLayout(true);
    2633     else if (!activate && m_timer.isActive())
    2634         m_timer.stop();
    2635 }
    2636 
    2637 void Marquee::timerFired(Timer<Marquee>*)
    2638 {
    2639     if (m_layer->renderer()->needsLayout())
    2640         return;
    2641    
    2642     if (m_reset) {
    2643         m_reset = false;
    2644         if (isHorizontal())
    2645             m_layer->scrollToXOffset(m_start);
    2646         else
    2647             m_layer->scrollToYOffset(m_start);
    2648         return;
    2649     }
    2650    
    2651     RenderStyle* s = m_layer->renderer()->style();
    2652    
    2653     int endPoint = m_end;
    2654     int range = m_end - m_start;
    2655     int newPos;
    2656     if (range == 0)
    2657         newPos = m_end;
    2658     else { 
    2659         bool addIncrement = direction() == MUP || direction() == MLEFT;
    2660         bool isReversed = s->marqueeBehavior() == MALTERNATE && m_currentLoop % 2;
    2661         if (isReversed) {
    2662             // We're going in the reverse direction.
    2663             endPoint = m_start;
    2664             range = -range;
    2665             addIncrement = !addIncrement;
    2666         }
    2667         bool positive = range > 0;
    2668         int clientSize = (isHorizontal() ? m_layer->renderer()->clientWidth() : m_layer->renderer()->clientHeight());
    2669         int increment = max(1, abs(m_layer->renderer()->style()->marqueeIncrement().calcValue(clientSize)));
    2670         int currentPos = (isHorizontal() ? m_layer->scrollXOffset() : m_layer->scrollYOffset());
    2671         newPos =  currentPos + (addIncrement ? increment : -increment);
    2672         if (positive)
    2673             newPos = min(newPos, endPoint);
    2674         else
    2675             newPos = max(newPos, endPoint);
    2676     }
    2677 
    2678     if (newPos == endPoint) {
    2679         m_currentLoop++;
    2680         if (m_totalLoops > 0 && m_currentLoop >= m_totalLoops)
    2681             m_timer.stop();
    2682         else if (s->marqueeBehavior() != MALTERNATE)
    2683             m_reset = true;
    2684     }
    2685    
    2686     if (isHorizontal())
    2687         m_layer->scrollToXOffset(newPos);
    2688     else
    2689         m_layer->scrollToYOffset(newPos);
    2690 }
    2691 
    26922438} // namespace WebCore
  • trunk/WebCore/rendering/RenderLayer.h

    r35083 r35627  
    5757class PlatformScrollbar;
    5858class RenderFrameSet;
     59class RenderMarquee;
    5960class RenderObject;
    6061class RenderReplica;
     
    113114    unsigned m_refCnt : 31;
    114115    bool m_fixed : 1;
    115 };
    116 
    117 
    118 // FIXME: move this to its own file
    119 // This class handles the auto-scrolling of layers with overflow: marquee.
    120 class Marquee {
    121 public:
    122     Marquee(RenderLayer*);
    123 
    124     int speed() const { return m_speed; }
    125     int marqueeSpeed() const;
    126 
    127     EMarqueeDirection reverseDirection() const { return static_cast<EMarqueeDirection>(-direction()); }
    128     EMarqueeDirection direction() const;
    129 
    130     bool isHorizontal() const;
    131 
    132     int computePosition(EMarqueeDirection, bool stopAtClientEdge);
    133 
    134     void setEnd(int end) { m_end = end; }
    135    
    136     void start();
    137     void suspend();
    138     void stop();
    139 
    140     void updateMarqueeStyle();
    141     void updateMarqueePosition();
    142 
    143 private:
    144     void timerFired(Timer<Marquee>*);
    145 
    146     RenderLayer* m_layer;
    147     int m_currentLoop;
    148     int m_totalLoops;
    149     Timer<Marquee> m_timer;
    150     int m_start;
    151     int m_end;
    152     int m_speed;
    153     Length m_height;
    154     bool m_reset: 1;
    155     bool m_suspended : 1;
    156     bool m_stopped : 1;
    157     EMarqueeDirection m_direction : 4;
    158116};
    159117
     
    208166    void styleChanged(RenderStyle*);
    209167
    210     Marquee* marquee() const { return m_marquee; }
     168    RenderMarquee* marquee() const { return m_marquee; }
    211169    void suspendMarquees();
    212170
     
    482440    bool m_hasVisibleDescendant : 1;
    483441
    484     Marquee* m_marquee; // Used by layers with overflow:marquee
     442    RenderMarquee* m_marquee; // Used by layers with overflow:marquee
    485443   
    486444    // Cached normal flow values for absolute positioned elements with static left/top values.
Note: See TracChangeset for help on using the changeset viewer.