void WebEditorClient::textDidChangeInTextArea(Element* e) { IWebFormDelegate* formDelegate; if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) { IDOMElement* domElement = DOMElement::createInstance(e); if (domElement) { IDOMHTMLTextAreaElement* domTextAreaElement; if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLTextAreaElement, (void**)&domTextAreaElement))) { formDelegate->textDidChangeInTextArea(domTextAreaElement, kit(e->document()->frame())); domTextAreaElement->Release(); } domElement->Release(); } formDelegate->Release(); } }
void WebEditorClient::textFieldDidBeginEditing(Element* e) { IWebFormDelegate* formDelegate; if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) { IDOMElement* domElement = DOMElement::createInstance(e); if (domElement) { IDOMHTMLInputElement* domInputElement; if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) { formDelegate->textFieldDidBeginEditing(domInputElement, kit(e->document()->frame())); domInputElement->Release(); } domElement->Release(); } formDelegate->Release(); } }
void WebEditorClient::textWillBeDeletedInTextField(Element* e) { // We're using the deleteBackward command for all deletion operations since the autofill code treats all deletions the same way. IWebFormDelegate* formDelegate; if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) { IDOMElement* domElement = DOMElement::createInstance(e); if (domElement) { IDOMHTMLInputElement* domInputElement; if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) { BOOL result; formDelegate->doPlatformCommand(domInputElement, BString(L"DeleteBackward"), kit(e->document()->frame()), &result); domInputElement->Release(); } domElement->Release(); } formDelegate->Release(); } }
void WebEditorClient::textDidChangeInTextField(Element* e) { if (!UserTypingGestureIndicator::processingUserTypingGesture() || UserTypingGestureIndicator::focusedElementAtGestureStart() != e) return; IWebFormDelegate* formDelegate; if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) { IDOMElement* domElement = DOMElement::createInstance(e); if (domElement) { IDOMHTMLInputElement* domInputElement; if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) { formDelegate->textDidChangeInTextField(domInputElement, kit(e->document()->frame())); domInputElement->Release(); } domElement->Release(); } formDelegate->Release(); } }
IDOMNode* DOMNode::createInstance(WebCore::Node* n) { if (!n) return 0; HRESULT hr = S_OK; IDOMNode* domNode = 0; WebCore::Node::NodeType nodeType = n->nodeType(); switch (nodeType) { case WebCore::Node::ELEMENT_NODE: { IDOMElement* newElement = DOMElement::createInstance(static_cast<WebCore::Element*>(n)); if (newElement) { hr = newElement->QueryInterface(IID_IDOMNode, (void**)&domNode); newElement->Release(); } } break; case WebCore::Node::DOCUMENT_NODE: { IDOMDocument* newDocument = DOMDocument::createInstance(&n->document()); if (newDocument) { hr = newDocument->QueryInterface(IID_IDOMNode, (void**)&domNode); newDocument->Release(); } } break; default: { DOMNode* newNode = new DOMNode(n); hr = newNode->QueryInterface(IID_IDOMNode, (void**)&domNode); } break; } if (FAILED(hr)) return 0; return domNode; }
bool WebEditorClient::doTextFieldCommandFromEvent(Element* e, KeyboardEvent* ke) { BOOL result = FALSE; IWebFormDelegate* formDelegate; if (SUCCEEDED(m_webView->formDelegate(&formDelegate)) && formDelegate) { IDOMElement* domElement = DOMElement::createInstance(e); if (domElement) { IDOMHTMLInputElement* domInputElement; if (SUCCEEDED(domElement->QueryInterface(IID_IDOMHTMLInputElement, (void**)&domInputElement))) { String command = m_webView->interpretKeyEvent(ke); // We allow empty commands here because the app code actually depends on this being called for all key presses. // We may want to revisit this later because it doesn't really make sense to send an empty command. formDelegate->doPlatformCommand(domInputElement, BString(command), kit(e->document()->frame()), &result); domInputElement->Release(); } domElement->Release(); } formDelegate->Release(); } return !!result; }
void CSiteFile::UpdateOutLinks() { try { WCHAR sql[256]; swprintf(sql, L"DELETE FROM links WHERE file_id = %d", m_dbid); _variant_t va; m_pWebSite->m_siteDataConnection->Execute(sql, &va, ADODB::adCmdText); } catch (_com_error &e) { DbError(e); } TCHAR ext[_MAX_EXT]; _splitpath(m_wfd.cFileName, NULL, NULL, NULL, ext); if (!stricmp(ext, ".htm") || !stricmp(ext, ".html") || !stricmp(ext, ".asp") || !stricmp(ext, ".svg")) { CComQIPtr<IDOMDocumentContainer> documentcnt; documentcnt.CoCreateInstance(CLSID_DOMDocumentContainer); CSiteDir* pDir = (CSiteDir*)m_parent; CUString pathName = GetFullPathName(); VARIANT_BOOL bsuccess; documentcnt->load(_bstr_t(pathName), &bsuccess); if (bsuccess) { CComQIPtr<IDOMDocument> document; documentcnt->get_document(&document); if (document != NULL) { { // Links CComQIPtr<IDOMElement> documentElement; document->get_documentElement(&documentElement); CComQIPtr<IMMSXHTMLDocument> htmldocument; CComQIPtr<ISVGDocument> svgdocument; CArray<IDOMElement*,IDOMElement*> elements; if (htmldocument = document) { CollectElementTags(L"a", elements, documentElement); } else if (svgdocument = document) { CollectElementTags(L"a", elements, documentElement); } for (int i = 0; i < elements.GetSize(); i++) { IDOMElement* element = elements[i]; BSTR bhref; if (htmldocument) { element->getAttribute(L"href", &bhref); } else if (svgdocument) { // TODO, use getAttributeNS element->getAttribute(L"xlink:href", &bhref); } _bstr_t href = _bstr_t(bhref, false); if (href.length()) { char oldcwd[_MAX_PATH]; _getcwd(oldcwd, _MAX_PATH); chdir(pDir->m_pathName); char fullpath[_MAX_PATH]; _fullpath(fullpath, href, _MAX_PATH); chdir(oldcwd); CSiteFile* pHrefFile = (CSiteFile*)m_pWebSite->m_pRootDir->FindFilePathName(fullpath, 2); if (pHrefFile) { try { WCHAR sql[256]; swprintf(sql, L"INSERT INTO links (file_id, out_link_id) VALUES ('%d', %d)", m_dbid, pHrefFile->m_dbid); _variant_t va; m_pWebSite->m_siteDataConnection->Execute(sql, &va, ADODB::adCmdText); } catch (_com_error &e) { DbError(e); } } } element->Release(); } elements.RemoveAll(); } // DOM hierarchy { try { WCHAR sql[256]; swprintf(sql, L"INSERT INTO DOMDocument (file_id) VALUES (%d)", m_dbid); _variant_t va; va.Clear(); m_pWebSite->m_siteDataConnection->Execute(sql, &va, ADODB::adCmdText); ADODB::_RecordsetPtr recordset; recordset = m_pWebSite->m_siteDataConnection->Execute(L"SELECT MAX(id) AS id FROM DOMDocument", &va, ADODB::adCmdText); m_ownerDocument_id = recordset->Fields->Item[_bstr_t(L"id")]->Value.lVal; CComQIPtr<IDOMElement> documentElement; document->get_documentElement(&documentElement); if (documentElement) { SaveDOMElementToDatabase(documentElement, 0, 0); } } catch (_com_error &e) { DbError(e); } } } } } m_pWebSite->Fire_OutLinksChanged(m_dbid); }