#define CONTENT_LENGTH "Content-Length"
#define UTF16_STR "utf-16"
+static WCHAR emptyW[] = {0};
+
typedef struct {
const nsIInputStreamVtbl *lpInputStreamVtbl;
IMoniker *mon;
IBinding *binding;
- HTMLDocument *doc;
+ HTMLDocumentNode *doc;
struct list entry;
};
}
/* Calls undocumented 84 cmd of CGID_ShellDocView */
-static void call_docview_84(HTMLDocument *doc)
+static void call_docview_84(HTMLDocumentObj *doc)
{
IOleCommandTarget *olecmd;
VARIANT var;
*post_data_len_ret = post_data_len;
}
-HRESULT start_binding(HTMLDocument *doc, BSCallback *bscallback, IBindCtx *bctx)
+HRESULT start_binding(HTMLWindow *window, HTMLDocumentNode *doc, BSCallback *bscallback, IBindCtx *bctx)
{
IStream *str = NULL;
HRESULT hres;
/* NOTE: IE7 calls IsSystemMoniker here*/
- call_docview_84(doc);
+ if(window)
+ call_docview_84(window->doc_obj);
if(bctx) {
RegisterBindStatusCallback(bctx, STATUSCLB(bscallback), NULL, 0);
return ret;
}
-HRESULT bind_mon_to_buffer(HTMLDocument *doc, IMoniker *mon, void **buf, DWORD *size)
+HRESULT bind_mon_to_buffer(HTMLDocumentNode *doc, IMoniker *mon, void **buf, DWORD *size)
{
BufferBSC *bsc = create_bufferbsc(mon);
HRESULT hres;
*buf = NULL;
- hres = start_binding(doc, &bsc->bsc, NULL);
+ hres = start_binding(NULL, doc, &bsc->bsc, NULL);
if(SUCCEEDED(hres)) {
hres = bsc->hres;
if(SUCCEEDED(hres)) {
struct nsChannelBSC {
BSCallback bsc;
+ HTMLWindow *window;
+
nsChannel *nschannel;
nsIStreamListener *nslistener;
nsISupports *nscontext;
FIXME("OnStartRequest failed: %08x\n", nsres);
}
-static void on_stop_nsrequest(nsChannelBSC *This)
+static void on_stop_nsrequest(nsChannelBSC *This, HRESULT result)
{
nsresult nsres;
if(!This->nslistener)
return;
- if(!This->bsc.readed) {
+ if(!This->bsc.readed && SUCCEEDED(result)) {
TRACE("No data read! Calling OnStartRequest\n");
on_start_nsrequest(This);
}
nsres = nsIStreamListener_OnStopRequest(This->nslistener, (nsIRequest*)NSCHANNEL(This->nschannel),
- This->nscontext, NS_OK);
+ This->nscontext, SUCCEEDED(result) ? NS_OK : NS_ERROR_FAILURE);
if(NS_FAILED(nsres))
WARN("OnStopRequest failed: %08x\n", nsres);
}
on_start_nsrequest(This);
- /* events are reset when a new document URI is loaded, so re-initialise them here */
- if(This->bsc.doc && This->bsc.doc->bscallback == This && This->bsc.doc->nscontainer) {
- update_nsdocument(This->bsc.doc);
- init_nsevents(This->bsc.doc->nscontainer);
+ if(This->window)
+ update_window_doc(This->window);
}
- }
This->bsc.readed += This->nsstream->buf_size;
{
nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
- on_stop_nsrequest(This);
+ on_stop_nsrequest(This, result);
if(This->nslistener) {
if(This->nschannel->load_group) {
return This->bsc.mon;
}
-void set_document_bscallback(HTMLDocument *doc, nsChannelBSC *callback)
+void set_window_bscallback(HTMLWindow *window, nsChannelBSC *callback)
{
- BSCallback *iter;
+ if(window->bscallback) {
+ if(window->bscallback->bsc.binding)
+ IBinding_Abort(window->bscallback->bsc.binding);
+ window->bscallback->bsc.doc = NULL;
+ window->bscallback->window = NULL;
+ IBindStatusCallback_Release(STATUSCLB(&window->bscallback->bsc));
+ }
+
+ window->bscallback = callback;
- if(doc->bscallback) {
- if(doc->bscallback->bsc.binding)
- IBinding_Abort(doc->bscallback->bsc.binding);
- doc->bscallback->bsc.doc = NULL;
- IBindStatusCallback_Release(STATUSCLB(&doc->bscallback->bsc));
+ if(callback) {
+ callback->window = window;
+ IBindStatusCallback_AddRef(STATUSCLB(&callback->bsc));
+ callback->bsc.doc = window->doc;
}
+}
+
+void abort_document_bindings(HTMLDocumentNode *doc)
+{
+ BSCallback *iter;
LIST_FOR_EACH_ENTRY(iter, &doc->bindings, BSCallback, entry) {
+ if(iter->binding)
+ IBinding_Abort(iter->binding);
iter->doc = NULL;
list_remove(&iter->entry);
}
-
- doc->bscallback = callback;
-
- if(callback) {
- IBindStatusCallback_AddRef(STATUSCLB(&callback->bsc));
- callback->bsc.doc = doc;
- }
}
HRESULT channelbsc_load_stream(nsChannelBSC *bscallback, IStream *stream)
{
HRESULT hres;
- const char text_html[] = "text/html";
+ if(!bscallback->nschannel) {
+ ERR("NULL nschannel\n");
+ return E_FAIL;
+ }
- add_nsrequest(bscallback);
+ bscallback->nschannel->content_type = heap_strdupA("text/html");
+ if(!bscallback->nschannel->content_type)
+ return E_OUTOFMEMORY;
- if(bscallback->nschannel)
- bscallback->nschannel->content_type = heap_strdupA(text_html);
+ add_nsrequest(bscallback);
hres = read_stream_data(bscallback, stream);
IBindStatusCallback_OnStopBinding(STATUSCLB(&bscallback->bsc), hres, ERROR_SUCCESS);
}
}
-void hlink_frame_navigate(HTMLDocument *doc, IHlinkFrame *hlink_frame,
- LPCWSTR uri, nsIInputStream *post_data_stream, DWORD hlnf)
+HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url,
+ nsIInputStream *post_data_stream, DWORD hlnf)
{
+ IHlinkFrame *hlink_frame;
+ IServiceProvider *sp;
BSCallback *callback;
IBindCtx *bindctx;
IMoniker *mon;
IHlink *hlink;
- HRESULT hr;
+ HRESULT hres;
+
+ hres = IOleClientSite_QueryInterface(doc->doc_obj->client, &IID_IServiceProvider,
+ (void**)&sp);
+ if(FAILED(hres))
+ return hres;
+
+ hres = IServiceProvider_QueryService(sp, &IID_IHlinkFrame, &IID_IHlinkFrame,
+ (void**)&hlink_frame);
+ IServiceProvider_Release(sp);
+ if(FAILED(hres))
+ return hres;
callback = &create_channelbsc(NULL)->bsc;
debugstr_an(callback->post_data, callback->post_data_len));
}
- hr = CreateAsyncBindCtx(0, STATUSCLB(callback), NULL, &bindctx);
- if (FAILED(hr)) {
- IBindStatusCallback_Release(STATUSCLB(callback));
- return;
- }
+ hres = CreateAsyncBindCtx(0, STATUSCLB(callback), NULL, &bindctx);
+ if(SUCCEEDED(hres))
+ hres = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IHlink, (LPVOID*)&hlink);
- hr = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER, &IID_IHlink, (LPVOID*)&hlink);
- if (FAILED(hr)) {
- IBindCtx_Release(bindctx);
- IBindStatusCallback_Release(STATUSCLB(callback));
- return;
- }
+ if(SUCCEEDED(hres))
+ hres = CreateURLMoniker(NULL, url, &mon);
- hr = CreateURLMoniker(NULL, uri, &mon);
- if (SUCCEEDED(hr)) {
- IHlink_SetMonikerReference(hlink, 0, mon, NULL);
+ if(SUCCEEDED(hres)) {
+ IHlink_SetMonikerReference(hlink, HLINKSETF_TARGET, mon, NULL);
if(hlnf & HLNF_OPENINNEWWINDOW) {
static const WCHAR wszBlank[] = {'_','b','l','a','n','k',0};
IHlink_SetTargetFrameName(hlink, wszBlank); /* FIXME */
}
- IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx, STATUSCLB(callback), hlink);
+ hres = IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx, STATUSCLB(callback), hlink);
IMoniker_Release(mon);
}
+ IHlinkFrame_Release(hlink_frame);
IBindCtx_Release(bindctx);
IBindStatusCallback_Release(STATUSCLB(callback));
+ return hres;
+}
+
+HRESULT navigate_url(HTMLDocumentNode *doc, OLECHAR *url)
+{
+ OLECHAR *translated_url = NULL;
+ HRESULT hres;
+
+ if(!url)
+ url = emptyW;
+
+ if(doc->basedoc.doc_obj->hostui) {
+ hres = IDocHostUIHandler_TranslateUrl(doc->basedoc.doc_obj->hostui, 0, url,
+ &translated_url);
+ if(hres == S_OK)
+ url = translated_url;
+ }
+
+ hres = hlink_frame_navigate(&doc->basedoc, url, NULL, 0);
+ if(FAILED(hres))
+ FIXME("hlink_frame_navigate failed: %08x\n", hres);
+
+ CoTaskMemFree(translated_url);
+ return hres;
}