/*
    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.
*/

module window {

    interface [
        CustomMarkFunction,
        OmitConstructor
    ] Navigator {
        readonly attribute DOMString appCodeName;
        readonly attribute DOMString appName;
        readonly attribute DOMString appVersion;
        readonly attribute DOMString language;
        readonly attribute DOMString userAgent;
        readonly attribute DOMString platform;
        readonly attribute PluginArray plugins;
        readonly attribute MimeTypeArray mimeTypes;
        readonly attribute DOMString product;
        readonly attribute DOMString productSub;
        readonly attribute DOMString vendor;
        readonly attribute DOMString vendorSub;
        readonly attribute boolean cookieEnabled;
        boolean javaEnabled();
        
        readonly attribute boolean onLine;

#if defined(ENABLE_GEOLOCATION) && ENABLE_GEOLOCATION
        readonly attribute [EnabledAtRuntime] Geolocation geolocation;
#endif

#if defined(ENABLE_DOM_STORAGE) && ENABLE_DOM_STORAGE
        void getStorageUpdates();
#endif

        void registerProtocolHandler(in DOMString scheme, in DOMString url, in DOMString title)
            raises(DomException);
        void registerContentHandler(in DOMString mimeType, in DOMString url, in DOMString title)
            raises(DomException);
    };

}
