/*
    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 DOMPluginArray plugins;
        readonly attribute DOMMimeTypeArray 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_CONNECTION) && ENABLE_CONNECTION
        // ANDROID-only for now, upstreaming in progress.
        readonly attribute Connection connection;
#endif

#if defined(ENABLE_APPLICATION_INSTALLED) && ENABLE_APPLICATION_INSTALLED
        // ANDROID-only for now.
        [Custom] void isApplicationInstalled(in DOMString applicationName, in ApplicationInstalledCallback callback);
#endif

#if defined(ENABLE_GEOLOCATION) && ENABLE_GEOLOCATION
        readonly attribute [EnabledAtRuntime] Geolocation geolocation;
#endif

#if defined(ENABLE_DOM_STORAGE) && ENABLE_DOM_STORAGE
        void getStorageUpdates();
#endif

#if defined(ENABLE_REGISTER_PROTOCOL_HANDLER) && ENABLE_REGISTER_PROTOCOL_HANDLER
        void registerProtocolHandler(in DOMString scheme, in DOMString url, in DOMString title)
            raises(DomException);
#endif

#if defined(ENABLE_MEDIA_STREAM) && ENABLE_MEDIA_STREAM
        [Custom, EnabledAtRuntime] void webkitGetUserMedia(in DOMString options,
                                                           in [Callback=FunctionOnly] NavigatorUserMediaSuccessCallback successCallback,
                                                           in [Callback=FunctionOnly, Optional] NavigatorUserMediaErrorCallback errorCallback);
#endif
    };

}
