/*
 * Copyright (C) 2009 Apple Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

// An old version of CSSOM View Module defines the ClientRectList interface:
// http://www.w3.org/TR/2011/WD-cssom-view-20110804/#the-clientrectlist-interface

// It has since been replace by DOMRectList in CSSOM View Module and
// Geometry Interfaces Module:
// http://dev.w3.org/csswg/cssom-view/#extension-to-the-element-interface
// http://dev.w3.org/fxtf/geometry/#DOMRectList

// CSSOM View Module also says: "The DOMRectList interface is at-risk.
// The authors of this specification await feedback from implementers
// if the item() function of DOMRectList is currently in use on legacy
// interfaces. If there is no/not enough content to justify
// DOMRectList, legacy interfaces must use sequences instead and
// DOMRectList will be removed from this specification."

[
    GarbageCollected,
] interface ClientRectList {
    readonly attribute unsigned long length;
    [MeasureAs=ClientRectListItem] ClientRect item(unsigned long index);
    getter ClientRect (unsigned long index);
};
