Changeset 28981 in webkit


Ignore:
Timestamp:
Dec 25, 2007 4:46:46 PM (16 years ago)
Author:
dsmith@webkit.org
Message:

WebCore:

Reviewed by Oliver.


  • WebCore.xcodeproj/project.pbxproj:
  • css/CSSStyleSelector.h: Make Node a friend of CSSStyleSelector so it can use checkSelector()
  • dom/ChildNodeList.cpp: (WebCore::ChildNodeList::ChildNodeList): Change to being a DynamicNodeList
  • dom/ChildNodeList.h:
  • dom/ClassNodeList.cpp: (WebCore::ClassNodeList::ClassNodeList): Change to being a DynamicNodeList
  • dom/ClassNodeList.h:
  • dom/Document.idl: Add the new functions
  • dom/DynamicNodeList.cpp: Copied from WebCore/dom/NodeList.cpp. (WebCore::DynamicNodeList::DynamicNodeList): Rename NodeList to DynamicNodeList, to differentiate it from the new StaticNodeList (WebCore::DynamicNodeList::~DynamicNodeList): (WebCore::DynamicNodeList::recursiveLength): (WebCore::DynamicNodeList::itemForwardsFromCurrent): (WebCore::DynamicNodeList::itemBackwardsFromCurrent): (WebCore::DynamicNodeList::recursiveItem): (WebCore::DynamicNodeList::itemWithName): (WebCore::DynamicNodeList::rootNodeChildrenChanged): (WebCore::DynamicNodeList::Caches::Caches): (WebCore::DynamicNodeList::Caches::reset):
  • dom/DynamicNodeList.h: Copied from WebCore/dom/NodeList.h. (WebCore::DynamicNodeList::rootNodeAttributeChanged):
  • dom/Element.idl: Add the new functions
  • dom/NameNodeList.cpp: Change to being a DynamicNodeList (WebCore::NameNodeList::NameNodeList):
  • dom/NameNodeList.h: (WebCore::NameNodeList::rootNodeAttributeChanged):
  • dom/Node.cpp: (WebCore::TagNodeList::TagNodeList): Change to being a DynamicNodeList (WebCore::Node::registerDynamicNodeList): (WebCore::Node::unregisterDynamicNodeList): (WebCore::Node::getElementsByName): (WebCore::Node::getElementsByClassName): (WebCore::Node::querySelector): new (WebCore::Node::querySelectorAll): new
  • dom/Node.h:
  • dom/NodeList.cpp: Removed.
  • dom/NodeList.h: This is now an abstract superclass of DynamicNodeList and StaticNodeList (WebCore::NodeList::NodeList): (WebCore::NodeList::~NodeList):
  • dom/SelectorNodeList.cpp: Added. (WebCore::SelectorNodeList::SelectorNodeList): New StaticNodeList subclass that filters elements by CSS selector
  • dom/SelectorNodeList.h: Added.
  • dom/StaticNodeList.cpp: Added. (WebCore::StaticNodeList::length): (WebCore::StaticNodeList::item): (WebCore::StaticNodeList::itemWithName):
  • dom/StaticNodeList.h: Added. (WebCore::StaticNodeList::StaticNodeList): (WebCore::StaticNodeList::~StaticNodeList):

LayoutTests:

Reviewed by Oliver.


  • fast/dom/SelectorAPI: Copied from LayoutTests/fast/dom/getElementsByClassName.
  • fast/dom/SelectorAPI/dumpNodeList-expected.txt:
  • fast/dom/SelectorAPI/dumpNodeList.html: Modified to test querySelector and querySelectorAll instead of getElementsByClassName
  • fast/dom/Window/window-properties-expected.txt: Added querySelector and querySelectorAll
Location:
trunk
Files:
4 added
30 deleted
18 edited
2 copied
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r28968 r28981  
     12007-12-25  David Smith  <catfish.man@gmail.com> and Sam Weinig  <sam@webkit.org>
     2
     3        Reviewed by Oliver.
     4       
     5        - http://bugs.webkit.org/show_bug.cgi?id=16587
     6        Implement the most useful part of the W3C Selectors API.
     7
     8        * fast/dom/SelectorAPI: Copied from LayoutTests/fast/dom/getElementsByClassName.
     9        * fast/dom/SelectorAPI/dumpNodeList-expected.txt:
     10        * fast/dom/SelectorAPI/dumpNodeList.html: Modified to test querySelector and querySelectorAll instead of getElementsByClassName
     11        * fast/dom/Window/window-properties-expected.txt: Added querySelector and querySelectorAll
     12
    1132007-12-23  Darin Adler  <darin@apple.com>
    214
  • trunk/LayoutTests/fast/dom/SelectorAPI/dumpNodeList-expected.txt

    r28722 r28981  
    66line 5
    77
    8 [object HTMLDivElement], [object HTMLDivElement], [object HTMLDivElement], length: 3
     8[object HTMLDivElement], length: 1
    99[object HTMLDivElement], [object HTMLDivElement], [object HTMLDivElement], [object HTMLParagraphElement], length: 4
    10 [object HTMLDivElement], [object HTMLDivElement], length: 2
    11 [object HTMLDivElement], [object HTMLDivElement], length: 2
    12 length: 0
    13 length: 0
    14 length: 0
    15 length: 0
     10[object HTMLDivElement], [object HTMLDivElement], [object HTMLDivElement], [object HTMLDivElement], [object HTMLParagraphElement], length: 5
     11Error: SYNTAX_ERR: DOM Exception 12
     12Error: SYNTAX_ERR: DOM Exception 12
     13Error: SYNTAX_ERR: DOM Exception 12
     14Error: SYNTAX_ERR: DOM Exception 12
     15Error: SYNTAX_ERR: DOM Exception 12
    1616length: 0
    1717[object HTMLDivElement], length: 1
    1818[object HTMLDivElement], [object HTMLParagraphElement], length: 2
    19 [object HTMLDivElement], length: 1
    20 [object HTMLDivElement], length: 1
    21 length: 0
    22 length: 0
    23 length: 0
    24 length: 0
    25 length: 0
     19[object HTMLDivElement], [object HTMLParagraphElement], length: 2
     20Error: SYNTAX_ERR: DOM Exception 12
     21Error: SYNTAX_ERR: DOM Exception 12
     22Error: SYNTAX_ERR: DOM Exception 12
     23Error: SYNTAX_ERR: DOM Exception 12
     24Error: SYNTAX_ERR: DOM Exception 12
     25[object HTMLDivElement]
     26[object HTMLDivElement]
     27[object HTMLDivElement]
     28Error: SYNTAX_ERR: DOM Exception 12
     29Error: SYNTAX_ERR: DOM Exception 12
     30Error: SYNTAX_ERR: DOM Exception 12
     31Error: SYNTAX_ERR: DOM Exception 12
     32Error: SYNTAX_ERR: DOM Exception 12
     33TypeError: Null value
     34[object HTMLDivElement]
     35[object HTMLDivElement]
     36[object HTMLDivElement]
     37Error: SYNTAX_ERR: DOM Exception 12
     38Error: SYNTAX_ERR: DOM Exception 12
     39Error: SYNTAX_ERR: DOM Exception 12
     40Error: SYNTAX_ERR: DOM Exception 12
     41Error: SYNTAX_ERR: DOM Exception 12
    2642
  • trunk/LayoutTests/fast/dom/SelectorAPI/dumpNodeList.html

    r28722 r28981  
    22<body>
    33<div class="one">Line 1<div class="two">Line 2</div><p>Line <i>3</i></p></div>
    4 <div id="test" class="one two"><div class="one two">line 4</div><p class="two">line 5</p></div>
     4<div id="test" class="one two"><div id="test2" class="one two">line 4</div><p class="two">line 5</p></div>
    55<p><ol id="console"></ol></p>
    66<script type="text/javascript">
     
    1313        item.appendChild(document.createTextNode(message));
    1414        document.getElementById("console").appendChild(item);
     15    }
     16   
     17    Element.prototype.dump = function()
     18    {
     19        return this;
    1520    }
    1621   
     
    2732    try {
    2833        var elm = document.getElementById("test");
     34       
     35        try { log(document.querySelectorAll("#test").dump());      } catch (e) { log(e) }
     36        try { log(document.querySelectorAll(".two").dump());       } catch (e) { log(e) }
     37        try { log(document.querySelectorAll(".one, .two").dump()); } catch (e) { log(e) }
     38        try { log(document.querySelectorAll("@font-face").dump()); } catch (e) { log(e) }
     39        try { log(document.querySelectorAll("").dump());           } catch (e) { log(e) }
     40        try { log(document.querySelectorAll().dump());             } catch (e) { log(e) }
     41        try { log(document.querySelectorAll(null).dump());         } catch (e) { log(e) }
     42        try { log(document.querySelectorAll(undefined).dump());    } catch (e) { log(e) }
    2943
    30         log(document.getElementsByClassName("one").dump());
    31         log(document.getElementsByClassName("two").dump());
    32         log(document.getElementsByClassName("one two").dump());
    33         log(document.getElementsByClassName("one\t\t\n \ftwo").dump());
    34         log(document.getElementsByClassName("").dump());
    35         log(document.getElementsByClassName("onetwo").dump());
    36         log(document.getElementsByClassName().dump());
    37         log(document.getElementsByClassName(null).dump());
    38         log(document.getElementsByClassName(undefined).dump());
     44        try { log(elm.querySelectorAll("#test").dump());           } catch (e) { log(e) }
     45        try { log(elm.querySelectorAll("#test2").dump());          } catch (e) { log(e) }
     46        try { log(elm.querySelectorAll(".two").dump());            } catch (e) { log(e) }
     47        try { log(elm.querySelectorAll(".one, .two").dump());      } catch (e) { log(e) }
     48        try { log(elm.querySelectorAll("@font-face").dump());      } catch (e) { log(e) }
     49        try { log(elm.querySelectorAll("").dump());                } catch (e) { log(e) }
     50        try { log(elm.querySelectorAll().dump());                  } catch (e) { log(e) }
     51        try { log(elm.querySelectorAll(null).dump());              } catch (e) { log(e) }
     52        try { log(elm.querySelectorAll(undefined).dump());         } catch (e) { log(e) }
    3953
    40         log(elm.getElementsByClassName("one").dump());
    41         log(elm.getElementsByClassName("two").dump());
    42         log(elm.getElementsByClassName("one two").dump());
    43         log(elm.getElementsByClassName("one\t\t\n \ftwo").dump());
    44         log(elm.getElementsByClassName("").dump());
    45         log(elm.getElementsByClassName("onetwo").dump());
    46         log(elm.getElementsByClassName().dump());
    47         log(elm.getElementsByClassName(null).dump());
    48         log(elm.getElementsByClassName(undefined).dump());
     54        try { log(document.querySelector("#test").dump());         } catch (e) { log(e) }
     55        try { log(document.querySelector(".two").dump());          } catch (e) { log(e) }
     56        try { log(document.querySelector(".one, .two").dump());    } catch (e) { log(e) }
     57        try { log(document.querySelector("@font-face").dump());    } catch (e) { log(e) }
     58        try { log(document.querySelector("").dump());              } catch (e) { log(e) }
     59        try { log(document.querySelector().dump());                } catch (e) { log(e) }
     60        try { log(document.querySelector(null).dump());            } catch (e) { log(e) }
     61        try { log(document.querySelector(undefined).dump());       } catch (e) { log(e) }
     62
     63        try { log(elm.querySelector("#test").dump());              } catch (e) { log(e) }
     64        try { log(elm.querySelector("#test2").dump());             } catch (e) { log(e) }
     65        try { log(elm.querySelector(".two").dump());               } catch (e) { log(e) }
     66        try { log(elm.querySelector(".one, .two").dump());         } catch (e) { log(e) }
     67        try { log(elm.querySelector("@font-face").dump());         } catch (e) { log(e) }
     68        try { log(elm.querySelector("").dump());                   } catch (e) { log(e) }
     69        try { log(elm.querySelector().dump());                     } catch (e) { log(e) }
     70        try { log(elm.querySelector(null).dump());                 } catch (e) { log(e) }
     71        try { log(elm.querySelector(undefined).dump());            } catch (e) { log(e) }
    4972    } catch (ex) {
    5073        log("Exception: " + ex.description);
  • trunk/LayoutTests/fast/dom/Window/window-properties-expected.txt

    r28722 r28981  
    339339window.Document.prototype.queryCommandSupported [function]
    340340window.Document.prototype.queryCommandValue [function]
     341window.Document.prototype.querySelector [function]
     342window.Document.prototype.querySelectorAll [function]
    341343window.Document.prototype.removeChild [function]
    342344window.Document.prototype.removeEventListener [function]
     
    442444window.Element.prototype.lookupPrefix [function]
    443445window.Element.prototype.normalize [function]
     446window.Element.prototype.querySelector [function]
     447window.Element.prototype.querySelectorAll [function]
    444448window.Element.prototype.removeAttribute [function]
    445449window.Element.prototype.removeAttributeNS [function]
  • trunk/WebCore/ChangeLog

    r28979 r28981  
     12007-12-25  David Smith  <catfish.man@gmail.com> and Sam Weinig  <sam@webkit.org>
     2
     3        Reviewed by Oliver.
     4       
     5        - http://bugs.webkit.org/show_bug.cgi?id=16587
     6        Implement the most useful part of the W3C Selectors API.
     7
     8        * WebCore.xcodeproj/project.pbxproj:
     9        * css/CSSStyleSelector.h: Make Node a friend of CSSStyleSelector so it can use checkSelector()
     10        * dom/ChildNodeList.cpp:
     11        (WebCore::ChildNodeList::ChildNodeList): Change to being a DynamicNodeList
     12        * dom/ChildNodeList.h:
     13        * dom/ClassNodeList.cpp:
     14        (WebCore::ClassNodeList::ClassNodeList): Change to being a DynamicNodeList
     15        * dom/ClassNodeList.h:
     16        * dom/Document.idl: Add the new functions
     17        * dom/DynamicNodeList.cpp: Copied from WebCore/dom/NodeList.cpp.
     18        (WebCore::DynamicNodeList::DynamicNodeList): Rename NodeList to DynamicNodeList, to differentiate it from the new StaticNodeList
     19        (WebCore::DynamicNodeList::~DynamicNodeList):
     20        (WebCore::DynamicNodeList::recursiveLength):
     21        (WebCore::DynamicNodeList::itemForwardsFromCurrent):
     22        (WebCore::DynamicNodeList::itemBackwardsFromCurrent):
     23        (WebCore::DynamicNodeList::recursiveItem):
     24        (WebCore::DynamicNodeList::itemWithName):
     25        (WebCore::DynamicNodeList::rootNodeChildrenChanged):
     26        (WebCore::DynamicNodeList::Caches::Caches):
     27        (WebCore::DynamicNodeList::Caches::reset):
     28        * dom/DynamicNodeList.h: Copied from WebCore/dom/NodeList.h.
     29        (WebCore::DynamicNodeList::rootNodeAttributeChanged):
     30        * dom/Element.idl: Add the new functions
     31        * dom/NameNodeList.cpp: Change to being a DynamicNodeList
     32        (WebCore::NameNodeList::NameNodeList):
     33        * dom/NameNodeList.h:
     34        (WebCore::NameNodeList::rootNodeAttributeChanged):
     35        * dom/Node.cpp:
     36        (WebCore::TagNodeList::TagNodeList): Change to being a DynamicNodeList
     37        (WebCore::Node::registerDynamicNodeList):
     38        (WebCore::Node::unregisterDynamicNodeList):
     39        (WebCore::Node::getElementsByName):
     40        (WebCore::Node::getElementsByClassName):
     41        (WebCore::Node::querySelector): new
     42        (WebCore::Node::querySelectorAll): new
     43        * dom/Node.h:
     44        * dom/NodeList.cpp: Removed.
     45        * dom/NodeList.h: This is now an abstract superclass of DynamicNodeList and StaticNodeList
     46        (WebCore::NodeList::NodeList):
     47        (WebCore::NodeList::~NodeList):
     48        * dom/SelectorNodeList.cpp: Added.
     49        (WebCore::SelectorNodeList::SelectorNodeList): New StaticNodeList subclass that filters elements by CSS selector
     50        * dom/SelectorNodeList.h: Added.
     51        * dom/StaticNodeList.cpp: Added.
     52        (WebCore::StaticNodeList::length):
     53        (WebCore::StaticNodeList::item):
     54        (WebCore::StaticNodeList::itemWithName):
     55        * dom/StaticNodeList.h: Added.
     56        (WebCore::StaticNodeList::StaticNodeList):
     57        (WebCore::StaticNodeList::~StaticNodeList):
     58
    1592007-12-25  Mark Rowe  <mrowe@apple.com>
    260
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r28798 r28981  
    19791979                A818721F0977D3C0005826D9 /* ContainerNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A81872140977D3C0005826D9 /* ContainerNode.cpp */; };
    19801980                A81872200977D3C0005826D9 /* ChildNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = A81872150977D3C0005826D9 /* ChildNodeList.h */; };
    1981                 A81872210977D3C0005826D9 /* NodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A81872160977D3C0005826D9 /* NodeList.cpp */; };
    19821981                A81872230977D3C0005826D9 /* NamedNodeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = A81872180977D3C0005826D9 /* NamedNodeMap.h */; settings = {ATTRIBUTES = (Private, ); }; };
    19831982                A81872240977D3C0005826D9 /* NameNodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A81872190977D3C0005826D9 /* NameNodeList.cpp */; };
     
    36153614                BC772C5E0C4EB3440083285F /* MIMETypeRegistryMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC772C5D0C4EB3440083285F /* MIMETypeRegistryMac.mm */; };
    36163615                BC7F44A80B9E324E00A9D081 /* ImageObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7F44A70B9E324E00A9D081 /* ImageObserver.h */; settings = {ATTRIBUTES = (Private, ); }; };
     3616                BC7FA6200D1F0CBD00DB22A9 /* DynamicNodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC7FA61E0D1F0CBD00DB22A9 /* DynamicNodeList.cpp */; };
     3617                BC7FA6210D1F0CBD00DB22A9 /* DynamicNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7FA61F0D1F0CBD00DB22A9 /* DynamicNodeList.h */; };
     3618                BC7FA62D0D1F0EFF00DB22A9 /* StaticNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7FA62B0D1F0EFF00DB22A9 /* StaticNodeList.h */; };
     3619                BC7FA62E0D1F0EFF00DB22A9 /* StaticNodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC7FA62C0D1F0EFF00DB22A9 /* StaticNodeList.cpp */; };
     3620                BC7FA6810D1F167900DB22A9 /* SelectorNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = BC7FA67F0D1F167900DB22A9 /* SelectorNodeList.h */; };
     3621                BC7FA6820D1F167900DB22A9 /* SelectorNodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC7FA6800D1F167900DB22A9 /* SelectorNodeList.cpp */; };
    36173622                BC80C9870CD294EE00A0B7B3 /* CSSTimingFunctionValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC80C9850CD294EE00A0B7B3 /* CSSTimingFunctionValue.cpp */; };
    36183623                BC80C9880CD294EE00A0B7B3 /* CSSTimingFunctionValue.h in Headers */ = {isa = PBXBuildFile; fileRef = BC80C9860CD294EE00A0B7B3 /* CSSTimingFunctionValue.h */; };
     
    61096114                A81872140977D3C0005826D9 /* ContainerNode.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContainerNode.cpp; sourceTree = "<group>"; };
    61106115                A81872150977D3C0005826D9 /* ChildNodeList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ChildNodeList.h; sourceTree = "<group>"; };
    6111                 A81872160977D3C0005826D9 /* NodeList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NodeList.cpp; sourceTree = "<group>"; };
    61126116                A81872180977D3C0005826D9 /* NamedNodeMap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NamedNodeMap.h; sourceTree = "<group>"; };
    61136117                A81872190977D3C0005826D9 /* NameNodeList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = NameNodeList.cpp; sourceTree = "<group>"; };
     
    76267630                BC7B2AF90450824100A8000F /* PlatformScrollBarMac.mm */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlatformScrollBarMac.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    76277631                BC7F44A70B9E324E00A9D081 /* ImageObserver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ImageObserver.h; sourceTree = "<group>"; };
     7632                BC7FA61E0D1F0CBD00DB22A9 /* DynamicNodeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicNodeList.cpp; sourceTree = "<group>"; };
     7633                BC7FA61F0D1F0CBD00DB22A9 /* DynamicNodeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicNodeList.h; sourceTree = "<group>"; };
     7634                BC7FA62B0D1F0EFF00DB22A9 /* StaticNodeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticNodeList.h; sourceTree = "<group>"; };
     7635                BC7FA62C0D1F0EFF00DB22A9 /* StaticNodeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StaticNodeList.cpp; sourceTree = "<group>"; };
     7636                BC7FA67F0D1F167900DB22A9 /* SelectorNodeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorNodeList.h; sourceTree = "<group>"; };
     7637                BC7FA6800D1F167900DB22A9 /* SelectorNodeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectorNodeList.cpp; sourceTree = "<group>"; };
    76287638                BC80C9850CD294EE00A0B7B3 /* CSSTimingFunctionValue.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CSSTimingFunctionValue.cpp; sourceTree = "<group>"; };
    76297639                BC80C9860CD294EE00A0B7B3 /* CSSTimingFunctionValue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CSSTimingFunctionValue.h; sourceTree = "<group>"; };
     
    1216712177                                A8185F3309765765005826D9 /* DOMImplementation.h */,
    1216812178                                93EEC1E909C2877700C515D1 /* DOMImplementation.idl */,
     12179                                BC7FA61E0D1F0CBD00DB22A9 /* DynamicNodeList.cpp */,
     12180                                BC7FA61F0D1F0CBD00DB22A9 /* DynamicNodeList.h */,
    1216912181                                6550B699099DF0270090D781 /* EditingText.cpp */,
    1217012182                                6550B69A099DF0270090D781 /* EditingText.h */,
     
    1222512237                                854FE72B0A2297BE0058D7AD /* NodeIterator.h */,
    1222612238                                1A750D870A90E394000FF215 /* NodeIterator.idl */,
    12227                                 A81872160977D3C0005826D9 /* NodeList.cpp */,
    1222812239                                A81872100977D3C0005826D9 /* NodeList.h */,
    1222912240                                85ACA9FA0A9B631000671E90 /* NodeList.idl */,
     
    1225312264                                85031B350A44EFC700F992E0 /* RegisteredEventListener.cpp */,
    1225412265                                85031B360A44EFC700F992E0 /* RegisteredEventListener.h */,
     12266                                BC7FA6800D1F167900DB22A9 /* SelectorNodeList.cpp */,
     12267                                BC7FA67F0D1F167900DB22A9 /* SelectorNodeList.h */,
     12268                                BC7FA62C0D1F0EFF00DB22A9 /* StaticNodeList.cpp */,
     12269                                BC7FA62B0D1F0EFF00DB22A9 /* StaticNodeList.h */,
    1225512270                                A8C4A7EC09D563270003AC8D /* StyledElement.cpp */,
    1225612271                                A8C4A7EB09D563270003AC8D /* StyledElement.h */,
     
    1411914134                                BCA379150D163E5500B793D6 /* JSLocation.h in Headers */,
    1412014135                                BCA3793F0D1647E000B793D6 /* JSLocation.lut.h in Headers */,
     14136                                BC7FA6210D1F0CBD00DB22A9 /* DynamicNodeList.h in Headers */,
     14137                                BC7FA62D0D1F0EFF00DB22A9 /* StaticNodeList.h in Headers */,
     14138                                BC7FA6810D1F167900DB22A9 /* SelectorNodeList.h in Headers */,
    1412114139                        );
    1412214140                        runOnlyForDeploymentPostprocessing = 0;
     
    1537815396                                854FE7320A2297BE0058D7AD /* NodeFilterCondition.cpp in Sources */,
    1537915397                                854FE7340A2297BE0058D7AD /* NodeIterator.cpp in Sources */,
    15380                                 A81872210977D3C0005826D9 /* NodeList.cpp in Sources */,
    1538115398                                A8EA7EBF0A1945D000A8EF5F /* Notation.cpp in Sources */,
    1538215399                                1A0D57360A5C77FE007EDD4C /* OverflowEvent.cpp in Sources */,
     
    1583315850                                93309E1D099E64920056E581 /* visible_units.cpp in Sources */,
    1583415851                                BCA379140D163E5500B793D6 /* JSLocation.cpp in Sources */,
     15852                                BC7FA6200D1F0CBD00DB22A9 /* DynamicNodeList.cpp in Sources */,
     15853                                BC7FA62E0D1F0EFF00DB22A9 /* StaticNodeList.cpp in Sources */,
     15854                                BC7FA6820D1F167900DB22A9 /* SelectorNodeList.cpp in Sources */,
    1583515855                        );
    1583615856                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/WebCore/css/CSSStyleSelector.h

    r28882 r28981  
    130130        CSSFontSelector* fontSelector() { return m_fontSelector.get(); }
    131131
    132     protected:
    133 
    134132        /* checks if a compound selector (which can consist of multiple simple selectors)
    135133           matches the given Element */
    136         bool checkSelector(CSSSelector* selector);
     134        bool checkSelector(CSSSelector*);
     135
     136    protected:
    137137        enum SelectorMatch { SelectorMatches=0, SelectorFailsLocally, SelectorFailsCompletely};
    138138        SelectorMatch checkSelector(CSSSelector* selector, Element *e, bool isAncestor, bool isSubSelector);
     
    243243
    244244        friend class CSSRuleSet;
     245        friend class Node;
    245246    };
    246247
  • trunk/WebCore/dom/ChildNodeList.cpp

    r28868 r28981  
    3131namespace WebCore {
    3232
    33 ChildNodeList::ChildNodeList(Node* n, NodeList::Caches* info)
    34     : NodeList(n, info, false)
     33ChildNodeList::ChildNodeList(Node* n, DynamicNodeList::Caches* info)
     34    : DynamicNodeList(n, info, false)
    3535{
    3636}
  • trunk/WebCore/dom/ChildNodeList.h

    r25754 r28981  
    11/*
    2  * This file is part of the DOM implementation for KDE.
    3  *
    42 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
    53 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
    64 *           (C) 2001 Dirk Mueller (mueller@kde.org)
    7  * Copyright (C) 2004 Apple Computer, Inc.
     5 * Copyright (C) 2004, 2007 Apple Inc. All rights reserved.
    86 *
    97 * This library is free software; you can redistribute it and/or
     
    2321 *
    2422 */
     23
    2524#ifndef ChildNodeList_h
    2625#define ChildNodeList_h
    2726
    28 #include "NodeList.h"
     27#include "DynamicNodeList.h"
    2928
    3029namespace WebCore {
    3130
    32 class ChildNodeList : public NodeList {
     31class ChildNodeList : public DynamicNodeList {
    3332public:
    34     ChildNodeList(Node*, NodeList::Caches*);
     33    ChildNodeList(Node*, DynamicNodeList::Caches*);
    3534
    3635    virtual unsigned length() const;
  • trunk/WebCore/dom/ClassNodeList.cpp

    r28868 r28981  
    3737namespace WebCore {
    3838
    39 ClassNodeList::ClassNodeList(PassRefPtr<Node> rootNode, const String& classNames, NodeList::Caches* caches)
    40     : NodeList(rootNode, caches, true)
     39ClassNodeList::ClassNodeList(PassRefPtr<Node> rootNode, const String& classNames, DynamicNodeList::Caches* caches)
     40    : DynamicNodeList(rootNode, caches, true)
    4141{
    4242    m_classNames.parseClassAttribute(classNames, m_rootNode->document()->inCompatMode());
  • trunk/WebCore/dom/ClassNodeList.h

    r28868 r28981  
    3232
    3333#include "ClassNames.h"
    34 #include "NodeList.h"
     34#include "DynamicNodeList.h"
    3535
    3636namespace WebCore {
     
    3838    class String;
    3939
    40     class ClassNodeList : public NodeList {
     40    class ClassNodeList : public DynamicNodeList {
    4141    public:
    42         ClassNodeList(PassRefPtr<Node> rootNode, const String& classNames, NodeList::Caches*);
     42        ClassNodeList(PassRefPtr<Node> rootNode, const String& classNames, DynamicNodeList::Caches*);
    4343
    4444        virtual unsigned length() const;
  • trunk/WebCore/dom/Document.idl

    r28722 r28981  
    223223        // HTML 5
    224224        NodeList            getElementsByClassName(in DOMString tagname);
     225
     226        // DocumentSelector - Selector API
     227        Element             querySelector(in [ConvertUndefinedOrNullToNullString] DOMString selectors)
     228            raises(DOMException);
     229        NodeList            querySelectorAll(in [ConvertUndefinedOrNullToNullString] DOMString selectors)
     230            raises(DOMException);
    225231    };
    226232
  • trunk/WebCore/dom/DynamicNodeList.cpp

    r28972 r28981  
    11/**
    2  * This file is part of the DOM implementation for KDE.
    3  *
    42 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
    53 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
    64 *           (C) 2001 Dirk Mueller (mueller@kde.org)
    7  * Copyright (C) 2004, 2006 Apple Computer, Inc.
     5 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
    86 *
    97 * This library is free software; you can redistribute it and/or
     
    2422
    2523#include "config.h"
    26 #include "NodeList.h"
     24#include "DynamicNodeList.h"
    2725
    2826#include "Document.h"
     
    3129namespace WebCore {
    3230
    33 NodeList::NodeList(PassRefPtr<Node> rootNode, bool needsNotifications)
     31DynamicNodeList::DynamicNodeList(PassRefPtr<Node> rootNode, bool needsNotifications)
    3432    : m_rootNode(rootNode)
    3533    , m_caches(new Caches)
     
    3735    , m_needsNotifications(needsNotifications)
    3836{
    39     m_rootNode->registerNodeList(this);
     37    m_rootNode->registerDynamicNodeList(this);
    4038}   
    4139
    42 NodeList::NodeList(PassRefPtr<Node> rootNode, NodeList::Caches* info, bool needsNotifications)
     40DynamicNodeList::DynamicNodeList(PassRefPtr<Node> rootNode, DynamicNodeList::Caches* info, bool needsNotifications)
    4341    : m_rootNode(rootNode)
    4442    , m_caches(info)
     
    4644    , m_needsNotifications(needsNotifications)
    4745{
    48     m_rootNode->registerNodeList(this);
     46    m_rootNode->registerDynamicNodeList(this);
    4947}   
    5048
    51 NodeList::~NodeList()
     49DynamicNodeList::~DynamicNodeList()
    5250{
    53     m_rootNode->unregisterNodeList(this);
     51    m_rootNode->unregisterDynamicNodeList(this);
    5452    if (m_ownsCaches)
    5553        delete m_caches;
    5654}
    5755
    58 unsigned NodeList::recursiveLength(Node* start) const
     56unsigned DynamicNodeList::recursiveLength(Node* start) const
    5957{
    6058    if (!start)
     
    8179}
    8280
    83 Node* NodeList::itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
     81Node* DynamicNodeList::itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
    8482{
    8583    ASSERT(remainingOffset >= 0);
     
    102100}
    103101
    104 Node* NodeList::itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
     102Node* DynamicNodeList::itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const
    105103{
    106104    ASSERT(remainingOffset < 0);
     
    122120}
    123121
    124 Node* NodeList::recursiveItem(unsigned offset, Node* start) const
     122Node* DynamicNodeList::recursiveItem(unsigned offset, Node* start) const
    125123{
    126124    int remainingOffset = offset;
     
    143141}
    144142
    145 Node* NodeList::itemWithName(const AtomicString& elementId) const
     143Node* DynamicNodeList::itemWithName(const AtomicString& elementId) const
    146144{
    147145    if (m_rootNode->isDocumentNode() || m_rootNode->inDocument()) {
     
    168166}
    169167
    170 void NodeList::rootNodeChildrenChanged()
     168void DynamicNodeList::rootNodeChildrenChanged()
    171169{
    172170    m_caches->reset();
     
    174172
    175173
    176 NodeList::Caches::Caches()
     174DynamicNodeList::Caches::Caches()
    177175    : lastItem(0)
    178176    , isLengthCacheValid(false)
     
    181179}
    182180
    183 void NodeList::Caches::reset()
     181void DynamicNodeList::Caches::reset()
    184182{
    185183    lastItem = 0;
  • trunk/WebCore/dom/DynamicNodeList.h

    r28972 r28981  
    11/*
    2  * This file is part of the DOM implementation for KDE.
    3  *
    42 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
    53 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
    64 *           (C) 2001 Dirk Mueller (mueller@kde.org)
    7  * Copyright (C) 2004, 2006 Apple Computer, Inc.
     5 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
    86 *
    97 * This library is free software; you can redistribute it and/or
     
    2422 */
    2523
    26 #ifndef NodeList_h
    27 #define NodeList_h
     24#ifndef DynamicNodeList_h
     25#define DynamicNodeList_h
    2826
     27#include "NodeList.h"
    2928#include <wtf/RefCounted.h>
    3029#include <wtf/Forward.h>
     
    3635class Node;
    3736
    38 class NodeList : public RefCounted<NodeList> {
     37class DynamicNodeList : public NodeList {
    3938public:
    40 
    4139    struct Caches {
    4240        Caches();
    4341        void reset();
    44        
     42
    4543        unsigned cachedLength;
    4644        Node* lastItem;
     
    5048    };
    5149
    52     NodeList(PassRefPtr<Node> rootNode, bool needsNotifications);
    53     NodeList(PassRefPtr<Node> rootNode, Caches*, bool needsNotifications);
    54     virtual ~NodeList();
     50    DynamicNodeList(PassRefPtr<Node> rootNode, bool needsNotifications);
     51    DynamicNodeList(PassRefPtr<Node> rootNode, Caches*, bool needsNotifications);
     52    virtual ~DynamicNodeList();
    5553
    5654    bool needsNotifications() const { return m_needsNotifications; }
     
    6361    // Other methods (not part of DOM)
    6462    virtual void rootNodeChildrenChanged();
    65     virtual void rootNodeAttributeChanged() {}
     63    virtual void rootNodeAttributeChanged() { }
    6664
    6765protected:
     
    7674    bool m_needsNotifications;
    7775
    78  private:
     76private:
    7977    Node* itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const;
    8078    Node* itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const;
    8179};
    8280
    83 } //namespace
     81} // namespace WebCore
    8482
    85 #endif
     83#endif // DynamicNodeList_h
  • trunk/WebCore/dom/Element.idl

    r28722 r28981  
    106106        NodeList getElementsByClassName(in DOMString name);
    107107
     108        // ElementSelector - Selector API
     109        Element             querySelector(in [ConvertUndefinedOrNullToNullString] DOMString selectors)
     110            raises(DOMException);
     111        NodeList            querySelectorAll(in [ConvertUndefinedOrNullToNullString] DOMString selectors)
     112            raises(DOMException);
     113
    108114#if defined(LANGUAGE_OBJECTIVE_C)
    109115        // Objective-C extensions
  • trunk/WebCore/dom/NameNodeList.cpp

    r28868 r28981  
    3131using namespace HTMLNames;
    3232
    33 NameNodeList::NameNodeList(Node* root, const String& name, NodeList::Caches* caches)
    34     : NodeList(root, caches, true)
     33NameNodeList::NameNodeList(Node* root, const String& name, DynamicNodeList::Caches* caches)
     34    : DynamicNodeList(root, caches, true)
    3535    , m_nodeName(name)
    3636{
  • trunk/WebCore/dom/NameNodeList.h

    r28868 r28981  
    2121 *
    2222 */
     23
    2324#ifndef NameNodeList_h
    2425#define NameNodeList_h
    2526
    26 #include "NodeList.h"
     27#include "DynamicNodeList.h"
    2728#include "PlatformString.h"
    2829
     
    3233 * NodeList which lists all Nodes in a Element with a given "name=" tag
    3334 */
    34 class NameNodeList : public NodeList {
     35class NameNodeList : public DynamicNodeList {
    3536public:
    36     NameNodeList(Node* root, const String& name, NodeList::Caches*);
     37    NameNodeList(Node* root, const String& name, DynamicNodeList::Caches*);
    3738
    3839    // DOM methods overridden from  parent classes
     
    4344    // Other methods (not part of DOM)
    4445   
    45     virtual void rootNodeAttributeChanged() { NodeList::rootNodeChildrenChanged(); }
     46    virtual void rootNodeAttributeChanged() { DynamicNodeList::rootNodeChildrenChanged(); }
    4647
    4748protected:
  • trunk/WebCore/dom/Node.cpp

    r28875 r28981  
    2525#include "Node.h"
    2626
     27#include "CSSRule.h"
     28#include "CSSRuleList.h"
     29#include "CSSStyleRule.h"
     30#include "CSSStyleSelector.h"
     31#include "CSSStyleSheet.h"
     32#include "CSSParser.h"
     33#include "CSSSelector.h"
    2734#include "CString.h"
    2835#include "ChildNodeList.h"
     
    3037#include "DOMImplementation.h"
    3138#include "Document.h"
     39#include "DynamicNodeList.h"
    3240#include "Element.h"
    3341#include "ExceptionCode.h"
     
    4048#include "NamedAttrMap.h"
    4149#include "RenderObject.h"
     50#include "SelectorNodeList.h"
    4251#include "Text.h"
    4352#include "TextStream.h"
     
    5059using namespace HTMLNames;
    5160
    52 typedef HashSet<NodeList*> NodeListSet;
     61typedef HashSet<DynamicNodeList*> NodeListSet;
    5362struct NodeListsNodeData {
    5463    NodeListSet m_listsToNotify;
    55     NodeList::Caches m_childNodeListCaches;
    56     HashMap<String, NodeList::Caches> m_classNodeListCaches;
    57     HashMap<String, NodeList::Caches> m_nameNodeListCaches;
     64    DynamicNodeList::Caches m_childNodeListCaches;
     65    HashMap<String, DynamicNodeList::Caches> m_classNodeListCaches;
     66    HashMap<String, DynamicNodeList::Caches> m_nameNodeListCaches;
    5867};
    5968
    6069// NodeList that limits to a particular tag.
    61 class TagNodeList : public NodeList {
     70class TagNodeList : public DynamicNodeList {
    6271public:
    6372    TagNodeList(PassRefPtr<Node> rootNode, const AtomicString& namespaceURI, const AtomicString& localName);
     
    7483
    7584inline TagNodeList::TagNodeList(PassRefPtr<Node> rootNode, const AtomicString& namespaceURI, const AtomicString& localName)
    76     : NodeList(rootNode, true)
     85    : DynamicNodeList(rootNode, true)
    7786    , m_namespaceURI(namespaceURI)
    7887    , m_localName(localName)
     
    442451}
    443452
    444 void Node::registerNodeList(NodeList* list)
     453void Node::registerDynamicNodeList(DynamicNodeList* list)
    445454{
    446455    if (!m_nodeLists)
     
    455464}
    456465
    457 void Node::unregisterNodeList(NodeList* list)
     466void Node::unregisterDynamicNodeList(DynamicNodeList* list)
    458467{
    459468    ASSERT(m_nodeLists);
     
    12161225        m_nodeLists.set(new NodeListsNodeData);
    12171226
    1218     return new NameNodeList(this, elementName, &m_nodeLists->m_nameNodeListCaches.add(elementName, NodeList::Caches()).first->second);
     1227    return new NameNodeList(this, elementName, &m_nodeLists->m_nameNodeListCaches.add(elementName, DynamicNodeList::Caches()).first->second);
    12191228}
    12201229
     
    12241233        m_nodeLists.set(new NodeListsNodeData);
    12251234
    1226     return new ClassNodeList(this, classNames, &m_nodeLists->m_classNodeListCaches.add(classNames, NodeList::Caches()).first->second);
     1235    return new ClassNodeList(this, classNames, &m_nodeLists->m_classNodeListCaches.add(classNames, DynamicNodeList::Caches()).first->second);
     1236}
     1237
     1238PassRefPtr<Element> Node::querySelector(const String& selectors, ExceptionCode& ec)
     1239{
     1240    if (selectors.isNull() || selectors.isEmpty()) {
     1241        ec = SYNTAX_ERR;
     1242        return 0;
     1243    }
     1244    CSSStyleSheet tempStyleSheet(document());
     1245    CSSParser p(true);
     1246    RefPtr<CSSRule> rule = p.parseRule(&tempStyleSheet, selectors + "{}");
     1247    if (!rule || !rule->isStyleRule()) {
     1248        ec = SYNTAX_ERR;
     1249        return 0;
     1250    }
     1251
     1252    CSSStyleSelector* styleSelector = document()->styleSelector();
     1253    CSSSelector* querySelector = static_cast<CSSStyleRule*>(rule.get())->selector();
     1254   
     1255    // FIXME: We can speed this up by implementing caching similar to the one use by getElementById
     1256    for (Node *n = traverseNextNode(); n; n = n->traverseNextNode()) {
     1257        if (n->isElementNode()) {
     1258            Element* element = static_cast<Element*>(n);
     1259            styleSelector->initElementAndPseudoState(element);
     1260            for (CSSSelector* selector = querySelector; selector; selector = selector->next()) {
     1261                if (styleSelector->checkSelector(selector))
     1262                    return element;
     1263            }
     1264        }
     1265    }
     1266   
     1267    return 0;
     1268}
     1269
     1270PassRefPtr<NodeList> Node::querySelectorAll(const String& selectors, ExceptionCode& ec)
     1271{
     1272    if (selectors.isNull() || selectors.isEmpty()) {
     1273        ec = SYNTAX_ERR;
     1274        return 0;
     1275    }
     1276    CSSStyleSheet tempStyleSheet(document());
     1277    CSSParser p(true);
     1278    RefPtr<CSSRule> rule = p.parseRule(&tempStyleSheet, selectors + "{}");
     1279    if (!rule || !rule->isStyleRule()) {
     1280        ec = SYNTAX_ERR;
     1281        return 0;
     1282    }
     1283   
     1284    SelectorNodeList* resultList = new SelectorNodeList(this, static_cast<CSSStyleRule*>(rule.get())->selector());
     1285
     1286    return resultList;
    12271287}
    12281288
  • trunk/WebCore/dom/Node.h

    r28868 r28981  
    3939class ContainerNode;
    4040class Document;
     41class DynamicNodeList;
    4142class Element;
    4243class Event;
     
    443444#endif
    444445
    445     void registerNodeList(NodeList*);
    446     void unregisterNodeList(NodeList*);
     446    void registerDynamicNodeList(DynamicNodeList*);
     447    void unregisterDynamicNodeList(DynamicNodeList*);
    447448    void notifyNodeListsChildrenChanged();
    448449    void notifyLocalNodeListsChildrenChanged();
     
    452453    PassRefPtr<NodeList> getElementsByTagName(const String&);
    453454    PassRefPtr<NodeList> getElementsByTagNameNS(const String& namespaceURI, const String& localName);
    454 
    455455    PassRefPtr<NodeList> getElementsByName(const String& elementName);
    456456    PassRefPtr<NodeList> getElementsByClassName(const String& classNames);
     457
     458    PassRefPtr<Element> querySelector(const String& selectors, ExceptionCode&);
     459    PassRefPtr<NodeList> querySelectorAll(const String& selectors, ExceptionCode&);
    457460
    458461private: // members
  • trunk/WebCore/dom/NodeList.h

    r28868 r28981  
    2929#include <wtf/RefCounted.h>
    3030#include <wtf/Forward.h>
    31 #include <wtf/RefPtr.h>
    3231
    3332namespace WebCore {
    3433
    35 class AtomicString;
    36 class Node;
     34    class AtomicString;
     35    class Node;
    3736
    38 class NodeList : public RefCounted<NodeList> {
    39 public:
     37    class NodeList : public RefCounted<NodeList> {
     38    public:
     39        NodeList() { }
     40        virtual ~NodeList() { }
    4041
    41     struct Caches {
    42         Caches();
    43         void reset();
    44        
    45         unsigned cachedLength;
    46         Node* lastItem;
    47         unsigned lastItemOffset;
    48         bool isLengthCacheValid : 1;
    49         bool isItemCacheValid : 1;
     42        // DOM methods & attributes for NodeList
     43        virtual unsigned length() const = 0;
     44        virtual Node* item(unsigned index) const = 0;
     45        virtual Node* itemWithName(const AtomicString&) const = 0;
    5046    };
    5147
    52     NodeList(PassRefPtr<Node> rootNode, bool needsNotifications);
    53     NodeList(PassRefPtr<Node> rootNode, Caches*, bool needsNotifications);
    54     virtual ~NodeList();
     48} // namespace WebCore
    5549
    56     bool needsNotifications() const { return m_needsNotifications; }
    57 
    58     // DOM methods & attributes for NodeList
    59     virtual unsigned length() const = 0;
    60     virtual Node* item(unsigned index) const = 0;
    61     Node* itemWithName(const AtomicString&) const;
    62 
    63     // Other methods (not part of DOM)
    64     virtual void rootNodeChildrenChanged();
    65     virtual void rootNodeAttributeChanged() {}
    66 
    67 protected:
    68     // helper functions for searching all ElementImpls in a tree
    69     unsigned recursiveLength(Node* start = 0) const;
    70     Node* recursiveItem (unsigned offset, Node* start = 0) const;
    71     virtual bool nodeMatches(Node* testNode) const = 0;
    72 
    73     RefPtr<Node> m_rootNode;
    74     mutable Caches* m_caches;
    75     bool m_ownsCaches;
    76     bool m_needsNotifications;
    77 
    78  private:
    79     Node* itemForwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const;
    80     Node* itemBackwardsFromCurrent(Node* start, unsigned offset, int remainingOffset) const;
    81 };
    82 
    83 } //namespace
    84 
    85 #endif
     50#endif NodeList_h
Note: See TracChangeset for help on using the changeset viewer.