diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c
index bba9e409865..4e021554a50 100644
--- a/dlls/mshtml/editor.c
+++ b/dlls/mshtml/editor.c
@@ -1146,13 +1146,18 @@ static INT_PTR CALLBACK hyperlink_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LP
static HRESULT exec_hyperlink(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
{
+ nsAString a_str, href_str, ns_url;
+ nsIHTMLEditor *html_editor;
+ nsIDOMElement *anchor_elem;
+ PRBool insert_link_at_caret;
+ nsISelection *nsselection;
BSTR url = NULL;
INT ret;
- nsISelection *nsselection;
- nsIDOMDocument *nsdoc;
- nsresult nsres;
HRESULT hres = E_FAIL;
+ static const WCHAR wszA[] = {'a',0};
+ static const WCHAR wszHref[] = {'h','r','e','f',0};
+
TRACE("%p, 0x%x, %p, %p\n", This, cmdexecopt, in, out);
if (cmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER)
@@ -1171,76 +1176,64 @@ static HRESULT exec_hyperlink(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in,
return OLECMDERR_E_CANCELED;
}
+ if(This->nsdoc) {
+ WARN("NULL nsdoc\n");
+ return E_UNEXPECTED;
+ }
+
nsselection = get_ns_selection(This);
if (!nsselection)
return E_FAIL;
- nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
- if(NS_SUCCEEDED(nsres))
- {
- static const WCHAR wszA[] = {'a',0};
- static const WCHAR wszHref[] = {'h','r','e','f',0};
- nsIHTMLEditor *html_editor;
- nsIDOMNode *text_node;
- nsIDOMElement *anchor_elem;
- nsIDOMNode *unused_node;
- nsAString a_str;
- nsAString href_str;
- nsAString ns_url;
- PRBool insert_link_at_caret;
+ nsAString_Init(&a_str, wszA);
+ nsAString_Init(&href_str, wszHref);
+ nsAString_Init(&ns_url, url);
- nsAString_Init(&a_str, wszA);
- nsAString_Init(&href_str, wszHref);
- nsAString_Init(&ns_url, url);
+ /* create an element for the link */
+ nsIDOMDocument_CreateElement(This->nsdoc, &a_str, &anchor_elem);
+ nsIDOMElement_SetAttribute(anchor_elem, &href_str, &ns_url);
- /* create an element for the link */
- nsIDOMDocument_CreateElement(nsdoc, &a_str, &anchor_elem);
- nsIDOMElement_SetAttribute(anchor_elem, &href_str, &ns_url);
+ nsAString_Finish(&href_str);
+ nsAString_Finish(&a_str);
- nsAString_Finish(&href_str);
- nsAString_Finish(&a_str);
+ nsISelection_GetIsCollapsed(nsselection, &insert_link_at_caret);
- nsISelection_GetIsCollapsed(nsselection, &insert_link_at_caret);
+ /* create an element with text of URL */
+ if (insert_link_at_caret) {
+ nsIDOMNode *text_node, *unused_node;
- /* create an element with text of URL */
- if (insert_link_at_caret)
- {
- nsIDOMDocument_CreateTextNode(nsdoc, &ns_url, (nsIDOMText **)&text_node);
+ nsIDOMDocument_CreateTextNode(This->nsdoc, &ns_url, (nsIDOMText **)&text_node);
- /* wrap the tags around the text element */
- nsIDOMElement_AppendChild(anchor_elem, text_node, &unused_node);
- nsIDOMNode_Release(text_node);
- nsIDOMNode_Release(unused_node);
- }
+ /* wrap the tags around the text element */
+ nsIDOMElement_AppendChild(anchor_elem, text_node, &unused_node);
+ nsIDOMNode_Release(text_node);
+ nsIDOMNode_Release(unused_node);
+ }
- nsAString_Finish(&ns_url);
+ nsAString_Finish(&ns_url);
- nsIEditor_QueryInterface(This->nscontainer->editor, &IID_nsIHTMLEditor, (void **)&html_editor);
- if (html_editor)
- {
- if (insert_link_at_caret)
- {
- /* add them to the document at the caret position */
- nsres = nsIHTMLEditor_InsertElementAtSelection(html_editor, anchor_elem, FALSE);
- nsISelection_SelectAllChildren(nsselection, (nsIDOMNode*)anchor_elem);
- }
- else /* add them around the selection using the magic provided to us by nsIHTMLEditor */
- nsres = nsIHTMLEditor_InsertLinkAroundSelection(html_editor, anchor_elem);
- nsIHTMLEditor_Release(html_editor);
- }
+ nsIEditor_QueryInterface(This->nscontainer->editor, &IID_nsIHTMLEditor, (void **)&html_editor);
+ if (html_editor) {
+ nsresult nsres;
- nsIDOMElement_Release(anchor_elem);
- nsIDOMDocument_Release(nsdoc);
+ if (insert_link_at_caret) {
+ /* add them to the document at the caret position */
+ nsres = nsIHTMLEditor_InsertElementAtSelection(html_editor, anchor_elem, FALSE);
+ nsISelection_SelectAllChildren(nsselection, (nsIDOMNode*)anchor_elem);
+ }else /* add them around the selection using the magic provided to us by nsIHTMLEditor */
+ nsres = nsIHTMLEditor_InsertLinkAroundSelection(html_editor, anchor_elem);
+ nsIHTMLEditor_Release(html_editor);
hres = NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
}
nsISelection_Release(nsselection);
+ nsIDOMElement_Release(anchor_elem);
if (cmdexecopt != OLECMDEXECOPT_DONTPROMPTUSER)
SysFreeString(url);
- TRACE("-- 0x%08x\n", nsres);
+ TRACE("-- 0x%08x\n", hres);
return hres;
}