static void addMimeTypesForFormat(ListHashSet<String>& results, const FORMATETC& format) { // URL and Text are provided for compatibility with IE's model if (format.cfFormat == urlFormat()->cfFormat || format.cfFormat == urlWFormat()->cfFormat) { results.add("URL"); results.add("text/uri-list"); } if (format.cfFormat == plainTextWFormat()->cfFormat || format.cfFormat == plainTextFormat()->cfFormat) { results.add("Text"); results.add("text/plain"); } }
// success of certificates extraction bool pemData(X509_STORE_CTX* ctx, ListHashSet<String>& certificates) { bool ok = true; STACK_OF(X509)* certs = X509_STORE_CTX_get1_chain(ctx); for (int i = 0; i < sk_X509_num(certs); i++) { X509* uCert = sk_X509_value(certs, i); BIO* bio = BIO_new(BIO_s_mem()); int res = PEM_write_bio_X509(bio, uCert); if (!res) { ok = false; BIO_free(bio); break; } unsigned char* certificateData; long length = BIO_get_mem_data(bio, &certificateData); if (length < 0) { ok = false; BIO_free(bio); break; } certificateData[length] = '\0'; String certificate = certificateData; certificates.add(certificate); BIO_free(bio); } sk_X509_pop_free(certs, X509_free); return ok; }
ListHashSet<String> DataObject::types() const { ListHashSet<String> results; bool containsFiles = false; for (size_t i = 0; i < m_itemList.size(); ++i) { switch (m_itemList[i]->kind()) { case DataObjectItem::StringKind: results.add(m_itemList[i]->type()); break; case DataObjectItem::FileKind: containsFiles = true; break; } } if (containsFiles) results.add(mimeTypeFiles); return results; }
void StyledElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const { auto* inlineStyle = this->inlineStyle(); if (!inlineStyle) return; inlineStyle->traverseSubresources([&] (auto& resource) { urls.add(resource.url()); return false; }); }
static ListHashSet<ContainerNode*> findRenderingRoots(const Style::Update& update) { ListHashSet<ContainerNode*> renderingRoots; for (auto* root : update.roots()) { auto* renderingRoot = findRenderingRoot(*root); if (!renderingRoot) continue; renderingRoots.add(renderingRoot); } return renderingRoots; }
ListHashSet<String> ClipboardGtk::types() const { if (policy() != ClipboardReadable && policy() != ClipboardTypesReadable) return ListHashSet<String>(); if (m_clipboard) PasteboardHelper::defaultPasteboardHelper()->getClipboardContents(m_clipboard); ListHashSet<String> types; if (m_dataObject->hasText()) { types.add("text/plain"); types.add("Text"); types.add("text"); } if (m_dataObject->hasMarkup()) types.add("text/html"); if (m_dataObject->hasURIList()) { types.add("text/uri-list"); types.add("URL"); } if (m_dataObject->hasFilenames()) types.add("Files"); return types; }
ListHashSet<String> Pasteboard::types() { if (m_gtkClipboard) PasteboardHelper::defaultPasteboardHelper()->getClipboardContents(m_gtkClipboard); ListHashSet<String> types; if (m_dataObject->hasText()) { types.add("text/plain"); types.add("Text"); types.add("text"); } if (m_dataObject->hasMarkup()) types.add("text/html"); if (m_dataObject->hasURIList()) { types.add("text/uri-list"); types.add("URL"); } if (m_dataObject->hasFilenames()) types.add("Files"); return types; }
PassRefPtr<DataObject> DataObject::createFromPasteboard(PasteMode pasteMode) { RefPtr<DataObject> dataObject = create(); blink::WebClipboard::Buffer buffer = Pasteboard::generalPasteboard()->buffer(); uint64_t sequenceNumber = blink::Platform::current()->clipboard()->sequenceNumber(buffer); bool ignored; blink::WebVector<blink::WebString> webTypes = blink::Platform::current()->clipboard()->readAvailableTypes(buffer, &ignored); ListHashSet<String> types; for (size_t i = 0; i < webTypes.size(); ++i) types.add(webTypes[i]); for (ListHashSet<String>::const_iterator it = types.begin(); it != types.end(); ++it) { if (pasteMode == PlainTextOnly && *it != mimeTypeTextPlain) continue; dataObject->m_itemList.append(DataObjectItem::createFromPasteboard(*it, sequenceNumber)); } return dataObject.release(); }
void InspectorPageAgent::getCookies(ErrorString*, RefPtr<InspectorArray>* cookies, WTF::String* cookiesString) { // If we can get raw cookies. ListHashSet<Cookie> rawCookiesList; // If we can't get raw cookies - fall back to String representation String stringCookiesList; // Return value to getRawCookies should be the same for every call because // the return value is platform/network backend specific, and the call will // always return the same true/false value. bool rawCookiesImplemented = false; for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext(mainFrame())) { Document* document = frame->document(); Vector<CachedResource*> allResources = cachedResourcesForFrame(frame); for (Vector<CachedResource*>::const_iterator it = allResources.begin(); it != allResources.end(); ++it) { Vector<Cookie> docCookiesList; rawCookiesImplemented = getRawCookies(document, KURL(ParsedURLString, (*it)->url()), docCookiesList); if (!rawCookiesImplemented) { // FIXME: We need duplication checking for the String representation of cookies. ExceptionCode ec = 0; stringCookiesList += document->cookie(ec); // Exceptions are thrown by cookie() in sandboxed frames. That won't happen here // because "document" is the document of the main frame of the page. ASSERT(!ec); } else { int cookiesSize = docCookiesList.size(); for (int i = 0; i < cookiesSize; i++) { if (!rawCookiesList.contains(docCookiesList[i])) rawCookiesList.add(docCookiesList[i]); } } } } if (rawCookiesImplemented) *cookies = buildArrayForCookies(rawCookiesList); else *cookiesString = stringCookiesList; }
void HTMLLinkElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const { HTMLElement::addSubresourceAttributeURLs(urls); // Favicons are handled by a special case in LegacyWebArchive::create() if (m_relAttribute.iconType) return; if (!m_relAttribute.isStyleSheet) return; // Append the URL of this link element. addSubresourceURL(urls, href()); if (auto* styleSheet = this->sheet()) { styleSheet->contents().traverseSubresources([&] (auto& resource) { urls.add(resource.url()); return false; }); } }
void InspectorPageAgent::getCookies(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::Page::Cookie> >& cookies) { ListHashSet<Cookie> rawCookiesList; for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext(mainFrame())) { if (!frame->isLocalFrame()) continue; Document* document = toLocalFrame(frame)->document(); Vector<KURL> allURLs = allResourcesURLsForFrame(toLocalFrame(frame)); for (Vector<KURL>::const_iterator it = allURLs.begin(); it != allURLs.end(); ++it) { Vector<Cookie> docCookiesList; getRawCookies(document, *it, docCookiesList); int cookiesSize = docCookiesList.size(); for (int i = 0; i < cookiesSize; i++) { if (!rawCookiesList.contains(docCookiesList[i])) rawCookiesList.add(docCookiesList[i]); } } } cookies = buildArrayForCookies(rawCookiesList); }
void LineBoxList::dirtyLinesFromChangedChild(LayoutObject* container, LayoutObject* child) { if (!container->parent() || (container->isLayoutBlock() && (container->selfNeedsLayout() || !container->isLayoutBlockFlow()))) return; LayoutInline* inlineContainer = container->isLayoutInline() ? toLayoutInline(container) : 0; InlineBox* firstBox = inlineContainer ? inlineContainer->firstLineBoxIncludingCulling() : firstLineBox(); // If we have no first line box, then just bail early. if (!firstBox) { // For an empty inline, go ahead and propagate the check up to our parent, unless the parent // is already dirty. if (container->isInline() && !container->ancestorLineBoxDirty()) { container->parent()->dirtyLinesFromChangedChild(container); container->setAncestorLineBoxDirty(); // Mark the container to avoid dirtying the same lines again across multiple destroy() calls of the same subtree. } return; } // Try to figure out which line box we belong in. First try to find a previous // line box by examining our siblings. If we didn't find a line box, then use our // parent's first line box. RootInlineBox* box = 0; LayoutObject* curr = 0; ListHashSet<LayoutObject*, 16> potentialLineBreakObjects; potentialLineBreakObjects.add(child); for (curr = child->previousSibling(); curr; curr = curr->previousSibling()) { potentialLineBreakObjects.add(curr); if (curr->isFloatingOrOutOfFlowPositioned()) continue; if (curr->isReplaced()) { InlineBox* wrapper = toLayoutBox(curr)->inlineBoxWrapper(); if (wrapper) box = &wrapper->root(); } else if (curr->isText()) { InlineTextBox* textBox = toLayoutText(curr)->lastTextBox(); if (textBox) box = &textBox->root(); } else if (curr->isLayoutInline()) { InlineBox* lastSiblingBox = toLayoutInline(curr)->lastLineBoxIncludingCulling(); if (lastSiblingBox) box = &lastSiblingBox->root(); } if (box) break; } if (!box) { if (inlineContainer && !inlineContainer->alwaysCreateLineBoxes()) { // https://bugs.webkit.org/show_bug.cgi?id=60778 // We may have just removed a <br> with no line box that was our first child. In this case // we won't find a previous sibling, but firstBox can be pointing to a following sibling. // This isn't good enough, since we won't locate the root line box that encloses the removed // <br>. We have to just over-invalidate a bit and go up to our parent. if (!inlineContainer->ancestorLineBoxDirty()) { inlineContainer->parent()->dirtyLinesFromChangedChild(inlineContainer); inlineContainer->setAncestorLineBoxDirty(); // Mark the container to avoid dirtying the same lines again across multiple destroy() calls of the same subtree. } return; } box = &firstBox->root(); } // If we found a line box, then dirty it. if (box) { RootInlineBox* adjacentBox; box->markDirty(); // dirty the adjacent lines that might be affected // NOTE: we dirty the previous line because RootInlineBox objects cache // the address of the first object on the next line after a BR, which we may be // invalidating here. For more info, see how LayoutBlock::layoutInlineChildren // calls setLineBreakInfo with the result of findNextLineBreak. findNextLineBreak, // despite the name, actually returns the first LayoutObject after the BR. // <rdar://problem/3849947> "Typing after pasting line does not appear until after window resize." adjacentBox = box->prevRootBox(); if (adjacentBox) adjacentBox->markDirty(); adjacentBox = box->nextRootBox(); // If |child| or any of its immediately previous siblings with culled lineboxes is the object after a line-break in |box| or the linebox after it // then that means |child| actually sits on the linebox after |box| (or is its line-break object) and so we need to dirty it as well. if (adjacentBox && (potentialLineBreakObjects.contains(box->lineBreakObj()) || potentialLineBreakObjects.contains(adjacentBox->lineBreakObj()) || child->isBR() || isIsolated(container->style()->unicodeBidi()))) adjacentBox->markDirty(); } }