/*
 * Copyright (c) 2000 World Wide Web Consortium,
 * (Massachusetts Institute of Technology, Institut National de
 * Recherche en Informatique et en Automatique, Keio University). All
 * Rights Reserved. This program is distributed under the W3C's Software
 * Intellectual Property License. This program is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.
 * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
 */

package org.w3c.dom.css;

import org.w3c.dom.Element;
import org.w3c.dom.stylesheets.DocumentStyle;

/**
 * This interface represents a document with a CSS view.
 * <p>
 * The <code>getOverrideStyle</code> method provides a mechanism through
 * which a DOM author could effect immediate change to the style of an element
 * without modifying the explicitly linked style sheets of a document or the
 * inline style of elements in the style sheets. This style sheet comes after
 * the author style sheet in the cascade algorithm and is called override
 * style sheet. The override style sheet takes precedence over author style
 * sheets. An "!important" declaration still takes precedence over a normal
 * declaration. Override, author, and user style sheets all may contain
 * "!important" declarations. User "!important" rules take precedence over
 * both override and author "!important" rules, and override "!important"
 * rules take precedence over author "!important" rules.
 * <p>
 * The expectation is that an instance of the <code>DocumentCSS</code>
 * interface can be obtained by using binding-specific casting methods on an
 * instance of the <code>Document</code> interface.
 * <p>
 * See also the <a
 * href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document
 * Object Model (DOM) Level 2 Style Specification </a>.
 * 
 * @since DOM Level 2
 */
public interface DocumentCSS extends DocumentStyle {
	/**
	 * This method is used to retrieve the override style declaration for a
	 * specified element and a specified pseudo-element.
	 * 
	 * @param elt
	 *            The element whose style is to be modified. This parameter
	 *            cannot be null.
	 * @param pseudoElt
	 *            The pseudo-element or <code>null</code> if none.
	 * @return The override style declaration.
	 */
	public CSSStyleDeclaration getOverrideStyle(Element elt, String pseudoElt);

}