void HTMLElementImp::setOnclick(html::Function onclick) { DocumentImp* document = getOwnerDocumentImp(); DocumentWindowPtr window = document->activate(); addEventListener(u"click", new(std::nothrow) EventListenerImp(boost::bind(&ECMAScriptContext::dispatchEvent, window->getContext(), onclick, _1))); }
void HTMLElementImp::xblEnteredDocument(Node node) { while (node) { if (auto element = dynamic_cast<HTMLElementImp*>(node.self())) { if (element->shadowTarget && !element->shadowImplementation) { DocumentImp* document = element->getOwnerDocumentImp(); DocumentWindowPtr window = document->activate(); ECMAScriptContext* context = window->getContext(); element->shadowImplementation = context->xblCreateImplementation(element->shadowTarget, element->bindingImplementation, element, element->shadowTree); element->shadowImplementation.xblEnteredDocument(); } } if (node.hasChildNodes()) xblEnteredDocument(node.getFirstChild()); node = node.getNextSibling(); } }
void HTMLElementImp::generateShadowContent(CSSStyleDeclarationImp* style) { if (style->binding.getValue() != CSSBindingValueImp::Uri || style->display.getValue() == CSSDisplayValueImp::None) return; if (getShadowTree()) // already attached? return; DocumentImp* document = getOwnerDocumentImp(); assert(document); URL base(document->getDocumentURI()); URL url(base, style->binding.getURL()); if (!base.isSameExceptFragments(url)) { document = dynamic_cast<DocumentImp*>(document->loadBindingDocument(url).self()); if (!document || document->getReadyState() != u"complete") return; } std::u16string hash = url.getHash(); if (hash[0] == '#') hash.erase(0, 1); Element element = document->getElementById(hash); if (!element) return; auto binding = dynamic_cast<HTMLBindingElementImp*>(element.self()); if (!binding) return; bindingImplementation = binding->getImplementation(); if (!bindingImplementation) return; if (html::HTMLTemplateElement shadowTree = binding->cloneTemplate()) { setShadowTree(shadowTree); shadowTarget = new(std::nothrow) EventTargetImp; // TODO: if (not called from the background thread) { #if 0 DocumentWindowPtr window = document->activate(); ECMAScriptContext* context = window->getContext(); shadowImplementation = context->xblCreateImplementation(shadowTarget, bindingImplementation, this, shadowTree); shadowImplementation .xblEnteredDocument(); } #endif }