Jacek Caban : mshtml: Added support for anchors with target '_top'.
Alexandre Julliard
julliard at winehq.org
Thu Mar 29 15:48:58 CDT 2012
Module: wine
Branch: master
Commit: f11ed78b2e37ec4268747654f5d8c85ee1252ad4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f11ed78b2e37ec4268747654f5d8c85ee1252ad4
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Mar 29 15:05:25 2012 +0200
mshtml: Added support for anchors with target '_top'.
---
dlls/mshtml/htmlanchor.c | 20 +++++++++++++-------
dlls/mshtml/htmlwindow.c | 17 ++++++++++++-----
dlls/mshtml/mshtml_private.h | 1 +
3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c
index 1ef7f72..00301ad 100644
--- a/dlls/mshtml/htmlanchor.c
+++ b/dlls/mshtml/htmlanchor.c
@@ -73,6 +73,7 @@ static HRESULT navigate_anchor_window(HTMLAnchorElement *This, const WCHAR *targ
static HRESULT navigate_anchor(HTMLAnchorElement *This)
{
nsAString href_str, target_str;
+ HTMLWindow *window = NULL;
nsresult nsres;
HRESULT hres = E_FAIL;
@@ -87,14 +88,18 @@ static HRESULT navigate_anchor(HTMLAnchorElement *This)
nsAString_GetData(&target_str, &target);
if(*target && strcmpiW(target, _selfW)) {
- if(strcmpiW(target, _parentW) && strcmpiW(target, _topW)) {
- hres = navigate_anchor_window(This, target);
+ if(!strcmpiW(target, _topW)) {
+ TRACE("target _top\n");
+ get_top_window(This->element.node.doc->basedoc.window, &window);
+ }else if(!strcmpiW(target, _parentW)) {
+ FIXME("Navigating to target _parent is not implemented\n");
+ nsAString_Finish(&target_str);
+ return S_OK;
}else {
- FIXME("Navigating to target %s is not implemented\n", debugstr_w(target));
- hres = S_OK;
+ hres = navigate_anchor_window(This, target);
+ nsAString_Finish(&target_str);
+ return hres;
}
- nsAString_Finish(&target_str);
- return hres;
}
}
nsAString_Finish(&target_str);
@@ -106,7 +111,8 @@ static HRESULT navigate_anchor(HTMLAnchorElement *This)
nsAString_GetData(&href_str, &href);
if(*href) {
- HTMLWindow *window = This->element.node.doc->basedoc.window;
+ if(!window)
+ window = This->element.node.doc->basedoc.window;
hres = navigate_url(window, href, window->url);
}else {
TRACE("empty href\n");
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 2623520..2bd5d7e 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -107,6 +107,14 @@ static HRESULT get_location(HTMLWindow *This, HTMLLocation **ret)
return S_OK;
}
+void get_top_window(HTMLWindow *window, HTMLWindow **ret)
+{
+ HTMLWindow *iter;
+
+ for(iter = window; iter->parent; iter = iter->parent);
+ *ret = iter;
+}
+
static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
{
if(!window->doc) {
@@ -838,13 +846,12 @@ static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p
static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
{
HTMLWindow *This = impl_from_IHTMLWindow2(iface);
- HTMLWindow *curr;
+ HTMLWindow *top;
+
TRACE("(%p)->(%p)\n", This, p);
- curr = This;
- while(curr->parent)
- curr = curr->parent;
- *p = &curr->IHTMLWindow2_iface;
+ get_top_window(This, &top);
+ *p = &top->IHTMLWindow2_iface;
IHTMLWindow2_AddRef(*p);
return S_OK;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 2e4df12..789ffb5 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -631,6 +631,7 @@ HRESULT create_document_fragment(nsIDOMNode*,HTMLDocumentNode*,HTMLDocumentNode*
HRESULT HTMLWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLWindow*,HTMLWindow**) DECLSPEC_HIDDEN;
void update_window_doc(HTMLWindow*) DECLSPEC_HIDDEN;
HTMLWindow *nswindow_to_window(const nsIDOMWindow*) DECLSPEC_HIDDEN;
+void get_top_window(HTMLWindow*,HTMLWindow**) DECLSPEC_HIDDEN;
HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*) DECLSPEC_HIDDEN;
HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*) DECLSPEC_HIDDEN;
HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list