diff --git a/dlls/mshtml/htmlframebase.c b/dlls/mshtml/htmlframebase.c
index 980837924a0..e0c64f45b81 100644
--- a/dlls/mshtml/htmlframebase.c
+++ b/dlls/mshtml/htmlframebase.c
@@ -134,8 +134,21 @@ static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v)
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) {
- FIXME("detached element\n");
- return E_FAIL;
+ nsAString nsstr;
+ nsresult nsres;
+
+ nsAString_InitDepend(&nsstr, v);
+ if(This->nsframe)
+ nsres = nsIDOMHTMLFrameElement_SetSrc(This->nsframe, &nsstr);
+ else
+ nsres = nsIDOMHTMLIFrameElement_SetSrc(This->nsiframe, &nsstr);
+ nsAString_Finish(&nsstr);
+ if(NS_FAILED(nsres)) {
+ ERR("SetSrc failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->uri, BINDING_NAVIGATED);
diff --git a/dlls/mshtml/tests/nav_test.html b/dlls/mshtml/tests/nav_test.html
index 536b238b23d..11c4c0cae00 100644
--- a/dlls/mshtml/tests/nav_test.html
+++ b/dlls/mshtml/tests/nav_test.html
@@ -43,9 +43,24 @@ function window_navigate_test() {
iframe.contentWindow.navigate("about:blank");
}
+function detached_src_test() {
+ var iframe = document.createElement("iframe");
+ var onload_called = false;
+
+ iframe.onload = function() {
+ onload_called = true;
+ next_test();
+ }
+
+ iframe.src = "blank.html";
+ document.body.appendChild(iframe);
+ ok(onload_called === false, "called onload too early?");
+}
+
var tests = [
nav_back_test,
window_navigate_test,
+ detached_src_test,
function() { external.reportSuccess(); }
];