mshtml: Properly handle fragment-only navigation.
This commit is contained in:
parent
7b5125ac02
commit
fbdfec74b0
|
@ -671,6 +671,7 @@ void release_nsio(void) DECLSPEC_HIDDEN;
|
||||||
BOOL is_gecko_path(const char*) DECLSPEC_HIDDEN;
|
BOOL is_gecko_path(const char*) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*) DECLSPEC_HIDDEN;
|
HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*) DECLSPEC_HIDDEN;
|
||||||
|
BOOL compare_ignoring_frag(IUri*,IUri*) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
|
HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
|
||||||
HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*) DECLSPEC_HIDDEN;
|
HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*) DECLSPEC_HIDDEN;
|
||||||
|
@ -700,6 +701,7 @@ nsresult get_nsinterface(nsISupports*,REFIID,void**) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
void set_window_bscallback(HTMLWindow*,nsChannelBSC*) DECLSPEC_HIDDEN;
|
void set_window_bscallback(HTMLWindow*,nsChannelBSC*) DECLSPEC_HIDDEN;
|
||||||
void set_current_mon(HTMLWindow*,IMoniker*) DECLSPEC_HIDDEN;
|
void set_current_mon(HTMLWindow*,IMoniker*) DECLSPEC_HIDDEN;
|
||||||
|
void set_current_uri(HTMLWindow*,IUri*) DECLSPEC_HIDDEN;
|
||||||
HRESULT start_binding(HTMLWindow*,HTMLDocumentNode*,BSCallback*,IBindCtx*) DECLSPEC_HIDDEN;
|
HRESULT start_binding(HTMLWindow*,HTMLDocumentNode*,BSCallback*,IBindCtx*) DECLSPEC_HIDDEN;
|
||||||
HRESULT async_start_doc_binding(HTMLWindow*,nsChannelBSC*) DECLSPEC_HIDDEN;
|
HRESULT async_start_doc_binding(HTMLWindow*,nsChannelBSC*) DECLSPEC_HIDDEN;
|
||||||
void abort_document_bindings(HTMLDocumentNode*) DECLSPEC_HIDDEN;
|
void abort_document_bindings(HTMLDocumentNode*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -1766,6 +1766,45 @@ static void navigate_task_destr(task_t *_task)
|
||||||
heap_free(task);
|
heap_free(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT navigate_fragment(HTMLWindow *window, IUri *uri)
|
||||||
|
{
|
||||||
|
nsIDOMLocation *nslocation;
|
||||||
|
nsAString nsfrag_str;
|
||||||
|
BSTR frag;
|
||||||
|
nsresult nsres;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
set_current_uri(window, uri);
|
||||||
|
|
||||||
|
nsres = nsIDOMWindow_GetLocation(window->nswindow, &nslocation);
|
||||||
|
if(FAILED(nsres) || !nslocation)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
hres = IUri_GetFragment(uri, &frag);
|
||||||
|
if(FAILED(hres)) {
|
||||||
|
nsIDOMLocation_Release(nslocation);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsAString_InitDepend(&nsfrag_str, frag);
|
||||||
|
nsres = nsIDOMLocation_SetHash(nslocation, &nsfrag_str);
|
||||||
|
nsAString_Finish(&nsfrag_str);
|
||||||
|
nsIDOMLocation_Release(nslocation);
|
||||||
|
SysFreeString(frag);
|
||||||
|
if(NS_FAILED(nsres)) {
|
||||||
|
ERR("SetHash failed: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(window->doc_obj->doc_object_service) {
|
||||||
|
IDocObjectService_FireNavigateComplete2(window->doc_obj->doc_object_service, &window->IHTMLWindow2_iface, 0x10);
|
||||||
|
IDocObjectService_FireDocumentComplete(window->doc_obj->doc_object_service, &window->IHTMLWindow2_iface, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT super_navigate(HTMLWindow *window, IUri *uri, const WCHAR *headers, BYTE *post_data, DWORD post_data_size)
|
HRESULT super_navigate(HTMLWindow *window, IUri *uri, const WCHAR *headers, BYTE *post_data, DWORD post_data_size)
|
||||||
{
|
{
|
||||||
nsChannelBSC *bsc;
|
nsChannelBSC *bsc;
|
||||||
|
@ -1796,6 +1835,11 @@ HRESULT super_navigate(HTMLWindow *window, IUri *uri, const WCHAR *headers, BYTE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(window->uri && compare_ignoring_frag(window->uri, uri)) {
|
||||||
|
TRACE("fragment navigate\n");
|
||||||
|
return navigate_fragment(window, uri);
|
||||||
|
}
|
||||||
|
|
||||||
hres = CreateURLMonikerEx2(NULL, uri, &mon, URL_MK_UNIFORM);
|
hres = CreateURLMonikerEx2(NULL, uri, &mon, URL_MK_UNIFORM);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return hres;
|
return hres;
|
||||||
|
|
|
@ -130,7 +130,6 @@ typedef nsISupports nsIDOMMediaList;
|
||||||
typedef nsISupports nsIDOMHTMLTableCaptionElement;
|
typedef nsISupports nsIDOMHTMLTableCaptionElement;
|
||||||
typedef nsISupports nsIDOMHTMLTableSectionElement;
|
typedef nsISupports nsIDOMHTMLTableSectionElement;
|
||||||
typedef nsISupports nsIDOMClientRectList;
|
typedef nsISupports nsIDOMClientRectList;
|
||||||
typedef nsISupports nsIDOMLocation;
|
|
||||||
typedef nsISupports nsINode;
|
typedef nsISupports nsINode;
|
||||||
typedef nsISupports nsIStyleSheet;
|
typedef nsISupports nsIStyleSheet;
|
||||||
typedef nsISupports nsIStyleRule;
|
typedef nsISupports nsIStyleRule;
|
||||||
|
@ -554,6 +553,35 @@ interface nsIChannelEventSink : nsISupports
|
||||||
nsIAsyncVerifyRedirectCallback *callback);
|
nsIAsyncVerifyRedirectCallback *callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(a6cf906d-15b3-11d2-932e-00805f8add32),
|
||||||
|
local
|
||||||
|
]
|
||||||
|
interface nsIDOMLocation : nsISupports
|
||||||
|
{
|
||||||
|
nsresult GetHash(nsAString *aHash);
|
||||||
|
nsresult SetHash(const nsAString *aHash);
|
||||||
|
nsresult GetHost(nsAString *aHost);
|
||||||
|
nsresult SetHost(const nsAString *aHost);
|
||||||
|
nsresult GetHostname(nsAString *aHostname);
|
||||||
|
nsresult SetHostname(const nsAString *aHostname);
|
||||||
|
nsresult GetHref(nsAString *aHref);
|
||||||
|
nsresult SetHref(const nsAString *aHref);
|
||||||
|
nsresult GetPathname(nsAString *aPathname);
|
||||||
|
nsresult SetPathname(const nsAString *aPathname);
|
||||||
|
nsresult GetPort(nsAString *aPort);
|
||||||
|
nsresult SetPort(const nsAString *aPort);
|
||||||
|
nsresult GetProtocol(nsAString *aProtocol);
|
||||||
|
nsresult SetProtocol(const nsAString *aProtocol);
|
||||||
|
nsresult GetSearch(nsAString *aSearch);
|
||||||
|
nsresult SetSearch(const nsAString *aSearch);
|
||||||
|
nsresult Reload(PRBool forceget);
|
||||||
|
nsresult Replace(const nsAString *url);
|
||||||
|
nsresult Assign(const nsAString *url);
|
||||||
|
nsresult ToString(nsAString *_retval);
|
||||||
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
object,
|
object,
|
||||||
uuid(2938307a-9d70-4b63-8afc-0197e82318ad),
|
uuid(2938307a-9d70-4b63-8afc-0197e82318ad),
|
||||||
|
|
|
@ -113,7 +113,7 @@ static IUri *get_uri_nofrag(IUri *uri)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL compare_ignoring_frag(IUri *uri1, IUri *uri2)
|
BOOL compare_ignoring_frag(IUri *uri1, IUri *uri2)
|
||||||
{
|
{
|
||||||
IUri *uri_nofrag1, *uri_nofrag2;
|
IUri *uri_nofrag1, *uri_nofrag2;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
|
|
@ -70,7 +70,7 @@ static BOOL use_gecko_script(HTMLWindow *window)
|
||||||
return FAILED(hres) || scheme != URL_SCHEME_ABOUT;
|
return FAILED(hres) || scheme != URL_SCHEME_ABOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_current_uri(HTMLWindow *window, IUri *uri)
|
void set_current_uri(HTMLWindow *window, IUri *uri)
|
||||||
{
|
{
|
||||||
if(window->uri) {
|
if(window->uri) {
|
||||||
IUri_Release(window->uri);
|
IUri_Release(window->uri);
|
||||||
|
|
Loading…
Reference in New Issue