📄 html_objectimpl.cpp
字号:
case ATTR_HIDDEN:
if (val.lower()=="yes" || val.lower()=="true") {
// FIXME: Not dynamic, but it's not really important that such a rarely-used
// feature work dynamically.
addCSSLength( attr, CSS_PROP_WIDTH, "0" );
addCSSLength( attr, CSS_PROP_HEIGHT, "0" );
}
break;
default:
HTMLElementImpl::parseHTMLAttribute( attr );
}
}
bool HTMLEmbedElementImpl::rendererIsNeeded(RenderStyle *style)
{
#if NOKIA_CHANGES
if (getDocument()->fastDisplayMode())
return false;
#endif
KHTMLPart *part = getDocument()->part();
if (!part)
return false;
return part->pluginsEnabled() && parentNode()->id() != ID_OBJECT;
}
RenderObject *HTMLEmbedElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
{
return new (arena) RenderPartObject(this);
}
void HTMLEmbedElementImpl::attach()
{
HTMLElementImpl::attach();
if (m_render) {
static_cast<RenderPartObject*>(m_render)->updateWidget();
}
}
bool HTMLEmbedElementImpl::isURLAttribute(AttributeImpl *attr) const
{
return attr->id() == ATTR_SRC;
}
#if NOKIA_CHANGES
bool HTMLEmbedElementImpl::isFocusable() const
{
if (!m_render || (m_render->style() && m_render->style()->visibility() != VISIBLE))
return false;
return true;
}
void HTMLEmbedElementImpl::defaultEventHandler(EventImpl *evt)
{
if (evt->id() == EventImpl::KEYPRESS_EVENT && evt->isKeyboardEvent()) {
// getDocument()->activateNode (this);
}
HTMLElementImpl::defaultEventHandler(evt);
}
#endif
// -------------------------------------------------------------------------
HTMLObjectElementImpl::HTMLObjectElementImpl(DocumentPtr *doc)
#if APPLE_CHANGES && !NOKIA_CHANGES
: HTMLElementImpl(doc), m_imageLoader(0), objectInstance(0)
#else
: HTMLElementImpl(doc), m_imageLoader(0)
#endif
{
needWidgetUpdate = false;
}
HTMLObjectElementImpl::~HTMLObjectElementImpl()
{
delete m_imageLoader;
}
NodeImpl::Id HTMLObjectElementImpl::id() const
{
return ID_OBJECT;
}
#if APPLE_CHANGES && !NOKIA_CHANGES
KJS::Bindings::Instance *HTMLObjectElementImpl::getObjectInstance() const
{
KHTMLPart* part = getDocument()->part();
if (!part)
return 0;
if (objectInstance)
return objectInstance;
RenderPartObject *r = static_cast<RenderPartObject*>(m_render);
if (r) {
if (r->widget()){
// Call into the part (and over the bridge) to pull the Bindings::Instance
// from the guts of the plugin.
void *_view = r->widget()->getView();
objectInstance = KWQ(part)->getObjectInstanceForView((NSView *)_view);
// Applet may specified with <object> tag.
if (!objectInstance)
objectInstance = KWQ(part)->getAppletInstanceForView((NSView *)_view);
}
}
return objectInstance;
}
#endif
HTMLFormElementImpl *HTMLObjectElementImpl::form() const
{
return 0;
}
bool HTMLObjectElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
switch (attr) {
case ATTR_WIDTH:
case ATTR_HEIGHT:
result = eUniversal;
return false;
default:
break;
}
return HTMLElementImpl::mapToEntry(attr, result);
}
void HTMLObjectElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
QString val = attr->value().string();
int pos;
switch ( attr->id() )
{
case ATTR_TYPE:
serviceType = val.lower();
pos = serviceType.find( ";" );
if ( pos!=-1 )
serviceType = serviceType.left( pos );
if (m_render)
needWidgetUpdate = true;
if (!canRenderImageType(serviceType) && m_imageLoader) {
delete m_imageLoader;
m_imageLoader = 0;
}
break;
case ATTR_DATA:
url = khtml::parseURL( val ).string();
if (m_render)
needWidgetUpdate = true;
if (m_render && canRenderImageType(serviceType)) {
if (!m_imageLoader)
m_imageLoader = new HTMLImageLoader(this);
m_imageLoader->updateFromElement();
}
break;
case ATTR_WIDTH:
addCSSLength( attr, CSS_PROP_WIDTH, attr->value());
break;
case ATTR_HEIGHT:
addCSSLength( attr, CSS_PROP_HEIGHT, attr->value());
break;
case ATTR_CLASSID:
classId = val;
if (m_render)
needWidgetUpdate = true;
break;
case ATTR_ONLOAD: // ### support load/unload on object elements
setHTMLEventListener(EventImpl::LOAD_EVENT,
getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
case ATTR_ONUNLOAD:
setHTMLEventListener(EventImpl::UNLOAD_EVENT,
getDocument()->createHTMLEventListener(attr->value().string(), this));
break;
#ifdef NOKIA_CHANGES
case ATTR_ALIGN:
addHTMLAlignment(attr);
break;
#endif
default:
HTMLElementImpl::parseHTMLAttribute( attr );
}
}
DocumentImpl* HTMLObjectElementImpl::contentDocument() const
{
// ###
return 0;
}
bool HTMLObjectElementImpl::rendererIsNeeded(RenderStyle *style)
{
if (canRenderImageType(serviceType)) {
return HTMLElementImpl::rendererIsNeeded(style);
}
#if NOKIA_CHANGES
if (getDocument()->fastDisplayMode())
return false;
#endif
KHTMLPart* part = getDocument()->part();
if (!part || !part->pluginsEnabled()) {
return false;
}
#if APPLE_CHANGES
// Eventually we will merge with the better version of this check on the tip of tree.
// Until then, just leave it out.
#else
KURL u = getDocument()->completeURL(url);
for (KHTMLPart* part = w->part()->parentPart(); part; part = part->parentPart())
if (part->url() == u) {
return false;
}
#endif
return true;
}
RenderObject *HTMLObjectElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
{
if (canRenderImageType(serviceType)) {
return new (arena) RenderImage(this);
}
return new (arena) RenderPartObject(this);
}
void HTMLObjectElementImpl::attach()
{
HTMLElementImpl::attach();
if (m_render) {
if (canRenderImageType(serviceType)) {
if (!m_imageLoader)
m_imageLoader = new HTMLImageLoader(this);
m_imageLoader->updateFromElement();
if (renderer()) {
RenderImage* imageObj = static_cast<RenderImage*>(renderer());
imageObj->setImage(m_imageLoader->image());
}
} else {
if (needWidgetUpdate) {
// Set needWidgetUpdate to false before calling updateWidget because updateWidget may cause
// this method or recalcStyle (which also calls updateWidget) to be called.
needWidgetUpdate = false;
static_cast<RenderPartObject*>(m_render)->updateWidget();
dispatchHTMLEvent(EventImpl::LOAD_EVENT,false,false);
} else {
needWidgetUpdate = true;
setChanged();
}
}
}
}
void HTMLObjectElementImpl::detach()
{
// Only bother with an unload event if we had a render object. - dwh
if (attached() && m_render)
// ### do this when we are actualy removed from document instead
dispatchHTMLEvent(EventImpl::UNLOAD_EVENT,false,false);
HTMLElementImpl::detach();
}
void HTMLObjectElementImpl::recalcStyle(StyleChange ch)
{
if (needWidgetUpdate && m_render && !canRenderImageType(serviceType)) {
// Set needWidgetUpdate to false before calling updateWidget because updateWidget may cause
// this method or attach (which also calls updateWidget) to be called.
needWidgetUpdate = false;
static_cast<RenderPartObject*>(m_render)->updateWidget();
dispatchHTMLEvent(EventImpl::LOAD_EVENT,false,false);
}
HTMLElementImpl::recalcStyle(ch);
}
void HTMLObjectElementImpl::childrenChanged()
{
if (inDocument()) {
needWidgetUpdate = true;
setChanged();
}
}
bool HTMLObjectElementImpl::isURLAttribute(AttributeImpl *attr) const
{
return (attr->id() == ATTR_DATA || (attr->id() == ATTR_USEMAP && attr->value().domString()[0] != '#'));
}
#if NOKIA_CHANGES
bool HTMLObjectElementImpl::isFocusable() const
{
if (!m_render || (m_render->style() && m_render->style()->visibility() != VISIBLE))
return false;
return true;
}
void HTMLObjectElementImpl::defaultEventHandler(EventImpl *evt)
{
if (evt->id() == EventImpl::KEYPRESS_EVENT && evt->isKeyboardEvent()) {
// getDocument()->activateNode (this);
}
HTMLElementImpl::defaultEventHandler(evt);
}
#endif
// -------------------------------------------------------------------------
HTMLParamElementImpl::HTMLParamElementImpl(DocumentPtr *doc)
: HTMLElementImpl(doc)
{
}
HTMLParamElementImpl::~HTMLParamElementImpl()
{
}
NodeImpl::Id HTMLParamElementImpl::id() const
{
return ID_PARAM;
}
void HTMLParamElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch( attr->id() )
{
case ATTR_ID:
// Must call base class so that hasID bit gets set.
HTMLElementImpl::parseHTMLAttribute(attr);
if (getDocument()->htmlMode() != DocumentImpl::XHtml) break;
// fall through
case ATTR_NAME:
m_name = attr->value();
break;
case ATTR_VALUE:
m_value = attr->value();
break;
}
}
bool HTMLParamElementImpl::isURLAttribute(AttributeImpl *attr) const
{
if (attr->id() == ATTR_VALUE) {
AttributeImpl *attr = attributes()->getAttributeItem(ATTR_NAME);
if (attr) {
DOMString value = attr->value().string().lower();
if (value == "src" || value == "movie" || value == "data") {
return true;
}
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -