// Copyright 2014 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// https://www.w3.org/TR/dom/#document

interface Document : Node {
  [SameObject] readonly attribute DOMImplementation implementation;
  readonly attribute DOMString URL;
  readonly attribute DOMString documentURI;
  readonly attribute Element? documentElement;

  // user interaction
  // Non-standard return type, should be WindowProxy.
  // https://www.w3.org/TR/html50/single-page.html#dom-document-defaultview
  readonly attribute Window? defaultView;

  HTMLCollection getElementsByTagName(DOMString localName);
  HTMLCollection getElementsByClassName(DOMString classNames);
  [NewObject] Element createElement(DOMString localName);
  [NewObject] Element createElementNS(DOMString namespaceURI, DOMString localName);

  [NewObject] Text createTextNode(DOMString data);
  [NewObject] Comment createComment(DOMString data);

  [NewObject, RaisesException] Event createEvent(DOMString interfaceName);
  [RaisesException] attribute DOMString cookie;
};

Document implements GlobalEventHandlers;
