ReactOS 0.4.17-dev-806-gffa4164
navigate.c File Reference
#include "mshtml_private.h"
#include <hlguids.h>
#include <htiface.h>
Include dependency graph for navigate.c:

Go to the source code of this file.

Classes

struct  nsProtocolStream
 
struct  nsRedirectCallback
 
struct  stop_request_task_t
 
struct  start_doc_binding_task_t
 
struct  navigate_javascript_task_t
 
struct  navigate_task_t
 

Macros

#define CONTENT_LENGTH   "Content-Length"
 
#define UTF8_STR   "utf-8"
 
#define UTF16_STR   "utf-16"
 

Functions

static nsProtocolStreamimpl_from_nsIInputStream (nsIInputStream *iface)
 
static nsresult NSAPI nsInputStream_QueryInterface (nsIInputStream *iface, nsIIDRef riid, void **result)
 
static nsrefcnt NSAPI nsInputStream_AddRef (nsIInputStream *iface)
 
static nsrefcnt NSAPI nsInputStream_Release (nsIInputStream *iface)
 
static nsresult NSAPI nsInputStream_Close (nsIInputStream *iface)
 
static nsresult NSAPI nsInputStream_Available (nsIInputStream *iface, UINT64 *_retval)
 
static nsresult NSAPI nsInputStream_Read (nsIInputStream *iface, char *aBuf, UINT32 aCount, UINT32 *_retval)
 
static nsresult NSAPI nsInputStream_ReadSegments (nsIInputStream *iface, nsresult(WINAPI *aWriter)(nsIInputStream *, void *, const char *, UINT32, UINT32, UINT32 *), void *aClousure, UINT32 aCount, UINT32 *_retval)
 
static nsresult NSAPI nsInputStream_IsNonBlocking (nsIInputStream *iface, cpp_bool *_retval)
 
static nsProtocolStreamcreate_nsprotocol_stream (void)
 
static void release_request_data (request_data_t *request_data)
 
static BSCallbackimpl_from_IBindStatusCallback (IBindStatusCallback *iface)
 
static HRESULT WINAPI BindStatusCallback_QueryInterface (IBindStatusCallback *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI BindStatusCallback_AddRef (IBindStatusCallback *iface)
 
static ULONG WINAPI BindStatusCallback_Release (IBindStatusCallback *iface)
 
static HRESULT WINAPI BindStatusCallback_OnStartBinding (IBindStatusCallback *iface, DWORD dwReserved, IBinding *pbind)
 
static HRESULT WINAPI BindStatusCallback_GetPriority (IBindStatusCallback *iface, LONG *pnPriority)
 
static HRESULT WINAPI BindStatusCallback_OnLowResource (IBindStatusCallback *iface, DWORD reserved)
 
static HRESULT WINAPI BindStatusCallback_OnProgress (IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
 
static HRESULT WINAPI BindStatusCallback_OnStopBinding (IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
 
static HRESULT WINAPI BindStatusCallback_GetBindInfo (IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
 
static HRESULT WINAPI BindStatusCallback_OnDataAvailable (IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
 
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable (IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
 
static BSCallbackimpl_from_IHttpNegotiate2 (IHttpNegotiate2 *iface)
 
static HRESULT WINAPI HttpNegotiate_QueryInterface (IHttpNegotiate2 *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI HttpNegotiate_AddRef (IHttpNegotiate2 *iface)
 
static ULONG WINAPI HttpNegotiate_Release (IHttpNegotiate2 *iface)
 
static HRESULT WINAPI HttpNegotiate_BeginningTransaction (IHttpNegotiate2 *iface, LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders)
 
static HRESULT WINAPI HttpNegotiate_OnResponse (IHttpNegotiate2 *iface, DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders)
 
static HRESULT WINAPI HttpNegotiate_GetRootSecurityId (IHttpNegotiate2 *iface, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
 
static BSCallbackimpl_from_IInternetBindInfo (IInternetBindInfo *iface)
 
static HRESULT WINAPI InternetBindInfo_QueryInterface (IInternetBindInfo *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI InternetBindInfo_AddRef (IInternetBindInfo *iface)
 
static ULONG WINAPI InternetBindInfo_Release (IInternetBindInfo *iface)
 
static HRESULT WINAPI InternetBindInfo_GetBindInfo (IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
 
static HRESULT WINAPI InternetBindInfo_GetBindString (IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
 
static BSCallbackimpl_from_IServiceProvider (IServiceProvider *iface)
 
static HRESULT WINAPI BSCServiceProvider_QueryInterface (IServiceProvider *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI BSCServiceProvider_AddRef (IServiceProvider *iface)
 
static ULONG WINAPI BSCServiceProvider_Release (IServiceProvider *iface)
 
static HRESULT WINAPI BSCServiceProvider_QueryService (IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
 
void init_bscallback (BSCallback *This, const BSCallbackVtbl *vtbl, IMoniker *mon, DWORD bindf)
 
HRESULT read_stream (BSCallback *This, IStream *stream, void *buf, DWORD size, DWORD *ret_size)
 
static void parse_content_type (nsChannelBSC *This, const WCHAR *value)
 
static HRESULT parse_headers (const WCHAR *headers, struct list *headers_list)
 
static HRESULT process_response_headers (nsChannelBSC *This, const WCHAR *headers)
 
static void query_http_info (nsChannelBSC *This, IWinInetHttpInfo *wininet_info)
 
HRESULT start_binding (HTMLInnerWindow *inner_window, BSCallback *bscallback, IBindCtx *bctx)
 
static HRESULT read_post_data_stream (nsIInputStream *stream, BOOL contains_headers, struct list *headers_list, request_data_t *request_data)
 
static HRESULT on_start_nsrequest (nsChannelBSC *This)
 
static void on_stop_nsrequest (nsChannelBSC *This, HRESULT result)
 
static HRESULT read_stream_data (nsChannelBSC *This, IStream *stream)
 
static nsRedirectCallbackimpl_from_nsIAsyncVerifyRedirectCallback (nsIAsyncVerifyRedirectCallback *iface)
 
static nsresult NSAPI nsAsyncVerifyRedirectCallback_QueryInterface (nsIAsyncVerifyRedirectCallback *iface, nsIIDRef riid, void **result)
 
static nsrefcnt NSAPI nsAsyncVerifyRedirectCallback_AddRef (nsIAsyncVerifyRedirectCallback *iface)
 
static nsrefcnt NSAPI nsAsyncVerifyRedirectCallback_Release (nsIAsyncVerifyRedirectCallback *iface)
 
static nsresult NSAPI nsAsyncVerifyRedirectCallback_OnRedirectVerifyCallback (nsIAsyncVerifyRedirectCallback *iface, nsresult result)
 
static HRESULT create_redirect_callback (nsChannel *nschannel, nsChannelBSC *bsc, nsRedirectCallback **ret)
 
static nsChannelBSCnsChannelBSC_from_BSCallback (BSCallback *iface)
 
static void nsChannelBSC_destroy (BSCallback *bsc)
 
static HRESULT nsChannelBSC_start_binding (BSCallback *bsc)
 
static HRESULT nsChannelBSC_init_bindinfo (BSCallback *bsc)
 
static void stop_request_proc (task_t *_task)
 
static void stop_request_task_destr (task_t *_task)
 
static HRESULT async_stop_request (nsChannelBSC *This)
 
static void handle_navigation_error (nsChannelBSC *This, DWORD result)
 
static HRESULT nsChannelBSC_stop_binding (BSCallback *bsc, HRESULT result)
 
static HRESULT nsChannelBSC_read_data (BSCallback *bsc, IStream *stream)
 
static HRESULT handle_redirect (nsChannelBSC *This, const WCHAR *new_url)
 
static BOOL is_supported_doc_mime (const WCHAR *mime)
 
static IUriget_moniker_uri (IMoniker *mon)
 
static void handle_extern_mime_navigation (nsChannelBSC *This)
 
static HRESULT nsChannelBSC_on_progress (BSCallback *bsc, ULONG status_code, LPCWSTR status_text)
 
static HRESULT process_response_status_text (const WCHAR *header, const WCHAR *header_end, char **status_text)
 
static HRESULT nsChannelBSC_on_response (BSCallback *bsc, DWORD response_code, LPCWSTR response_headers)
 
static HRESULT nsChannelBSC_beginning_transaction (BSCallback *bsc, WCHAR **additional_headers)
 
HRESULT create_channelbsc (IMoniker *mon, const WCHAR *headers, BYTE *post_data, DWORD post_data_size, BOOL is_doc_binding, nsChannelBSC **retval)
 
static void start_doc_binding_proc (task_t *_task)
 
static void start_doc_binding_task_destr (task_t *_task)
 
HRESULT async_start_doc_binding (HTMLOuterWindow *window, HTMLInnerWindow *pending_window)
 
void abort_window_bindings (HTMLInnerWindow *window)
 
HRESULT channelbsc_load_stream (HTMLInnerWindow *pending_window, IMoniker *mon, IStream *stream)
 
void channelbsc_set_channel (nsChannelBSC *This, nsChannel *channel, nsIStreamListener *listener, nsISupports *context)
 
static void navigate_javascript_proc (task_t *_task)
 
static void navigate_javascript_task_destr (task_t *_task)
 
static void navigate_proc (task_t *_task)
 
static void navigate_task_destr (task_t *_task)
 
static HRESULT navigate_fragment (HTMLOuterWindow *window, IUri *uri)
 
HRESULT super_navigate (HTMLOuterWindow *window, IUri *uri, DWORD flags, const WCHAR *headers, BYTE *post_data, DWORD post_data_size)
 
HRESULT navigate_new_window (HTMLOuterWindow *window, IUri *uri, const WCHAR *name, request_data_t *request_data, IHTMLWindow2 **ret)
 
HRESULT hlink_frame_navigate (HTMLDocument *doc, LPCWSTR url, nsChannel *nschannel, DWORD hlnf, BOOL *cancel)
 
static HRESULT navigate_uri (HTMLOuterWindow *window, IUri *uri, const WCHAR *display_uri, const request_data_t *request_data, DWORD flags)
 
HRESULT load_uri (HTMLOuterWindow *window, IUri *uri, DWORD flags)
 
static HRESULT translate_uri (HTMLOuterWindow *window, IUri *orig_uri, BSTR *ret_display_uri, IUri **ret_uri)
 
HRESULT submit_form (HTMLOuterWindow *window, const WCHAR *target, IUri *submit_uri, nsIInputStream *post_stream)
 
HRESULT navigate_url (HTMLOuterWindow *window, const WCHAR *new_url, IUri *base_uri, DWORD flags)
 

Variables

static const WCHAR emptyW [] = {0}
 
static const WCHAR text_htmlW [] = {'t','e','x','t','/','h','t','m','l',0}
 
static const nsIInputStreamVtbl nsInputStreamVtbl
 
static const IBindStatusCallbackVtbl BindStatusCallbackVtbl
 
static const IHttpNegotiate2Vtbl HttpNegotiate2Vtbl
 
static const IInternetBindInfoVtbl InternetBindInfoVtbl
 
static const IServiceProviderVtbl ServiceProviderVtbl
 
static const nsIAsyncVerifyRedirectCallbackVtbl nsAsyncVerifyRedirectCallbackVtbl
 
static const BSCallbackVtbl nsChannelBSCVtbl
 

Macro Definition Documentation

◆ CONTENT_LENGTH

#define CONTENT_LENGTH   "Content-Length"

Definition at line 24 of file navigate.c.

◆ UTF16_STR

#define UTF16_STR   "utf-16"

Definition at line 26 of file navigate.c.

◆ UTF8_STR

#define UTF8_STR   "utf-8"

Definition at line 25 of file navigate.c.

Function Documentation

◆ abort_window_bindings()

void abort_window_bindings ( HTMLInnerWindow window)

Definition at line 1782 of file navigate.c.

1783{
1784 BSCallback *iter;
1785
1786 remove_target_tasks(window->task_magic);
1787
1788 while(!list_empty(&window->bindings)) {
1789 iter = LIST_ENTRY(window->bindings.next, BSCallback, entry);
1790
1791 TRACE("Aborting %p\n", iter);
1792
1793 IBindStatusCallback_AddRef(&iter->IBindStatusCallback_iface);
1794
1795 if(iter->binding)
1796 IBinding_Abort(iter->binding);
1797 else
1798 iter->vtbl->stop_binding(iter, E_ABORT);
1799
1800 iter->window = NULL;
1801 list_remove(&iter->entry);
1802 list_init(&iter->entry);
1803
1804 IBindStatusCallback_Release(&iter->IBindStatusCallback_iface);
1805 }
1806
1807 if(window->bscallback) {
1808 IBindStatusCallback_Release(&window->bscallback->bsc.IBindStatusCallback_iface);
1809 window->bscallback = NULL;
1810 }
1811
1812 if(window->mon) {
1813 IMoniker_Release(window->mon);
1814 window->mon = NULL;
1815 }
1816}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_init(struct list_entry *head)
Definition: list.h:51
#define NULL
Definition: types.h:112
uint32_t entry
Definition: isohybrid.c:63
static IHTMLWindow2 * window
Definition: events.c:77
void remove_target_tasks(LONG) DECLSPEC_HIDDEN
Definition: task.c:107
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT(* stop_binding)(BSCallback *, HRESULT)
Definition: binding.h:114
struct list entry
Definition: binding.h:92
IBindStatusCallback IBindStatusCallback_iface
Definition: binding.h:72
IBinding * binding
Definition: binding.h:88
HTMLInnerWindow * window
Definition: binding.h:90
const BSCallbackVtbl * vtbl
Definition: binding.h:77
#define LIST_ENTRY(type)
Definition: queue.h:175
#define E_ABORT
Definition: winerror.h:3481

Referenced by create_pending_window(), detach_inner_window(), release_outer_window(), and set_moniker().

◆ async_start_doc_binding()

HRESULT async_start_doc_binding ( HTMLOuterWindow window,
HTMLInnerWindow pending_window 
)

Definition at line 1765 of file navigate.c.

1766{
1768
1769 TRACE("%p\n", pending_window);
1770
1772 if(!task)
1773 return E_OUTOFMEMORY;
1774
1775 task->window = window;
1776 task->pending_window = pending_window;
1777 IHTMLWindow2_AddRef(&pending_window->base.IHTMLWindow2_iface);
1778
1780}
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
DWORD task
Definition: delayimp.cpp:484
static void start_doc_binding_task_destr(task_t *_task)
Definition: navigate.c:1757
static void start_doc_binding_proc(task_t *_task)
Definition: navigate.c:1749
HRESULT push_task(task_t *, task_proc_t, task_proc_t, LONG) DECLSPEC_HIDDEN
Definition: task.c:39
IHTMLWindow2 IHTMLWindow2_iface

Referenced by async_open().

◆ async_stop_request()

static HRESULT async_stop_request ( nsChannelBSC This)
static

Definition at line 1265 of file navigate.c.

1266{
1268
1269 if(!This->bsc.readed) {
1270 TRACE("No data read, calling OnStartRequest\n");
1272 }
1273
1274 task = heap_alloc(sizeof(*task));
1275 if(!task)
1276 return E_OUTOFMEMORY;
1277
1278 IBindStatusCallback_AddRef(&This->bsc.IBindStatusCallback_iface);
1279 task->bsc = This;
1280
1281 return push_task(&task->header, stop_request_proc, stop_request_task_destr, This->bsc.window->task_magic);
1282}
static void stop_request_proc(task_t *_task)
Definition: navigate.c:1246
static HRESULT on_start_nsrequest(nsChannelBSC *This)
Definition: navigate.c:903
static void stop_request_task_destr(task_t *_task)
Definition: navigate.c:1257

Referenced by channelbsc_load_stream(), and nsChannelBSC_stop_binding().

◆ BindStatusCallback_AddRef()

static ULONG WINAPI BindStatusCallback_AddRef ( IBindStatusCallback iface)
static

Definition at line 239 of file navigate.c.

240{
243
244 TRACE("(%p) ref = %d\n", This, ref);
245
246 return ref;
247}
#define InterlockedIncrement
Definition: armddk.h:53
static BindStatusCallback * impl_from_IBindStatusCallback(IBindStatusCallback *iface)
Definition: navigate.c:161
long LONG
Definition: pedump.c:60
Definition: send.c:48

◆ BindStatusCallback_GetBindInfo()

static HRESULT WINAPI BindStatusCallback_GetBindInfo ( IBindStatusCallback iface,
DWORD grfBINDF,
BINDINFO *  pbindinfo 
)
static

Definition at line 341 of file navigate.c.

343{
345 DWORD size;
346
347 TRACE("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
348
349 if(!This->bindinfo_ready) {
351
352 hres = This->vtbl->init_bindinfo(This);
353 if(FAILED(hres))
354 return hres;
355
356 This->bindinfo_ready = TRUE;
357 }
358
359 *grfBINDF = This->bindf;
360
361 size = pbindinfo->cbSize;
362 memset(pbindinfo, 0, size);
363 pbindinfo->cbSize = size;
364
365 pbindinfo->cbstgmedData = This->request_data.post_data_len;
366 pbindinfo->dwCodePage = CP_UTF8;
367 pbindinfo->dwOptions = 0x80000;
368
369 if(This->request_data.post_data_len) {
370 pbindinfo->dwBindVerb = BINDVERB_POST;
371
372 pbindinfo->stgmedData.tymed = TYMED_HGLOBAL;
373 pbindinfo->stgmedData.u.hGlobal = This->request_data.post_data;
374 pbindinfo->stgmedData.pUnkForRelease = (IUnknown*)&This->IBindStatusCallback_iface;
375 IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
376 }
377
378 return S_OK;
379}
#define TRUE
Definition: types.h:120
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hres
Definition: protocol.c:465
#define CP_UTF8
Definition: nls.h:20
#define memset(x, y, z)
Definition: compat.h:39

◆ BindStatusCallback_GetPriority()

static HRESULT WINAPI BindStatusCallback_GetPriority ( IBindStatusCallback iface,
LONG pnPriority 
)
static

Definition at line 287 of file navigate.c.

288{
290 FIXME("(%p)->(%p)\n", This, pnPriority);
291 return E_NOTIMPL;
292}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ BindStatusCallback_OnDataAvailable()

static HRESULT WINAPI BindStatusCallback_OnDataAvailable ( IBindStatusCallback iface,
DWORD  grfBSCF,
DWORD  dwSize,
FORMATETC *  pformatetc,
STGMEDIUM *  pstgmed 
)
static

Definition at line 381 of file navigate.c.

383{
385
386 TRACE("(%p)->(%08x %d %p %p)\n", This, grfBSCF, dwSize, pformatetc, pstgmed);
387
388 return This->vtbl->read_data(This, pstgmed->u.pstm);
389}
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56

◆ BindStatusCallback_OnLowResource()

static HRESULT WINAPI BindStatusCallback_OnLowResource ( IBindStatusCallback iface,
DWORD  reserved 
)
static

Definition at line 294 of file navigate.c.

295{
297 FIXME("(%p)->(%d)\n", This, reserved);
298 return E_NOTIMPL;
299}
r reserved
Definition: btrfs.c:3006

◆ BindStatusCallback_OnObjectAvailable()

static HRESULT WINAPI BindStatusCallback_OnObjectAvailable ( IBindStatusCallback iface,
REFIID  riid,
IUnknown punk 
)
static

Definition at line 391 of file navigate.c.

393{
395 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), punk);
396 return E_NOTIMPL;
397}
REFIID riid
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158

◆ BindStatusCallback_OnProgress()

static HRESULT WINAPI BindStatusCallback_OnProgress ( IBindStatusCallback iface,
ULONG  ulProgress,
ULONG  ulProgressMax,
ULONG  ulStatusCode,
LPCWSTR  szStatusText 
)
static

Definition at line 301 of file navigate.c.

303{
305
306 TRACE("%p)->(%u %u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode,
307 debugstr_w(szStatusText));
308
309 return This->vtbl->on_progress(This, ulStatusCode, szStatusText);
310}
#define debugstr_w
Definition: kernel32.h:32

◆ BindStatusCallback_OnStartBinding()

static HRESULT WINAPI BindStatusCallback_OnStartBinding ( IBindStatusCallback iface,
DWORD  dwReserved,
IBinding pbind 
)
static

Definition at line 271 of file navigate.c.

273{
275
276 TRACE("(%p)->(%d %p)\n", This, dwReserved, pbind);
277
278 IBinding_AddRef(pbind);
279 This->binding = pbind;
280
281 if(This->window)
282 list_add_head(&This->window->bindings, &This->entry);
283
284 return This->vtbl->start_binding(This);
285}
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95

◆ BindStatusCallback_OnStopBinding()

static HRESULT WINAPI BindStatusCallback_OnStopBinding ( IBindStatusCallback iface,
HRESULT  hresult,
LPCWSTR  szError 
)
static

Definition at line 312 of file navigate.c.

314{
317
318 TRACE("(%p)->(%08x %s)\n", This, hresult, debugstr_w(szError));
319
320 /* NOTE: IE7 calls GetBindResult here */
321
322 hres = This->vtbl->stop_binding(This, hresult);
323
324 if(This->binding) {
325 IBinding_Release(This->binding);
326 This->binding = NULL;
327 }
328
329 if(This->mon) {
330 IMoniker_Release(This->mon);
331 This->mon = NULL;
332 }
333
334 list_remove(&This->entry);
335 list_init(&This->entry);
336 This->window = NULL;
337
338 return hres;
339}

◆ BindStatusCallback_QueryInterface()

static HRESULT WINAPI BindStatusCallback_QueryInterface ( IBindStatusCallback iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 204 of file navigate.c.

206{
208
209 *ppv = NULL;
211 TRACE("(%p)->(IID_IUnknown, %p)\n", This, ppv);
212 *ppv = &This->IBindStatusCallback_iface;
213 }else if(IsEqualGUID(&IID_IBindStatusCallback, riid)) {
214 TRACE("(%p)->(IID_IBindStatusCallback, %p)\n", This, ppv);
215 *ppv = &This->IBindStatusCallback_iface;
216 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
217 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
218 *ppv = &This->IServiceProvider_iface;
219 }else if(IsEqualGUID(&IID_IHttpNegotiate, riid)) {
220 TRACE("(%p)->(IID_IHttpNegotiate %p)\n", This, ppv);
221 *ppv = &This->IHttpNegotiate2_iface;
222 }else if(IsEqualGUID(&IID_IHttpNegotiate2, riid)) {
223 TRACE("(%p)->(IID_IHttpNegotiate2 %p)\n", This, ppv);
224 *ppv = &This->IHttpNegotiate2_iface;
225 }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) {
226 TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv);
227 *ppv = &This->IInternetBindInfo_iface;
228 }
229
230 if(*ppv) {
231 IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
232 return S_OK;
233 }
234
235 TRACE("Unsupported riid = %s\n", debugstr_guid(riid));
236 return E_NOINTERFACE;
237}
const GUID IID_IUnknown
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ BindStatusCallback_Release()

static ULONG WINAPI BindStatusCallback_Release ( IBindStatusCallback iface)
static

Definition at line 249 of file navigate.c.

250{
253
254 TRACE("(%p) ref = %d\n", This, ref);
255
256 if(!ref) {
257 release_request_data(&This->request_data);
258 if(This->mon)
259 IMoniker_Release(This->mon);
260 if(This->binding)
261 IBinding_Release(This->binding);
262 list_remove(&This->entry);
263 list_init(&This->entry);
264
265 This->vtbl->destroy(This);
266 }
267
268 return ref;
269}
#define InterlockedDecrement
Definition: armddk.h:52
static void release_request_data(request_data_t *request_data)
Definition: navigate.c:190

◆ BSCServiceProvider_AddRef()

static ULONG WINAPI BSCServiceProvider_AddRef ( IServiceProvider iface)
static

Definition at line 553 of file navigate.c.

554{
556 return IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
557}
static BSCallback * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: navigate.c:541

◆ BSCServiceProvider_QueryInterface()

static HRESULT WINAPI BSCServiceProvider_QueryInterface ( IServiceProvider iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 546 of file navigate.c.

548{
550 return IBindStatusCallback_QueryInterface(&This->IBindStatusCallback_iface, riid, ppv);
551}

◆ BSCServiceProvider_QueryService()

static HRESULT WINAPI BSCServiceProvider_QueryService ( IServiceProvider iface,
REFGUID  guidService,
REFIID  riid,
void **  ppv 
)
static

Definition at line 565 of file navigate.c.

567{
569
570 TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
571
572 if(This->window && IsEqualGUID(guidService, &IID_IWindowForBindingUI))
573 return IServiceProvider_QueryService(&This->window->base.IServiceProvider_iface, guidService, riid, ppv);
574 return E_NOINTERFACE;
575}

◆ BSCServiceProvider_Release()

static ULONG WINAPI BSCServiceProvider_Release ( IServiceProvider iface)
static

Definition at line 559 of file navigate.c.

560{
562 return IBindStatusCallback_Release(&This->IBindStatusCallback_iface);
563}

◆ channelbsc_load_stream()

HRESULT channelbsc_load_stream ( HTMLInnerWindow pending_window,
IMoniker mon,
IStream stream 
)

Definition at line 1818 of file navigate.c.

1819{
1820 nsChannelBSC *bscallback = pending_window->bscallback;
1821 HRESULT hres = S_OK;
1822
1823 if(!bscallback->nschannel) {
1824 ERR("NULL nschannel\n");
1825 return E_FAIL;
1826 }
1827
1828 bscallback->nschannel->content_type = heap_strdupA("text/html");
1829 if(!bscallback->nschannel->content_type)
1830 return E_OUTOFMEMORY;
1831
1832 set_current_mon(pending_window->base.outer_window, mon, 0);
1833
1834 bscallback->bsc.window = pending_window;
1835 if(stream)
1836 hres = read_stream_data(bscallback, stream);
1837 if(SUCCEEDED(hres))
1838 hres = async_stop_request(bscallback);
1839 if(FAILED(hres))
1840 IBindStatusCallback_OnStopBinding(&bscallback->bsc.IBindStatusCallback_iface, hres,
1842
1843 return hres;
1844}
#define ERR(fmt,...)
Definition: precomp.h:57
void set_current_mon(HTMLOuterWindow *, IMoniker *, DWORD) DECLSPEC_HIDDEN
Definition: persist.c:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
#define SUCCEEDED(hr)
Definition: intsafe.h:50
static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
Definition: navigate.c:960
static HRESULT async_stop_request(nsChannelBSC *This)
Definition: navigate.c:1265
static char * heap_strdupA(const char *str)
nsChannelBSC * bscallback
HTMLOuterWindow * outer_window
nsChannel * nschannel
Definition: binding.h:100
BSCallback bsc
Definition: binding.h:98
char * content_type
Definition: binding.h:53
Definition: parse.h:23

Referenced by PersistStreamInit_InitNew(), and PersistStreamInit_Load().

◆ channelbsc_set_channel()

void channelbsc_set_channel ( nsChannelBSC This,
nsChannel channel,
nsIStreamListener listener,
nsISupports context 
)

Definition at line 1846 of file navigate.c.

1847{
1848 nsIHttpChannel_AddRef(&channel->nsIHttpChannel_iface);
1849 This->nschannel = channel;
1850
1851 nsIStreamListener_AddRef(listener);
1852 This->nslistener = listener;
1853
1854 if(context) {
1855 nsISupports_AddRef(context);
1856 This->nscontext = context;
1857 }
1858
1859 if(This->bsc.request_data.headers) {
1860 HRESULT hres;
1861
1862 hres = parse_headers(This->bsc.request_data.headers, &channel->request_headers);
1863 heap_free(This->bsc.request_data.headers);
1864 This->bsc.request_data.headers = NULL;
1865 if(FAILED(hres))
1866 WARN("parse_headers failed: %08x\n", hres);
1867 }
1868}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define WARN(fmt,...)
Definition: precomp.h:61
static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list)
Definition: navigate.c:681
Definition: http.c:7252
struct list request_headers
Definition: binding.h:59
nsIHttpChannel nsIHttpChannel_iface
Definition: binding.h:37

Referenced by async_open(), and nsChannel_AsyncOpen().

◆ create_channelbsc()

HRESULT create_channelbsc ( IMoniker mon,
const WCHAR headers,
BYTE post_data,
DWORD  post_data_size,
BOOL  is_doc_binding,
nsChannelBSC **  retval 
)

Definition at line 1700 of file navigate.c.

1702{
1704 DWORD bindf;
1705
1706 ret = heap_alloc_zero(sizeof(*ret));
1707 if(!ret)
1708 return E_OUTOFMEMORY;
1709
1710 bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
1711 if(post_data_size)
1712 bindf |= BINDF_FORMS_SUBMIT | BINDF_PRAGMA_NO_CACHE | BINDF_HYPERLINK | BINDF_GETNEWESTVERSION;
1713
1715 ret->is_doc_channel = is_doc_binding;
1716
1717 if(headers) {
1718 ret->bsc.request_data.headers = heap_strdupW(headers);
1719 if(!ret->bsc.request_data.headers) {
1720 IBindStatusCallback_Release(&ret->bsc.IBindStatusCallback_iface);
1721 return E_OUTOFMEMORY;
1722 }
1723 }
1724
1725 if(post_data) {
1726 ret->bsc.request_data.post_data = GlobalAlloc(0, post_data_size+1);
1727 if(!ret->bsc.request_data.post_data) {
1728 release_request_data(&ret->bsc.request_data);
1729 IBindStatusCallback_Release(&ret->bsc.IBindStatusCallback_iface);
1730 return E_OUTOFMEMORY;
1731 }
1732
1733 memcpy(ret->bsc.request_data.post_data, post_data, post_data_size);
1734 ((BYTE*)ret->bsc.request_data.post_data)[post_data_size] = 0;
1735 ret->bsc.request_data.post_data_len = post_data_size;
1736 }
1737
1738 TRACE("created %p\n", ret);
1739 *retval = ret;
1740 return S_OK;
1741}
static WCHAR * heap_strdupW(const WCHAR *str)
Definition: edit.c:4325
return ret
Definition: mutex.c:147
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static DWORD bindf
Definition: protocol.c:70
static const CHAR post_data[]
Definition: protocol.c:222
static const BSCallbackVtbl nsChannelBSCVtbl
Definition: navigate.c:1689
void init_bscallback(BSCallback *This, const BSCallbackVtbl *vtbl, IMoniker *mon, DWORD bindf)
Definition: navigate.c:584
vector< Header * > headers
Definition: sdkparse.cpp:39
int retval
Definition: wcstombs.cpp:91
unsigned char BYTE
Definition: xxhash.c:193

Referenced by async_open(), hlink_frame_navigate(), navigate_new_window(), set_moniker(), and super_navigate().

◆ create_nsprotocol_stream()

static nsProtocolStream * create_nsprotocol_stream ( void  )
static

Definition at line 175 of file navigate.c.

176{
178
180 if(!ret)
181 return NULL;
182
183 ret->nsIInputStream_iface.lpVtbl = &nsInputStreamVtbl;
184 ret->ref = 1;
185 ret->buf_size = 0;
186
187 return ret;
188}
static const nsIInputStreamVtbl nsInputStreamVtbl
Definition: navigate.c:164

Referenced by read_stream_data().

◆ create_redirect_callback()

static HRESULT create_redirect_callback ( nsChannel nschannel,
nsChannelBSC bsc,
nsRedirectCallback **  ret 
)
static

Definition at line 1174 of file navigate.c.

1175{
1177
1178 callback = heap_alloc(sizeof(*callback));
1179 if(!callback)
1180 return E_OUTOFMEMORY;
1181
1182 callback->nsIAsyncVerifyRedirectCallback_iface.lpVtbl = &nsAsyncVerifyRedirectCallbackVtbl;
1183 callback->ref = 1;
1184
1185 nsIHttpChannel_AddRef(&nschannel->nsIHttpChannel_iface);
1186 callback->nschannel = nschannel;
1187
1188 IBindStatusCallback_AddRef(&bsc->bsc.IBindStatusCallback_iface);
1189 callback->bsc = bsc;
1190
1191 *ret = callback;
1192 return S_OK;
1193}
static IPrintDialogCallback callback
Definition: printdlg.c:326
static const nsIAsyncVerifyRedirectCallbackVtbl nsAsyncVerifyRedirectCallbackVtbl
Definition: navigate.c:1167
Definition: xmldoc.c:231
IBindStatusCallback IBindStatusCallback_iface
Definition: xmldoc.c:232

Referenced by handle_redirect().

◆ get_moniker_uri()

static IUri * get_moniker_uri ( IMoniker mon)
static

Definition at line 1456 of file navigate.c.

1457{
1458 IUriContainer *uri_container;
1459 IUri *ret = NULL;
1460 HRESULT hres;
1461
1462 hres = IMoniker_QueryInterface(mon, &IID_IUriContainer, (void**)&uri_container);
1463 if(SUCCEEDED(hres)) {
1464 hres = IUriContainer_GetIUri(uri_container, &ret);
1465 IUriContainer_Release(uri_container);
1466 if(FAILED(hres))
1467 return NULL;
1468 }else {
1469 FIXME("No IUriContainer\n");
1470 }
1471
1472 return ret;
1473}

Referenced by handle_extern_mime_navigation().

◆ handle_extern_mime_navigation()

static void handle_extern_mime_navigation ( nsChannelBSC This)
static

Definition at line 1475 of file navigate.c.

1476{
1477 IWebBrowserPriv2IE9 *webbrowser_priv;
1478 IOleCommandTarget *cmdtrg;
1479 HTMLDocumentObj *doc_obj;
1480 IBindCtx *bind_ctx;
1481 IUri *uri;
1482 VARIANT flags;
1483 HRESULT hres;
1484
1485 if(!This->bsc.window || !This->bsc.window->base.outer_window || !This->bsc.window->base.outer_window->doc_obj)
1486 return;
1487
1488 doc_obj = This->bsc.window->base.outer_window->doc_obj;
1489
1490 hres = IOleClientSite_QueryInterface(doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg);
1491 if(SUCCEEDED(hres)) {
1492 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 62, 0, NULL, NULL);
1493 IOleCommandTarget_Release(cmdtrg);
1494 }
1495
1497
1498 if(!doc_obj->webbrowser) {
1499 FIXME("unimplemented in non-webbrowser mode\n");
1500 return;
1501 }
1502
1503 uri = get_moniker_uri(This->bsc.mon);
1504 if(!uri)
1505 return;
1506
1507 hres = CreateBindCtx(0, &bind_ctx);
1508 if(FAILED(hres)) {
1509 IUri_Release(uri);
1510 return;
1511 }
1512
1513 V_VT(&flags) = VT_I4;
1514 V_I4(&flags) = navHyperlink;
1515
1516 hres = IUnknown_QueryInterface(doc_obj->webbrowser, &IID_IWebBrowserPriv2IE8, (void**)&webbrowser_priv);
1517 if(SUCCEEDED(hres)) {
1518 hres = IWebBrowserPriv2IE9_NavigateWithBindCtx2(webbrowser_priv, uri, &flags, NULL, NULL, NULL, bind_ctx, NULL, 0);
1519 IWebBrowserPriv2IE9_Release(webbrowser_priv);
1520 }else {
1521 IWebBrowserPriv *webbrowser_priv_old;
1522 VARIANT uriv;
1523
1524 hres = IUnknown_QueryInterface(doc_obj->webbrowser, &IID_IWebBrowserPriv, (void**)&webbrowser_priv_old);
1525 if(SUCCEEDED(hres)) {
1526 V_VT(&uriv) = VT_BSTR;
1527 IUri_GetDisplayUri(uri, &V_BSTR(&uriv));
1528
1529 hres = IWebBrowserPriv_NavigateWithBindCtx(webbrowser_priv_old, &uriv, &flags, NULL, NULL, NULL, bind_ctx, NULL);
1530
1531 SysFreeString(V_BSTR(&uriv));
1532 IWebBrowserPriv_Release(webbrowser_priv_old);
1533 }
1534 }
1535
1536 IUri_Release(uri);
1537}
#define FALSE
Definition: types.h:117
@ VT_BSTR
Definition: compat.h:2303
@ VT_I4
Definition: compat.h:2298
GLbitfield flags
Definition: glext.h:7161
const WCHAR * uri
Definition: sec_mgr.c:1564
static IUri * get_moniker_uri(IMoniker *mon)
Definition: navigate.c:1456
void set_document_navigation(HTMLDocumentObj *, BOOL) DECLSPEC_HIDDEN
Definition: oleobj.c:193
HRESULT WINAPI CreateBindCtx(DWORD reserved, IBindCtx **bind_context)
Definition: bindctx.c:491
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
IOleClientSite * client
IUnknown * webbrowser

Referenced by nsChannelBSC_on_progress().

◆ handle_navigation_error()

static void handle_navigation_error ( nsChannelBSC This,
DWORD  result 
)
static

Definition at line 1284 of file navigate.c.

1285{
1286 HTMLOuterWindow *outer_window;
1287 HTMLDocumentObj *doc;
1288 BOOL is_error_url;
1289 SAFEARRAY *sa;
1290 SAFEARRAYBOUND bound;
1291 VARIANT var, varOut;
1292 LONG ind;
1293 BSTR unk;
1294 HRESULT hres;
1295
1296 if(!This->is_doc_channel || !This->bsc.window)
1297 return;
1298
1299 outer_window = This->bsc.window->base.outer_window;
1300
1301 doc = outer_window->doc_obj;
1302 if(!doc || !doc->doc_object_service || !doc->client)
1303 return;
1304
1305 hres = IDocObjectService_IsErrorUrl(doc->doc_object_service,
1306 outer_window->url, &is_error_url);
1307 if(FAILED(hres) || is_error_url)
1308 return;
1309
1310 if(!doc->client_cmdtrg)
1311 return;
1312
1313 bound.lLbound = 0;
1314 bound.cElements = 8;
1315 sa = SafeArrayCreate(VT_VARIANT, 1, &bound);
1316 if(!sa)
1317 return;
1318
1319 ind = 0;
1320 V_VT(&var) = VT_I4;
1321 V_I4(&var) = result;
1322 SafeArrayPutElement(sa, &ind, &var);
1323
1324 ind = 1;
1325 V_VT(&var) = VT_BSTR;
1326 V_BSTR(&var) = outer_window->url;
1327 SafeArrayPutElement(sa, &ind, &var);
1328
1329 ind = 3;
1330 V_VT(&var) = VT_UNKNOWN;
1331 V_UNKNOWN(&var) = (IUnknown*)&outer_window->base.IHTMLWindow2_iface;
1332 SafeArrayPutElement(sa, &ind, &var);
1333
1334 /* FIXME: what are the following fields for? */
1335 ind = 2;
1336 V_VT(&var) = VT_UNKNOWN;
1337 V_UNKNOWN(&var) = NULL;
1338 SafeArrayPutElement(sa, &ind, &var);
1339
1340 ind = 4;
1341 V_VT(&var) = VT_BOOL;
1342 V_BOOL(&var) = FALSE;
1343 SafeArrayPutElement(sa, &ind, &var);
1344
1345 ind = 5;
1346 V_VT(&var) = VT_BOOL;
1347 V_BOOL(&var) = FALSE;
1348 SafeArrayPutElement(sa, &ind, &var);
1349
1350 ind = 6;
1351 V_VT(&var) = VT_BSTR;
1352 unk = SysAllocString(NULL);
1353 V_BSTR(&var) = unk;
1354 SafeArrayPutElement(sa, &ind, &var);
1355
1356 ind = 7;
1357 V_VT(&var) = VT_UNKNOWN;
1358 V_UNKNOWN(&var) = NULL;
1359 SafeArrayPutElement(sa, &ind, &var);
1360
1361 V_VT(&var) = VT_ARRAY;
1362 V_ARRAY(&var) = sa;
1363 V_VT(&varOut) = VT_BOOL;
1364 V_BOOL(&varOut) = VARIANT_TRUE;
1365 IOleCommandTarget_Exec(doc->client_cmdtrg, &CGID_DocHostCmdPriv, 1, 0, &var, FAILED(hres)?NULL:&varOut);
1366
1367 SysFreeString(unk);
1369}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
OLECHAR * BSTR
Definition: compat.h:2293
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_ARRAY
Definition: compat.h:2341
@ VT_VARIANT
Definition: compat.h:2307
@ VT_BOOL
Definition: compat.h:2306
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
SAFEARRAY *WINAPI SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound)
Definition: safearray.c:600
HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:864
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint64EXT * result
Definition: glext.h:11304
const char * var
Definition: shader.c:5666
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_UNKNOWN(A)
Definition: oleauto.h:281
IDocObjectService * doc_object_service
IOleCommandTarget * client_cmdtrg
HTMLDocumentObj * doc_obj

◆ handle_redirect()

static HRESULT handle_redirect ( nsChannelBSC This,
const WCHAR new_url 
)
static

Definition at line 1396 of file navigate.c.

1397{
1400 nsChannel *new_channel;
1401 nsresult nsres;
1402 HRESULT hres;
1403
1404 TRACE("(%p)->(%s)\n", This, debugstr_w(new_url));
1405
1406 if(!This->nschannel || !This->nschannel->notif_callback)
1407 return S_OK;
1408
1409 nsres = nsIInterfaceRequestor_GetInterface(This->nschannel->notif_callback, &IID_nsIChannelEventSink, (void**)&sink);
1410 if(NS_FAILED(nsres))
1411 return S_OK;
1412
1413 hres = create_redirect_nschannel(new_url, This->nschannel, &new_channel);
1414 if(SUCCEEDED(hres)) {
1415 TRACE("%p %p->%p\n", This, This->nschannel, new_channel);
1416
1417 hres = create_redirect_callback(new_channel, This, &callback);
1418 nsIHttpChannel_Release(&new_channel->nsIHttpChannel_iface);
1419 }
1420
1421 if(SUCCEEDED(hres)) {
1422 nsres = nsIChannelEventSink_AsyncOnChannelRedirect(sink, (nsIChannel*)&This->nschannel->nsIHttpChannel_iface,
1423 (nsIChannel*)&callback->nschannel->nsIHttpChannel_iface, REDIRECT_TEMPORARY, /* FIXME */
1424 &callback->nsIAsyncVerifyRedirectCallback_iface);
1425
1426 if(NS_FAILED(nsres))
1427 FIXME("AsyncOnChannelRedirect failed: %08x\n", hres);
1428 else if(This->nschannel != callback->nschannel)
1429 FIXME("nschannel not updated\n");
1430
1431 nsIAsyncVerifyRedirectCallback_Release(&callback->nsIAsyncVerifyRedirectCallback_iface);
1432 }
1433
1434 nsIChannelEventSink_Release(sink);
1435 return hres;
1436}
HRESULT create_redirect_nschannel(const WCHAR *, nsChannel *, nsChannel **) DECLSPEC_HIDDEN
Definition: nsio.c:3251
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
static HRESULT create_redirect_callback(nsChannel *nschannel, nsChannelBSC *bsc, nsRedirectCallback **ret)
Definition: navigate.c:1174
#define NS_FAILED(res)

Referenced by nsChannelBSC_on_progress().

◆ hlink_frame_navigate()

HRESULT hlink_frame_navigate ( HTMLDocument doc,
LPCWSTR  url,
nsChannel nschannel,
DWORD  hlnf,
BOOL cancel 
)

Definition at line 2200 of file navigate.c.

2201{
2202 IHlinkFrame *hlink_frame;
2204 IBindCtx *bindctx;
2205 IMoniker *mon;
2206 IHlink *hlink;
2207 HRESULT hres;
2208
2209 *cancel = FALSE;
2210
2211 hres = do_query_service((IUnknown*)doc->doc_obj->client, &IID_IHlinkFrame, &IID_IHlinkFrame,
2212 (void**)&hlink_frame);
2213 if(FAILED(hres))
2214 return S_OK;
2215
2217 if(FAILED(hres)) {
2218 IHlinkFrame_Release(hlink_frame);
2219 return hres;
2220 }
2221
2222 if(nschannel)
2224 &nschannel->request_headers, &callback->bsc.request_data);
2225
2226 hres = CreateAsyncBindCtx(0, &callback->bsc.IBindStatusCallback_iface, NULL, &bindctx);
2227 if(SUCCEEDED(hres))
2228 hres = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER,
2229 &IID_IHlink, (LPVOID*)&hlink);
2230
2231 if(SUCCEEDED(hres))
2232 hres = CreateURLMoniker(NULL, url, &mon);
2233
2234 if(SUCCEEDED(hres)) {
2235 IHlink_SetMonikerReference(hlink, HLINKSETF_TARGET, mon, NULL);
2236
2237 if(hlnf & HLNF_OPENINNEWWINDOW) {
2238 static const WCHAR wszBlank[] = {'_','b','l','a','n','k',0};
2239 IHlink_SetTargetFrameName(hlink, wszBlank); /* FIXME */
2240 }
2241
2242 hres = IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx,
2243 &callback->bsc.IBindStatusCallback_iface, hlink);
2244 IMoniker_Release(mon);
2245 *cancel = hres == S_OK;
2246 hres = S_OK;
2247 }
2248
2249 IHlinkFrame_Release(hlink_frame);
2250 IBindCtx_Release(bindctx);
2251 IBindStatusCallback_Release(&callback->bsc.IBindStatusCallback_iface);
2252 return hres;
2253}
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
HRESULT do_query_service(IUnknown *unk, REFGUID guid_service, REFIID riid, void **ppv)
Definition: main.c:148
static const WCHAR url[]
Definition: encode.c:1384
static HRESULT read_post_data_stream(nsIInputStream *stream, BOOL contains_headers, struct list *headers_list, request_data_t *request_data)
Definition: navigate.c:800
HRESULT create_channelbsc(IMoniker *mon, const WCHAR *headers, BYTE *post_data, DWORD post_data_size, BOOL is_doc_binding, nsChannelBSC **retval)
Definition: navigate.c:1700
short WCHAR
Definition: pedump.c:58
HTMLDocumentObj * doc_obj
nsIInputStream * post_data_stream
Definition: binding.h:44
BOOL post_data_contains_headers
Definition: binding.h:45
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:747
HRESULT WINAPI CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx **pbind)
Definition: bindctx.c:899

Referenced by before_async_open(), and navigate_uri().

◆ HttpNegotiate_AddRef()

static ULONG WINAPI HttpNegotiate_AddRef ( IHttpNegotiate2 iface)
static

Definition at line 425 of file navigate.c.

426{
428 return IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
429}
static BSCallback * impl_from_IHttpNegotiate2(IHttpNegotiate2 *iface)
Definition: navigate.c:413

◆ HttpNegotiate_BeginningTransaction()

static HRESULT WINAPI HttpNegotiate_BeginningTransaction ( IHttpNegotiate2 iface,
LPCWSTR  szURL,
LPCWSTR  szHeaders,
DWORD  dwReserved,
LPWSTR pszAdditionalHeaders 
)
static

Definition at line 437 of file navigate.c.

439{
442
443 TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders),
444 dwReserved, pszAdditionalHeaders);
445
446 *pszAdditionalHeaders = NULL;
447
448 hres = This->vtbl->beginning_transaction(This, pszAdditionalHeaders);
449 if(hres != S_FALSE)
450 return hres;
451
452 if(This->request_data.headers) {
453 DWORD size;
454
455 size = (strlenW(This->request_data.headers)+1)*sizeof(WCHAR);
456 *pszAdditionalHeaders = CoTaskMemAlloc(size);
457 if(!*pszAdditionalHeaders)
458 return E_OUTOFMEMORY;
459 memcpy(*pszAdditionalHeaders, This->request_data.headers, size);
460 }
461
462 return S_OK;
463}
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
#define strlenW(s)
Definition: unicode.h:28
#define S_FALSE
Definition: winerror.h:3451

◆ HttpNegotiate_GetRootSecurityId()

static HRESULT WINAPI HttpNegotiate_GetRootSecurityId ( IHttpNegotiate2 iface,
BYTE pbSecurityId,
DWORD pcbSecurityId,
DWORD_PTR  dwReserved 
)
static

Definition at line 476 of file navigate.c.

478{
480 FIXME("(%p)->(%p %p %ld)\n", This, pbSecurityId, pcbSecurityId, dwReserved);
481 return E_NOTIMPL;
482}

◆ HttpNegotiate_OnResponse()

static HRESULT WINAPI HttpNegotiate_OnResponse ( IHttpNegotiate2 iface,
DWORD  dwResponseCode,
LPCWSTR  szResponseHeaders,
LPCWSTR  szRequestHeaders,
LPWSTR pszAdditionalRequestHeaders 
)
static

Definition at line 465 of file navigate.c.

467{
469
470 TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
471 debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
472
473 return This->vtbl->on_response(This, dwResponseCode, szResponseHeaders);
474}

◆ HttpNegotiate_QueryInterface()

static HRESULT WINAPI HttpNegotiate_QueryInterface ( IHttpNegotiate2 iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 418 of file navigate.c.

420{
422 return IBindStatusCallback_QueryInterface(&This->IBindStatusCallback_iface, riid, ppv);
423}

◆ HttpNegotiate_Release()

static ULONG WINAPI HttpNegotiate_Release ( IHttpNegotiate2 iface)
static

Definition at line 431 of file navigate.c.

432{
434 return IBindStatusCallback_Release(&This->IBindStatusCallback_iface);
435}

◆ impl_from_IBindStatusCallback()

static BSCallback * impl_from_IBindStatusCallback ( IBindStatusCallback iface)
inlinestatic

Definition at line 199 of file navigate.c.

200{
201 return CONTAINING_RECORD(iface, BSCallback, IBindStatusCallback_iface);
202}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

◆ impl_from_IHttpNegotiate2()

static BSCallback * impl_from_IHttpNegotiate2 ( IHttpNegotiate2 iface)
inlinestatic

◆ impl_from_IInternetBindInfo()

static BSCallback * impl_from_IInternetBindInfo ( IInternetBindInfo iface)
inlinestatic

◆ impl_from_IServiceProvider()

static BSCallback * impl_from_IServiceProvider ( IServiceProvider iface)
inlinestatic

Definition at line 541 of file navigate.c.

542{
543 return CONTAINING_RECORD(iface, BSCallback, IServiceProvider_iface);
544}

Referenced by BSCServiceProvider_AddRef(), BSCServiceProvider_QueryInterface(), BSCServiceProvider_QueryService(), and BSCServiceProvider_Release().

◆ impl_from_nsIAsyncVerifyRedirectCallback()

static nsRedirectCallback * impl_from_nsIAsyncVerifyRedirectCallback ( nsIAsyncVerifyRedirectCallback iface)
static

◆ impl_from_nsIInputStream()

◆ init_bscallback()

void init_bscallback ( BSCallback This,
const BSCallbackVtbl vtbl,
IMoniker mon,
DWORD  bindf 
)

Definition at line 584 of file navigate.c.

585{
586 This->IBindStatusCallback_iface.lpVtbl = &BindStatusCallbackVtbl;
587 This->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
588 This->IHttpNegotiate2_iface.lpVtbl = &HttpNegotiate2Vtbl;
589 This->IInternetBindInfo_iface.lpVtbl = &InternetBindInfoVtbl;
590 This->vtbl = vtbl;
591 This->ref = 1;
592 This->bindf = bindf;
593 This->bom = BOM_NONE;
594
595 list_init(&This->entry);
596
597 if(mon)
598 IMoniker_AddRef(mon);
599 This->mon = mon;
600}
@ BOM_NONE
Definition: binding.h:31
static const IBindStatusCallbackVtbl BindStatusCallbackVtbl
Definition: navigate.c:426
static const IInternetBindInfoVtbl InternetBindInfoVtbl
Definition: navigate.c:533
static const IHttpNegotiate2Vtbl HttpNegotiate2Vtbl
Definition: navigate.c:484
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: navigate.c:577

Referenced by bind_script_to_text(), and create_channelbsc().

◆ InternetBindInfo_AddRef()

static ULONG WINAPI InternetBindInfo_AddRef ( IInternetBindInfo iface)
static

Definition at line 505 of file navigate.c.

506{
508 return IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
509}
static BSCallback * impl_from_IInternetBindInfo(IInternetBindInfo *iface)
Definition: navigate.c:493

◆ InternetBindInfo_GetBindInfo()

static HRESULT WINAPI InternetBindInfo_GetBindInfo ( IInternetBindInfo iface,
DWORD grfBINDF,
BINDINFO *  pbindinfo 
)
static

Definition at line 517 of file navigate.c.

519{
521 FIXME("(%p)->(%p %p)\n", This, grfBINDF, pbindinfo);
522 return E_NOTIMPL;
523}

◆ InternetBindInfo_GetBindString()

static HRESULT WINAPI InternetBindInfo_GetBindString ( IInternetBindInfo iface,
ULONG  ulStringType,
LPOLESTR *  ppwzStr,
ULONG  cEl,
ULONG pcElFetched 
)
static

Definition at line 525 of file navigate.c.

527{
529 FIXME("(%p)->(%u %p %u %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched);
530 return E_NOTIMPL;
531}

◆ InternetBindInfo_QueryInterface()

static HRESULT WINAPI InternetBindInfo_QueryInterface ( IInternetBindInfo iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 498 of file navigate.c.

500{
502 return IBindStatusCallback_QueryInterface(&This->IBindStatusCallback_iface, riid, ppv);
503}

◆ InternetBindInfo_Release()

static ULONG WINAPI InternetBindInfo_Release ( IInternetBindInfo iface)
static

Definition at line 511 of file navigate.c.

512{
514 return IBindStatusCallback_Release(&This->IBindStatusCallback_iface);
515}

◆ is_supported_doc_mime()

static BOOL is_supported_doc_mime ( const WCHAR mime)
static

Definition at line 1438 of file navigate.c.

1439{
1440 char *nscat, *mimea;
1441 BOOL ret;
1442
1443 mimea = heap_strdupWtoA(mime);
1444 if(!mimea)
1445 return FALSE;
1446
1447 nscat = get_nscategory_entry("Gecko-Content-Viewers", mimea);
1448
1449 ret = nscat != NULL && !strcmp(nscat, "@mozilla.org/content/document-loader-factory;1");
1450
1451 heap_free(mimea);
1452 nsfree(nscat);
1453 return ret;
1454}
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
const WCHAR * mime
Definition: mimefilter.c:487
void nsfree(void *) DECLSPEC_HIDDEN
Definition: nsembed.c:783
static char * heap_strdupWtoA(LPCWSTR str)
char * get_nscategory_entry(const char *, const char *) DECLSPEC_HIDDEN
Definition: nsembed.c:928

Referenced by nsChannelBSC_on_progress().

◆ load_uri()

HRESULT load_uri ( HTMLOuterWindow window,
IUri uri,
DWORD  flags 
)

Definition at line 2313 of file navigate.c.

2314{
2315 BSTR display_uri;
2316 HRESULT hres;
2317
2318 hres = IUri_GetDisplayUri(uri, &display_uri);
2319 if(FAILED(hres))
2320 return hres;
2321
2322 hres = navigate_uri(window, uri, display_uri, NULL, flags);
2323 SysFreeString(display_uri);
2324 return hres;
2325}
static HRESULT navigate_uri(HTMLOuterWindow *window, IUri *uri, const WCHAR *display_uri, const request_data_t *request_data, DWORD flags)
Definition: navigate.c:2255

Referenced by PersistHistory_LoadHistory(), and refresh_proc().

◆ navigate_fragment()

static HRESULT navigate_fragment ( HTMLOuterWindow window,
IUri uri 
)
static

Definition at line 1954 of file navigate.c.

1955{
1956 nsIDOMLocation *nslocation;
1957 nsAString nsfrag_str;
1958 WCHAR *selector;
1959 BSTR frag;
1960 nsresult nsres;
1961 HRESULT hres;
1962
1963 const WCHAR selector_formatW[] = {'a','[','i','d','=','"','%','s','"',']',0};
1964
1966
1967 nsres = nsIDOMWindow_GetLocation(window->nswindow, &nslocation);
1968 if(FAILED(nsres) || !nslocation)
1969 return E_FAIL;
1970
1971 hres = IUri_GetFragment(uri, &frag);
1972 if(FAILED(hres)) {
1973 nsIDOMLocation_Release(nslocation);
1974 return hres;
1975 }
1976
1977 nsAString_InitDepend(&nsfrag_str, frag);
1978 nsres = nsIDOMLocation_SetHash(nslocation, &nsfrag_str);
1979 nsAString_Finish(&nsfrag_str);
1980 nsIDOMLocation_Release(nslocation);
1981 if(NS_FAILED(nsres))
1982 ERR("SetHash failed: %08x\n", nsres);
1983
1984 /*
1985 * IE supports scrolling to anchor elements with "#hash" ids (note that '#' is part of the id),
1986 * while Gecko scrolls only to elements with "hash" ids. We scroll the page ourselves if
1987 * a[id="#hash"] element can be found.
1988 */
1989 selector = heap_alloc(sizeof(selector_formatW)+SysStringLen(frag)*sizeof(WCHAR));
1990 if(selector) {
1991 nsIDOMElement *nselem = NULL;
1992 nsAString selector_str;
1993
1994 sprintfW(selector, selector_formatW, frag);
1995 nsAString_InitDepend(&selector_str, selector);
1996 /* NOTE: Gecko doesn't set result to NULL if there is no match, so nselem must be initialized */
1997 nsres = nsIDOMHTMLDocument_QuerySelector(window->base.inner_window->doc->nsdoc, &selector_str, &nselem);
1998 nsAString_Finish(&selector_str);
1999 heap_free(selector);
2000 if(NS_SUCCEEDED(nsres) && nselem) {
2001 nsIDOMHTMLElement *html_elem;
2002
2003 nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMHTMLElement, (void**)&html_elem);
2004 nsIDOMElement_Release(nselem);
2005 if(NS_SUCCEEDED(nsres)) {
2006 nsIDOMHTMLElement_ScrollIntoView(html_elem, TRUE, 1);
2007 nsIDOMHTMLElement_Release(html_elem);
2008 }
2009 }
2010 }
2011
2012 SysFreeString(frag);
2013
2014 if(window->doc_obj->doc_object_service) {
2015 IDocObjectService_FireNavigateComplete2(window->doc_obj->doc_object_service, &window->base.IHTMLWindow2_iface, 0x10);
2016 IDocObjectService_FireDocumentComplete(window->doc_obj->doc_object_service, &window->base.IHTMLWindow2_iface, 0);
2017
2018 }
2019
2020 return S_OK;
2021}
void set_current_uri(HTMLOuterWindow *, IUri *) DECLSPEC_HIDDEN
Definition: persist.c:68
void nsAString_Finish(nsAString *) DECLSPEC_HIDDEN
Definition: nsembed.c:836
void nsAString_InitDepend(nsAString *, const PRUnichar *) DECLSPEC_HIDDEN
Definition: nsembed.c:826
#define NS_SUCCEEDED(res)
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:198
#define sprintfW
Definition: unicode.h:58

Referenced by super_navigate().

◆ navigate_javascript_proc()

static void navigate_javascript_proc ( task_t _task)
static

Definition at line 1876 of file navigate.c.

1877{
1879 HTMLOuterWindow *window = task->window;
1880 VARIANT v;
1881 BSTR code;
1882 HRESULT hres;
1883
1884 static const WCHAR jscriptW[] = {'j','s','c','r','i','p','t',0};
1885
1886 task->window->readystate = READYSTATE_COMPLETE;
1887
1888 hres = IUri_GetPath(task->uri, &code);
1889 if(FAILED(hres))
1890 return;
1891
1893 if(FAILED(hres)) {
1895 return;
1896 }
1897
1898 set_download_state(window->doc_obj, 1);
1899
1900 V_VT(&v) = VT_EMPTY;
1901 hres = exec_script(window->base.inner_window, code, jscriptW, &v);
1903 if(SUCCEEDED(hres) && V_VT(&v) != VT_EMPTY) {
1904 FIXME("javascirpt URL returned %s\n", debugstr_variant(&v));
1905 VariantClear(&v);
1906 }
1907
1908 if(window->doc_obj->view_sink)
1909 IAdviseSink_OnViewChange(window->doc_obj->view_sink, DVASPECT_CONTENT, -1);
1910
1911 set_download_state(window->doc_obj, 0);
1912}
@ VT_EMPTY
Definition: compat.h:2295
HRESULT WINAPI UrlUnescapeW(WCHAR *url, WCHAR *unescaped, DWORD *unescaped_len, DWORD flags)
Definition: path.c:2912
static const char * debugstr_variant(const VARIANT *var)
Definition: dom.c:505
const GLdouble * v
Definition: gl.h:2040
HRESULT exec_script(HTMLInnerWindow *, const WCHAR *, const WCHAR *, VARIANT *) DECLSPEC_HIDDEN
Definition: script.c:1245
void set_download_state(HTMLDocumentObj *, int) DECLSPEC_HIDDEN
Definition: persist.c:170
#define URL_UNESCAPE_INPLACE
Definition: shlwapi.h:525
Definition: inflate.c:139
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626

Referenced by super_navigate().

◆ navigate_javascript_task_destr()

static void navigate_javascript_task_destr ( task_t _task)
static

Definition at line 1914 of file navigate.c.

1915{
1917
1918 IUri_Release(task->uri);
1919 heap_free(task);
1920}

Referenced by super_navigate().

◆ navigate_new_window()

HRESULT navigate_new_window ( HTMLOuterWindow window,
IUri uri,
const WCHAR name,
request_data_t request_data,
IHTMLWindow2 **  ret 
)

Definition at line 2139 of file navigate.c.

2140{
2141 IWebBrowser2 *web_browser;
2143 IBindCtx *bind_ctx;
2145 HRESULT hres;
2146
2147 if(request_data)
2148 hres = create_channelbsc(NULL, request_data->headers,
2149 request_data->post_data, request_data->post_data_len, FALSE,
2150 &bsc);
2151 else
2153 if(FAILED(hres))
2154 return hres;
2155
2157 if(FAILED(hres)) {
2158 IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
2159 return hres;
2160 }
2161
2162 hres = CoCreateInstance(&CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
2163 &IID_IWebBrowser2, (void**)&web_browser);
2164 if(SUCCEEDED(hres)) {
2165 ITargetFramePriv2 *target_frame_priv;
2166
2167 hres = IWebBrowser2_QueryInterface(web_browser, &IID_ITargetFramePriv2, (void**)&target_frame_priv);
2168 if(SUCCEEDED(hres)) {
2169 hres = ITargetFramePriv2_AggregatedNavigation2(target_frame_priv,
2170 HLNF_DISABLEWINDOWRESTRICTIONS|HLNF_OPENINNEWWINDOW, bind_ctx, &bsc->bsc.IBindStatusCallback_iface,
2171 name, uri, emptyW);
2172 ITargetFramePriv2_Release(target_frame_priv);
2173
2174 if(SUCCEEDED(hres))
2175 hres = do_query_service((IUnknown*)web_browser, &SID_SHTMLWindow, &IID_IHTMLWindow2, (void**)&new_window);
2176 }
2177 if(FAILED(hres)) {
2178 IWebBrowser2_Quit(web_browser);
2179 IWebBrowser2_Release(web_browser);
2180 }
2181 }else {
2182 WARN("Could not create InternetExplorer instance: %08x\n", hres);
2183 }
2184
2185 IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
2186 IBindCtx_Release(bind_ctx);
2187 if(FAILED(hres))
2188 return hres;
2189
2190 IWebBrowser2_put_Visible(web_browser, VARIANT_TRUE);
2191 IWebBrowser2_Release(web_browser);
2192
2193 if(ret)
2194 *ret = new_window;
2195 else
2196 IHTMLWindow2_Release(new_window);
2197 return S_OK;
2198}
static const WCHAR emptyW[]
Definition: navigate.c:40
static HWND new_window(LPCSTR lpClassName, DWORD dwStyle, HWND parent)
Definition: editor.c:81
interface IHTMLWindow2 IHTMLWindow2
Definition: mshtmhst.idl:64
Definition: name.c:39
WCHAR * headers
Definition: binding.h:64
ULONG post_data_len
Definition: binding.h:66
HGLOBAL post_data
Definition: binding.h:65

Referenced by HlinkTarget_Navigate(), HTMLWindow2_open(), navigate_href_new_window(), and submit_form().

◆ navigate_proc()

static void navigate_proc ( task_t _task)
static

Definition at line 1931 of file navigate.c.

1932{
1934 HRESULT hres;
1935
1936 hres = set_moniker(task->window, task->mon, task->uri, NULL, task->bscallback, TRUE);
1937 if(SUCCEEDED(hres)) {
1938 set_current_mon(task->window, task->bscallback->bsc.mon, task->flags);
1939 set_current_uri(task->window, task->uri);
1940 start_binding(task->window->pending_window, &task->bscallback->bsc, NULL);
1941 }
1942}
HRESULT set_moniker(HTMLOuterWindow *, IMoniker *, IUri *, IBindCtx *, nsChannelBSC *, BOOL) DECLSPEC_HIDDEN
Definition: persist.c:329
HRESULT start_binding(HTMLInnerWindow *inner_window, BSCallback *bscallback, IBindCtx *bctx)
Definition: navigate.c:762

Referenced by super_navigate().

◆ navigate_task_destr()

static void navigate_task_destr ( task_t _task)
static

Definition at line 1944 of file navigate.c.

1945{
1947
1948 IBindStatusCallback_Release(&task->bscallback->bsc.IBindStatusCallback_iface);
1949 IMoniker_Release(task->mon);
1950 IUri_Release(task->uri);
1951 heap_free(task);
1952}

Referenced by super_navigate().

◆ navigate_uri()

static HRESULT navigate_uri ( HTMLOuterWindow window,
IUri uri,
const WCHAR display_uri,
const request_data_t request_data,
DWORD  flags 
)
static

Definition at line 2255 of file navigate.c.

2257{
2258 nsWineURI *nsuri;
2259 HRESULT hres;
2260
2261 TRACE("%s\n", debugstr_w(display_uri));
2262
2263 if(window->doc_obj && window->doc_obj->webbrowser) {
2264 DWORD post_data_len = request_data ? request_data->post_data_len : 0;
2265 void *post_data = post_data_len ? request_data->post_data : NULL;
2266 const WCHAR *headers = request_data ? request_data->headers : NULL;
2267
2268 if(!(flags & BINDING_REFRESH)) {
2269 BSTR frame_name = NULL;
2270 BOOL cancel = FALSE;
2271
2272 if(window != window->doc_obj->basedoc.window) {
2273 hres = IHTMLWindow2_get_name(&window->base.IHTMLWindow2_iface, &frame_name);
2274 if(FAILED(hres))
2275 return hres;
2276 }
2277
2278 hres = IDocObjectService_FireBeforeNavigate2(window->doc_obj->doc_object_service, NULL, display_uri, 0x40,
2279 frame_name, post_data, post_data_len ? post_data_len+1 : 0, headers, TRUE, &cancel);
2280 SysFreeString(frame_name);
2281 if(SUCCEEDED(hres) && cancel) {
2282 TRACE("Navigation canceled\n");
2283 return S_OK;
2284 }
2285 }
2286
2287 if(window == window->doc_obj->basedoc.window)
2288 return super_navigate(window, uri, flags, headers, post_data, post_data_len);
2289 }
2290
2291 if(window->doc_obj && window == window->doc_obj->basedoc.window) {
2292 BOOL cancel;
2293
2294 hres = hlink_frame_navigate(&window->base.inner_window->doc->basedoc, display_uri, NULL, 0, &cancel);
2295 if(FAILED(hres))
2296 return hres;
2297
2298 if(cancel) {
2299 TRACE("Navigation handled by hlink frame\n");
2300 return S_OK;
2301 }
2302 }
2303
2304 hres = create_doc_uri(window, uri, &nsuri);
2305 if(FAILED(hres))
2306 return hres;
2307
2308 hres = load_nsuri(window, nsuri, request_data ? request_data->post_stream : NULL, NULL, LOAD_FLAGS_NONE);
2309 nsISupports_Release((nsISupports*)nsuri);
2310 return hres;
2311}
HRESULT load_nsuri(HTMLOuterWindow *, nsWineURI *, nsIInputStream *, nsChannelBSC *, DWORD) DECLSPEC_HIDDEN
Definition: nsio.c:250
#define BINDING_REFRESH
Definition: binding.h:130
HRESULT create_doc_uri(HTMLOuterWindow *, IUri *, nsWineURI **) DECLSPEC_HIDDEN
Definition: nsio.c:3210
HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, nsChannel *nschannel, DWORD hlnf, BOOL *cancel)
Definition: navigate.c:2200
HRESULT super_navigate(HTMLOuterWindow *window, IUri *uri, DWORD flags, const WCHAR *headers, BYTE *post_data, DWORD post_data_size)
Definition: navigate.c:2023
Definition: nsio.c:34
nsIInputStream * post_stream
Definition: binding.h:63

Referenced by load_uri(), navigate_url(), and submit_form().

◆ navigate_url()

HRESULT navigate_url ( HTMLOuterWindow window,
const WCHAR new_url,
IUri base_uri,
DWORD  flags 
)

Definition at line 2398 of file navigate.c.

2399{
2400 IUri *uri, *nav_uri;
2401 BSTR display_uri;
2402 HRESULT hres;
2403
2404 if(new_url && base_uri)
2406 &nav_uri, 0);
2407 else
2408 hres = create_uri(new_url, 0, &nav_uri);
2409 if(FAILED(hres))
2410 return hres;
2411
2412 hres = translate_uri(window, nav_uri, &display_uri, &uri);
2413 IUri_Release(nav_uri);
2414 if(FAILED(hres))
2415 return hres;
2416
2417 hres = navigate_uri(window, uri, display_uri, NULL, flags);
2418 IUri_Release(uri);
2419 SysFreeString(display_uri);
2420 return hres;
2421}
HRESULT create_uri(const WCHAR *, DWORD, IUri **) DECLSPEC_HIDDEN
Definition: persist.c:158
HRESULT WINAPI CoInternetCombineUrlEx(IUri *pBaseUri, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, IUri **ppCombinedUri, DWORD_PTR dwReserved)
Definition: uri.c:6442
static HRESULT translate_uri(HTMLOuterWindow *window, IUri *orig_uri, BSTR *ret_display_uri, IUri **ret_uri)
Definition: navigate.c:2327
#define URL_DONT_ESCAPE_EXTRA_INFO
Definition: shlwapi.h:529
#define URL_ESCAPE_SPACES_ONLY
Definition: shlwapi.h:530

◆ nsAsyncVerifyRedirectCallback_AddRef()

static nsrefcnt NSAPI nsAsyncVerifyRedirectCallback_AddRef ( nsIAsyncVerifyRedirectCallback iface)
static

Definition at line 1098 of file navigate.c.

1099{
1102
1103 TRACE("(%p) ref=%d\n", This, ref);
1104
1105 return ref;
1106}
static nsRedirectCallback * impl_from_nsIAsyncVerifyRedirectCallback(nsIAsyncVerifyRedirectCallback *iface)
Definition: navigate.c:1072

◆ nsAsyncVerifyRedirectCallback_OnRedirectVerifyCallback()

static nsresult NSAPI nsAsyncVerifyRedirectCallback_OnRedirectVerifyCallback ( nsIAsyncVerifyRedirectCallback iface,
nsresult  result 
)
static

Definition at line 1124 of file navigate.c.

1125{
1127 nsChannel *old_nschannel;
1128 nsresult nsres;
1129
1130 TRACE("(%p)->(%08x)\n", This, result);
1131
1132 old_nschannel = This->bsc->nschannel;
1133 nsIHttpChannel_AddRef(&This->nschannel->nsIHttpChannel_iface);
1134 This->bsc->nschannel = This->nschannel;
1135
1136 if(This->nschannel->load_group) {
1137 nsres = nsILoadGroup_AddRequest(This->nschannel->load_group, (nsIRequest*)&This->nschannel->nsIHttpChannel_iface,
1138 NULL);
1139 if(NS_FAILED(nsres))
1140 ERR("AddRequest failed: %08x\n", nsres);
1141 }
1142
1143 if(This->bsc->is_doc_channel) {
1144 IUri *uri = nsuri_get_uri(This->nschannel->uri);
1145
1146 if(uri) {
1147 set_current_uri(This->bsc->bsc.window->base.outer_window, uri);
1148 IUri_Release(uri);
1149 }else {
1150 WARN("Could not get IUri from nsWineURI\n");
1151 }
1152 }
1153
1154 if(old_nschannel) {
1155 if(old_nschannel->load_group) {
1156 nsres = nsILoadGroup_RemoveRequest(old_nschannel->load_group,
1157 (nsIRequest*)&old_nschannel->nsIHttpChannel_iface, NULL, NS_OK);
1158 if(NS_FAILED(nsres))
1159 ERR("RemoveRequest failed: %08x\n", nsres);
1160 }
1161 nsIHttpChannel_Release(&old_nschannel->nsIHttpChannel_iface);
1162 }
1163
1164 return NS_OK;
1165}
IUri * nsuri_get_uri(nsWineURI *) DECLSPEC_HIDDEN
Definition: nsio.c:68
#define NS_OK
nsILoadGroup * load_group
Definition: binding.h:46

◆ nsAsyncVerifyRedirectCallback_QueryInterface()

static nsresult NSAPI nsAsyncVerifyRedirectCallback_QueryInterface ( nsIAsyncVerifyRedirectCallback iface,
nsIIDRef  riid,
void **  result 
)
static

Definition at line 1077 of file navigate.c.

1079{
1081
1082 if(IsEqualGUID(&IID_nsISupports, riid)) {
1083 TRACE("(%p)->(IID_nsISupports %p)\n", This, result);
1084 *result = &This->nsIAsyncVerifyRedirectCallback_iface;
1085 }else if(IsEqualGUID(&IID_nsIAsyncVerifyRedirectCallback, riid)) {
1086 TRACE("(%p)->(IID_nsIAsyncVerifyRedirectCallback %p)\n", This, result);
1087 *result = &This->nsIAsyncVerifyRedirectCallback_iface;
1088 }else {
1089 *result = NULL;
1090 WARN("unimplemented iface %s\n", debugstr_guid(riid));
1091 return NS_NOINTERFACE;
1092 }
1093
1094 nsISupports_AddRef((nsISupports*)*result);
1095 return NS_OK;
1096}
#define NS_NOINTERFACE

◆ nsAsyncVerifyRedirectCallback_Release()

static nsrefcnt NSAPI nsAsyncVerifyRedirectCallback_Release ( nsIAsyncVerifyRedirectCallback iface)
static

Definition at line 1108 of file navigate.c.

1109{
1112
1113 TRACE("(%p) ref=%d\n", This, ref);
1114
1115 if(!ref) {
1116 IBindStatusCallback_Release(&This->bsc->bsc.IBindStatusCallback_iface);
1117 nsIHttpChannel_Release(&This->nschannel->nsIHttpChannel_iface);
1118 heap_free(This);
1119 }
1120
1121 return ref;
1122}

◆ nsChannelBSC_beginning_transaction()

static HRESULT nsChannelBSC_beginning_transaction ( BSCallback bsc,
WCHAR **  additional_headers 
)
static

Definition at line 1640 of file navigate.c.

1641{
1643 http_header_t *iter;
1644 DWORD len = 0;
1645 WCHAR *ptr;
1646
1647 static const WCHAR content_lengthW[] =
1648 {'C','o','n','t','e','n','t','-','L','e','n','g','t','h',0};
1649
1650 if(!This->nschannel)
1651 return S_FALSE;
1652
1653 LIST_FOR_EACH_ENTRY(iter, &This->nschannel->request_headers, http_header_t, entry) {
1654 if(strcmpW(iter->header, content_lengthW))
1655 len += strlenW(iter->header) + 2 /* ": " */ + strlenW(iter->data) + 2 /* "\r\n" */;
1656 }
1657
1658 if(!len)
1659 return S_OK;
1660
1661 *additional_headers = ptr = CoTaskMemAlloc((len+1)*sizeof(WCHAR));
1662 if(!ptr)
1663 return E_OUTOFMEMORY;
1664
1665 LIST_FOR_EACH_ENTRY(iter, &This->nschannel->request_headers, http_header_t, entry) {
1666 if(!strcmpW(iter->header, content_lengthW))
1667 continue;
1668
1669 len = strlenW(iter->header);
1670 memcpy(ptr, iter->header, len*sizeof(WCHAR));
1671 ptr += len;
1672
1673 *ptr++ = ':';
1674 *ptr++ = ' ';
1675
1676 len = strlenW(iter->data);
1677 memcpy(ptr, iter->data, len*sizeof(WCHAR));
1678 ptr += len;
1679
1680 *ptr++ = '\r';
1681 *ptr++ = '\n';
1682 }
1683
1684 *ptr = 0;
1685
1686 return S_OK;
1687}
GLenum GLsizei len
Definition: glext.h:6722
static PVOID ptr
Definition: dispmode.c:27
static nsChannelBSC * nsChannelBSC_from_BSCallback(BSCallback *iface)
Definition: navigate.c:1195
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
WCHAR * data
Definition: binding.h:124
WCHAR * header
Definition: binding.h:123
#define strcmpW(s1, s2)
Definition: unicode.h:38

◆ nsChannelBSC_destroy()

static void nsChannelBSC_destroy ( BSCallback bsc)
static

Definition at line 1200 of file navigate.c.

1201{
1203
1204 if(This->nschannel)
1205 nsIHttpChannel_Release(&This->nschannel->nsIHttpChannel_iface);
1206 if(This->nslistener)
1207 nsIStreamListener_Release(This->nslistener);
1208 if(This->nscontext)
1209 nsISupports_Release(This->nscontext);
1210 if(This->nsstream)
1211 nsIInputStream_Release(&This->nsstream->nsIInputStream_iface);
1212 heap_free(This);
1213}

◆ nsChannelBSC_from_BSCallback()

◆ nsChannelBSC_init_bindinfo()

static HRESULT nsChannelBSC_init_bindinfo ( BSCallback bsc)
static

Definition at line 1225 of file navigate.c.

1226{
1228 nsChannel *nschannel = This->nschannel;
1229 HRESULT hres;
1230
1231 if(nschannel && nschannel->post_data_stream) {
1233 &nschannel->request_headers, &This->bsc.request_data);
1234 if(FAILED(hres))
1235 return hres;
1236 }
1237
1238 return S_OK;
1239}

◆ nsChannelBSC_on_progress()

static HRESULT nsChannelBSC_on_progress ( BSCallback bsc,
ULONG  status_code,
LPCWSTR  status_text 
)
static

Definition at line 1539 of file navigate.c.

1540{
1542
1543 switch(status_code) {
1544 case BINDSTATUS_MIMETYPEAVAILABLE:
1545 if(This->is_doc_channel && !is_supported_doc_mime(status_text)) {
1546 FIXME("External MIME: %s\n", debugstr_w(status_text));
1547
1549
1550 This->nschannel = NULL;
1551 }
1552
1553 if(!This->nschannel)
1554 return S_OK;
1555
1556 heap_free(This->nschannel->content_type);
1557 This->nschannel->content_type = heap_strdupWtoA(status_text);
1558 break;
1559 case BINDSTATUS_REDIRECTING:
1560 return handle_redirect(This, status_text);
1561 case BINDSTATUS_BEGINDOWNLOADDATA: {
1562 IWinInetHttpInfo *http_info;
1563 DWORD status, size = sizeof(DWORD);
1564 HRESULT hres;
1565
1566 if(!This->bsc.binding)
1567 break;
1568
1569 hres = IBinding_QueryInterface(This->bsc.binding, &IID_IWinInetHttpInfo, (void**)&http_info);
1570 if(FAILED(hres))
1571 break;
1572
1573 hres = IWinInetHttpInfo_QueryInfo(http_info,
1575 IWinInetHttpInfo_Release(http_info);
1576 if(FAILED(hres) || status == HTTP_STATUS_OK)
1577 break;
1578
1580 }
1581 }
1582
1583 return S_OK;
1584}
void handle_navigation_error(DocHost *doc_host, HRESULT hres, BSTR url, IHTMLWindow2 *win2)
Definition: navigate.c:315
static BOOL is_supported_doc_mime(const WCHAR *mime)
Definition: navigate.c:1438
static HRESULT handle_redirect(nsChannelBSC *This, const WCHAR *new_url)
Definition: navigate.c:1396
static void handle_extern_mime_navigation(nsChannelBSC *This)
Definition: navigate.c:1475
#define DWORD
Definition: nt_native.h:44
Definition: ps.c:97
#define HTTP_STATUS_OK
Definition: winhttp.h:301
#define HTTP_QUERY_FLAG_NUMBER
Definition: wininet.h:1606
#define HTTP_QUERY_STATUS_CODE
Definition: wininet.h:1542

◆ nsChannelBSC_on_response()

static HRESULT nsChannelBSC_on_response ( BSCallback bsc,
DWORD  response_code,
LPCWSTR  response_headers 
)
static

Definition at line 1604 of file navigate.c.

1606{
1608 char *str;
1609 HRESULT hres;
1610
1611 This->response_processed = TRUE;
1612 This->nschannel->response_status = response_code;
1613
1614 if(response_headers) {
1615 const WCHAR *headers;
1616
1617 headers = strchrW(response_headers, '\r');
1618 hres = process_response_status_text(response_headers, headers, &str);
1619 if(FAILED(hres)) {
1620 WARN("parsing headers failed: %08x\n", hres);
1621 return hres;
1622 }
1623
1624 heap_free(This->nschannel->response_status_text);
1625 This->nschannel->response_status_text = str;
1626
1627 if(headers && headers[1] == '\n') {
1628 headers += 2;
1630 if(FAILED(hres)) {
1631 WARN("parsing headers failed: %08x\n", hres);
1632 return hres;
1633 }
1634 }
1635 }
1636
1637 return S_OK;
1638}
static HRESULT process_response_status_text(const WCHAR *header, const WCHAR *header_end, char **status_text)
Definition: navigate.c:1586
static HRESULT process_response_headers(nsChannelBSC *This, const WCHAR *headers)
Definition: navigate.c:714
const WCHAR * str
#define strchrW(s, c)
Definition: unicode.h:34

◆ nsChannelBSC_read_data()

static HRESULT nsChannelBSC_read_data ( BSCallback bsc,
IStream stream 
)
static

Definition at line 1389 of file navigate.c.

1390{
1392
1393 return read_stream_data(This, stream);
1394}

◆ nsChannelBSC_start_binding()

static HRESULT nsChannelBSC_start_binding ( BSCallback bsc)
static

Definition at line 1215 of file navigate.c.

1216{
1218
1219 if(This->is_doc_channel)
1220 This->bsc.window->base.outer_window->base.inner_window->doc->skip_mutation_notif = FALSE;
1221
1222 return S_OK;
1223}

◆ nsChannelBSC_stop_binding()

static HRESULT nsChannelBSC_stop_binding ( BSCallback bsc,
HRESULT  result 
)
static

Definition at line 1371 of file navigate.c.

1372{
1374
1375 if(result != E_ABORT) {
1376 if(FAILED(result))
1378 else if(This->is_doc_channel && This->nschannel) {
1380 if(SUCCEEDED(result))
1381 return S_OK;
1382 }
1383 }
1384
1386 return S_OK;
1387}
static void on_stop_nsrequest(nsChannelBSC *This, HRESULT result)
Definition: navigate.c:929

◆ nsInputStream_AddRef()

static nsrefcnt NSAPI nsInputStream_AddRef ( nsIInputStream iface)
static

Definition at line 69 of file navigate.c.

70{
73
74 TRACE("(%p) ref=%d\n", This, ref);
75
76 return ref;
77}
static nsProtocolStream * impl_from_nsIInputStream(nsIInputStream *iface)
Definition: navigate.c:40

◆ nsInputStream_Available()

static nsresult NSAPI nsInputStream_Available ( nsIInputStream iface,
UINT64 _retval 
)
static

Definition at line 100 of file navigate.c.

101{
103 FIXME("(%p)->(%p)\n", This, _retval);
105}
#define NS_ERROR_NOT_IMPLEMENTED

◆ nsInputStream_Close()

static nsresult NSAPI nsInputStream_Close ( nsIInputStream iface)
static

Definition at line 93 of file navigate.c.

94{
96 FIXME("(%p)\n", This);
98}

◆ nsInputStream_IsNonBlocking()

static nsresult NSAPI nsInputStream_IsNonBlocking ( nsIInputStream iface,
cpp_bool _retval 
)
static

Definition at line 157 of file navigate.c.

158{
160 FIXME("(%p)->(%p)\n", This, _retval);
162}

◆ nsInputStream_QueryInterface()

static nsresult NSAPI nsInputStream_QueryInterface ( nsIInputStream iface,
nsIIDRef  riid,
void **  result 
)
static

Definition at line 45 of file navigate.c.

47{
49
50 *result = NULL;
51
52 if(IsEqualGUID(&IID_nsISupports, riid)) {
53 TRACE("(%p)->(IID_nsISupports %p)\n", This, result);
54 *result = &This->nsIInputStream_iface;
55 }else if(IsEqualGUID(&IID_nsIInputStream, riid)) {
56 TRACE("(%p)->(IID_nsIInputStream %p)\n", This, result);
57 *result = &This->nsIInputStream_iface;
58 }
59
60 if(*result) {
61 nsIInputStream_AddRef(&This->nsIInputStream_iface);
62 return NS_OK;
63 }
64
65 WARN("unsupported interface %s\n", debugstr_guid(riid));
66 return NS_NOINTERFACE;
67}

◆ nsInputStream_Read()

static nsresult NSAPI nsInputStream_Read ( nsIInputStream iface,
char aBuf,
UINT32  aCount,
UINT32 _retval 
)
static

Definition at line 107 of file navigate.c.

109{
111 DWORD read = aCount;
112
113 TRACE("(%p)->(%p %d %p)\n", This, aBuf, aCount, _retval);
114
115 if(read > This->buf_size)
116 read = This->buf_size;
117
118 if(read) {
119 memcpy(aBuf, This->buf, read);
120 if(read < This->buf_size)
121 memmove(This->buf, This->buf+read, This->buf_size-read);
122 This->buf_size -= read;
123 }
124
125 *_retval = read;
126 return NS_OK;
127}
#define read
Definition: acwin.h:97
#define memmove(s1, s2, n)
Definition: mkisofs.h:881

◆ nsInputStream_ReadSegments()

static nsresult NSAPI nsInputStream_ReadSegments ( nsIInputStream iface,
nsresult(WINAPI *aWriter)(nsIInputStream *, void *, const char *, UINT32, UINT32, UINT32 *)  ,
void aClousure,
UINT32  aCount,
UINT32 _retval 
)
static

Definition at line 129 of file navigate.c.

132{
134 UINT32 written = 0;
135 nsresult nsres;
136
137 TRACE("(%p)->(%p %p %d %p)\n", This, aWriter, aClousure, aCount, _retval);
138
139 if(!This->buf_size)
140 return S_OK;
141
142 if(aCount > This->buf_size)
143 aCount = This->buf_size;
144
145 nsres = aWriter(&This->nsIInputStream_iface, aClousure, This->buf, 0, aCount, &written);
146 if(NS_FAILED(nsres))
147 TRACE("aWriter failed: %08x\n", nsres);
148 else if(written != This->buf_size)
149 FIXME("written %d != buf_size %d\n", written, This->buf_size);
150
151 This->buf_size -= written;
152
153 *_retval = written;
154 return nsres;
155}
uint32_t UINT32
Definition: typedefs.h:59

◆ nsInputStream_Release()

static nsrefcnt NSAPI nsInputStream_Release ( nsIInputStream iface)
static

Definition at line 80 of file navigate.c.

81{
84
85 TRACE("(%p) ref=%d\n", This, ref);
86
87 if(!ref)
89
90 return ref;
91}

◆ on_start_nsrequest()

static HRESULT on_start_nsrequest ( nsChannelBSC This)
static

Definition at line 903 of file navigate.c.

904{
905 nsresult nsres;
906
907 /* FIXME: it's needed for http connections from BindToObject. */
908 if(!This->nschannel->response_status)
909 This->nschannel->response_status = 200;
910
911 nsres = nsIStreamListener_OnStartRequest(This->nslistener,
912 (nsIRequest*)&This->nschannel->nsIHttpChannel_iface, This->nscontext);
913 if(NS_FAILED(nsres)) {
914 FIXME("OnStartRequest failed: %08x\n", nsres);
915 return E_FAIL;
916 }
917
918 if(This->is_doc_channel) {
919 if(!This->bsc.window)
920 return E_ABORT; /* Binding aborted in OnStartRequest call. */
921 update_window_doc(This->bsc.window);
922 if(This->bsc.window->base.outer_window->readystate != READYSTATE_LOADING)
923 set_ready_state(This->bsc.window->base.outer_window, READYSTATE_LOADING);
924 }
925
926 return S_OK;
927}
HRESULT update_window_doc(HTMLInnerWindow *window)
Definition: htmlwindow.c:3033
void set_ready_state(HTMLOuterWindow *, READYSTATE) DECLSPEC_HIDDEN
Definition: persist.c:450

Referenced by async_stop_request(), and read_stream_data().

◆ on_stop_nsrequest()

static void on_stop_nsrequest ( nsChannelBSC This,
HRESULT  result 
)
static

Definition at line 929 of file navigate.c.

930{
931 nsresult nsres, request_result;
932
933 switch(result) {
934 case S_OK:
935 request_result = NS_OK;
936 break;
937 case E_ABORT:
938 request_result = NS_BINDING_ABORTED;
939 break;
940 default:
941 request_result = NS_ERROR_FAILURE;
942 }
943
944 if(This->nslistener) {
945 nsres = nsIStreamListener_OnStopRequest(This->nslistener,
946 (nsIRequest*)&This->nschannel->nsIHttpChannel_iface, This->nscontext,
947 request_result);
948 if(NS_FAILED(nsres))
949 WARN("OnStopRequest failed: %08x\n", nsres);
950 }
951
952 if(This->nschannel && This->nschannel->load_group) {
953 nsres = nsILoadGroup_RemoveRequest(This->nschannel->load_group,
954 (nsIRequest*)&This->nschannel->nsIHttpChannel_iface, NULL, request_result);
955 if(NS_FAILED(nsres))
956 ERR("RemoveRequest failed: %08x\n", nsres);
957 }
958}
#define NS_BINDING_ABORTED
#define NS_ERROR_FAILURE

Referenced by nsChannelBSC_stop_binding(), and stop_request_proc().

◆ parse_content_type()

static void parse_content_type ( nsChannelBSC This,
const WCHAR value 
)
static

Definition at line 630 of file navigate.c.

631{
632 const WCHAR *ptr;
633 size_t len;
634
635 static const WCHAR charsetW[] = {'c','h','a','r','s','e','t','='};
636
637 ptr = strchrW(value, ';');
638 if(!ptr)
639 return;
640
641 ptr++;
642 while(*ptr && isspaceW(*ptr))
643 ptr++;
644
645 len = strlenW(value);
646 if(ptr + sizeof(charsetW)/sizeof(WCHAR) < value+len && !memicmpW(ptr, charsetW, sizeof(charsetW)/sizeof(WCHAR))) {
647 size_t charset_len, lena;
648 nsACString charset_str;
649 const WCHAR *charset;
650 char *charseta;
651
652 ptr += sizeof(charsetW)/sizeof(WCHAR);
653
654 if(*ptr == '\'') {
655 FIXME("Quoted value\n");
656 return;
657 }else {
658 charset = ptr;
659 while(*ptr && *ptr != ',')
660 ptr++;
661 charset_len = ptr-charset;
662 }
663
664 lena = WideCharToMultiByte(CP_ACP, 0, charset, charset_len, NULL, 0, NULL, NULL);
665 charseta = heap_alloc(lena+1);
666 if(!charseta)
667 return;
668
669 WideCharToMultiByte(CP_ACP, 0, charset, charset_len, charseta, lena, NULL, NULL);
670 charseta[lena] = 0;
671
672 nsACString_InitDepend(&charset_str, charseta);
673 nsIHttpChannel_SetContentCharset(&This->nschannel->nsIHttpChannel_iface, &charset_str);
674 nsACString_Finish(&charset_str);
675 heap_free(charseta);
676 }else {
677 FIXME("unhandled: %s\n", debugstr_wn(ptr, len - (ptr-value)));
678 }
679}
CFF_Charset charset
Definition: cffcmap.c:137
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111
static const WCHAR charsetW[]
Definition: htmlmeta.c:149
#define debugstr_wn
Definition: kernel32.h:33
void nsACString_Finish(nsACString *) DECLSPEC_HIDDEN
Definition: nsembed.c:812
void nsACString_InitDepend(nsACString *, const char *) DECLSPEC_HIDDEN
Definition: nsembed.c:797
Definition: pdh_main.c:96
#define memicmpW(s1, s2, n)
Definition: unicode.h:27
#define isspaceW(n)
Definition: unicode.h:52

Referenced by process_response_headers().

◆ parse_headers()

static HRESULT parse_headers ( const WCHAR headers,
struct list headers_list 
)
static

Definition at line 681 of file navigate.c.

682{
683 const WCHAR *header, *header_end, *colon, *value;
685
686 header = headers;
687 while(*header) {
688 if(header[0] == '\r' && header[1] == '\n' && !header[2])
689 break;
690 for(colon = header; *colon && *colon != ':' && *colon != '\r'; colon++);
691 if(*colon != ':')
692 return E_FAIL;
693
694 value = colon+1;
695 while(*value == ' ')
696 value++;
697 if(!*value)
698 return E_FAIL;
699
700 for(header_end = value+1; *header_end && *header_end != '\r'; header_end++);
701
702 hres = set_http_header(headers_list, header, colon-header, value, header_end-value);
703 if(FAILED(hres))
704 return hres;
705
706 header = header_end;
707 if(header[0] == '\r' && header[1] == '\n')
708 header += 2;
709 }
710
711 return S_OK;
712}
HRESULT set_http_header(struct list *, const WCHAR *, int, const WCHAR *, int) DECLSPEC_HIDDEN
Definition: nsio.c:380

Referenced by channelbsc_set_channel(), process_response_headers(), and read_post_data_stream().

◆ process_response_headers()

static HRESULT process_response_headers ( nsChannelBSC This,
const WCHAR headers 
)
static

Definition at line 714 of file navigate.c.

715{
716 http_header_t *iter;
718
719 static const WCHAR content_typeW[] = {'c','o','n','t','e','n','t','-','t','y','p','e',0};
720
721 hres = parse_headers(headers, &This->nschannel->response_headers);
722 if(FAILED(hres))
723 return hres;
724
725 LIST_FOR_EACH_ENTRY(iter, &This->nschannel->response_headers, http_header_t, entry) {
726 if(!strcmpiW(iter->header, content_typeW))
728 }
729
730 return S_OK;
731}
static void parse_content_type(nsChannelBSC *This, const WCHAR *value)
Definition: navigate.c:630
#define strcmpiW(s1, s2)
Definition: unicode.h:39

Referenced by nsChannelBSC_on_response(), and query_http_info().

◆ process_response_status_text()

static HRESULT process_response_status_text ( const WCHAR header,
const WCHAR header_end,
char **  status_text 
)
static

Definition at line 1586 of file navigate.c.

1587{
1588 header = strchrW(header + 1, ' ');
1589 if(!header || header >= header_end)
1590 return E_FAIL;
1591 header = strchrW(header + 1, ' ');
1592 if(!header || header >= header_end)
1593 return E_FAIL;
1594 ++header;
1595
1596 *status_text = heap_strndupWtoU(header, header_end - header);
1597
1598 if(!*status_text)
1599 return E_OUTOFMEMORY;
1600
1601 return S_OK;
1602}
static char * heap_strndupWtoU(LPCWSTR str, unsigned len)

Referenced by nsChannelBSC_on_response().

◆ query_http_info()

static void query_http_info ( nsChannelBSC This,
IWinInetHttpInfo wininet_info 
)
static

Definition at line 733 of file navigate.c.

734{
735 const WCHAR *ptr;
736 DWORD len = 0;
737 WCHAR *buf;
738
739 IWinInetHttpInfo_QueryInfo(wininet_info, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &len, NULL, NULL);
740 if(!len)
741 return;
742
743 buf = heap_alloc(len);
744 if(!buf)
745 return;
746
747 IWinInetHttpInfo_QueryInfo(wininet_info, HTTP_QUERY_RAW_HEADERS_CRLF, buf, &len, NULL, NULL);
748 if(!len) {
749 heap_free(buf);
750 return;
751 }
752
753 ptr = strchrW(buf, '\r');
754 if(ptr && ptr[1] == '\n') {
755 ptr += 2;
757 }
758
759 heap_free(buf);
760}
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define HTTP_QUERY_RAW_HEADERS_CRLF
Definition: wininet.h:1545

Referenced by read_stream_data().

◆ read_post_data_stream()

static HRESULT read_post_data_stream ( nsIInputStream stream,
BOOL  contains_headers,
struct list headers_list,
request_data_t request_data 
)
static

Definition at line 800 of file navigate.c.

802{
803 nsISeekableStream *seekable_stream;
804 UINT64 available = 0;
805 UINT32 data_len = 0;
806 char *data, *post_data;
807 nsresult nsres;
808 HRESULT hres = S_OK;
809
810 if(!stream)
811 return S_OK;
812
813 nsres = nsIInputStream_Available(stream, &available);
814 if(NS_FAILED(nsres))
815 return E_FAIL;
816
818 if(!data)
819 return E_OUTOFMEMORY;
820
821 nsres = nsIInputStream_Read(stream, data, available, &data_len);
822 if(NS_FAILED(nsres)) {
824 return E_FAIL;
825 }
826
827 if(contains_headers) {
828 if(data_len >= 2 && data[0] == '\r' && data[1] == '\n') {
829 post_data = data+2;
830 data_len -= 2;
831 }else {
832 WCHAR *headers;
833 DWORD size;
834 char *ptr;
835
836 post_data += data_len;
837 for(ptr = data; ptr+4 < data+data_len; ptr++) {
838 if(!memcmp(ptr, "\r\n\r\n", 4)) {
839 ptr += 2;
840 post_data = ptr+2;
841 break;
842 }
843 }
844
845 data_len -= post_data-data;
846
848 headers = heap_alloc((size+1)*sizeof(WCHAR));
849 if(headers) {
851 headers[size] = 0;
852 if(headers_list)
853 hres = parse_headers(headers, headers_list);
854 if(SUCCEEDED(hres))
855 request_data->headers = headers;
856 else
858 }else {
860 }
861 }
862 }
863
864 if(FAILED(hres)) {
866 return hres;
867 }
868
869 if(!data_len) {
871 post_data = NULL;
872 }else if(post_data != data) {
873 char *new_data;
874
875 new_data = GlobalAlloc(0, data_len+1);
876 if(new_data)
877 memcpy(new_data, post_data, data_len);
879 if(!new_data)
880 return E_OUTOFMEMORY;
881 post_data = new_data;
882 }
883
884 if(post_data)
885 post_data[data_len] = 0;
886 request_data->post_data = post_data;
887 request_data->post_data_len = data_len;
888
889 nsres = nsIInputStream_QueryInterface(stream, &IID_nsISeekableStream, (void**)&seekable_stream);
890 assert(nsres == NS_OK);
891
892 nsres = nsISeekableStream_Seek(seekable_stream, NS_SEEK_SET, 0);
893 assert(nsres == NS_OK);
894
895 nsISeekableStream_Release(seekable_stream);
896
897 nsIInputStream_AddRef(stream);
898 request_data->post_stream = stream;
899 TRACE("post_data = %s\n", debugstr_an(request_data->post_data, request_data->post_data_len));
900 return S_OK;
901}
COMPILER_DEPENDENT_UINT64 UINT64
Definition: actypes.h:131
static WCHAR available[MAX_STRING_RESOURCE_LEN]
Definition: object.c:2402
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
#define MultiByteToWideChar
Definition: compat.h:110
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611

Referenced by hlink_frame_navigate(), nsChannelBSC_init_bindinfo(), and submit_form().

◆ read_stream()

HRESULT read_stream ( BSCallback This,
IStream stream,
void buf,
DWORD  size,
DWORD ret_size 
)

Definition at line 602 of file navigate.c.

603{
604 DWORD read_size = 0, skip=0;
605 BYTE *data = buf;
607
608 hres = IStream_Read(stream, buf, size, &read_size);
609
610 if(!This->readed && This->bom == BOM_NONE) {
611 if(read_size >= 2 && data[0] == 0xff && data[1] == 0xfe) {
612 This->bom = BOM_UTF16;
613 skip = 2;
614 }else if(read_size >= 3 && data[0] == 0xef && data[1] == 0xbb && data[2] == 0xbf) {
615 This->bom = BOM_UTF8;
616 skip = 3;
617 }
618 if(skip) {
619 read_size -= skip;
620 if(read_size)
621 memmove(data, data+skip, read_size);
622 }
623 }
624
625 This->readed += read_size;
626 *ret_size = read_size;
627 return hres;
628}
#define skip(...)
Definition: atltest.h:64
@ BOM_UTF8
Definition: binding.h:32
@ BOM_UTF16
Definition: binding.h:33
static void ULONG ULONG * ret_size
Definition: time.c:40

Referenced by do_read(), duplicate_extents(), read_stream_data(), and ScriptBSC_read_data().

◆ read_stream_data()

static HRESULT read_stream_data ( nsChannelBSC This,
IStream stream 
)
static

Definition at line 960 of file navigate.c.

961{
962 DWORD read;
963 nsresult nsres;
965
966 if(!This->response_processed) {
967 IWinInetHttpInfo *wininet_info;
968
969 This->response_processed = TRUE;
970 if(This->bsc.binding) {
971 hres = IBinding_QueryInterface(This->bsc.binding, &IID_IWinInetHttpInfo, (void**)&wininet_info);
972 if(SUCCEEDED(hres)) {
973 query_http_info(This, wininet_info);
974 IWinInetHttpInfo_Release(wininet_info);
975 }
976 }
977 }
978
979 if(!This->nschannel)
980 return S_OK;
981
982 if(!This->nslistener) {
983 BYTE buf[1024];
984
985 do {
986 hres = read_stream(&This->bsc, stream, buf, sizeof(buf), &read);
987 }while(hres == S_OK && read);
988
989 return S_OK;
990 }
991
992 if(!This->nsstream) {
993 This->nsstream = create_nsprotocol_stream();
994 if(!This->nsstream)
995 return E_OUTOFMEMORY;
996 }
997
998 do {
999 BOOL first_read = !This->bsc.readed;
1000
1001 hres = read_stream(&This->bsc, stream, This->nsstream->buf+This->nsstream->buf_size,
1002 sizeof(This->nsstream->buf)-This->nsstream->buf_size, &read);
1003 if(!read)
1004 break;
1005
1006 This->nsstream->buf_size += read;
1007
1008 if(first_read) {
1009 switch(This->bsc.bom) {
1010 case BOM_UTF8:
1011 This->nschannel->charset = heap_strdupA(UTF8_STR);
1012 break;
1013 case BOM_UTF16:
1014 This->nschannel->charset = heap_strdupA(UTF16_STR);
1015 case BOM_NONE:
1016 /* FIXME: Get charset from HTTP headers */;
1017 }
1018
1019 if(!This->nschannel->content_type) {
1020 WCHAR *mime;
1021
1022 hres = FindMimeFromData(NULL, NULL, This->nsstream->buf, This->nsstream->buf_size,
1023 This->is_doc_channel ? text_htmlW : NULL, 0, &mime, 0);
1024 if(FAILED(hres))
1025 return hres;
1026
1027 TRACE("Found MIME %s\n", debugstr_w(mime));
1028
1029 This->nschannel->content_type = heap_strdupWtoA(mime);
1031 if(!This->nschannel->content_type)
1032 return E_OUTOFMEMORY;
1033 }
1034
1036 if(FAILED(hres))
1037 return hres;
1038 }
1039
1040 nsres = nsIStreamListener_OnDataAvailable(This->nslistener,
1041 (nsIRequest*)&This->nschannel->nsIHttpChannel_iface, This->nscontext,
1042 &This->nsstream->nsIInputStream_iface, This->bsc.readed-This->nsstream->buf_size,
1043 This->nsstream->buf_size);
1044#ifdef __REACTOS__
1045 if(NS_FAILED(nsres)) {
1046 WARN("OnDataAvailable failed: %08lx\n", nsres);
1047 return map_nsresult(nsres);
1048 }
1049#else
1050 if(NS_FAILED(nsres))
1051 ERR("OnDataAvailable failed: %08x\n", nsres);
1052#endif
1053
1054 if(This->nsstream->buf_size == sizeof(This->nsstream->buf)) {
1055 ERR("buffer is full\n");
1056 break;
1057 }
1058 }while(hres == S_OK);
1059
1060 return S_OK;
1061}
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
HRESULT WINAPI FindMimeFromData(LPBC pBC, LPCWSTR pwzUrl, LPVOID pBuffer, DWORD cbSize, LPCWSTR pwzMimeProposed, DWORD dwMimeFlags, LPWSTR *ppwzMimeOut, DWORD dwReserved)
Definition: mimefilter.c:655
#define UTF16_STR
Definition: navigate.c:26
HRESULT read_stream(BSCallback *This, IStream *stream, void *buf, DWORD size, DWORD *ret_size)
Definition: navigate.c:602
static const WCHAR text_htmlW[]
Definition: navigate.c:29
static nsProtocolStream * create_nsprotocol_stream(void)
Definition: navigate.c:175
#define UTF8_STR
Definition: navigate.c:25
static void query_http_info(nsChannelBSC *This, IWinInetHttpInfo *wininet_info)
Definition: navigate.c:733
HRESULT map_nsresult(nsresult)
Definition: nsembed.c:841

Referenced by channelbsc_load_stream(), load_admin_properties(), msi_load_string_table(), and nsChannelBSC_read_data().

◆ release_request_data()

static void release_request_data ( request_data_t request_data)
static

Definition at line 190 of file navigate.c.

191{
192 if(request_data->post_stream)
193 nsIInputStream_Release(request_data->post_stream);
194 heap_free(request_data->headers);
195 if(request_data->post_data)
196 GlobalFree(request_data->post_data);
197}

Referenced by BindStatusCallback_Release(), create_channelbsc(), and submit_form().

◆ start_binding()

HRESULT start_binding ( HTMLInnerWindow inner_window,
BSCallback bscallback,
IBindCtx bctx 
)

Definition at line 762 of file navigate.c.

763{
764 IStream *str = NULL;
766
767 TRACE("(%p %p %p)\n", inner_window, bscallback, bctx);
768
769 bscallback->window = inner_window;
770
771 /* NOTE: IE7 calls IsSystemMoniker here*/
772
773 if(bctx) {
775 if(SUCCEEDED(hres))
776 IBindCtx_AddRef(bctx);
777 }else {
778 hres = CreateAsyncBindCtx(0, &bscallback->IBindStatusCallback_iface, NULL, &bctx);
779 }
780
781 if(FAILED(hres)) {
782 bscallback->window = NULL;
783 return hres;
784 }
785
786 hres = IMoniker_BindToStorage(bscallback->mon, bctx, NULL, &IID_IStream, (void**)&str);
787 IBindCtx_Release(bctx);
788 if(FAILED(hres)) {
789 WARN("BindToStorage failed: %08x\n", hres);
790 bscallback->window = NULL;
791 return hres;
792 }
793
794 if(str)
795 IStream_Release(str);
796
797 return S_OK;
798}
IMoniker * mon
Definition: binding.h:87
HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbscPrevious, DWORD dwReserved)
Definition: bindctx.c:615

Referenced by bind_script_to_text(), navigate_proc(), PersistMoniker_Load(), start_binding_proc(), start_doc_binding_proc(), and super_navigate().

◆ start_doc_binding_proc()

static void start_doc_binding_proc ( task_t _task)
static

Definition at line 1749 of file navigate.c.

1750{
1752
1753 set_current_mon(task->window, task->pending_window->bscallback->bsc.mon, BINDING_NAVIGATED);
1754 start_binding(task->pending_window, &task->pending_window->bscallback->bsc, NULL);
1755}
#define BINDING_NAVIGATED
Definition: binding.h:127

Referenced by async_start_doc_binding().

◆ start_doc_binding_task_destr()

static void start_doc_binding_task_destr ( task_t _task)
static

Definition at line 1757 of file navigate.c.

1758{
1760
1761 IHTMLWindow2_Release(&task->pending_window->base.IHTMLWindow2_iface);
1762 heap_free(task);
1763}

Referenced by async_start_doc_binding().

◆ stop_request_proc()

static void stop_request_proc ( task_t _task)
static

Definition at line 1246 of file navigate.c.

1247{
1249
1250 TRACE("(%p)\n", task->bsc);
1251
1252 list_remove(&task->bsc->bsc.entry);
1253 list_init(&task->bsc->bsc.entry);
1255}

Referenced by async_stop_request().

◆ stop_request_task_destr()

static void stop_request_task_destr ( task_t _task)
static

Definition at line 1257 of file navigate.c.

1258{
1260
1261 IBindStatusCallback_Release(&task->bsc->bsc.IBindStatusCallback_iface);
1262 heap_free(task);
1263}

Referenced by async_stop_request().

◆ submit_form()

HRESULT submit_form ( HTMLOuterWindow window,
const WCHAR target,
IUri submit_uri,
nsIInputStream post_stream 
)

Definition at line 2368 of file navigate.c.

2369{
2370 request_data_t request_data = {NULL};
2371 HRESULT hres;
2372
2373 hres = read_post_data_stream(post_stream, TRUE, NULL, &request_data);
2374 if(FAILED(hres))
2375 return hres;
2376
2377 if(window) {
2378 IUri *uri;
2379 BSTR display_uri;
2380
2381 window->readystate_locked++;
2382
2383 hres = translate_uri(window, submit_uri, &display_uri, &uri);
2384 if(SUCCEEDED(hres)) {
2385 hres = navigate_uri(window, uri, display_uri, &request_data, BINDING_NAVIGATED|BINDING_SUBMIT);
2386 IUri_Release(uri);
2387 SysFreeString(display_uri);
2388 }
2389
2390 window->readystate_locked--;
2391 }else
2392 hres = navigate_new_window(window, submit_uri, target, &request_data, NULL);
2393
2394 release_request_data(&request_data);
2395 return hres;
2396}
#define BINDING_SUBMIT
Definition: binding.h:131
HRESULT navigate_new_window(HTMLOuterWindow *window, IUri *uri, const WCHAR *name, request_data_t *request_data, IHTMLWindow2 **ret)
Definition: navigate.c:2139
Definition: tools.h:99

Referenced by HTMLFormElement_submit().

◆ super_navigate()

HRESULT super_navigate ( HTMLOuterWindow window,
IUri uri,
DWORD  flags,
const WCHAR headers,
BYTE post_data,
DWORD  post_data_size 
)

Definition at line 2023 of file navigate.c.

2024{
2026 IUri *uri_nofrag;
2027 IMoniker *mon;
2028 DWORD scheme;
2029 HRESULT hres;
2030
2031 uri_nofrag = get_uri_nofrag(uri);
2032 if(!uri_nofrag)
2033 return E_FAIL;
2034
2035 if(window->doc_obj->client && !(flags & BINDING_REFRESH)) {
2036 IOleCommandTarget *cmdtrg;
2037
2038 hres = IOleClientSite_QueryInterface(window->doc_obj->client, &IID_IOleCommandTarget, (void**)&cmdtrg);
2039 if(SUCCEEDED(hres)) {
2040 VARIANT in, out;
2041 BSTR url_str;
2042
2043 hres = IUri_GetDisplayUri(uri_nofrag, &url_str);
2044 if(SUCCEEDED(hres)) {
2045 V_VT(&in) = VT_BSTR;
2046 V_BSTR(&in) = url_str;
2047 V_VT(&out) = VT_BOOL;
2048 V_BOOL(&out) = VARIANT_TRUE;
2049 hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 67, 0, &in, &out);
2050 IOleCommandTarget_Release(cmdtrg);
2051 if(SUCCEEDED(hres))
2052 VariantClear(&out);
2053 SysFreeString(url_str);
2054 }
2055 }
2056 }
2057
2058 if(!(flags & BINDING_NOFRAG) && window->uri_nofrag && !post_data_size) {
2059 BOOL eq;
2060
2061 hres = IUri_IsEqual(uri_nofrag, window->uri_nofrag, &eq);
2062 if(SUCCEEDED(hres) && eq) {
2063 IUri_Release(uri_nofrag);
2064 TRACE("fragment navigate\n");
2065 return navigate_fragment(window, uri);
2066 }
2067 }
2068
2069 hres = CreateURLMonikerEx2(NULL, uri_nofrag, &mon, URL_MK_UNIFORM);
2070 IUri_Release(uri_nofrag);
2071 if(FAILED(hres))
2072 return hres;
2073
2074 /* FIXME: Why not set_ready_state? */
2075 window->readystate = READYSTATE_UNINITIALIZED;
2076
2077 hres = create_channelbsc(mon, headers, post_data, post_data_size, TRUE, &bsc);
2078 if(FAILED(hres)) {
2079 IMoniker_Release(mon);
2080 return hres;
2081 }
2082
2083 prepare_for_binding(&window->doc_obj->basedoc, mon, flags);
2084
2085 hres = IUri_GetScheme(uri, &scheme);
2088
2089 IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
2090 IMoniker_Release(mon);
2091
2092 task = heap_alloc(sizeof(*task));
2093 if(!task)
2094 return E_OUTOFMEMORY;
2095
2096 /* Why silently? */
2097 window->readystate = READYSTATE_COMPLETE;
2098 if(!(flags & BINDING_FROMHIST))
2099 call_docview_84(window->doc_obj);
2100
2101 IUri_AddRef(uri);
2102 task->window = window;
2103 task->uri = uri;
2105 }else if(flags & BINDING_SUBMIT) {
2106 hres = set_moniker(window, mon, uri, NULL, bsc, TRUE);
2107 if(SUCCEEDED(hres))
2108 hres = start_binding(window->pending_window, &bsc->bsc, NULL);
2109 IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
2110 IMoniker_Release(mon);
2111 }else {
2113
2114 task = heap_alloc(sizeof(*task));
2115 if(!task) {
2116 IBindStatusCallback_Release(&bsc->bsc.IBindStatusCallback_iface);
2117 IMoniker_Release(mon);
2118 return E_OUTOFMEMORY;
2119 }
2120
2121 /* Silently and repeated when real loading starts? */
2122 window->readystate = READYSTATE_LOADING;
2124 call_docview_84(window->doc_obj);
2125
2126 task->window = window;
2127 task->bscallback = bsc;
2128 task->flags = flags;
2129 task->mon = mon;
2130
2131 IUri_AddRef(uri);
2132 task->uri = uri;
2133 hres = push_task(&task->header, navigate_proc, navigate_task_destr, window->task_magic);
2134 }
2135
2136 return hres;
2137}
#define BINDING_NOFRAG
Definition: binding.h:132
IUri * get_uri_nofrag(IUri *) DECLSPEC_HIDDEN
Definition: nsio.c:77
#define BINDING_FROMHIST
Definition: binding.h:129
void prepare_for_binding(HTMLDocument *, IMoniker *, DWORD) DECLSPEC_HIDDEN
Definition: persist.c:271
GLuint in
Definition: glext.h:9616
#define eq(received, expected, label, type)
Definition: locale.c:179
static void navigate_task_destr(task_t *_task)
Definition: navigate.c:1944
static void navigate_javascript_task_destr(task_t *_task)
Definition: navigate.c:1914
static void navigate_proc(task_t *_task)
Definition: navigate.c:1931
static void navigate_javascript_proc(task_t *_task)
Definition: navigate.c:1876
static HRESULT navigate_fragment(HTMLOuterWindow *window, IUri *uri)
Definition: navigate.c:1954
void call_docview_84(HTMLDocumentObj *) DECLSPEC_HIDDEN
Definition: oleobj.c:173
@ URL_SCHEME_JAVASCRIPT
Definition: shlwapi.h:559
DWORD scheme
HRESULT WINAPI CreateURLMonikerEx2(IMoniker *pmkContext, IUri *pUri, IMoniker **ppmk, DWORD dwFlags)
Definition: umon.c:683
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by HTMLPrivateWindow_SuperNavigate(), and navigate_uri().

◆ translate_uri()

static HRESULT translate_uri ( HTMLOuterWindow window,
IUri orig_uri,
BSTR ret_display_uri,
IUri **  ret_uri 
)
static

Definition at line 2327 of file navigate.c.

2328{
2329 IUri *uri = NULL;
2330 BSTR display_uri;
2331 HRESULT hres;
2332
2333 hres = IUri_GetDisplayUri(orig_uri, &display_uri);
2334 if(FAILED(hres))
2335 return hres;
2336
2337 if(window->doc_obj && window->doc_obj->hostui) {
2338 OLECHAR *translated_url = NULL;
2339
2340 hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, display_uri,
2341 &translated_url);
2342 if(hres == S_OK && translated_url) {
2343 TRACE("%08x %s -> %s\n", hres, debugstr_w(display_uri), debugstr_w(translated_url));
2344 SysFreeString(display_uri);
2345 hres = create_uri(translated_url, 0, &uri);
2346 CoTaskMemFree(translated_url);
2347 if(FAILED(hres))
2348 return hres;
2349
2350 hres = IUri_GetDisplayUri(uri, &display_uri);
2351 if(FAILED(hres)) {
2352 IUri_Release(uri);
2353 return hres;
2354 }
2355 }
2356 }
2357
2358 if(!uri) {
2359 IUri_AddRef(orig_uri);
2360 uri = orig_uri;
2361 }
2362
2363 *ret_display_uri = display_uri;
2364 *ret_uri = uri;
2365 return S_OK;
2366}
WCHAR OLECHAR
Definition: compat.h:2292

Referenced by navigate_url(), and submit_form().

Variable Documentation

◆ BindStatusCallbackVtbl

const IBindStatusCallbackVtbl BindStatusCallbackVtbl
static
Initial value:
= {
}
static ULONG WINAPI BindStatusCallback_AddRef(IBindStatusCallback *iface)
Definition: navigate.c:196
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
Definition: navigate.c:416
static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: navigate.c:408
static HRESULT WINAPI BindStatusCallback_OnLowResource(IBindStatusCallback *iface, DWORD reserved)
Definition: navigate.c:249
static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
Definition: navigate.c:206
static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: navigate.c:386
static HRESULT WINAPI BindStatusCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
Definition: navigate.c:241
static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
Definition: navigate.c:360
static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: navigate.c:276
static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pbind)
Definition: navigate.c:228
static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *iface, REFIID riid, void **ppv)
Definition: navigate.c:166

Definition at line 399 of file navigate.c.

◆ emptyW

const WCHAR emptyW[] = {0}
static

Definition at line 28 of file navigate.c.

◆ HttpNegotiate2Vtbl

const IHttpNegotiate2Vtbl HttpNegotiate2Vtbl
static
Initial value:
= {
}
static ULONG WINAPI HttpNegotiate_AddRef(IHttpNegotiate *iface)
Definition: navigate.c:452
static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate *iface, LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders)
Definition: navigate.c:464
static ULONG WINAPI HttpNegotiate_Release(IHttpNegotiate *iface)
Definition: navigate.c:458
static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders)
Definition: navigate.c:481
static HRESULT WINAPI HttpNegotiate_QueryInterface(IHttpNegotiate *iface, REFIID riid, void **ppv)
Definition: navigate.c:445
static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface, BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
Definition: navigate.c:476

Definition at line 484 of file navigate.c.

Referenced by init_bscallback().

◆ InternetBindInfoVtbl

const IInternetBindInfoVtbl InternetBindInfoVtbl
static
Initial value:
= {
}
static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
Definition: navigate.c:525
static ULONG WINAPI InternetBindInfo_Release(IInternetBindInfo *iface)
Definition: navigate.c:511
static ULONG WINAPI InternetBindInfo_AddRef(IInternetBindInfo *iface)
Definition: navigate.c:505
static HRESULT WINAPI InternetBindInfo_QueryInterface(IInternetBindInfo *iface, REFIID riid, void **ppv)
Definition: navigate.c:498
static HRESULT WINAPI InternetBindInfo_GetBindInfo(IInternetBindInfo *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: navigate.c:517

Definition at line 533 of file navigate.c.

Referenced by init_bscallback().

◆ nsAsyncVerifyRedirectCallbackVtbl

const nsIAsyncVerifyRedirectCallbackVtbl nsAsyncVerifyRedirectCallbackVtbl
static
Initial value:
= {
}
static nsrefcnt NSAPI nsAsyncVerifyRedirectCallback_Release(nsIAsyncVerifyRedirectCallback *iface)
Definition: navigate.c:1108
static nsresult NSAPI nsAsyncVerifyRedirectCallback_OnRedirectVerifyCallback(nsIAsyncVerifyRedirectCallback *iface, nsresult result)
Definition: navigate.c:1124
static nsrefcnt NSAPI nsAsyncVerifyRedirectCallback_AddRef(nsIAsyncVerifyRedirectCallback *iface)
Definition: navigate.c:1098
static nsresult NSAPI nsAsyncVerifyRedirectCallback_QueryInterface(nsIAsyncVerifyRedirectCallback *iface, nsIIDRef riid, void **result)
Definition: navigate.c:1077

Definition at line 1167 of file navigate.c.

Referenced by create_redirect_callback().

◆ nsChannelBSCVtbl

const BSCallbackVtbl nsChannelBSCVtbl
static
Initial value:
= {
}
static HRESULT nsChannelBSC_read_data(BSCallback *bsc, IStream *stream)
Definition: navigate.c:1389
static HRESULT nsChannelBSC_beginning_transaction(BSCallback *bsc, WCHAR **additional_headers)
Definition: navigate.c:1640
static HRESULT nsChannelBSC_start_binding(BSCallback *bsc)
Definition: navigate.c:1215
static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR status_text)
Definition: navigate.c:1539
static void nsChannelBSC_destroy(BSCallback *bsc)
Definition: navigate.c:1200
static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result)
Definition: navigate.c:1371
static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code, LPCWSTR response_headers)
Definition: navigate.c:1604
static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc)
Definition: navigate.c:1225

Definition at line 1689 of file navigate.c.

Referenced by create_channelbsc().

◆ nsInputStreamVtbl

const nsIInputStreamVtbl nsInputStreamVtbl
static
Initial value:
= {
}
static nsresult NSAPI nsInputStream_Close(nsIInputStream *iface)
Definition: navigate.c:93
static nsresult NSAPI nsInputStream_Read(nsIInputStream *iface, char *aBuf, UINT32 aCount, UINT32 *_retval)
Definition: navigate.c:107
static nsrefcnt NSAPI nsInputStream_Release(nsIInputStream *iface)
Definition: navigate.c:80
static nsresult NSAPI nsInputStream_ReadSegments(nsIInputStream *iface, nsresult(WINAPI *aWriter)(nsIInputStream *, void *, const char *, UINT32, UINT32, UINT32 *), void *aClousure, UINT32 aCount, UINT32 *_retval)
Definition: navigate.c:129
static nsresult NSAPI nsInputStream_QueryInterface(nsIInputStream *iface, nsIIDRef riid, void **result)
Definition: navigate.c:45
static nsresult NSAPI nsInputStream_IsNonBlocking(nsIInputStream *iface, cpp_bool *_retval)
Definition: navigate.c:157
static nsresult NSAPI nsInputStream_Available(nsIInputStream *iface, UINT64 *_retval)
Definition: navigate.c:100
static nsrefcnt NSAPI nsInputStream_AddRef(nsIInputStream *iface)
Definition: navigate.c:69

Definition at line 164 of file navigate.c.

Referenced by create_nsprotocol_stream().

◆ ServiceProviderVtbl

const IServiceProviderVtbl ServiceProviderVtbl
static
Initial value:
= {
}
static ULONG WINAPI BSCServiceProvider_AddRef(IServiceProvider *iface)
Definition: navigate.c:553
static HRESULT WINAPI BSCServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: navigate.c:546
static ULONG WINAPI BSCServiceProvider_Release(IServiceProvider *iface)
Definition: navigate.c:559
static HRESULT WINAPI BSCServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: navigate.c:565

Definition at line 577 of file navigate.c.

Referenced by init_bscallback().

◆ text_htmlW

const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0}
static

Definition at line 29 of file navigate.c.

Referenced by HTMLDocument_open(), read_stream_data(), and test_FindMimeFromData().