Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
36d923e2
Commit
36d923e2
authored
Sep 13, 2023
by
Gabriel Ivăncescu
Committed by
Alexandre Julliard
Sep 14, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mshtml: Traverse and unlink AnchorElements using the dispex.
Signed-off-by:
Gabriel Ivăncescu
<
gabrielopcode@gmail.com
>
parent
b059052e
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
60 additions
and
31 deletions
+60
-31
htmlanchor.c
dlls/mshtml/htmlanchor.c
+20
-6
htmlelem.c
dlls/mshtml/htmlelem.c
+13
-25
htmlevent.h
dlls/mshtml/htmlevent.h
+23
-0
mshtml_private.h
dlls/mshtml/mshtml_private.h
+4
-0
No files found.
dlls/mshtml/htmlanchor.c
View file @
36d923e2
...
@@ -842,17 +842,24 @@ fallback:
...
@@ -842,17 +842,24 @@ fallback:
return
HTMLElement_handle_event
(
&
This
->
element
.
node
,
eid
,
event
,
prevent_default
);
return
HTMLElement_handle_event
(
&
This
->
element
.
node
,
eid
,
event
,
prevent_default
);
}
}
static
void
HTMLAnchorElement_traverse
(
HTMLDOMNode
*
iface
,
nsCycleCollectionTraversalCallback
*
cb
)
static
inline
HTMLAnchorElement
*
impl_from_DispatchEx
(
DispatchEx
*
iface
)
{
{
HTMLAnchorElement
*
This
=
impl_from_HTMLDOMNode
(
iface
);
return
CONTAINING_RECORD
(
iface
,
HTMLAnchorElement
,
element
.
node
.
event_target
.
dispex
);
}
static
void
HTMLAnchorElement_traverse
(
DispatchEx
*
dispex
,
nsCycleCollectionTraversalCallback
*
cb
)
{
HTMLAnchorElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLDOMNode_traverse
(
dispex
,
cb
);
if
(
This
->
nsanchor
)
if
(
This
->
nsanchor
)
note_cc_edge
((
nsISupports
*
)
This
->
nsanchor
,
"
This->
nsanchor"
,
cb
);
note_cc_edge
((
nsISupports
*
)
This
->
nsanchor
,
"nsanchor"
,
cb
);
}
}
static
void
HTMLAnchorElement_unlink
(
HTMLDOMNode
*
iface
)
static
void
HTMLAnchorElement_unlink
(
DispatchEx
*
dispex
)
{
{
HTMLAnchorElement
*
This
=
impl_from_HTMLDOMNode
(
iface
);
HTMLAnchorElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLDOMNode_unlink
(
dispex
);
unlink_ref
(
&
This
->
nsanchor
);
unlink_ref
(
&
This
->
nsanchor
);
}
}
...
@@ -864,8 +871,15 @@ static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
...
@@ -864,8 +871,15 @@ static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
.
clone
=
HTMLElement_clone
,
.
clone
=
HTMLElement_clone
,
.
handle_event
=
HTMLAnchorElement_handle_event
,
.
handle_event
=
HTMLAnchorElement_handle_event
,
.
get_attr_col
=
HTMLElement_get_attr_col
,
.
get_attr_col
=
HTMLElement_get_attr_col
,
};
static
const
event_target_vtbl_t
HTMLAnchorElement_event_target_vtbl
=
{
{
HTMLELEMENT_DISPEX_VTBL_ENTRIES
,
.
traverse
=
HTMLAnchorElement_traverse
,
.
traverse
=
HTMLAnchorElement_traverse
,
.
unlink
=
HTMLAnchorElement_unlink
.
unlink
=
HTMLAnchorElement_unlink
},
HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES
,
};
};
static
const
tid_t
HTMLAnchorElement_iface_tids
[]
=
{
static
const
tid_t
HTMLAnchorElement_iface_tids
[]
=
{
...
@@ -876,7 +890,7 @@ static const tid_t HTMLAnchorElement_iface_tids[] = {
...
@@ -876,7 +890,7 @@ static const tid_t HTMLAnchorElement_iface_tids[] = {
static
dispex_static_data_t
HTMLAnchorElement_dispex
=
{
static
dispex_static_data_t
HTMLAnchorElement_dispex
=
{
"HTMLAnchorElement"
,
"HTMLAnchorElement"
,
&
HTMLElement_event_target_vtbl
.
dispex_vtbl
,
&
HTML
Anchor
Element_event_target_vtbl
.
dispex_vtbl
,
DispHTMLAnchorElement_tid
,
DispHTMLAnchorElement_tid
,
HTMLAnchorElement_iface_tids
,
HTMLAnchorElement_iface_tids
,
HTMLElement_init_dispex_info
HTMLElement_init_dispex_info
...
...
dlls/mshtml/htmlelem.c
View file @
36d923e2
...
@@ -6928,8 +6928,7 @@ static inline HTMLElement *impl_from_DispatchEx(DispatchEx *iface)
...
@@ -6928,8 +6928,7 @@ static inline HTMLElement *impl_from_DispatchEx(DispatchEx *iface)
return
CONTAINING_RECORD
(
iface
,
HTMLElement
,
node
.
event_target
.
dispex
);
return
CONTAINING_RECORD
(
iface
,
HTMLElement
,
node
.
event_target
.
dispex
);
}
}
static
HRESULT
HTMLElement_get_dispid
(
DispatchEx
*
dispex
,
BSTR
name
,
HRESULT
HTMLElement_get_dispid
(
DispatchEx
*
dispex
,
BSTR
name
,
DWORD
grfdex
,
DISPID
*
pid
)
DWORD
grfdex
,
DISPID
*
pid
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
...
@@ -6939,7 +6938,7 @@ static HRESULT HTMLElement_get_dispid(DispatchEx *dispex, BSTR name,
...
@@ -6939,7 +6938,7 @@ static HRESULT HTMLElement_get_dispid(DispatchEx *dispex, BSTR name,
return
DISP_E_UNKNOWNNAME
;
return
DISP_E_UNKNOWNNAME
;
}
}
static
HRESULT
HTMLElement_get_name
(
DispatchEx
*
dispex
,
DISPID
id
,
BSTR
*
name
)
HRESULT
HTMLElement_get_name
(
DispatchEx
*
dispex
,
DISPID
id
,
BSTR
*
name
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
...
@@ -6950,9 +6949,8 @@ static HRESULT HTMLElement_get_name(DispatchEx *dispex, DISPID id, BSTR *name)
...
@@ -6950,9 +6949,8 @@ static HRESULT HTMLElement_get_name(DispatchEx *dispex, DISPID id, BSTR *name)
return
DISP_E_MEMBERNOTFOUND
;
return
DISP_E_MEMBERNOTFOUND
;
}
}
static
HRESULT
HTMLElement_invoke
(
DispatchEx
*
dispex
,
DISPID
id
,
LCID
lcid
,
HRESULT
HTMLElement_invoke
(
DispatchEx
*
dispex
,
DISPID
id
,
LCID
lcid
,
WORD
flags
,
DISPPARAMS
*
params
,
VARIANT
*
res
,
WORD
flags
,
DISPPARAMS
*
params
,
VARIANT
*
res
,
EXCEPINFO
*
ei
,
EXCEPINFO
*
ei
,
IServiceProvider
*
caller
)
IServiceProvider
*
caller
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
...
@@ -6964,7 +6962,7 @@ static HRESULT HTMLElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid,
...
@@ -6964,7 +6962,7 @@ static HRESULT HTMLElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid,
return
E_NOTIMPL
;
return
E_NOTIMPL
;
}
}
static
HRESULT
HTMLElement_populate_props
(
DispatchEx
*
dispex
)
HRESULT
HTMLElement_populate_props
(
DispatchEx
*
dispex
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
nsIDOMMozNamedAttrMap
*
attrs
;
nsIDOMMozNamedAttrMap
*
attrs
;
...
@@ -7049,19 +7047,19 @@ static HRESULT HTMLElement_populate_props(DispatchEx *dispex)
...
@@ -7049,19 +7047,19 @@ static HRESULT HTMLElement_populate_props(DispatchEx *dispex)
return
S_OK
;
return
S_OK
;
}
}
static
nsISupports
*
HTMLElement_get_gecko_target
(
DispatchEx
*
dispex
)
nsISupports
*
HTMLElement_get_gecko_target
(
DispatchEx
*
dispex
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
return
(
nsISupports
*
)
This
->
node
.
nsnode
;
return
(
nsISupports
*
)
This
->
node
.
nsnode
;
}
}
static
void
HTMLElement_bind_event
(
DispatchEx
*
dispex
,
eventid_t
eid
)
void
HTMLElement_bind_event
(
DispatchEx
*
dispex
,
eventid_t
eid
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
ensure_doc_nsevent_handler
(
This
->
node
.
doc
,
This
->
node
.
nsnode
,
eid
);
ensure_doc_nsevent_handler
(
This
->
node
.
doc
,
This
->
node
.
nsnode
,
eid
);
}
}
static
HRESULT
HTMLElement_handle_event_default
(
DispatchEx
*
dispex
,
eventid_t
eid
,
nsIDOMEvent
*
nsevent
,
BOOL
*
prevent_default
)
HRESULT
HTMLElement_handle_event_default
(
DispatchEx
*
dispex
,
eventid_t
eid
,
nsIDOMEvent
*
nsevent
,
BOOL
*
prevent_default
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
...
@@ -7070,7 +7068,7 @@ static HRESULT HTMLElement_handle_event_default(DispatchEx *dispex, eventid_t ei
...
@@ -7070,7 +7068,7 @@ static HRESULT HTMLElement_handle_event_default(DispatchEx *dispex, eventid_t ei
return
This
->
node
.
vtbl
->
handle_event
(
&
This
->
node
,
eid
,
nsevent
,
prevent_default
);
return
This
->
node
.
vtbl
->
handle_event
(
&
This
->
node
,
eid
,
nsevent
,
prevent_default
);
}
}
static
EventTarget
*
HTMLElement_get_parent_event_target
(
DispatchEx
*
dispex
)
EventTarget
*
HTMLElement_get_parent_event_target
(
DispatchEx
*
dispex
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLDOMNode
*
node
;
HTMLDOMNode
*
node
;
...
@@ -7091,14 +7089,14 @@ static EventTarget *HTMLElement_get_parent_event_target(DispatchEx *dispex)
...
@@ -7091,14 +7089,14 @@ static EventTarget *HTMLElement_get_parent_event_target(DispatchEx *dispex)
return
&
node
->
event_target
;
return
&
node
->
event_target
;
}
}
static
ConnectionPointContainer
*
HTMLElement_get_cp_container
(
DispatchEx
*
dispex
)
ConnectionPointContainer
*
HTMLElement_get_cp_container
(
DispatchEx
*
dispex
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
IConnectionPointContainer_AddRef
(
&
This
->
cp_container
.
IConnectionPointContainer_iface
);
IConnectionPointContainer_AddRef
(
&
This
->
cp_container
.
IConnectionPointContainer_iface
);
return
&
This
->
cp_container
;
return
&
This
->
cp_container
;
}
}
static
IHTMLEventObj
*
HTMLElement_set_current_event
(
DispatchEx
*
dispex
,
IHTMLEventObj
*
event
)
IHTMLEventObj
*
HTMLElement_set_current_event
(
DispatchEx
*
dispex
,
IHTMLEventObj
*
event
)
{
{
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
HTMLElement
*
This
=
impl_from_DispatchEx
(
dispex
);
return
default_set_current_event
(
This
->
node
.
doc
->
window
,
event
);
return
default_set_current_event
(
This
->
node
.
doc
->
window
,
event
);
...
@@ -7323,21 +7321,11 @@ static const tid_t HTMLElement_iface_tids[] = {
...
@@ -7323,21 +7321,11 @@ static const tid_t HTMLElement_iface_tids[] = {
const
event_target_vtbl_t
HTMLElement_event_target_vtbl
=
{
const
event_target_vtbl_t
HTMLElement_event_target_vtbl
=
{
{
{
.
query_interface
=
HTMLDOMNode_query_interface
,
HTMLELEMENT_DISPEX_VTBL_ENTRIES
,
.
destructor
=
HTMLDOMNode_destructor
,
.
traverse
=
HTMLDOMNode_traverse
,
.
traverse
=
HTMLDOMNode_traverse
,
.
unlink
=
HTMLDOMNode_unlink
,
.
unlink
=
HTMLDOMNode_unlink
,
.
get_dispid
=
HTMLElement_get_dispid
,
.
get_name
=
HTMLElement_get_name
,
.
invoke
=
HTMLElement_invoke
,
.
populate_props
=
HTMLElement_populate_props
},
},
.
get_gecko_target
=
HTMLElement_get_gecko_target
,
HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES
,
.
bind_event
=
HTMLElement_bind_event
,
.
get_parent_event_target
=
HTMLElement_get_parent_event_target
,
.
handle_event_default
=
HTMLElement_handle_event_default
,
.
get_cp_container
=
HTMLElement_get_cp_container
,
.
set_current_event
=
HTMLElement_set_current_event
};
};
struct
token_list
{
struct
token_list
{
...
...
dlls/mshtml/htmlevent.h
View file @
36d923e2
...
@@ -138,6 +138,29 @@ typedef struct {
...
@@ -138,6 +138,29 @@ typedef struct {
extern
const
event_target_vtbl_t
HTMLElement_event_target_vtbl
;
extern
const
event_target_vtbl_t
HTMLElement_event_target_vtbl
;
IHTMLEventObj
*
default_set_current_event
(
HTMLInnerWindow
*
,
IHTMLEventObj
*
);
IHTMLEventObj
*
default_set_current_event
(
HTMLInnerWindow
*
,
IHTMLEventObj
*
);
nsISupports
*
HTMLElement_get_gecko_target
(
DispatchEx
*
);
void
HTMLElement_bind_event
(
DispatchEx
*
,
eventid_t
);
EventTarget
*
HTMLElement_get_parent_event_target
(
DispatchEx
*
);
HRESULT
HTMLElement_handle_event_default
(
DispatchEx
*
,
eventid_t
,
nsIDOMEvent
*
,
BOOL
*
);
ConnectionPointContainer
*
HTMLElement_get_cp_container
(
DispatchEx
*
);
IHTMLEventObj
*
HTMLElement_set_current_event
(
DispatchEx
*
,
IHTMLEventObj
*
);
#define HTMLELEMENT_DISPEX_VTBL_ENTRIES \
.query_interface = HTMLDOMNode_query_interface, \
.destructor = HTMLDOMNode_destructor, \
.get_dispid = HTMLElement_get_dispid, \
.get_name = HTMLElement_get_name, \
.invoke = HTMLElement_invoke, \
.populate_props = HTMLElement_populate_props
#define HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES \
.get_gecko_target = HTMLElement_get_gecko_target, \
.bind_event = HTMLElement_bind_event, \
.get_parent_event_target = HTMLElement_get_parent_event_target, \
.handle_event_default = HTMLElement_handle_event_default, \
.get_cp_container = HTMLElement_get_cp_container, \
.set_current_event = HTMLElement_set_current_event
static
inline
EventTarget
*
get_node_event_prop_target
(
HTMLDOMNode
*
node
,
eventid_t
eid
)
static
inline
EventTarget
*
get_node_event_prop_target
(
HTMLDOMNode
*
node
,
eventid_t
eid
)
{
{
return
node
->
vtbl
->
get_event_prop_target
?
node
->
vtbl
->
get_event_prop_target
(
node
,
eid
)
:
&
node
->
event_target
;
return
node
->
vtbl
->
get_event_prop_target
?
node
->
vtbl
->
get_event_prop_target
(
node
,
eid
)
:
&
node
->
event_target
;
...
...
dlls/mshtml/mshtml_private.h
View file @
36d923e2
...
@@ -1214,6 +1214,10 @@ void HTMLDOMNode_init_dispex_info(dispex_data_t*,compat_mode_t);
...
@@ -1214,6 +1214,10 @@ void HTMLDOMNode_init_dispex_info(dispex_data_t*,compat_mode_t);
void
*
HTMLElement_QI
(
HTMLDOMNode
*
,
REFIID
);
void
*
HTMLElement_QI
(
HTMLDOMNode
*
,
REFIID
);
void
HTMLElement_destructor
(
HTMLDOMNode
*
);
void
HTMLElement_destructor
(
HTMLDOMNode
*
);
HRESULT
HTMLElement_get_dispid
(
DispatchEx
*
,
BSTR
,
DWORD
,
DISPID
*
);
HRESULT
HTMLElement_get_name
(
DispatchEx
*
,
DISPID
,
BSTR
*
);
HRESULT
HTMLElement_invoke
(
DispatchEx
*
,
DISPID
,
LCID
,
WORD
,
DISPPARAMS
*
,
VARIANT
*
,
EXCEPINFO
*
,
IServiceProvider
*
);
HRESULT
HTMLElement_populate_props
(
DispatchEx
*
);
HRESULT
HTMLElement_clone
(
HTMLDOMNode
*
,
nsIDOMNode
*
,
HTMLDOMNode
**
);
HRESULT
HTMLElement_clone
(
HTMLDOMNode
*
,
nsIDOMNode
*
,
HTMLDOMNode
**
);
HRESULT
HTMLElement_get_attr_col
(
HTMLDOMNode
*
,
HTMLAttributeCollection
**
);
HRESULT
HTMLElement_get_attr_col
(
HTMLDOMNode
*
,
HTMLAttributeCollection
**
);
HRESULT
HTMLElement_handle_event
(
HTMLDOMNode
*
,
DWORD
,
nsIDOMEvent
*
,
BOOL
*
);
HRESULT
HTMLElement_handle_event
(
HTMLDOMNode
*
,
DWORD
,
nsIDOMEvent
*
,
BOOL
*
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment