Jacek Caban : mshtml: Moved HTMLLocation object to HTMLWindow.
Alexandre Julliard
julliard at winehq.org
Thu Sep 17 13:52:14 CDT 2009
Module: wine
Branch: master
Commit: 74f28d4a20947dfbbda21993e94c242e3f1a920f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=74f28d4a20947dfbbda21993e94c242e3f1a920f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 16 22:05:50 2009 +0200
mshtml: Moved HTMLLocation object to HTMLWindow.
---
dlls/mshtml/htmldoc.c | 11 +-------
dlls/mshtml/htmllocation.c | 61 ++++++++++++++++++++++++++---------------
dlls/mshtml/htmlwindow.c | 19 ++++++++++---
dlls/mshtml/mshtml_private.h | 23 +++++++--------
4 files changed, 66 insertions(+), 48 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 1c35b4b..e34e9dd 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -196,9 +196,6 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
if(This->hwnd)
DestroyWindow(This->hwnd);
- if(This->location)
- This->location->doc = NULL;
-
if(This->window)
IHTMLWindow2_Release(HTMLWINDOW2(This->window));
@@ -733,13 +730,7 @@ static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLoca
TRACE("(%p)->(%p)\n", This, p);
- if(This->location)
- IHTMLLocation_AddRef(HTMLLOCATION(This->location));
- else
- This->location = HTMLLocation_Create(This);
-
- *p = HTMLLOCATION(This->location);
- return S_OK;
+ return IHTMLWindow2_get_location(HTMLWINDOW2(This->window), p);
}
static HRESULT WINAPI HTMLDocument_get_lastModified(IHTMLDocument2 *iface, BSTR *p)
diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
index 8637838..6a3e194 100644
--- a/dlls/mshtml/htmllocation.c
+++ b/dlls/mshtml/htmllocation.c
@@ -35,6 +35,18 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
+static HRESULT get_url(HTMLLocation *This, const WCHAR **ret)
+{
+ if(!This->window || !This->window->doc || !This->window->doc->url) {
+ FIXME("No current URL\n");
+ return E_NOTIMPL;
+ }
+
+ *ret = This->window->doc->url;
+ return S_OK;
+}
+
+
#define HTMLLOCATION_THIS(iface) DEFINE_THIS(HTMLLocation, HTMLLocation, iface)
static HRESULT WINAPI HTMLLocation_QueryInterface(IHTMLLocation *iface, REFIID riid, void **ppv)
@@ -80,8 +92,8 @@ static ULONG WINAPI HTMLLocation_Release(IHTMLLocation *iface)
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
- if(This->doc && This->doc->location == This)
- This->doc->location = NULL;
+ if(This->window)
+ This->window->location = NULL;
release_dispex(&This->dispex);
heap_free(This);
}
@@ -129,20 +141,20 @@ static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v)
static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p)
{
HTMLLocation *This = HTMLLOCATION_THIS(iface);
+ const WCHAR *url;
+ HRESULT hres;
TRACE("(%p)->(%p)\n", This, p);
if(!p)
return E_POINTER;
- if(!This->doc || !This->doc->url) {
- FIXME("No current URL\n");
- return E_NOTIMPL;
- }
-
- *p = SysAllocString(This->doc->url);
+ hres = get_url(This, &url);
+ if(FAILED(hres))
+ return hres;
- return S_OK;
+ *p = SysAllocString(url);
+ return *p ? S_OK : E_OUTOFMEMORY;
}
static HRESULT WINAPI HTMLLocation_put_protocol(IHTMLLocation *iface, BSTR v)
@@ -213,17 +225,17 @@ static HRESULT WINAPI HTMLLocation_get_pathname(IHTMLLocation *iface, BSTR *p)
HTMLLocation *This = HTMLLOCATION_THIS(iface);
WCHAR buf[INTERNET_MAX_PATH_LENGTH];
URL_COMPONENTSW url = {sizeof(url)};
+ const WCHAR *doc_url;
DWORD size = 0;
HRESULT hres;
TRACE("(%p)->(%p)\n", This, p);
- if(!This->doc || !This->doc->url) {
- FIXME("No current URL\n");
- return E_NOTIMPL;
- }
+ hres = get_url(This, &doc_url);
+ if(FAILED(hres))
+ return hres;
- hres = CoInternetParseUrl(This->doc->url, PARSE_PATH_FROM_URL, 0, buf, sizeof(buf), &size, 0);
+ hres = CoInternetParseUrl(doc_url, PARSE_PATH_FROM_URL, 0, buf, sizeof(buf), &size, 0);
if(SUCCEEDED(hres)) {
*p = SysAllocString(buf);
if(!*p)
@@ -232,7 +244,7 @@ static HRESULT WINAPI HTMLLocation_get_pathname(IHTMLLocation *iface, BSTR *p)
}
url.dwUrlPathLength = 1;
- if(!InternetCrackUrlW(This->doc->url, 0, 0, &url)) {
+ if(!InternetCrackUrlW(doc_url, 0, 0, &url)) {
FIXME("InternetCrackUrl failed\n");
return E_FAIL;
}
@@ -382,15 +394,20 @@ static dispex_static_data_t HTMLLocation_dispex = {
};
-HTMLLocation *HTMLLocation_Create(HTMLDocument *doc)
+HRESULT HTMLLocation_Create(HTMLWindow *window, HTMLLocation **ret)
{
- HTMLLocation *ret = heap_alloc(sizeof(*ret));
+ HTMLLocation *location;
- ret->lpHTMLLocationVtbl = &HTMLLocationVtbl;
- ret->ref = 1;
- ret->doc = doc;
+ location = heap_alloc(sizeof(*location));
+ if(!location)
+ return E_OUTOFMEMORY;
- init_dispex(&ret->dispex, (IUnknown*)HTMLLOCATION(ret), &HTMLLocation_dispex);
+ location->lpHTMLLocationVtbl = &HTMLLocationVtbl;
+ location->ref = 1;
+ location->window = window;
- return ret;
+ init_dispex(&location->dispex, (IUnknown*)HTMLLOCATION(location), &HTMLLocation_dispex);
+
+ *ret = location;
+ return S_OK;
}
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 60a46a1..c08929b 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -100,6 +100,11 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
IHTMLOptionElementFactory_Release(HTMLOPTFACTORY(This->option_factory));
}
+ if(This->location) {
+ This->location->window = NULL;
+ IHTMLLocation_Release(HTMLLOCATION(This->location));
+ }
+
if(This->event_target)
release_event_target(This->event_target);
for(i=0; i < This->global_prop_cnt; i++)
@@ -364,12 +369,18 @@ static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocatio
TRACE("(%p)->(%p)\n", This, p);
- if(!This->doc) {
- FIXME("This->doc is NULL\n");
- return E_FAIL;
+ if(This->location) {
+ IHTMLLocation_AddRef(HTMLLOCATION(This->location));
+ }else {
+ HRESULT hres;
+
+ hres = HTMLLocation_Create(This, &This->location);
+ if(FAILED(hres))
+ return hres;
}
- return IHTMLDocument2_get_location(HTMLDOC(This->doc), p);
+ *p = HTMLLOCATION(This->location);
+ return S_OK;
}
static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index f5cb291..9508847 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -176,6 +176,15 @@ typedef struct {
HTMLWindow *window;
} HTMLOptionElementFactory;
+struct HTMLLocation {
+ DispatchEx dispex;
+ const IHTMLLocationVtbl *lpHTMLLocationVtbl;
+
+ LONG ref;
+
+ HTMLWindow *window;
+};
+
struct HTMLWindow {
DispatchEx dispex;
const IHTMLWindow2Vtbl *lpHTMLWindow2Vtbl;
@@ -194,6 +203,7 @@ struct HTMLWindow {
struct list script_hosts;
HTMLOptionElementFactory *option_factory;
+ HTMLLocation *location;
global_prop_t *global_props;
DWORD global_prop_cnt;
@@ -232,15 +242,6 @@ struct ConnectionPoint {
ConnectionPoint *next;
};
-struct HTMLLocation {
- DispatchEx dispex;
- const IHTMLLocationVtbl *lpHTMLLocationVtbl;
-
- LONG ref;
-
- HTMLDocument *doc;
-};
-
struct HTMLDocument {
DispatchEx dispex;
const IHTMLDocument2Vtbl *lpHTMLDocument2Vtbl;
@@ -307,8 +308,6 @@ struct HTMLDocument {
ConnectionPoint cp_htmldocevents2;
ConnectionPoint cp_propnotif;
- HTMLLocation *location;
-
struct list selection_list;
struct list range_list;
@@ -514,7 +513,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocument**);
HRESULT HTMLWindow_Create(HTMLDocument*,nsIDOMWindow*,HTMLWindow**);
HTMLWindow *nswindow_to_window(const nsIDOMWindow*);
HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*);
-HTMLLocation *HTMLLocation_Create(HTMLDocument*);
+HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**);
IOmNavigator *OmNavigator_Create(void);
void HTMLDocument_HTMLDocument3_Init(HTMLDocument*);
More information about the wine-cvs
mailing list