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

📄 htmlframeelementbase.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 1999 Lars Knoll (knoll@kde.org) *           (C) 1999 Antti Koivisto (koivisto@kde.org) *           (C) 2000 Simon Hausmann (hausmann@kde.org) *           (C) 2001 Dirk Mueller (mueller@kde.org) * Copyright (C) 2004, 2006, 2008, 2009 Apple Inc. All rights reserved. * * 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. */#include "config.h"#include "HTMLFrameElementBase.h"#include "CSSHelper.h"#include "Document.h"#include "EventNames.h"#include "FocusController.h"#include "Frame.h"#include "FrameLoader.h"#include "FrameTree.h"#include "FrameView.h"#include "HTMLFrameSetElement.h"#include "HTMLNames.h"#include "KURL.h"#include "Page.h"#include "RenderFrame.h"#include "Settings.h"namespace WebCore {using namespace HTMLNames;HTMLFrameElementBase::HTMLFrameElementBase(const QualifiedName& tagName, Document* doc, bool createdByParser)    : HTMLFrameOwnerElement(tagName, doc, createdByParser)    , m_scrolling(ScrollbarAuto)    , m_marginWidth(-1)    , m_marginHeight(-1)    , m_noResize(false)    , m_viewSource(false)    , m_shouldOpenURLAfterAttach(false){}bool HTMLFrameElementBase::isURLAllowed(const AtomicString& URLString) const{    if (URLString.isEmpty())        return true;    const KURL& completeURL = document()->completeURL(URLString);    // Don't allow more than 200 total frames in a set. This seems    // like a reasonable upper bound, and otherwise mutually recursive    // frameset pages can quickly bring the program to its knees with    // exponential growth in the number of frames.    // FIXME: This limit could be higher, but because WebKit has some    // algorithms that happen while loading which appear to be N^2 or    // worse in the number of frames, we'll keep it at 200 for now.    if (Frame* parentFrame = document()->frame()) {        if (parentFrame->page()->frameCount() > 200)            return false;    }    // We allow one level of self-reference because some sites depend on that.    // But we don't allow more than one.    bool foundSelfReference = false;    for (Frame* frame = document()->frame(); frame; frame = frame->tree()->parent()) {        if (equalIgnoringRef(frame->loader()->url(), completeURL)) {            if (foundSelfReference)                return false;            foundSelfReference = true;        }    }        return true;}void HTMLFrameElementBase::openURL(){    ASSERT(!m_frameName.isEmpty());    if (!isURLAllowed(m_URL))        return;    if (m_URL.isEmpty())        m_URL = blankURL().string();    Frame* parentFrame = document()->frame();    if (!parentFrame)        return;    parentFrame->loader()->requestFrame(this, m_URL, m_frameName);    if (contentFrame())        contentFrame()->setInViewSourceMode(viewSourceMode());}void HTMLFrameElementBase::parseMappedAttribute(MappedAttribute *attr){    if (attr->name() == srcAttr)        setLocation(parseURL(attr->value()));    else if (attr->name() == idAttr) {        // Important to call through to base for the id attribute so the hasID bit gets set.        HTMLFrameOwnerElement::parseMappedAttribute(attr);        m_frameName = attr->value();    } else if (attr->name() == nameAttr) {        m_frameName = attr->value();        // FIXME: If we are already attached, this doesn't actually change the frame's name.        // FIXME: If we are already attached, this doesn't check for frame name        // conflicts and generate a unique frame name.    } else if (attr->name() == marginwidthAttr) {        m_marginWidth = attr->value().toInt();        // FIXME: If we are already attached, this has no effect.    } else if (attr->name() == marginheightAttr) {        m_marginHeight = attr->value().toInt();        // FIXME: If we are already attached, this has no effect.    } else if (attr->name() == noresizeAttr) {        m_noResize = true;        // FIXME: If we are already attached, this has no effect.    } else if (attr->name() == scrollingAttr) {        // Auto and yes both simply mean "allow scrolling." No means "don't allow scrolling."        if (equalIgnoringCase(attr->value(), "auto") || equalIgnoringCase(attr->value(), "yes"))            m_scrolling = document()->frameElementsShouldIgnoreScrolling() ? ScrollbarAlwaysOff : ScrollbarAuto;        else if (equalIgnoringCase(attr->value(), "no"))            m_scrolling = ScrollbarAlwaysOff;        // FIXME: If we are already attached, this has no effect.    } else if (attr->name() == viewsourceAttr) {        m_viewSource = !attr->isNull();        if (contentFrame())            contentFrame()->setInViewSourceMode(viewSourceMode());    } else if (attr->name() == onloadAttr) {        setInlineEventListenerForTypeAndAttribute(eventNames().loadEvent, attr);    } else if (attr->name() == onbeforeunloadAttr) {        // FIXME: should <frame> elements have beforeunload handlers?        setInlineEventListenerForTypeAndAttribute(eventNames().beforeunloadEvent, attr);    } else        HTMLFrameOwnerElement::parseMappedAttribute(attr);}void HTMLFrameElementBase::setNameAndOpenURL(){    m_frameName = getAttribute(nameAttr);    if (m_frameName.isNull())        m_frameName = getAttribute(idAttr);        if (Frame* parentFrame = document()->frame())        m_frameName = parentFrame->tree()->uniqueChildName(m_frameName);        openURL();}void HTMLFrameElementBase::setNameAndOpenURLCallback(Node* n){    static_cast<HTMLFrameElementBase*>(n)->setNameAndOpenURL();}void HTMLFrameElementBase::insertedIntoDocument(){    HTMLFrameOwnerElement::insertedIntoDocument();        // We delay frame loading until after the render tree is fully constructed.    // Othewise, a synchronous load that executed JavaScript would see incorrect     // (0) values for the frame's renderer-dependent properties, like width.    m_shouldOpenURLAfterAttach = true;}void HTMLFrameElementBase::removedFromDocument(){    m_shouldOpenURLAfterAttach = false;    HTMLFrameOwnerElement::removedFromDocument();}void HTMLFrameElementBase::attach(){    if (m_shouldOpenURLAfterAttach) {        m_shouldOpenURLAfterAttach = false;        queuePostAttachCallback(&HTMLFrameElementBase::setNameAndOpenURLCallback, this);    }    HTMLFrameOwnerElement::attach();        if (RenderPart* renderPart = static_cast<RenderPart*>(renderer()))        if (Frame* frame = contentFrame())            renderPart->setWidget(frame->view());}KURL HTMLFrameElementBase::location() const{    return src();}void HTMLFrameElementBase::setLocation(const String& str){    Settings* settings = document()->settings();    if (settings && settings->needsAcrobatFrameReloadingQuirk() && m_URL == str)        return;    m_URL = AtomicString(str);    if (inDocument())        openURL();}bool HTMLFrameElementBase::isFocusable() const{    return renderer();}void HTMLFrameElementBase::setFocus(bool received){    HTMLFrameOwnerElement::setFocus(received);    if (Page* page = document()->page())        page->focusController()->setFocusedFrame(received ? contentFrame() : 0);}bool HTMLFrameElementBase::isURLAttribute(Attribute *attr) const{    return attr->name() == srcAttr;}String HTMLFrameElementBase::frameBorder() const{    return getAttribute(frameborderAttr);}void HTMLFrameElementBase::setFrameBorder(const String &value){    setAttribute(frameborderAttr, value);}String HTMLFrameElementBase::longDesc() const{    return getAttribute(longdescAttr);}void HTMLFrameElementBase::setLongDesc(const String &value){    setAttribute(longdescAttr, value);}String HTMLFrameElementBase::marginHeight() const{    return getAttribute(marginheightAttr);}void HTMLFrameElementBase::setMarginHeight(const String &value){    setAttribute(marginheightAttr, value);}String HTMLFrameElementBase::marginWidth() const{    return getAttribute(marginwidthAttr);}void HTMLFrameElementBase::setMarginWidth(const String &value){    setAttribute(marginwidthAttr, value);}String HTMLFrameElementBase::name() const{    return getAttribute(nameAttr);}void HTMLFrameElementBase::setName(const String &value){    setAttribute(nameAttr, value);}void HTMLFrameElementBase::setNoResize(bool noResize){    setAttribute(noresizeAttr, noResize ? "" : 0);}String HTMLFrameElementBase::scrolling() const{    return getAttribute(scrollingAttr);}void HTMLFrameElementBase::setScrolling(const String &value){    setAttribute(scrollingAttr, value);}KURL HTMLFrameElementBase::src() const{    return document()->completeURL(getAttribute(srcAttr));}void HTMLFrameElementBase::setSrc(const String &value){    setAttribute(srcAttr, value);}int HTMLFrameElementBase::width() const{    if (!renderer())        return 0;        document()->updateLayoutIgnorePendingStylesheets();    return toRenderBox(renderer())->width();}int HTMLFrameElementBase::height() const{    if (!renderer())        return 0;        document()->updateLayoutIgnorePendingStylesheets();    return toRenderBox(renderer())->height();}} // namespace WebCore

⌨️ 快捷键说明

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