void nsStyledElementNotElementCSSInlineStyle::ParseStyleAttribute(const nsAString& aValue, nsAttrValue& aResult, bool aForceInDataDoc) { nsIDocument* doc = OwnerDoc(); if (aForceInDataDoc || !doc->IsLoadedAsData() || doc->IsStaticDocument()) { bool isCSS = true; // assume CSS until proven otherwise if (!IsInNativeAnonymousSubtree()) { // native anonymous content // always assumes CSS nsAutoString styleType; doc->GetHeaderData(nsGkAtoms::headerContentStyleType, styleType); if (!styleType.IsEmpty()) { static const char textCssStr[] = "text/css"; isCSS = (styleType.EqualsIgnoreCase(textCssStr, sizeof(textCssStr) - 1)); } } if (isCSS) { css::Loader* cssLoader = doc->CSSLoader(); nsCSSParser cssParser(cssLoader); nsCOMPtr<nsIURI> baseURI = GetBaseURI(); nsRefPtr<css::StyleRule> rule; cssParser.ParseStyleAttribute(aValue, doc->GetDocumentURI(), baseURI, NodePrincipal(), getter_AddRefs(rule)); if (rule) { aResult.SetTo(rule, &aValue); return; } } } aResult.SetTo(aValue); }
void nsWebBrowserFind::SetSelectionAndScroll(nsIDOMWindow* aWindow, nsIDOMRange* aRange) { nsCOMPtr<nsIDOMDocument> domDoc; aWindow->GetDocument(getter_AddRefs(domDoc)); if (!domDoc) return; nsCOMPtr<nsIDocument> doc(do_QueryInterface(domDoc)); nsIPresShell* presShell = doc->GetShell(); if (!presShell) return; nsCOMPtr<nsIDOMNode> node; aRange->GetStartContainer(getter_AddRefs(node)); nsCOMPtr<nsIContent> content(do_QueryInterface(node)); nsIFrame* frame = content->GetPrimaryFrame(); if (!frame) return; nsCOMPtr<nsISelectionController> selCon; frame->GetSelectionController(presShell->GetPresContext(), getter_AddRefs(selCon)); // since the match could be an anonymous textnode inside a // <textarea> or text <input>, we need to get the outer frame nsITextControlFrame *tcFrame = nullptr; for ( ; content; content = content->GetParent()) { if (!IsInNativeAnonymousSubtree(content)) { nsIFrame* f = content->GetPrimaryFrame(); if (!f) return; tcFrame = do_QueryFrame(f); break; } } nsCOMPtr<nsISelection> selection; selCon->SetDisplaySelection(nsISelectionController::SELECTION_ON); selCon->GetSelection(nsISelectionController::SELECTION_NORMAL, getter_AddRefs(selection)); if (selection) { selection->RemoveAllRanges(); selection->AddRange(aRange); nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID); if (fm) { if (tcFrame) { nsCOMPtr<nsIDOMElement> newFocusedElement(do_QueryInterface(content)); fm->SetFocus(newFocusedElement, nsIFocusManager::FLAG_NOSCROLL); } else { nsCOMPtr<nsIDOMElement> result; fm->MoveFocus(aWindow, nullptr, nsIFocusManager::MOVEFOCUS_CARET, nsIFocusManager::FLAG_NOSCROLL, getter_AddRefs(result)); } } // Scroll if necessary to make the selection visible: // Must be the last thing to do - bug 242056 // After ScrollSelectionIntoView(), the pending notifications might be // flushed and PresShell/PresContext/Frames may be dead. See bug 418470. selCon->ScrollSelectionIntoView (nsISelectionController::SELECTION_NORMAL, nsISelectionController::SELECTION_WHOLE_SELECTION, nsISelectionController::SCROLL_CENTER_VERTICALLY | nsISelectionController::SCROLL_SYNCHRONOUS); } }