/*
    Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library 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 the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

// https://html.spec.whatwg.org/#the-navigator-object

[
    GarbageCollected,
] interface Navigator {
    // objects implementing this interface also implement the interfaces given below

    // TODO(philipj): vendorSub should be on NavigatorID.
    [MeasureAs=NavigatorVendorSub] readonly attribute DOMString vendorSub;

    // TODO(philipj): productSub and vendor are not yet in the spec:
    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27954
    [MeasureAs=NavigatorProductSub] readonly attribute DOMString productSub;
    // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27786
    [MeasureAs=NavigatorVendor] readonly attribute DOMString vendor;
};

Navigator implements NavigatorCPU;
Navigator implements NavigatorID;
Navigator implements NavigatorLanguage;
Navigator implements NavigatorOnLine;
Navigator implements NavigatorStorageUtils;
