FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer) { ASSERT_ARG(buffer, buffer); #if ENABLE(OPENTYPE_SANITIZER) OpenTypeSanitizer sanitizer(buffer); RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize(); if (!transcodeBuffer) return 0; // validation failed. buffer = transcodeBuffer.get(); #endif #if OS(WINDOWS) // Introduce the font to GDI. AddFontMemResourceEx should be used with care, because it will pollute the process's // font namespace (Windows has no API for creating an HFONT from data without exposing the font to the // entire process first). String fontName = createUniqueFontName(); HANDLE fontReference = renameAndActivateFont(buffer, fontName); if (!fontReference) return 0; return new FontCustomPlatformData(fontReference, fontName); #elif OS(LINUX) || OS(FREEBSD) || PLATFORM(BREWMP) RemoteFontStream* stream = new RemoteFontStream(buffer); SkTypeface* typeface = SkTypeface::CreateFromStream(stream); if (!typeface) return 0; return new FontCustomPlatformData(typeface); #else notImplemented(); return 0; #endif }
PassOwnPtr<FontCustomPlatformData> FontCustomPlatformData::create(SharedBuffer* buffer) { ASSERT_ARG(buffer, buffer); OpenTypeSanitizer sanitizer(buffer); RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize(); if (!transcodeBuffer) return nullptr; // validation failed. buffer = transcodeBuffer.get(); SkMemoryStream* stream = new SkMemoryStream(buffer->getAsSkData().get()); RefPtr<SkTypeface> typeface = adoptRef(SkTypeface::CreateFromStream(stream)); if (!typeface) return nullptr; return adoptPtr(new FontCustomPlatformData(typeface.release())); }
PassOwnPtr<FontCustomPlatformData> FontCustomPlatformData::create(SharedBuffer* buffer) { ASSERT_ARG(buffer, buffer); OpenTypeSanitizer sanitizer(buffer); RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize(); if (!transcodeBuffer) return nullptr; // validation failed. buffer = transcodeBuffer.get(); // Introduce the font to GDI. AddFontMemResourceEx should be used with care, because it will pollute the process's // font namespace (Windows has no API for creating an HFONT from data without exposing the font to the // entire process first). String fontName = createUniqueFontName(); HANDLE fontReference = renameAndActivateFont(buffer, fontName); if (!fontReference) return nullptr; return adoptPtr(new FontCustomPlatformData(fontReference, fontName)); }
NS_IMETHODIMP nsParserUtils::Sanitize(const nsAString& aFromStr, PRUint32 aFlags, nsAString& aToStr) { nsCOMPtr<nsIURI> uri; NS_NewURI(getter_AddRefs(uri), "about:blank"); nsCOMPtr<nsIPrincipal> principal = do_CreateInstance("@mozilla.org/nullprincipal;1"); nsCOMPtr<nsIDOMDocument> domDocument; nsresult rv = nsContentUtils::CreateDocument(EmptyString(), EmptyString(), nsnull, uri, uri, principal, nsnull, DocumentFlavorHTML, getter_AddRefs(domDocument)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDocument> document = do_QueryInterface(domDocument); rv = nsContentUtils::ParseDocumentHTML(aFromStr, document, false); NS_ENSURE_SUCCESS(rv, rv); nsTreeSanitizer sanitizer(aFlags); sanitizer.Sanitize(document); nsCOMPtr<nsIDocumentEncoder> encoder = do_CreateInstance(NS_DOC_ENCODER_CONTRACTID_BASE "text/html"); encoder->NativeInit(document, NS_LITERAL_STRING("text/html"), nsIDocumentEncoder::OutputDontRewriteEncodingDeclaration | nsIDocumentEncoder::OutputNoScriptContent | nsIDocumentEncoder::OutputEncodeBasicEntities | nsIDocumentEncoder::OutputLFLineBreak | nsIDocumentEncoder::OutputRaw); return encoder->EncodeToString(aToStr); }
PassOwnPtr<FontCustomPlatformData> FontCustomPlatformData::create(SharedBuffer* buffer) { ASSERT_ARG(buffer, buffer); OpenTypeSanitizer sanitizer(buffer); RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize(); if (!transcodeBuffer) return nullptr; // validation failed. buffer = transcodeBuffer.get(); RefPtr<SkMemoryStream> stream = adoptRef(new SkMemoryStream(buffer->getAsSkData().get())); #if OS(WIN) && !ENABLE(GDI_FONTS_ON_WINDOWS) RefPtr<SkTypeface> typeface = adoptRef(FontCache::fontCache()->fontManager()->createFromStream(stream.get())); #else RefPtr<SkTypeface> typeface = adoptRef(SkTypeface::CreateFromStream(stream.get())); #endif if (!typeface) return nullptr; return adoptPtr(new FontCustomPlatformData(typeface.release())); }
int test_dataFlowToFromParam(int aUniqueParamName) { sanitizer(aUniqueParamName); sink(aUniqueParamName); }
NS_IMETHODIMP nsParserUtils::ParseFragment(const nsAString& aFragment, PRUint32 aFlags, bool aIsXML, nsIURI* aBaseURI, nsIDOMElement* aContextElement, nsIDOMDocumentFragment** aReturn) { NS_ENSURE_ARG(aContextElement); *aReturn = nsnull; nsresult rv; nsCOMPtr<nsIParser> parser = do_CreateInstance(kCParserCID, &rv); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIDocument> document; nsCOMPtr<nsIDOMDocument> domDocument; nsCOMPtr<nsIDOMNode> contextNode; contextNode = do_QueryInterface(aContextElement); contextNode->GetOwnerDocument(getter_AddRefs(domDocument)); document = do_QueryInterface(domDocument); NS_ENSURE_TRUE(document, NS_ERROR_NOT_AVAILABLE); // stop scripts nsRefPtr<nsScriptLoader> loader; bool scripts_enabled = false; if (document) { loader = document->ScriptLoader(); scripts_enabled = loader->GetEnabled(); } if (scripts_enabled) { loader->SetEnabled(false); } // Wrap things in a div or body for parsing, but it won't show up in // the fragment. nsAutoTArray<nsString, 2> tagStack; nsCAutoString base, spec; if (aIsXML) { // XHTML if (aBaseURI) { base.Append(NS_LITERAL_CSTRING(XHTML_DIV_TAG)); base.Append(NS_LITERAL_CSTRING(" xml:base=\"")); aBaseURI->GetSpec(spec); // nsEscapeHTML is good enough, because we only need to get // quotes, ampersands, and angle brackets char* escapedSpec = nsEscapeHTML(spec.get()); if (escapedSpec) base += escapedSpec; NS_Free(escapedSpec); base.Append(NS_LITERAL_CSTRING("\"")); tagStack.AppendElement(NS_ConvertUTF8toUTF16(base)); } else { tagStack.AppendElement(NS_LITERAL_STRING(XHTML_DIV_TAG)); } } if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIContent> fragment; if (aIsXML) { rv = nsContentUtils::ParseFragmentXML(aFragment, document, tagStack, true, aReturn); fragment = do_QueryInterface(*aReturn); } else { NS_NewDocumentFragment(aReturn, document->NodeInfoManager()); fragment = do_QueryInterface(*aReturn); rv = nsContentUtils::ParseFragmentHTML(aFragment, fragment, nsGkAtoms::body, kNameSpaceID_XHTML, false, true); // Now, set the base URI on all subtree roots. if (aBaseURI) { aBaseURI->GetSpec(spec); nsAutoString spec16; CopyUTF8toUTF16(spec, spec16); nsIContent* node = fragment->GetFirstChild(); while (node) { if (node->IsElement()) { node->SetAttr(kNameSpaceID_XML, nsGkAtoms::base, nsGkAtoms::xml, spec16, false); } node = node->GetNextSibling(); } } } if (fragment) { nsTreeSanitizer sanitizer(aFlags); sanitizer.Sanitize(fragment); } } if (scripts_enabled) loader->SetEnabled(true); return rv; }
FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer) { ASSERT_ARG(buffer, buffer); #if USE(OPENTYPE_SANITIZER) OpenTypeSanitizer sanitizer(buffer); RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize(); if (!transcodeBuffer) return 0; // validation failed. buffer = transcodeBuffer.get(); #else RefPtr<SharedBuffer> sfntBuffer; if (isWOFF(buffer)) { Vector<char> sfnt; if (!convertWOFFToSfnt(buffer, sfnt)) return 0; sfntBuffer = SharedBuffer::adoptVector(sfnt); buffer = sfntBuffer.get(); } #endif ATSFontContainerRef containerRef = 0; RetainPtr<CGFontRef> cgFontRef; #ifndef BUILDING_ON_LEOPARD RetainPtr<CFDataRef> bufferData(AdoptCF, buffer->createCFData()); RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateWithCFData(bufferData.get())); cgFontRef.adoptCF(CGFontCreateWithDataProvider(dataProvider.get())); if (!cgFontRef) return 0; #else // Use ATS to activate the font. // The value "3" means that the font is private and can't be seen by anyone else. ATSFontActivateFromMemory((void*)buffer->data(), buffer->size(), 3, kATSFontFormatUnspecified, NULL, kATSOptionFlagsDefault, &containerRef); if (!containerRef) return 0; ItemCount fontCount; ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 0, NULL, &fontCount); // We just support the first font in the list. if (fontCount == 0) { ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); return 0; } ATSFontRef fontRef = 0; ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 1, &fontRef, NULL); if (!fontRef) { ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); return 0; } cgFontRef.adoptCF(CGFontCreateWithPlatformFont(&fontRef)); // Workaround for <rdar://problem/5675504>. if (cgFontRef && !CGFontGetNumberOfGlyphs(cgFontRef.get())) cgFontRef = 0; if (!cgFontRef) { ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); return 0; } #endif // !defined(BUILDING_ON_LEOPARD) FontCustomPlatformData* fontCustomPlatformData = new FontCustomPlatformData(containerRef, cgFontRef.releaseRef()); #if USE(SKIA_ON_MAC_CHROMIUM) RemoteFontStream* stream = new RemoteFontStream(buffer); fontCustomPlatformData->m_typeface = SkTypeface::CreateFromStream(stream); stream->unref(); #endif return fontCustomPlatformData; }
FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer) { ASSERT_ARG(buffer, buffer); #if ENABLE(OPENTYPE_SANITIZER) OpenTypeSanitizer sanitizer(buffer); RefPtr<SharedBuffer> transcodeBuffer = sanitizer.sanitize(); if (!transcodeBuffer) return 0; // validation failed. buffer = transcodeBuffer.get(); #endif ATSFontContainerRef containerRef = 0; ATSFontRef fontRef = 0; RetainPtr<CGFontRef> cgFontRef; #if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) RetainPtr<CFDataRef> bufferData(AdoptCF, buffer->createCFData()); RetainPtr<CGDataProviderRef> dataProvider(AdoptCF, CGDataProviderCreateWithCFData(bufferData.get())); cgFontRef.adoptCF(CGFontCreateWithDataProvider(dataProvider.get())); if (!cgFontRef) return 0; #else // Use ATS to activate the font. // The value "3" means that the font is private and can't be seen by anyone else. ATSFontActivateFromMemory((void*)buffer->data(), buffer->size(), 3, kATSFontFormatUnspecified, NULL, kATSOptionFlagsDefault, &containerRef); if (!containerRef) return 0; ItemCount fontCount; ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 0, NULL, &fontCount); // We just support the first font in the list. if (fontCount == 0) { ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); return 0; } ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 1, &fontRef, NULL); if (!fontRef) { ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); return 0; } cgFontRef.adoptCF(CGFontCreateWithPlatformFont(&fontRef)); #ifndef BUILDING_ON_TIGER // Workaround for <rdar://problem/5675504>. if (cgFontRef && !CGFontGetNumberOfGlyphs(cgFontRef.get())) cgFontRef = 0; #endif #if PLATFORM(APOLLO) // On Leopard the CGFontGetNumberOfGlyphs call is necessary to reject invalid fonts // On Snow Leopard this happens at ATSFontActivateFromMemory if (isOsLeopardOrGreater()) { static _CGFontGetNumberOfGlyphsFunc CGFontGetNumberOfGlyphsFunc = getCGFontGetNumberOfGlyphsFunc(); if (CGFontGetNumberOfGlyphsFunc && cgFontRef && !CGFontGetNumberOfGlyphsFunc(cgFontRef.get())) { cgFontRef = 0; } } #endif if (!cgFontRef) { ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); return 0; } #endif // !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) return new FontCustomPlatformData(containerRef, fontRef, cgFontRef.releaseRef()); }