📄 kjs_navigator.cpp
字号:
// -*- c-basic-offset: 2 -*-
/*
* This file is part of the KDE libraries
* Copyright (C) 2000 Harri Porten (porten@kde.org)
* Copyright (c) 2000 Daniel Molkentin (molkentin@kde.org)
* Copyright (c) 2000 Stefan Schimanski (schimmi@kde.org)
* Copyright (C) 2003 Apple Computer, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <klocale.h>
#include <kstandarddirs.h>
#include <kconfig.h>
#include <kdebug.h>
#include <kjs_window.h>
#include <kio/kprotocolmanager.h>
#include "kjs_navigator.h"
#include "kjs/lookup.h"
#include "kjs_navigator.lut.h"
#include "kjs_binding.h"
#include "khtml_part.h"
#if APPLE_CHANGES
#include "KWQKCookieJar.h"
#endif
using namespace KJS;
namespace KJS {
class PluginBase : public ObjectImp {
public:
PluginBase(ExecState *exec);
virtual ~PluginBase();
#if NOKIA_CHANGES
void refresh(ExecState *exec, bool reload );
#else
void refresh(bool reload);
#endif
struct MimeClassInfo;
struct PluginInfo;
struct MimeClassInfo {
QString type;
QString desc;
QString suffixes;
PluginInfo *plugin;
};
struct PluginInfo {
QString name;
QString file;
QString desc;
QPtrList<MimeClassInfo> mimes;
};
static QPtrList<PluginInfo> *plugins;
static QPtrList<MimeClassInfo> *mimes;
private:
static int m_refCount;
void createPluginList();
};
class Plugins : public PluginBase {
public:
Plugins(ExecState *exec) : PluginBase(exec) {};
virtual Value get(ExecState *exec, const Identifier &propertyName) const;
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
};
const ClassInfo Plugins::info = { "PluginArray", 0, 0, 0 };
class MimeTypes : public PluginBase {
public:
MimeTypes(ExecState *exec) : PluginBase(exec) { };
virtual Value get(ExecState *exec, const Identifier &propertyName) const;
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
};
const ClassInfo MimeTypes::info = { "MimeTypeArray", 0, 0, 0 };
class Plugin : public PluginBase {
public:
Plugin( ExecState *exec, PluginInfo *info ) : PluginBase(exec), m_info(info) { }
virtual Value get(ExecState *exec, const Identifier &propertyName) const;
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
PluginInfo *m_info;
};
const ClassInfo Plugin::info = { "Plugin", 0, 0, 0 };
class MimeType : public PluginBase {
public:
MimeType( ExecState *exec, MimeClassInfo *info ) : PluginBase(exec), m_info(info) { }
virtual Value get(ExecState *exec, const Identifier &propertyName) const;
virtual const ClassInfo* classInfo() const { return &info; }
static const ClassInfo info;
private:
MimeClassInfo *m_info;
};
const ClassInfo MimeType::info = { "MimeType", 0, 0, 0 };
};
QPtrList<PluginBase::PluginInfo> *KJS::PluginBase::plugins = 0;
QPtrList<PluginBase::MimeClassInfo> *KJS::PluginBase::mimes = 0;
int KJS::PluginBase::m_refCount = 0;
const ClassInfo Navigator::info = { "Navigator", 0, &NavigatorTable, 0 };
/*
@begin NavigatorTable 13
appCodeName Navigator::AppCodeName DontDelete|ReadOnly
appName Navigator::AppName DontDelete|ReadOnly
appVersion Navigator::AppVersion DontDelete|ReadOnly
language Navigator::Language DontDelete|ReadOnly
userAgent Navigator::UserAgent DontDelete|ReadOnly
platform Navigator::Platform DontDelete|ReadOnly
plugins Navigator::_Plugins DontDelete|ReadOnly
mimeTypes Navigator::_MimeTypes DontDelete|ReadOnly
product Navigator::Product DontDelete|ReadOnly
productSub Navigator::ProductSub DontDelete|ReadOnly
vendor Navigator::Vendor DontDelete|ReadOnly
cookieEnabled Navigator::CookieEnabled DontDelete|ReadOnly
javaEnabled Navigator::JavaEnabled DontDelete|Function 0
@end
*/
IMPLEMENT_PROTOFUNC(NavigatorFunc)
Navigator::Navigator(ExecState *exec, KHTMLPart *p)
: ObjectImp(exec->lexicalInterpreter()->builtinObjectPrototype()), m_part(p) { }
Value Navigator::get(ExecState *exec, const Identifier &propertyName) const
{
#ifdef KJS_VERBOSE
kdDebug(6070) << "Navigator::get " << propertyName.ascii() << endl;
#endif
return lookupGet<NavigatorFunc,Navigator,ObjectImp>(exec,propertyName,&NavigatorTable,this);
}
Value Navigator::getValueProperty(ExecState *exec, int token) const
{
#if APPLE_CHANGES
QString userAgent = KWQ(m_part)->userAgent();
#else
KURL url = m_part->url();
QString userAgent = KProtocolManager::userAgentForHost(url.host());
#endif
switch (token) {
case AppCodeName:
return String("Mozilla");
case AppName:
// If we find "Mozilla" but not "(compatible, ...)" we are a real Netscape
if (userAgent.find(QString::fromLatin1("Mozilla")) >= 0 &&
userAgent.find(QString::fromLatin1("compatible")) == -1)
{
//kdDebug() << "appName -> Mozilla" << endl;
return String("Netscape");
}
if (userAgent.find(QString::fromLatin1("Microsoft")) >= 0 ||
userAgent.find(QString::fromLatin1("MSIE")) >= 0)
{
//kdDebug() << "appName -> IE" << endl;
return String("Microsoft Internet Explorer");
}
#if NOKIA_CHANGES
return String("Netscape");
#elif APPLE_CHANGES
// FIXME: Should we define a fallback result here besides "Konqueror"?
return Undefined();
#else
//kdDebug() << "appName -> Konqueror" << endl;
return String("Konqueror");
#endif
case AppVersion:
// We assume the string is something like Mozilla/version (properties)
#if NOKIA_CHANGES
return String("7.0" );
#else
return String(userAgent.mid(userAgent.find('/') + 1));
#endif
case Product:
#if APPLE_CHANGES
// When acting normal, we pretend to be "Gecko".
if (userAgent.find("Mozilla/5.0") >= 0 && userAgent.find("compatible") == -1) {
return String("Gecko");
}
// When spoofing as IE, we use Undefined().
return Undefined();
#else
return String("Konqueror/khtml");
#endif
case ProductSub:
return String("20030107");
case Vendor:
#if APPLE_CHANGES
return String("Apple Computer, Inc.");
#else
return String("KDE");
#endif
case Language:
#if APPLE_CHANGES
// We don't have an implementation of KGlobal::locale(). We do however
// have a static method on KLocale to access the current language.
return String(KLocale::language());
#else
return String(KGlobal::locale()->language() == "C" ?
QString::fromLatin1("en") : KGlobal::locale()->language());
#endif
case UserAgent:
return String(userAgent);
case Platform:
#if NOKIA_CHANGES
return String("Series60" );
#else
// yet another evil hack, but necessary to spoof some sites...
if ( (userAgent.find(QString::fromLatin1("Win"),0,false)>=0) )
return String(QString::fromLatin1("Win32"));
else if ( (userAgent.find(QString::fromLatin1("Macintosh"),0,false)>=0) ||
(userAgent.find(QString::fromLatin1("Mac_PowerPC"),0,false)>=0) )
return String(QString::fromLatin1("MacPPC"));
else
return String(QString::fromLatin1("X11"));
#endif
case _Plugins:
return Value(new Plugins(exec));
case _MimeTypes:
return Value(new MimeTypes(exec));
case CookieEnabled:
#if APPLE_CHANGES
return Boolean(KWQKCookieJar::cookieEnabled());
#else
return Boolean(true); /// ##### FIXME
#endif
default:
kdWarning() << "Unhandled token in DOMEvent::getValueProperty : " << token << endl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -