void Hdf::setVisited(bool visited /* = true */) { hdf_set_visited(getRaw(), visited ? 1 : 0); for (Hdf hdf = firstChild(false); hdf.exists(); hdf = hdf.next(false)) { hdf.setVisited(visited); } }
FrameTree::~FrameTree() { for (Frame* child = firstChild(); child; child = child->tree()->nextSibling()) child->setView(0); }
bool RenderRubyRun::hasRubyText() const { // The only place where a ruby text can be is in the first position // Note: As anonymous blocks, ruby runs do not have ':before' or ':after' content themselves. return firstChild() && firstChild()->isRubyText(); }
bool BrowserNode::tool_cmd(ToolCom * com, const char * args) { switch ((unsigned char) args[-1]) { case applyCmd: { QLOG_FATAL() << Q_FUNC_INFO << "If this got called then we have a logic flaw going on and BrowserNode needs to have Q_OBJECT in it to properly catch ToolCom::Run execution result"; Q_ASSERT_X(0, "applyCmd happened", "very bad"); int runResult = ToolCom::run(args, this, FALSE, FALSE); com->write_unsigned(runResult); break; } case createCmd: // invalid creation com->write_id(0); break; case parentCmd: if (this != BrowserView::get_project()) ((BrowserNode *) parent())->write_id(com); else com->write_id(0); break; case childrenCmd: { unsigned v = com->api_format(); unsigned n = 0; Q3ListViewItem * child; for (child = firstChild(); child != 0; child = child->nextSibling()) if (!((BrowserNode *) child)->deletedp() && ((BrowserNode *) child)->api_compatible(v)) n += 1; com->write_unsigned(n); for (child = firstChild(); child != 0; child = child->nextSibling()) if (!((BrowserNode *) child)->deletedp() && ((BrowserNode *) child)->api_compatible(v)) ((BrowserNode *) child)->write_id(com); } break; case getDefCmd: case getUmlDefCmd: case getCppDefCmd: case getJavaDefCmd: case getPhpDefCmd: case getPythonDefCmd: case getIdlDefCmd: get_data()->send_uml_def(com, this, comment); break; case isWritableCmd: com->write_bool(!is_read_only); break; case supportFileCmd: // goes up to the package return ((BrowserNode *) parent())->tool_cmd(com, args); case isOpenCmd: com->write_bool(isOpen()); break; case referencedByCmd: { BrowserNodeList targetof; referenced_by(targetof); // remove duplicats targetof.sort_it(); BrowserNode * bn; targetof.first(); while ((bn = targetof.current()) != 0) if (bn == targetof.next()) targetof.remove(); com->write_unsigned(targetof.count()); for (bn = targetof.first(); bn != 0; bn = targetof.next()) bn->write_id(com); } break; case setCoupleValueCmd: if (is_read_only && !root_permission()) com->write_ack(FALSE); else { set_value(args, args + strlen(args) + 1); package_modified(); get_data()->modified(); com->write_ack(TRUE); } break; case setDescriptionCmd: if (is_read_only && !root_permission()) com->write_ack(FALSE); else { set_comment(args); package_modified(); com->write_ack(TRUE); } break; case setNameCmd: if (is_read_only && !root_permission()) com->write_ack(FALSE); else { if (name != args) { if (((BrowserNode *) parent())->wrong_child_name(args, get_type(), allow_spaces(), allow_empty())) { com->write_ack(FALSE); return TRUE; } else { set_name(args); update_stereotype(); package_modified(); get_data()->modified(); } } com->write_ack(TRUE); } break; case setOpenCmd: BrowserView::select(this); setOpen(*args); com->write_ack(TRUE); break; case setMarkedCmd: if (*args) { if (this == BrowserView::get_project()) com->write_ack(FALSE); else { if (!is_marked) toggle_mark(); com->write_ack(TRUE); } } else { if (is_marked) toggle_mark(); com->write_ack(TRUE); } break; case moveAfterCmd: if (is_read_only && !root_permission()) com->write_ack(FALSE); else { BrowserNode * p = (BrowserNode *) parent(); BrowserNode * after = (BrowserNode *) com->get_id(args); if (after == 0) { if (p == 0) com->write_ack(FALSE); else { p->takeItem(this); p->insertItem(this); com->write_ack(TRUE); p->package_modified(); } } else if ((after->parent() != p) || (after == this)) { com->write_ack(FALSE); } else { moveItem(after); com->write_ack(TRUE); p->package_modified(); } } break; case moveInCmd: // plug-out upgrade, limited checks if (is_read_only && !root_permission()) com->write_ack(FALSE); else { BrowserNode * newparent = (BrowserNode *) com->get_id(args); BrowserNode * oldparent = (BrowserNode *) parent(); if ((newparent == oldparent) || (newparent == this)) { com->write_ack(FALSE); } else { oldparent->takeItem(this); newparent->insertItem(this); com->write_ack(TRUE); oldparent->package_modified(); newparent->package_modified(); } } break; case old_deleteCmd: case deleteCmd: if (is_read_only && !root_permission()) com->write_ack(FALSE); else { delete_it(); ((BrowserNode *) parent())->get_data()->modified(); package_modified(); com->write_ack(TRUE); } break; case applyStereotypeCmd: if (is_read_only && !root_permission()) com->write_ack(FALSE); else { ProfiledStereotypes::applyStereotype(this); // call package_modified() if needed com->write_ack(TRUE); } break; default: return FALSE; } return TRUE; }
void BrowserNode::support_file(Q3Dict<char> & files, bool add) const { for (Q3ListViewItem * child = firstChild(); child != 0; child = child->nextSibling()) ((BrowserNode *) child)->support_file(files, add); }
void CommentNode::render(Context* context, std::ostream* stream) const { assert(!firstChild()); // Do nothing, comment nodes do not render into the output stream. }
RenderObject* RenderObjectChildList::removeChildNode(RenderObject* owner, RenderObject* oldChild, bool fullRemove) { ASSERT(oldChild->parent() == owner); // So that we'll get the appropriate dirty bit set (either that a normal flow child got yanked or // that a positioned child got yanked). We also repaint, so that the area exposed when the child // disappears gets repainted properly. if (!owner->documentBeingDestroyed() && fullRemove && oldChild->m_everHadLayout) { oldChild->setNeedsLayoutAndPrefWidthsRecalc(); oldChild->repaint(); } // If we have a line box wrapper, delete it. if (oldChild->isBox()) toRenderBox(oldChild)->deleteLineBoxWrapper(); if (!owner->documentBeingDestroyed() && fullRemove) { // if we remove visible child from an invisible parent, we don't know the layer visibility any more RenderLayer* layer = 0; if (owner->style()->visibility() != VISIBLE && oldChild->style()->visibility() == VISIBLE && !oldChild->hasLayer()) { layer = owner->enclosingLayer(); layer->dirtyVisibleContentStatus(); } // Keep our layer hierarchy updated. if (oldChild->firstChild() || oldChild->hasLayer()) { if (!layer) layer = owner->enclosingLayer(); oldChild->removeLayers(layer); } if (oldChild->isListItem()) toRenderListItem(oldChild)->updateListMarkerNumbers(); if (oldChild->isPositioned() && owner->childrenInline()) owner->dirtyLinesFromChangedChild(oldChild); } // If oldChild is the start or end of the selection, then clear the selection to // avoid problems of invalid pointers. // FIXME: The SelectionController should be responsible for this when it // is notified of DOM mutations. if (!owner->documentBeingDestroyed() && oldChild->isSelectionBorder()) owner->view()->clearSelection(); // remove the child if (oldChild->previousSibling()) oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); if (oldChild->nextSibling()) oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()); if (firstChild() == oldChild) setFirstChild(oldChild->nextSibling()); if (lastChild() == oldChild) setLastChild(oldChild->previousSibling()); oldChild->setPreviousSibling(0); oldChild->setNextSibling(0); oldChild->setParent(0); if (oldChild->m_hasCounterNodeMap) RenderCounter::destroyCounterNodes(oldChild); if (AXObjectCache::accessibilityEnabled()) owner->document()->axObjectCache()->childrenChanged(owner); return oldChild; }
void RenderContainer::updateBeforeAfterContentForContainer(RenderStyle::PseudoId type, RenderContainer* styledObject) { // In CSS2, before/after pseudo-content cannot nest. Check this first. if (style()->styleType() == RenderStyle::BEFORE || style()->styleType() == RenderStyle::AFTER) return; RenderStyle* pseudoElementStyle = styledObject->getCachedPseudoStyle(type); RenderObject* child = beforeAfterContainer(type); // Whether or not we currently have generated content attached. bool oldContentPresent = child; // Whether or not we now want generated content. bool newContentWanted = pseudoElementStyle && pseudoElementStyle->display() != NONE; // For <q><p/></q>, if this object is the inline continuation of the <q>, we only want to generate // :after content and not :before content. if (newContentWanted && type == RenderStyle::BEFORE && isInlineContinuation()) newContentWanted = false; // Similarly, if we're the beginning of a <q>, and there's an inline continuation for our object, // then we don't generate the :after content. if (newContentWanted && type == RenderStyle::AFTER && isRenderInline() && continuation()) newContentWanted = false; // If we don't want generated content any longer, or if we have generated content, but it's no longer // identical to the new content data we want to build render objects for, then we nuke all // of the old generated content. if (!newContentWanted || (oldContentPresent && !child->style()->contentDataEquivalent(pseudoElementStyle))) { // Nuke the child. if (child && child->style()->styleType() == type) { oldContentPresent = false; child->destroy(); child = (type == RenderStyle::BEFORE) ? m_firstChild : m_lastChild; } } // If we have no pseudo-element style or if the pseudo-element style's display type is NONE, then we // have no generated content and can now return. if (!newContentWanted) return; if (isInlineFlow() && !pseudoElementStyle->isDisplayInlineType() && pseudoElementStyle->floating() == FNONE && !(pseudoElementStyle->position() == AbsolutePosition || pseudoElementStyle->position() == FixedPosition)) // According to the CSS2 spec (the end of section 12.1), the only allowed // display values for the pseudo style are NONE and INLINE for inline flows. // FIXME: CSS2.1 lifted this restriction, but block display types will crash. // For now we at least relax the restriction to allow all inline types like inline-block // and inline-table. pseudoElementStyle->setDisplay(INLINE); if (oldContentPresent) { if (child && child->style()->styleType() == type) { // We have generated content present still. We want to walk this content and update our // style information with the new pseudo-element style. child->setStyle(pseudoElementStyle); // Note that if we ever support additional types of generated content (which should be way off // in the future), this code will need to be patched. for (RenderObject* genChild = child->firstChild(); genChild; genChild = genChild->nextSibling()) { if (genChild->isText()) // Generated text content is a child whose style also needs to be set to the pseudo-element style. genChild->setStyle(pseudoElementStyle); else if (genChild->isImage()) { // Images get an empty style that inherits from the pseudo. RefPtr<RenderStyle> style = RenderStyle::create(); style->inheritFrom(pseudoElementStyle); genChild->setStyle(style.release()); } else // Must be a first-letter container. updateFirstLetter() will take care of it. ASSERT(genChild->style()->styleType() == RenderStyle::FIRST_LETTER); } } return; // We've updated the generated content. That's all we needed to do. } RenderObject* insertBefore = (type == RenderStyle::BEFORE) ? firstChild() : 0; // Generated content consists of a single container that houses multiple children (specified // by the content property). This generated content container gets the pseudo-element style set on it. RenderObject* generatedContentContainer = 0; // Walk our list of generated content and create render objects for each. for (const ContentData* content = pseudoElementStyle->contentData(); content; content = content->m_next) { RenderObject* renderer = 0; switch (content->m_type) { case CONTENT_NONE: break; case CONTENT_TEXT: renderer = new (renderArena()) RenderTextFragment(document() /* anonymous object */, content->m_content.m_text); renderer->setStyle(pseudoElementStyle); break; case CONTENT_OBJECT: { RenderImageGeneratedContent* image = new (renderArena()) RenderImageGeneratedContent(document()); // anonymous object RefPtr<RenderStyle> style = RenderStyle::create(); style->inheritFrom(pseudoElementStyle); image->setStyle(style.release()); if (StyleImage* styleImage = content->m_content.m_image) image->setStyleImage(styleImage); renderer = image; break; } case CONTENT_COUNTER: renderer = new (renderArena()) RenderCounter(document(), *content->m_content.m_counter); renderer->setStyle(pseudoElementStyle); break; } if (renderer) { if (!generatedContentContainer) { // Make a generated box that might be any display type now that we are able to drill down into children // to find the original content properly. generatedContentContainer = RenderObject::createObject(document(), pseudoElementStyle); generatedContentContainer->setStyle(pseudoElementStyle); } generatedContentContainer->addChild(renderer); } } // Add the pseudo after we've installed all our content so that addChild will be able to find the text // inside the inline for e.g., first-letter styling. if (generatedContentContainer) addChild(generatedContentContainer, insertBefore); }
bool QgsWcsCapabilities::parseDescribeCoverageDom10( QByteArray const &xml, QgsWcsCoverageSummary *coverage ) { QgsDebugMsg( "coverage->identifier = " + coverage->identifier ); if ( ! convertToDom( xml ) ) return false; QDomElement docElem = mCapabilitiesDom.documentElement(); QgsDebugMsg( "testing tagName " + docElem.tagName() ); QString tagName = stripNS( docElem.tagName() ); if ( tagName != QLatin1String( "CoverageDescription" ) ) { mErrorTitle = tr( "Dom Exception" ); mErrorFormat = QStringLiteral( "text/plain" ); mError = tr( "Could not get WCS capabilities in the expected format (DTD): no %1 found.\nThis might be due to an incorrect WCS Server URL.\nTag: %3\nResponse was:\n%4" ) .arg( QStringLiteral( "CoverageDescription" ), docElem.tagName(), QString( xml ) ); QgsLogger::debug( "Dom Exception: " + mError ); return false; } QDomElement coverageOfferingElement = firstChild( docElem, QStringLiteral( "CoverageOffering" ) ); if ( coverageOfferingElement.isNull() ) return false; QDomElement supportedCRSsElement = firstChild( coverageOfferingElement, QStringLiteral( "supportedCRSs" ) ); // requestResponseCRSs and requestCRSs + responseCRSs are alternatives // we try to parse one or the other QStringList crsList; crsList = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestResponseCRSs" ) ); if ( crsList.isEmpty() ) { crsList = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.requestCRSs" ) ); crsList << domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedCRSs.responseCRSs" ) ); } // exclude invalid CRSs from the lists for ( const QString &crsid : qgis::as_const( crsList ) ) { if ( QgsCoordinateReferenceSystem::fromOgcWmsCrs( crsid ).isValid() ) { coverage->supportedCrs << crsid; } } // TODO: requestCRSs, responseCRSs - must be then implemented also in provider //QgsDebugMsg( "supportedCrs = " + coverage->supportedCrs.join( "," ) ); coverage->nativeCrs = domElementText( coverageOfferingElement, QStringLiteral( "supportedCRSs.nativeCRSs" ) ); // may be GTiff, GeoTIFF, TIFF, GIF, .... coverage->supportedFormat = domElementsTexts( coverageOfferingElement, QStringLiteral( "supportedFormats.formats" ) ); QgsDebugMsg( "supportedFormat = " + coverage->supportedFormat.join( "," ) ); // spatialDomain and Grid/RectifiedGrid are optional according to specificationi. // If missing, we cannot get native resolution and size. QDomElement gridElement = domElement( coverageOfferingElement, QStringLiteral( "domainSet.spatialDomain.RectifiedGrid" ) ); if ( gridElement.isNull() ) { // Grid has also GridEnvelope from which we can get coverage size but it does not gridElement = domElement( coverageOfferingElement, QStringLiteral( "domainSet.spatialDomain.Grid" ) ); } // If supportedCRSs.nativeCRSs is not defined we try to get it from RectifiedGrid if ( coverage->nativeCrs.isEmpty() ) { QString crs = gridElement.attribute( QStringLiteral( "srsName" ) ); if ( QgsCoordinateReferenceSystem::fromOgcWmsCrs( crs ).isValid() ) { coverage->nativeCrs = crs; } } if ( !gridElement.isNull() ) { QList<int> low = parseInts( domElementText( gridElement, QStringLiteral( "limits.GridEnvelope.low" ) ) ); QList<int> high = parseInts( domElementText( gridElement, QStringLiteral( "limits.GridEnvelope.high" ) ) ); if ( low.size() == 2 && high.size() == 2 ) { // low/high are indexes in grid -> size is height - low + 1 double width = high[0] - low[0] + 1; double height = high[1] - low[1] + 1; if ( width > 0 && height > 0 ) { coverage->width = width; coverage->height = height; coverage->hasSize = true; } } // RectifiedGrid has also gml:origin which we don't need I think (attention however // it should contain gml:Point but mapserver 6.0.3 / WCS 1.0.0 is using gml:pos instead) // RectifiedGrid also contains 2 gml:offsetVector which could be used to get resolution // but it should be sufficient to calc resolution from size // TODO: check if coverage is rotated, in that case probably treat as without size // or recalc resolution from rotated grid to base CRS } QList<QDomElement> envelopeElements = domElements( coverageOfferingElement, QStringLiteral( "domainSet.spatialDomain.Envelope" ) ); QgsDebugMsg( QStringLiteral( "%1 envelopeElements found" ).arg( envelopeElements.size() ) ); const auto constEnvelopeElements = envelopeElements; for ( const QDomElement &el : constEnvelopeElements ) { QString srsName = el.attribute( QStringLiteral( "srsName" ) ); QList<QDomElement> posElements = domElements( el, QStringLiteral( "pos" ) ); if ( posElements.size() != 2 ) { QgsDebugMsg( QStringLiteral( "Wrong number of pos elements" ) ); continue; } QList<double> low = parseDoubles( posElements.value( 0 ).text() ); QList<double> high = parseDoubles( posElements.value( 1 ).text() ); if ( low.size() == 2 && high.size() == 2 ) { QgsRectangle box( low[0], low[1], high[0], high[1] ); coverage->boundingBoxes.insert( srsName, box ); QgsDebugMsg( "Envelope: " + srsName + " : " + box.toString() ); } } coverage->times = domElementsTexts( coverageOfferingElement, QStringLiteral( "domainSet.temporalDomain.timePosition" ) ); QList<QDomElement> timePeriodElements = domElements( coverageOfferingElement, QStringLiteral( "domainSet.temporalDomain.timePeriod" ) ); QgsDebugMsg( QStringLiteral( "%1 timePeriod found" ).arg( timePeriodElements.size() ) ); const auto constTimePeriodElements = timePeriodElements; for ( const QDomElement &el : constTimePeriodElements ) { QString beginPosition = domElementText( el, QStringLiteral( "beginPosition" ) ); QString endPosition = domElementText( el, QStringLiteral( "endPosition" ) ); QString timeResolution = domElementText( el, QStringLiteral( "timeResolution" ) ); // Format used in request QString time = beginPosition + '/' + endPosition; if ( !timeResolution.isEmpty() ) { time += '/' + timeResolution; } coverage->times << time; } // Find native bounding box if ( !coverage->nativeCrs.isEmpty() ) { const auto boundingBoxes = coverage->boundingBoxes; for ( auto it = boundingBoxes.constBegin(); it != boundingBoxes.constEnd(); ++it ) { if ( it.key() == coverage->nativeCrs ) { coverage->nativeBoundingBox = it.value(); } } } // NULL / no data values // TODO: handle multiple range sets Q_FOREACH ( const QString &text, domElementsTexts( coverageOfferingElement, "rangeSet.RangeSet.nullValue.singleValue" ) ) { bool ok; double val = text.toDouble( &ok ); if ( ok ) { coverage->nullValues.append( val ); } } coverage->described = true; return true; }
void SVGRootInlineBox::markDirty() { for (InlineBox* child = firstChild(); child; child = child->nextOnLine()) child->markDirty(); RootInlineBox::markDirty(); }
void ModuleTreeView::makeSelected(ConfigModule *module) { ModuleTreeItem *item = static_cast<ModuleTreeItem*>(firstChild()); updateItem(item, module); }
void Hdf::get(hphp_string_imap<std::string> &values) const { values.clear(); for (Hdf hdf = firstChild(); hdf.exists(); hdf = hdf.next()) { values[hdf.getName()] = hdf.getString(""); } }
void Hdf::get(std::set<std::string> &values) const { values.clear(); for (Hdf hdf = firstChild(); hdf.exists(); hdf = hdf.next()) { values.insert(hdf.getString("")); } }
void Hdf::get(std::vector<std::string> &values) const { values.clear(); for (Hdf hdf = firstChild(); hdf.exists(); hdf = hdf.next()) { values.push_back(hdf.getString("")); } }
void RenderSVGContainer::paint(PaintInfo& paintInfo, int parentX, int parentY) { if (paintInfo.context->paintingDisabled()) return; // This should only exist for <svg> renderers if (hasBoxDecorations() && (paintInfo.phase == PaintPhaseForeground || paintInfo.phase == PaintPhaseSelection)) paintBoxDecorations(paintInfo, m_x + parentX, m_y + parentY); if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth() && style()->visibility() == VISIBLE) paintOutline(paintInfo.context, parentX, parentY, width(), height(), style()); if (paintInfo.phase != PaintPhaseForeground || !drawsContents()) return; const SVGRenderStyle* svgStyle = style()->svgStyle(); AtomicString filterId(SVGURIReference::getTarget(svgStyle->filter())); #if ENABLE(SVG_EXPERIMENTAL_FEATURES) SVGResourceFilter* filter = getFilterById(document(), filterId); #endif if (!firstChild() #if ENABLE(SVG_EXPERIMENTAL_FEATURES) && !filter #endif ) return; // Spec: groups w/o children still may render filter content. paintInfo.context->save(); if (!parent()->isSVGContainer()) { // Translate from parent offsets (html renderers) to a relative transform (svg renderers) IntPoint origin; origin.move(parentX, parentY); origin.move(m_x, m_y); origin.move(borderLeft(), borderTop()); origin.move(paddingLeft(), paddingTop()); if (origin.x() || origin.y()) { paintInfo.context->concatCTM(AffineTransform().translate(origin.x(), origin.y())); paintInfo.rect.move(-origin.x(), -origin.y()); } parentX = parentY = 0; SVGSVGElement* svg = static_cast<SVGSVGElement*>(element()); paintInfo.context->concatCTM(AffineTransform().scale(svg->currentScale())); } else { // Only the root <svg> element should need any translations using the HTML/CSS system // parentX, parentY are also non-zero for first-level kids of these // CSS-transformed <svg> root-elements (due to RenderBox::paint) for any other element // they should be 0. m_x, m_y should always be 0 for non-root svg containers ASSERT(m_x == 0); ASSERT(m_y == 0); } if (!viewport().isEmpty()) { if (style()->overflowX() != OVISIBLE) paintInfo.context->clip(enclosingIntRect(viewport())); // FIXME: Eventually we'll want float-precision clipping paintInfo.context->concatCTM(AffineTransform().translate(viewport().x(), viewport().y())); } if (!localTransform().isIdentity()) paintInfo.context->concatCTM(localTransform()); if (!parent()->isSVGContainer()) { SVGSVGElement* svg = static_cast<SVGSVGElement*>(element()); paintInfo.context->concatCTM(AffineTransform().translate(svg->currentTranslate().x(), svg->currentTranslate().y())); } FloatRect strokeBBox = relativeBBox(true); SVGElement* svgElement = static_cast<SVGElement*>(element()); ASSERT(svgElement && svgElement->document() && svgElement->isStyled()); SVGStyledElement* styledElement = static_cast<SVGStyledElement*>(svgElement); AtomicString clipperId(SVGURIReference::getTarget(svgStyle->clipPath())); AtomicString maskerId(SVGURIReference::getTarget(svgStyle->maskElement())); SVGResourceClipper* clipper = getClipperById(document(), clipperId); SVGResourceMasker* masker = getMaskerById(document(), maskerId); if (clipper) { clipper->addClient(styledElement); clipper->applyClip(paintInfo.context, strokeBBox); } else if (!clipperId.isEmpty()) svgElement->document()->accessSVGExtensions()->addPendingResource(clipperId, styledElement); if (masker) { masker->addClient(styledElement); masker->applyMask(paintInfo.context, strokeBBox); } else if (!maskerId.isEmpty()) svgElement->document()->accessSVGExtensions()->addPendingResource(maskerId, styledElement); float opacity = style()->opacity(); if (opacity < 1.0f) { paintInfo.context->clip(enclosingIntRect(strokeBBox)); paintInfo.context->beginTransparencyLayer(opacity); } #if ENABLE(SVG_EXPERIMENTAL_FEATURES) if (filter) filter->prepareFilter(paintInfo.context, strokeBBox); else if (!filterId.isEmpty()) svgElement->document()->accessSVGExtensions()->addPendingResource(filterId, styledElement); #endif if (!viewBox().isEmpty()) paintInfo.context->concatCTM(viewportTransform()); RenderContainer::paint(paintInfo, 0, 0); #if ENABLE(SVG_EXPERIMENTAL_FEATURES) if (filter) filter->applyFilter(paintInfo.context, strokeBBox); #endif if (opacity < 1.0f) paintInfo.context->endTransparencyLayer(); paintInfo.context->restore(); }
KonqSidebarTree::KonqSidebarTree( KonqSidebarOldTreeModule *parent, QWidget *parentWidget, ModuleType moduleType, const QString& path ) : K3ListView( parentWidget ), m_currentTopLevelItem( 0 ), m_scrollingLocked( false ), m_collection( 0 ) { d = new KonqSidebarTree_Internal; d->m_dropMode = SidebarTreeMode; loadModuleFactories(); setAcceptDrops( true ); viewport()->setAcceptDrops( true ); installEventFilter(this); m_lstModules.setAutoDelete( true ); setSelectionMode( Q3ListView::Single ); setDragEnabled(true); m_sidebarModule = parent; m_animationTimer = new QTimer( this ); connect( m_animationTimer, SIGNAL(timeout()), this, SLOT(slotAnimation()) ); m_currentBeforeDropItem = 0; m_dropItem = 0; m_bOpeningFirstChild=false; addColumn( QString() ); header()->hide(); setTreeStepSize(15); m_autoOpenTimer = new QTimer( this ); connect( m_autoOpenTimer, SIGNAL(timeout()), this, SLOT(slotAutoOpenFolder()) ); connect( this, SIGNAL(doubleClicked(Q3ListViewItem*)), this, SLOT(slotDoubleClicked(Q3ListViewItem*)) ); connect( this, SIGNAL(mouseButtonPressed(int,Q3ListViewItem*,QPoint,int)), this, SLOT(slotMouseButtonPressed(int,Q3ListViewItem*,QPoint,int)) ); connect( this, SIGNAL(mouseButtonClicked(int,Q3ListViewItem*,QPoint,int)), this, SLOT(slotMouseButtonClicked(int,Q3ListViewItem*,QPoint,int)) ); connect( this, SIGNAL(returnPressed(Q3ListViewItem*)), this, SLOT(slotDoubleClicked(Q3ListViewItem*)) ); connect( this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()) ); connect(qApp->clipboard(), SIGNAL(dataChanged()), this, SLOT(slotSelectionChanged())); // so that "paste" can be updated connect( this, SIGNAL(itemRenamed(Q3ListViewItem*,QString,int)), this, SLOT(slotItemRenamed(Q3ListViewItem*,QString,int))); if (moduleType == VIRT_Folder) { m_dirtreeDir.dir.setPath(KGlobal::dirs()->saveLocation("data","konqsidebartng/virtual_folders/"+path+'/')); m_dirtreeDir.relDir = path; } else { m_dirtreeDir.dir.setPath( path ); } kDebug(1201) << m_dirtreeDir.dir.path(); m_dirtreeDir.type = moduleType; // Initial parsing rescanConfiguration(); if (firstChild()) { m_bOpeningFirstChild = true; firstChild()->setOpen(true); m_bOpeningFirstChild = false; } OrgKdeKDirNotifyInterface *kdirnotify = new OrgKdeKDirNotifyInterface(QString(), QString(), QDBusConnection::sessionBus()); kdirnotify->setParent(this); connect(kdirnotify, SIGNAL(FilesAdded(QString)), SLOT(slotFilesAdded(QString))); connect(kdirnotify, SIGNAL(FilesChanged(QStringList)), SLOT(slotFilesChanged(QStringList))); connect(kdirnotify, SIGNAL(FilesRemoved(QStringList)), SLOT(slotFilesRemoved(QStringList))); m_collection = new KActionCollection(this); m_collection->addAssociatedWidget(this); m_collection->setObjectName( QLatin1String("bookmark actions" )); QAction *action = new KAction(KIcon("folder-new"), i18n("&Create New Folder..."), this); m_collection->addAction("create_folder", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotCreateFolder())); action = new KAction(KIcon("edit-delete"), i18n("Delete Folder"), this); m_collection->addAction("delete", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotDelete())); action = new KAction(KIcon("user-trash"), i18n("Move to Trash"), this); m_collection->addAction("trash", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotTrash())); action = new KAction(i18n("Rename"), this); action->setIcon(KIcon("edit-rename")); m_collection->addAction("rename", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotRename())); action = new KAction(KIcon("edit-delete"), i18n("Delete Link"), this); m_collection->addAction("delete_link", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotDelete())); action = new KAction(KIcon("document-properties"), i18n("Properties"), this); m_collection->addAction("item_properties", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotProperties())); action = new KAction(KIcon("window-new"), i18n("Open in New Window"), this); m_collection->addAction("open_window", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotOpenNewWindow())); action = new KAction(KIcon("tab-new"), i18n("Open in New Tab"), this); m_collection->addAction("open_tab", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotOpenTab())); action = new KAction(KIcon("edit-copy"), i18n("Copy Link Address"), this); m_collection->addAction("copy_location", action); connect(action, SIGNAL(triggered(bool)), SLOT(slotCopyLocation())); }
Element* fallbackSummary() { ASSERT(firstChild() && firstChild()->hasTagName(summaryTag)); return toElement(firstChild()); }
CNodeData* CNodeData::firstChild(unsigned long uIndex)const { char szIndex[25]; sprintf(szIndex, "[%d]", uIndex); return firstChild(szIndex); }
void RenderObjectChildList::destroyLeftoverChildren() { while (firstChild()) { if (firstChild()->isListMarker() || (firstChild()->style()->styleType() == FIRST_LETTER && !firstChild()->isText())) firstChild()->remove(); // List markers are owned by their enclosing list and so don't get destroyed by this container. Similarly, first letters are destroyed by their remaining text fragment. else if (firstChild()->isRunIn() && firstChild()->node()) { firstChild()->node()->setRenderer(0); firstChild()->node()->setNeedsStyleRecalc(); firstChild()->destroy(); } else { // Destroy any anonymous children remaining in the render tree, as well as implicit (shadow) DOM elements like those used in the engine-based text fields. if (firstChild()->node()) firstChild()->node()->setRenderer(0); firstChild()->destroy(); } } }
RenderRubyText* RenderRubyRun::rubyText() const { RenderObject* child = firstChild(); return child && child->isRubyText() ? static_cast<RenderRubyText*>(child) : 0; }
void toResultStorage::updateList(void) { setSortingEnabled(false); // enable it after data fetch clear(); if (!OnlyFiles) { for (QStringList::iterator j = TablespaceValues.begin(); j != TablespaceValues.end();) { toResultStorageItem *tablespace = new toResultStorageItem(AvailableGraph, this, NULL); for (int i = 0; i < COLUMNS && j != TablespaceValues.end(); i++, j++) { if (i == COL_USED_FREE_AUTO) continue; tablespace->setText(i, *j); tablespace->setSortValue(i, *j); } // To fill Used/Free/Autoextend column double total = tablespace->text(COL_FREE_PERCENT).toDouble(); double user = tablespace->text(COL_SIZE).toDouble(); double free = tablespace->text(COL_FREE_UNIT).toDouble(); if (total < user ) total = user; user /= total; free /= total; QString t; // t.sprintf("%05.1f / %05.1f / %05.1f%%", (user-free)*100, free*100, (1 - user)*100); // spaces seems better than 0-filling... t.sprintf("%#5.1f / %#5.1f / %#5.1f%%", (user - free) * 100, free * 100, (1 - user) * 100); tablespace->setText(COL_USED_FREE_AUTO, t); tablespace->setSortValue(COL_USED_FREE_AUTO, (user - free) * 100); // end of Used/Free/Autoextend column if (CurrentSpace == tablespace->text(0)) { if (CurrentFile.isEmpty()) tablespace->setSelected(true); } } } for (QStringList::iterator k = FileValues.begin(); k != FileValues.end();) { QString name = *k; k++; toTreeWidgetItem *file; toTreeWidgetItem *tablespace = NULL; if (OnlyFiles) { file = new toResultStorageItem(AvailableGraph, this, NULL); } else { for (tablespace = firstChild(); tablespace && tablespace->text(0) != name; tablespace = tablespace->nextSibling()) ; if (!tablespace) { if (Files) break; } file = new toResultStorageItem(AvailableGraph, tablespace, NULL); } for (int i = 0; i < FILECOLUMNS && k != FileValues.end(); i++, k++) { file->setText(i, *k); reinterpret_cast<toResultStorageItem*>(file)->setSortValue(i, *k); } file->setText(COLUMNS, name); reinterpret_cast<toResultStorageItem*>(file)->setSortValue(COLUMNS, name); if (CurrentSpace == file->text(COLUMNS) && CurrentFile == file->text(0)) { if (tablespace) tablespace->setOpen(true); setSelected(file, true); } } setSortingEnabled(true); }
FrameTree::~FrameTree() { for (Frame* child = firstChild(); child; child = child->tree().nextSibling()) child->setView(nullptr); }
void BrowserNode::renumber(int phase) { for (Q3ListViewItem * child = firstChild(); child != 0; child = child->nextSibling()) ((BrowserNode *) child)->renumber(phase); }
void RenderSVGText::layout() { StackStats::LayoutCheckPoint layoutCheckPoint; ASSERT(needsLayout()); LayoutRepainter repainter(*this, SVGRenderSupport::checkForSVGRepaintDuringLayout(*this)); bool updateCachedBoundariesInParents = false; if (m_needsTransformUpdate) { m_localTransform = textElement().animatedLocalTransform(); m_needsTransformUpdate = false; updateCachedBoundariesInParents = true; } if (!everHadLayout()) { // When laying out initially, collect all layout attributes, build the character data map, // and propogate resulting SVGLayoutAttributes to all RenderSVGInlineText children in the subtree. ASSERT(m_layoutAttributes.isEmpty()); collectLayoutAttributes(this, m_layoutAttributes); updateFontInAllDescendants(this); m_layoutAttributesBuilder.buildLayoutAttributesForForSubtree(*this); m_needsReordering = true; m_needsTextMetricsUpdate = false; m_needsPositioningValuesUpdate = false; updateCachedBoundariesInParents = true; } else if (m_needsPositioningValuesUpdate) { // When the x/y/dx/dy/rotate lists change, recompute the layout attributes, and eventually // update the on-screen font objects as well in all descendants. if (m_needsTextMetricsUpdate) { updateFontInAllDescendants(this); m_needsTextMetricsUpdate = false; } m_layoutAttributesBuilder.buildLayoutAttributesForForSubtree(*this); m_needsReordering = true; m_needsPositioningValuesUpdate = false; updateCachedBoundariesInParents = true; } else if (m_needsTextMetricsUpdate || SVGRenderSupport::findTreeRootObject(*this)->isLayoutSizeChanged()) { // If the root layout size changed (eg. window size changes) or the transform to the root // context has changed then recompute the on-screen font size. updateFontInAllDescendants(this, &m_layoutAttributesBuilder); ASSERT(!m_needsReordering); ASSERT(!m_needsPositioningValuesUpdate); m_needsTextMetricsUpdate = false; updateCachedBoundariesInParents = true; } checkLayoutAttributesConsistency(this, m_layoutAttributes); // Reduced version of RenderBlock::layoutBlock(), which only takes care of SVG text. // All if branches that could cause early exit in RenderBlocks layoutBlock() method are turned into assertions. ASSERT(!isInline()); ASSERT(!simplifiedLayout()); ASSERT(!scrollsOverflow()); ASSERT(!hasControlClip()); ASSERT(!multiColumnFlowThread()); ASSERT(!positionedObjects()); ASSERT(!m_overflow); ASSERT(!isAnonymousBlock()); if (!firstChild()) setChildrenInline(true); // FIXME: We need to find a way to only layout the child boxes, if needed. FloatRect oldBoundaries = objectBoundingBox(); ASSERT(childrenInline()); LayoutUnit repaintLogicalTop = 0; LayoutUnit repaintLogicalBottom = 0; rebuildFloatingObjectSetFromIntrudingFloats(); layoutInlineChildren(true, repaintLogicalTop, repaintLogicalBottom); if (m_needsReordering) m_needsReordering = false; if (!updateCachedBoundariesInParents) updateCachedBoundariesInParents = oldBoundaries != objectBoundingBox(); // Invalidate all resources of this client if our layout changed. if (everHadLayout() && selfNeedsLayout()) SVGResourcesCache::clientLayoutChanged(*this); // If our bounds changed, notify the parents. if (updateCachedBoundariesInParents) RenderSVGBlock::setNeedsBoundariesUpdate(); repainter.repaintAfterLayout(); clearNeedsLayout(); }
bool BrowserNode::delete_internal(QString & warning) { if (deletedp()) return TRUE; if (!is_writable() && !root_permission() && !is_from_lib()) { warning += "\n " + TR("%1 is read-only", full_name()); return FALSE; } static Q3PtrList<BrowserNode> targetof; static bool made = FALSE; bool made_here; if (!made) { made = TRUE; made_here = TRUE; referenced_by(targetof, TRUE); } else made_here = FALSE; bool ro = FALSE; if (!root_permission()) { Q3PtrListIterator<BrowserNode> it(targetof); BrowserNode * r; while ((r = it.current()) != 0) { if (!r->is_writable() && !r->is_from_lib()) { ro = TRUE; warning += "\n "; switch (r->get_type()) { case UmlComponent: warning += TR("%1 referenced by the read-only component %2", full_name(), r->full_name()); break; case UmlArtifact: warning += TR("%1 referenced by the read-only artifact %2", full_name(), r->full_name()); break; default: warning += TR("%1 is the target of the read-only relation %2", full_name(), r->full_name()); break; } } ++it; } } if (made_here) { made = FALSE; targetof.clear(); } if (ro) return FALSE; // sub elts Q3ListViewItem * child; bool ok = TRUE; for (child = firstChild(); child != 0; child = child->nextSibling()) ok &= ((BrowserNode *) child)->delete_internal(warning); if (ok) { is_deleted = TRUE; if (is_marked) { marked_list.removeRef(this); is_marked = FALSE; } get_data()->delete_it(); repaint(); package_modified(); } return ok; }
void RenderObjectChildList::insertChildNode(RenderObject* owner, RenderObject* child, RenderObject* beforeChild, bool fullInsert) { if (!beforeChild) { appendChildNode(owner, child, fullInsert); return; } ASSERT(!child->parent()); while (beforeChild->parent() != owner && beforeChild->parent()->isAnonymousBlock()) beforeChild = beforeChild->parent(); ASSERT(beforeChild->parent() == owner); ASSERT(!owner->isBlockFlow() || (!child->isTableSection() && !child->isTableRow() && !child->isTableCell())); if (beforeChild == firstChild()) setFirstChild(child); RenderObject* prev = beforeChild->previousSibling(); child->setNextSibling(beforeChild); beforeChild->setPreviousSibling(child); if (prev) prev->setNextSibling(child); child->setPreviousSibling(prev); child->setParent(owner); if (fullInsert) { // Keep our layer hierarchy updated. Optimize for the common case where we don't have any children // and don't have a layer attached to ourselves. RenderLayer* layer = 0; if (child->firstChild() || child->hasLayer()) { layer = owner->enclosingLayer(); child->addLayers(layer); } // if the new child is visible but this object was not, tell the layer it has some visible content // that needs to be drawn and layer visibility optimization can't be used if (owner->style()->visibility() != VISIBLE && child->style()->visibility() == VISIBLE && !child->hasLayer()) { if (!layer) layer = owner->enclosingLayer(); if (layer) layer->setHasVisibleContent(true); } if (child->isListItem()) toRenderListItem(child)->updateListMarkerNumbers(); if (!child->isFloating() && owner->childrenInline()) owner->dirtyLinesFromChangedChild(child); if (child->isRenderRegion()) toRenderRegion(child)->attachRegion(); if (RenderNamedFlowThread* containerFlowThread = renderNamedFlowThreadContainer(owner)) containerFlowThread->addFlowChild(child, beforeChild); } RenderCounter::rendererSubtreeAttached(child); RenderQuote::rendererSubtreeAttached(child); child->setNeedsLayoutAndPrefWidthsRecalc(); if (!owner->normalChildNeedsLayout()) owner->setChildNeedsLayout(true); // We may supply the static position for an absolute positioned child. if (AXObjectCache::accessibilityEnabled()) owner->document()->axObjectCache()->childrenChanged(owner); }
QStringList TreeItem::layout() { QStringList layout = extractLayout(static_cast<TreeItem*>(firstChild())); _layoutDirty = false; return layout; }
RenderObject* RenderObjectChildList::removeChildNode(RenderObject* owner, RenderObject* oldChild, bool fullRemove) { ASSERT(oldChild->parent() == owner); // So that we'll get the appropriate dirty bit set (either that a normal flow child got yanked or // that a positioned child got yanked). We also repaint, so that the area exposed when the child // disappears gets repainted properly. if (!owner->documentBeingDestroyed() && fullRemove && oldChild->everHadLayout()) { oldChild->setNeedsLayoutAndPrefWidthsRecalc(); if (oldChild->isBody()) owner->view()->repaint(); else oldChild->repaint(); } // If we have a line box wrapper, delete it. if (oldChild->isBox()) toRenderBox(oldChild)->deleteLineBoxWrapper(); if (!owner->documentBeingDestroyed() && fullRemove) { // if we remove visible child from an invisible parent, we don't know the layer visibility any more RenderLayer* layer = 0; if (owner->style()->visibility() != VISIBLE && oldChild->style()->visibility() == VISIBLE && !oldChild->hasLayer()) { if ((layer = owner->enclosingLayer())) layer->dirtyVisibleContentStatus(); } // Keep our layer hierarchy updated. if (oldChild->firstChild() || oldChild->hasLayer()) { if (!layer) layer = owner->enclosingLayer(); oldChild->removeLayers(layer); } if (oldChild->isListItem()) toRenderListItem(oldChild)->updateListMarkerNumbers(); if (oldChild->isPositioned() && owner->childrenInline()) owner->dirtyLinesFromChangedChild(oldChild); if (oldChild->isRenderRegion()) toRenderRegion(oldChild)->detachRegion(); if (oldChild->inRenderFlowThread() && oldChild->isBox()) { oldChild->enclosingRenderFlowThread()->removeRenderBoxRegionInfo(toRenderBox(oldChild)); if (oldChild->canHaveRegionStyle()) oldChild->enclosingRenderFlowThread()->clearRenderBoxCustomStyle(toRenderBox(oldChild)); } if (RenderNamedFlowThread* containerFlowThread = renderNamedFlowThreadContainer(owner)) containerFlowThread->removeFlowChild(oldChild); #if ENABLE(SVG) // Update cached boundaries in SVG renderers, if a child is removed. owner->setNeedsBoundariesUpdate(); #endif } // If oldChild is the start or end of the selection, then clear the selection to // avoid problems of invalid pointers. // FIXME: The FrameSelection should be responsible for this when it // is notified of DOM mutations. if (!owner->documentBeingDestroyed() && oldChild->isSelectionBorder()) owner->view()->clearSelection(); // remove the child if (oldChild->previousSibling()) oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); if (oldChild->nextSibling()) oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()); if (firstChild() == oldChild) setFirstChild(oldChild->nextSibling()); if (lastChild() == oldChild) setLastChild(oldChild->previousSibling()); oldChild->setPreviousSibling(0); oldChild->setNextSibling(0); oldChild->setParent(0); RenderCounter::rendererRemovedFromTree(oldChild); RenderQuote::rendererRemovedFromTree(oldChild); if (AXObjectCache::accessibilityEnabled()) owner->document()->axObjectCache()->childrenChanged(owner); return oldChild; }
void RenderRubyAsBlock::addChild(RenderObject* child, RenderObject* beforeChild) { // Insert :before and :after content before/after the RenderRubyRun(s) if (child->isBeforeContent()) { if (child->isInline()) { // Add generated inline content normally RenderBlock::addChild(child, firstChild()); } else { // Wrap non-inline content with an anonymous inline-block. RenderBlock* beforeBlock = rubyBeforeBlock(this); if (!beforeBlock) { beforeBlock = createAnonymousRubyInlineBlock(this); RenderBlock::addChild(beforeBlock, firstChild()); } beforeBlock->addChild(child); } return; } if (child->isAfterContent()) { if (child->isInline()) { // Add generated inline content normally RenderBlock::addChild(child); } else { // Wrap non-inline content with an anonymous inline-block. RenderBlock* afterBlock = rubyAfterBlock(this); if (!afterBlock) { afterBlock = createAnonymousRubyInlineBlock(this); RenderBlock::addChild(afterBlock); } afterBlock->addChild(child); } return; } // If the child is a ruby run, just add it normally. if (child->isRubyRun()) { RenderBlock::addChild(child, beforeChild); return; } if (beforeChild && !isAfterContent(beforeChild)) { // insert child into run ASSERT(!beforeChild->isRubyRun()); RenderObject* run = beforeChild; while (run && !run->isRubyRun()) run = run->parent(); if (run) { run->addChild(child, beforeChild); return; } ASSERT_NOT_REACHED(); // beforeChild should always have a run as parent! // Emergency fallback: fall through and just append. } // If the new child would be appended, try to add the child to the previous run // if possible, or create a new run otherwise. // (The RenderRubyRun object will handle the details) RenderRubyRun* lastRun = lastRubyRun(this); if (!lastRun || lastRun->hasRubyText()) { lastRun = RenderRubyRun::staticCreateRubyRun(this); RenderBlock::addChild(lastRun, beforeChild); } lastRun->addChild(child); }
// FIXME: This function should not deal with url or serviceType! void HTMLObjectElement::parametersForPlugin(Vector<String>& paramNames, Vector<String>& paramValues, String& url, String& serviceType) { HashSet<StringImpl*, CaseFoldingHash> uniqueParamNames; String urlParameter; // Scan the PARAM children and store their name/value pairs. // Get the URL and type from the params if we don't already have them. for (Node* child = firstChild(); child; child = child->nextSibling()) { if (!child->hasTagName(paramTag)) continue; HTMLParamElement* p = static_cast<HTMLParamElement*>(child); String name = p->name(); if (name.isEmpty()) continue; uniqueParamNames.add(name.impl()); paramNames.append(p->name()); paramValues.append(p->value()); // FIXME: url adjustment does not belong in this function. if (url.isEmpty() && urlParameter.isEmpty() && (equalIgnoringCase(name, "src") || equalIgnoringCase(name, "movie") || equalIgnoringCase(name, "code") || equalIgnoringCase(name, "url"))) urlParameter = stripLeadingAndTrailingHTMLSpaces(p->value()); // FIXME: serviceType calculation does not belong in this function. if (serviceType.isEmpty() && equalIgnoringCase(name, "type")) { serviceType = p->value(); size_t pos = serviceType.find(";"); if (pos != notFound) serviceType = serviceType.left(pos); } } // When OBJECT is used for an applet via Sun's Java plugin, the CODEBASE attribute in the tag // points to the Java plugin itself (an ActiveX component) while the actual applet CODEBASE is // in a PARAM tag. See <http://java.sun.com/products/plugin/1.2/docs/tags.html>. This means // we have to explicitly suppress the tag's CODEBASE attribute if there is none in a PARAM, // else our Java plugin will misinterpret it. [4004531] String codebase; if (MIMETypeRegistry::isJavaAppletMIMEType(serviceType)) { codebase = "codebase"; uniqueParamNames.add(codebase.impl()); // pretend we found it in a PARAM already } // Turn the attributes of the <object> element into arrays, but don't override <param> values. if (hasAttributes()) { for (unsigned i = 0; i < attributeCount(); ++i) { const Attribute* attribute = attributeItem(i); const AtomicString& name = attribute->name().localName(); if (!uniqueParamNames.contains(name.impl())) { paramNames.append(name.string()); paramValues.append(attribute->value().string()); } } } mapDataParamToSrc(¶mNames, ¶mValues); // HTML5 says that an object resource's URL is specified by the object's data // attribute, not by a param element. However, for compatibility, allow the // resource's URL to be given by a param named "src", "movie", "code" or "url" // if we know that resource points to a plug-in. if (url.isEmpty() && !urlParameter.isEmpty()) { SubframeLoader* loader = document()->frame()->loader()->subframeLoader(); if (loader->resourceWillUsePlugin(urlParameter, serviceType, shouldPreferPlugInsForImages())) url = urlParameter; } }