⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kjs_navigator.cpp

📁 khtml在gtk上的移植版本
💻 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 <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"#endifusing namespace KJS;namespace KJS {    class PluginBase : public ObjectImp {    public:        PluginBase(ExecState *exec);        virtual ~PluginBase();                void refresh(bool reload);        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;    };    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 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)    return String(userAgent.mid(userAgent.find('/') + 1));  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:    return String(KGlobal::locale()->language() == "C" ?                  QString::fromLatin1("en") : KGlobal::locale()->language());  case UserAgent:    return String(userAgent);  case Platform:    // 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"));  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;    return Value();  }}/*******************************************************************/PluginBase::PluginBase(ExecState *exec)  : ObjectImp(exec->lexicalInterpreter()->builtinObjectPrototype() ){    if ( !plugins ) {        plugins = new QPtrList<PluginInfo>;        mimes = new QPtrList<MimeClassInfo>;        plugins->setAutoDelete( true );        mimes->setAutoDelete( true );        // read configuration        KConfig c(KGlobal::dirs()->saveLocation("data","nsplugins")+"/pluginsinfo");        unsigned num = (unsigned int)c.readNumEntry("number");        for ( unsigned n=0; n<num; n++ ) {            c.setGroup( QString::number(n) );            PluginInfo *plugin = new PluginInfo;            plugin->name = c.readEntry("name");            plugin->file = c.readEntry("file");            plugin->desc = c.readEntry("description");            //kdDebug(6070) << "plugin : " << plugin->name << " - " << plugin->desc << endl;            plugins->append( plugin );            // get mime types from string            QStringList types = QStringList::split( ';', c.readEntry("mime") );            QStringList::Iterator type;            for ( type=types.begin(); type!=types.end(); ++type ) {                // get mime information                MimeClassInfo *mime = new MimeClassInfo;                QStringList tokens = QStringList::split(':', *type, TRUE);                QStringList::Iterator token;                token = tokens.begin();                if (token == tokens.end()) {                    delete mime;                    continue;                }                mime->type = (*token).lower();                //kdDebug(6070) << "mime->type=" << mime->type << endl;                ++token;                if (token == tokens.end()) {                    delete mime;                    continue;                }                mime->suffixes = *token;                ++token;                if (token == tokens.end()) {                    delete mime;                    continue;                }                mime->desc = *token;                ++token;                mime->plugin = plugin;                mimes->append( mime );                plugin->mimes.append( mime );            }        }    }    m_refCount++;}PluginBase::~PluginBase(){    m_refCount--;    if ( m_refCount==0 ) {        delete plugins;        delete mimes;        plugins = 0;        mimes = 0;    }}void PluginBase::refresh(bool reload){    delete plugins;    delete mimes;    plugins = 0;    mimes = 0;#if APPLE_CHANGES    RefreshPlugins(reload);#endif}/*******************************************************************/IMPLEMENT_PROTOFUNC(PluginsFunc)Value Plugins::get(ExecState *exec, const Identifier &propertyName) const{#ifdef KJS_VERBOSE  kdDebug(6070) << "Plugins::get " << propertyName.qstring() << endl;#endif    if (propertyName == "refresh")      return lookupOrCreateFunction<PluginsFunc>(exec,propertyName,this,0,0,DontDelete|Function);    else if ( propertyName ==lengthPropertyName )      return Number(plugins->count());    else {        // plugins[#]        bool ok;        unsigned int i = propertyName.toULong(&ok);        if( ok && i<plugins->count() )            return Value( new Plugin( exec, plugins->at(i) ) );        // plugin[name]        for ( PluginInfo *pl = plugins->first(); pl!=0; pl = plugins->next() ) {            if ( pl->name==propertyName.qstring() )                return Value( new Plugin( exec, pl ) );        }    }    return PluginBase::get(exec, propertyName);}/*******************************************************************/Value MimeTypes::get(ExecState *exec, const Identifier &propertyName) const{#ifdef KJS_VERBOSE  kdDebug(6070) << "MimeTypes::get " << propertyName.qstring() << endl;#endif    if( propertyName==lengthPropertyName )        return Number( mimes->count() );    else {        // mimeTypes[#]        bool ok;        unsigned int i = propertyName.toULong(&ok);        if( ok && i<mimes->count() )            return Value( new MimeType( exec, mimes->at(i) ) );        // mimeTypes[name]        //kdDebug(6070) << "MimeTypes[" << propertyName.ascii() << "]" << endl;        for ( MimeClassInfo *m=mimes->first(); m!=0; m=mimes->next() ) {            //kdDebug(6070) << "m->type=" << m->type.ascii() << endl;            if ( m->type == propertyName.qstring() )                return Value( new MimeType( exec, m ) );        }    }    return PluginBase::get(exec, propertyName);}/************************************************************************/Value Plugin::get(ExecState *exec, const Identifier &propertyName) const{#ifdef KJS_VERBOSE  kdDebug(6070) << "Plugin::get " << propertyName.qstring() << endl;#endif    if ( propertyName=="name" )        return String( m_info->name );    else if ( propertyName == "filename" )        return String( m_info->file );    else if ( propertyName == "description" )        return String( m_info->desc );    else if ( propertyName == lengthPropertyName )        return Number( m_info->mimes.count() );    else {        // plugin[#]        bool ok;        unsigned int i = propertyName.toULong(&ok);        //kdDebug(6070) << "Plugin::get plugin[" << i << "]" << endl;        if( ok && i<m_info->mimes.count() )        {            //kdDebug(6070) << "returning mimetype " << m_info->mimes.at(i)->type << endl;            return Value(new MimeType(exec, m_info->mimes.at(i)));        }        // plugin["name"]        for ( MimeClassInfo *m=m_info->mimes.first();              m!=0; m=m_info->mimes.next() ) {            if ( m->type==propertyName.qstring() )                return Value(new MimeType(exec, m));        }    }    return ObjectImp::get(exec,propertyName);}/*****************************************************************************/Value MimeType::get(ExecState *exec, const Identifier &propertyName) const{#ifdef KJS_VERBOSE  kdDebug(6070) << "MimeType::get " << propertyName.qstring() << endl;#endif    if ( propertyName == "type" )        return String( m_info->type );    else if ( propertyName == "suffixes" )        return String( m_info->suffixes );    else if ( propertyName == "description" )        return String( m_info->desc );    else if ( propertyName == "enabledPlugin" )        return Value(new Plugin(exec, m_info->plugin));    return ObjectImp::get(exec,propertyName);}Value PluginsFunc::tryCall(ExecState *exec, Object &, const List &args){    PluginBase(exec).refresh(args[0].toBoolean(exec));    return Undefined();}Value NavigatorFunc::tryCall(ExecState *exec, Object &thisObj, const List &){  if (!thisObj.inherits(&KJS::Navigator::info)) {    Object err = Error::create(exec,TypeError);    exec->setException(err);    return err;  }  Navigator *nav = static_cast<Navigator *>(thisObj.imp());  // javaEnabled()  return Boolean(nav->part()->javaEnabled());}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -