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

📄 kjs_html.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// -*- c-basic-offset: 2 -*-/* *  This file is part of the KDE libraries *  Copyright (C) 1999-2000 Harri Porten (porten@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 "misc/loader.h"#include "dom/html_block.h"#include "dom/html_head.h"#include "dom/html_image.h"#include "dom/html_inline.h"#include "dom/html_list.h"#include "dom/html_table.h"#include "dom/html_object.h"#include "dom/dom_exception.h"#include "xml/dom2_eventsimpl.h"// ### HACK#include "html/html_baseimpl.h"#include "html/html_documentimpl.h"#include "html/html_objectimpl.h"#include "khtml_part.h"#include "khtmlview.h"#include "ecma/kjs_css.h"#include "ecma/kjs_html.h"#include "ecma/kjs_window.h"#include "ecma/kjs_html.lut.h"#include "kjs_events.h"#include "misc/htmltags.h"#if !KWIQ // APPLE proprietary#include "rendering/render_canvasimage.h"#endif#include "rendering/render_object.h"#include "rendering/render_layer.h"#include <kdebug.h>#include "cssparser.h"#include "qcolor.h"#include "qpixmap.h"#if APPLE_CHANGES && !KWIQ#include <ApplicationServices/ApplicationServices.h>#endifusing namespace KJS;IMPLEMENT_PROTOFUNC(HTMLDocFunction)Value KJS::HTMLDocFunction::tryCall(ExecState *exec, Object &thisObj, const List &args){  if (!thisObj.inherits(&HTMLDocument::info)) {    Object err = Error::create(exec,TypeError);    exec->setException(err);    return err;  }  DOM::HTMLDocument doc = static_cast<KJS::HTMLDocument *>(thisObj.imp())->toDocument();  switch (id) {  case HTMLDocument::Clear: // even IE doesn't support that one...    //doc.clear(); // TODO    return Undefined();  case HTMLDocument::Open:    // For compatibility with other browsers, pass open calls with parameters to the window.    if (args.size() > 1) {      KHTMLPart *part = static_cast<DOM::DocumentImpl *>(doc.handle())->part();      if (part) {	Window *window = Window::retrieveWindow(part);	if (window) {	  Object functionObject = Object::dynamicCast(window->get(exec, "open"));	  if (functionObject.isNull() || !functionObject.implementsCall()) {	    Object exception = Error::create(exec, TypeError);	    exec->setException(exception);	    return exception;	  }	  Object windowObject(window);	  return functionObject.call(exec, windowObject, args);	}      }      return Undefined();    }    // In the case of no prameters, do a normal document open.    doc.open();    return Undefined();  case HTMLDocument::Close:    // see khtmltests/ecma/tokenizer-script-recursion.html    doc.close();    return Undefined();  case HTMLDocument::Write:  case HTMLDocument::WriteLn: {    // DOM only specifies single string argument, but NS & IE allow multiple    // or no arguments    UString str = "";    for (int i = 0; i < args.size(); i++)      str += args[i].toString(exec);    if (id == HTMLDocument::WriteLn)      str += "\n";    //kdDebug() << "document.write: " << str.ascii() << endl;    doc.write(str.string());    return Undefined();  }  case HTMLDocument::GetElementsByName:    return getDOMNodeList(exec,doc.getElementsByName(args[0].toString(exec).string()));  case HTMLDocument::CaptureEvents:  case HTMLDocument::ReleaseEvents:    // Do nothing for now. These are NS-specific legacy calls.    break;  }  return Undefined();}const ClassInfo KJS::HTMLDocument::info =  { "HTMLDocument", &DOMDocument::info, &HTMLDocumentTable, 0 };/* Source for HTMLDocumentTable. Use "make hashtables" to regenerate.@begin HTMLDocumentTable 30  title			HTMLDocument::Title		DontDelete  referrer		HTMLDocument::Referrer		DontDelete|ReadOnly  domain		HTMLDocument::Domain		DontDelete  URL			HTMLDocument::URL		DontDelete|ReadOnly  body			HTMLDocument::Body		DontDelete  location		HTMLDocument::Location		DontDelete  cookie		HTMLDocument::Cookie		DontDelete  images		HTMLDocument::Images		DontDelete|ReadOnly  embeds		HTMLDocument::Embeds		DontDelete|ReadOnly  applets		HTMLDocument::Applets		DontDelete|ReadOnly  links			HTMLDocument::Links		DontDelete|ReadOnly  forms			HTMLDocument::Forms		DontDelete|ReadOnly  anchors		HTMLDocument::Anchors		DontDelete|ReadOnly  scripts		HTMLDocument::Scripts		DontDelete|ReadOnly# We want no document.all at all, not just a function that returns undefined.# That means we lose the "document.all when spoofing as IE" feature, but we don't spoof in Safari.# And this makes sites that set document.all explicitly work when they otherwise wouldn't, # e.g. https://corporateexchange.airborne.com# (Not in APPLE_CHANGES since we can't do #if in KJS identifier lists.)#  all			HTMLDocument::All		DontDelete|ReadOnly  clear			HTMLDocument::Clear		DontDelete|Function 0  open			HTMLDocument::Open		DontDelete|Function 0  close			HTMLDocument::Close		DontDelete|Function 0  write			HTMLDocument::Write		DontDelete|Function 1  writeln		HTMLDocument::WriteLn		DontDelete|Function 1  getElementsByName	HTMLDocument::GetElementsByName	DontDelete|Function 1  captureEvents		HTMLDocument::CaptureEvents	DontDelete|Function 0  releaseEvents		HTMLDocument::ReleaseEvents	DontDelete|Function 0  bgColor		HTMLDocument::BgColor		DontDelete  fgColor		HTMLDocument::FgColor		DontDelete  alinkColor		HTMLDocument::AlinkColor	DontDelete  linkColor		HTMLDocument::LinkColor		DontDelete  vlinkColor		HTMLDocument::VlinkColor	DontDelete  lastModified		HTMLDocument::LastModified	DontDelete|ReadOnly  height		HTMLDocument::Height		DontDelete|ReadOnly  width			HTMLDocument::Width		DontDelete|ReadOnly  dir			HTMLDocument::Dir		DontDelete#potentially obsolete array properties# layers# plugins# tags#potentially obsolete properties# embeds# ids@end*/bool KJS::HTMLDocument::hasProperty(ExecState *exec, const Identifier &p) const{#ifdef KJS_VERBOSE  //kdDebug(6070) << "KJS::HTMLDocument::hasProperty " << p.qstring() << endl;#endif  DOM::HTMLDocumentImpl *docImpl = static_cast<DOM::HTMLDocumentImpl *>(node.handle());  return (DOMDocument::hasProperty(exec, p) ||  	  docImpl->haveNamedImageOrForm(p.qstring()));}Value KJS::HTMLDocument::tryGet(ExecState *exec, const Identifier &propertyName) const{#ifdef KJS_VERBOSE  kdDebug(6070) << "KJS::HTMLDocument::tryGet " << propertyName.qstring() << endl;#endif  DOM::HTMLDocument doc = static_cast<DOM::HTMLDocument>(node);  DOM::HTMLBodyElement body = doc.body();  KHTMLView *view = static_cast<DOM::DocumentImpl*>(doc.handle())->view();  const HashEntry* entry = Lookup::findEntry(&HTMLDocumentTable, propertyName);  if (entry) {    switch (entry->value) {    case Title:      return String(doc.title());    case Referrer:      return String(doc.referrer());    case Domain:      return String(doc.domain());    case URL:      return String(doc.URL());    case Body:      return getDOMNode(exec,doc.body());    case Location:      if ( view && view->part() )      {        Window* win = Window::retrieveWindow(view->part());        if (win)          return Value(win->location());	else          return Undefined();      }      else        return Undefined();    case Cookie:      return String(doc.cookie());    case Images:      return getHTMLCollection(exec,doc.images());    case Embeds:      return getHTMLCollection(exec,doc.embeds());    case Applets:      return getHTMLCollection(exec,doc.applets());    case Links:      return getHTMLCollection(exec,doc.links());    case Forms:      return getHTMLCollection(exec,doc.forms());    case Anchors:      return getHTMLCollection(exec,doc.anchors());    case Scripts: // TODO (IE-specific)    {      // To be implemented. Meanwhile, return an object with a length property set to 0      kdWarning() << "KJS::HTMLDocument document.scripts called - not implemented" << endl;      Object obj( new ObjectImp() );      obj.put( exec, lengthPropertyName, Number(0) );      return obj;    }    case All:      // Disable document.all when we try to be Netscape-compatible      if ( exec->dynamicInterpreter()->compatMode() == Interpreter::NetscapeCompat )        return Undefined();      return getHTMLCollection(exec,doc.all());    case Clear:    case Open:    case Close:    case Write:    case WriteLn:    case GetElementsByName:    case CaptureEvents:    case ReleaseEvents:      return lookupOrCreateFunction<HTMLDocFunction>( exec, propertyName, this, entry->value, entry->params, entry->attr );    }  }  // Look for overrides  ValueImp * val = ObjectImp::getDirect(propertyName);  if (val)    return Value(val);  if (entry) {    switch (entry->value) {    case BgColor:      return String(body.bgColor());    case FgColor:      return String(body.text());    case AlinkColor:      return String(body.aLink());    case LinkColor:      return String(body.link());    case VlinkColor:      return String(body.vLink());    case LastModified:      return String(doc.lastModified());    case Height:      return Number(view ? view->contentsHeight() : 0);    case Width:      return Number(view ? view->contentsWidth() : 0);    case Dir:      return String(body.dir());    }  }  if (DOMDocument::hasProperty(exec, propertyName))    return DOMDocument::tryGet(exec, propertyName);  //kdDebug(6070) << "KJS::HTMLDocument::tryGet " << propertyName.qstring() << " not found, returning element" << endl;  // image and form elements with the name p will be looked up last#if APPLE_CHANGES    // Look for named applets.    // FIXME:  Factor code that creates RuntimeObjectImp for applet.  It's also    // located in applets[0].     DOM::HTMLCollection applets = doc.applets();    DOM::HTMLElement anApplet = applets.namedItem (propertyName.string());    if (!anApplet.isNull()) {        return getRuntimeObject(exec,anApplet);    }    DOM::HTMLCollection embeds = doc.embeds();    DOM::HTMLElement anEmbed = embeds.namedItem (propertyName.string());    if (!anEmbed.isNull()) {        return getRuntimeObject(exec,anEmbed);    }#endif  DOM::HTMLDocumentImpl *docImpl = static_cast<DOM::HTMLDocumentImpl*>(node.handle());  if (!docImpl->haveNamedImageOrForm(propertyName.qstring())) {    return Undefined();  }  DOM::HTMLCollection coll = doc.images();

⌨️ 快捷键说明

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